496 lines
12 KiB
C++

#include "devterm.h"
#include "keyboard.h"
#include "keys.h"
#define EMP 0XFFFF
/*
B1 joystick up
B2 joystick down
B3 joystick left
B4 joystick right
B5 joystick A
B6 joystick B
B7 joystick X
B8 joystick Y
B9 left shift
B10 Fn
B11 left Ctrl
B12 Cmd
B13 left Alt
B14 mouse left
B15 mouse mid
B16 mouse right
*/
#define _PRINT_KEY KEY_PRNT_SCRN
#define _PAUSE_KEY KEY_PAUSE
#define _LEFT_SHIFT_KEY KEY_LEFT_SHIFT
#define _LEFT_CTRL_KEY KEY_LEFT_CTRL
#define _CMD_KEY KEY_RIGHT_GUI
#define _LEFT_ALT KEY_LEFT_ALT
#define _FN_KEY_UP_ARROW KEY_PAGE_UP
#define _FN_KEY_DOWN_ARROW KEY_PAGE_DOWN
#define _FN_KEY_LEFT_ARROW KEY_HOME
#define _FN_KEY_RIGHT_ARROW KEY_END
enum SKEYS {
_SELECT_KEY =0xe8, //Joystick.button(n)
_START_KEY, //Joystick.button(n)
_JOYSTICK_UP, //B1 //Joystick.Y()
_JOYSTICK_DOWN, //Joystick.Y()
_JOYSTICK_LEFT, //Joystick.X()
_JOYSTICK_RIGHT, //Joystick.X()
_JOYSTICK_A, //Joystick.button(1)
_JOYSTICK_B, //Joystick.button(2)
_JOYSTICK_X, //Joystick.button(3)
_JOYSTICK_Y, //Joystick.button(4)
_JOYSTICK_L,
_JOYSTICK_R,
_FN_KEY,
_MOUSE_LEFT, // Mouse.press(1)
_MOUSE_MID, // Mouse.press(2)
_MOUSE_RIGHT, // Mouse.press(3)
_FN_BRIGHTNESS_UP, //USB Consumer brightness up https://github.com/torvalds/linux/blob/7fe10096c1508c7f033d34d0741809f8eecc1ed4/drivers/hid/hid-input.c#L903
_FN_BRIGHTNESS_DOWN, //USB Consumer brightness down
_VOLUME_M,
_VOLUME_P,
_VOLUME_MUTE, //https://github.com/torvalds/linux/blob/7fe10096c1508c7f033d34d0741809f8eecc1ed4/drivers/hid/hid-input.c#L956
_TRACKBALL_BTN,
_FN_LOCK_KEYBOARD,
_FN_LIGHT_KEYBOARD,
};
#define DEF_LAYER 0x00
#define FN_LAYER 0x01
/*
* keyboard_maps
* M11 - M18
* M21 - M28
* M31 - M38
* M41 - M48
* M51 - M58
* M61 - M68
* M71 - M78
* M81 - M88
*/
const uint16_t keyboard_maps[][MATRIX_KEYS] = {
[DEF_LAYER] = { _SELECT_KEY,_START_KEY,_VOLUME_M,'`','[',']','-','=', \
'1','2','3','4','5','6','7','8',\
'9','0',KEY_ESC,KEY_TAB,EMP,EMP,EMP,EMP, \
'q','w','e','r','t','y','u','i', \
'o','p','a','s','d','f','g','h',\
'j','k','l','z','x','c','v','b', \
'n','m',',','.','/','\\',';','\'', \
KEY_RETURN,KEY_BACKSPACE,_FN_KEY,_FN_KEY,' ',EMP,EMP,EMP},
[FN_LAYER] = { _PRINT_KEY,_PAUSE_KEY,_VOLUME_MUTE,'`','[',']',KEY_F11,KEY_F12, \
KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,\
KEY_F9,KEY_F10,_FN_LOCK_KEYBOARD,KEY_CAPS_LOCK,EMP,EMP,EMP,EMP, \
'q','w','e','r','t','y',KEY_PAGE_UP,KEY_INSERT, \
'o','p','a','s','d','f','g',KEY_HOME,\
KEY_END,KEY_PAGE_DOWN,'l','z','x','c','v','b', \
'n','m',_FN_BRIGHTNESS_DOWN,_FN_BRIGHTNESS_UP,'/','\\',';','\'', \
KEY_RETURN,KEY_DELETE,_FN_KEY,_FN_KEY,_FN_LIGHT_KEYBOARD,EMP,EMP,EMP}
};
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};
const uint16_t keys_maps[][KEYS_NUM] = {
[DEF_LAYER] = {_JOYSTICK_UP,_JOYSTICK_DOWN, _JOYSTICK_LEFT, _JOYSTICK_RIGHT, \
_JOYSTICK_A,_JOYSTICK_B, _JOYSTICK_X,_JOYSTICK_Y, \
_LEFT_SHIFT_KEY,KEY_RIGHT_SHIFT,_LEFT_CTRL_KEY, KEY_RIGHT_CTRL, \
_LEFT_ALT, _MOUSE_LEFT, KEY_RIGHT_ALT,_MOUSE_RIGHT, \
_TRACKBALL_BTN },
[FN_LAYER] = {_JOYSTICK_UP,_JOYSTICK_DOWN, _JOYSTICK_LEFT, _JOYSTICK_RIGHT, \
_JOYSTICK_A,_JOYSTICK_B, _JOYSTICK_X,_JOYSTICK_Y, \
_LEFT_SHIFT_KEY,KEY_RIGHT_SHIFT,_LEFT_CTRL_KEY, KEY_RIGHT_CTRL, \
_CMD_KEY, _MOUSE_LEFT, KEY_RIGHT_ALT,_MOUSE_RIGHT, \
_TRACKBALL_BTN },
};
const uint16_t backlight[4] = {0,32,500,2000};
uint8_t check_pd2(){ // if swtich 2 in back is set to on(HIGH)
return digitalRead(PD2);
}
void dt_kbd_set_layer(DEVTERM*dv,uint8_t new_layer) {
if( dv->Keyboard_state.layer != new_layer) {
dv->Keyboard_state.prev_layer = dv->Keyboard_state.layer;
dv->Keyboard_state.layer = new_layer;
}
}
void dt_kbd_restore_layer(DEVTERM*dv) {
dv->Keyboard_state.layer = dv->Keyboard_state.prev_layer;
}
void keyboard_action(DEVTERM*dv,uint8_t row,uint8_t col,uint8_t mode) {
uint16_t k;
uint8_t addr;
addr = row*MATRIX_COLS+col;
if(dv->Keyboard_state.fn_on > 0){
k = keyboard_maps[dv->Keyboard_state.fn_on][addr];
fn_actions[addr] = 1;
}else {
k = keyboard_maps[dv->Keyboard_state.layer][addr];
}
if(k == EMP){
return;
}
if(k != _FN_KEY && k != _FN_LOCK_KEYBOARD && dv->Keyboard_state.lock == 1) {
return;
}
switch(k) {
case KEY_RIGHT_SHIFT:{
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else {
dv->Keyboard->release(k);
}
}break;
case KEY_CAPS_LOCK:
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
dv->Keyboard->setAdjustForHostCapsLock(true);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->setAdjustForHostCapsLock(false);
dv->Keyboard->release(k);
}
break;
case _SELECT_KEY:
if(check_pd2() == HIGH) {
k = ' ';
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
dv->Joystick->button(9,mode);
}
break;
case _START_KEY:
if(check_pd2() == HIGH) {
k = KEY_RETURN;
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
dv->Joystick->button(10,mode);
}
break;
case _FN_BRIGHTNESS_UP:
if(mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::BRIGHTNESS_UP);
}else {
dv->Consumer->release();
}
break;
case _FN_BRIGHTNESS_DOWN:
if(mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::BRIGHTNESS_DOWN);
}else {
dv->Consumer->release();
}
break;
case _VOLUME_P:{
if(mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::VOLUME_UP);
}else {
dv->Consumer->release();
}
}break;
case _VOLUME_M:{
if(mode == KEY_PRESSED) {
dv->Consumer->press(HIDConsumer::VOLUME_DOWN);
}else {
dv->Consumer->release();
}
}break;
case _FN_LOCK_KEYBOARD:{
dv->Keyboard_state.lock = dv->Keyboard_state.lock ^ 1;
}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 _FN_LIGHT_KEYBOARD: {
dev_term.Keyboard_state.backlight = (dev_term.Keyboard_state.backlight + 1) % 4;
pwmWrite(PA8,backlight[ dev_term.Keyboard_state.backlight ] );
}break;
default:
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
if(dv->Keyboard_state.fn_on > 0){
fn_actions[addr] = 0;
}
}
break;
}
}
void keypad_action(DEVTERM*dv,uint8_t col,uint8_t mode) {
uint16_t k;
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];
}
if(k == EMP){
return;
}
if(dv->Keyboard_state.lock == 1) {
return;
}
switch(k) {
case _LEFT_SHIFT_KEY:
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
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:
if(check_pd2() == HIGH) {
k = KEY_UP_ARROW;
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
if(mode == KEY_RELEASED){
dv->Joystick->Y(511);
}else {
dv->Joystick->Y(0);
}
}
break;
case _JOYSTICK_DOWN:
if(check_pd2() == HIGH) {
k = KEY_DOWN_ARROW;
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
if(mode == KEY_RELEASED){
dv->Joystick->Y(511);
}else {
dv->Joystick->Y(1023);
}
}
break;
case _JOYSTICK_LEFT:
if(check_pd2() == HIGH) {
k = KEY_LEFT_ARROW;
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
if(mode == KEY_RELEASED){
dv->Joystick->X(511);
}else {
dv->Joystick->X(0);
}
}
break;
case _JOYSTICK_RIGHT:
if(check_pd2() == HIGH) {
k = KEY_RIGHT_ARROW;
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
if(mode == KEY_RELEASED){
dv->Joystick->X(511);
}else {
dv->Joystick->X(1023);
}
}
break;
case _JOYSTICK_A:
if(check_pd2() == HIGH) {
k = 'j';
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
dv->Joystick->button(2,mode);
}
break;
case _JOYSTICK_B:
if(check_pd2() == HIGH) {
k = 'k';
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
dv->Joystick->button(3,mode);
}
break;
case _JOYSTICK_X:
if(check_pd2() == HIGH) {
k = 'u';
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
dv->Joystick->button(1,mode);
}
break;
case _JOYSTICK_Y:
if(check_pd2() == HIGH) {
k = 'i';
if(mode == KEY_PRESSED) {
dv->Keyboard->press(k);
}else if(mode == KEY_RELEASED) {
dv->Keyboard->release(k);
}
}else {
dv->Joystick->button(4,mode);
}
break;
case _MOUSE_LEFT:
if(mode == KEY_PRESSED){
dv->Mouse->press(1);
}else if(mode == KEY_RELEASED){
dv->Mouse->release(1);
}
break;
case _MOUSE_MID:
if(mode == KEY_PRESSED) {
dv->state->pressMiddleClick();
}else {
if(dv->state->getScrolled() == false){
//if no scrolling happend ,do as a normal mid mouse key click
dv->Mouse->click(MOUSE_MIDDLE);
}
dv->state->releaseMiddleClick();
}
break;
case _MOUSE_RIGHT:
if(mode == KEY_PRESSED){
dv->Mouse->press(2);
}else if(mode == KEY_RELEASED){
dv->Mouse->release(2);
}
break;
//_LEFT_CTRL_KEY,_CMD_KEY , _LEFT_ALT
case _LEFT_CTRL_KEY:
case _CMD_KEY:
case _LEFT_ALT:
case KEY_RIGHT_CTRL:
case KEY_RIGHT_ALT:
if(mode == KEY_PRESSED){
dv->Keyboard->press(k);
}else {
dv->Keyboard->release(k);
}
break;
case _TRACKBALL_BTN:
if(mode == KEY_PRESSED){
dv->Mouse->press(1);
}else if(mode == KEY_RELEASED){
dv->Mouse->release(1);
}
break;
default:break;
}
}