#include #include #include #include #include #include #include #include #include WUPS_MODULE_NAME("HID to VPAD lite"); WUPS_MODULE_VERSION("v1.0"); WUPS_MODULE_AUTHOR("Maschell"); WUPS_MODULE_LICENSE("GPL"); INITIALIZE(){ InitOSFunctionPointers(); InitSocketFunctionPointers(); InitVPadFunctionPointers(); InitProcUIFunctionPointers(); log_init(); log_print("Init of hid_to_vpad!\n"); ControllerPatcher::Init(NULL); ControllerPatcher::disableControllerMapping(); log_print("Start network server\n"); ControllerPatcher::startNetworkServer(); } DECL_FUNCTION(void, __PPCExit, void){ ControllerPatcher::resetCallbackData(); ControllerPatcher::DeInit(); ControllerPatcher::stopNetworkServer(); real___PPCExit(); } DECL_FUNCTION(s32, VPADRead, s32 chan, VPADData *buffer, u32 buffer_size, s32 *error) { s32 result = real_VPADRead(chan, buffer, buffer_size, error); //A keyboard only sends data when the state changes. We force it to call the sampling callback on each frame! ControllerPatcher::sampleKeyboardData(); bool do_callback = (result > 0 && (buffer[0].btns_h & VPAD_BUTTON_TV)); ControllerPatcher::handleCallbackData(do_callback); if(ControllerPatcher::areControllersConnected() && buffer_size > 0){ ControllerPatcher::setRumble(UController_Type_Gamepad,!!VPADBASEGetMotorOnRemainingCount(0)); if(ControllerPatcher::setControllerDataFromHID(buffer) == CONTROLLER_PATCHER_ERROR_NONE){ if(buffer[0].btns_h & VPAD_BUTTON_HOME){ //You can open the home menu this way, but not close it. Need a proper way to close it using the same button... //OSSendAppSwitchRequest(5,0,0); //Open the home menu! } if(error != NULL){ *error = 0; } result = 1; // We want the WiiU to ignore everything else. } } if(ControllerPatcher::isButtonRemappingDone()){ ControllerPatcher::buttonRemapping(buffer,result); //ControllerPatcher::printVPADButtons(buffer); //Leads to random crashes on app transitions. } return result; } WUPS_MUST_REPLACE(VPADRead, WUPS_LOADER_LIBRARY_VPAD, VPADRead); WUPS_MUST_REPLACE(__PPCExit, WUPS_LOADER_LIBRARY_COREINIT, __PPCExit);