From 093dcc08523d2b24d2b081fca8608f0eb78f2c5b Mon Sep 17 00:00:00 2001 From: Fabian Felix Selbach Date: Fri, 1 Mar 2024 19:44:29 +0100 Subject: [PATCH] KB rebind, minimal debounce, multiple binds per key possible --- kbdrv-main.c | 38 +++++++++++++++++-------------- keyboard_mapping.h | 56 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/kbdrv-main.c b/kbdrv-main.c index 71f1307..a4dbd99 100644 --- a/kbdrv-main.c +++ b/kbdrv-main.c @@ -16,13 +16,13 @@ int main() { if(wiringXSetup("duo", NULL) == -1){ wiringXGC(); - return -1; + return 1; } for(int i = 0; i < sizeof(columns)/sizeof(int); i++){ if(wiringXValidGPIO(columns[i]) != 0){ printf("Invalid GPIO %d\n", columns[i]); - return -1; + return 2; } pinMode(columns[i], PINMODE_OUTPUT); digitalWrite(columns[i], HIGH); @@ -30,13 +30,13 @@ int main() { for(int i = 0; i < sizeof(rows)/sizeof(int); i++){ if(wiringXValidGPIO(rows[i]) != 0){ printf("Invalid GPIO %d\n", rows[i]); - return -1; + return 2; } pinMode(rows[i], PINMODE_INPUT); } if(wiringXValidGPIO(num_lock) != 0){ printf("Invalid GPIO %d\n", num_lock); - return -1; + return 2; } pinMode(num_lock, PINMODE_OUTPUT); @@ -54,7 +54,7 @@ int main() { if((fd = open(filename, O_RDWR, 0666)) == -1) { perror(filename); - return -1; + return 3; } while(true){ @@ -87,18 +87,22 @@ int main() { for(int r = 0; r < sizeof(rows)/sizeof(int); r++){ char curState = state[c][r]; state[c][r] = (digitalRead(rows[r]) == LOW); - if(state[c][r] == true && curKey < 80){ - char *binding = mapping[c][r]; - for(int i = 0; kmod[i].opt != NULL; i++){ - if (strcmp(binding, kmod[i].opt) == 0) { - report[0] = report[0] | kmod[i].val; - break; + if((state[c][r] == true || curState == true)){ + char bind[sizeof(mapping[c][r])/sizeof(char)]; + strcpy(bind, mapping[c][r]); + char *binding = strtok(bind, " "); + for(; binding != NULL; binding = strtok(NULL, " ")){ + for(int i = 0; kmod[i].opt != NULL; i++){ + if (strcmp(binding, kmod[i].opt) == 0) { + report[0] = report[0] | kmod[i].val; + break; + } } - } - for(int i = 0; kval[i].opt != NULL; i++){ - if(strcmp(binding, kval[i].opt) == 0) { - report[2 + curKey++] = kval[i].val; - break; + for(int i = 0; kval[i].opt != NULL; i++){ + if(strcmp(binding, kval[i].opt) == 0 && curKey < 80) { + report[2 + curKey++] = kval[i].val; + break; + } } } } @@ -106,7 +110,7 @@ int main() { } digitalWrite(columns[c], HIGH); } - write(fd, report, 80);//Send Report over USB + write(fd, report, 82);//Send Report over USB usleep(700); } diff --git a/keyboard_mapping.h b/keyboard_mapping.h index a3c66e4..0c291d2 100644 --- a/keyboard_mapping.h +++ b/keyboard_mapping.h @@ -1,22 +1,21 @@ -static int columns[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; -static int rows[] = {14, 16, 17, 18, 19, 20, 21, 22, 26, 27}; +static int columns[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; +static int rows[] = {14, 16, 17, 18, 19, 20, 21, 22, 26, 27, 13}; //1,4,5,7 static int num_lock = 25; static int caps_lock = 11; -static int scroll_lock = 13; +static int scroll_lock = 10; static char* mapping[sizeof(columns)/sizeof(int)][sizeof(rows)/sizeof(int)] = { - {"^", "--tab", "--caps-lock", "--left-shift", "--left-ctrl", "<", "a", "q", "1", "2"},//column 0 - {"w", "s", "y", "--left-meta", "--left-alt", "x", "d", "e", "3", "4"}, - {"r", "f", "c", "--spacebar", "v", "g", "t", "5", "6", "z"}, - {"h", "b", "n", "j", "u", "7", "8", "i", "k", "m"}, - {",", "l", "o", "9", "0", "p", "ö", ".", "--right-alt", "--right-meta"}, - {"-", "ä", "ü", "ß", "´", "--bckspc", "--return", "+", "#", "--right-shift"}, - {"--application", "--right-ctrl", "--f10", "--f11", "--f12", "0", "0", "0", "0", "0"}, - {"--left", "--down", "--right", "--up", "--del", "--end", "--pagedown", "--pageup", "--home", "--insert"}, - {"--kp-0", "--kp-1", "--kp-2", "--kp-3", "--kp-4", "--kp-5", "--kp-6", "--kp-7", "--kp-8", "--kp-9"}, - {"--kp--enter", "--kp-plus", "--kp-minus", "--kp-mul", "--kp-div", "--num-lock", "0", "0", "0", "0"}, - {"--esc", "--f1", "--f2", "--f3", "--f4", "--f5", "--f6", "--f7", "--f8", "--f9"}//column 10 + {"^", "w", "r", "h", ",", "-", "--application", "--kp-0", "--kp-enter", "--media4","--esc"}, + {"--tab", "s", "f", "b", "l", "ä", "--right-ctrl", "--kp-1", "--kp-plus", "--pause","--f1"}, + {"--caps-lock", "y", "c", "n", "o", "ü", "--left", "--kp-2", "--kp-minus", "--scrl-lck", "--f2"}, + {"--left-shift", "--left-meta", "--spacebar", "j", "9", "ß", "--down", "--kp-3", "--kp-mul", "--prtsc", "--f3"}, + {"--left-ctrl", "--left-alt", "v", "u", "0", "´", "--up", "--kp-4", "--kp-div", "--home", "--f4"}, + {"<", "x", "g", "7", "p", "--bckspc", "--right", "--kp-5", "--num-lock", "--insert", "--f5"}, + {"a", "d", "t", "8", "ö", "--return", "--del", "--kp-6", "--kp-comma", /*extra key*/"h e l l o", "--f6"}, + {"q", "e", "5", "i", ".", "+", "--end", "--kp-7", "--media1", "--f12", "--f7"}, + {"1", "3", "6", "k", "--right-alt", "#", "--pagedown", "--kp-8", "--media2", "--f11", "--f8"}, + {"2", "4", "z", "m", "--right-meta", "--right-shift", "--pageup", "--kp-9", "--media3", "--f10", "--f9"} }; struct options { @@ -37,6 +36,11 @@ static struct options kmod[] = { }; static struct options kval[] = { +// {.opt = "--extra", .val = 0x7F}, +// {.opt = "--media1", .val = 0x81}, Media keys are consumer HID not Keyboard HID +// {.opt = "--media2", .val = 0x80}, +// {.opt = "--media3", .val = 0xCD}, +// {.opt = "--media4", .val = 0xCE}, {.opt = "^", .val = 0x35}, {.opt = "1", .val = 0x1E}, {.opt = "2", .val = 0x1F}, @@ -58,7 +62,7 @@ static struct options kval[] = { {.opt = "r", .val = 0x15}, {.opt = "t", .val = 0x17}, {.opt = "z", .val = 0x1C}, - {.opt = "u", .val = 0xA0}, + {.opt = "u", .val = 0x18}, {.opt = "i", .val = 0x0C}, {.opt = "o", .val = 0x12}, {.opt = "p", .val = 0x13}, @@ -80,14 +84,14 @@ static struct options kval[] = { {.opt = "--return", .val = 0x28}, {.opt = "<", .val = 0x64}, {.opt = "y", .val = 0x1D}, - {.opt = "x", .val = 0x2B}, + {.opt = "x", .val = 0x1B}, {.opt = "c", .val = 0x06}, {.opt = "v", .val = 0x19}, {.opt = "b", .val = 0x05}, {.opt = "n", .val = 0x11}, {.opt = "m", .val = 0x10}, {.opt = ",", .val = 0x36}, - {.opt = ".", .val = 0x17}, + {.opt = ".", .val = 0x37}, {.opt = "-", .val = 0x38}, {.opt = "--spacebar", .val = 0x2C}, {.opt = "--esc", .val = 0x29}, @@ -116,5 +120,23 @@ static struct options kval[] = { {.opt = "--application", .val = 0x65}, {.opt = "--num-lock", .val = 0x53}, {.opt = "--kp-enter", .val = 0x58}, + {.opt = "--kp-0", .val = 0x62}, + {.opt = "--kp-1", .val = 0x59}, + {.opt = "--kp-2", .val = 0x5A}, + {.opt = "--kp-3", .val = 0x5B}, + {.opt = "--kp-4", .val = 0x5C}, + {.opt = "--kp-5", .val = 0x5D}, + {.opt = "--kp-6", .val = 0x5E}, + {.opt = "--kp-7", .val = 0x5F}, + {.opt = "--kp-8", .val = 0x60}, + {.opt = "--kp-9", .val = 0x61}, + {.opt = "--kp-div", .val = 0x54}, + {.opt = "--kp-mul", .val = 0x55}, + {.opt = "--kp-minus", .val = 0x56}, + {.opt = "--kp-plus", .val = 0x57}, + {.opt = "--kp-comma", .val = 0x63}, + {.opt = "--pause", .val = 0x48}, + {.opt = "--scrl-lck", .val = 0x47}, + {.opt = "--prtsc", .val = 0x46}, {.opt = NULL} };