Files
webkeyboard/parse_keys.c
T
2025-07-20 17:41:47 -04:00

110 lines
3.1 KiB
C

#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"
#include "tusb.h"
#include "parse_keys.h"
#include "usb_descriptors.h"
// 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[3];
memset(mouse_report, 0x00, 3);
// 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<3; i++){
printf("%02X ",mouse_report[i]);
}
printf("\n");
tud_hid_report(REPORT_ID_MOUSE, mouse_report, 3);
}
// 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;
}