diff options
author | Devaev Maxim <[email protected]> | 2018-07-13 07:33:50 +0000 |
---|---|---|
committer | Devaev Maxim <[email protected]> | 2018-07-13 07:33:56 +0000 |
commit | 9c5a8d122c563bbe1f8c6593a5c5176a24cba8e2 (patch) | |
tree | 5526e8e35d66c7c1d84512627155cfcbedda1c72 /hid/src | |
parent | f83b4f674aa5c2d9e357e1bad8a5401021b56f9d (diff) |
changed hid protocol, added mouse support for hid
Diffstat (limited to 'hid/src')
-rw-r--r-- | hid/src/main.cpp | 70 |
1 files changed, 61 insertions, 9 deletions
diff --git a/hid/src/main.cpp b/hid/src/main.cpp index 98faff25..565420c1 100644 --- a/hid/src/main.cpp +++ b/hid/src/main.cpp @@ -4,22 +4,30 @@ #include "inline.h" #include "keymap.h" -#define CMD_SERIAL Serial1 +#define CMD_SERIAL Serial #define CMD_SERIAL_SPEED 115200 -#define INLINE inline __attribute__((always_inline)) +#define CMD_MOUSE_LEFT 0b10000000 +#define CMD_MOUSE_LEFT_STATE 0b00001000 +#define CMD_MOUSE_RIGHT 0b01000000 +#define CMD_MOUSE_RIGHT_STATE 0b00000100 -INLINE void cmdResetHid() { - CMD_SERIAL.read(); // unused now - CMD_SERIAL.read(); // unused now - CMD_SERIAL.read(); // unused now +// ----------------------------------------------------------------------------- +INLINE void cmdResetHid() { // 0 bytes + CMD_SERIAL.read(); // unused + CMD_SERIAL.read(); // unused + CMD_SERIAL.read(); // unused + CMD_SERIAL.read(); // unused Keyboard.releaseAll(); + AbsoluteMouse.releaseAll(); } -INLINE void cmdKeyEvent() { - uint8_t state = CMD_SERIAL.read(); +INLINE void cmdKeyEvent() { // 2 bytes KeyboardKeycode code = keymap((uint8_t)CMD_SERIAL.read()); + uint8_t state = CMD_SERIAL.read(); + CMD_SERIAL.read(); // unused + CMD_SERIAL.read(); // unused if (code != KEY_ERROR_UNDEFINED) { if (state) { Keyboard.press(code); @@ -29,17 +37,61 @@ INLINE void cmdKeyEvent() { } } +INLINE void cmdMouseMoveEvent() { // 4 bytes + int x = (int)CMD_SERIAL.read() << 8; + x |= (int)CMD_SERIAL.read(); + int y = (int)CMD_SERIAL.read() << 8; + y |= (int)CMD_SERIAL.read(); + AbsoluteMouse.moveTo(0, 0); + AbsoluteMouse.moveTo(x, y); +} + +INLINE void cmdMouseButtonEvent() { // 1 byte + uint8_t state = CMD_SERIAL.read(); + CMD_SERIAL.read(); // unused + CMD_SERIAL.read(); // unused + CMD_SERIAL.read(); // unused + if (state & CMD_MOUSE_LEFT) { + if (state & CMD_MOUSE_LEFT_STATE) { + AbsoluteMouse.press(MOUSE_LEFT); + } else { + AbsoluteMouse.release(MOUSE_LEFT); + } + } + if (state & CMD_MOUSE_RIGHT) { + if (state & CMD_MOUSE_RIGHT_STATE) { + AbsoluteMouse.press(MOUSE_RIGHT); + } else { + AbsoluteMouse.release(MOUSE_RIGHT); + } + } +} + +INLINE void cmdMouseWheelEvent() { // 2 bytes + CMD_SERIAL.read(); // delta_x is not supported by hid-project now + signed char delta_y = CMD_SERIAL.read(); + CMD_SERIAL.read(); // unused + CMD_SERIAL.read(); // unused + AbsoluteMouse.move(0, 0, delta_y); + CMD_SERIAL.println(delta_y); +} + +// ----------------------------------------------------------------------------- void setup() { CMD_SERIAL.begin(CMD_SERIAL_SPEED); Keyboard.begin(); + AbsoluteMouse.begin(); } void loop() { - if (CMD_SERIAL.available() >= 4) { + if (CMD_SERIAL.available() >= 5) { switch ((uint8_t)CMD_SERIAL.read()) { case 0: cmdResetHid(); break; case 1: cmdKeyEvent(); break; + case 2: cmdMouseMoveEvent(); break; + case 3: cmdMouseButtonEvent(); break; + case 4: cmdMouseWheelEvent(); break; default: break; } } |