59 lines
1.7 KiB
C++
59 lines
1.7 KiB
C++
#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 4
|
|
#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
|