blob: d0cf8f7c7b1ec24424338b0dbf23b49d7c3a7afa [file] [log] [blame]
Satoshi Noguchic5343602014-09-29 02:49:22 -07001/*
2 * Copyright (C) 2014 Satoshi Noguchi
3 * Copyright (C) 2014 Synaptics Inc
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include <stdio.h>
19#include <string.h>
20#include <errno.h>
21#include <getopt.h>
22#include <sys/types.h>
23#include <sys/stat.h>
24#include <fcntl.h>
25#include <dirent.h>
26#include <unistd.h>
27#include <time.h>
28#include <string>
29#include <sstream>
30#include <stdlib.h>
31#include <signal.h>
32
33#include "hiddevice.h"
34#include "f54test.h"
35#include "display.h"
36
Joseph Hwangcb308492015-05-06 11:03:56 +080037#define F54TEST_GETOPTS "hd:r:cn"
Satoshi Noguchic5343602014-09-29 02:49:22 -070038
39static bool stopRequested;
40
41void printHelp(const char *prog_name)
42{
43 fprintf(stdout, "Usage: %s [OPTIONS]\n", prog_name);
44 fprintf(stdout, "\t-h, --help\tPrint this message\n");
45 fprintf(stdout, "\t-d, --device\thidraw device file associated with the device being tested.\n");
46 fprintf(stdout, "\t-r, --report_type\tReport type.\n");
47 fprintf(stdout, "\t-c, --continuous\tContinuous mode.\n");
Joseph Hwangcb308492015-05-06 11:03:56 +080048 fprintf(stdout, "\t-n, --no_reset\tDo not reset after the report.\n");
Satoshi Noguchic5343602014-09-29 02:49:22 -070049}
50
Joseph Hwangcb308492015-05-06 11:03:56 +080051int RunF54Test(const char * deviceFile, f54_report_types reportType, bool continuousMode, bool noReset)
Satoshi Noguchic5343602014-09-29 02:49:22 -070052{
53 int rc;
54 HIDDevice rmidevice;
55 Display * display;
56
57 if (continuousMode)
58 {
59 display = new AnsiConsole();
60 }
61 else
62 {
63 display = new Display();
64 }
65
66 display->Clear();
67
68 rc = rmidevice.Open(deviceFile);
69 if (rc)
70 return rc;
71
72 F54Test f54Test(rmidevice, *display);
73
74 rc = f54Test.Prepare(reportType);
75 if (rc)
76 return rc;
77
78 stopRequested = false;
79
80 do {
81 rc = f54Test.Run();
82 }
83 while (continuousMode && !stopRequested);
84
Joseph Hwangcb308492015-05-06 11:03:56 +080085 if (!noReset)
86 rmidevice.Reset();
Satoshi Noguchic5343602014-09-29 02:49:22 -070087
88 rmidevice.Close();
89
90 delete display;
91
92 return rc;
93}
94
95void SignalHandler(int p_signame)
96{
97 stopRequested = true;
98}
99
100int main(int argc, char **argv)
101{
Andrew Duggan7f495fb2014-09-30 13:51:20 -0700102 int rc = 0;
Satoshi Noguchic5343602014-09-29 02:49:22 -0700103 int opt;
104 int index;
105 char *deviceName = NULL;
106 static struct option long_options[] = {
107 {"help", 0, NULL, 'h'},
108 {"device", 1, NULL, 'd'},
109 {"report_type", 1, NULL, 'r'},
110 {"continuous", 0, NULL, 'c'},
Joseph Hwangcb308492015-05-06 11:03:56 +0800111 {"no_reset", 0, NULL, 'n'},
Satoshi Noguchic5343602014-09-29 02:49:22 -0700112 {0, 0, 0, 0},
113 };
114 struct dirent * devDirEntry;
115 DIR * devDir;
116 f54_report_types reportType = F54_16BIT_IMAGE;
117 bool continuousMode = false;
Joseph Hwangcb308492015-05-06 11:03:56 +0800118 bool noReset = false;
Satoshi Noguchic5343602014-09-29 02:49:22 -0700119
120 while ((opt = getopt_long(argc, argv, F54TEST_GETOPTS, long_options, &index)) != -1) {
121 switch (opt) {
122 case 'h':
123 printHelp(argv[0]);
124 return 0;
125 case 'd':
126 deviceName = optarg;
127 break;
128 case 'r':
129 reportType = (f54_report_types)strtol(optarg, NULL, 0);
130 break;
131 case 'c':
132 continuousMode = true;
133 break;
Joseph Hwangcb308492015-05-06 11:03:56 +0800134 case 'n':
135 noReset = true;
136 break;
Satoshi Noguchic5343602014-09-29 02:49:22 -0700137 default:
138 break;
139
140 }
141 }
142
143 if (continuousMode)
144 {
145 signal(SIGHUP, SignalHandler);
146 signal(SIGINT, SignalHandler);
147 signal(SIGTERM, SignalHandler);
148 }
149
150 if (deviceName) {
Joseph Hwangcb308492015-05-06 11:03:56 +0800151 rc = RunF54Test(deviceName, reportType, continuousMode, noReset);
Satoshi Noguchic5343602014-09-29 02:49:22 -0700152 if (rc)
153 return rc;
154
155 return rc;
156 } else {
157 char rawDevice[PATH_MAX];
158 char deviceFile[PATH_MAX];
159 bool found = false;
160
161 devDir = opendir("/dev");
162 if (!devDir)
163 return -1;
164
165 while ((devDirEntry = readdir(devDir)) != NULL) {
166 if (strstr(devDirEntry->d_name, "hidraw")) {
167 strncpy(rawDevice, devDirEntry->d_name, PATH_MAX);
168 snprintf(deviceFile, PATH_MAX, "/dev/%s", devDirEntry->d_name);
Joseph Hwangcb308492015-05-06 11:03:56 +0800169 rc = RunF54Test(deviceFile, reportType, continuousMode, noReset);
Satoshi Noguchic5343602014-09-29 02:49:22 -0700170 if (rc != 0) {
171 continue;
172 } else {
173 found = true;
174 break;
175 }
176 }
177 }
178 closedir(devDir);
179
180 if (!found)
181 return rc;
182 }
183
184 return 0;
185}