This commit is contained in:
MiaoMint
2025-08-12 04:24:15 +08:00
commit 4dcbb9c05b
21 changed files with 3289 additions and 0 deletions

135
src/time_manager.cpp Normal file
View File

@@ -0,0 +1,135 @@
#include "time_manager.h"
#include <ESP8266WiFi.h>
TimeManager::TimeManager() : timeClient(ntpUDP, NTP_SERVER, TIME_ZONE * 3600) {
timeInitialized = false;
lastNTPUpdate = 0;
}
void TimeManager::begin() {
timeClient.begin();
timeClient.setUpdateInterval(NTP_UPDATE_INTERVAL);
Serial.println("时间管理器初始化完成");
// 如果 WiFi 已连接,立即尝试同步时间
if (WiFi.status() == WL_CONNECTED) {
forceSync();
}
}
void TimeManager::update() {
// 只有在 WiFi 连接时才更新 NTP 时间
if (WiFi.status() == WL_CONNECTED) {
timeClient.update();
// 检查是否成功获取到时间
if (!timeInitialized && timeClient.getEpochTime() > 0) {
timeInitialized = true;
lastNTPUpdate = millis();
Serial.println("NTP 时间同步成功: " + getCurrentTimeString());
}
// 定期强制同步
if (timeInitialized && millis() - lastNTPUpdate > NTP_UPDATE_INTERVAL) {
forceSync();
}
}
}
bool TimeManager::isTimeValid() {
// WiFi 连接且时间已初始化
return (WiFi.status() == WL_CONNECTED) && timeInitialized && (timeClient.getEpochTime() > 0);
}
int TimeManager::getCurrentHour() {
if (isTimeValid()) {
return timeClient.getHours();
}
// 如果没有有效时间,返回基于运行时间的模拟时间(仅用于测试)
unsigned long seconds = millis() / 1000;
return (seconds / 3600) % 24;
}
int TimeManager::getCurrentMinute() {
if (isTimeValid()) {
return timeClient.getMinutes();
}
// 如果没有有效时间,返回基于运行时间的模拟时间(仅用于测试)
unsigned long seconds = millis() / 1000;
return (seconds / 60) % 60;
}
int TimeManager::getCurrentDay() {
if (isTimeValid()) {
// 返回自 Unix epoch 以来的天数
return timeClient.getEpochTime() / 86400;
}
// 如果没有有效时间,返回基于运行时间的模拟天数
return millis() / (24 * 60 * 60 * 1000UL);
}
String TimeManager::getCurrentTimeString() {
char timeStr[10];
if (isTimeValid()) {
sprintf(timeStr, "%02d:%02d:%02d",
timeClient.getHours(),
timeClient.getMinutes(),
timeClient.getSeconds());
} else {
sprintf(timeStr, "%02d:%02d:%02d*",
getCurrentHour(),
getCurrentMinute(),
(int)((millis() / 1000) % 60));
}
return String(timeStr);
}
String TimeManager::getCurrentDateString() {
if (isTimeValid()) {
unsigned long epochTime = timeClient.getEpochTime();
// 简单的日期计算
int days = epochTime / 86400;
int year = 1970 + (days / 365);
int month = ((days % 365) / 30) + 1;
int day = (days % 30) + 1;
char dateStr[20];
sprintf(dateStr, "%04d-%02d-%02d", year, month, day);
return String(dateStr);
}
return "未同步";
}
void TimeManager::forceSync() {
if (WiFi.status() == WL_CONNECTED) {
Serial.println("强制同步 NTP 时间...");
timeClient.forceUpdate();
if (timeClient.getEpochTime() > 0) {
timeInitialized = true;
lastNTPUpdate = millis();
Serial.println("NTP 同步成功: " + getCurrentTimeString());
} else {
Serial.println("NTP 同步失败");
}
}
}
bool TimeManager::isWiFiTimeAvailable() {
return WiFi.status() == WL_CONNECTED;
}
unsigned long TimeManager::getEpochTime() {
if (isTimeValid()) {
return timeClient.getEpochTime();
}
return 0; // 无效时间返回0
}