Trackball parsing

This commit is contained in:
John Sennesael 2021-08-27 17:15:55 -05:00
parent 6be07cff3b
commit e693bfc1d1
1 changed files with 97 additions and 8 deletions

View File

@ -1,5 +1,5 @@
#include <Keyboard.h> #include <Keyboard.h>
#include <Mouse.h>
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
// Setup --------------------------------------------- // Setup ---------------------------------------------
@ -16,19 +16,28 @@ int SoftSerialTX = 9;
#define KEY_F17 0xF4 // 0x6C + 0x88 #define KEY_F17 0xF4 // 0x6C + 0x88
#define KEY_F18 0xF5 // 0x6D + 0x88 #define KEY_F18 0xF5 // 0x6D + 0x88
#define key_timeout 100
enum parse_mode{ enum parse_mode{
none, none,
regular_key, regular_key,
special_key, special_key,
trackball trackball_x,
trackball_y,
trackball_key
}; };
// Globals ------------------------------------------- // Globals -------------------------------------------
parse_mode ParseMode; parse_mode ParseMode;
SoftwareSerial KeyboardSerial(SoftSerialRX, SoftSerialTX); SoftwareSerial KeyboardSerial(SoftSerialRX, SoftSerialTX);
unsigned long time_since_last_loop; unsigned long TrackballY;
unsigned long TrackballX;
bool shift; bool shift;
bool mouse_left;
bool mouse_middle;
bool mouse_right;
unsigned long time_since_last_key;
// Functions ----------------------------------------- // Functions -----------------------------------------
@ -38,13 +47,19 @@ void setup() {
pinMode(SoftSerialTX, OUTPUT); pinMode(SoftSerialTX, OUTPUT);
Serial.begin(2400); Serial.begin(2400);
Keyboard.begin(); Keyboard.begin();
Mouse.begin();
ParseMode = parse_mode::none; ParseMode = parse_mode::none;
KeyboardSerial.begin(2400); KeyboardSerial.begin(2400);
while (!Serial) { while (!Serial) {
; ;
} }
time_since_last_loop = millis(); TrackballX = 0;
TrackballY = 0;
shift = false; shift = false;
mouse_left = false;
mouse_right = false;
mouse_middle = false;
time_since_last_key = millis();
} }
void parseRegularKey(unsigned long v) void parseRegularKey(unsigned long v)
@ -132,6 +147,59 @@ void parseSpecialKey(unsigned long v)
if (v == 101) Keyboard.write(KEY_ESC); 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() { void loop() {
KeyboardSerial.listen(); KeyboardSerial.listen();
if (KeyboardSerial.available()) if (KeyboardSerial.available())
@ -147,6 +215,12 @@ void loop() {
ParseMode = parse_mode::special_key; ParseMode = parse_mode::special_key;
Serial.println("Special key"); Serial.println("Special key");
break; break;
case 0xA2:
ParseMode = parse_mode::trackball_x;
break;
case 0xA4:
ParseMode = parse_mode::trackball_key;
break;
default: default:
if (ParseMode == parse_mode::regular_key) if (ParseMode == parse_mode::regular_key)
{ {
@ -156,14 +230,29 @@ void loop() {
{ {
parseSpecialKey(v); 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; break;
} }
Serial.println(v, BIN); //Serial.println(v, BIN);
Serial.println(v, DEC); //Serial.println(v, HEX);
time_since_last_key = millis();
} }
else else
{ {
Keyboard.releaseAll(); detect_key_release();
} }
delay(20);
} }