diff --git a/include/httpserver.hpp b/include/httpserver.hpp index 0526045a..8e01cce7 100644 --- a/include/httpserver.hpp +++ b/include/httpserver.hpp @@ -1,7 +1,9 @@ #ifdef PANDA3DS_ENABLE_HTTP_SERVER #pragma once +#include <array> #include <atomic> +#include <map> #include <mutex> #include "helpers.hpp" @@ -16,7 +18,19 @@ struct HttpServer { std::mutex actionMutex = {}; u32 pendingKey = 0; + HttpServer(); + void startHttpServer(); + std::string status(); + +private: + std::map<std::string, std::pair<u32, bool>> keyMap; + std::array<bool, 12> pressedKeys = {}; + bool paused = false; + + u32 stringToKey(const std::string& key_name); + bool getKeyState(const std::string& key_name); + void setKeyState(const std::string& key_name, bool state); }; #endif // PANDA3DS_ENABLE_HTTP_SERVER \ No newline at end of file diff --git a/src/httpserver.cpp b/src/httpserver.cpp index fa7ad763..6ae7af66 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -2,41 +2,30 @@ #include "httpserver.hpp" #include <fstream> -#include <map> #include <string> #include <thread> #include <vector> +#include <sstream> #include "httplib.h" #include "services/hid.hpp" -u32 stringToKey(const std::string& key_name) { - namespace Keys = HID::Keys; - static std::map<std::string, u32> keyMap = { - {"A", Keys::A}, - {"B", Keys::B}, - {"Select", Keys::Select}, - {"Start", Keys::Start}, - {"Right", Keys::Right}, - {"Left", Keys::Left}, - {"Up", Keys::Up}, - {"Down", Keys::Down}, - {"R", Keys::R}, - {"L", Keys::L}, - {"X", Keys::X}, - {"Y", Keys::Y}, - {"CirclePadRight", Keys::CirclePadRight}, - {"CirclePadLeft", Keys::CirclePadLeft}, - {"CirclePadUp", Keys::CirclePadUp}, - {"CirclePadDown", Keys::CirclePadDown}, - }; - - if (keyMap.find(key_name) != keyMap.end()) { - return keyMap[key_name]; +HttpServer::HttpServer() : keyMap( + { + {"A", { HID::Keys::A, false } }, + {"B", { HID::Keys::B, false } }, + {"Select", { HID::Keys::Select, false } }, + {"Start", { HID::Keys::Start, false } }, + {"Right", { HID::Keys::Right, false } }, + {"Left", { HID::Keys::Left, false } }, + {"Up", { HID::Keys::Up, false } }, + {"Down", { HID::Keys::Down, false } }, + {"R", { HID::Keys::R, false } }, + {"L", { HID::Keys::L, false } }, + {"X", { HID::Keys::X, false } }, + {"Y", { HID::Keys::Y, false } }, } - - return 0; -} +) {} void HttpServer::startHttpServer() { std::thread http_thread([this]() { @@ -70,8 +59,10 @@ void HttpServer::startHttpServer() { ok = true; if (value == "1") { action = HttpAction::PressKey; + setKeyState(keyStr, true); } else if (value == "0") { action = HttpAction::ReleaseKey; + setKeyState(keyStr, false); } else { // Should not happen but just in case pendingAction = false; @@ -92,6 +83,10 @@ void HttpServer::startHttpServer() { response.set_content("ok", "text/plain"); }); + server.Get("/status", [this](const httplib::Request&, httplib::Response& response) { + response.set_content(status(), "text/plain"); + }); + // TODO: ability to specify host and port printf("Starting HTTP server on port 1234\n"); server.listen("localhost", 1234); @@ -100,4 +95,38 @@ void HttpServer::startHttpServer() { http_thread.detach(); } +std::string HttpServer::status() { + std::stringstream stringStream; + + stringStream << "Panda3DS\n"; + stringStream << "Status: " << (paused ? "Paused" : "Running") << "\n"; + for (auto& [keyStr, value] : keyMap) { + stringStream << keyStr << ": " << value.second << "\n"; + } + + return stringStream.str(); +} + +u32 HttpServer::stringToKey(const std::string& key_name) { + if (keyMap.find(key_name) != keyMap.end()) { + return keyMap[key_name].first; + } + + return 0; +} + +bool HttpServer::getKeyState(const std::string& key_name) { + if (keyMap.find(key_name) != keyMap.end()) { + return keyMap[key_name].second; + } + + return false; +} + +void HttpServer::setKeyState(const std::string& key_name, bool state) { + if (keyMap.find(key_name) != keyMap.end()) { + keyMap[key_name].second = state; + } +} + #endif // PANDA3DS_ENABLE_HTTP_SERVER \ No newline at end of file