/**************************************************************************** * Copyright (C) 2015 Dimok * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ #ifndef WPAD_CONTROLLER_H_ #define WPAD_CONTROLLER_H_ #include #include #include class WPadController : public GuiController { public: //!Constructor WPadController(int32_t channel) : GuiController(channel) { memset(&kpadData, 0, sizeof(kpadData)); } //!Destructor virtual ~WPadController() {} uint32_t remapWiiMoteButtons(uint32_t buttons) { uint32_t conv_buttons = 0; if(buttons & WPAD_BUTTON_LEFT) conv_buttons |= GuiTrigger::BUTTON_LEFT; if(buttons & WPAD_BUTTON_RIGHT) conv_buttons |= GuiTrigger::BUTTON_RIGHT; if(buttons & WPAD_BUTTON_DOWN) conv_buttons |= GuiTrigger::BUTTON_DOWN; if(buttons & WPAD_BUTTON_UP) conv_buttons |= GuiTrigger::BUTTON_UP; if(buttons & WPAD_BUTTON_PLUS) conv_buttons |= GuiTrigger::BUTTON_PLUS; if(buttons & WPAD_BUTTON_2) conv_buttons |= GuiTrigger::BUTTON_2; if(buttons & WPAD_BUTTON_1) conv_buttons |= GuiTrigger::BUTTON_1; if(buttons & WPAD_BUTTON_B) conv_buttons |= GuiTrigger::BUTTON_B; if(buttons & WPAD_BUTTON_A) conv_buttons |= GuiTrigger::BUTTON_A; if(buttons & WPAD_BUTTON_MINUS) conv_buttons |= GuiTrigger::BUTTON_MINUS; if(buttons & WPAD_BUTTON_Z) conv_buttons |= GuiTrigger::BUTTON_Z; if(buttons & WPAD_BUTTON_C) conv_buttons |= GuiTrigger::BUTTON_C; if(buttons & WPAD_BUTTON_HOME) conv_buttons |= GuiTrigger::BUTTON_HOME; return conv_buttons; } uint32_t remapClassicButtons(uint32_t buttons) { uint32_t conv_buttons = 0; if(buttons & WPAD_CLASSIC_BUTTON_LEFT) conv_buttons |= GuiTrigger::BUTTON_LEFT; if(buttons & WPAD_CLASSIC_BUTTON_RIGHT) conv_buttons |= GuiTrigger::BUTTON_RIGHT; if(buttons & WPAD_CLASSIC_BUTTON_DOWN) conv_buttons |= GuiTrigger::BUTTON_DOWN; if(buttons & WPAD_CLASSIC_BUTTON_UP) conv_buttons |= GuiTrigger::BUTTON_UP; if(buttons & WPAD_CLASSIC_BUTTON_PLUS) conv_buttons |= GuiTrigger::BUTTON_PLUS; if(buttons & WPAD_CLASSIC_BUTTON_X) conv_buttons |= GuiTrigger::BUTTON_X; if(buttons & WPAD_CLASSIC_BUTTON_Y) conv_buttons |= GuiTrigger::BUTTON_Y; if(buttons & WPAD_CLASSIC_BUTTON_B) conv_buttons |= GuiTrigger::BUTTON_B; if(buttons & WPAD_CLASSIC_BUTTON_A) conv_buttons |= GuiTrigger::BUTTON_A; if(buttons & WPAD_CLASSIC_BUTTON_MINUS) conv_buttons |= GuiTrigger::BUTTON_MINUS; if(buttons & WPAD_CLASSIC_BUTTON_HOME) conv_buttons |= GuiTrigger::BUTTON_HOME; if(buttons & WPAD_CLASSIC_BUTTON_ZR) conv_buttons |= GuiTrigger::BUTTON_ZR; if(buttons & WPAD_CLASSIC_BUTTON_ZL) conv_buttons |= GuiTrigger::BUTTON_ZL; if(buttons & WPAD_CLASSIC_BUTTON_R) conv_buttons |= GuiTrigger::BUTTON_R; if(buttons & WPAD_CLASSIC_BUTTON_L) conv_buttons |= GuiTrigger::BUTTON_L; return conv_buttons; } WPADChan getChanByInt(int32_t chan) { if(chan == 0) { return WPAD_CHAN_0; } if(chan == 1) { return WPAD_CHAN_1; } if(chan == 2) { return WPAD_CHAN_3; } if(chan == 3) { return WPAD_CHAN_3; } return WPAD_CHAN_0; } bool update(int32_t width, int32_t height) { lastData = data; WPADExtensionType controller_type; //! check if the controller is connected if(WPADProbe(getChanByInt(chanIdx-1), &controller_type) != 0) return false; KPADRead(getChanByInt(chanIdx-1), &kpadData, 1); if(kpadData.extensionType <= 1) { data.buttons_r = remapWiiMoteButtons(kpadData.release); data.buttons_h = remapWiiMoteButtons(kpadData.hold); data.buttons_d = remapWiiMoteButtons(kpadData.trigger); } else { data.buttons_r = remapClassicButtons(kpadData.classic.release); data.buttons_h = remapClassicButtons(kpadData.classic.hold); data.buttons_d = remapClassicButtons(kpadData.classic.trigger); } data.validPointer = (kpadData.posValid == 1 || kpadData.posValid == 2) && (kpadData.pos.x >= -1.0f && kpadData.pos.x <= 1.0f) && (kpadData.pos.y >= -1.0f && kpadData.pos.y <= 1.0f); //! calculate the screen offsets if pointer is valid else leave old value if(data.validPointer) { data.x = (width >> 1) * kpadData.pos.x; data.y = (height >> 1) * (-kpadData.pos.y); if(kpadData.angle.y > 0.0f) data.pointerAngle = (-kpadData.angle.x + 1.0f) * 0.5f * 180.0f; else data.pointerAngle = (kpadData.angle.x + 1.0f) * 0.5f * 180.0f - 180.0f; } return true; } private: KPADStatus kpadData; uint32_t lastButtons; }; #endif