From ce4b765fea900b1fd60bc493ae262bf0235dabda Mon Sep 17 00:00:00 2001 From: cuu Date: Sat, 29 Oct 2022 20:38:46 +0800 Subject: [PATCH] add ctrl lock mode --- Code/devterm_keyboard_mini/devterm.h | 3 ++ .../devterm_keyboard_mini.ino | 31 ++++++++++++++++++- Code/devterm_keyboard_mini/keymaps.ino | 30 ++++++++++++++++-- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/Code/devterm_keyboard_mini/devterm.h b/Code/devterm_keyboard_mini/devterm.h index ab8e650..882506c 100644 --- a/Code/devterm_keyboard_mini/devterm.h +++ b/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; diff --git a/Code/devterm_keyboard_mini/devterm_keyboard_mini.ino b/Code/devterm_keyboard_mini/devterm_keyboard_mini.ino index d5c463e..a54c9d2 100644 --- a/Code/devterm_keyboard_mini/devterm_keyboard_mini.ino +++ b/Code/devterm_keyboard_mini/devterm_keyboard_mini.ino @@ -22,6 +22,7 @@ static const uint32_t LOOP_INTERVAL_MS = 0; static TickWaiter 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); diff --git a/Code/devterm_keyboard_mini/keymaps.ino b/Code/devterm_keyboard_mini/keymaps.ino index a8d54f8..ac024bf 100644 --- a/Code/devterm_keyboard_mini/keymaps.ino +++ b/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"); + } + } }