retrieves time from NTP and calculate ms between now and a given time in the next 24 hours

This commit is contained in:
laughingguffly 2025-02-03 12:42:02 +00:00
parent b9b14ded2f
commit 147173bddd
2 changed files with 78 additions and 0 deletions

View file

@ -0,0 +1,64 @@
#include "ntp_time.h"
#include "../../include.h"
#include "time.h"
const unsigned long millisInADay = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
unsigned long long getNtpTimeInMillis() {
configTzTime(time_zone, ntpServer1, ntpServer2);
struct tm timeinfo;
// Wait for time to be set
for (int i = 0; i < 5; i++) {
if (getLocalTime(&timeinfo)) {
logging.println("Time retrieved from NTP Server");
break;
}
delay(1000);
logging.println("Waiting for NTP time...");
}
if (!getLocalTime(&timeinfo)) {
logging.println("Failed to obtain time");
return 0;
}
// Convert to milliseconds
time_t epochTime = mktime(&timeinfo);
return static_cast<unsigned long long>(epochTime) * 1000;
}
// Function to calculate the difference in milliseconds to the next target time
unsigned long long millisToNextTargetTime(unsigned long long currentMillis, int targetTime) {
int hour = targetTime / 100;
int minute = targetTime % 100;
time_t currentTime = currentMillis / 1000; // Convert milliseconds to seconds
struct tm* timeinfo = localtime(&currentTime);
// Set timeinfo to the target time on the next day
timeinfo->tm_hour = hour;
timeinfo->tm_min = minute;
timeinfo->tm_sec = 0;
// Increment day if the current time is past the target time
if (mktime(timeinfo) <= currentTime) {
timeinfo->tm_mday += 1;
}
time_t nextTargetTime = mktime(timeinfo);
unsigned long long nextTargetMillis = static_cast<unsigned long long>(nextTargetTime) * 1000;
return nextTargetMillis - currentMillis;
}
unsigned long long getTimeOffsetfromNowUntil(int targetTime) {
logging.println("Getting time offset from now until " + String(targetTime));
unsigned long long timeinMillis = getNtpTimeInMillis();
if (timeinMillis != 0) {
logging.println("Time in millis: " + String(timeinMillis));
unsigned long long timeOffsetUntilTargetTime = millisInADay - (millisToNextTargetTime(timeinMillis, targetTime));
logging.println("Time offset until target time: " + String(timeOffsetUntilTargetTime));
return timeOffsetUntilTargetTime;
} else
return 0;
}

View file

@ -0,0 +1,14 @@
#ifndef __NTPTIME_H__
#define __NTPTIME_H__
extern const char* ntpServer1;
extern const char* ntpServer2;
extern const char* time_zone;
void init_mqtt(void);
void mqtt_loop(void);
unsigned long long getNtpTimeInMillis();
unsigned long long millisToNextTargetTime(unsigned long long currentMillis, int targetTime);
unsigned long long getTimeOffsetfromNowUntil(int targetTime);
#endif