Переработан веб-интерфейс. Сделаны всплывающие уведомления.
[esp-clock.git] / web.cpp
diff --git a/web.cpp b/web.cpp
index 7632250fb1a7021bb6e035d5eeca38767544e623..7d017b5721771165d94993165ebde5511a7dd2a8 100644 (file)
--- a/web.cpp
+++ b/web.cpp
@@ -40,18 +40,24 @@ void reportChange(const __FlashStringHelper* name) {
   }
 }
 
   }
 }
 
+void reportMessage(const __FlashStringHelper* msg) {
+  char buf[256];
+  strcpy_P(buf, (PGM_P)msg);
+  events.send(buf,"message",millis());
+}
+
 void sendInitial(AsyncEventSourceClient *client) {
   String mac = WiFi.macAddress();
   char buf[256];
   sprintf(buf,"{\"_mac\":\"%s\",\"_weather\":\"%s\"}", mac.c_str(), weatherData);
 void sendInitial(AsyncEventSourceClient *client) {
   String mac = WiFi.macAddress();
   char buf[256];
   sprintf(buf,"{\"_mac\":\"%s\",\"_weather\":\"%s\"}", mac.c_str(), weatherData);
-  client->send(buf,"keepalive",millis());
+  client->send(buf,"update",millis());
   mac = String();
 }
 
 void sendWeather() {
   char buf[256];
   sprintf(buf,"{\"_weather\":\"%s\"}",weatherData);
   mac = String();
 }
 
 void sendWeather() {
   char buf[256];
   sprintf(buf,"{\"_weather\":\"%s\"}",weatherData);
-  events.send(buf,"keepalive",millis());
+  events.send(buf,"update",millis());
 }
 
 void sendKeepalive() {
 }
 
 void sendKeepalive() {
@@ -86,7 +92,7 @@ void sendKeepalive() {
   } else {
     sprintf(buf,"{\"_uptime\":\"%d м %d с\", \"_date\":\"%02d.%2d.%04d\", \"_time\":\"%02d:%02d\",\"_heap\":\"%d б\", \"_rssi\":\"%d\",  \"_last_sync\":\"%s\", \"_changed\":%s}", mins, uptime, dd, mm, yy, hh, mi, heap, rssi, sync, changed?"true":"false");
   }
   } else {
     sprintf(buf,"{\"_uptime\":\"%d м %d с\", \"_date\":\"%02d.%2d.%04d\", \"_time\":\"%02d:%02d\",\"_heap\":\"%d б\", \"_rssi\":\"%d\",  \"_last_sync\":\"%s\", \"_changed\":%s}", mins, uptime, dd, mm, yy, hh, mi, heap, rssi, sync, changed?"true":"false");
   }
-  events.send(buf,"keepalive",millis());
+  events.send(buf,"update",millis());
 }
 
 void apply(const char* name) {
 }
 
 void apply(const char* name) {
@@ -129,13 +135,11 @@ void setupWeb() {
 
   isWebStarted = true;
 
 
   isWebStarted = true;
 
-  Serial.println("Setting authentication...");
   strncpy(auth_user,cfg.getCharValue(F("auth_user")),31);
   strncpy(auth_pwd,cfg.getCharValue(F("auth_pwd")),31);
 
   server.on("/action", HTTP_GET, [](AsyncWebServerRequest* request) {
     if (auth_user && auth_pwd && auth_user[0] && auth_pwd[0] && !request->authenticate(auth_user, auth_pwd)) {
   strncpy(auth_user,cfg.getCharValue(F("auth_user")),31);
   strncpy(auth_pwd,cfg.getCharValue(F("auth_pwd")),31);
 
   server.on("/action", HTTP_GET, [](AsyncWebServerRequest* request) {
     if (auth_user && auth_pwd && auth_user[0] && auth_pwd[0] && !request->authenticate(auth_user, auth_pwd)) {
-      Serial.print("Failed auth as user: "); Serial.print(auth_user); Serial.print(':'); Serial.print(auth_pwd); Serial.println('!');
       return request-> requestAuthentication();
     }
     if(request->hasParam("name")) {
       return request-> requestAuthentication();
     }
     if(request->hasParam("name")) {
@@ -172,7 +176,26 @@ void setupWeb() {
           millisScheduled = millis();
           actionScheduled = "save";
         }
           millisScheduled = millis();
           actionScheduled = "save";
         }
+      } else if (strcmp(action,"time") == 0) {
+        if(request->hasParam("timestamp")) {
+          unsigned long timestamp = atoi(request->getParam("timestamp")->value().c_str());
+          if (timestamp) {
+            timeval tv = { timestamp, 0 };
+            settimeofday(&tv, nullptr);  
+            if (isRTCEnabled) {
+              Serial.println(F("Время установлено вручную"));
+              RTC.adjust(DateTime(timestamp));
+            }
+          }
+          request->send(200,"application/json", "{\"result\":\"OK\",\"message\":\"Устанавливаю время\"}");
+        } else {
+          request->send(500, "text/plain", "{\"result\":\"FAILED\",\"message\":\"Not all parameters set\"}");
+        }
+      } else {
+        request->send(500, "text/plain", "{\"result\":\"FAILED\",\"message\":\"Unsupported action\"}");
       }
       }
+    } else {
+      request->send(500, "text/plain", "{\"result\":\"FAILED\",\"message\":\"Not all parameters set\"}");
     }
   });
 
     }
   });
 
