2019-12-12 14:01:05 +01:00
|
|
|
// Drivers
|
|
|
|
#include <SPI.h>
|
|
|
|
|
|
|
|
// SPI USB
|
|
|
|
#include <hidboot.h>
|
|
|
|
|
2019-12-12 18:28:35 +01:00
|
|
|
#define SPI_SCLK 32
|
|
|
|
#define SPI_MISO 35
|
|
|
|
#define SPI_MOSI 33
|
|
|
|
#define SPI_SS 5
|
2019-12-12 14:01:05 +01:00
|
|
|
|
2019-12-12 18:20:33 +01:00
|
|
|
#define PIN_MOUSE_V 19 // LAN_TX0
|
|
|
|
#define PIN_MOUSE_VQ 26 // LAN_RX1
|
|
|
|
#define PIN_MOUSE_H 27 // LAN_CRS
|
|
|
|
#define PIN_MOUSE_HQ 23 // LAN_MDC
|
|
|
|
#define PIN_MOUSE_LBTN 21 // LAN_TXEN
|
|
|
|
#define PIN_MOUSE_MBTN 25 // LAN_RX0
|
|
|
|
#define PIN_MOUSE_RBTN 17 // LAN_CLK
|
|
|
|
|
|
|
|
#define MOUSE_SCALE_MAX 63
|
2019-12-12 18:22:22 +01:00
|
|
|
#define MOUSE_PULSE_DELAY 70
|
2019-12-12 18:20:33 +01:00
|
|
|
|
|
|
|
const byte mouseStates[4][2] = {
|
|
|
|
{0, 0},
|
|
|
|
{0, 1},
|
|
|
|
{1, 1},
|
|
|
|
{1, 0}
|
|
|
|
};
|
|
|
|
|
2019-12-12 14:01:05 +01:00
|
|
|
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);
|
2019-12-12 18:20:33 +01:00
|
|
|
void OnMiddleButtonUp (MOUSEINFO *mi);
|
2019-12-12 14:01:05 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void MouseRptParser::OnRightButtonUp (MOUSEINFO *mi)
|
|
|
|
{
|
2019-12-12 18:20:33 +01:00
|
|
|
digitalWrite(PIN_MOUSE_RBTN, HIGH);
|
2019-12-12 14:01:05 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
void MouseRptParser::OnRightButtonDown (MOUSEINFO *mi)
|
|
|
|
{
|
2019-12-12 18:20:33 +01:00
|
|
|
digitalWrite(PIN_MOUSE_RBTN, LOW);
|
2019-12-12 14:01:05 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
void MouseRptParser::OnLeftButtonDown (MOUSEINFO *mi)
|
|
|
|
{
|
2019-12-12 18:20:33 +01:00
|
|
|
digitalWrite(PIN_MOUSE_LBTN, LOW);
|
2019-12-12 14:01:05 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
void MouseRptParser::OnLeftButtonUp (MOUSEINFO *mi)
|
|
|
|
{
|
2019-12-12 18:20:33 +01:00
|
|
|
digitalWrite(PIN_MOUSE_LBTN, HIGH);
|
2019-12-12 14:01:05 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
void MouseRptParser::OnMiddleButtonDown (MOUSEINFO *mi)
|
|
|
|
{
|
2019-12-12 18:20:33 +01:00
|
|
|
digitalWrite(PIN_MOUSE_MBTN, LOW);
|
2019-12-12 14:01:05 +01:00
|
|
|
};
|
|
|
|
|
2019-12-12 18:20:33 +01:00
|
|
|
void MouseRptParser::OnMiddleButtonUp (MOUSEINFO *mi)
|
|
|
|
{
|
|
|
|
digitalWrite(PIN_MOUSE_MBTN, HIGH);
|
2019-12-12 14:01:05 +01:00
|
|
|
};
|
|
|
|
|
2019-12-12 18:20:33 +01:00
|
|
|
|
2019-12-12 14:01:05 +01:00
|
|
|
bool mouseYworking = false;
|
|
|
|
int mouseYTableIndex = 0;
|
|
|
|
void amigaYpulse(int8_t count) {
|
|
|
|
if (count == 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (mouseYworking)
|
|
|
|
return;
|
|
|
|
|
|
|
|
mouseYworking = true;
|
2019-12-12 18:20:33 +01:00
|
|
|
byte mapped = map(abs(count), 0, 127, 1, MOUSE_SCALE_MAX);
|
2019-12-12 14:01:05 +01:00
|
|
|
for (byte i = 0; i < mapped; i++)
|
|
|
|
{
|
|
|
|
if (count < 0) {
|
|
|
|
mouseYTableIndex++;
|
|
|
|
|
|
|
|
if (mouseYTableIndex > 3) {
|
|
|
|
mouseYTableIndex = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
mouseYTableIndex--;
|
|
|
|
|
2019-12-12 18:21:41 +01:00
|
|
|
if (mouseYTableIndex < 0) {
|
2019-12-12 14:01:05 +01:00
|
|
|
mouseYTableIndex = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
digitalWrite(13, mouseStates[mouseYTableIndex][0]);
|
|
|
|
digitalWrite(14, mouseStates[mouseYTableIndex][1]);
|
2019-12-12 18:22:22 +01:00
|
|
|
delayMicroseconds(MOUSE_PULSE_DELAY);
|
2019-12-12 14:01:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
mouseYworking = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
int mouseXTableIndex = 0;
|
|
|
|
void amigaXpulse(int8_t count) {
|
|
|
|
if (count == 0)
|
|
|
|
return;
|
|
|
|
|
2019-12-12 18:20:33 +01:00
|
|
|
for (byte i = 0; i < map(abs(count), 0, 127, 1, MOUSE_SCALE_MAX); i++)
|
2019-12-12 14:01:05 +01:00
|
|
|
{
|
|
|
|
if (count < 0) {
|
|
|
|
mouseXTableIndex++;
|
|
|
|
|
|
|
|
if (mouseXTableIndex > 3) {
|
|
|
|
mouseXTableIndex = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
mouseXTableIndex--;
|
|
|
|
|
2019-12-12 18:21:41 +01:00
|
|
|
if (mouseXTableIndex < 0) {
|
2019-12-12 14:01:05 +01:00
|
|
|
mouseXTableIndex = 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
digitalWrite(15, mouseStates[mouseXTableIndex][0]);
|
|
|
|
digitalWrite(12, mouseStates[mouseXTableIndex][1]);
|
2019-12-12 18:22:22 +01:00
|
|
|
delayMicroseconds(MOUSE_PULSE_DELAY);
|
2019-12-12 14:01:05 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
2019-12-12 18:25:30 +01:00
|
|
|
void setupAnalogMouse() {
|
|
|
|
pinMode(PIN_MOUSE_V, OUTPUT);
|
|
|
|
pinMode(PIN_MOUSE_VQ, OUTPUT);
|
2019-12-12 14:01:05 +01:00
|
|
|
|
2019-12-12 18:25:30 +01:00
|
|
|
pinMode(PIN_MOUSE_H, OUTPUT);
|
|
|
|
pinMode(PIN_MOUSE_HQ, OUTPUT);
|
2019-12-12 14:01:05 +01:00
|
|
|
|
2019-12-12 18:25:30 +01:00
|
|
|
pinMode(PIN_MOUSE_LBTN, OUTPUT);
|
|
|
|
pinMode(PIN_MOUSE_MBTN, OUTPUT);
|
|
|
|
pinMode(PIN_MOUSE_RBTN, OUTPUT);
|
2019-12-12 14:01:05 +01:00
|
|
|
|
2019-12-12 18:25:30 +01:00
|
|
|
// Default button state is not pressed
|
|
|
|
digitalWrite(PIN_MOUSE_LBTN, HIGH);
|
|
|
|
digitalWrite(PIN_MOUSE_MBTN, HIGH);
|
|
|
|
digitalWrite(PIN_MOUSE_RBTN, HIGH);
|
2019-12-12 14:01:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void setup() {
|
|
|
|
// put your setup code here, to run once:
|
|
|
|
Serial.begin(115200);
|
|
|
|
Serial.println("INIT");
|
|
|
|
|
|
|
|
Serial.print("USB init...");
|
2019-12-12 18:28:35 +01:00
|
|
|
SPI.begin(SPI_SCLK, SPI_MISO, SPI_MOSI, SPI_SS);
|
2019-12-12 14:01:05 +01:00
|
|
|
|
|
|
|
if (Usb.Init() == -1) {
|
|
|
|
Serial.println("WARN: Usb init failed.");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Serial.println(" DONE");
|
|
|
|
}
|
|
|
|
|
2019-12-12 18:25:30 +01:00
|
|
|
setupAnalogMouse();
|
2019-12-12 14:01:05 +01:00
|
|
|
|
|
|
|
HidMouse.SetReportParser(0, &PrsMouse);
|
|
|
|
|
|
|
|
Serial.println("Ready to rock and roll...");
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop() {
|
|
|
|
Usb.Task();
|
|
|
|
}
|