11 changed files with 134 additions and 28 deletions
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
#ifndef RADIO_USB_GAMEPAD_H |
||||
#define RADIO_USB_GAMEPAD_H |
||||
|
||||
// number of button presses we wait for USB-HID to connect
|
||||
// works within 1 for me but who knows...
|
||||
#ifndef GAMEPAD_USBRADIO_DETECT_BUTTONS |
||||
#define GAMEPAD_USBRADIO_DETECT_BUTTONS 1 |
||||
#endif |
||||
|
||||
#ifndef GAMEPAD_CLASS |
||||
#define GAMEPAD_CLASS UsbRadioGamepad |
||||
#endif |
||||
|
||||
#include "../Radio-Gamepad/RadioGamepad.h" |
||||
#include "../USB-Gamepad/UsbGamepad.h" |
||||
|
||||
class UsbRadioGamepad : public AbstractGamepad { |
||||
public: |
||||
uint8_t checkCount = 0; |
||||
|
||||
AbstractGamepad* gamepad = new UsbGamepad(); |
||||
|
||||
void (UsbRadioGamepad::*syncFunc)(const uint8_t cIdx, const void* d, int len) = &UsbRadioGamepad::syncDetectUsb; |
||||
|
||||
UsbRadioGamepad() : AbstractGamepad() { |
||||
} |
||||
|
||||
virtual void begin(void) { |
||||
gamepad->begin(); |
||||
} |
||||
|
||||
void syncDetectUsb(const uint8_t cIdx, const void* d, int len) { |
||||
if (++checkCount <= GAMEPAD_USBRADIO_DETECT_BUTTONS) { |
||||
if (gamepad->isConnected()) { |
||||
// we are connected to PC/phone/usb-hid-capable-device, stop checking
|
||||
syncFunc = &UsbRadioGamepad::syncNoDetect; |
||||
} else if (checkCount == GAMEPAD_USBRADIO_DETECT_BUTTONS) { |
||||
// we assume we are connected to a power brick or power supply, and switch to radio
|
||||
delete gamepad; |
||||
gamepad = new RadioGamepad(); |
||||
gamepad->begin(); |
||||
// stop trying to detect, it is what it is...
|
||||
syncFunc = &UsbRadioGamepad::syncNoDetect; |
||||
} |
||||
} |
||||
gamepad->sendHidReport(cIdx, &gamepadReport, GAMEPAD_REPORT_LEN); |
||||
} |
||||
|
||||
void syncNoDetect(const uint8_t cIdx, const void* d, int len) { |
||||
gamepad->sendHidReport(cIdx, &gamepadReport, GAMEPAD_REPORT_LEN); |
||||
} |
||||
|
||||
virtual void sendHidReport(const uint8_t cIdx, const void* d, int len) { |
||||
(*this.*syncFunc)(cIdx, &gamepadReport, GAMEPAD_REPORT_LEN); |
||||
} |
||||
}; |
||||
|
||||
#endif // RADIO_GAMEPAD_H
|
Loading…
Reference in new issue