diff --git a/YAOCMouse.ino b/YAOCMouse.ino index 778225e..61fcf1d 100644 --- a/YAOCMouse.ino +++ b/YAOCMouse.ino @@ -27,6 +27,12 @@ const byte mouseStates[4][2] = { {1, 0} }; +uint64_t lastHandleMicros = 0; +int8_t Xchange = 0; +int8_t Ychange = 0; +byte Xdir = 0; +byte Ydir = 0; + class MouseRptParser : public MouseReportParser { protected: @@ -78,7 +84,7 @@ void amigaYpulse(int8_t count) { return; if (mouseYworking) - return; + return; mouseYworking = true; byte mapped = map(abs(count), 0, 127, 1, MOUSE_SCALE_MAX); @@ -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) { - amigaYpulse(mi->dY); - amigaXpulse(mi->dX); + //amigaYpulse(mi->dY); + //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() { Usb.Task(); + handleAnalogMove(); }