From 39d41a92a61b5b75ca5be37dee4fc74eb2ab9e26 Mon Sep 17 00:00:00 2001 From: Brad Midgley Date: Mon, 31 Aug 2026 13:44:08 -0600 Subject: [PATCH 1/2] i2c arrow codes --- README.md | 2 +- src/main/app/app_factory.c | 24 ++++++++++++++++-------- src/main/app/app_factory.h | 6 ++++++ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index af549ea..599cbb4 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ | Mode | Description | |------|-------------| -| **I2C** (default) | I2C slave reports characters / key data to the host. | +| **I2C** (default) | I2C slave reports characters / key data to the host. Fn+D/X/Z/C emit CardKB navigation codes (`0xB5`/`0xB6`/`0xB4`/`0xB7`) for host UI navigation (e.g. Meshtastic). | | **UART** | Custom frames with key index and press / release over UART. | | **ESP-NOW** | Broadcasts key frames (similar framing to UART). | | **BLE HID** | Bluetooth HID keyboard, including arrow keys via Fn combos. | diff --git a/src/main/app/app_factory.c b/src/main/app/app_factory.c index 1e8a233..320a34b 100644 --- a/src/main/app/app_factory.c +++ b/src/main/app/app_factory.c @@ -700,37 +700,45 @@ static void app_process_key_event(key_event_t *key_event) if (is_press && fn_pressed) { switch (key_event->button_index) { case KEY_UP: // Fn+D = 上方向键 - if (g_mode == MODE_BLEHID) { + if (g_mode == MODE_I2C) { + bsp_i2c_add_key(KEYCODE_ARROW_UP); + } else if (g_mode == MODE_BLEHID) { if (bsp_blehid_is_connected()) { bsp_blehid_send_keycode(0, USB_HID_KEY_UP); } } return; - + case KEY_LEFT: // Fn+Z = 左方向键 - if (g_mode == MODE_BLEHID) { + if (g_mode == MODE_I2C) { + bsp_i2c_add_key(KEYCODE_ARROW_LEFT); + } else if (g_mode == MODE_BLEHID) { if (bsp_blehid_is_connected()) { bsp_blehid_send_keycode(0, USB_HID_KEY_LEFT); } } return; - + case KEY_DOWN: // Fn+X = 下方向键 - if (g_mode == MODE_BLEHID) { + if (g_mode == MODE_I2C) { + bsp_i2c_add_key(KEYCODE_ARROW_DOWN); + } else if (g_mode == MODE_BLEHID) { if (bsp_blehid_is_connected()) { bsp_blehid_send_keycode(0, USB_HID_KEY_DOWN); } } return; - + case KEY_RIGHT: // Fn+C = 右方向键 - if (g_mode == MODE_BLEHID) { + if (g_mode == MODE_I2C) { + bsp_i2c_add_key(KEYCODE_ARROW_RIGHT); + } else if (g_mode == MODE_BLEHID) { if (bsp_blehid_is_connected()) { bsp_blehid_send_keycode(0, USB_HID_KEY_RIGHT); } } return; - + default: break; } diff --git a/src/main/app/app_factory.h b/src/main/app/app_factory.h index 6f9cc83..3ed53db 100644 --- a/src/main/app/app_factory.h +++ b/src/main/app/app_factory.h @@ -57,6 +57,12 @@ typedef struct { #define KEY_DOWN 36 // 下方向键 (行3, 列3) = 3*11+3 = 36 (Fn+X) #define KEY_RIGHT 37 // 右方向键 (行3, 列4) = 3*11+4 = 37 (Fn+C) +// Original M5Stack CardKB I2C navigation key codes (used by Meshtastic and other hosts) +#define KEYCODE_ARROW_LEFT 0xB4 +#define KEYCODE_ARROW_UP 0xB5 +#define KEYCODE_ARROW_DOWN 0xB6 +#define KEYCODE_ARROW_RIGHT 0xB7 + // 输出模式选择:1=DEBUG模式(输出index), 0=正常模式(输出ASCII) #define KEYBOARD_DEBUG_MODE 0 From cf80ea7407e006e3ee6a405918a28fdacf4046ea Mon Sep 17 00:00:00 2001 From: Brad Midgley Date: Mon, 31 Aug 2026 13:52:26 -0600 Subject: [PATCH 2/2] i2c enter key --- README.md | 2 +- src/main/app/app_factory.c | 7 ++++++- src/main/app/app_factory.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 599cbb4..d83451d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ | Mode | Description | |------|-------------| -| **I2C** (default) | I2C slave reports characters / key data to the host. Fn+D/X/Z/C emit CardKB navigation codes (`0xB5`/`0xB6`/`0xB4`/`0xB7`) for host UI navigation (e.g. Meshtastic). | +| **I2C** (default) | I2C slave reports characters / key data to the host. Enter sends CardKB CR (`0x0D`). Fn+D/X/Z/C emit CardKB navigation codes (`0xB5`/`0xB6`/`0xB4`/`0xB7`) for host UI navigation (e.g. Meshtastic). | | **UART** | Custom frames with key index and press / release over UART. | | **ESP-NOW** | Broadcasts key frames (similar framing to UART). | | **BLE HID** | Bluetooth HID keyboard, including arrow keys via Fn combos. | diff --git a/src/main/app/app_factory.c b/src/main/app/app_factory.c index 320a34b..5c6136b 100644 --- a/src/main/app/app_factory.c +++ b/src/main/app/app_factory.c @@ -768,7 +768,12 @@ static void app_process_key_event(key_event_t *key_event) char key_char = 0; if (app_get_key_char(key_event->button_index, &key_char)) { if (g_mode == MODE_I2C) { - bsp_i2c_add_key((uint8_t)key_char); + uint8_t i2c_key = (uint8_t)key_char; + // CardKB hosts (e.g. Meshtastic) expect CR for Enter, not LF from keymap + if (i2c_key == 0x0A || key_event->button_index == KEY_ENTER) { + i2c_key = KEYCODE_ENTER; + } + bsp_i2c_add_key(i2c_key); } else if (g_mode == MODE_BLEHID) { if (bsp_blehid_is_connected()) { bsp_blehid_send_key(key_char); diff --git a/src/main/app/app_factory.h b/src/main/app/app_factory.h index 3ed53db..ff34109 100644 --- a/src/main/app/app_factory.h +++ b/src/main/app/app_factory.h @@ -58,6 +58,7 @@ typedef struct { #define KEY_RIGHT 37 // 右方向键 (行3, 列4) = 3*11+4 = 37 (Fn+C) // Original M5Stack CardKB I2C navigation key codes (used by Meshtastic and other hosts) +#define KEYCODE_ENTER 0x0D #define KEYCODE_ARROW_LEFT 0xB4 #define KEYCODE_ARROW_UP 0xB5 #define KEYCODE_ARROW_DOWN 0xB6