183 lines
4.7 KiB
C++
183 lines
4.7 KiB
C++
#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
|
||
}
|