diff --git a/.gitignore b/.gitignore index 1334e3c..43f998b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ firmware/compile_commands.json firmware/.cache/clangd/index +firmware/.ccls-cache diff --git a/firmware/src/main.cpp b/firmware/src/cmdr_keyboard.cpp similarity index 85% rename from firmware/src/main.cpp rename to firmware/src/cmdr_keyboard.cpp index 58ef86a..a1759a1 100755 --- a/firmware/src/main.cpp +++ b/firmware/src/cmdr_keyboard.cpp @@ -15,6 +15,11 @@ * --- ----- --------------------- --------------------------------------------- * ------------------------------------------------------------------------------------------------------- * ======================================================================================================= + * + * Date: 2023-09-02 + * Author: Christoffer Martinsson + * Email: cm@cmtec.se + * License: Please refer to end of this file for license information */ #include "IndicatorLed.h" @@ -25,12 +30,10 @@ const uint8_t USB_LED_NUM_LOCK = 0; const uint8_t USB_LED_CAPS_LOCK = 1; const uint8_t USB_LED_SCROLL_LOCK = 2; -const uint16_t KEY_OFFSET = 0xAA00; // Offset to apply for not interfere with already defined keyboard keys +const uint16_t KEY_OFFSET = 0xAA00; // Offset to apply for not interfere with already defined keyboard keys +const uint16_t KEY_FN = 1 + KEY_OFFSET; // Function layer 1 button +const uint16_t KEY_WIN_LATCH = 2 + KEY_OFFSET; // Function layer 2 button -const uint16_t KEY_FN = 10 + KEY_OFFSET; // Function layer 1 button -const uint16_t KEY_WIN_LATCH = 11 + KEY_OFFSET; // Function layer 2 button - -const uint8_t TAP_TIMEOUT = 150; // Key tap timeout (ms) const uint8_t NBR_OF_BUTTONS = 42; // Number of buttons used (42 in this case) struct Button @@ -49,14 +52,16 @@ const byte KP_COLS = 12; byte kp_rowPins[KP_ROWS] = {0, 1, 2, 3}; byte kp_colPins[KP_COLS] = {9, 8, 7, 6, 5, 4, 19, 18, 17, 16, 15, 14}; -const char kp_keys[KP_ROWS][KP_COLS] = { +const uint8_t MAX_PRESSED_KEYS = LIST_MAX; + +const char kp_keys_id[KP_ROWS][KP_COLS] = { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, {13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}, {25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}, {0, 0, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0}, }; -Keypad kp_keypad = Keypad(makeKeymap(kp_keys), kp_rowPins, kp_colPins, KP_ROWS, KP_COLS); +Keypad kp_keypad = Keypad(makeKeymap(kp_keys_id), kp_rowPins, kp_colPins, KP_ROWS, KP_COLS); /* @@ -71,24 +76,40 @@ Keypad kp_keypad = Keypad(makeKeymap(kp_keys), kp_rowPins, kp_colPins, KP_ROWS, * "Fn1 key" is the layer 1 key to use. Don NOT add KEY_FN1 or KEY_FN2 to this layer. * "Fn2 key" is the layer 2 key to use. Don NOT add KEY_FN1 or KEY_FN2 to this layer. + Swedish keymap (ISO) special characters (not matching the key definition): + + * KEY_TILE = § + * KEY_SEMICOLON = ö + * KEY_QUOTE = ä + * KEY_LEFT_BRACE = å + * KEY_SLASH = - + * KEY_NON_US_100 = < + * KEY_EQUAL = ´ + * KEY_BACKSLASH = ' + * KEY_RIGHT_BRACE = ^ + * KEY_MINUS = + + * KEY_LEFT_ALT = Alt + * KEY_RIGHT_ALT = AltGr + +*/ + /* Keymap config ----------------------------------------------------------------------------------------------------------------------------------- */ // clang-format off - Button buttons[NBR_OF_BUTTONS] = - { -/* Fn0 key Fn1 key Fn2 key */ +{ +/* KeyId Fn0 key Fn1 key Fn2 key */ /* 1 */ {KEY_TAB, KEY_ESC, KEY_F11, IDLE, NO_KEY, false}, /* 2 */ {KEY_Q, KEY_F1, KEY_F12, IDLE, NO_KEY, false}, /* 3 */ {KEY_W, KEY_F2, KEY_F13, IDLE, NO_KEY, false}, /* 4 */ {KEY_E, KEY_F3, KEY_F14, IDLE, NO_KEY, false}, /* 5 */ {KEY_R, KEY_F4, KEY_F15, IDLE, NO_KEY, false}, /* 6 */ {KEY_T, KEY_F5, KEY_F16, IDLE, NO_KEY, false}, -/* 7 */ {KEY_Y, KEY_F6, '§', IDLE, NO_KEY, false}, +/* 7 */ {KEY_Y, KEY_F6, KEY_TILDE, IDLE, NO_KEY, false}, /* 8 */ {KEY_U, KEY_F7, KEY_WIN_LATCH, IDLE, NO_KEY, false}, /* 9 */ {KEY_I, KEY_F8, KEY_LEFT_GUI, IDLE, NO_KEY, false}, /* 10 */ {KEY_O, KEY_F9, NO_KEY, IDLE, NO_KEY, false}, /* 11 */ {KEY_P, KEY_F10, KEY_CAPS_LOCK, IDLE, NO_KEY, false}, -/* 12 */ {'å', KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false}, +/* 12 */ {KEY_LEFT_BRACE, KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false}, /* 13 */ {KEY_LEFT_CTRL, KEY_LEFT_CTRL, KEY_LEFT_CTRL, IDLE, NO_KEY, false}, /* 14 */ {KEY_A, KEY_1, KEY_MEDIA_PLAY_PAUSE, IDLE, NO_KEY, false}, /* 15 */ {KEY_S, KEY_2, KEY_MEDIA_NEXT_TRACK, IDLE, NO_KEY, false}, @@ -99,15 +120,15 @@ Button buttons[NBR_OF_BUTTONS] = /* 20 */ {KEY_J, KEY_7, KEY_DOWN_ARROW, IDLE, NO_KEY, false}, /* 21 */ {KEY_K, KEY_8, KEY_UP_ARROW, IDLE, NO_KEY, false}, /* 22 */ {KEY_L, KEY_9, KEY_RIGHT_ARROW, IDLE, NO_KEY, false}, -/* 23 */ {'ö', KEY_0, KEY_DELETE, IDLE, NO_KEY, false}, -/* 24 */ {'ä', KEY_ENTER, KEY_ENTER, IDLE, NO_KEY, false}, +/* 23 */ {KEY_SEMICOLON, KEY_0, KEY_DELETE, IDLE, NO_KEY, false}, +/* 24 */ {KEY_QUOTE, KEY_ENTER, KEY_ENTER, IDLE, NO_KEY, false}, /* 25 */ {KEY_LEFT_SHIFT, KEY_LEFT_SHIFT, KEY_LEFT_SHIFT, IDLE, NO_KEY, false}, /* 26 */ {KEY_Z, KEY_6, KEY_F20, IDLE, NO_KEY, false}, /* 27 */ {KEY_X, KEY_7, KEY_F21, IDLE, NO_KEY, false}, /* 28 */ {KEY_C, KEY_8, KEY_F22, IDLE, NO_KEY, false}, /* 29 */ {KEY_V, KEY_9, KEY_F23, IDLE, NO_KEY, false}, /* 30 */ {KEY_B, KEY_0, KEY_F24, IDLE, NO_KEY, false}, -/* 31 */ {KEY_N, '<', KEY_HOME, IDLE, NO_KEY, false}, +/* 31 */ {KEY_N, KEY_NON_US_100, KEY_HOME, IDLE, NO_KEY, false}, /* 32 */ {KEY_M, KEY_EQUAL, KEY_PAGE_DOWN, IDLE, NO_KEY, false}, /* 33 */ {KEY_COMMA, KEY_BACKSLASH, KEY_PAGE_UP, IDLE, NO_KEY, false}, /* 34 */ {KEY_PERIOD, KEY_RIGHT_BRACE, KEY_END, IDLE, NO_KEY, false}, @@ -133,7 +154,7 @@ bool key_pressed = false; bool win_latched = false; /** - Perform key action. + set_key. @param keycode code to apply action. @param kstate PRESSED or RELEASED. @@ -141,11 +162,7 @@ bool win_latched = false; */ uint8_t set_key(uint16_t keycode, uint8_t kstate) { - /* Abort if keycode is invalid */ - if (keycode == NO_KEY || keycode == KEY_FN) - { - return 0; - } + if (keycode == NO_KEY || keycode == KEY_FN) return 0; if (keycode == KEY_WIN_LATCH) { @@ -184,22 +201,18 @@ uint8_t set_key(uint16_t keycode, uint8_t kstate) /** * find_and_set_button * - * @param key_id key character + * @param key_id * @param state_changed true if state changed * @param key_state PRESSED or RELEASED * @return 1 if button found and set, 0 if not */ uint8_t update_button_status(uint8_t key_id, bool state_changed, uint8_t key_state) { - if (key_id == 0) return 0; - - if (state_changed == true) - { - buttons[key_id - 1].run_keycode = true; - buttons[key_id - 1].kstate = key_state; - return 1; - } - return 0; + if (key_id == 0 || key_id > NBR_OF_BUTTONS || state_changed == false) return 0; + + buttons[key_id - 1].run_keycode = true; + buttons[key_id - 1].kstate = key_state; + return 1; } /** @@ -210,16 +223,10 @@ uint8_t update_button_status(uint8_t key_id, bool state_changed, uint8_t key_sta */ uint8_t check_if_button_is_fn(char key_id) { - uint8_t fn_key_found = 0; - - if (key_id == 0) return 0; - - /* Check if FN1 key are defined to this button (Layer 0 and first position in combo array)*/ - if (buttons[key_id - 1].keycode == KEY_FN) - { - fn_key_found = 1; - } - return fn_key_found; + if (key_id == 0 || key_id > NBR_OF_BUTTONS) return 0; + + if (buttons[key_id - 1].keycode == KEY_FN) return 1; + return 0; } /** @@ -227,11 +234,11 @@ uint8_t check_if_button_is_fn(char key_id) * * @return void */ -void check_bootloader_mode() +void check_if_to_enter_bootloader() { /* Enter bootloader if all four corner-buttons is pressed together */ int reboot = 0; - for (int i = 0; i < LIST_MAX; i++) + for (int i = 0; i < MAX_PRESSED_KEYS; i++) { if ((kp_keypad.key[i].kchar == 1) && (kp_keypad.key[i].kstate == PRESSED || kp_keypad.key[i].kstate == HOLD)) { @@ -252,7 +259,7 @@ void check_bootloader_mode() } if (reboot == 4) { - _reboot_Teensyduino_(); + _reboot_Teensyduino_(); // reboot to bootloader } } @@ -265,7 +272,7 @@ uint8_t get_fn_mode() { /* Check for Fn1 mode */ int fn_mode = 0; - for (int i = 0; i < LIST_MAX; i++) + for (int i = 0; i < MAX_PRESSED_KEYS; i++) { if (kp_keypad.key[i].kstate != PRESSED && kp_keypad.key[i].kstate != HOLD) continue; fn_mode += check_if_button_is_fn(kp_keypad.key[i].kchar); @@ -281,7 +288,7 @@ uint8_t get_fn_mode() void process_keypad(uint8_t fn_mode) { /* Process key press/release */ - for (int i = 0; i < LIST_MAX; i++) + for (int i = 0; i < MAX_PRESSED_KEYS; i++) { if (kp_keypad.key[i].kstate == PRESSED) { @@ -289,7 +296,7 @@ void process_keypad(uint8_t fn_mode) } else if (kp_keypad.key[i].kstate == RELEASED) { - update_button_status(uint8_t(kp_keypad.key[i].kchar), kp_keypad.key[i].stateChanged, RELEASED); + update_button_status(kp_keypad.key[i].kchar, kp_keypad.key[i].stateChanged, RELEASED); } } @@ -350,7 +357,7 @@ void loop() /* Scan keypad */ if (kp_keypad.getKeys()) { - check_bootloader_mode(); + check_if_to_enter_bootloader(); process_keypad(get_fn_mode()); }