diff --git a/device/src/bt_conn.c b/device/src/bt_conn.c index c56c7ab18..bb8468d74 100644 --- a/device/src/bt_conn.c +++ b/device/src/bt_conn.c @@ -981,9 +981,6 @@ void BtConn_Init(void) { void num_comp_reply(int passkey) { struct bt_conn *conn; -#if DEVICE_HAS_OLED - NotificationScreen_NotifyFor("Pairing...", 10000); -#endif if (!auth_conn) { return; @@ -994,8 +991,14 @@ void num_comp_reply(int passkey) { if (passkey >= 0) { bt_conn_auth_passkey_entry(conn, passkey); LOG_INF("Sending passkey to conn %s", GetPeerStringByConn(conn)); +#if DEVICE_HAS_OLED + NotificationScreen_NotifyFor("Pairing...", 10000); +#endif } else { conn = unsetAuthConn(true); +#if DEVICE_HAS_OLED + PairingScreen_Feedback(false); +#endif } } diff --git a/device/src/keyboard/oled/screens/pairing_screen.c b/device/src/keyboard/oled/screens/pairing_screen.c index c5c637d41..c27fee44c 100644 --- a/device/src/keyboard/oled/screens/pairing_screen.c +++ b/device/src/keyboard/oled/screens/pairing_screen.c @@ -75,7 +75,6 @@ const rgb_t* PairingScreen_ActionColor(key_action_t* action) { static const rgb_t black = { 0, 0, 0 }; static const rgb_t green = { 0, 0xff, 0 }; static const rgb_t red = { 0xff, 0, 0 }; - static const rgb_t blue = { 0, 0, 0xff }; if ( action->type != KeyActionType_Keystroke @@ -86,16 +85,18 @@ const rgb_t* PairingScreen_ActionColor(key_action_t* action) { } switch (action->keystroke.scancode) { - case HID_KEYBOARD_SC_ESCAPE: - return &red; - case HID_KEYBOARD_SC_DELETE: - case HID_KEYBOARD_SC_BACKSPACE: - return &blue; + // Numbers are green case HID_KEYBOARD_SC_1_AND_EXCLAMATION ... HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS: case HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS: case HID_KEYBOARD_SC_KEYPAD_1_AND_END ... HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP: case HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT: return &green; + // Control keys (esc, backspace) are red + case HID_KEYBOARD_SC_ESCAPE: + case HID_KEYBOARD_SC_DELETE: + case HID_KEYBOARD_SC_BACKSPACE: + return &red; + // Everything else is black default: return &black; } diff --git a/device/src/keyboard/oled/screens/screen_manager.c b/device/src/keyboard/oled/screens/screen_manager.c index 3638f2d9d..f1eddc509 100644 --- a/device/src/keyboard/oled/screens/screen_manager.c +++ b/device/src/keyboard/oled/screens/screen_manager.c @@ -9,6 +9,7 @@ #include "timer.h" #include "event_scheduler.h" #include "ledmap.h" +#include "keymap_pairing.h" screen_id_t ActiveScreen = ScreenId_Main; @@ -18,6 +19,7 @@ static void onExit(screen_id_t screen) { switch(screen) { case ScreenId_Pairing: InteractivePairingInProgress = false; + Keymap_DeactivatePairingKeymap(); Ledmap_ResetTemporaryLedBacklightingMode(); EventVector_Set(EventVector_LedManagerFullUpdateNeeded); break; @@ -36,6 +38,7 @@ void ScreenManager_ActivateScreen(screen_id_t screen) case ScreenId_Pairing: InteractivePairingInProgress = true; screenPtr = PairingScreen; + Keymap_ActivatePairingKeymap(); Ledmap_SetTemporaryLedBacklightingMode(BacklightingMode_Numpad); EventVector_Set(EventVector_LedManagerFullUpdateNeeded); Ledmap_UpdateBacklightLeds(); diff --git a/right/src/CMakeLists.txt b/right/src/CMakeLists.txt index 1e9b863b4..bd0aca2ef 100644 --- a/right/src/CMakeLists.txt +++ b/right/src/CMakeLists.txt @@ -37,6 +37,7 @@ target_sources(${PROJECT_NAME} PRIVATE $<$:${CMAKE_CURRENT_SOURCE_DIR}/init_peripherals.c> key_states.c keymap.c + keymap_pairing.c layer.c layer_stack.c layer_switcher.c diff --git a/right/src/keymap.c b/right/src/keymap.c index 32caaec53..565cdb501 100644 --- a/right/src/keymap.c +++ b/right/src/keymap.c @@ -640,3 +640,4 @@ key_action_t CurrentKeymap[LayerId_Count][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] }, }; + diff --git a/right/src/keymap_pairing.c b/right/src/keymap_pairing.c new file mode 100644 index 000000000..829942446 --- /dev/null +++ b/right/src/keymap_pairing.c @@ -0,0 +1,70 @@ +#include +#include "keymap_pairing.h" +#include "keymap.h" +#include "key_action.h" +#include "layer.h" +#include "event_scheduler.h" +#include "lufa/HIDClassCommon.h" +#include "macros/keyid_parser.h" + +#define PAIRING_KEYMAP_INDEX 0xFF + +#define KEYID_TO_SLOT(keyId) ((keyId) / 64) +#define KEYID_TO_INDEX(keyId) ((keyId) % 64) + +static uint8_t savedKeymapIndex = 0; + +static void setPairingKey(const char* keyIdStr, uint16_t scancode) +{ + uint8_t keyId = KeyIdParser_KeyIdFromString(keyIdStr); + if (keyId == 255) { + return; + } + uint8_t slotId = KEYID_TO_SLOT(keyId); + uint8_t keyIndex = KEYID_TO_INDEX(keyId); + CurrentKeymap[LayerId_Base][slotId][keyIndex] = (key_action_t){ + .type = KeyActionType_Keystroke, + .keystroke = { .keystrokeType = KeystrokeType_Basic, .scancode = scancode } + }; +} + +void Keymap_ActivatePairingKeymap(void) +{ + if (CurrentKeymapIndex == PAIRING_KEYMAP_INDEX) { + return; + } + + savedKeymapIndex = CurrentKeymapIndex; + CurrentKeymapIndex = PAIRING_KEYMAP_INDEX; + + // Clear entire keymap to KeyActionType_None + memset(CurrentKeymap, 0, sizeof(CurrentKeymap)); + + // Set up number keys at default locations + setPairingKey("0", HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS); + setPairingKey("1", HID_KEYBOARD_SC_1_AND_EXCLAMATION); + setPairingKey("2", HID_KEYBOARD_SC_2_AND_AT); + setPairingKey("3", HID_KEYBOARD_SC_3_AND_HASHMARK); + setPairingKey("4", HID_KEYBOARD_SC_4_AND_DOLLAR); + setPairingKey("5", HID_KEYBOARD_SC_5_AND_PERCENTAGE); + setPairingKey("6", HID_KEYBOARD_SC_6_AND_CARET); + setPairingKey("7", HID_KEYBOARD_SC_7_AND_AMPERSAND); + setPairingKey("8", HID_KEYBOARD_SC_8_AND_ASTERISK); + setPairingKey("9", HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS); + + // Set up control keys + setPairingKey("backspace", HID_KEYBOARD_SC_BACKSPACE); + setPairingKey("escape", HID_KEYBOARD_SC_ESCAPE); + setPairingKey("capsLock", HID_KEYBOARD_SC_ESCAPE); + + EventVector_Set(EventVector_LedMapUpdateNeeded); +} + +void Keymap_DeactivatePairingKeymap(void) +{ + if (CurrentKeymapIndex != PAIRING_KEYMAP_INDEX) { + return; + } + + SwitchKeymapById(savedKeymapIndex, true); +} diff --git a/right/src/keymap_pairing.h b/right/src/keymap_pairing.h new file mode 100644 index 000000000..40c05a3e2 --- /dev/null +++ b/right/src/keymap_pairing.h @@ -0,0 +1,7 @@ +#ifndef __KEYMAP_PAIRING_H__ +#define __KEYMAP_PAIRING_H__ + +void Keymap_ActivatePairingKeymap(void); +void Keymap_DeactivatePairingKeymap(void); + +#endif diff --git a/right/src/macros/keyid_parser.c b/right/src/macros/keyid_parser.c index 01a9bbd89..ba53fcf21 100644 --- a/right/src/macros/keyid_parser.c +++ b/right/src/macros/keyid_parser.c @@ -4,6 +4,7 @@ #include "str_utils.h" #include #include +#include #include "debug.h" @@ -197,3 +198,9 @@ const char* MacroKeyIdParser_KeyIdToAbbreviation(uint8_t keyId) } return "?"; } + +uint8_t KeyIdParser_KeyIdFromString(const char* str) +{ + const lookup_record_t* record = lookup(0, lookup_size-1, str, str + strlen(str)); + return record ? record->keyId : 255; +} diff --git a/right/src/macros/keyid_parser.h b/right/src/macros/keyid_parser.h index 7d500fc21..e67218e93 100644 --- a/right/src/macros/keyid_parser.h +++ b/right/src/macros/keyid_parser.h @@ -15,6 +15,7 @@ void KeyIdParser_initialize(); uint8_t MacroKeyIdParser_TryConsumeKeyId(parser_context_t* ctx); + uint8_t KeyIdParser_KeyIdFromString(const char* str); const char* MacroKeyIdParser_KeyIdToAbbreviation(uint8_t keyId) ;