From fa6ce2a7f2be80e63f2138818f3491a6850ffaff Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 26 Jul 2023 20:12:36 +0300 Subject: [PATCH] Add new HTTP(anda) commands --- include/emulator.hpp | 1 + include/httpserver.hpp | 4 +++- src/emulator.cpp | 3 ++- src/httpserver.cpp | 25 +++++++++++++++++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/emulator.hpp b/include/emulator.hpp index b6662331..94f88ba7 100644 --- a/include/emulator.hpp +++ b/include/emulator.hpp @@ -92,6 +92,7 @@ class Emulator { void resume(); // Resume the emulator void pause(); // Pause the emulator + void togglePause(); bool loadROM(const std::filesystem::path& path); bool loadNCSD(const std::filesystem::path& path, ROMType type); diff --git a/include/httpserver.hpp b/include/httpserver.hpp index 9d3cb818..7c70be14 100644 --- a/include/httpserver.hpp +++ b/include/httpserver.hpp @@ -12,7 +12,7 @@ #include "helpers.hpp" -enum class HttpActionType { None, Screenshot, Key }; +enum class HttpActionType { None, Screenshot, Key, TogglePause, Reset }; class Emulator; namespace httplib { @@ -42,6 +42,8 @@ class HttpAction { static std::unique_ptr createScreenshotAction(DeferredResponseWrapper& response); static std::unique_ptr createKeyAction(uint32_t key, bool state); + static std::unique_ptr createTogglePauseAction(); + static std::unique_ptr createResetAction(); }; struct HttpServer { diff --git a/src/emulator.cpp b/src/emulator.cpp index c88e1249..cc9bb02f 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -175,7 +175,7 @@ void Emulator::run() { // Use the F4 button as a hot-key to pause or resume the emulator // We can't use the audio play/pause buttons because it's annoying case SDLK_F4: { - running ? pause() : resume(); + togglePause(); break; } @@ -364,6 +364,7 @@ void Emulator::run() { // Only resume if a ROM is properly loaded void Emulator::resume() { running = (romType != ROMType::None); } void Emulator::pause() { running = false; } +void Emulator::togglePause() { running ? pause() : resume(); } void Emulator::runFrame() { if (running) { diff --git a/src/httpserver.cpp b/src/httpserver.cpp index d8841807..d3dc7938 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -19,6 +19,16 @@ class HttpActionScreenshot : public HttpAction { DeferredResponseWrapper& getResponse() { return response; } }; +class HttpActionTogglePause : public HttpAction { + public: + HttpActionTogglePause() : HttpAction(HttpActionType::TogglePause) {} +}; + +class HttpActionReset : public HttpAction { + public: + HttpActionReset() : HttpAction(HttpActionType::Reset) {} +}; + class HttpActionKey : public HttpAction { u32 key; bool state; @@ -35,6 +45,8 @@ std::unique_ptr HttpAction::createScreenshotAction(DeferredResponseW } std::unique_ptr HttpAction::createKeyAction(u32 key, bool state) { return std::make_unique(key, state); } +std::unique_ptr HttpAction::createTogglePauseAction() { return std::make_unique(); } +std::unique_ptr HttpAction::createResetAction() { return std::make_unique(); } HttpServer::HttpServer(Emulator* emulator) : emulator(emulator), server(std::make_unique()), keyMap({ @@ -110,6 +122,16 @@ void HttpServer::startHttpServer() { server->Get("/status", [this](const httplib::Request&, httplib::Response& response) { response.set_content(status(), "text/plain"); }); + server->Get("/togglepause", [this](const httplib::Request&, httplib::Response& response) { + pushAction(HttpAction::createTogglePauseAction()); + response.set_content("ok", "text/plain"); + }); + + server->Get("/reset", [this](const httplib::Request&, httplib::Response& response) { + pushAction(HttpAction::createResetAction()); + response.set_content("ok", "text/plain"); + }); + // TODO: ability to specify host and port printf("Starting HTTP server on port 1234\n"); server->listen("localhost", 1234); @@ -165,6 +187,9 @@ void HttpServer::processActions() { break; } + case HttpActionType::TogglePause: emulator->togglePause(); break; + case HttpActionType::Reset: emulator->reset(Emulator::ReloadOption::Reload); break; + default: break; } }