-
Notifications
You must be signed in to change notification settings - Fork 0
Home
#include <stdio.h>
#include <string.h>
struct Client
{
bool connected;
char buffer[64];
int bufferPosition;
};
Client clients[8];
bool hasCommand(char* cmd);
bool ProcessCmd(char* cmd);
bool ProcessLocalCmd(char* device, char* action);
bool ProcessKeyboardCommand(int modifiers, int key);
int main()
{
// Cmd: USB1_KBD_A
`// USB KBD/MOUSE`
`// 0 = local`
`// 1 = i2c device #1`
`// 2 = i2c device #2`
`// Bluetooth KBD/MOUSE`
`// 1 = (default)`
`// ALT+F4?`
`// Modifiers_KEY _KEYBD`
`strcpy(clients[0].buffer, "USB1_KEYBD_LCTRL+LALT_F4\r");`
`ProcessCmd(strupr(clients[0].buffer));`
`getchar();`
`return 0;`
}
bool ProcessCmd(char* cmd)
{
// valid targets: USB#, BTH#
char* target = strtok(cmd, "_");
`if (!target)`
`return false;`
`// valid devices, KEYBD, MOUSE`
`char* device = strtok(NULL, "_");`
`if (!device)`
`return false;`
`char* action = strtok(NULL, "\r");`
`if (!action)`
`return false;`
`printf("Target: [%s], device: [%s], action: [%s]", target, device, action);`
`// or strcasecmp`
`if (stricmp(target, "USB1") == 0)`
`ProcessLocalCmd(device, action);`
`return false;`
}
/*
Binary Input Function
0 Disconnect if connected from the host.
0x1 - 0xF Converted to special keys like home, page up, backspace, etc.
0x10 - 0x7E Translation mode: printable ASCII characters.
0x7F Toggle virtual keyboard on iPhone.
0x80 - 0xDF Interprets input as actual scan code.
0xE0 - 0xE7 Sends modifier keys Left Shift, Left Alt, Right Shift, etc.
0xE8 - 0xEF Interprets input as actual scan code.
0xF0 - 0xFC Reserved for custom reports.
0xFD Raw mode: input is RAW report.
0xFE Interpretive mode: input is shorthand report.
0xFF Sends output report to UART.
*/
bool ProcessLocalCmd(char* device, char* action)
{
if (stricmp(device, "KEYBD") == 0)
{
// valid modifiers: RGUI, RALT, RSHIFT, RCTRL,
// LGUI, LALT, LSHIFT, LCTRL
char* modifiers = strtok(action, "_");
`if (!modifiers)`
`return false;`
`char* keyCode = strtok(NULL, "\r");`
`if (!keyCode)`
`return false;`
`int mod = 0;`
`if (strstr(modifiers, "RGUI"))`
`mod = mod | 0x80;`
`if (strstr(modifiers, "RALT"))`
`mod = mod | 0x40;`
`if (strstr(modifiers, "RSHIFT"))`
`mod = mod | 0x20;`
`if (strstr(modifiers, "RCTRL"))`
`mod = mod | 0x10;`
`if (strstr(modifiers, "LGUI"))`
`mod = mod | 0x8;`
`if (strstr(modifiers, "LALT"))`
`mod = mod | 0x4;`
`if (strstr(modifiers, "LSHIFT"))`
`mod = mod | 0x2;`
`if (strstr(modifiers, "LCTRL"))`
`mod = mod | 0x1;`
`return ProcessKeyboardCommand(mod, (int)*action);`
`}`
`return true;`
}
bool ProcessKeyboardCommand(int modifiers, int key)
{
// check for printable ASCII character
// 32 = 0x20
// 126 = 0x7E
`if (key >= 32 && key <= 126)`
`{`
`}`
`return false;`
}