Analog move: not blocking handler
This commit is contained in:
parent
5375443e6f
commit
a9377f1639
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user