mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-11 08:39:48 +12:00
Bonk http server
This commit is contained in:
parent
3a21661f45
commit
67a08a71f6
3 changed files with 25 additions and 35 deletions
|
@ -18,7 +18,7 @@ class Emulator;
|
|||
namespace httplib {
|
||||
class Server;
|
||||
class Response;
|
||||
} // namespace httplib
|
||||
}
|
||||
|
||||
// Wrapper for httplib::Response that allows the HTTP server to wait for the response to be ready
|
||||
struct DeferredResponseWrapper {
|
||||
|
@ -32,6 +32,8 @@ struct DeferredResponseWrapper {
|
|||
|
||||
// Actions derive from this class and are used to communicate with the HTTP server
|
||||
class HttpAction {
|
||||
HttpActionType type;
|
||||
|
||||
public:
|
||||
HttpAction(HttpActionType type) : type(type) {}
|
||||
virtual ~HttpAction() = default;
|
||||
|
@ -40,22 +42,17 @@ class HttpAction {
|
|||
|
||||
static std::unique_ptr<HttpAction> createScreenshotAction(DeferredResponseWrapper& response);
|
||||
static std::unique_ptr<HttpAction> createKeyAction(uint32_t key, bool state);
|
||||
|
||||
private:
|
||||
HttpActionType type;
|
||||
};
|
||||
|
||||
struct HttpServer {
|
||||
HttpServer(Emulator* emulator);
|
||||
~HttpServer();
|
||||
|
||||
void processActions();
|
||||
|
||||
private:
|
||||
static constexpr const char* httpServerScreenshotPath = "screenshot.png";
|
||||
|
||||
Emulator* emulator;
|
||||
|
||||
std::unique_ptr<httplib::Server> server;
|
||||
|
||||
std::thread httpServerThread;
|
||||
|
|
|
@ -90,11 +90,10 @@ class HIDService {
|
|||
|
||||
void pressKey(u32 mask) { newButtons |= mask; }
|
||||
void releaseKey(u32 mask) { newButtons &= ~mask; }
|
||||
bool isPressed(u32 mask) { return (oldButtons & mask) != 0; }
|
||||
|
||||
u32 getOldButtons() { return oldButtons; }
|
||||
s16 getCirclepadX() { return circlePadX; }
|
||||
s16 getCirclepadY() { return circlePadY; }
|
||||
u32 getOldButtons() const { return oldButtons; }
|
||||
s16 getCirclepadX() const { return circlePadX; }
|
||||
s16 getCirclepadY() const { return circlePadY; }
|
||||
|
||||
void setCirclepadX(s16 x) {
|
||||
circlePadX = x;
|
||||
|
|
|
@ -8,35 +8,33 @@
|
|||
#include <vector>
|
||||
|
||||
#include "emulator.hpp"
|
||||
#include "helpers.hpp"
|
||||
#include "httplib.h"
|
||||
|
||||
class HttpActionScreenshot : public HttpAction {
|
||||
DeferredResponseWrapper& response;
|
||||
|
||||
public:
|
||||
HttpActionScreenshot(DeferredResponseWrapper& response) : HttpAction(HttpActionType::Screenshot), response(response) {}
|
||||
|
||||
DeferredResponseWrapper& getResponse() { return response; }
|
||||
|
||||
private:
|
||||
DeferredResponseWrapper& response;
|
||||
};
|
||||
|
||||
class HttpActionKey : public HttpAction {
|
||||
public:
|
||||
HttpActionKey(uint32_t key, bool state) : HttpAction(HttpActionType::Key), key(key), state(state) {}
|
||||
|
||||
uint32_t getKey() const { return key; }
|
||||
bool getState() const { return state; }
|
||||
|
||||
private:
|
||||
uint32_t key;
|
||||
u32 key;
|
||||
bool state;
|
||||
|
||||
public:
|
||||
HttpActionKey(u32 key, bool state) : HttpAction(HttpActionType::Key), key(key), state(state) {}
|
||||
|
||||
u32 getKey() const { return key; }
|
||||
bool getState() const { return state; }
|
||||
};
|
||||
|
||||
std::unique_ptr<HttpAction> HttpAction::createScreenshotAction(DeferredResponseWrapper& response) {
|
||||
return std::make_unique<HttpActionScreenshot>(response);
|
||||
}
|
||||
|
||||
std::unique_ptr<HttpAction> HttpAction::createKeyAction(uint32_t key, bool state) { return std::make_unique<HttpActionKey>(key, state); }
|
||||
std::unique_ptr<HttpAction> HttpAction::createKeyAction(u32 key, bool state) { return std::make_unique<HttpActionKey>(key, state); }
|
||||
|
||||
HttpServer::HttpServer(Emulator* emulator)
|
||||
: emulator(emulator), server(std::make_unique<httplib::Server>()), keyMap({
|
||||
|
@ -86,8 +84,7 @@ void HttpServer::startHttpServer() {
|
|||
u32 key = stringToKey(keyStr);
|
||||
|
||||
if (key != 0) {
|
||||
bool state = value == "1";
|
||||
|
||||
bool state = (value == "1");
|
||||
if (!state && value != "0") {
|
||||
// Invalid state
|
||||
ok = false;
|
||||
|
@ -103,11 +100,7 @@ void HttpServer::startHttpServer() {
|
|||
}
|
||||
}
|
||||
|
||||
if (ok) {
|
||||
response.set_content("ok", "text/plain");
|
||||
} else {
|
||||
response.set_content("error", "text/plain");
|
||||
}
|
||||
response.set_content(ok ? "ok" : "error", "text/plain");
|
||||
});
|
||||
|
||||
server->Get("/step", [this](const httplib::Request&, httplib::Response& response) {
|
||||
|
@ -124,14 +117,15 @@ void HttpServer::startHttpServer() {
|
|||
|
||||
std::string HttpServer::status() {
|
||||
HIDService& hid = emulator->kernel.getServiceManager().getHID();
|
||||
|
||||
std::stringstream stringStream;
|
||||
|
||||
stringStream << "Panda3DS\n";
|
||||
stringStream << "Status: " << (paused ? "Paused" : "Running") << "\n";
|
||||
|
||||
// TODO: This currently doesn't work for N3DS buttons
|
||||
auto keyPressed = [](const HIDService& hid, u32 mask) { return (hid.getOldButtons() & mask) != 0; };
|
||||
for (auto& [keyStr, value] : keyMap) {
|
||||
stringStream << keyStr << ": " << hid.isPressed(value) << "\n";
|
||||
stringStream << keyStr << ": " << keyPressed(hid, value) << "\n";
|
||||
}
|
||||
|
||||
return stringStream.str();
|
||||
|
@ -160,6 +154,7 @@ void HttpServer::processActions() {
|
|||
response.cv.notify_one();
|
||||
break;
|
||||
}
|
||||
|
||||
case HttpActionType::Key: {
|
||||
HttpActionKey* keyAction = static_cast<HttpActionKey*>(action.get());
|
||||
if (keyAction->getState()) {
|
||||
|
@ -169,9 +164,8 @@ void HttpServer::processActions() {
|
|||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue