cad49bc48c93e0855a61a85982abffbd92f6dbbf
[allwinner_tvout_manipulator.git] / src / main.c
1 ///////////////////////////////////////////////////////////////////////////
2 // Workfile: tvout.c (Implementation)
3 // Author: Daniel Giritzer
4 // Date: 2017-06-02
5 // Description: Simple Program to move the picture of the composite video
6 //              output.
7 // Remarks: -
8 // Revision: 1
9 // Copyright (C) 2017, Daniel Giritzer (giri@nwrk.biz)
10 ///////////////////////////////////////////////////////////////////////////
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <stdbool.h>
14 #include <unistd.h>
15 #include "devmem2.h"
16 #include "tvout.h"
17
18 void PrintUsageMessage(FILE* output)
19 {
20     fprintf(output, "++++++++++++++++++++++++++++++\n");
21     fprintf(output, "Usage: tvout [-m [-x val] [-y val]] \n\n");
22     fprintf(output, "-m \t move \n");
23     fprintf(output, "-x \t vertical offset in px \n");
24     fprintf(output, "-x \t horizontal offset in px \n");
25     fprintf(output, "\nThis program was created for the Armbian Project.\n");
26     fprintf(output, "(c) 2017, Daniel G.\n");
27     fprintf(output, "++++++++++++++++++++++++++++++\n");
28 }
29
30 int main(int argc, char **argv)
31 {
32     bool mFlag = false;
33     bool xFlag = false;
34     char* xVal = 0;
35     bool yFlag = false;
36     char* yVal = 0;
37     char c;
38
39     if(argc < 2)
40     {
41         PrintUsageMessage(stdout);
42     }
43
44     // Use getopt to parse the cmd parameters
45     while ((c = getopt (argc, argv, "mx:y:?")) != -1)
46         switch (c)
47         {
48         case 'm':
49             mFlag = true;
50             break;
51         case 'x':
52             xFlag = true;
53             xVal = optarg;
54             break;
55         case 'y':
56             yFlag = true;
57             yVal = optarg;
58             break;
59         case '?':
60             //Print usage message
61             PrintUsageMessage(stdout);
62             return EXIT_FAILURE;
63         default:
64             abort ();
65         }
66
67
68     //check if m flag was set
69     if(mFlag)
70     {
71         unsigned long to_write = 0;
72
73         // read current position
74         readmem(TV_ENCODER_RESYNC, 'w', &to_write);
75         if(xFlag)
76         {
77             //Set new X value
78             to_write += strtoul(xVal, 0, 0) << X_REG_OFFSET;
79         }
80
81         if(yFlag)
82         {
83             //Set new Y value
84             to_write += strtoul(yVal, 0, 0) << Y_REG_OFFSET;
85         }
86         //write new position to register
87         writemem(TV_ENCODER_RESYNC, to_write, 'w');
88     }
89
90     for (unsigned int index = optind; index < argc; index++)
91     {
92         printf ("Non-option argument %s\n", argv[index]);
93     }
94     return EXIT_SUCCESS;
95 }