diff --git a/arduino_micro_code/arduino_micro_code.ino b/arduino_micro_code/arduino_micro_code.ino index 26378e3..e55b630 100644 --- a/arduino_micro_code/arduino_micro_code.ino +++ b/arduino_micro_code/arduino_micro_code.ino @@ -1,5 +1,5 @@ - #include +#include #include // Setup --------------------------------------------- @@ -16,19 +16,28 @@ int SoftSerialTX = 9; #define KEY_F17 0xF4 // 0x6C + 0x88 #define KEY_F18 0xF5 // 0x6D + 0x88 +#define key_timeout 100 + enum parse_mode{ none, regular_key, special_key, - trackball + trackball_x, + trackball_y, + trackball_key }; // Globals ------------------------------------------- parse_mode ParseMode; SoftwareSerial KeyboardSerial(SoftSerialRX, SoftSerialTX); -unsigned long time_since_last_loop; +unsigned long TrackballY; +unsigned long TrackballX; bool shift; +bool mouse_left; +bool mouse_middle; +bool mouse_right; +unsigned long time_since_last_key; // Functions ----------------------------------------- @@ -38,13 +47,19 @@ void setup() { pinMode(SoftSerialTX, OUTPUT); Serial.begin(2400); Keyboard.begin(); + Mouse.begin(); ParseMode = parse_mode::none; KeyboardSerial.begin(2400); while (!Serial) { ; } - time_since_last_loop = millis(); + TrackballX = 0; + TrackballY = 0; shift = false; + mouse_left = false; + mouse_right = false; + mouse_middle = false; + time_since_last_key = millis(); } void parseRegularKey(unsigned long v) @@ -132,6 +147,59 @@ void parseSpecialKey(unsigned long v) if (v == 101) Keyboard.write(KEY_ESC); } +void parse_trackball(unsigned long x, unsigned long y) +{ + Mouse.move(x, -y); +} + +void parse_trackball_key(unsigned long v) +{ + switch(v) + { + case 0x40: // T1 key + Mouse.press(MOUSE_LEFT); + mouse_left = true; + //Serial.println("Pressed left mouse"); + break; + case 0x41: // T2 key + Mouse.press(MOUSE_MIDDLE); + //Serial.println("Pressed middle mouse"); + mouse_middle = true; + break; + case 0x42: // T3 key + Mouse.press(MOUSE_RIGHT); + //Serial.println("Pressed right mouse"); + mouse_right = true; + break; + } +} + +void detect_key_release() +{ + if ((millis() - time_since_last_key) > key_timeout) + { + Keyboard.releaseAll(); + if (mouse_right == true) + { + Mouse.release(MOUSE_RIGHT); + mouse_right = false; + //Serial.println("Released right mouse"); + } + if (mouse_left == true) + { + Mouse.release(MOUSE_LEFT); + mouse_left = false; + //Serial.println("Released left mouse"); + } + if (mouse_middle == true) + { + Mouse.release(MOUSE_MIDDLE); + mouse_middle = false; + //Serial.println("Released middle mouse"); + } + } +} + void loop() { KeyboardSerial.listen(); if (KeyboardSerial.available()) @@ -147,6 +215,12 @@ void loop() { ParseMode = parse_mode::special_key; Serial.println("Special key"); break; + case 0xA2: + ParseMode = parse_mode::trackball_x; + break; + case 0xA4: + ParseMode = parse_mode::trackball_key; + break; default: if (ParseMode == parse_mode::regular_key) { @@ -156,14 +230,29 @@ void loop() { { parseSpecialKey(v); } + else if (ParseMode == parse_mode::trackball_x) + { + TrackballX = v; + ParseMode = parse_mode::trackball_y; + } + else if (ParseMode == parse_mode::trackball_y) + { + TrackballY = v; + ParseMode = parse_mode::none; + parse_trackball(TrackballX, TrackballY); + } + else if (ParseMode == parse_mode::trackball_key) + { + parse_trackball_key(v); + } break; } - Serial.println(v, BIN); - Serial.println(v, DEC); + //Serial.println(v, BIN); + //Serial.println(v, HEX); + time_since_last_key = millis(); } else { - Keyboard.releaseAll(); + detect_key_release(); } - delay(20); }