123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- #include "usbkvm_fw.h"
- bool is_ascii(uint8_t value) {
- return value >= 32 && value <= 127;
- }
- bool is_funckey(uint8_t value) {
- return ((value >= 0xC2 && value <= 0xCD) || (value >= 0xF0 && value <= 0xFB));
- }
- bool is_validkeys(uint8_t key) {
- if (key >= 0xD7 && key <= 0xDA) {
-
- return true;
- }
- if (key >= 0xB0 && key <= 0xB3) {
-
- return true;
- }
- if (key >= 0xD1 && key <= 0xD6) {
-
- return true;
- }
-
- return key == 0xC1;
- }
- bool isBitSet(uint8_t value, uint8_t n) {
- if (n > 7) return false;
- return (value & (1 << n)) != 0;
- }
- void keyboard_modifying_key_set(bool isPress, uint8_t key) {
- if (isPress) {
- switch (key) {
- case PAYLOAD_KEY_LEFT_CTRL:
- Keyboard_press(KEY_LEFT_CTRL);
- return;
- case PAYLOAD_KEY_LEFT_SHIFT:
- Keyboard_press(KEY_LEFT_SHIFT);
- return;
- case PAYLOAD_KEY_LEFT_ALT:
- Keyboard_press(KEY_LEFT_ALT);
- return;
- case PAYLOAD_KEY_LEFT_GUI:
- Keyboard_press(KEY_LEFT_GUI);
- return;
- case PAYLOAD_KEY_RIGHT_CTRL:
- Keyboard_press(KEY_RIGHT_CTRL);
- return;
- case PAYLOAD_KEY_RIGHT_SHIFT:
- Keyboard_press(KEY_RIGHT_SHIFT);
- return;
- case PAYLOAD_KEY_RIGHT_ALT:
- Keyboard_press(KEY_RIGHT_ALT);
- return;
- case PAYLOAD_KEY_RIGHT_GUI:
- Keyboard_press(KEY_RIGHT_GUI);
- return;
- }
- } else {
- switch (key) {
- case PAYLOAD_KEY_LEFT_CTRL:
- Keyboard_release(KEY_LEFT_CTRL);
- return;
- case PAYLOAD_KEY_LEFT_SHIFT:
- Keyboard_release(KEY_LEFT_SHIFT);
- return;
- case PAYLOAD_KEY_LEFT_ALT:
- Keyboard_release(KEY_LEFT_ALT);
- return;
- case PAYLOAD_KEY_LEFT_GUI:
- Keyboard_release(KEY_LEFT_GUI);
- return;
- case PAYLOAD_KEY_RIGHT_CTRL:
- Keyboard_release(KEY_RIGHT_CTRL);
- return;
- case PAYLOAD_KEY_RIGHT_SHIFT:
- Keyboard_release(KEY_RIGHT_SHIFT);
- return;
- case PAYLOAD_KEY_RIGHT_ALT:
- Keyboard_release(KEY_RIGHT_ALT);
- return;
- case PAYLOAD_KEY_RIGHT_GUI:
- Keyboard_release(KEY_RIGHT_GUI);
- return;
- }
- }
- }
- void numpad_key_set(bool isPress, uint8_t value) {
- if (isPress) {
- switch (value) {
- case PAYLOAD_NUMPAD_0:
- Keyboard_press('\352');
- return;
- case PAYLOAD_NUMPAD_1:
- Keyboard_press('\341');
- return;
- case PAYLOAD_NUMPAD_2:
- Keyboard_press('\342');
- return;
- case PAYLOAD_NUMPAD_3:
- Keyboard_press('\343');
- return;
- case PAYLOAD_NUMPAD_4:
- Keyboard_press('\344');
- return;
- case PAYLOAD_NUMPAD_5:
- Keyboard_press('\345');
- return;
- case PAYLOAD_NUMPAD_6:
- Keyboard_press('\346');
- return;
- case PAYLOAD_NUMPAD_7:
- Keyboard_press('\347');
- return;
- case PAYLOAD_NUMPAD_8:
- Keyboard_press('\350');
- return;
- case PAYLOAD_NUMPAD_9:
- Keyboard_press('\351');
- return;
- case PAYLOAD_NUMPAD_DOT:
- Keyboard_press('\353');
- return;
- case PAYLOAD_NUMPAD_TIMES:
- Keyboard_press('\335');
- return;
- case PAYLOAD_NUMPAD_DIV:
- Keyboard_press('\334');
- return;
- case PAYLOAD_NUMPAD_PLUS:
- Keyboard_press('\337');
- return;
- case PAYLOAD_NUMPAD_MINUS:
- Keyboard_press('\336');
- return;
- case PAYLOAD_NUMPAD_ENTER:
- Keyboard_press('\340');
- return;
- case PAYLOAD_NUMPAD_NUMLOCK:
- Keyboard_press('\333');
- return;
- }
- } else {
- switch (value) {
- case PAYLOAD_NUMPAD_0:
- Keyboard_release('\352');
- return;
- case PAYLOAD_NUMPAD_1:
- Keyboard_release('\341');
- return;
- case PAYLOAD_NUMPAD_2:
- Keyboard_release('\342');
- return;
- case PAYLOAD_NUMPAD_3:
- Keyboard_release('\343');
- return;
- case PAYLOAD_NUMPAD_4:
- Keyboard_release('\344');
- return;
- case PAYLOAD_NUMPAD_5:
- Keyboard_release('\345');
- return;
- case PAYLOAD_NUMPAD_6:
- Keyboard_release('\346');
- return;
- case PAYLOAD_NUMPAD_7:
- Keyboard_release('\347');
- return;
- case PAYLOAD_NUMPAD_8:
- Keyboard_release('\350');
- return;
- case PAYLOAD_NUMPAD_9:
- Keyboard_release('\351');
- return;
- case PAYLOAD_NUMPAD_DOT:
- Keyboard_release('\353');
- return;
- case PAYLOAD_NUMPAD_TIMES:
- Keyboard_release('\335');
- return;
- case PAYLOAD_NUMPAD_DIV:
- Keyboard_release('\334');
- return;
- case PAYLOAD_NUMPAD_PLUS:
- Keyboard_release('\337');
- return;
- case PAYLOAD_NUMPAD_MINUS:
- Keyboard_release('\336');
- return;
- case PAYLOAD_NUMPAD_ENTER:
- Keyboard_release('\340');
- return;
- case PAYLOAD_NUMPAD_NUMLOCK:
- Keyboard_release('\333');
- return;
- }
- }
- }
- uint8_t keyboard_emulation(uint8_t subtype, uint8_t value) {
-
- switch (subtype) {
-
- case SUBTYPE_KEYBOARD_ASCII_WRITE:
- if (!is_ascii(value))
- return resp_invalid_key_value;
- Keyboard_write(value);
- return resp_ok;
- case SUBTYPE_KEYBOARD_ASCII_PRESS:
- if (!is_ascii(value))
- return resp_invalid_key_value;
- Keyboard_press(value);
- return resp_ok;
- case SUBTYPE_KEYBOARD_ASCII_RELEASE:
- if (!is_ascii(value))
- return resp_invalid_key_value;
- Keyboard_release(value);
- return resp_ok;
-
- case SUBTYPE_KEYBOARD_MODIFIER_PRESS:
- keyboard_modifying_key_set(true, value);
- return resp_ok;
- case SUBTYPE_KEYBOARD_MODIFIER_RELEASE:
- keyboard_modifying_key_set(false, value);
- return resp_ok;
-
- case SUBTYPE_KEYBOARD_FUNCTKEY_PRESS:
- if (!is_funckey(value))
- return resp_invalid_key_value;
- Keyboard_press(value);
- return resp_ok;
- case SUBTYPE_KEYBOARD_FUNCTKEY_RELEASE:
- if (!is_funckey(value))
- return resp_invalid_key_value;
- Keyboard_release(value);
- return resp_ok;
-
- case SUBTYPE_KEYBOARD_OTHERKEY_PRESS:
- if (!is_validkeys(value))
- return resp_invalid_key_value;
- Keyboard_press(value);
- return resp_ok;
- case SUBTYPE_KEYBOARD_OTHERKEY_RELEASE:
- if (!is_validkeys(value))
- return resp_invalid_key_value;
- Keyboard_release(value);
- return resp_ok;
-
- case SUBTYPE_KEYBOARD_NUMPAD_PRESS:
- if (value > PAYLOAD_NUMPAD_NUMLOCK)
- return resp_invalid_key_value;
- numpad_key_set(true, value);
- return resp_ok;
- case SUBTYPE_KEYBOARD_NUMPAD_RELEASE:
- if (value > PAYLOAD_NUMPAD_NUMLOCK)
- return resp_invalid_key_value;
- numpad_key_set(false, value);
- return resp_ok;
-
- case SUBTYPE_KEYBOARD_SPECIAL_PAUSE:
- Keyboard_press('\320');
- delay(100);
- Keyboard_release('\320');
- return resp_ok;
- case SUBTYPE_KEYBOARD_SPECIAL_PRINT_SCREEN:
- Keyboard_press('\316');
- delay(100);
- Keyboard_release('\316');
- return resp_ok;
- case SUBTYPE_KEYBOARD_SPECIAL_SCROLL_LOCK:
- Keyboard_press('\317');
- delay(100);
- Keyboard_release('\317');
- return resp_ok;
- case SUBTYPE_KEYBOARD_SPECIAL_NUMLOCK:
- Keyboard_press('\333');
- delay(100);
- Keyboard_release('\333');
- return resp_ok;
- case SUBTYPE_KEYBOARD_SPECIAL_CTRLALTDEL:
-
- Keyboard_press(KEY_LEFT_CTRL);
- Keyboard_press(KEY_LEFT_ALT);
- Keyboard_press(KEY_DELETE);
- delay(100);
-
- Keyboard_release(KEY_DELETE);
- delay(MIN_KEY_EVENTS_DELAY);
- Keyboard_release(KEY_LEFT_ALT);
- delay(MIN_KEY_EVENTS_DELAY);
- Keyboard_release(KEY_LEFT_CTRL);
- delay(MIN_KEY_EVENTS_DELAY);
- return resp_ok;
- case SUBTYPE_KEYBOARD_SPECIAL_RESET:
-
- Keyboard_releaseAll();
- return resp_ok;
- default:
- return resp_invalid_opr_type;
- }
- }
|