From d516e39ce821cb00c7d0d41eaf17621c56283d3e Mon Sep 17 00:00:00 2001 From: Ryzee119 Date: Sun, 7 Mar 2021 08:58:03 +1030 Subject: [PATCH] XBOX360: Add RF module support --- Firmware/platformio.ini | 2 + Firmware/src/lib/XBOXRF/xboxrf.c | 67 ++++++++++++++++++++++++++++++++ Firmware/src/lib/XBOXRF/xboxrf.h | 16 ++++++++ Firmware/src/main.cpp | 6 +++ 4 files changed, 91 insertions(+) create mode 100644 Firmware/src/lib/XBOXRF/xboxrf.c create mode 100644 Firmware/src/lib/XBOXRF/xboxrf.h diff --git a/Firmware/platformio.ini b/Firmware/platformio.ini index 97c7e253..bbb940a2 100644 --- a/Firmware/platformio.ini +++ b/Firmware/platformio.ini @@ -21,6 +21,7 @@ src_filter = + + + + + lib_deps = Wire, SPI @@ -30,6 +31,7 @@ build_flags = -Wall -Isrc/lib/UHS -Isrc/lib/LUFA + -Isrc/lib/XBOXRF [env:MASTER_360WLESS_360W_STEELBATTALION] build_flags = diff --git a/Firmware/src/lib/XBOXRF/xboxrf.c b/Firmware/src/lib/XBOXRF/xboxrf.c new file mode 100644 index 00000000..748987d9 --- /dev/null +++ b/Firmware/src/lib/XBOXRF/xboxrf.c @@ -0,0 +1,67 @@ +#include + +int8_t cmd_boot[10] = {0, 0, 1, 0, 0, 0, 0, 1, 0, 1}; //Init and show boot anim +int8_t cmd_sync[10] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0}; //Sync +int8_t cmd_greenled[10] = {0, 0, 1, 0, 1, 1, 0, 0, 0, 0}; //Set green LEDs, Lowest 4 bits controller quadrant +int8_t cmd_redled[10] = {0, 0, 1, 0, 1, 0, 0, 0, 0, 0}; //Set red LEDs, Lowest 4 bits controller quadrant + +static int8_t _data_pin = -1; +static int8_t _clock_pin = -1; +static int8_t _connected[4] = {0, 0, 0, 0}; + +static void rf360_send(int8_t *cmd) +{ + if (_data_pin == -1) + return; + + if (_clock_pin == -1) + return; + + pinMode(_data_pin, OUTPUT); + digitalWrite(_data_pin, LOW); + //Bitbang serial out + int prev = 1; + for (int i = 0; i < 10; i++) + { + digitalWrite(LED_BUILTIN, HIGH); + while (prev == digitalRead(_clock_pin)) + ; + prev = digitalRead(_clock_pin); + digitalWrite(_data_pin, cmd[i]); + while (prev == digitalRead(_clock_pin)) + ; + prev = digitalRead(_clock_pin); + digitalWrite(LED_BUILTIN, LOW); + } + digitalWrite(_data_pin, HIGH); + pinMode(_data_pin, INPUT); +} + +void rf360_init(int data_pin, int clock_pin) +{ + _data_pin = data_pin; + _clock_pin = clock_pin; + pinMode(_data_pin, INPUT); + pinMode(_clock_pin, INPUT); + //Required on boot + rf360_send(cmd_boot); + //Send sync commannd every boot (FIXME?) + rf360_send(cmd_sync); +} + +void rf360_updateled(int controller, int8_t connected) +{ + if (controller >= 4) + return; + + //If the connection state of the controller has changed, + //update that LED quadrant accordingly + if (connected != _connected[controller]) + { + int8_t cmd[10]; + memcpy(cmd, cmd_greenled, sizeof(cmd)); + cmd[6 + controller] = (int8_t)connected; + rf360_send(cmd); + _connected[controller] = (connected > 0); + } +} \ No newline at end of file diff --git a/Firmware/src/lib/XBOXRF/xboxrf.h b/Firmware/src/lib/XBOXRF/xboxrf.h new file mode 100644 index 00000000..3e162d45 --- /dev/null +++ b/Firmware/src/lib/XBOXRF/xboxrf.h @@ -0,0 +1,16 @@ +#ifndef XBOXRF_H_ +#define XBOXRF_H_ + +#if defined(__cplusplus) +extern "C" +{ +#endif + +void rf360_init(int data_pin, int clock_pin); +void rf360_updateled(int controller, int8_t connected); + +#if defined(__cplusplus) +} +#endif + +#endif /* XBOXRF_H_ */ \ No newline at end of file diff --git a/Firmware/src/main.cpp b/Firmware/src/main.cpp index b46003b3..e08d1aeb 100644 --- a/Firmware/src/main.cpp +++ b/Firmware/src/main.cpp @@ -26,6 +26,7 @@ In settings.h you can configure the following options: #include "xiddevice.h" #include "Wire.h" #include "EEPROM.h" +#include "xboxrf.h" #ifdef MASTER #include @@ -193,6 +194,9 @@ int main(void) Xbox360Wireless.chatPadLedQueue[i][3] = 0xFF; Xbox360Wireless.chatPadInitNeeded[i] = 1; } + + //Init Xbox360 RF module + rf360_init(4 /*data pin*/, 5 /*clock pin*/); #endif #ifdef SUPPORTBATTALION @@ -783,6 +787,8 @@ int main(void) Wire.endTransmission(true); } } + + rf360_updateled(i, controllerConnected(i)); } //End master for loop //Handle Player 1 controller connect/disconnect events.