30#include <SoftwareSerial.h>
50using namespace gamepad::input;
57constexpr uint8_t kDebugSerialRxPin = 6;
58constexpr uint8_t kDebugSerialTxPin = 5;
62const String kBluetoothDeviceAddress =
"16:00:00:00:03:05";
67constexpr uint32_t kBluetoothModuleSerialBaudRate = 115200;
75SoftwareSerial g_debug_serial(kDebugSerialRxPin, kDebugSerialTxPin);
98void Connect(Stream &bluetooth_stream,
const String &bluetooth_device_address) {
99 if (bluetooth_device_address.length() != 17 || bluetooth_device_address[2] !=
':' || bluetooth_device_address[5] !=
':' ||
100 bluetooth_device_address[8] !=
':' || bluetooth_device_address[11] !=
':' || bluetooth_device_address[14] !=
':') {
101 g_debug_serial.println(
"Error: Invalid MAC address format. Expected: XX:XX:XX:XX:XX:XX");
105 g_debug_serial.print(
"Start to connect ");
106 g_debug_serial.println(kBluetoothDeviceAddress);
111 bluetooth_stream.println(
"AT+DISCON");
116 bluetooth_stream.println(
"AT+RESET");
121 bluetooth_stream.println(
"AT+ECHO=0");
126 bluetooth_stream.println(
"AT+ROLE=0");
131 bluetooth_stream.println(
"AT+AUTOCON=0");
136 bluetooth_stream.print(
"AT+CON=");
137 bluetooth_stream.println(bluetooth_device_address);
140 g_debug_serial.println(
"Connected");
145 g_debug_serial.begin(115200);
147 Serial.begin(kBluetoothModuleSerialBaudRate);
149 Connect(Serial, kBluetoothDeviceAddress);
174 const Tracker &it = g_decoder.Update();
189 static uint32_t s_print_time = 0;
190 if (s_print_time != 0 && s_print_time + 30 > millis()) {
194 s_print_time = millis();
206 g_debug_serial.print(
"Up:");
207 g_debug_serial.print(it[Button::kUp]);
208 g_debug_serial.print(
", ");
209 g_debug_serial.print(
"Down:");
210 g_debug_serial.print(it[Button::kDown]);
211 g_debug_serial.print(
", ");
212 g_debug_serial.print(
"Left:");
213 g_debug_serial.print(it[Button::kLeft]);
214 g_debug_serial.print(
", ");
215 g_debug_serial.print(
"Right:");
216 g_debug_serial.print(it[Button::kRight]);
217 g_debug_serial.print(
", ");
218 g_debug_serial.print(
"Square(X):");
219 g_debug_serial.print(it[Button::kSquareX]);
220 g_debug_serial.print(
", ");
221 g_debug_serial.print(
"Triangle(Y):");
222 g_debug_serial.print(it[Button::kTriangleY]);
223 g_debug_serial.print(
", ");
224 g_debug_serial.print(
"Cross(A):");
225 g_debug_serial.print(it[Button::kCrossA]);
226 g_debug_serial.print(
", ");
227 g_debug_serial.print(
"Circle(B):");
228 g_debug_serial.print(it[Button::kCircleB]);
229 g_debug_serial.print(
", ");
230 g_debug_serial.print(
"L1:");
231 g_debug_serial.print(it[Button::kL1]);
232 g_debug_serial.print(
", ");
233 g_debug_serial.print(
"L2:");
234 g_debug_serial.print(it[Button::kL2]);
235 g_debug_serial.print(
", ");
236 g_debug_serial.print(
"L3:");
237 g_debug_serial.print(it[Button::kL3]);
238 g_debug_serial.print(
", ");
239 g_debug_serial.print(
"R1:");
240 g_debug_serial.print(it[Button::kR1]);
241 g_debug_serial.print(
", ");
242 g_debug_serial.print(
"R2:");
243 g_debug_serial.print(it[Button::kR2]);
244 g_debug_serial.print(
", ");
245 g_debug_serial.print(
"R3:");
246 g_debug_serial.print(it[Button::kR3]);
247 g_debug_serial.print(
", ");
248 g_debug_serial.print(
"Select:");
249 g_debug_serial.print(it[Button::kSelect]);
250 g_debug_serial.print(
", ");
251 g_debug_serial.print(
"Start:");
252 g_debug_serial.print(it[Button::kStart]);
253 g_debug_serial.print(
", ");
254 g_debug_serial.print(
"Home:");
255 g_debug_serial.print(it[Button::kHome]);
256 g_debug_serial.print(
", ");
268 g_debug_serial.print(
"L(X:");
269 g_debug_serial.print(it[Axis::kLeftStickX]);
270 g_debug_serial.print(
", Y:");
271 g_debug_serial.print(it[Axis::kLeftStickY]);
272 g_debug_serial.print(
"), R(X:");
273 g_debug_serial.print(it[Axis::kRightStickX]);
274 g_debug_serial.print(
", Y:");
275 g_debug_serial.print(it[Axis::kRightStickY]);
276 g_debug_serial.println(
")");
Decoder class responsible for parsing gamepad input frames from a byte stream and updating the state ...