Browse Source

add ctrl lock mode

cuu 1 year ago
parent
commit
ce4b765fea

+ 3 - 0
Code/devterm_keyboard_mini/devterm.h

@@ -20,6 +20,9 @@ typedef struct keyboard_state{
   uint8_t shift;
   uint8_t backlight;//0 1 2 3
   uint8_t lock;//0 1
+  uint16_t ctrl_lock;//
+  uint16_t ctrl_time;//
+  uint16_t ctrl_begin;//
   
 }KEYBOARD_STATE;
 

+ 30 - 1
Code/devterm_keyboard_mini/devterm_keyboard_mini.ino

@@ -22,6 +22,7 @@ static const uint32_t LOOP_INTERVAL_MS = 0;
 static TickWaiter<LOOP_INTERVAL_MS> waiter;
 
 HardwareTimer timer(1);
+HardwareTimer ctrl_timer(4);
 
 void setup() {
   USBComposite.setManufacturerString("ClockworkPI");
@@ -43,6 +44,9 @@ void setup() {
   dev_term.Keyboard_state.shift = 0;
   dev_term.Keyboard_state.backlight = 0;
   dev_term.Keyboard_state.lock = 0;
+  dev_term.Keyboard_state.ctrl_lock = 0;
+  dev_term.Keyboard_state.ctrl_time = 0;
+  dev_term.Keyboard_state.ctrl_begin = 0;
   
   dev_term._Serial = new  USBCompositeSerial;
   
@@ -55,12 +59,17 @@ void setup() {
   keys_init(&dev_term);
   trackball_init(&dev_term);
   
-  dev_term._Serial->println("setup done");
+  //dev_term._Serial->println("setup done");
 
   pinMode(PD2,INPUT);// switch 2 in back 
 
   timer.setPeriod(KEYBOARD_LED_PWM_PERIOD);
   timer.resume();
+
+  ctrl_timer.setPeriod(20*1000);
+  ctrl_timer.attachInterrupt(1,ctrl_timer_handler);
+  ctrl_timer.refresh();
+  ctrl_timer.resume();
   
   pinMode(PA8,PWM);
   pwmWrite(PA8,0);
@@ -69,6 +78,26 @@ void setup() {
   delay(1000);
 }
 
+//DO NOT USE dev_term._Serial->println(""); in timer interrupt function,will block 
+#define LOCK_TIME 50
+void ctrl_timer_handler(void) {
+  
+  if( dev_term.Keyboard_state.ctrl_begin >0) {
+    dev_term.Keyboard_state.ctrl_time++;
+
+    if(dev_term.Keyboard_state.ctrl_time>=LOCK_TIME && dev_term.Keyboard_state.ctrl_time<200){
+      dev_term.Keyboard_state.ctrl_lock = 1;
+    }
+    
+    if(dev_term.Keyboard_state.ctrl_time > 200){
+      dev_term.Keyboard->release(dev_term.Keyboard_state.ctrl_begin);
+      dev_term.Keyboard_state.ctrl_time = 0;
+      dev_term.Keyboard_state.ctrl_lock = 0;
+      dev_term.Keyboard_state.ctrl_begin = 0;
+    }
+  }
+}
+
 void loop() {
   dev_term.delta = waiter.waitForNextTick();
   dev_term.state->tick(dev_term.delta);

+ 27 - 3
Code/devterm_keyboard_mini/keymaps.ino

@@ -304,7 +304,7 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
   if(dv->Keyboard_state.fn_on > 0){
     k = keys_maps[dv->Keyboard_state.fn_on][col];
   }else {
-    k = keyboard_maps[dv->Keyboard_state.layer][col];
+    k = keys_maps[dv->Keyboard_state.layer][col];
   }
   
   if(k == EMP){
@@ -314,7 +314,7 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
   if(dv->Keyboard_state.lock == 1) {
     return;
   }
-  
+
   switch(k) {
     case _LEFT_SHIFT_KEY:
       if(mode == KEY_PRESSED) {
@@ -483,9 +483,22 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
     
     //_LEFT_CTRL_KEY,_CMD_KEY , _LEFT_ALT    
     case _LEFT_CTRL_KEY:
+    case KEY_RIGHT_CTRL:
+      if(mode == KEY_PRESSED){
+        if(dv->Keyboard_state.ctrl_lock == 0){
+          dv->Keyboard->press(k);
+          dv->Keyboard_state.ctrl_begin = k;
+        }
+      }else {
+        if(dv->Keyboard_state.ctrl_lock == 0){
+          dv->Keyboard->release(k);
+          dv->Keyboard_state.ctrl_begin = 0;
+          dv->Keyboard_state.ctrl_time = 0;
+        }
+      }
+    break;
     case _CMD_KEY:
     case _LEFT_ALT:
-    case KEY_RIGHT_CTRL:
     case KEY_RIGHT_ALT:
       if(mode == KEY_PRESSED){
         dv->Keyboard->press(k);
@@ -504,5 +517,16 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
     default:break;
     
   }
+
+
+  if(dv->Keyboard_state.ctrl_lock > 0 ) {
+    if(mode == KEY_RELEASED && k != _LEFT_CTRL_KEY && k!= KEY_RIGHT_CTRL){
+      dv->Keyboard_state.ctrl_lock = 0;
+      dv->Keyboard->release(dv->Keyboard_state.ctrl_begin);
+      dv->Keyboard_state.ctrl_begin = 0;
+      dv->Keyboard_state.ctrl_time = 0;
+      //dv->_Serial->println("ctrl lock released");
+    }
+  }
   
 }