Browse Source

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
cuu 3 years ago
parent
commit
e82cde880e

+ 2 - 1
Code/devterm_keyboard/devterm.h

@@ -1,7 +1,7 @@
 #ifndef DEVTERM_H
 #define DEVTERM_H
 
-#define KEY_LATENCY  140
+#define KEY_LATENCY  1400
 
 #include <USBComposite.h>
 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;
 

+ 2 - 1
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() {

+ 2 - 0
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

+ 3 - 1
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;

+ 35 - 32
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;
     

+ 3 - 1
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;