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; }
int main(int argc, char **argv) { int rc; FirmwareImage image; int opt; int index; char *deviceName = NULL; const char *firmwareName = NULL; bool force = false; static struct option long_options[] = { {"help", 0, NULL, 'h'}, {"force", 0, NULL, 'f'}, {"device", 1, NULL, 'd'}, {"fw-props", 0, NULL, 'p'}, {"config-id", 0, NULL, 'c'}, {"lockdown", 0, NULL, 'l'}, {"version", 0, NULL, 'v'}, {"device-type", 1, NULL, 't'}, {0, 0, 0, 0}, }; bool printFirmwareProps = false; bool printConfigid = false; bool performLockdown = false; HIDDevice device; enum RMIDeviceType deviceType = RMI_DEVICE_TYPE_ANY; while ((opt = getopt_long(argc, argv, RMI4UPDATE_GETOPTS, long_options, &index)) != -1) { switch (opt) { case 'h': printHelp(argv[0]); return 0; case 'f': force = true; break; case 'd': deviceName = optarg; break; case 'p': printFirmwareProps = true; break; case 'c': printFirmwareProps = true; printConfigid = true; break; case 'l': performLockdown = true; break; case 't': if (!strcasecmp((const char *)optarg, "touchpad")) deviceType = RMI_DEVICE_TYPE_TOUCHPAD; else if (!strcasecmp((const char *)optarg, "touchscreen")) deviceType = RMI_DEVICE_TYPE_TOUCHSCREEN; break; case 'v': printVersion(); return 0; default: break; } } if (printFirmwareProps) { std::string props; if (!deviceName) { fprintf(stderr, "Specifiy which device to query\n"); return 1; } rc = GetFirmwareProps(deviceName, props, printConfigid); if (rc) { fprintf(stderr, "Failed to read properties from device: %s\n", update_err_to_string(rc)); return 1; } fprintf(stdout, "%s\n", props.c_str()); return 0; } if (optind < argc) { firmwareName = argv[optind]; } else { printHelp(argv[0]); return -1; } rc = image.Initialize(firmwareName); if (rc != UPDATE_SUCCESS) { fprintf(stderr, "Failed to initialize the firmware image: %s\n", update_err_to_string(rc)); return 1; } if (deviceName) { rc = device.Open(deviceName); if (rc) { fprintf(stderr, "%s: failed to initialize rmi device (%d): %s\n", argv[0], errno, strerror(errno)); return 1; } } else { if (!device.FindDevice(deviceType)) return 1; } RMI4Update update(device, image); rc = update.UpdateFirmware(force, performLockdown); if (rc != UPDATE_SUCCESS) { device.Reset(); return 1; } return 0; }