#include #include #include "config.h" #include "web_ui.h" #include "core/controller/controller.h" #include "core/robot_state/robot_state.h" #include "core/ultrasonic/ultrasonic.h" #include "core/display/body/body.h" static WebServer server(80); // Static buffers for getters static char ipStr[16] = "No IP"; static char modeStr[16] = "IDLE"; #define WIFI_RETRY_MAX 5 #define WIFI_RETRY_DELAY_MS 800 void handleRoot() { server.send_P(200, "text/html; charset=utf-8", INDEX_HTML); } void handleCmd() { if (!server.hasArg("c")) { server.send(400, "text/plain", "Missing c"); return; } String c = server.arg("c"); c.toUpperCase(); robot.lastCmdMs = millis(); if (c == "STOP") { controllerStop(); server.send(200, "text/plain", "OK STOP"); return; } if (!controllerMove(c)) { server.send(403, "text/plain", String("DENIED MODE=") + modeToStr(robot.mode)); return; } server.send(200, "text/plain", "OK " + c); } void handleSpeed() { int l = server.hasArg("l") ? server.arg("l").toInt() : robot.speedL; int r = server.hasArg("r") ? server.arg("r").toInt() : robot.speedR; controllerSetSpeed(l, r); server.send(200, "text/plain", "OK SPEED"); } void handleMode() { if (!server.hasArg("m")) { server.send(400, "text/plain", "Missing m"); return; } String m = server.arg("m"); m.toUpperCase(); if (m == "IDLE") controllerSetMode(MODE_IDLE); else if (m == "MANUAL") controllerSetMode(MODE_MANUAL); else if (m == "AUTO") controllerSetMode(MODE_AUTO); else { server.send(400, "text/plain", "Unknown mode"); return; } snprintf(modeStr, sizeof(modeStr), "%s", modeToStr(robot.mode)); // oledShowMode(modeStr); // lcdShowText("SERVICE MODE", "Waiting..."); server.send(200, "text/plain", String("OK MODE=") + modeToStr(robot.mode)); } void handleStatus() { int dist = ultrasonicReadCm(); String json = "{"; json += "\"mode\":\"" + String(modeToStr(robot.mode)) + "\","; json += "\"speedL\":" + String(robot.speedL) + ","; json += "\"speedR\":" + String(robot.speedR) + ","; json += "\"rssi\":" + String(WiFi.RSSI()) + ","; json += "\"uptime\":" + String(millis()) + ","; json += "\"distance_cm\":" + String(dist); json += "}"; server.send(200, "application/json", json); } bool webServerInit() { WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASS); Serial.print("\nConnecting to Wi-Fi"); // Показываем экран подключения char statusBuf[32]; snprintf(statusBuf, sizeof(statusBuf), "Retry 0/%d", WIFI_RETRY_MAX); oledShowText("Connecting to WiFi", ""); int retryCount = 0; while (WiFi.status() != WL_CONNECTED && retryCount < WIFI_RETRY_MAX) { // Serial.print("\nRetry connecting to Wi-Fi"); // delay(WIFI_RETRY_DELAY_MS); // if (retryCount >= 3){ // retryCount = 0; // } else { // retryCount++; // } // // Обновляем дисплей с номером попытки // snprintf(statusBuf, sizeof(statusBuf), "Retry %d/%d", retryCount, WIFI_RETRY_MAX); // oledShowText("Connecting to WiFi...", statusBuf); Serial.print("\nRetry connecting to Wi-Fi"); delay(WIFI_RETRY_DELAY_MS); // Считаем точки: 1, 2, 3, затем сброс в 0 retryCount = (retryCount + 1) % 4; // 0, 1, 2, 3 точки // Формируем строку с точками char dots[4] = ""; for (int i = 0; i < retryCount; i++) { dots[i] = '.'; } dots[retryCount] = '\0'; // Обновляем дисплей: "Connecting to WiFi" + точки char statusBuf[32]; snprintf(statusBuf, sizeof(statusBuf), "Connecting to WiFi%s", dots); oledShowText(statusBuf, ""); // вторая строка пустая, если не нужна } if (WiFi.status() == WL_CONNECTED) { // Показываем успешное подключение snprintf(ipStr, sizeof(ipStr), "%s", WiFi.localIP().toString().c_str()); oledShowText("WiFi: CONNECTED", ipStr); Serial.print("\nConnected. IP: "); Serial.println(WiFi.localIP()); // Настраиваем маршруты server.on("/", handleRoot); server.on("/cmd", handleCmd); server.on("/speed", handleSpeed); server.on("/mode", handleMode); server.on("/status", handleStatus); server.begin(); return true; } // Не удалось подключиться oledShowText("WiFi: FAILED", "Check router/network"); Serial.println("\nWiFi connection failed"); return false; } void webServerLoop() { server.handleClient(); } const char* webServerGetIP() { return ipStr; } const char* webServerGetMode() { return modeStr; } uint32_t webServerGetUptime() { return millis() / 1000; // seconds }