Initial commit, proof-of-concept on Amiga
This commit is contained in:
		
							
								
								
									
										175
									
								
								YAOCMouse.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								YAOCMouse.ino
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,175 @@
 | 
				
			|||||||
 | 
					// Drivers
 | 
				
			||||||
 | 
					#include <SPI.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SPI USB
 | 
				
			||||||
 | 
					#include <hidboot.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MouseRptParser : public MouseReportParser
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  protected:
 | 
				
			||||||
 | 
					    void OnMouseMove  (MOUSEINFO *mi);
 | 
				
			||||||
 | 
					    void OnRightButtonUp  (MOUSEINFO *mi);
 | 
				
			||||||
 | 
					    void OnRightButtonDown  (MOUSEINFO *mi);
 | 
				
			||||||
 | 
					    void OnLeftButtonDown  (MOUSEINFO *mi);
 | 
				
			||||||
 | 
					    void OnLeftButtonUp  (MOUSEINFO *mi);
 | 
				
			||||||
 | 
					    void OnMiddleButtonDown  (MOUSEINFO *mi);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MouseRptParser::OnRightButtonUp  (MOUSEINFO *mi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MouseRptParser::OnRightButtonDown  (MOUSEINFO *mi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MouseRptParser::OnLeftButtonDown  (MOUSEINFO *mi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  digitalWrite(16, LOW);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MouseRptParser::OnLeftButtonUp  (MOUSEINFO *mi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  digitalWrite(16, HIGH);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MouseRptParser::OnMiddleButtonDown  (MOUSEINFO *mi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					byte mouseStates[4][2] = {
 | 
				
			||||||
 | 
					  {0, 0},
 | 
				
			||||||
 | 
					  {0, 1},
 | 
				
			||||||
 | 
					  {1, 1},
 | 
				
			||||||
 | 
					  {1, 0}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool mouseYworking = false;
 | 
				
			||||||
 | 
					int mouseYTableIndex = 0;
 | 
				
			||||||
 | 
					void amigaYpulse(int8_t count) {
 | 
				
			||||||
 | 
					  if (count == 0)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mouseYworking)
 | 
				
			||||||
 | 
					    return; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mouseYworking = true;
 | 
				
			||||||
 | 
					  byte mapped = map(abs(count), 0, 127, 1, 63);
 | 
				
			||||||
 | 
					  for (byte i = 0; i < mapped; i++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (count < 0) {
 | 
				
			||||||
 | 
					      mouseYTableIndex++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (mouseYTableIndex > 3) {
 | 
				
			||||||
 | 
					        mouseYTableIndex = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      mouseYTableIndex--;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (mouseYTableIndex == -1) {
 | 
				
			||||||
 | 
					        mouseYTableIndex = 3;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    digitalWrite(13, mouseStates[mouseYTableIndex][0]);
 | 
				
			||||||
 | 
					    digitalWrite(14, mouseStates[mouseYTableIndex][1]);
 | 
				
			||||||
 | 
					    delayMicroseconds(70);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mouseYworking = false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int mouseXTableIndex = 0;
 | 
				
			||||||
 | 
					void amigaXpulse(int8_t count) {
 | 
				
			||||||
 | 
					  if (count == 0)
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (byte i = 0; i < map(abs(count), 0, 127, 1, 63); i++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if (count < 0) {
 | 
				
			||||||
 | 
					      mouseXTableIndex++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (mouseXTableIndex > 3) {
 | 
				
			||||||
 | 
					        mouseXTableIndex = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      mouseXTableIndex--;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (mouseXTableIndex == -1) {
 | 
				
			||||||
 | 
					        mouseXTableIndex = 3;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    digitalWrite(15, mouseStates[mouseXTableIndex][0]);
 | 
				
			||||||
 | 
					    digitalWrite(12, mouseStates[mouseXTableIndex][1]);
 | 
				
			||||||
 | 
					    delayMicroseconds(70);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void MouseRptParser::OnMouseMove(MOUSEINFO *mi)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  amigaYpulse(mi->dY);
 | 
				
			||||||
 | 
					  amigaXpulse(mi->dX);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This is only for single USB device (without HUB)
 | 
				
			||||||
 | 
					// In this example we support keyboard or mouse
 | 
				
			||||||
 | 
					USB     Usb;
 | 
				
			||||||
 | 
					HIDBoot<USB_HID_PROTOCOL_MOUSE>       HidMouse(&Usb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MouseRptParser PrsMouse;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void setupAmigaMouse() {
 | 
				
			||||||
 | 
					  pinMode(14, OUTPUT); //Y
 | 
				
			||||||
 | 
					  pinMode(13, OUTPUT); //QY
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinMode(15, OUTPUT); //X
 | 
				
			||||||
 | 
					  pinMode(12, OUTPUT); //QX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinMode(16, OUTPUT); //Button L
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  digitalWrite(14, LOW);
 | 
				
			||||||
 | 
					  digitalWrite(13, LOW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  digitalWrite(15, LOW);
 | 
				
			||||||
 | 
					  digitalWrite(12, LOW);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  digitalWrite(16, HIGH);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void setup() {
 | 
				
			||||||
 | 
					  // put your setup code here, to run once:
 | 
				
			||||||
 | 
					  Serial.begin(115200);
 | 
				
			||||||
 | 
					  Serial.println("INIT");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Serial.print("USB init...");
 | 
				
			||||||
 | 
					  SPI.begin(32, 35, 33, 5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Usb.Init() == -1) {
 | 
				
			||||||
 | 
					    Serial.println("WARN: Usb init failed.");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else {
 | 
				
			||||||
 | 
					    Serial.println(" DONE");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setupAmigaMouse();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  HidMouse.SetReportParser(0, &PrsMouse);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Serial.print("Interupts init...");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Serial.println("Ready to rock and roll...");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void loop() {
 | 
				
			||||||
 | 
					  Usb.Task();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user