diff --git a/source/ControllerLib/ControllerTypes.h b/source/ControllerLib/ControllerTypes.h index 36d7094..371d6a2 100644 --- a/source/ControllerLib/ControllerTypes.h +++ b/source/ControllerLib/ControllerTypes.h @@ -15,6 +15,7 @@ enum VendorIDs : uint16_t { VENDOR_MICROSOFT = 0x45e, VENDOR_SONY = 0x54c, + VENDOR_HORI = 0xf0d, }; enum ProductIDs : uint16_t @@ -29,6 +30,8 @@ enum ProductIDs : uint16_t PRODUCT_DUALSHOCK3 = 0x268, PRODUCT_DUALSHOCK4_1X = 0x5c4, PRODUCT_DUALSHOCK4_2X = 0x9cc, + + PRODUCT_HORI_PS4_TATACON = 0xc9, }; enum ControllerSupport : uint8_t diff --git a/source/Sysmodule/source/mainLoop.cpp b/source/Sysmodule/source/mainLoop.cpp index f2cfcad..5409512 100644 --- a/source/Sysmodule/source/mainLoop.cpp +++ b/source/Sysmodule/source/mainLoop.cpp @@ -82,6 +82,16 @@ Result CreateDualshock4AvailableEvent(Event &out) return rc; } +Result CreateHoriPs4TataconAvailableEvent(Event &out) +{ + g_filter = {}; + g_filter.Flags = UsbHsInterfaceFilterFlags_idVendor | UsbHsInterfaceFilterFlags_idProduct; + g_filter.idVendor = VENDOR_HORI; + g_filter.idProduct = PRODUCT_HORI_PS4_TATACON; + Result rc = usbHsCreateInterfaceAvailableEvent(&out, true, DS4EVENT_INDEX, &g_filter); + return rc; +} + Result CreateAllAvailableEvent(Event &out) { g_filter = {}; @@ -121,18 +131,22 @@ Result QueryVendorProduct(UsbHsInterface *interfaces, size_t interfaces_size, s3 Event catchAllEvent; Event ds3Event; Event ds4Event; +Event horiPs4TataconEvent; Result inline OpenEvents() { Result rc = CreateAllAvailableEvent(catchAllEvent); if (R_FAILED(rc)) - return 3; + return 4; rc = CreateDualshck3AvailableEvent(ds3Event); if (R_FAILED(rc)) return 1; rc = CreateDualshock4AvailableEvent(ds4Event); if (R_FAILED(rc)) return 2; + rc = CreateHoriPs4TataconAvailableEvent(horiPs4TataconEvent); + if (R_FAILED(rc)) + return 3; return 0; } @@ -141,7 +155,9 @@ void inline CloseEvents() { usbHsDestroyInterfaceAvailableEvent(&ds3Event, DS3EVENT_INDEX); usbHsDestroyInterfaceAvailableEvent(&ds4Event, DS4EVENT_INDEX); + usbHsDestroyInterfaceAvailableEvent(&horiPs4TataconEvent, DS4EVENT_INDEX); usbHsDestroyInterfaceAvailableEvent(&catchAllEvent, ALLEVENT_INDEX); + } struct PSCLoopBuffer @@ -222,6 +238,12 @@ void CheckForInterfaces() controllerPtr = std::make_unique(std::make_unique(interfaces, total_entries)); WriteToLog("Registered DS4 controller"); } + else if (R_SUCCEEDED(QueryVendorProduct(interfaces, sizeof(interfaces), &total_entries, VENDOR_HORI, PRODUCT_HORI_PS4_TATACON))) + { + controllerPtr = std::make_unique(std::make_unique(interfaces, total_entries)); + WriteToLog("Registered HORI PS4 Tatacon controller"); + } + CallInitHandler(controllerPtr); } }