Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Firmware/platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ src_filter =
+<lib/LUFA/LUFA/Drivers/USB/Class/Common/*.c>
+<lib/LUFA/LUFA/Drivers/USB/Class/Device/*.c>
+<lib/UHS/*.cpp>
+<lib/XBOXRF/*.c>

lib_deps = Wire, SPI

Expand All @@ -30,6 +31,7 @@ build_flags =
-Wall
-Isrc/lib/UHS
-Isrc/lib/LUFA
-Isrc/lib/XBOXRF

[env:MASTER_360WLESS_360W_STEELBATTALION]
build_flags =
Expand Down
67 changes: 67 additions & 0 deletions Firmware/src/lib/XBOXRF/xboxrf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <Arduino.h>

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);
}
}
16 changes: 16 additions & 0 deletions Firmware/src/lib/XBOXRF/xboxrf.h
Original file line number Diff line number Diff line change
@@ -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_ */
6 changes: 6 additions & 0 deletions Firmware/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <XBOXRECV.h>
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down