78 lines
2.8 KiB
C++
78 lines
2.8 KiB
C++
#include <cstdint>
|
|
|
|
#include "tusb.h"
|
|
#include "host/usbh.h"
|
|
#include "class/hid/hid_host.h"
|
|
|
|
#include "USBHost/HostDriver/XInput/tuh_xinput/tuh_xinput.h"
|
|
#include "USBHost/HostManager.h"
|
|
#include "OGXMini/OGXMini.h"
|
|
|
|
usbh_class_driver_t const* usbh_app_driver_get_cb(uint8_t* driver_count) {
|
|
*driver_count = 1;
|
|
return tuh_xinput::class_driver();
|
|
}
|
|
|
|
//HID
|
|
|
|
void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len) {
|
|
uint16_t vid, pid;
|
|
tuh_vid_pid_get(dev_addr, &vid, &pid);
|
|
|
|
HostManager& host_manager = HostManager::get_instance();
|
|
|
|
if (host_manager.setup_driver(HostManager::get_type({ vid, pid }), dev_addr, instance, desc_report, desc_len)) {
|
|
OGXMini::host_mounted(true);
|
|
}
|
|
}
|
|
|
|
void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) {
|
|
HostManager& host_manager = HostManager::get_instance();
|
|
host_manager.deinit_driver(HostManager::DriverClass::HID, dev_addr, instance);
|
|
|
|
if (!host_manager.any_mounted()) {
|
|
OGXMini::host_mounted(false);
|
|
}
|
|
}
|
|
|
|
void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len) {
|
|
HostManager::get_instance().process_report(dev_addr, instance, report, len);
|
|
}
|
|
|
|
//XINPUT
|
|
|
|
void tuh_xinput::mount_cb(uint8_t dev_addr, uint8_t instance, const tuh_xinput::Interface* interface) {
|
|
HostManager& host_manager = HostManager::get_instance();
|
|
HostDriverType host_type = HostManager::get_type(interface->dev_type);
|
|
|
|
if (host_manager.setup_driver(host_type, dev_addr, instance)) {
|
|
OGXMini::host_mounted(true, host_type);
|
|
}
|
|
}
|
|
|
|
void tuh_xinput::unmount_cb(uint8_t dev_addr, uint8_t instance, const tuh_xinput::Interface* interface) {
|
|
HostManager& host_manager = HostManager::get_instance();
|
|
host_manager.deinit_driver(HostManager::DriverClass::XINPUT, dev_addr, instance);
|
|
|
|
if (!host_manager.any_mounted()) {
|
|
OGXMini::host_mounted(false);
|
|
}
|
|
}
|
|
|
|
void tuh_xinput::report_received_cb(uint8_t dev_addr, uint8_t instance, const uint8_t* report, uint16_t len) {
|
|
HostManager::get_instance().process_report(dev_addr, instance, report, len);
|
|
}
|
|
|
|
void tuh_xinput::xbox360w_connect_cb(uint8_t dev_addr, uint8_t instance) {
|
|
uint8_t idx = HostManager::get_instance().get_gamepad_idx( HostManager::DriverClass::XINPUT,
|
|
dev_addr, instance);
|
|
OGXMini::wireless_connected(true, idx);
|
|
HostManager::get_instance().connect_cb(dev_addr, instance);
|
|
}
|
|
|
|
void tuh_xinput::xbox360w_disconnect_cb(uint8_t dev_addr, uint8_t instance) {
|
|
uint8_t idx = HostManager::get_instance().get_gamepad_idx( HostManager::DriverClass::XINPUT,
|
|
dev_addr, instance);
|
|
OGXMini::wireless_connected(false, idx);
|
|
HostManager::get_instance().disconnect_cb(dev_addr, instance);
|
|
} |