diff --git a/Code/devterm_keyboard/devterm.h b/Code/devterm_keyboard/devterm.h index c4b1598..84a3f6b 100644 --- a/Code/devterm_keyboard/devterm.h +++ b/Code/devterm_keyboard/devterm.h @@ -1,7 +1,7 @@ #ifndef DEVTERM_H #define DEVTERM_H -#define KEY_LATENCY 140 +#define KEY_LATENCY 1400 #include typedef struct key_debouncing{ @@ -16,6 +16,7 @@ typedef struct keyboard_state{ uint8_t layer; uint8_t prev_layer; uint8_t fn_on; + uint8_t shift; }KEYBOARD_STATE; diff --git a/Code/devterm_keyboard/devterm_keyboard.ino b/Code/devterm_keyboard/devterm_keyboard.ino index 8195193..5aa593b 100644 --- a/Code/devterm_keyboard/devterm_keyboard.ino +++ b/Code/devterm_keyboard/devterm_keyboard.ino @@ -34,6 +34,7 @@ void setup() { dev_term.Keyboard_state.layer = 0; dev_term.Keyboard_state.prev_layer = 0; dev_term.Keyboard_state.fn_on = 0; + dev_term.Keyboard_state.shift = 0; dev_term._Serial = new USBCompositeSerial; @@ -48,7 +49,7 @@ void setup() { dev_term._Serial->println("setup done"); - //delay(3000); + delay(1000); } void loop() { diff --git a/Code/devterm_keyboard/keyboard.h b/Code/devterm_keyboard/keyboard.h index 69dd55a..6c24984 100644 --- a/Code/devterm_keyboard/keyboard.h +++ b/Code/devterm_keyboard/keyboard.h @@ -17,6 +17,8 @@ #define MATRIX_ROWS 8 #define MATRIX_COLS 8 +#define MATRIX_KEYS 64 // 8*8 + #ifndef DEBOUNCE # define DEBOUNCE 5 #endif diff --git a/Code/devterm_keyboard/keyboard.ino b/Code/devterm_keyboard/keyboard.ino index 50fd73c..2470512 100644 --- a/Code/devterm_keyboard/keyboard.ino +++ b/Code/devterm_keyboard/keyboard.ino @@ -59,7 +59,7 @@ uint8_t matrix_scan(void) { digitalWrite(matrix_cols[col],HIGH); - delayMicroseconds(20); + delayMicroseconds(30); data =( ( read_io(matrix_rows[0]) << 0 ) | @@ -89,6 +89,8 @@ uint8_t matrix_scan(void) { } } keyboard_debouncing.deing = false; + }else{ + delay(1); } return 1; diff --git a/Code/devterm_keyboard/keymaps.ino b/Code/devterm_keyboard/keymaps.ino index a7ae52e..5cc15ca 100644 --- a/Code/devterm_keyboard/keymaps.ino +++ b/Code/devterm_keyboard/keymaps.ino @@ -33,6 +33,11 @@ B16 mouse right #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 +#define _FN_KEY_LEFT_ARROW KEY_HOME +#define _FN_KEY_RIGHT_ARROW KEY_END + enum SKEYS { _SELECT_KEY =0xe8, //Joystick.button(n) _START_KEY, //Joystick.button(n) @@ -48,10 +53,7 @@ enum SKEYS { _MOUSE_LEFT, // Mouse.press(1) _MOUSE_MID, // Mouse.press(2) _MOUSE_RIGHT, // Mouse.press(3) - _FN_KEY_UP_ARROW, // Simulate Mouse.move - _FN_KEY_DOWN_ARROW, //Mouse.move - _FN_KEY_LEFT_ARROW, //Mouse.move - _FN_KEY_RIGHT_ARROW, //Mouse.move + _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 @@ -72,7 +74,7 @@ enum SKEYS { * M71 - M78 * M81 - M88 */ -const uint16_t keyboard_maps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint16_t keyboard_maps[][MATRIX_KEYS] = { [DEF_LAYER] = { _SELECT_KEY,_START_KEY,_VOLUME_M,'`','[',']','-','=', \ '1','2','3','4','5','6','7','8',\ @@ -92,10 +94,11 @@ const uint16_t keyboard_maps[][MATRIX_ROWS][MATRIX_COLS] = { 'n','m',_FN_BRIGHTNESS_DOWN,_FN_BRIGHTNESS_UP,'/','\\',';','\'', \ KEY_DELETE,KEY_RETURN,KEY_RIGHT_ALT,KEY_RIGHT_CTRL,KEY_RIGHT_SHIFT,' ',EMP,EMP} - - }; + +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,\ @@ -122,11 +125,13 @@ void dt_kbd_restore_layer(DEVTERM*dv) { 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){ - k = keyboard_maps[dv->Keyboard_state.fn_on][row][col]; + k = keyboard_maps[dv->Keyboard_state.fn_on][addr]; + fn_actions[addr] = 1; }else { - k = keyboard_maps[dv->Keyboard_state.layer][row][col]; + k = keyboard_maps[dv->Keyboard_state.layer][addr]; } if(k == EMP){ @@ -134,6 +139,13 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) { } switch(k) { + case KEY_RIGHT_SHIFT:{ + if(mode == KEY_PRESSED) { + dv->Keyboard->press(k); + }else { + dv->Keyboard->release(k); + } + }break; case KEY_CAPS_LOCK: if(mode == KEY_PRESSED) { @@ -155,27 +167,6 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) { dv->Joystick->button(10,mode); break; - case _FN_KEY_UP_ARROW: - if(mode == KEY_PRESSED) { - dv->Mouse->move(0,-5,0); - } - break; - case _FN_KEY_DOWN_ARROW: - if(mode == KEY_PRESSED) { - dv->Mouse->move(0,5,0); - } - break; - case _FN_KEY_LEFT_ARROW: - if(mode == KEY_PRESSED) { - dv->Mouse->move(-5,0,0); - } - break; - case _FN_KEY_RIGHT_ARROW: - if(mode == KEY_PRESSED) { - dv->Mouse->move(5,0,0); - } - break; - case _FN_BRIGHTNESS_UP: if(mode == KEY_PRESSED) { dv->Consumer->press(HIDConsumer::BRIGHTNESS_UP); @@ -196,6 +187,10 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) { dv->Keyboard->press(k); }else if(mode == KEY_RELEASED) { dv->Keyboard->release(k); + + if(dv->Keyboard_state.fn_on > 0){ + fn_actions[addr] = 0; + } } break; } @@ -227,8 +222,16 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) { dv->Keyboard_state.fn_on = FN_LAYER; }else if(mode == KEY_RELEASED ) { - dv->Keyboard_state.fn_on = 0; + //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; diff --git a/Code/devterm_keyboard/keys.ino b/Code/devterm_keyboard/keys.ino index 50d2b57..c36bc35 100644 --- a/Code/devterm_keyboard/keys.ino +++ b/Code/devterm_keyboard/keys.ino @@ -25,7 +25,7 @@ uint8_t scan_keys(){ uint8_t s; data = 0; - delayMicroseconds(20); + delayMicroseconds(30); for(int i = 0;i < KEYS_NUM;i++) { s = digitalRead(keys_io[i]); //HIGH =0,LOW = 1 @@ -47,6 +47,8 @@ uint8_t scan_keys(){ if (keypad_debouncing.deing == true && ( (millis() - keypad_debouncing.de_time) > KEY_DEBOUNCE )) { keys = keys_debouncing; keypad_debouncing.deing = false; + }else { + delay(1); } return 1;