Analog move: not blocking handler

This commit is contained in:
Petr Kracík 2019-12-17 20:00:51 +01:00
parent 5375443e6f
commit a9377f1639

View File

@ -27,6 +27,12 @@ const byte mouseStates[4][2] = {
{1, 0} {1, 0}
}; };
uint64_t lastHandleMicros = 0;
int8_t Xchange = 0;
int8_t Ychange = 0;
byte Xdir = 0;
byte Ydir = 0;
class MouseRptParser : public MouseReportParser class MouseRptParser : public MouseReportParser
{ {
protected: protected:
@ -135,10 +141,97 @@ void amigaXpulse(int8_t count) {
} }
} }
void processXTableIndex(bool dir) {
if (dir) {
mouseXTableIndex++;
if (mouseXTableIndex > 3) {
mouseXTableIndex = 0;
}
}
else {
mouseXTableIndex--;
if (mouseXTableIndex < 0) {
mouseXTableIndex = 3;
}
}
}
void processYTableIndex(bool dir) {
if (dir) {
mouseYTableIndex++;
if (mouseYTableIndex > 3) {
mouseYTableIndex = 0;
}
}
else {
mouseYTableIndex--;
if (mouseYTableIndex < 0) {
mouseYTableIndex = 3;
}
}
}
void writeAnalogPorts() {
digitalWrite(PIN_MOUSE_H, mouseStates[mouseXTableIndex][0]);
digitalWrite(PIN_MOUSE_HQ, mouseStates[mouseXTableIndex][1]);
digitalWrite(PIN_MOUSE_V, mouseStates[mouseYTableIndex][0]);
digitalWrite(PIN_MOUSE_VQ, mouseStates[mouseYTableIndex][1]);
}
void handleAnalogMove() {
// Do nothing if no change
if ((Xchange == 0) && (Ychange == 0)) {
return;
}
if (lastHandleMicros + MOUSE_PULSE_DELAY > micros()) {
return;
}
if (Xchange > 0) {
processXTableIndex(Xdir);
Xchange--;
}
if (Ychange > 0) {
processYTableIndex(Ydir);
Ychange--;
}
writeAnalogPorts();
lastHandleMicros = micros();
}
void MouseRptParser::OnMouseMove(MOUSEINFO *mi) void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
{ {
amigaYpulse(mi->dY); //amigaYpulse(mi->dY);
amigaXpulse(mi->dX); //amigaXpulse(mi->dX);
//return;
if ((Xchange != 0) || (Ychange != 0)) {
Serial.println("Too FAST");
Serial.print("X: ");
Serial.println(Xchange);
Serial.print("Y: ");
Serial.println(Ychange);
}
if (mi->dX != 0) {
Xchange += map(abs(mi->dX), 0, 127, 1, MOUSE_SCALE_MAX);
}
if (mi->dY != 0) {
Ychange += map(abs(mi->dY), 0, 127, 1, MOUSE_SCALE_MAX);
}
Xdir = mi->dX < 0 ? true : false;
Ydir = mi->dY < 0 ? true : false;
}; };
@ -192,4 +285,5 @@ void setup() {
void loop() { void loop() {
Usb.Task(); Usb.Task();
handleAnalogMove();
} }