#include #include #include "pico/stdlib.h" #include "tusb.h" #include "parse_keys.h" #include "usb_descriptors.h" static unsigned char boot_buf[8]; // take a list of Javascript keys representing pressed keys and turn into // a 8 byte USB boot keyboard report format void parse_key_list(char * keys) { uint8_t keypos = 2; // bytes 2-7 are used for normal keys uint8_t code = 0x00; static unsigned char boot_report[8]; memset(boot_report, 0x00, 8); // Javascript sends the list as comma delimited, so split into individual // keys by splitting at commas char * token = strtok(keys, ","); while (token != NULL) { code = parse_key_single(token); // add scan code to the boot report unless we have already added // the 8th byte (6 scan codes) to the report if (code && keypos < 8) { boot_report[keypos] = code; keypos++; } // if a scan code was not returned, it might be a modifier if (code == 0x00) { // search for the correct modifier bit and add it to byte 0 of the // USB boot keyboard report code = parse_mod(token); if (code) { boot_report[0] = boot_report[0] | code; } } token = strtok(NULL, ","); } // print resulting HID boot keyboard report to CDC for debugging printf("Keyboard report: "); for(int i=0; i<8; i++){ printf("%02X ",boot_report[i]); } printf("\n"); tud_hid_report(REPORT_ID_KEYBOARD, boot_report, 8); } void parse_mouse_list (char * keys) { static unsigned char mouse_report[5]; memset(mouse_report, 0x00, 5); // Javascript sends the list as comma delimited, so split into individual // keys by splitting at commas char * token = strtok(keys, ","); while (token != NULL) { if ( strncmp(&token[0],"MouseLeft", 9) == 0 ){ mouse_report[1] = -1*MOUSE_SPEED; } else if ( strncmp(&token[0], "MouseRight", 10) == 0 ) { mouse_report[1] = 1*MOUSE_SPEED; } else if ( strncmp(&token[0], "MouseUp", 7) == 0 ) { mouse_report[2] = -1*MOUSE_SPEED; } else if ( strncmp(&token[0], "MouseDown", 9) == 0 ) { mouse_report[2] = 1*MOUSE_SPEED; } else if ( strncmp(&token[0], "MouseClickLeft", 14) == 0 ) { mouse_report[0] = mouse_report[0] | 1; } else if ( strncmp(&token[0], "MouseClickRight", 15) == 0) { mouse_report[0] = mouse_report[0] | 2; } token = strtok(NULL, ","); } // print resulting HID boot mouse report to CDC for debugging printf("Mouse report: "); for(int i=0; i<5; i++){ printf("%02X ",mouse_report[i]); } printf("\n"); tud_hid_report(REPORT_ID_MOUSE, mouse_report, 5); } // take a single Javascript key code and convert it to USB HID scancode // if it is a regular key, i.e. not a modifier key uint8_t parse_key_single(char * key) { // search keycode dictionary defined in parse_keys.h to see if it's a // regular key for (int i=0; i < NKEYS; i++) { keycode_dict * keycode = &keytable[i]; if (strcmp(keycode->key, key) == 0){ return keycode->val; } } // key not found in lookup table return 0x00; } // parse modifier keys and turn them into the appropriate modifier bit code uint8_t parse_mod(char * key) { for (int i=0; i < NMODS; i++) { keycode_dict * modcode = &modtable[i]; if (strcmp(modcode->key, key) == 0){ return modcode->val; } } return 0x00; }