From e3c9f0b219618a72741ef168fd0b8b4bbcb5f629 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 27 Jan 2024 20:11:53 +0200 Subject: [PATCH] [Qt] Implement circlepad --- include/panda_qt/main_window.hpp | 19 ++++++++++++++++++- src/panda_qt/main_window.cpp | 23 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/include/panda_qt/main_window.hpp b/include/panda_qt/main_window.hpp index f7757d73..9be065cf 100644 --- a/include/panda_qt/main_window.hpp +++ b/include/panda_qt/main_window.hpp @@ -30,7 +30,20 @@ class MainWindow : public QMainWindow { private: // Types of messages we might send from the GUI thread to the emulator thread - enum class MessageType { LoadROM, Reset, Pause, Resume, TogglePause, DumpRomFS, PressKey, ReleaseKey, LoadLuaScript, EditCheat }; + enum class MessageType { + LoadROM, + Reset, + Pause, + Resume, + TogglePause, + DumpRomFS, + PressKey, + ReleaseKey, + SetCirclePadX, + SetCirclePadY, + LoadLuaScript, + EditCheat, + }; // Tagged union representing our message queue messages struct EmulatorMessage { @@ -45,6 +58,10 @@ class MainWindow : public QMainWindow { u32 key; } key; + struct { + s16 value; + } circlepad; + struct { std::string* str; } string; diff --git a/src/panda_qt/main_window.cpp b/src/panda_qt/main_window.cpp index d1f86173..e603b780 100644 --- a/src/panda_qt/main_window.cpp +++ b/src/panda_qt/main_window.cpp @@ -276,6 +276,8 @@ void MainWindow::dispatchMessage(const EmulatorMessage& message) { case MessageType::Reset: emu->reset(Emulator::ReloadOption::Reload); break; case MessageType::PressKey: emu->getServiceManager().getHID().pressKey(message.key.key); break; case MessageType::ReleaseKey: emu->getServiceManager().getHID().releaseKey(message.key.key); break; + case MessageType::SetCirclePadX: emu->getServiceManager().getHID().setCirclepadX(message.circlepad.value); break; + case MessageType::SetCirclePadY: emu->getServiceManager().getHID().setCirclepadY(message.circlepad.value); break; } } @@ -283,7 +285,12 @@ void MainWindow::keyPressEvent(QKeyEvent* event) { auto pressKey = [this](u32 key) { EmulatorMessage message{.type = MessageType::PressKey}; message.key.key = key; + sendMessage(message); + }; + auto setCirclePad = [this](MessageType type, s16 value) { + EmulatorMessage message{.type = type}; + message.circlepad.value = value; sendMessage(message); }; @@ -296,6 +303,11 @@ void MainWindow::keyPressEvent(QKeyEvent* event) { case Qt::Key_Q: pressKey(HID::Keys::L); break; case Qt::Key_P: pressKey(HID::Keys::R); break; + case Qt::Key_W: setCirclePad(MessageType::SetCirclePadY, 0x9C); break; + case Qt::Key_A: setCirclePad(MessageType::SetCirclePadX, -0x9C); break; + case Qt::Key_S: setCirclePad(MessageType::SetCirclePadY, -0x9C); break; + case Qt::Key_D: setCirclePad(MessageType::SetCirclePadX, 0x9C); break; + case Qt::Key_Right: pressKey(HID::Keys::Right); break; case Qt::Key_Left: pressKey(HID::Keys::Left); break; case Qt::Key_Up: pressKey(HID::Keys::Up); break; @@ -312,7 +324,12 @@ void MainWindow::keyReleaseEvent(QKeyEvent* event) { auto releaseKey = [this](u32 key) { EmulatorMessage message{.type = MessageType::ReleaseKey}; message.key.key = key; + sendMessage(message); + }; + auto releaseCirclePad = [this](MessageType type) { + EmulatorMessage message{.type = type}; + message.circlepad.value = 0; sendMessage(message); }; @@ -325,6 +342,12 @@ void MainWindow::keyReleaseEvent(QKeyEvent* event) { case Qt::Key_Q: releaseKey(HID::Keys::L); break; case Qt::Key_P: releaseKey(HID::Keys::R); break; + case Qt::Key_W: + case Qt::Key_S: releaseCirclePad(MessageType::SetCirclePadY); break; + + case Qt::Key_A: + case Qt::Key_D: releaseCirclePad(MessageType::SetCirclePadX); break; + case Qt::Key_Right: releaseKey(HID::Keys::Right); break; case Qt::Key_Left: releaseKey(HID::Keys::Left); break; case Qt::Key_Up: releaseKey(HID::Keys::Up); break;