diff --git a/Code/devterm_keyboard/keymaps.ino b/Code/devterm_keyboard/keymaps.ino index 7a1268d..1804488 100644 --- a/Code/devterm_keyboard/keymaps.ino +++ b/Code/devterm_keyboard/keymaps.ino @@ -5,32 +5,32 @@ #define EMP 0XFFFF /* -B1 joystick up -B2 joystick down -B3 joystick left -B4 joystick right + B1 joystick up + B2 joystick down + B3 joystick left + B4 joystick right -B5 joystick A -B6 joystick B -B7 joystick X -B8 joystick Y + B5 joystick A + B6 joystick B + B7 joystick X + B8 joystick Y -B9 left shift -B10 Fn -B11 left Ctrl -B12 Cmd -B13 left Alt -B14 mouse left -B15 mouse mid -B16 mouse right + B9 left shift + B10 Fn + B11 left Ctrl + B12 Cmd + B13 left Alt + B14 mouse left + B15 mouse mid + B16 mouse right */ #define _PRINT_KEY KEY_PRNT_SCRN #define _PAUSE_KEY KEY_PAUSE -#define _LEFT_SHIFT_KEY KEY_LEFT_SHIFT +#define _LEFT_SHIFT_KEY KEY_LEFT_SHIFT #define _LEFT_CTRL_KEY KEY_LEFT_CTRL -#define _CMD_KEY KEY_RIGHT_GUI -#define _LEFT_ALT KEY_LEFT_ALT +#define _CMD_KEY KEY_RIGHT_GUI +#define _LEFT_ALT KEY_LEFT_ALT #define _FN_KEY_UP_ARROW KEY_PAGE_UP #define _FN_KEY_DOWN_ARROW KEY_PAGE_DOWN @@ -38,12 +38,12 @@ B16 mouse right #define _FN_KEY_RIGHT_ARROW KEY_END enum SKEYS { - _SELECT_KEY =0xe8, //Joystick.button(n) + _SELECT_KEY = 0xe8, //Joystick.button(n) _START_KEY, //Joystick.button(n) _JOYSTICK_UP, //B1 //Joystick.Y() _JOYSTICK_DOWN, //Joystick.Y() _JOYSTICK_LEFT, //Joystick.X() - _JOYSTICK_RIGHT, //Joystick.X() + _JOYSTICK_RIGHT, //Joystick.X() _JOYSTICK_A, //Joystick.button(1) _JOYSTICK_B, //Joystick.button(2) _JOYSTICK_X, //Joystick.button(3) @@ -54,7 +54,7 @@ enum SKEYS { _MOUSE_RIGHT, // Mouse.press(3) _FN_BRIGHTNESS_UP, //USB Consumer brightness up https://github.com/torvalds/linux/blob/7fe10096c1508c7f033d34d0741809f8eecc1ed4/drivers/hid/hid-input.c#L903 - _FN_BRIGHTNESS_DOWN, //USB Consumer brightness down + _FN_BRIGHTNESS_DOWN, //USB Consumer brightness down _VOLUME_M, _VOLUME_P, @@ -66,56 +66,63 @@ enum SKEYS { /* - * keyboard_maps - * M11 - M18 - * M21 - M28 - * M31 - M38 - * M41 - M48 - * M51 - M58 - * M61 - M68 - * M71 - M78 - * M81 - M88 - */ + keyboard_maps + M11 - M18 + M21 - M28 + M31 - M38 + M41 - M48 + M51 - M58 + M61 - M68 + M71 - M78 + M81 - M88 +*/ const uint16_t keyboard_maps[][MATRIX_KEYS] = { - - [DEF_LAYER] = { _SELECT_KEY,_START_KEY,_VOLUME_M,'`','[',']','-','=', \ - '1','2','3','4','5','6','7','8',\ - '9','0',KEY_ESC,KEY_TAB,KEY_UP_ARROW,KEY_DOWN_ARROW,KEY_LEFT_ARROW,KEY_RIGHT_ARROW, \ - 'q','w','e','r','t','y','u','i', \ - 'o','p','a','s','d','f','g','h',\ - 'j','k','l','z','x','c','v','b', \ - 'n','m',',','.','/','\\',';','\'', \ - KEY_BACKSPACE,KEY_RETURN,KEY_RIGHT_ALT,KEY_RIGHT_CTRL,KEY_RIGHT_SHIFT,' ',EMP,EMP}, - - [FN_LAYER] = { _PRINT_KEY,_PAUSE_KEY,_VOLUME_P,'`','[',']',KEY_F11,KEY_F12, \ - KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,\ - KEY_F9,KEY_F10,KEY_ESC,KEY_CAPS_LOCK,_FN_KEY_UP_ARROW,_FN_KEY_DOWN_ARROW,_FN_KEY_LEFT_ARROW,_FN_KEY_RIGHT_ARROW, \ - 'q','w','e','r','t','y','u',KEY_INSERT, \ - 'o','p','a','s','d','f','g','h',\ - 'j','k','l','z','x','c','v','b', \ - 'n','m',_FN_BRIGHTNESS_DOWN,_FN_BRIGHTNESS_UP,'/','\\',';','\'', \ - KEY_DELETE,KEY_RETURN,KEY_RIGHT_ALT,KEY_RIGHT_CTRL,KEY_RIGHT_SHIFT,' ',EMP,EMP} - + + [DEF_LAYER] = { + _SELECT_KEY, _START_KEY, _VOLUME_M, '`', '[', ']', '-', '=', \ + '1', '2', '3', '4', '5', '6', '7', '8', \ + '9', '0', KEY_ESC, KEY_TAB, KEY_UP_ARROW, KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_RIGHT_ARROW, \ + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', \ + 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', \ + 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', \ + 'n', 'm', ',', '.', '/', '\\', ';', '\'', \ + KEY_BACKSPACE, KEY_RETURN, KEY_RIGHT_ALT, KEY_RIGHT_CTRL, KEY_RIGHT_SHIFT, ' ', EMP, EMP + }, + + [FN_LAYER] = { + _PRINT_KEY, _PAUSE_KEY, _VOLUME_P, '`', '[', ']', KEY_F11, KEY_F12, \ + KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, \ + KEY_F9, KEY_F10, KEY_ESC, KEY_CAPS_LOCK, _FN_KEY_UP_ARROW, _FN_KEY_DOWN_ARROW, _FN_KEY_LEFT_ARROW, _FN_KEY_RIGHT_ARROW, \ + 'q', 'w', 'e', 'r', 't', 'y', 'u', KEY_INSERT, \ + 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', \ + 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', \ + 'n', 'm', _FN_BRIGHTNESS_DOWN, _FN_BRIGHTNESS_UP, '/', '\\', ';', '\'', \ + KEY_DELETE, KEY_RETURN, KEY_RIGHT_ALT, KEY_RIGHT_CTRL, KEY_RIGHT_SHIFT, ' ', EMP, EMP + } + }; +uint16_t keyboard_pick_map[MATRIX_KEYS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static uint8_t fn_actions[MATRIX_KEYS]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +static uint8_t fn_actions[MATRIX_KEYS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -const uint16_t keys_maps[KEYS_NUM] = {_JOYSTICK_UP,_JOYSTICK_DOWN, _JOYSTICK_LEFT, \ - _JOYSTICK_RIGHT,_JOYSTICK_A,_JOYSTICK_B, \ - _JOYSTICK_X,_JOYSTICK_Y,_LEFT_SHIFT_KEY,_FN_KEY,\ - _LEFT_CTRL_KEY,_CMD_KEY , _LEFT_ALT, \ - _MOUSE_LEFT,_MOUSE_MID,_MOUSE_RIGHT,_TRACKBALL_BTN}; +const uint16_t keys_maps[KEYS_NUM] = {_JOYSTICK_UP, _JOYSTICK_DOWN, _JOYSTICK_LEFT, \ + _JOYSTICK_RIGHT, _JOYSTICK_A, _JOYSTICK_B, \ + _JOYSTICK_X, _JOYSTICK_Y, _LEFT_SHIFT_KEY, _FN_KEY, \ + _LEFT_CTRL_KEY, _CMD_KEY , _LEFT_ALT, \ + _MOUSE_LEFT, _MOUSE_MID, _MOUSE_RIGHT, _TRACKBALL_BTN + }; -uint8_t check_pd2(){ // if swtich 2 in back is set to on(HIGH) + +uint8_t check_pd2() { // if swtich 2 in back is set to on(HIGH) return digitalRead(PD2); } -void dt_kbd_set_layer(DEVTERM*dv,uint8_t new_layer) { - - if( dv->Keyboard_state.layer != new_layer) { +void dt_kbd_set_layer(DEVTERM*dv, uint8_t new_layer) { + + if ( dv->Keyboard_state.layer != new_layer) { dv->Keyboard_state.prev_layer = dv->Keyboard_state.layer; dv->Keyboard_state.layer = new_layer; @@ -123,318 +130,356 @@ void dt_kbd_set_layer(DEVTERM*dv,uint8_t new_layer) { } void dt_kbd_restore_layer(DEVTERM*dv) { - + dv->Keyboard_state.layer = dv->Keyboard_state.prev_layer; - + +} +void keyboard_release_core(DEVTERM*dv, uint16_t k) { + + switch (k) { + case KEY_RIGHT_SHIFT: + dv->Keyboard->release(k); + break; + + case KEY_CAPS_LOCK: + dv->Keyboard->setAdjustForHostCapsLock(false); + dv->Keyboard->release(k); + break; + + case _SELECT_KEY: + if (check_pd2() == HIGH) { + k = ' '; + dv->Keyboard->release(k); + } else { + dv->Joystick->button(9, KEY_RELEASED); + } + break; + case _START_KEY: + if (check_pd2() == HIGH) { + k = KEY_RETURN; + dv->Keyboard->release(k); + } else { + dv->Joystick->button(10, KEY_RELEASED); + } + break; + + case _FN_BRIGHTNESS_UP: + case _FN_BRIGHTNESS_DOWN: + case _VOLUME_P: + case _VOLUME_M: + dv->Consumer->release(); + break; + + default: + dv->Keyboard->release(k); + break; + } } -void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) { +void keyboard_release(DEVTERM*dv, uint8_t addr, uint16_t k) { + if ( keyboard_pick_map[addr] == 0) { + keyboard_release_core(dv, k); + } else { + keyboard_release_core(dv, keyboard_pick_map[addr]); + keyboard_pick_map[addr] = 0; + } +} + +void keyboard_action(DEVTERM * dv, uint8_t row, uint8_t col, uint8_t mode) { uint16_t k; uint8_t addr; - addr = row*MATRIX_COLS+col; - if(dv->Keyboard_state.fn_on > 0){ + addr = row * MATRIX_COLS + col; + if (dv->Keyboard_state.fn_on > 0) { k = keyboard_maps[dv->Keyboard_state.fn_on][addr]; fn_actions[addr] = 1; - }else { + } else { k = keyboard_maps[dv->Keyboard_state.layer][addr]; } - if(k == EMP){ + if (k == EMP) { return; } - switch(k) { - case KEY_RIGHT_SHIFT:{ - if(mode == KEY_PRESSED) { - dv->Keyboard->press(k); - }else { - dv->Keyboard->release(k); - } - }break; + switch (k) { + case KEY_RIGHT_SHIFT: { + if (mode == KEY_PRESSED) { + dv->Keyboard->press(k); + } else { + keyboard_release(dv, addr, k); + } + } break; case KEY_CAPS_LOCK: - if(mode == KEY_PRESSED) { - - dv->Keyboard->press(k); - dv->Keyboard->setAdjustForHostCapsLock(true); - }else if(mode == KEY_RELEASED) { - - dv->Keyboard->setAdjustForHostCapsLock(false); - dv->Keyboard->release(k); - } - - break; - - case _SELECT_KEY: - if(check_pd2() == HIGH) { - k = ' '; - if(mode == KEY_PRESSED) { - dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { - dv->Keyboard->release(k); - } - }else { - dv->Joystick->button(9,mode); - } - break; - case _START_KEY: - if(check_pd2() == HIGH) { - k = KEY_RETURN; - if(mode == KEY_PRESSED) { - dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { - dv->Keyboard->release(k); - } - }else { - dv->Joystick->button(10,mode); - } - break; - - case _FN_BRIGHTNESS_UP: - if(mode == KEY_PRESSED) { - dv->Consumer->press(HIDConsumer::BRIGHTNESS_UP); - }else { - dv->Consumer->release(); - } - break; - case _FN_BRIGHTNESS_DOWN: - if(mode == KEY_PRESSED) { - dv->Consumer->press(HIDConsumer::BRIGHTNESS_DOWN); - }else { - dv->Consumer->release(); - } - break; - - case _VOLUME_P:{ - if(mode == KEY_PRESSED) { - dv->Consumer->press(HIDConsumer::VOLUME_UP); - }else { - dv->Consumer->release(); - } - }break; - case _VOLUME_M:{ - if(mode == KEY_PRESSED) { - dv->Consumer->press(HIDConsumer::VOLUME_DOWN); - }else { - dv->Consumer->release(); - } - }break; - - default: - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { - dv->Keyboard->release(k); - - if(dv->Keyboard_state.fn_on > 0){ - fn_actions[addr] = 0; + dv->Keyboard->setAdjustForHostCapsLock(true); + } else if (mode == KEY_RELEASED) { + keyboard_release(dv, addr, k); + } + break; + case _SELECT_KEY: + if (check_pd2() == HIGH) { + k = ' '; + if (mode == KEY_PRESSED) { + dv->Keyboard->press(k); + } else if (mode == KEY_RELEASED) { + keyboard_release(dv, addr, k); + } + } else { + if ( mode == KEY_PRESSED) { + dv->Joystick->button(9, mode); + } else { + keyboard_release(dv, addr, k); } } - break; - } + break; + case _START_KEY: + if (check_pd2() == HIGH) { + k = KEY_RETURN; + if (mode == KEY_PRESSED) { + dv->Keyboard->press(k); + } else if (mode == KEY_RELEASED) { + keyboard_release(dv, addr, k); + } + } else { + if (mode == KEY_PRESSED) { + dv->Joystick->button(10, mode); + } else { + keyboard_release(dv, addr, k); + } + } + break; - + case _FN_BRIGHTNESS_UP: + if (mode == KEY_PRESSED) { + dv->Consumer->press(HIDConsumer::BRIGHTNESS_UP); + } else { + keyboard_release(dv, addr, k); + } + break; + case _FN_BRIGHTNESS_DOWN: + if (mode == KEY_PRESSED) { + dv->Consumer->press(HIDConsumer::BRIGHTNESS_DOWN); + } else { + keyboard_release(dv, addr, k); + } + break; + + case _VOLUME_P: { + if (mode == KEY_PRESSED) { + dv->Consumer->press(HIDConsumer::VOLUME_UP); + } else { + keyboard_release(dv, addr, k); + } + } break; + case _VOLUME_M: { + if (mode == KEY_PRESSED) { + dv->Consumer->press(HIDConsumer::VOLUME_DOWN); + } else { + keyboard_release(dv, addr, k); + } + } break; + + default: + if (mode == KEY_PRESSED) { + dv->Keyboard->press(k); + } else if (mode == KEY_RELEASED) { + keyboard_release(dv, addr, k); + } + break; + } } - -void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) { +void keypad_action(DEVTERM * dv, uint8_t col, uint8_t mode) { uint16_t k; - + k = keys_maps[col]; - - if(k == EMP){ + + if (k == EMP) { return; } - switch(k) { + switch (k) { case _LEFT_SHIFT_KEY: - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); } - break; + break; case _FN_KEY: - if(mode == KEY_PRESSED){ + if (mode == KEY_PRESSED) { dv->Keyboard_state.fn_on = FN_LAYER; - }else if(mode == KEY_RELEASED ) { + } else if (mode == KEY_RELEASED ) { //release all pressed fn keys if they still been pressing - for(int i=0;i<64;i++) { - if(fn_actions[i] !=0) { - k = keyboard_maps[dv->Keyboard_state.fn_on][i]; - dv->Keyboard->release(k); - fn_actions[i] = 0; - } - } - dv->Keyboard_state.fn_on = 0; } - break; - + break; + case _JOYSTICK_UP: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = KEY_UP_ARROW; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - if(mode == KEY_RELEASED){ + } + } else { + if (mode == KEY_RELEASED) { dv->Joystick->Y(511); - }else { + } else { dv->Joystick->Y(0); } } - break; + break; case _JOYSTICK_DOWN: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = KEY_DOWN_ARROW; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - if(mode == KEY_RELEASED){ + } + } else { + if (mode == KEY_RELEASED) { dv->Joystick->Y(511); - }else { + } else { dv->Joystick->Y(1023); } } - break; + break; case _JOYSTICK_LEFT: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = KEY_LEFT_ARROW; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - if(mode == KEY_RELEASED){ + } + } else { + if (mode == KEY_RELEASED) { dv->Joystick->X(511); - }else { + } else { dv->Joystick->X(0); } } - break; + break; case _JOYSTICK_RIGHT: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = KEY_RIGHT_ARROW; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - if(mode == KEY_RELEASED){ + } + } else { + if (mode == KEY_RELEASED) { dv->Joystick->X(511); - }else { + } else { dv->Joystick->X(1023); } } - break; + break; case _JOYSTICK_A: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = 'j'; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - dv->Joystick->button(2,mode); + } + } else { + dv->Joystick->button(2, mode); } - break; + break; case _JOYSTICK_B: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = 'k'; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - dv->Joystick->button(3,mode); + } + } else { + dv->Joystick->button(3, mode); } - break; + break; case _JOYSTICK_X: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = 'u'; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - dv->Joystick->button(1,mode); + } + } else { + dv->Joystick->button(1, mode); } - break; + break; case _JOYSTICK_Y: - if(check_pd2() == HIGH) { + if (check_pd2() == HIGH) { k = 'i'; - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else if(mode == KEY_RELEASED) { + } else if (mode == KEY_RELEASED) { dv->Keyboard->release(k); - } - }else { - dv->Joystick->button(4,mode); + } + } else { + dv->Joystick->button(4, mode); } - break; + break; case _MOUSE_LEFT: - if(mode == KEY_PRESSED){ + if (mode == KEY_PRESSED) { dv->Mouse->press(1); - }else if(mode == KEY_RELEASED){ + } else if (mode == KEY_RELEASED) { dv->Mouse->release(1); } - break; + break; case _MOUSE_MID: - if(mode == KEY_PRESSED) { + if (mode == KEY_PRESSED) { dv->state->pressMiddleClick(); - }else { - if(dv->state->getScrolled() == false){ + } else { + if (dv->state->getScrolled() == false) { //if no scrolling happend ,do as a normal mid mouse key click dv->Mouse->click(MOUSE_MIDDLE); } dv->state->releaseMiddleClick(); - + } - break; + break; case _MOUSE_RIGHT: - if(mode == KEY_PRESSED){ + if (mode == KEY_PRESSED) { dv->Mouse->press(2); - }else if(mode == KEY_RELEASED){ + } else if (mode == KEY_RELEASED) { dv->Mouse->release(2); } - break; - - //_LEFT_CTRL_KEY,_CMD_KEY , _LEFT_ALT + break; + + //_LEFT_CTRL_KEY,_CMD_KEY , _LEFT_ALT case _LEFT_CTRL_KEY: case _CMD_KEY: case _LEFT_ALT: - if(mode == KEY_PRESSED){ + if (mode == KEY_PRESSED) { dv->Keyboard->press(k); - }else { + } else { dv->Keyboard->release(k); } - break; + break; case _TRACKBALL_BTN: - if(mode == KEY_PRESSED){ + if (mode == KEY_PRESSED) { dv->Mouse->press(1); - }else if(mode == KEY_RELEASED){ + } else if (mode == KEY_RELEASED) { dv->Mouse->release(1); } - break; - default:break; - + break; + default: break; + } - + }