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 <Mouse.h>
#include <SoftwareSerial.h>
// 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);
}