bug fix,increase delay in matrix/keys scan process

fn+arrow keys to be page up/dn, home end

bottom mouse middle key fixed

shift caps lock bug fix
now there are only two layers in keyboard
remove bug code,layers, use USBComposite_stm32f1's modifiers and setAdjustForHostCapsLock  to do shift / caps lock job
This commit is contained in:
cuu 2021-05-18 20:59:30 +08:00
parent ccc90142a6
commit e82cde880e
6 changed files with 47 additions and 36 deletions

View File

@ -1,7 +1,7 @@
#ifndef DEVTERM_H #ifndef DEVTERM_H
#define DEVTERM_H #define DEVTERM_H
#define KEY_LATENCY 140 #define KEY_LATENCY 1400
#include <USBComposite.h> #include <USBComposite.h>
typedef struct key_debouncing{ typedef struct key_debouncing{
@ -16,6 +16,7 @@ typedef struct keyboard_state{
uint8_t layer; uint8_t layer;
uint8_t prev_layer; uint8_t prev_layer;
uint8_t fn_on; uint8_t fn_on;
uint8_t shift;
}KEYBOARD_STATE; }KEYBOARD_STATE;

View File

@ -34,6 +34,7 @@ void setup() {
dev_term.Keyboard_state.layer = 0; dev_term.Keyboard_state.layer = 0;
dev_term.Keyboard_state.prev_layer = 0; dev_term.Keyboard_state.prev_layer = 0;
dev_term.Keyboard_state.fn_on = 0; dev_term.Keyboard_state.fn_on = 0;
dev_term.Keyboard_state.shift = 0;
dev_term._Serial = new USBCompositeSerial; dev_term._Serial = new USBCompositeSerial;
@ -48,7 +49,7 @@ void setup() {
dev_term._Serial->println("setup done"); dev_term._Serial->println("setup done");
//delay(3000); delay(1000);
} }
void loop() { void loop() {

View File

@ -17,6 +17,8 @@
#define MATRIX_ROWS 8 #define MATRIX_ROWS 8
#define MATRIX_COLS 8 #define MATRIX_COLS 8
#define MATRIX_KEYS 64 // 8*8
#ifndef DEBOUNCE #ifndef DEBOUNCE
# define DEBOUNCE 5 # define DEBOUNCE 5
#endif #endif

View File

@ -59,7 +59,7 @@ uint8_t matrix_scan(void) {
digitalWrite(matrix_cols[col],HIGH); digitalWrite(matrix_cols[col],HIGH);
delayMicroseconds(20); delayMicroseconds(30);
data =( data =(
( read_io(matrix_rows[0]) << 0 ) | ( read_io(matrix_rows[0]) << 0 ) |
@ -89,6 +89,8 @@ uint8_t matrix_scan(void) {
} }
} }
keyboard_debouncing.deing = false; keyboard_debouncing.deing = false;
}else{
delay(1);
} }
return 1; return 1;

View File

@ -33,6 +33,11 @@ B16 mouse right
#define _CMD_KEY KEY_RIGHT_GUI #define _CMD_KEY KEY_RIGHT_GUI
#define _LEFT_ALT KEY_LEFT_ALT #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 { enum SKEYS {
_SELECT_KEY =0xe8, //Joystick.button(n) _SELECT_KEY =0xe8, //Joystick.button(n)
_START_KEY, //Joystick.button(n) _START_KEY, //Joystick.button(n)
@ -48,10 +53,7 @@ enum SKEYS {
_MOUSE_LEFT, // Mouse.press(1) _MOUSE_LEFT, // Mouse.press(1)
_MOUSE_MID, // Mouse.press(2) _MOUSE_MID, // Mouse.press(2)
_MOUSE_RIGHT, // Mouse.press(3) _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_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
@ -72,7 +74,7 @@ enum SKEYS {
* M71 - M78 * M71 - M78
* M81 - M88 * 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,'`','[',']','-','=', \ [DEF_LAYER] = { _SELECT_KEY,_START_KEY,_VOLUME_M,'`','[',']','-','=', \
'1','2','3','4','5','6','7','8',\ '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,'/','\\',';','\'', \ 'n','m',_FN_BRIGHTNESS_DOWN,_FN_BRIGHTNESS_UP,'/','\\',';','\'', \
KEY_DELETE,KEY_RETURN,KEY_RIGHT_ALT,KEY_RIGHT_CTRL,KEY_RIGHT_SHIFT,' ',EMP,EMP} 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, \ const uint16_t keys_maps[KEYS_NUM] = {_JOYSTICK_UP,_JOYSTICK_DOWN, _JOYSTICK_LEFT, \
_JOYSTICK_RIGHT,_JOYSTICK_A,_JOYSTICK_B, \ _JOYSTICK_RIGHT,_JOYSTICK_A,_JOYSTICK_B, \
_JOYSTICK_X,_JOYSTICK_Y,_LEFT_SHIFT_KEY,_FN_KEY,\ _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) { void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
uint16_t k; uint16_t k;
uint8_t addr;
addr = row*MATRIX_COLS+col;
if(dv->Keyboard_state.fn_on > 0){ 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 { }else {
k = keyboard_maps[dv->Keyboard_state.layer][row][col]; k = keyboard_maps[dv->Keyboard_state.layer][addr];
} }
if(k == EMP){ if(k == EMP){
@ -134,6 +139,13 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
} }
switch(k) { switch(k) {
case KEY_RIGHT_SHIFT:{
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else {
dv->Keyboard->release(k);
}
}break;
case KEY_CAPS_LOCK: case KEY_CAPS_LOCK:
if(mode == KEY_PRESSED) { 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); dv->Joystick->button(10,mode);
break; 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: case _FN_BRIGHTNESS_UP:
if(mode == KEY_PRESSED) { if(mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::BRIGHTNESS_UP); 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); dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) { }else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k); dv->Keyboard->release(k);
if(dv->Keyboard_state.fn_on > 0){
fn_actions[addr] = 0;
}
} }
break; break;
} }
@ -227,8 +222,16 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
dv->Keyboard_state.fn_on = FN_LAYER; dv->Keyboard_state.fn_on = FN_LAYER;
}else if(mode == KEY_RELEASED ) { }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; break;

View File

@ -25,7 +25,7 @@ uint8_t scan_keys(){
uint8_t s; uint8_t s;
data = 0; data = 0;
delayMicroseconds(20); delayMicroseconds(30);
for(int i = 0;i < KEYS_NUM;i++) { for(int i = 0;i < KEYS_NUM;i++) {
s = digitalRead(keys_io[i]); //HIGH =0,LOW = 1 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 )) { if (keypad_debouncing.deing == true && ( (millis() - keypad_debouncing.de_time) > KEY_DEBOUNCE )) {
keys = keys_debouncing; keys = keys_debouncing;
keypad_debouncing.deing = false; keypad_debouncing.deing = false;
}else {
delay(1);
} }
return 1; return 1;