fix keyboard fn bug

This commit is contained in:
cuu 2023-07-14 16:06:07 +12:00
parent 4f1b329202
commit 899a162b64

View File

@ -66,38 +66,43 @@ enum SKEYS {
/* /*
* keyboard_maps keyboard_maps
* M11 - M18 M11 - M18
* M21 - M28 M21 - M28
* M31 - M38 M31 - M38
* M41 - M48 M41 - M48
* M51 - M58 M51 - M58
* M61 - M68 M61 - M68
* M71 - M78 M71 - M78
* M81 - M88 M81 - M88
*/ */
const uint16_t keyboard_maps[][MATRIX_KEYS] = { const uint16_t keyboard_maps[][MATRIX_KEYS] = {
[DEF_LAYER] = { _SELECT_KEY,_START_KEY,_VOLUME_M,'`','[',']','-','=', \ [DEF_LAYER] = {
_SELECT_KEY, _START_KEY, _VOLUME_M, '`', '[', ']', '-', '=', \
'1', '2', '3', '4', '5', '6', '7', '8', \ '1', '2', '3', '4', '5', '6', '7', '8', \
'9', '0', KEY_ESC, KEY_TAB, KEY_UP_ARROW, KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_RIGHT_ARROW, \ '9', '0', KEY_ESC, KEY_TAB, KEY_UP_ARROW, KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_RIGHT_ARROW, \
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', \ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', \
'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', \ 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', \
'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', \ 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', \
'n', 'm', ',', '.', '/', '\\', ';', '\'', \ 'n', 'm', ',', '.', '/', '\\', ';', '\'', \
KEY_BACKSPACE,KEY_RETURN,KEY_RIGHT_ALT,KEY_RIGHT_CTRL,KEY_RIGHT_SHIFT,' ',EMP,EMP}, KEY_BACKSPACE, KEY_RETURN, KEY_RIGHT_ALT, KEY_RIGHT_CTRL, KEY_RIGHT_SHIFT, ' ', EMP, EMP
},
[FN_LAYER] = { _PRINT_KEY,_PAUSE_KEY,_VOLUME_P,'`','[',']',KEY_F11,KEY_F12, \ [FN_LAYER] = {
_PRINT_KEY, _PAUSE_KEY, _VOLUME_P, '`', '[', ']', KEY_F11, KEY_F12, \
KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, \ KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, \
KEY_F9, KEY_F10, KEY_ESC, KEY_CAPS_LOCK, _FN_KEY_UP_ARROW, _FN_KEY_DOWN_ARROW, _FN_KEY_LEFT_ARROW, _FN_KEY_RIGHT_ARROW, \ KEY_F9, KEY_F10, KEY_ESC, KEY_CAPS_LOCK, _FN_KEY_UP_ARROW, _FN_KEY_DOWN_ARROW, _FN_KEY_LEFT_ARROW, _FN_KEY_RIGHT_ARROW, \
'q', 'w', 'e', 'r', 't', 'y', 'u', KEY_INSERT, \ 'q', 'w', 'e', 'r', 't', 'y', 'u', KEY_INSERT, \
'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', \ 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', \
'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', \ 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', \
'n', 'm', _FN_BRIGHTNESS_DOWN, _FN_BRIGHTNESS_UP, '/', '\\', ';', '\'', \ 'n', 'm', _FN_BRIGHTNESS_DOWN, _FN_BRIGHTNESS_UP, '/', '\\', ';', '\'', \
KEY_DELETE,KEY_RETURN,KEY_RIGHT_ALT,KEY_RIGHT_CTRL,KEY_RIGHT_SHIFT,' ',EMP,EMP} KEY_DELETE, KEY_RETURN, KEY_RIGHT_ALT, KEY_RIGHT_CTRL, KEY_RIGHT_SHIFT, ' ', EMP, EMP
}
}; };
uint16_t keyboard_pick_map[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};
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}; 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};
@ -105,7 +110,9 @@ const uint16_t keys_maps[KEYS_NUM] = {_JOYSTICK_UP,_JOYSTICK_DOWN, _JOYSTICK_LEF
_JOYSTICK_RIGHT, _JOYSTICK_A, _JOYSTICK_B, \ _JOYSTICK_RIGHT, _JOYSTICK_A, _JOYSTICK_B, \
_JOYSTICK_X, _JOYSTICK_Y, _LEFT_SHIFT_KEY, _FN_KEY, \ _JOYSTICK_X, _JOYSTICK_Y, _LEFT_SHIFT_KEY, _FN_KEY, \
_LEFT_CTRL_KEY, _CMD_KEY , _LEFT_ALT, \ _LEFT_CTRL_KEY, _CMD_KEY , _LEFT_ALT, \
_MOUSE_LEFT,_MOUSE_MID,_MOUSE_RIGHT,_TRACKBALL_BTN}; _MOUSE_LEFT, _MOUSE_MID, _MOUSE_RIGHT, _TRACKBALL_BTN
};
uint8_t check_pd2() { // if swtich 2 in back is set to on(HIGH) uint8_t check_pd2() { // if swtich 2 in back is set to on(HIGH)
@ -127,6 +134,56 @@ void dt_kbd_restore_layer(DEVTERM*dv) {
dv->Keyboard_state.layer = dv->Keyboard_state.prev_layer; dv->Keyboard_state.layer = dv->Keyboard_state.prev_layer;
} }
void keyboard_release_core(DEVTERM*dv, uint16_t k) {
switch (k) {
case KEY_RIGHT_SHIFT:
dv->Keyboard->release(k);
break;
case KEY_CAPS_LOCK:
dv->Keyboard->setAdjustForHostCapsLock(false);
dv->Keyboard->release(k);
break;
case _SELECT_KEY:
if (check_pd2() == HIGH) {
k = ' ';
dv->Keyboard->release(k);
} else {
dv->Joystick->button(9, KEY_RELEASED);
}
break;
case _START_KEY:
if (check_pd2() == HIGH) {
k = KEY_RETURN;
dv->Keyboard->release(k);
} else {
dv->Joystick->button(10, KEY_RELEASED);
}
break;
case _FN_BRIGHTNESS_UP:
case _FN_BRIGHTNESS_DOWN:
case _VOLUME_P:
case _VOLUME_M:
dv->Consumer->release();
break;
default:
dv->Keyboard->release(k);
break;
}
}
void keyboard_release(DEVTERM*dv, uint8_t addr, uint16_t k) {
if ( keyboard_pick_map[addr] == 0) {
keyboard_release_core(dv, k);
} else {
keyboard_release_core(dv, keyboard_pick_map[addr]);
keyboard_pick_map[addr] = 0;
}
}
void keyboard_action(DEVTERM * dv, uint8_t row, uint8_t col, uint8_t mode) { void keyboard_action(DEVTERM * dv, uint8_t row, uint8_t col, uint8_t mode) {
@ -149,33 +206,32 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
if (mode == KEY_PRESSED) { if (mode == KEY_PRESSED) {
dv->Keyboard->press(k); dv->Keyboard->press(k);
} else { } else {
dv->Keyboard->release(k); keyboard_release(dv, addr, k);
} }
} break; } break;
case KEY_CAPS_LOCK: case KEY_CAPS_LOCK:
if (mode == KEY_PRESSED) { if (mode == KEY_PRESSED) {
dv->Keyboard->press(k); dv->Keyboard->press(k);
dv->Keyboard->setAdjustForHostCapsLock(true); dv->Keyboard->setAdjustForHostCapsLock(true);
} else if (mode == KEY_RELEASED) { } else if (mode == KEY_RELEASED) {
keyboard_release(dv, addr, k);
dv->Keyboard->setAdjustForHostCapsLock(false);
dv->Keyboard->release(k);
} }
break; break;
case _SELECT_KEY: case _SELECT_KEY:
if (check_pd2() == HIGH) { if (check_pd2() == HIGH) {
k = ' '; k = ' ';
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); keyboard_release(dv, addr, k);
} }
} else { } else {
if ( mode == KEY_PRESSED) {
dv->Joystick->button(9, mode); dv->Joystick->button(9, mode);
} else {
keyboard_release(dv, addr, k);
}
} }
break; break;
case _START_KEY: case _START_KEY:
@ -184,10 +240,14 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
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); keyboard_release(dv, addr, k);
} }
} else { } else {
if (mode == KEY_PRESSED) {
dv->Joystick->button(10, mode); dv->Joystick->button(10, mode);
} else {
keyboard_release(dv, addr, k);
}
} }
break; break;
@ -195,14 +255,14 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
if (mode == KEY_PRESSED) { if (mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::BRIGHTNESS_UP); dv->Consumer->press(HIDConsumer::BRIGHTNESS_UP);
} else { } else {
dv->Consumer->release(); keyboard_release(dv, addr, k);
} }
break; break;
case _FN_BRIGHTNESS_DOWN: case _FN_BRIGHTNESS_DOWN:
if (mode == KEY_PRESSED) { if (mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::BRIGHTNESS_DOWN); dv->Consumer->press(HIDConsumer::BRIGHTNESS_DOWN);
} else { } else {
dv->Consumer->release(); keyboard_release(dv, addr, k);
} }
break; break;
@ -210,14 +270,14 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
if (mode == KEY_PRESSED) { if (mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::VOLUME_UP); dv->Consumer->press(HIDConsumer::VOLUME_UP);
} else { } else {
dv->Consumer->release(); keyboard_release(dv, addr, k);
} }
} break; } break;
case _VOLUME_M: { case _VOLUME_M: {
if (mode == KEY_PRESSED) { if (mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::VOLUME_DOWN); dv->Consumer->press(HIDConsumer::VOLUME_DOWN);
} else { } else {
dv->Consumer->release(); keyboard_release(dv, addr, k);
} }
} break; } break;
@ -225,19 +285,12 @@ void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
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); keyboard_release(dv, addr, k);
if(dv->Keyboard_state.fn_on > 0){
fn_actions[addr] = 0;
}
} }
break; break;
} }
} }
void keypad_action(DEVTERM * dv, uint8_t col, uint8_t mode) { void keypad_action(DEVTERM * dv, uint8_t col, uint8_t mode) {
uint16_t k; uint16_t k;
@ -263,14 +316,6 @@ void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
} else if (mode == KEY_RELEASED ) { } else if (mode == KEY_RELEASED ) {
//release all pressed fn keys if they still been pressing //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; dv->Keyboard_state.fn_on = 0;
} }
break; break;