diff --git a/source/mainLoop.cpp b/source/mainLoop.cpp index def1054..cab8232 100644 --- a/source/mainLoop.cpp +++ b/source/mainLoop.cpp @@ -98,7 +98,7 @@ Result mainLoop() WriteToLog("Successfully created catch-all event"); } - controllerInterfaces.reserve(8); + controllerInterfaces.reserve(10); while (appletMainLoop()) { @@ -114,117 +114,121 @@ Result mainLoop() if (R_SUCCEEDED(rc)) { WriteToLog("Catch-all event went off"); - UsbHsInterface interfaces[8]; - s32 total_entries; + if (controllerInterfaces.size() >= 10) + WriteToLog("But the controllers table reached its max size!"); + else + { + UsbHsInterface interfaces[8]; + s32 total_entries; - if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_VENDOR_SPEC, 93, 1))) - { - WriteToLog("Registering Xbox 360 controller"); - devicePtr = std::make_unique(interfaces, total_entries); - controllerPtr = std::make_unique(std::move(devicePtr)); - } - else if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_VENDOR_SPEC, 93, 129))) - { - WriteToLog("Registering Xbox 360 Wireless adapter"); - for (int i = 0; i != total_entries; ++i) + if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_VENDOR_SPEC, 93, 1))) { - devicePtr = std::make_unique(interfaces + i, 1); - controllerPtr = std::make_unique(std::move(devicePtr)); - CallInitHandler(); + WriteToLog("Registering Xbox 360 controller"); + devicePtr = std::make_unique(interfaces, total_entries); + controllerPtr = std::make_unique(std::move(devicePtr)); + } + else if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_VENDOR_SPEC, 93, 129))) + { + WriteToLog("Registering Xbox 360 Wireless adapter"); + for (int i = 0; i != total_entries; ++i) + { + devicePtr = std::make_unique(interfaces + i, 1); + controllerPtr = std::make_unique(std::move(devicePtr)); + CallInitHandler(); + } + } + else if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, 0x58, 0x42, 0x00))) + { + WriteToLog("Registering Xbox One controller"); + devicePtr = std::make_unique(interfaces, total_entries); + controllerPtr = std::make_unique(std::move(devicePtr)); + } + else if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_VENDOR_SPEC, 71, 208))) + { + WriteToLog("Registering Xbox One controller"); + devicePtr = std::make_unique(interfaces, total_entries); + controllerPtr = std::make_unique(std::move(devicePtr)); } } - else if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, 0x58, 0x42, 0x00))) - { - WriteToLog("Registering Xbox One controller"); - devicePtr = std::make_unique(interfaces, total_entries); - controllerPtr = std::make_unique(std::move(devicePtr)); - } - else if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_VENDOR_SPEC, 71, 208))) - { - WriteToLog("Registering Xbox One controller"); - devicePtr = std::make_unique(interfaces, total_entries); - controllerPtr = std::make_unique(std::move(devicePtr)); - } - } - rc = eventWait(&ds3Event, 0); - if (R_SUCCEEDED(rc)) - { - WriteToLog("Dualshock 3 event went off"); - UsbHsInterface interfaces[4]; - s32 total_entries; - - if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_HID, 0, 0))) - { - WriteToLog("Registering DS3 controller"); - devicePtr = std::make_unique(interfaces, total_entries); - controllerPtr = std::make_unique(std::move(devicePtr)); - } - } - CallInitHandler(); - - //On interface change event, check if any devices were removed, and erase them from memory appropriately - rc = eventWait(usbHsGetInterfaceStateChangeEvent(), 0); - if (R_SUCCEEDED(rc)) - { - WriteToLog("Interface state was changed"); - eventClear(usbHsGetInterfaceStateChangeEvent()); - - UsbHsInterface interfaces[4]; - s32 total_entries; - - rc = usbHsQueryAcquiredInterfaces(interfaces, sizeof(interfaces), &total_entries); + rc = eventWait(&ds3Event, 0); if (R_SUCCEEDED(rc)) { - for (auto it = controllerInterfaces.begin(); it != controllerInterfaces.end(); ++it) - { - bool found_flag = false; + WriteToLog("Dualshock 3 event went off"); + UsbHsInterface interfaces[4]; + s32 total_entries; - for (auto &&ptr : (*it)->GetController()->GetDevice()->GetInterfaces()) + if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_HID, 0, 0))) + { + WriteToLog("Registering DS3 controller"); + devicePtr = std::make_unique(interfaces, total_entries); + controllerPtr = std::make_unique(std::move(devicePtr)); + } + } + CallInitHandler(); + + //On interface change event, check if any devices were removed, and erase them from memory appropriately + rc = eventWait(usbHsGetInterfaceStateChangeEvent(), 0); + if (R_SUCCEEDED(rc)) + { + WriteToLog("Interface state was changed"); + eventClear(usbHsGetInterfaceStateChangeEvent()); + + UsbHsInterface interfaces[4]; + s32 total_entries; + + rc = usbHsQueryAcquiredInterfaces(interfaces, sizeof(interfaces), &total_entries); + if (R_SUCCEEDED(rc)) + { + for (auto it = controllerInterfaces.begin(); it != controllerInterfaces.end(); ++it) { - //We check if a device was removed by comparing the controller's interfaces and the currently acquired interfaces - //If we didn't find a single matching interface ID, we consider a controller removed - for (int i = 0; i != total_entries; ++i) + bool found_flag = false; + + for (auto &&ptr : (*it)->GetController()->GetDevice()->GetInterfaces()) { - if (interfaces[i].inf.ID == static_cast(ptr.get())->GetID()) + //We check if a device was removed by comparing the controller's interfaces and the currently acquired interfaces + //If we didn't find a single matching interface ID, we consider a controller removed + for (int i = 0; i != total_entries; ++i) { - found_flag = true; - break; + if (interfaces[i].inf.ID == static_cast(ptr.get())->GetID()) + { + found_flag = true; + break; + } } } - } - if (!found_flag) - { - WriteToLog("Erasing controller! ", (*it)->GetController()->GetType()); - controllerInterfaces.erase(it--); - WriteToLog("Controller erased!"); + if (!found_flag) + { + WriteToLog("Erasing controller! ", (*it)->GetController()->GetType()); + controllerInterfaces.erase(it--); + WriteToLog("Controller erased!"); + } } } } - } - rc = waitSingle(filecheckTimerWaiter, 0); - if (R_SUCCEEDED(rc)) - { - if (CheckForFileChanges()) + rc = waitSingle(filecheckTimerWaiter, 0); + if (R_SUCCEEDED(rc)) { - WriteToLog("File check succeeded! Loading configs..."); - LoadAllConfigs(); + if (CheckForFileChanges()) + { + WriteToLog("File check succeeded! Loading configs..."); + LoadAllConfigs(); + } } - } #ifdef __APPLET__ - consoleUpdate(nullptr); + consoleUpdate(nullptr); #else - svcSleepThread(1e+7L); + svcSleepThread(1e+7L); #endif - } + } - //After we break out of the loop, close all events and exit - WriteToLog("Destroying events"); - usbHsDestroyInterfaceAvailableEvent(&ds3Event, 0); - usbHsDestroyInterfaceAvailableEvent(&catchAllEvent, 1); + //After we break out of the loop, close all events and exit + WriteToLog("Destroying events"); + usbHsDestroyInterfaceAvailableEvent(&ds3Event, 0); + usbHsDestroyInterfaceAvailableEvent(&catchAllEvent, 1); - //controllerInterfaces.clear(); - return rc; -} \ No newline at end of file + //controllerInterfaces.clear(); + return rc; + } \ No newline at end of file