/* * Copyright (c) 2020-2021 ndeadly * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope 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 . */ #include "icade_controller.hpp" #include namespace ams::controller { void ICadeController::UpdateControllerState(const bluetooth::HidReport *report) { auto icade_report = reinterpret_cast(&report->data); if (icade_report->id == 0x01) { for (unsigned int i = 0; i < sizeof(icade_report->input0x01.keys); ++i) { switch (icade_report->input0x01.keys[i]) { case 0x1a: m_buttons.dpad_up = 1; break; // w (joystick up pressed) case 0x08: m_buttons.dpad_up = 0; break; // e (joystick up released) case 0x07: m_buttons.dpad_right = 1; break; // d (joystick right pressed) case 0x06: m_buttons.dpad_right = 0; break; // c (joystick right released) case 0x1b: m_buttons.dpad_down = 1; break; // x (joystick down pressed) case 0x1d: m_buttons.dpad_down = 0; break; // z (joystick down released) case 0x04: m_buttons.dpad_left = 1; break; // a (joystick left pressed) case 0x14: m_buttons.dpad_left = 0; break; // q (joystick left released) case 0x1c: m_buttons.L = 1; break; // y (button 1 pressed) case 0x17: m_buttons.L = 0; break; // t (button 1 released) case 0x18: m_buttons.X = 1; break; // u (button 2 pressed) case 0x09: m_buttons.X = 0; break; // f (button 2 released) case 0x0c: m_buttons.A = 1; break; // i (button 3 pressed) case 0x10: m_buttons.A = 0; break; // m (button 3 released) case 0x12: m_buttons.R = 1; break; // o (button 4 pressed) case 0x0a: m_buttons.R = 0; break; // g (button 4 released) case 0x0b: m_buttons.ZL = 1; break; // h (button 5 pressed) case 0x15: m_buttons.ZL = 0; break; // r (button 5 released) case 0x0d: m_buttons.Y = 1; break; // j (button 6 pressed) case 0x11: m_buttons.Y = 0; break; // n (button 6 released) case 0x0e: m_buttons.B = 1; break; // k (button 7 pressed) case 0x13: m_buttons.B = 0; break; // p (button 7 released) case 0x0f: m_buttons.ZR = 1; break; // l (button 8 pressed) case 0x19: m_buttons.ZR = 0; break; // v (button 8 released) default: break; } ++i; } } } void ICadeController::ApplyButtonCombos(SwitchButtonData *buttons) { // Combo for minus button if (buttons->ZL && buttons->ZR && buttons->L) { buttons->minus = 1; buttons->ZL = 0; buttons->ZR = 0; buttons->L = 0; } // Combo for plus button if (buttons->ZL && buttons->ZR && buttons->R) { buttons->plus = 1; buttons->ZL = 0; buttons->ZR = 0; buttons->R = 0; } EmulatedSwitchController::ApplyButtonCombos(buttons); } }