Mode, Server: fire, move

This commit is contained in:
Patrick Haßel 2024-12-27 14:02:13 +01:00
parent 7539dbb7b0
commit 9ea1eddd57
4 changed files with 190 additions and 18 deletions

View File

@ -38,6 +38,18 @@ void setMode(ModeId value) {
config_set_dirty();
}
void modeMove(int index, int x, int y) {
if (mode != nullptr) {
mode->move(index, x, y);
}
}
void modeFire(int index) {
if (mode != nullptr) {
mode->fire(index);
}
}
void setSpeed(double speed) {
speed = min(max(0.01, speed), 10000.0);
if (config.speed == speed) {

View File

@ -9,4 +9,8 @@ void setMode(ModeId value);
void setSpeed(double speed);
void modeMove(int index, int x, int y);
void modeFire(int index);
#endif

View File

@ -94,6 +94,14 @@ public:
virtual const char *getName() = 0;
virtual void move(int index, int x, int y) {
//
};
virtual void fire(int index) {
//
};
void loop(microseconds_t microseconds) {
handleRealtime();
handleTimers(microseconds);

View File

@ -6,10 +6,50 @@
#include "display.h"
#include "config.h"
static const char *const style = R"(
<style>
body {
font-family: sans-serif;
font-size: 9vw;
margin: 0;
}
button{
width: 33vmin;
height: 33vmin;
font-size: 9vw;
}
table{
border-collapse: collapse;
}
@media(min-width: 1000px) {
body {
font-size: 20px;
margin: 0;
}
}
</style>
)";
static const char *const script = R"(
<script>
function get(path){
var r = new XMLHttpRequest();
r.open("GET", path, true);
r.send();
}
</script>
)";
WebServer server(80);
void web_index();
void web_player();
void web_player_move();
void web_player_fire();
void web_setMode();
void web_brighter();
@ -26,6 +66,9 @@ void web_fps_off();
void server_setup() {
server.on("/", web_index);
server.on("/player", web_player);
server.on("/player/move", web_player_move);
server.on("/player/fire", web_player_fire);
server.on("/mode", web_setMode);
server.on("/brighter", web_brighter);
server.on("/darker", web_darker);
@ -43,24 +86,9 @@ void server_loop() {
void web_index() {
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
server.send(200, "text/html", "");
server.sendContent(R"(<meta http-equiv="Cache-Control" content="store, no-cache, must-revalidate, post-check=0, pre-check=0" />)");
server.sendContent(R"(<meta http-equiv="Pragma" content="no-cache" />)");
server.sendContent(R"(<meta http-equiv="Expires" content="Sun, 1 Jan 1999 00:00:00 GMT" />)");
server.sendContent(R"(
<style>
body {
font-family: sans-serif;
font-size: 9vw;
}
</style>
<script>
function get(path){
var r = new XMLHttpRequest();
r.open("GET", path, true);
r.send();
}
</script>)");
server.sendContent(style);
server.sendContent(script);
server.sendContent(R"(<p>)");
server.sendContent(R"(<a onclick="get('/mode?mode=0');">NONE</a><br>)");
server.sendContent(R"(<a onclick="get('/mode?mode=1');">BORDER</a><br>)");
server.sendContent(R"(<a onclick="get('/mode?mode=2');">CLOCK</a><br>)");
@ -74,13 +102,133 @@ function get(path){
server.sendContent(R"(<a onclick="get('/mode?mode=10');">COUNT_DOWN_BARS</a><br>)");
server.sendContent(R"(<a onclick="get('/mode?mode=11');">STARFIELD</a><br>)");
server.sendContent(R"(<a onclick="get('/mode?mode=12');">MATRIX</a><br>)");
server.sendContent(R"(</p>)");
server.sendContent(R"(<p>)");
server.sendContent(R"(<a href="/player?index=0">Player 0</a><br>)");
server.sendContent(R"(<a href="/player?index=1">Player 1</a><br>)");
server.sendContent(R"(</p>)");
server.sendContent(R"(<p>)");
server.sendContent(R"(Helligkeit: <a onclick="get('/brighter');">+</a> / <a onclick="get('/darker');">-</a><br>)");
server.sendContent(R"(Geschwindigkeit: <a onclick="get('/faster');">+</a> / <a onclick="get('/slower');">-</a><br>)");
server.sendContent(R"(FPS: <a onclick="get('/fps/on');">EIN</a> / <a onclick="get('/fps/off');">AUS</a><br>)");
server.sendContent(R"(</p>)");
server.client().flush();
}
void web_player() {
char buffer[128];
if (!server.hasArg("index")) {
server.send(400, "text/plain", "Missing 'index'");
return;
}
double value = strtod(server.arg("index").c_str(), nullptr);
int index = (int) value;
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
server.send(200, "text/html", "");
server.sendContent(style);
server.sendContent(script);
server.sendContent(R"(<meta name="viewport" content= "width=device-width, user-scalable=no">)");
server.sendContent(R"(<table>)");
server.sendContent(R"(<tr>)");
server.sendContent(R"(<td>&nbsp;</td>)");
server.sendContent(R"(<td>)");
snprintf(buffer, sizeof buffer, R"(<button onclick="get('/player/move?index=%d&x=0&y=-1');">&uarr;</button><br>)", index);
server.sendContent(buffer);
server.sendContent(R"(</td>)");
server.sendContent(R"(<td>&nbsp;</td>)");
server.sendContent(R"(</tr>)");
server.sendContent(R"(<tr>)");
server.sendContent(R"(<td>)");
snprintf(buffer, sizeof buffer, R"(<button onclick="get('/player/move?index=%d&x=-1&y=0');">&larr;</button><br>)", index);
server.sendContent(buffer);
server.sendContent(R"(</td>)");
server.sendContent(R"(<td>)");
snprintf(buffer, sizeof buffer, R"(<button onclick="get('/player/fire?index=%d');">X</button><br>)", index);
server.sendContent(buffer);
server.sendContent(R"(</td>)");
server.sendContent(R"(<td>)");
snprintf(buffer, sizeof buffer, R"(<button onclick="get('/player/move?index=%d&x=+1&y=0');">&rarr;</button><br>)", index);
server.sendContent(buffer);
server.sendContent(R"(</td>)");
server.sendContent(R"(</tr>)");
server.sendContent(R"(<tr>)");
server.sendContent(R"(<td>&nbsp;</td>)");
server.sendContent(R"(<td>)");
snprintf(buffer, sizeof buffer, R"(<button onclick="get('/player/move?index=%d&x=0&y=+1');">&darr;</button><br>)", index);
server.sendContent(buffer);
server.sendContent(R"(</td>)");
server.sendContent(R"(<td>&nbsp;</td>)");
server.sendContent(R"(</tr>)");
server.sendContent(R"(</table>)");
server.client().flush();
}
void web_player_move() {
double value;
if (!server.hasArg("index")) {
server.send(400, "text/plain", "Missing 'index'");
return;
}
value = strtod(server.arg("index").c_str(), nullptr);
int index = (int) value;
if (!server.hasArg("x")) {
server.send(400, "text/plain", "Missing 'x'");
return;
}
value = strtod(server.arg("x").c_str(), nullptr);
int x = (int) value;
if (!server.hasArg("y")) {
server.send(400, "text/plain", "Missing 'y'");
return;
}
value = strtod(server.arg("y").c_str(), nullptr);
int y = (int) value;
modeMove(index, x, y);
server.send(200, "application/json", "true");
}
void web_player_fire() {
double value;
if (!server.hasArg("index")) {
server.send(400, "text/plain", "Missing 'index'");
return;
}
value = strtod(server.arg("index").c_str(), nullptr);
int index = (int) value;
modeFire(index);
server.send(200, "application/json", "true");
}
void web_setMode() {
if (!server.hasArg("mode")) {
server.send(400, "text/plain", "Missing 'mode'");