#ifndef NODE_H #define NODE_H #include #include #include #include DisplayMatrix<32, 8> display(13); static const auto style = R"( )"; static const auto script = R"( )"; inline void httpMode(AsyncWebServerRequest *request) { if (!request->hasParam("mode")) { request->send(400); } setMode(static_cast(request->getParam("mode")->value().toInt())); request->send(200); } inline void httpIndex(AsyncWebServerRequest *request) { auto *response = request->beginResponseStream("text/html"); response->print(style); response->print(script); response->print(R"(

)"); response->print(R"(Player 0
)"); response->print(R"(Player 1
)"); response->print(R"(

)"); response->print(R"(

)"); response->print(R"(NONE
)"); response->print(R"(BORDER
)"); response->print(R"(CLOCK
)"); response->print(R"(GAME_OF_LIFE_BLACK_WHITE
)"); response->print(R"(GAME_OF_LIFE_GRAYSCALE
)"); response->print(R"(GAME_OF_LIFE_COLOR_FADE
)"); response->print(R"(GAME_OF_LIFE_RANDOM_COLOR
)"); response->print(R"(PONG
)"); response->print(R"(SPACE_INVADERS
)"); response->print(R"(COUNT_DOWN
)"); response->print(R"(COUNT_DOWN_BARS
)"); response->print(R"(COUNT_DOWN_SLEEP
)"); response->print(R"(STARFIELD
)"); response->print(R"(MATRIX
)"); response->print(R"(POWER
)"); response->print(R"(ENERGY
)"); response->print(R"(TIMER
)"); response->print(R"(

)"); response->print(R"(

)"); response->print(R"(Helligkeit: + / -
)"); response->print(R"(Geschwindigkeit: + / -
)"); response->print(R"(

)"); response->print(R"(

)"); response->printf(R"()"); response->printf(R"()"); response->printf(R"()"); response->printf(R"()"); response->printf(R"()"); response->printf(R"()"); response->print(R"()"); response->print(R"(

)"); response->print(R"(

)"); response->print(R"()"); response->print(R"(

)"); request->send(response); } inline void web_player(AsyncWebServerRequest *request) { char buffer[128]; if (!request->hasParam("index")) { request->send(400, "text/plain", "Missing 'index'"); return; } const auto value = request->getParam("index")->value().toDouble(); const auto index = static_cast(value); auto *response = request->beginResponseStream("text/html"); response->print(style); response->print(script); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"()"); response->print(R"(
)"); snprintf(buffer, sizeof buffer, R"(
)", index); response->print(buffer); response->print(R"(
 
)"); snprintf(buffer, sizeof buffer, R"(
)", index); response->print(buffer); response->print(R"(
)"); snprintf(buffer, sizeof buffer, R"(
)", index); response->print(buffer); response->print(R"(
)"); snprintf(buffer, sizeof buffer, R"(
)", index); response->print(buffer); response->print(R"(
 )"); snprintf(buffer, sizeof buffer, R"(
)", index); response->print(buffer); response->print(R"(
 
)"); request->send(response); } inline void web_player_move(AsyncWebServerRequest *request) { // ReSharper disable once CppJoinDeclarationAndAssignment double value; if (!request->hasParam("index")) { request->send(400, "text/plain", "Missing 'index'"); return; } value = request->getParam("index")->value().toDouble(); const auto index = static_cast(value); if (!request->hasParam("x")) { request->send(400, "text/plain", "Missing 'x'"); return; } value = request->getParam("x")->value().toDouble(); const auto x = static_cast(value); if (!request->hasParam("y")) { request->send(400, "text/plain", "Missing 'y'"); return; } value = request->getParam("y")->value().toDouble(); const auto y = static_cast(value); modeMove(index, x, y); request->send(200, "application/json", "true"); } inline void web_player_fire(AsyncWebServerRequest *request) { // ReSharper disable once CppJoinDeclarationAndAssignment double value; if (!request->hasParam("index")) { request->send(400, "text/plain", "Missing 'index'"); return; } value = request->getParam("index")->value().toDouble(); const auto index = static_cast(value); modeFire(index); request->send(200, "application/json", "true"); } inline void web_setMode(AsyncWebServerRequest *request) { if (!request->hasParam("mode")) { request->send(400, "text/plain", "Missing 'mode'"); return; } auto value = request->getParam("mode")->value().toDouble(); if (isnan(value)) { request->send(400, "text/plain", "'mode' not a number"); return; } setMode(static_cast(value)); request->send(200); } inline void web_brighter(AsyncWebServerRequest *request) { const auto newBrightness = display.getBrightness() + 10; display.setBrightness(newBrightness >= 255 ? 255 : newBrightness); request->send(200); } inline void web_darker(AsyncWebServerRequest *request) { const auto newBrightness = display.getBrightness() - 10; display.setBrightness(newBrightness <= 0 ? 0 : newBrightness); request->send(200); } inline void web_faster(AsyncWebServerRequest *request) { setSpeed(getSpeed() * 1.1); request->send(200); } inline void web_slower(AsyncWebServerRequest *request) { setSpeed(getSpeed() / 1.1); request->send(200); } inline void web_config_save(AsyncWebServerRequest *request) { config.write(); request->send(200); } inline void web_config_date(AsyncWebServerRequest *request) { const auto targetEpochSeconds = std::stoul(request->getParam("targetEpochSeconds")->value().c_str()); config.set("targetEpochSeconds", targetEpochSeconds); modeLoadConfig(); request->send(200); } class Node final : public PatrixNode { public: explicit Node() : PatrixNode(true, true, true) { // } void setup() override { modeSetup(); server.on("/", httpIndex); server.on("/player", web_player); server.on("/player/move", web_player_move); server.on("/player/fire", web_player_fire); server.on("/mode", httpMode); server.on("/brighter", web_brighter); server.on("/darker", web_darker); server.on("/faster", web_faster); server.on("/slower", web_slower); server.on("/config/date", web_config_date); server.on("/config/save", web_config_save); display.setup(); display.setBrightness(10); display.clear(); } void loop() override { modeLoop(display); display.loop(); } void mqttMessage(char *topic, char *message) override { modeMqttMessage(topic, message); } }; #endif