add more keys to lock

This commit is contained in:
cuu 2022-11-13 13:30:51 +08:00
parent 521c5f0441
commit 2204b6dfd4
3 changed files with 66 additions and 60 deletions

View File

@ -12,17 +12,27 @@ typedef struct key_debouncing{
}KEY_DEB; }KEY_DEB;
typedef struct keyboard_lock{
uint16_t lock;//
uint16_t time;//
uint16_t begin;//
}KEYBOARD_LOCK;
typedef struct keyboard_state{ 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;
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;// KEYBOARD_LOCK ctrl;
uint16_t ctrl_begin;// KEYBOARD_LOCK shift;
KEYBOARD_LOCK alt;
KEYBOARD_LOCK fn;
}KEYBOARD_STATE; }KEYBOARD_STATE;

View File

@ -41,12 +41,25 @@ 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.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.lock = 0;
dev_term.Keyboard_state.ctrl_begin = 0; dev_term.Keyboard_state.ctrl.time = 0;
dev_term.Keyboard_state.ctrl.begin = 0;
dev_term.Keyboard_state.shift.lock = 0;
dev_term.Keyboard_state.shift.time = 0;
dev_term.Keyboard_state.shift.begin = 0;
dev_term.Keyboard_state.alt.lock = 0;
dev_term.Keyboard_state.alt.time = 0;
dev_term.Keyboard_state.alt.begin = 0;
dev_term.Keyboard_state.fn.lock = 0;
dev_term.Keyboard_state.fn.time = 0;
dev_term.Keyboard_state.fn.begin = 0;
dev_term._Serial = new USBCompositeSerial; dev_term._Serial = new USBCompositeSerial;
@ -78,24 +91,34 @@ void setup() {
delay(1000); delay(1000);
} }
#define LOCK_TIME 50
//DO NOT USE dev_term._Serial->println(""); in timer interrupt function,will block //DO NOT USE dev_term._Serial->println(""); in timer interrupt function,will block
void check_keyboard_lock(KEYBOARD_LOCK*lock){
if( lock->begin >0) {
lock->time++;
if( lock->time>=LOCK_TIME && lock->time<200){
lock->lock = 1;
}
if( lock->time > 200){
dev_term.Keyboard->release(lock->begin);
lock->time = 0;
lock->lock = 0;
lock->begin = 0;
}
}
}
#define LOCK_TIME 50 #define LOCK_TIME 50
void ctrl_timer_handler(void) { void ctrl_timer_handler(void) {
if( dev_term.Keyboard_state.ctrl_begin >0) { check_keyboard_lock(&dev_term.Keyboard_state.ctrl);
dev_term.Keyboard_state.ctrl_time++; check_keyboard_lock(&dev_term.Keyboard_state.shift);
check_keyboard_lock(&dev_term.Keyboard_state.alt);
check_keyboard_lock(&dev_term.Keyboard_state.fn);
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() {

View File

@ -167,14 +167,6 @@ 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) {
@ -264,10 +256,7 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
case _FN_KEY: case _FN_KEY:
if(mode == KEY_PRESSED){ if(mode == KEY_PRESSED){
dv->Keyboard_state.fn_on = FN_LAYER; dv->Keyboard_state.fn_on = FN_LAYER;
//dv->_Serial->println("fn pressed");
}else if(mode == KEY_RELEASED ) { }else if(mode == KEY_RELEASED ) {
//release all pressed fn keys if they still been pressing
for(int i=0;i<64;i++) { for(int i=0;i<64;i++) {
if(fn_actions[i] !=0) { if(fn_actions[i] !=0) {
k = keyboard_maps[dv->Keyboard_state.fn_on][i]; k = keyboard_maps[dv->Keyboard_state.fn_on][i];
@ -317,29 +306,13 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
switch(k) { switch(k) {
case _LEFT_SHIFT_KEY: case _LEFT_SHIFT_KEY:
case KEY_RIGHT_SHIFT:
if(mode == KEY_PRESSED) { if(mode == KEY_PRESSED) {
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);
} }
break; break;
case _FN_KEY:
if(mode == KEY_PRESSED){
dv->Keyboard_state.fn_on = FN_LAYER;
}else if(mode == KEY_RELEASED ) {
//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;
case _JOYSTICK_UP: case _JOYSTICK_UP:
if(check_pd2() == HIGH) { if(check_pd2() == HIGH) {
@ -485,15 +458,15 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
case _LEFT_CTRL_KEY: case _LEFT_CTRL_KEY:
case KEY_RIGHT_CTRL: case KEY_RIGHT_CTRL:
if(mode == KEY_PRESSED){ if(mode == KEY_PRESSED){
if(dv->Keyboard_state.ctrl_lock == 0){ if(dv->Keyboard_state.ctrl.lock == 0){
dv->Keyboard->press(k); dv->Keyboard->press(k);
dv->Keyboard_state.ctrl_begin = k; dv->Keyboard_state.ctrl.begin = k;
} }
}else { }else {
if(dv->Keyboard_state.ctrl_lock == 0){ if(dv->Keyboard_state.ctrl.lock == 0){
dv->Keyboard->release(k); dv->Keyboard->release(k);
dv->Keyboard_state.ctrl_begin = 0; dv->Keyboard_state.ctrl.begin = 0;
dv->Keyboard_state.ctrl_time = 0; dv->Keyboard_state.ctrl.time = 0;
} }
} }
break; break;
@ -519,12 +492,12 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
} }
if(dv->Keyboard_state.ctrl_lock > 0 ) { if(dv->Keyboard_state.ctrl.lock > 0 ) {
if(mode == KEY_RELEASED && k != _LEFT_CTRL_KEY && k!= KEY_RIGHT_CTRL){ if(mode == KEY_RELEASED && k != _LEFT_CTRL_KEY && k!= KEY_RIGHT_CTRL){
dv->Keyboard_state.ctrl_lock = 0; dv->Keyboard_state.ctrl.lock = 0;
dv->Keyboard->release(dv->Keyboard_state.ctrl_begin); dv->Keyboard->release(dv->Keyboard_state.ctrl.begin);
dv->Keyboard_state.ctrl_begin = 0; dv->Keyboard_state.ctrl.begin = 0;
dv->Keyboard_state.ctrl_time = 0; dv->Keyboard_state.ctrl.time = 0;
//dv->_Serial->println("ctrl lock released"); //dv->_Serial->println("ctrl lock released");
} }
} }