@@ -279,9 +302,9 @@ void setupWeb() {
     }
   });
 
     }
   });
 
-  server.serveStatic("ui", LittleFS, "/ui.json");
+  server.serveStatic("ui", LittleFS, "/ui.json").setAuthentication(auth_user,auth_pwd);
 
 
-  server.serveStatic("/", LittleFS, "/web/").setDefaultFile("index.html");
+  server.serveStatic("/", LittleFS, "/web/").setDefaultFile("index.html").setAuthentication(auth_user,auth_pwd);
 
   server.onNotFound([](AsyncWebServerRequest *request){
     request->send(404,"text/plain","Not found");
 
   server.onNotFound([](AsyncWebServerRequest *request){
     request->send(404,"text/plain","Not found");
@@ -291,6 +314,8 @@ void setupWeb() {
     sendInitial(client);
   });
 
     sendInitial(client);
   });
 
+  events.setAuthentication(auth_user,auth_pwd);
+
   server.addHandler(&events);
 
   server.begin();
   server.addHandler(&events);
 
   server.begin();
@@ -307,18 +332,18 @@ void tickWeb() {
   static bool connectInProgress = false;
   static unsigned long connectMillis = 0;
   if (actionScheduled && millis()>millisScheduled+300) {
   static bool connectInProgress = false;
   static unsigned long connectMillis = 0;
   if (actionScheduled && millis()>millisScheduled+300) {
-    Serial.print(F("Scheduled action ")); Serial.println(actionScheduled);
+    Serial.print(F("Запланированная операция ")); Serial.println(actionScheduled);
     //
     if (strcmp(actionScheduled,"restart") == 0) {
       server.end();
       reboot();
     } else if (strcmp(actionScheduled,"auth") == 0) {
     //
     if (strcmp(actionScheduled,"restart") == 0) {
       server.end();
       reboot();
     } else if (strcmp(actionScheduled,"auth") == 0) {
-      Serial.println("New authentication credentials");
+      Serial.println("Логин/пароль изменены");
       strncpy(auth_user,cfg.getCharValue(F("auth_user")),31);
       strncpy(auth_pwd,cfg.getCharValue(F("auth_pwd")),31);
       pendingAuth = false;
     } else if (strcmp(actionScheduled,"wifi") == 0) {
       strncpy(auth_user,cfg.getCharValue(F("auth_user")),31);
       strncpy(auth_pwd,cfg.getCharValue(F("auth_pwd")),31);
       pendingAuth = false;
     } else if (strcmp(actionScheduled,"wifi") == 0) {
-      Serial.println("New wifi credentials");
+      Serial.println("Применяю настройки сети");
       strcpy(storedSSID,WiFi.SSID().c_str());
       strcpy(storedPSK,WiFi.psk().c_str());
       WiFi.mode(WIFI_STA);
       strcpy(storedSSID,WiFi.SSID().c_str());
       strcpy(storedPSK,WiFi.psk().c_str());
       WiFi.mode(WIFI_STA);
@@ -348,6 +373,7 @@ void tickWeb() {
 
   if (!pendingWiFi && !pendingAuth && cfg.getTimestamp() && cfg.getTimestamp() < now - CFG_AUTOSAVE) {
     saveConfig();
 
   if (!pendingWiFi && !pendingAuth && cfg.getTimestamp() && cfg.getTimestamp() < now - CFG_AUTOSAVE) {
     saveConfig();
+    reportMessage(F("Настройки сохранены"));
     Serial.println(F("Настройки сохранены"));
   }
 }
     Serial.println(F("Настройки сохранены"));
   }
 }