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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#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