add ctrl lock mode

This commit is contained in:
cuu 2022-10-29 20:38:46 +08:00
parent a802c1ad3b
commit ce4b765fea
3 changed files with 60 additions and 4 deletions

View File

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

View File

@ -22,6 +22,7 @@ static const uint32_t LOOP_INTERVAL_MS = 0;
static TickWaiter<LOOP_INTERVAL_MS> waiter; static TickWaiter<LOOP_INTERVAL_MS> waiter;
HardwareTimer timer(1); HardwareTimer timer(1);
HardwareTimer ctrl_timer(4);
void setup() { void setup() {
USBComposite.setManufacturerString("ClockworkPI"); USBComposite.setManufacturerString("ClockworkPI");
@ -43,6 +44,9 @@ void setup() {
dev_term.Keyboard_state.shift = 0; dev_term.Keyboard_state.shift = 0;
dev_term.Keyboard_state.backlight = 0; dev_term.Keyboard_state.backlight = 0;
dev_term.Keyboard_state.lock = 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; dev_term._Serial = new USBCompositeSerial;
@ -55,13 +59,18 @@ void setup() {
keys_init(&dev_term); keys_init(&dev_term);
trackball_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 pinMode(PD2,INPUT);// switch 2 in back
timer.setPeriod(KEYBOARD_LED_PWM_PERIOD); timer.setPeriod(KEYBOARD_LED_PWM_PERIOD);
timer.resume(); timer.resume();
ctrl_timer.setPeriod(20*1000);
ctrl_timer.attachInterrupt(1,ctrl_timer_handler);
ctrl_timer.refresh();
ctrl_timer.resume();
pinMode(PA8,PWM); pinMode(PA8,PWM);
pwmWrite(PA8,0); pwmWrite(PA8,0);
@ -69,6 +78,26 @@ void setup() {
delay(1000); 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() { void loop() {
dev_term.delta = waiter.waitForNextTick(); dev_term.delta = waiter.waitForNextTick();
dev_term.state->tick(dev_term.delta); dev_term.state->tick(dev_term.delta);

View File

@ -304,7 +304,7 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
if(dv->Keyboard_state.fn_on > 0){ if(dv->Keyboard_state.fn_on > 0){
k = keys_maps[dv->Keyboard_state.fn_on][col]; k = keys_maps[dv->Keyboard_state.fn_on][col];
}else { }else {
k = keyboard_maps[dv->Keyboard_state.layer][col]; k = keys_maps[dv->Keyboard_state.layer][col];
} }
if(k == EMP){ if(k == EMP){
@ -483,9 +483,22 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
//_LEFT_CTRL_KEY,_CMD_KEY , _LEFT_ALT //_LEFT_CTRL_KEY,_CMD_KEY , _LEFT_ALT
case _LEFT_CTRL_KEY: 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 _CMD_KEY:
case _LEFT_ALT: case _LEFT_ALT:
case KEY_RIGHT_CTRL:
case KEY_RIGHT_ALT: case KEY_RIGHT_ALT:
if(mode == KEY_PRESSED){ if(mode == KEY_PRESSED){
dv->Keyboard->press(k); dv->Keyboard->press(k);
@ -505,4 +518,15 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
} }
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");
}
}
} }