oleg-02/src/server/web_server.cpp
2026-03-30 05:11:29 +03:00

183 lines
4.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <WiFi.h>
#include <WebServer.h>
#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
}