Analog move: not blocking handler
This commit is contained in:
		
							
								
								
									
										100
									
								
								YAOCMouse.ino
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								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();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user