forked from vitotai/BrewPiLess
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTimeKeeper.cpp
132 lines (116 loc) · 2.99 KB
/
TimeKeeper.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <time.h>
#include <Arduino.h>
#include <FS.h>
#include "espconfig.h"
extern "C" {
#include <sntp.h>
}
#include "TimeKeeper.h"
#define TIME_SAVE_FILENAME "/time.saved"
#define TIME_SAVING_PERIOD 300
#define RESYNC_TIME 43200000UL
// time gap in seconds from 01.01.1900 (NTP time) to 01.01.1970 (UNIX time)
#define DIFF1900TO1970 2208988800UL
TimeKeeperClass TimeKeeper;
void TimeKeeperClass::setCurrentTime(time_t now)
{
_referenceSeconds=now;
_referenceSystemTime = millis();
_lastSaved=_referenceSeconds;
saveTime(now);
}
void TimeKeeperClass::begin(void)
{
_online = false;
_referenceSeconds=loadTime();
_referenceSeconds += 300; // add 5 minutes.
_referenceSystemTime = millis();
_lastSaved=_referenceSeconds;
DBG_PRINTF("Load saved time:%ld\n",_referenceSeconds);
}
void TimeKeeperClass::begin(char* server1,char* server2,char* server3)
{
_online=true;
if(server1) sntp_setservername(0,server1);
else sntp_setservername(0,(char*)"time.nist.gov");
if(server2) sntp_setservername(1,server2);
if(server3) sntp_setservername(2,server3);
sntp_set_timezone(0);
sntp_init();
unsigned long secs=0;
int trial;
for(trial=0;trial< 50;trial++)
{
secs = sntp_get_current_timestamp();
if(secs) break;
delay(200);
}
if(secs ==0){
secs=loadTime() + 300;
DBG_PRINTF("failed to connect NTP, load time:%ld\n",secs);
}
_referenceSystemTime = millis();
_referenceSeconds = secs;
_lastSaved=_referenceSeconds;
}
time_t TimeKeeperClass::getTimeSeconds(void) // get Epoch time
{
unsigned long diff=millis() - _referenceSystemTime;
if(diff > RESYNC_TIME){
if( _online){
unsigned long newtime=sntp_get_current_timestamp();
if(newtime){
_referenceSystemTime = millis();
_referenceSeconds = newtime;
diff=0;
}
}else{
// just add up
_referenceSystemTime = millis();
_referenceSeconds = _referenceSeconds + diff/1000;
diff=0;
}
}
time_t now= _referenceSeconds + diff/1000;
if( (now - _lastSaved) > TIME_SAVING_PERIOD){
saveTime(now);
_lastSaved=now;
}
return now;
}
static char _dateTimeStrBuff[24];
const char* TimeKeeperClass::getDateTimeStr(void)
{
time_t current=getTimeSeconds();
tm *t= localtime(¤t);
//2016-07-01T05:22:33Z
sprintf(_dateTimeStrBuff,"%d-%02d-%02dT%02d:%02d:%02dZ",
t->tm_year+1900,t->tm_mon +1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
return _dateTimeStrBuff;
}
void TimeKeeperClass::saveTime(time_t t)
{
File f = SPIFFS.open(TIME_SAVE_FILENAME, "w");
if(!f){
DBG_PRINTF("Failed to save time!\n");
return;
}
f.write((unsigned char*)&t,sizeof(time_t));
f.write((unsigned char*)&_timezoneOffset,sizeof(_timezoneOffset));
f.close();
}
time_t TimeKeeperClass::loadTime(void)
{
time_t t;
File f = SPIFFS.open(TIME_SAVE_FILENAME, "r");
if(!f){
DBG_PRINTF("Failed to open time saving file!\n");
return 0;
}
f.read((unsigned char*)&t,sizeof(time_t));
if(! f.read((unsigned char*)&_timezoneOffset,sizeof(_timezoneOffset)) ){
_timezoneOffset=0;
}
f.close();
return t;
}