arduino stuffs
Diffstat (limited to 'steer/buttons.cpp')
-rw-r--r--steer/buttons.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/steer/buttons.cpp b/steer/buttons.cpp
new file mode 100644
index 0000000..756412e
--- /dev/null
+++ b/steer/buttons.cpp
@@ -0,0 +1,91 @@
+#include "buttons.h"
+#include "Joystick.h"
+// #include "Streaming.h"
+
+namespace Controller {
+unsigned int last_x_value = 1023 / 2;
+uint8_t last_button_states[] = {LOW, LOW};
+#define STEER_X A0
+#define ACCEL 9
+#define BRAKE 8
+constexpr uint8_t buttons[] = {ACCEL, BRAKE};
+#ifdef GAMEPAD_USE_BUTTONS
+#define A 0
+#define B 1
+constexpr uint8_t pad_map[] = {A, B};
+#endif
+constexpr uint8_t button_count = sizeof(buttons);
+
+#ifdef MODE_STEERING_WHEEL
+Joystick_ Gamepad(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_MULTI_AXIS, 0, 0, false, false, false, false, false,
+ false, false, false, true, true, true);
+#elif defined(MODE_GAMEPAD)
+#ifdef GAMEPAD_USE_TRIGGERS
+Joystick_ Gamepad(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 0, 0, true, false, true, false, false, true,
+ false, false, false, false, false);
+#elif defined(GAMEPAD_USE_BUTTONS)
+Joystick_ Gamepad(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 2, 0, true, false, false, false, false, false,
+ false, false, false, false, false);
+#endif
+#endif
+
+void begin() {
+ for (int i = 0; i < button_count; i++)
+ pinMode(buttons[i], INPUT_PULLUP);
+ pinMode(STEER_X, INPUT);
+ Gamepad.begin();
+#ifdef MODE_STEERING_WHEEL
+ Gamepad.setAcceleratorRange(0, 1);
+ Gamepad.setBrakeRange(0, 1);
+ Gamepad.setSteering(last_x_value);
+#elif defined(MODE_GAMEPAD)
+ Gamepad.setXAxis(last_x_value);
+#ifdef GAMEPAD_USE_TRIGGERS
+ Gamepad.setRzAxisRange(0, 1);
+ Gamepad.setZAxisRange(0, 1);
+#endif
+#endif
+}
+
+void send() {
+ for (int i = 0; i < button_count; i++) {
+ uint8_t state = digitalRead(buttons[i]) == LOW ? HIGH : LOW;
+ if (state != last_button_states[i]) {
+#ifdef MODE_GAMEPAD
+#ifdef GAMEPAD_USE_BUTTONS
+ Gamepad.setButton(pad_map[i], state);
+#elif defined(GAMEPAD_USE_TRIGGERS)
+ switch (buttons[i]) {
+ case ACCEL:
+ Gamepad.setRzAxis(state);
+ break;
+ case BRAKE:
+ Gamepad.setZAxis(state);
+ }
+#endif
+#elif defined(MODE_STEERING_WHEEL)
+ switch (buttons[i]) {
+ case ACCEL:
+ Gamepad.setAccelerator(state);
+ break;
+ case BRAKE:
+ Gamepad.setBrake(state);
+ break;
+ }
+#endif
+ last_button_states[i] = state;
+ }
+ }
+
+ unsigned int new_x = analogRead(STEER_X);
+#define DEADZONE 1 // if the change is only by one unit, dont bother
+ if (new_x - last_x_value > DEADZONE || new_x - last_x_value < DEADZONE) {
+ last_x_value = new_x;
+#ifdef MODE_GAMEPAD
+ Gamepad.setXAxis(new_x);
+#elif defined(MODE_STEERING_WHEEL)
+ Gamepad.setSteering(new_x);
+#endif
+ }
+}
+} // namespace Controller \ No newline at end of file