69ff9d57d7b38b7c41948bcde38f2876bd964ece
[media-ctl.git] / options.c
1 /*
2  * Media controller test application
3  *
4  * Copyright (C) 2010 Ideas on board SPRL <laurent.pinchart@ideasonboard.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  */
19
20 #include <stdlib.h>
21 #include <getopt.h>
22 #include <stdio.h>
23 #include <unistd.h>
24
25 #include "options.h"
26
27 #define MEDIA_DEVNAME_DEFAULT           "/dev/media0"
28
29 struct media_options media_opts = {
30         .devname = MEDIA_DEVNAME_DEFAULT,
31 };
32
33 static void usage(const char *argv0, int verbose)
34 {
35         printf("%s [options] device\n", argv0);
36         printf("-d, --device dev        Media device name (default: %s)\n", MEDIA_DEVNAME_DEFAULT);
37         printf("-e, --entity name       Print the device name associated with the given entity\n");
38         printf("-f, --formats           Comma-separated list of formats to setup\n");
39         printf("-h, --help              Show verbose help and exit\n");
40         printf("-i, --interactive       Modify links interactively\n");
41         printf("-l, --links             Comma-separated list of links descriptors to setup\n");
42         printf("-p, --print-topology    Print the device topology (implies -v)\n");
43         printf("    --print-dot         Print the device topology as a dot graph (implies -v)\n");
44         printf("-r, --reset             Reset all links to inactive\n");
45         printf("-v, --verbose           Be verbose\n");
46
47         if (!verbose)
48                 return;
49
50         printf("\n");
51         printf("Links and formats are defined as\n");
52         printf("\tlink            = pad, '->', pad, '[', flags, ']' ;\n");
53         printf("\tformat          = pad, '[', fcc, ' ', size, [ ' ', crop ], ']' ;\n");
54         printf("\tpad             = entity, ':', pad number ;\n");
55         printf("\tentity          = entity number | ( '\"', entity name, '\"' ) ;\n");
56         printf("\tsize            = width, 'x', height ;\n");
57         printf("\tcrop            = left, ',', top, '/', size ;\n");
58         printf("where the fields are\n");
59         printf("\tentity number   Entity numeric identifier\n");
60         printf("\tentity name     Entify name (string) \n");
61         printf("\tpad number      Pad numeric identifier\n");
62         printf("\tflags           Link flags (0: inactive, 1: active)\n");
63         printf("\tfcc             Format FourCC\n");
64         printf("\twidth           Image width in pixels\n");
65         printf("\theight          Image height in pixels\n");
66 }
67
68 #define OPT_PRINT_DOT   256
69
70 static struct option opts[] = {
71         {"device", 1, 0, 'd'},
72         {"entity", 1, 0, 'e'},
73         {"formats", 1, 0, 'f'},
74         {"help", 0, 0, 'h'},
75         {"interactive", 0, 0, 'i'},
76         {"links", 1, 0, 'l'},
77         {"print-dot", 0, 0, OPT_PRINT_DOT},
78         {"print-topology", 0, 0, 'p'},
79         {"reset", 0, 0, 'r'},
80         {"verbose", 0, 0, 'v'},
81 };
82
83 int parse_cmdline(int argc, char **argv)
84 {
85         int opt;
86
87         if (argc == 1) {
88                 usage(argv[0], 0);
89                 return 1;
90         }
91
92         /* parse options */
93         while ((opt = getopt_long(argc, argv, "d:e:f:hil:prv", opts, NULL)) != -1) {
94                 switch (opt) {
95                 case 'd':
96                         media_opts.devname = optarg;
97                         break;
98
99                 case 'e':
100                         media_opts.entity = optarg;
101                         break;
102
103                 case 'f':
104                         media_opts.formats = optarg;
105                         break;
106
107                 case 'h':
108                         usage(argv[0], 1);
109                         exit(0);
110
111                 case 'i':
112                         media_opts.interactive = 1;
113                         break;
114
115                 case 'l':
116                         media_opts.links = optarg;
117                         break;
118
119                 case 'p':
120                         media_opts.print = 1;
121                         media_opts.verbose = 1;
122                         break;
123
124                 case 'r':
125                         media_opts.reset = 1;
126                         break;
127
128                 case 'v':
129                         media_opts.verbose = 1;
130                         break;
131
132                 case OPT_PRINT_DOT:
133                         media_opts.print_dot = 1;
134                         break;
135
136                 default:
137                         printf("Invalid option -%c\n", opt);
138                         printf("Run %s -h for help.\n", argv[0]);
139                         return 1;
140                 }
141         }
142
143         return 0;
144 }
145