OpenRetroPad/src/gamepad/UsbRadio-Gamepad/UsbRadioGamepad.h

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