1.1 Release
[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 /////////////////////////////////////////////////
19 /// \brief This function gets called by the program
20 ///        to print the usage message.
21 ///
22 /// \param FILE* output file descriptor
23 /////////////////////////////////////////////////
24 void PrintUsageMessage(FILE* output)
25 {
26     fprintf(output, "++++++++++++++++++++++++++++++++++++++++\n");
27     fprintf(output, "Usage: tvout [-m [-r][-x val] [-y val]] \n\n");
28     fprintf(output, "-m \t move the picture\n");
29     fprintf(output, "  -x \t vertical offset in px \n");
30     fprintf(output, "  -y \t horizontal offset in px \n");
31     fprintf(output, "  -r \t reset position \n");
32     fprintf(output, "\nThis program was created for the \nArmbian Project.\n");
33     fprintf(output, "(c) 2017, Daniel G. (giri@nwrk.biz)\n");
34     fprintf(output, "++++++++++++++++++++++++++++++++++++++++\n");
35 }
36
37 /////////////////////////////////////////////////
38 /// \brief Main Program. Parses Commandline
39 ///        Parameters and writes user Input
40 ///        to the matching TV-Encoder registers.
41 /////////////////////////////////////////////////
42 int main(int argc, char **argv)
43 {
44     bool mFlag = false; //move
45     bool xFlag = false; //y Offset
46     char* xVal = 0;
47     bool yFlag = false; //x Offset
48     char* yVal = 0;
49     bool rFlag = false; //reset Offset
50     int c;
51
52     //let us do the errorhandling
53     opterr = 0;
54
55     //check if there are any arguments
56     if(argc < 2)
57     {
58         PrintUsageMessage(stdout);
59     }
60
61     // Use getopt to parse the cmd parameters
62     while ((c = getopt (argc, argv, "mx:y:r")) != -1)
63         switch (c)
64         {
65         case 'm':
66             mFlag = true;
67             break;
68         case 'x':
69             xFlag = true;
70             xVal = optarg;
71             break;
72         case 'y':
73             yFlag = true;
74             yVal = optarg;
75             break;
76         case 'r':
77             rFlag = true;
78             break;
79         case '?':
80             //Print usage message
81             PrintUsageMessage(stdout);
82             return EXIT_FAILURE;
83         default:
84             abort ();
85         }
86
87
88     //check if m flag was set
89     if(mFlag)
90     {
91         unsigned long to_write = 0;
92
93         if(rFlag)
94         {
95             //reset position
96             writemem(TV_ENCODER_RESYNC, to_write, 'w');
97         }
98         else
99         {
100             // read current position
101             readmem(TV_ENCODER_RESYNC, 'w', &to_write);
102             if(xFlag)
103             {
104                 //Set new X value
105                 to_write += strtoul(xVal, 0, 0) << X_REG_OFFSET;
106             }
107
108             if(yFlag)
109             {
110                 //Set new Y value
111                 to_write += strtoul(yVal, 0, 0) << Y_REG_OFFSET;
112             }
113             //write new position to register
114             writemem(TV_ENCODER_RESYNC, to_write, 'w');
115         }
116     }
117
118     unsigned int index = 0;
119     for (index = optind; index < argc; index++)
120     {
121         printf ("Invalid argument %s\n", argv[index]);
122     }
123     return EXIT_SUCCESS;
124 }