#include "buttons.h"
#include "Joystick.h"
#include "Streaming.h"
#define INVERT == HIGH ? LOW : HIGH
#define TEXT == HIGH ? "high" : "low"
namespace Controller {
/// pins
#define STEER_X A0
#define ACCEL 10
#define ANY 7 // used for A in gamepad mode, and x in button mode (a accel)````
#define BRAKE 8
#ifdef GAMEPAD_USE_BUTTONS
#define PAD_B 1
#define PAD_X 2
#endif
#ifdef MODE_STEERING_WHEEL
Joystick_ Gamepad(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_MULTI_AXIS, 16, 1, false, false, true, false, false,
true, false, false, true, true, true);
#elif defined(MODE_GAMEPAD)
#define PAD_A 0
Joystick_ Gamepad(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 10, 0, true, true, true, true, true, true,
false, false, false, false, false);
#endif
void begin() {
pinMode(STEER_X, INPUT);
pinMode(ACCEL, INPUT_PULLUP);
pinMode(BRAKE, INPUT_PULLUP);
pinMode(ANY, INPUT_PULLUP);
Gamepad.begin();
#ifdef MODE_STEERING_WHEEL
Gamepad.setBrakeRange(0, 1);
Gamepad.setSteering(1023 / 2);
Gamepad.setSteeringRange(0, 1);
#elif defined(MODE_GAMEPAD)
Gamepad.setRzAxisRange(0, 1);
Gamepad.setXAxis(1023 / 2);
Gamepad.setYAxis(1023 / 2);
#ifdef GAMEPAD_USE_TRIGGERS
Gamepad.setZAxisRange(0, 1);
#endif
#endif
}
void any() {
static uint8_t last_any = LOW;
uint8_t new_any = digitalRead(ANY) INVERT;
if (new_any != last_any) {
Serial << "ANY set to " << (new_any TEXT) << endl;
last_any = new_any;
#ifdef GAMEPAD_USE_BUTTONS
Gamepad.setButton(PAD_X, new_any);
#else
Gamepad.setButton(PAD_A, new_any);
#endif
}
}
void accel() {
static uint8_t last_accel_value = LOW; // my pot broke so were back to digital
uint8_t new_accel = digitalRead(ACCEL) INVERT;
if (new_accel != last_accel_value) {
Serial << "ACCEL set to " << (new_accel TEXT) << endl;
last_accel_value = new_accel;
#ifdef MODE_GAMEPAD
#ifdef GAMEPAD_USE_BUTTONS
Gamepad.setButton(PAD_A, new_accel);
#elif defined(GAMEPAD_USE_TRIGGERS)
Gamepad.setRzAxis(new_accel);
#endif
#elif defined(MODE_STEERING_WHEEL)
Gamepad.setAccelerator(new_accel);
#endif
}
}
/// @brief still a button
void brake() {
static uint8_t last_brake_value = LOW; // still digital
uint8_t new_brake = digitalRead(BRAKE) INVERT;
if (new_brake != last_brake_value) {
Serial << "BRAKE set to " << (new_brake TEXT) << endl;
last_brake_value = new_brake;
#ifdef MODE_GAMEPAD
#ifdef GAMEPAD_USE_BUTTONS
Gamepad.setButton(PAD_B, new_brake);
#elif defined(GAMEPAD_USE_TRIGGERS)
Gamepad.setZAxis(new_brake); // if this becomes pot, remember to change this
#endif
#elif defined(MODE_STEERING_WHEEL)
Gamepad.setBrake(new_brake);
#endif
}
}
void x() {
static uint16_t last_x_value = 1023 / 2;
uint16_t new_x = analogRead(STEER_X);
if (new_x != last_x_value) {
// Serial << "X set to " << new_x << endl;
last_x_value = new_x;
#ifdef MODE_GAMEPAD
Gamepad.setXAxis(new_x);
#elif defined(MODE_STEERING_WHEEL)
Gamepad.setSteering(new_x);
#endif
}
}
void send() {
x();
any();
accel();
brake();
}
} // namespace Controller