arduino stuffs
-rw-r--r--steer/buttons.cpp82
1 files changed, 47 insertions, 35 deletions
diff --git a/steer/buttons.cpp b/steer/buttons.cpp
index ba25b39..8372941 100644
--- a/steer/buttons.cpp
+++ b/steer/buttons.cpp
@@ -3,18 +3,20 @@
// #include "Streaming.h"
namespace Controller {
+/// vars
unsigned int last_x_value = 1023 / 2;
-uint8_t last_button_states[] = {LOW, LOW};
+unsigned int last_accel_value = 0;
+unsigned int last_brake_value = LOW; // still digital
+
+/// pins
#define STEER_X A0
-#define ACCEL 9
+#define ACCEL A1
#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};
+#define PAD_A 0
+#define PAD_B 1
#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,
@@ -30,57 +32,60 @@ Joystick_ Gamepad(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, 2, 0, true,
#endif
void begin() {
- for (int i = 0; i < button_count; i++)
- pinMode(buttons[i], INPUT_PULLUP);
pinMode(STEER_X, INPUT);
+ pinMode(ACCEL, INPUT);
+ pinMode(BRAKE, INPUT_PULLUP);
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);
Gamepad.setYAxis(1023 / 2);
#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]) {
+inline bool boolify(unsigned int analog) { return analog < (1023 / 2) ? 0 : 1; }
+
+void accel() {
+ unsigned int new_accel = analogRead(ACCEL);
+ if (new_accel != last_accel_value) {
+ last_accel_value = new_accel;
+#ifdef MODE_GAMEPAD
+#ifdef GAMEPAD_USE_BUTTONS
+ Gamepad.setButton(PAD_A, boolify(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() {
+ unsigned int new_brake = digitalRead(BRAKE) == HIGH ? LOW : HIGH;
+ if (new_brake != last_brake_value) {
+ last_brake_value = new_brake;
#ifdef MODE_GAMEPAD
#ifdef GAMEPAD_USE_BUTTONS
- Gamepad.setButton(pad_map[i], state);
+ Gamepad.setButton(PAD_B, new_brake);
#elif defined(GAMEPAD_USE_TRIGGERS)
- switch (buttons[i]) {
- case ACCEL:
- Gamepad.setRzAxis(state);
- break;
- case BRAKE:
- Gamepad.setZAxis(state);
- }
+ Gamepad.setZAxis(new_brake); // if this becomes pot, remember to change this
#endif
#elif defined(MODE_STEERING_WHEEL)
- switch (buttons[i]) {
- case ACCEL:
- Gamepad.setAccelerator(state);
- break;
- case BRAKE:
- Gamepad.setBrake(state);
- break;
- }
+ Gamepad.setBrake(new_brake);
#endif
- last_button_states[i] = state;
- }
}
+}
+void x() {
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) {
+ if (new_x != last_x_value) {
last_x_value = new_x;
#ifdef MODE_GAMEPAD
Gamepad.setXAxis(new_x);
@@ -89,4 +94,11 @@ void send() {
#endif
}
}
+
+void send() {
+ accel();
+ brake();
+ x();
+}
+
} // namespace Controller \ No newline at end of file