/* * Copyright (C) 2014 Satoshi Noguchi * Copyright (C) 2014 Synaptics Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <stdio.h> #include <string.h> #include <errno.h> #include <getopt.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <dirent.h> #include <unistd.h> #include <time.h> #include <string> #include <sstream> #include <stdlib.h> #include <signal.h> #include "hiddevice.h" #include "f54test.h" #include "display.h" #define F54TEST_GETOPTS "hd:r:cn" static bool stopRequested; void printHelp(const char *prog_name) { fprintf(stdout, "Usage: %s [OPTIONS]\n", prog_name); fprintf(stdout, "\t-h, --help\tPrint this message\n"); fprintf(stdout, "\t-d, --device\thidraw device file associated with the device being tested.\n"); fprintf(stdout, "\t-r, --report_type\tReport type.\n"); fprintf(stdout, "\t-c, --continuous\tContinuous mode.\n"); fprintf(stdout, "\t-n, --no_reset\tDo not reset after the report.\n"); } int RunF54Test(const char * deviceFile, f54_report_types reportType, bool continuousMode, bool noReset) { int rc; HIDDevice rmidevice; Display * display; if (continuousMode) { display = new AnsiConsole(); } else { display = new Display(); } display->Clear(); rc = rmidevice.Open(deviceFile); if (rc) return rc; F54Test f54Test(rmidevice, *display); rc = f54Test.Prepare(reportType); if (rc) return rc; stopRequested = false; do { rc = f54Test.Run(); } while (continuousMode && !stopRequested); if (!noReset) rmidevice.Reset(); rmidevice.Close(); delete display; return rc; } void SignalHandler(int p_signame) { stopRequested = true; } int main(int argc, char **argv) { int rc = 0; int opt; int index; char *deviceName = NULL; static struct option long_options[] = { {"help", 0, NULL, 'h'}, {"device", 1, NULL, 'd'}, {"report_type", 1, NULL, 'r'}, {"continuous", 0, NULL, 'c'}, {"no_reset", 0, NULL, 'n'}, {0, 0, 0, 0}, }; struct dirent * devDirEntry; DIR * devDir; f54_report_types reportType = F54_16BIT_IMAGE; bool continuousMode = false; bool noReset = false; while ((opt = getopt_long(argc, argv, F54TEST_GETOPTS, long_options, &index)) != -1) { switch (opt) { case 'h': printHelp(argv[0]); return 0; case 'd': deviceName = optarg; break; case 'r': reportType = (f54_report_types)strtol(optarg, NULL, 0); break; case 'c': continuousMode = true; break; case 'n': noReset = true; break; default: break; } } if (continuousMode) { signal(SIGHUP, SignalHandler); signal(SIGINT, SignalHandler); signal(SIGTERM, SignalHandler); } if (deviceName) { rc = RunF54Test(deviceName, reportType, continuousMode, noReset); if (rc) return rc; return rc; } else { char rawDevice[PATH_MAX]; char deviceFile[PATH_MAX]; bool found = false; devDir = opendir("/dev"); if (!devDir) return -1; while ((devDirEntry = readdir(devDir)) != NULL) { if (strstr(devDirEntry->d_name, "hidraw")) { strncpy(rawDevice, devDirEntry->d_name, PATH_MAX); snprintf(deviceFile, PATH_MAX, "/dev/%s", devDirEntry->d_name); rc = RunF54Test(deviceFile, reportType, continuousMode, noReset); if (rc != 0) { continue; } else { found = true; break; } } } closedir(devDir); if (!found) return rc; } return 0; }