void blink_led(TIM_HandleTypeDef * timer, uint32_t channel) { for (float i = 0; i <= 1; i += 0.001) { set_led_brightness(timer, channel, i); HAL_Delay(5); } for (float i = 1; i >= 0; i -= 0.001) { set_led_brightness(timer, channel, i); HAL_Delay(5); } }
// Init the library void out_saitek_t::init(void) { debug_out(debug, "out_saitek: searching for a supported Saitek joystick"); bool found = search(); if (found) { // if a joystick was found, attach to it a_attached = attach(); if (a_attached) { debug_out(debug, "out_saitek: setting initial brightness and welcome message"); set_display_brightness(0x7F); set_led_brightness(0x7F); print(ONLINE_MSG); } } }
// Detach from the device bool out_saitek_t::detach(void) { if (!a_attached)return false; debug_out(info, "out_saitek: detaching joystick connection"); print(OFFLINE_MSG); set_time(true, 0, 0); set_date(0, 0, 0); set_display_brightness(0x00); set_led_brightness(0x00); #if IBM || LIN // libusb v0.1 int res = usb_close(a_usbhdl); if (res < 0) debug_out(err,"out_saitek: error while detaching the joystick: %s",usb_error(res)); #else // libusb v1.0 libusb_close(a_joydev); libusb_exit(NULL); #endif debug_out(info,"out_saitek: joystick disconnected cleanly"); return true; }
int main(int argc, char **argv) { struct ir_command command; struct ir_command timeoutCommand; int c; int led_brightness = 1; while ((c = getopt (argc, argv, "mBi:b:s:H:hd")) != -1) switch (c) { case 'm': multi_mode = 1; break; case 'i': idle_mode = atol(optarg); break; case 'b': button_mode = atol(optarg); break; case 's': special_mode = atol(optarg); break; case 'H': hold_mode = atol(optarg); break; case 'd': debug = 1; break; case 'h': usage(argc,argv); exit(0); break; case 'B': led_brightness = 0; break; case '?': switch(optopt) { case 'i': case 'b': case 's': case 'H': fprintf (stderr, "Option -%c requires an argument.\n", optopt); break; default: if (isprint (optopt)) fprintf (stderr, "Unknown option `-%c'.\n", optopt); else fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); } return 1; default: abort(); } set_led_brightness(led_brightness); memset(&timeoutCommand, 0, sizeof(timeoutCommand)); if(debug) printf("Creating socket...\n"); sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { printf("Error creating socket\n"); return -1; } if(debug) printf("Preparing button map...\n"); button_map[EVENT_UP] = new CPacketBUTTON(EVENT_UP, "JS0:AppleRemote", BTN_DOWN); button_map[EVENT_DOWN] = new CPacketBUTTON(EVENT_DOWN, "JS0:AppleRemote", BTN_DOWN); button_map[EVENT_LEFT] = new CPacketBUTTON(EVENT_LEFT, "JS0:AppleRemote", BTN_DOWN); button_map[EVENT_RIGHT] = new CPacketBUTTON(EVENT_RIGHT, "JS0:AppleRemote", BTN_DOWN); button_map[EVENT_PLAY] = new CPacketBUTTON(EVENT_PLAY, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_MENU] = new CPacketBUTTON(EVENT_MENU, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_HOLD_PLAY] = new CPacketBUTTON(EVENT_HOLD_PLAY, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_HOLD_MENU] = new CPacketBUTTON(EVENT_HOLD_MENU, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_UP | EVENT_RELEASE ] = new CPacketBUTTON(EVENT_UP, "JS0:AppleRemote", BTN_UP); button_map[EVENT_DOWN | EVENT_RELEASE ] = new CPacketBUTTON(EVENT_DOWN, "JS0:AppleRemote", BTN_UP); button_map[EVENT_LEFT | EVENT_RELEASE ] = new CPacketBUTTON(EVENT_LEFT, "JS0:AppleRemote", BTN_UP); button_map[EVENT_RIGHT | EVENT_RELEASE ] = new CPacketBUTTON(EVENT_RIGHT, "JS0:AppleRemote", BTN_UP); button_map[EVENT_EXTRA_PLAY] = new CPacketBUTTON(EVENT_EXTRA_PLAY, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_PAUSE] = new CPacketBUTTON(EVENT_EXTRA_PAUSE, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_STOP] = new CPacketBUTTON(EVENT_EXTRA_STOP, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_REPLAY] = new CPacketBUTTON(EVENT_EXTRA_REPLAY, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_SKIP] = new CPacketBUTTON(EVENT_EXTRA_SKIP, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_REWIND] = new CPacketBUTTON(EVENT_EXTRA_REWIND, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_FORWARD] = new CPacketBUTTON(EVENT_EXTRA_FORWARD, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_PAGEUP] = new CPacketBUTTON(EVENT_EXTRA_PAGEUP, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); button_map[EVENT_EXTRA_PAGEDOWN] = new CPacketBUTTON(EVENT_EXTRA_PAGEDOWN, "JS0:AppleRemote", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_UP] = new CPacketBUTTON(EVENT_HARMONY_UP, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_UP | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_UP, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_DOWN] = new CPacketBUTTON(EVENT_HARMONY_DOWN, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_DOWN | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_DOWN, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_LEFT] = new CPacketBUTTON(EVENT_HARMONY_LEFT, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_LEFT | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_LEFT, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_RIGHT] = new CPacketBUTTON(EVENT_HARMONY_RIGHT, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_RIGHT | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_RIGHT, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_OK] = new CPacketBUTTON(EVENT_HARMONY_OK, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_MENU] = new CPacketBUTTON(EVENT_HARMONY_MENU, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_HOLD_OK] = new CPacketBUTTON(EVENT_HARMONY_HOLD_OK, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_HOLD_MENU] = new CPacketBUTTON(EVENT_HARMONY_HOLD_MENU, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_PLAY] = new CPacketBUTTON(EVENT_HARMONY_PLAY, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_STOP] = new CPacketBUTTON(EVENT_HARMONY_STOP, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_PAUSE] = new CPacketBUTTON(EVENT_HARMONY_PAUSE, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_REPLAY] = new CPacketBUTTON(EVENT_HARMONY_REPLAY, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_SKIP] = new CPacketBUTTON(EVENT_HARMONY_SKIP, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_REWIND] = new CPacketBUTTON(EVENT_HARMONY_REWIND, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_REWIND | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_REWIND, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_FORWARD] = new CPacketBUTTON(EVENT_HARMONY_FORWARD, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_FORWARD | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_FORWARD, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_RECORD] = new CPacketBUTTON(EVENT_HARMONY_RECORD, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_PREV] = new CPacketBUTTON(EVENT_HARMONY_PREV, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_GUIDE] = new CPacketBUTTON(EVENT_HARMONY_GUIDE, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_INFO] = new CPacketBUTTON(EVENT_HARMONY_INFO, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_EXIT] = new CPacketBUTTON(EVENT_HARMONY_EXIT, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_VOLUP] = new CPacketBUTTON(EVENT_HARMONY_VOLUP, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_VOLUP | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_VOLUP, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_VOLDOWN] = new CPacketBUTTON(EVENT_HARMONY_VOLDOWN, "JS0:Harmony", BTN_DOWN); multi_map[EVENT_HARMONY_VOLDOWN | EVENT_RELEASE] = new CPacketBUTTON(EVENT_HARMONY_VOLDOWN, "JS0:Harmony", BTN_UP); multi_map[EVENT_HARMONY_1] = new CPacketBUTTON(EVENT_HARMONY_1, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_2] = new CPacketBUTTON(EVENT_HARMONY_2, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_3] = new CPacketBUTTON(EVENT_HARMONY_3, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_4] = new CPacketBUTTON(EVENT_HARMONY_4, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_5] = new CPacketBUTTON(EVENT_HARMONY_5, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_6] = new CPacketBUTTON(EVENT_HARMONY_6, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_7] = new CPacketBUTTON(EVENT_HARMONY_7, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_8] = new CPacketBUTTON(EVENT_HARMONY_8, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_9] = new CPacketBUTTON(EVENT_HARMONY_9, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_0] = new CPacketBUTTON(EVENT_HARMONY_0, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_CLEAR] = new CPacketBUTTON(EVENT_HARMONY_CLEAR, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_ENTER] = new CPacketBUTTON(EVENT_HARMONY_ENTER, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_MUTE] = new CPacketBUTTON(EVENT_HARMONY_MUTE, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_ASPECT] = new CPacketBUTTON(EVENT_HARMONY_ASPECT, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F1] = new CPacketBUTTON(EVENT_HARMONY_F1, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F2] = new CPacketBUTTON(EVENT_HARMONY_F2, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F3] = new CPacketBUTTON(EVENT_HARMONY_F3, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F4] = new CPacketBUTTON(EVENT_HARMONY_F4, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F5] = new CPacketBUTTON(EVENT_HARMONY_F5, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F6] = new CPacketBUTTON(EVENT_HARMONY_F6, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F7] = new CPacketBUTTON(EVENT_HARMONY_F7, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F8] = new CPacketBUTTON(EVENT_HARMONY_F8, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F9] = new CPacketBUTTON(EVENT_HARMONY_F9, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F10] = new CPacketBUTTON(EVENT_HARMONY_F10, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F11] = new CPacketBUTTON(EVENT_HARMONY_F11, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F12] = new CPacketBUTTON(EVENT_HARMONY_F12, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F13] = new CPacketBUTTON(EVENT_HARMONY_F13, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_F14] = new CPacketBUTTON(EVENT_HARMONY_F14, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_CHANUP] = new CPacketBUTTON(EVENT_HARMONY_CHANUP, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_CHANDOWN] = new CPacketBUTTON(EVENT_HARMONY_CHANDOWN, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_LRGDOWN] = new CPacketBUTTON(EVENT_HARMONY_LRGDOWN, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_LRGUP] = new CPacketBUTTON(EVENT_HARMONY_LRGUP, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_PWRTOGGLE] = new CPacketBUTTON(EVENT_HARMONY_PWRTOGGLE, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_QUEUE] = new CPacketBUTTON(EVENT_HARMONY_QUEUE, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_SLEEP] = new CPacketBUTTON(EVENT_HARMONY_SLEEP, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_RED] = new CPacketBUTTON(EVENT_HARMONY_RED, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_GREEN] = new CPacketBUTTON(EVENT_HARMONY_GREEN, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_YELLOW] = new CPacketBUTTON(EVENT_HARMONY_YELLOW, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); multi_map[EVENT_HARMONY_BLUE] = new CPacketBUTTON(EVENT_HARMONY_BLUE, "JS0:Harmony", BTN_DOWN | BTN_NO_REPEAT | BTN_QUEUE); pairedRemoteId = readPairedAddressId(); if(debug) printf("Paired to: %x\n", pairedRemoteId); if(debug) printf("Ready!\n"); set_led(LEDMODE_WHITE); int keydown = 0; set_led(idle_mode); while(1){ int result = usb_interrupt_read(get_ir(), 0x82, (char*) &command, sizeof(command), keydown ? BUTTON_TIMEOUT : 0); if(result > 0) { // we have an IR code! unsigned long start = millis(); if(debug) dumphex((unsigned char*) &command, result); if(command.flags == 0x26) { // set command.event = 0xee; } switch(command.event) { case 0xee: case 0xe5: if(pairedRemoteId == 0 || command.address == pairedRemoteId || (is_multi_candidate(command))) { set_led(button_mode); handle_button(command); } break; case 0xe0: set_led(special_mode); handle_special(command); break; default: if(debug) printf("Unknown event %x\n", command.event); } keydown = 1; } else if(result == -110) { // timeout, reset led keydown = 0; set_led(idle_mode); handle_button(timeoutCommand); handle_special(timeoutCommand); } else { // something else keydown = 0; if(debug) printf("Got nuffing: %d\n", result); } } reattach(); }
bool process_menu(void) { start_led_sequence(led_seq_menu_begin); // print the main menu uint8_t keycode; char* pEnd; const uint8_t BUFF_SIZE = 64; char string_buff[BUFF_SIZE]; for (;;) { // welcome & version if (!send_text(PSTR("\x01" // translates to Ctrl-A on the dongle "7G wireless\n" "firmware build " __DATE__ " " __TIME__ "\n" "battery voltage: "), true, false)) return true; get_battery_voltage_str(string_buff); if (!send_text(string_buff, false, false)) return true; // RF stats if (!send_text(PSTR("\nRF packet stats (total/retransmit/lost): "), true, false)) return true; ultoa(rf_packets_total, string_buff, 10); pEnd = strchr(string_buff, '\0'); *pEnd++ = '/'; ultoa(arc_total, pEnd, 10); pEnd = strchr(string_buff, '\0'); *pEnd++ = '/'; ultoa(plos_total, pEnd, 10); if (!send_text(string_buff, false, false)) return true; // output the time since reset uint16_t days; uint8_t hours, minutes, seconds; get_time(&days, &hours, &minutes, &seconds); if (!send_text(PSTR("\nkeyboard's been on for "), true, false)) return true; string_buff[0] = '\0'; if (days > 0) { itoa(days, string_buff, 10); strcat_P(string_buff, PSTR(" days ")); } if (hours > 0 || days > 0) { itoa(hours, strchr(string_buff, 0), 10); pEnd = strlcat_P(string_buff, PSTR(" hours "), BUFF_SIZE) + string_buff; } else { pEnd = strchr(string_buff, 0); } itoa(minutes, pEnd, 10); pEnd = strlcat_P(string_buff, PSTR(" minutes "), BUFF_SIZE) + string_buff; itoa(seconds, pEnd, 10); strcat_P(string_buff, PSTR(" seconds\n")); if (!send_text(string_buff, false, true)) return true; // menu if (!send_text(PSTR("\n\nwhat do you want to do?\n" "F1 - change transmitter output power (current "), true, false)) return true; switch (get_nrf_output_power()) { case vRF_PWR_M18DBM: send_text(PSTR("-18"), true, false); break; case vRF_PWR_M12DBM: send_text(PSTR("-12"), true, false); break; case vRF_PWR_M6DBM: send_text(PSTR("-6"), true, false); break; case vRF_PWR_0DBM: send_text(PSTR("0"), true, false); break; } if (!send_text(PSTR("dBm)\nF2 - change LED brightness (current "), true, false)) return true; uint8_t fcnt; for (fcnt = 0; fcnt < sizeof led_brightness_lookup; ++fcnt) { if (led_brightness_lookup[fcnt] == get_led_brightness()) { string_buff[0] = 'F'; itoa(fcnt + 1, string_buff + 1, 10); break; } } // no match found in the loop? if (fcnt == sizeof led_brightness_lookup) itoa(get_led_brightness(), string_buff, 10); if (!send_text(string_buff, false, false)) return true; if (!send_text(PSTR(")\nF3 - lock keyboard (unlock with Func+Del+LCtrl)\n" "F4 - reset RF packet stats\n" "F5 - refresh this menu\n" "F6 - calibrate internal RC oscillator (OSCCAL="), true, false)) return true; // output OSCCAL itoa(OSCCAL, string_buff, 10); if (!send_text(string_buff, false, false)) return true; if (!send_text(PSTR(")\nEsc - exit menu\n\n"), true, false)) return true; // get the user response do { keycode = get_key_input(); } while (!(keycode >= KC_F1 && keycode <= KC_F6) && keycode != KC_ESC); if (keycode == KC_F1) { if (!send_text(PSTR("select power:\nF1 0dBm\nF2 -6dBm\nF3 -12dBm\nF4 -18dBm\n"), true, false)) return true; while (1) { keycode = get_key_input(); if (keycode >= KC_F1 && keycode <= KC_F4) { if (keycode == KC_F1) set_nrf_output_power(vRF_PWR_0DBM); if (keycode == KC_F2) set_nrf_output_power(vRF_PWR_M6DBM); if (keycode == KC_F3) set_nrf_output_power(vRF_PWR_M12DBM); if (keycode == KC_F4) set_nrf_output_power(vRF_PWR_M18DBM); break; } } } else if (keycode == KC_F2) { if (!send_text(PSTR("press F1 (dimmest) to F12 (brightest) for brightness, Esc to finish\n"), true, false)) return true; do { keycode = get_key_input(); if (keycode >= KC_F1 && keycode <= KC_F12) { set_led_brightness(led_brightness_lookup[keycode - KC_F1]); set_leds(7, 50); } } while (keycode != KC_ESC); } else if (keycode == KC_F3) { send_text(PSTR("Keyboard is now LOCKED!!!\nPress Func+Del+LCtrl to unlock\n\n"), true, false); return true; } else if (keycode == KC_F4) { // reset the counters to 0 plos_total = arc_total = rf_packets_total = 0; } else if (keycode == KC_F6) { // recalibrate the internnal RC oscillator calibrate_rc(); } else if (keycode == KC_ESC) { start_led_sequence(led_seq_menu_end); send_text(PSTR("\nexiting menu, you can type now\n"), true, true); break; } } return false; }
int main(int argc, char **argv) { static const struct option options[] = { { "help", no_argument, 0, 'h' }, { "version", no_argument, 0, 'v' }, { "reattach", no_argument, 0, 'r' }, { "fan-off", no_argument, 0, 'f' }, { "fan-on", no_argument, 0, 'F' }, { "brightness-low", no_argument, 0, 'b' }, { "brightness-high", no_argument, 0, 'B' }, { "led", required_argument, 0, 'l' }, { 0, 0, 0, 0 } }; int c; if (argc == 1) usage(); else do { c = getopt_long(argc, argv, "hvrfFbBl:", options, 0); switch (c) { case 'v': printf("atvtool version " VERSION ", (C) 2008 " "Peter Korsgaard <*****@*****.**>\n"); exit(0); break; case 'r': reattach(); break; case 'f': case 'F': set_fan(c == 'F'); break; case 'b': case 'B': set_led_brightness(c == 'B'); break; case 'l': { int val; char *endp; val = strtol(optarg, &endp, 0); if ((*endp) || (val > LEDMODE_MAX) || (val < 0)) { fprintf(stderr, "invalid led mode '%s'\n", optarg); usage(); exit(1); } set_led(val); } break; case -1: break; default: usage(); break; } } while (c != -1); return 0; }