diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 05675c5c4..c1242d23e 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -80,6 +80,13 @@ void WebLogService::operator<<(std::shared_ptr message) { log_messages_.pop_front(); } log_messages_.emplace_back(log_message_id_++, std::move(message)); + EMSESP::esp8266React.getNTPSettingsService()->read([&](NTPSettings & settings) { + if (!settings.enabled || (time(nullptr) < 1500000000UL)) { + time_offset_ = 0; + } else if (!time_offset_) { + time_offset_ = time(nullptr) - uuid::get_uptime_sec(); + } + }); } void WebLogService::loop() { @@ -101,14 +108,26 @@ void WebLogService::loop() { } } +char * WebLogService::messagetime(char * out, const uint64_t t) { + if (!time_offset_) { + strcpy(out, uuid::log::format_timestamp_ms(t, 3).c_str()); + } else { + time_t t1 = time_offset_ + t / 1000ULL; + strftime(out, 25, "%F %T", localtime(&t1)); + snprintf_P(out, 25, "%s.%03d", out, (uint16_t)(t % 1000)); + } + return out; +} + // send to web eventsource void WebLogService::transmit(const QueuedLogMessage & message) { DynamicJsonDocument jsonDocument = DynamicJsonDocument(EMSESP_JSON_SIZE_SMALL); JsonObject logEvent = jsonDocument.to(); - logEvent["t"] = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3); - logEvent["l"] = message.content_->level; - logEvent["n"] = message.content_->name; - logEvent["m"] = message.content_->text; + char time_string[25]; + logEvent["t"] = messagetime(time_string, message.content_->uptime_ms); + logEvent["l"] = message.content_->level; + logEvent["n"] = message.content_->name; + logEvent["m"] = message.content_->text; size_t len = measureJson(jsonDocument); char * buffer = new char[len + 1]; @@ -129,10 +148,11 @@ void WebLogService::fetchLog(AsyncWebServerRequest * request) { for (const auto & msg : log_messages_) { JsonObject logEvent = log.createNestedObject(); auto message = std::move(msg); - logEvent["t"] = uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3); - logEvent["l"] = message.content_->level; - logEvent["n"] = message.content_->name; - logEvent["m"] = message.content_->text; + char time_string[25]; + logEvent["t"] = messagetime(time_string, message.content_->uptime_ms); + logEvent["l"] = message.content_->level; + logEvent["n"] = message.content_->name; + logEvent["m"] = message.content_->text; } log_message_id_tail_ = log_messages_.back().id_; @@ -149,6 +169,9 @@ void WebLogService::setLevel(AsyncWebServerRequest * request, JsonVariant & json auto && body = json.as(); uuid::log::Level level = body["level"]; log_level(level); + if (level == uuid::log::Level::OFF) { + log_messages_.clear(); + } // send the value back AsyncJsonResponse * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index 12bf8afe6..c45c7213a 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -65,6 +65,8 @@ class WebLogService : public uuid::log::Handler { void fetchLog(AsyncWebServerRequest * request); void getLevel(AsyncWebServerRequest * request); + char * messagetime(char * out, const uint64_t t); + void setLevel(AsyncWebServerRequest * request, JsonVariant & json); AsyncCallbackJsonWebHandler _setLevel; // for POSTs @@ -73,6 +75,7 @@ class WebLogService : public uuid::log::Handler { unsigned long log_message_id_ = 0; // The next identifier to use for queued log messages unsigned long log_message_id_tail_ = 0; // last event shown on the screen after fetch std::list log_messages_; // Queued log messages, in the order they were received + time_t time_offset_ = 0; }; } // namespace emsesp