From 6e4641dde65d501a04d71dcfea03f3e65cb5fe8f Mon Sep 17 00:00:00 2001 From: Jan Almeroth Date: Mon, 26 Aug 2024 17:13:42 +0200 Subject: [PATCH] chore: introduce device config --- src/actions.c | 53 +++++++++++++++++++++++++++++---------------------- src/main.h | 11 +++++++++++ src/setup.c | 10 ++++++++++ 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/actions.c b/src/actions.c index 5eec818..40ed8ec 100644 --- a/src/actions.c +++ b/src/actions.c @@ -76,51 +76,58 @@ void screensaver_task(void) { void send_lock_screen_report(uart_packet_t *packet, device_t *state) { (void)packet; - (void)state; keyboard_report_t lock_report = {0}, release_keys = {0}; + uint8_t off, pos; - if (BOARD_ROLE == PICO_A) { // Linux + switch (global_state.device_config[BOARD_ROLE].os) { + case LINUX: lock_report.modifier = KEYBOARD_MODIFIER_LEFTGUI; - uint8_t off = get_byte_offset(HID_KEY_L); - uint8_t pos = get_pos_in_byte(HID_KEY_L); + off = get_byte_offset(HID_KEY_L); + pos = get_pos_in_byte(HID_KEY_L); lock_report.keycode[off] = 1 << pos; - } else if (BOARD_ROLE == PICO_B) { // MACOS + break; + case MACOS: lock_report.modifier = KEYBOARD_MODIFIER_LEFTCTRL | KEYBOARD_MODIFIER_LEFTGUI; - uint8_t off = get_byte_offset(HID_KEY_Q); - uint8_t pos = get_pos_in_byte(HID_KEY_Q); + off = get_byte_offset(HID_KEY_Q); + pos = get_pos_in_byte(HID_KEY_Q); lock_report.keycode[off] = 1 << pos; + break; } send_tud_report(ITF_NUM_HID_KB, REPORT_ID_KEYBOARD, (uint8_t *)&lock_report, - PACKET_DATA_LENGTH); + sizeof(keyboard_report_t)); send_tud_report(ITF_NUM_HID_KB, REPORT_ID_KEYBOARD, (uint8_t *)&release_keys, - PACKET_DATA_LENGTH); + sizeof(keyboard_report_t)); } void send_suspend_pc_report(uart_packet_t *packet, device_t *state) { (void)packet; (void)state; - keyboard_report_t lock_report = {0}; - - if (BOARD_ROLE == PICO_A) { // Linux - lock_report.modifier = KEYBOARD_MODIFIER_LEFTGUI | - KEYBOARD_MODIFIER_LEFTCTRL | - KEYBOARD_MODIFIER_LEFTSHIFT; - uint8_t off = get_byte_offset(HID_KEY_Q); - uint8_t pos = get_pos_in_byte(HID_KEY_Q); - lock_report.keycode[off] = 1 << pos; - } else if (BOARD_ROLE == PICO_B) { // MACOS - lock_report.modifier = + keyboard_report_t suspend_report = {0}; + uint8_t off, pos; + + switch (global_state.device_config[BOARD_ROLE].os) { + case LINUX: + suspend_report.modifier = KEYBOARD_MODIFIER_LEFTGUI | + KEYBOARD_MODIFIER_LEFTCTRL | + KEYBOARD_MODIFIER_LEFTSHIFT; + off = get_byte_offset(HID_KEY_Q); + pos = get_pos_in_byte(HID_KEY_Q); + suspend_report.keycode[off] = 1 << pos; + break; + case MACOS: + suspend_report.modifier = KEYBOARD_MODIFIER_LEFTALT | KEYBOARD_MODIFIER_LEFTGUI; + break; } - send_tud_report(ITF_NUM_HID_KB, REPORT_ID_KEYBOARD, (uint8_t *)&lock_report, - PACKET_DATA_LENGTH); + send_tud_report(ITF_NUM_HID_KB, REPORT_ID_KEYBOARD, + (uint8_t *)&suspend_report, sizeof(keyboard_report_t)); - if (BOARD_ROLE == PICO_B) { + if (global_state.device_config[BOARD_ROLE].os == MACOS) { consumer_report_t eject_report = {0}; eject_report.apple = 1 << 3; // Usage (Eject) send_tud_report(ITF_NUM_HID_MS, 3, (uint8_t *)&eject_report, diff --git a/src/main.h b/src/main.h index 4b7bbb2..b0b17c3 100644 --- a/src/main.h +++ b/src/main.h @@ -35,6 +35,7 @@ // BOARD CONFIG #define PICO_A 0 #define PICO_B 1 +#define NUM_DEVICES 2 // PICO_A + PICO_B #define GPIO_LED_PIN 25 // LED is connected to pin 25 on a PICO // UART CONFIG @@ -85,12 +86,22 @@ enum packet_type_e { }; typedef enum { IDLE, READING_PACKET, PROCESSING_PACKET } uart_state_t; +enum os_type_e { + LINUX = 1, + MACOS, +}; + +typedef struct { + uint8_t os; +} device_config_t; + typedef struct { uint8_t active_output; // Currently selected output (0 = A, 1 = B) uint64_t last_activity; // Timestamp of the last input activity bool tud_connected; // Are we connected to the host uart_state_t uart_state; // Storing the state for the simple receiver state machine + device_config_t device_config[NUM_DEVICES]; } device_t; typedef void (*action_handler_t)(); diff --git a/src/setup.c b/src/setup.c index 1003417..5247d8f 100644 --- a/src/setup.c +++ b/src/setup.c @@ -52,6 +52,15 @@ void setup_tuh(void) { bi_decl(bi_1pin_with_name(PIO_USB_DP_PIN_DEFAULT, "USB DP")); } +void set_user_config(void) { + const char *os_type_str[] = {"undefined", "Linux", "macOS"}; + + global_state.device_config[PICO_A].os = PICO_A_OS; + global_state.device_config[PICO_B].os = PICO_B_OS; + printf("PICO_%s OS: %s\r\n", BOARD_ROLE ? "B" : "A", + os_type_str[global_state.device_config[BOARD_ROLE].os]); +} + void initial_setup(void) { // default 125MHz is not appropreate. Sysclock should be multiple of 12MHz. set_sys_clock_khz(120000, true); @@ -71,5 +80,6 @@ void initial_setup(void) { // all USB task run in core1 multicore_launch_core1(core1_main); + set_user_config(); restore_leds(); }