arduino stuffs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "buttons.h"
#include "Joystick.h"
// #include "Streaming.h"

namespace Controller {
/// vars
unsigned int last_x_value = 1023 / 2;
unsigned int last_accel_value = 0;
unsigned int last_brake_value = LOW; // still digital

/// pins
#define STEER_X A0
#define ACCEL A1
#define BRAKE 8

#ifdef GAMEPAD_USE_BUTTONS
#define PAD_A 0
#define PAD_B 1
#endif

#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, true, 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, true, false, false, false, false,
                  false, false, false, false, false);
#endif
#endif

void begin() {
  pinMode(STEER_X, INPUT);
  pinMode(ACCEL, INPUT);
  pinMode(BRAKE, INPUT_PULLUP);
  Gamepad.begin();
#ifdef MODE_STEERING_WHEEL
  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.setZAxisRange(0, 1);
#endif
#endif
}

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_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() {
  unsigned int new_x = analogRead(STEER_X);
  if (new_x != last_x_value) {
    last_x_value = new_x;
#ifdef MODE_GAMEPAD
    Gamepad.setXAxis(new_x);
#elif defined(MODE_STEERING_WHEEL)
    Gamepad.setSteering(new_x);
#endif
  }
}

void send() {
  accel();
  brake();
  x();
}

} // namespace Controller