99 lines
2.2 KiB
C++
99 lines
2.2 KiB
C++
/* We use the Joystick library from:
|
|
<https://github.com/MHeironimus/ArduinoJoystickLibrary> */
|
|
#include <Joystick.h>
|
|
#include <Mouse.h>
|
|
#define DELAY 5
|
|
|
|
const int sw_pin = 2;
|
|
const int vrx_pin = A0;
|
|
const int vry_pin = A1;
|
|
|
|
// UP, RIGHT, DOWN, LEFT, additional left, additional right
|
|
const int btn_count = 6;
|
|
const int btn_pins[] = { 3,4,5,6,7,8 };
|
|
|
|
const int base_x = 512;
|
|
const int base_y = 519;
|
|
|
|
const int max_x = 1023;
|
|
const int max_y = 1023;
|
|
|
|
|
|
|
|
const int rng = 500;
|
|
|
|
|
|
int mouse_mode = 0;
|
|
int prev_readings[btn_count];
|
|
|
|
|
|
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
|
|
JOYSTICK_TYPE_GAMEPAD,
|
|
btn_count, // buttons
|
|
1, // joystick hat switches
|
|
true, // X axis
|
|
true, // Y axis
|
|
false, // Z axis
|
|
false, false, false, false, false, false, false, false);
|
|
|
|
void setup() {
|
|
pinMode(sw_pin, INPUT);
|
|
for (int i = 0; i < btn_count; i++) {
|
|
pinMode(btn_pins[i], INPUT);
|
|
prev_readings[i] = 0;
|
|
}
|
|
Mouse.begin();
|
|
Joystick.begin();
|
|
Joystick.setXAxisRange(-rng, rng);
|
|
Joystick.setYAxisRange(-rng, rng);
|
|
}
|
|
|
|
int prev_clicked = 0;
|
|
int get_clicked() {
|
|
int signal = !digitalRead(sw_pin);
|
|
int ret = (signal && signal != prev_clicked) ? 1 : 0;
|
|
prev_clicked = signal;
|
|
return ret;
|
|
}
|
|
|
|
int read_direction(int analog_pin, int base, int max, int rng) {
|
|
int signal = analogRead(analog_pin);
|
|
if (signal > base) {
|
|
return map (signal, base, max, 0, rng);
|
|
} else if (signal < base) {
|
|
return - map (signal, base, 0, 1, rng);
|
|
} else { return 0; }
|
|
}
|
|
|
|
void loop() {
|
|
/*int click = get_clicked();
|
|
if (click) {
|
|
Mouse.click();}*/
|
|
|
|
for (int i = 0; i < btn_count; i++) {
|
|
int pin = btn_pins[i];
|
|
int signal = digitalRead(pin);
|
|
if (signal != prev_readings[i]) {
|
|
Joystick.setButton(i, signal);
|
|
}
|
|
prev_readings[i] = signal;
|
|
}
|
|
|
|
// Analogue input
|
|
int dirx = -read_direction(vrx_pin, base_x, max_x, rng);
|
|
int diry = read_direction(vry_pin, base_y, max_y, rng);
|
|
if (mouse_mode) {
|
|
if (diry != 0) {
|
|
Mouse.move(0, diry, 0);
|
|
}
|
|
if (dirx != 0) {
|
|
Mouse.move(dirx, 0, 0);
|
|
}
|
|
} else {
|
|
Joystick.setXAxis (dirx);
|
|
Joystick.setYAxis (diry);
|
|
}
|
|
|
|
delay(DELAY);
|
|
}
|