diff --git a/smol_gkos.ino b/smol_gkos.ino index 1e129a2..262d64b 100644 --- a/smol_gkos.ino +++ b/smol_gkos.ino @@ -41,6 +41,7 @@ const int button_pins[10] = { const int debounce_time = 400; int button_timers[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +// TODO: differentiate between GKOS modifiers and keyboard modifiers somehow /* backspace, space (keep those two first since they overlap with the rest ) g, k, o, s, w, native @@ -56,6 +57,17 @@ const byte specials[22] = { 17, 51, 30, 10, 20, 12, 33, 34, 9, 36, 27, 54, 18, 45, 63, 31, 47, 55, 62, 43, 61, 59 }; +enum SpecialType { PrintCharacter, PressKey, ToggleModifier }; +const byte special_action_types[22] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 1 +}; +enum Modifier { Shift, SymbolShift, Keyset, Control, Alt }; +const int special_action_targets[22] = { + '-', '\\', '/', '\'', ',', '!', '?', '/', KEY_UP, KEY_DOWN, KEY_PAGE_UP, + KEY_PAGE_DOWN, Modifier::Shift, Modifier::SymbolShift, Modifier::Keyset, + KEY_ESC, Modifier::Control, Modifier::Alt, KEY_DELETE, KEY_INSERT, + KEY_TAB, KEY_ENTER +}; byte key_pressed = 0; byte key_pressed_total = 0; @@ -134,89 +146,21 @@ void key_released(byte key) { } if (is_special && !modifier_used) { - Serial.print("special "); - Serial.println(specials[special]); - // only register a special keypress when all keys have been released if (key_pressed != 0) return; - switch (special) { - case 0: // dash - Keyboard.print('-'); + switch (special_action_types[special]) { + case SpecialType::PrintCharacter: + Keyboard.print((char)special_action_targets[special]); return; - case 1: // backslash - Keyboard.print('\\'); + case SpecialType::PressKey: + Keyboard.press(special_action_targets[special]); + Keyboard.release(special_action_targets[special]); return; - case 2: // slash - Keyboard.print('/'); - return; - case 3: // apostrophe - Keyboard.print('\''); - return; - case 4: // comma - Keyboard.print(','); - return; - case 5: // exclamation point - Keyboard.print('!'); - return; - case 6: // question mark - Keyboard.print('?'); - return; - case 7: // period - Keyboard.print('.'); - return; - case 8: // up - Keyboard.press(KEY_UP); - Keyboard.release(KEY_UP); - return; - case 9: // down - Keyboard.press(KEY_DOWN); - Keyboard.release(KEY_DOWN); - return; - case 10: // page up - Keyboard.press(KEY_PAGE_UP); - Keyboard.release(KEY_PAGE_UP); - return; - case 11: // page down - Keyboard.press(KEY_PAGE_DOWN); - Keyboard.release(KEY_PAGE_DOWN); - return; - case 12: // shift + case SpecialType::ToggleModifier: // TODO return; - case 13: // symbol shift - // TODO - return; - case 14: // switch keyset - // TODO - return; - case 15: // escape - Keyboard.press(KEY_ESC); - Keyboard.release(KEY_ESC); - return; - case 16: // control - // TODO - return; - case 17: // alt - // TODO - return; - case 18: // delete - Keyboard.press(KEY_DELETE); - Keyboard.release(KEY_DELETE); - return; - case 19: // insert - Keyboard.press(KEY_INSERT); - Keyboard.release(KEY_INSERT); - return; - case 20: // tab - Keyboard.press(KEY_TAB); - Keyboard.release(KEY_TAB); - return; - case 21: // enter - Keyboard.press(KEY_ENTER); - Keyboard.release(KEY_ENTER); - return; } }