Formal description
[esp-clock.git] / time.cpp
1 #include "Clock.h"
2 #include <time.h>
3 #include <coredecls.h>
4
5 bool isTimeSet = false;
6 time_t now;
7 time_t last_sync;
8
9 int hh;
10 int mi;
11 int ss;
12
13 int dw;
14
15 int dd;
16 int mm;
17 int yy;
18
19 #define maxTimeHandlers 8
20 const char* tHandlerNames[maxTimeHandlers];
21 char tHandlerTypes[maxTimeHandlers];
22 std::function<void()> tTimeHandlers[maxTimeHandlers];
23
24 void timeIsSet(bool ntp) {
25   if (ntp) {
26     Serial.println(F("Time syncronized with NTP"));
27     message(F("Время синхронизировано"));
28     if (isRTCEnabled) {
29       RTC.adjust(DateTime(now));
30     }
31   }
32   isTimeSet = true;
33   last_sync = now;
34 }
35
36 void setupHandlers() {
37   for (int i=0; i<maxTimeHandlers; i++) {
38     tHandlerNames[i] = nullptr;
39     tHandlerTypes[i] = ' ';
40     tTimeHandlers[i] = nullptr;
41   }
42 }
43
44 void setupTime() {
45   configTime(cfg.getCharValue(F("tz")),cfg.getCharValue(F("ntp_server")));
46   settimeofday_cb(&timeIsSet);
47 }
48
49 void registerTimeHandler(const char* handlerName, const char handlerType, std::function<void()> timeHandler) {
50   for (int i=0; i<maxTimeHandlers; i++) {
51     if (!tHandlerNames[i]) {
52       // empty slot found!
53       tHandlerNames[i] = handlerName;
54       tHandlerTypes[i] = handlerType;
55       tTimeHandlers[i] = timeHandler;
56       break;
57     }
58   }
59 }
60
61 void registerTimeHandler(const __FlashStringHelper* handlerName, const char handlerType, std::function<void()> timeHandler) {
62   for (int i=0; i<maxTimeHandlers; i++) {
63     if (!tHandlerNames[i]) {
64       // empty slot found!
65       tHandlerNames[i] = copystr(handlerName);
66       tHandlerTypes[i] = handlerType;
67       tTimeHandlers[i] = timeHandler;
68       break;
69     }
70   }
71 }
72
73 void unregisterTimeHandler(const char* handlerName) {
74   for (int i=0; i<maxTimeHandlers; i++) {
75     if (tHandlerNames[i] && strcmp(tHandlerNames[i],handlerName) == 0) {
76       tHandlerNames[i] = nullptr;
77       tHandlerTypes[i] = ' ';
78       tTimeHandlers[i] = nullptr;
79       break;
80     }
81   }
82 }
83
84 void unregisterTimeHandler(const __FlashStringHelper* handlerName) {
85   for (int i=0; i<maxTimeHandlers; i++) {
86     if (tHandlerNames[i] && strcmp_P(tHandlerNames[i],(PGM_P)handlerName) == 0) {
87       tHandlerNames[i] = nullptr;
88       tHandlerTypes[i] = ' ';
89       tTimeHandlers[i] = nullptr;
90       break;
91     }
92   }
93 }
94
95 void runHandlers(char handlerType) {
96   for (int i=0; i<maxTimeHandlers; i++) {
97     if (tTimeHandlers[i] && tHandlerTypes[i]==handlerType) {
98       tTimeHandlers[i]();
99     }
100   }
101 }
102
103 void tickTime() {
104   static int prevD = 0, prevH = 0, prevM = 0, prevS = 0;
105   time(&now);
106   struct tm* timeinfo = localtime(&now);  
107   hh = timeinfo->tm_hour;
108   mi = timeinfo->tm_min;
109   ss = timeinfo->tm_sec;
110   dw = timeinfo->tm_wday;
111   dd = timeinfo->tm_mday;
112   mm = timeinfo->tm_mon+1;
113   yy = timeinfo->tm_year+1900;
114   if (dd != prevD) {
115     prevD = dd;
116     runHandlers('d');
117   }
118   if (hh != prevH) {
119     prevH = hh;
120     runHandlers('h');
121   }
122   if (mi != prevM) {
123     prevM = mi;
124     runHandlers('m');
125   }
126   if (ss != prevS) {
127     prevS = ss;
128     runHandlers('s');
129   }
130 }
131
132 bool isNight() {
133   int day_from = cfg.getIntValue(F("day_from"));
134   int night_from = cfg.getIntValue(F("night_from"));
135   if (day_from<night_from) { // night ... day ... night
136      return hh<day_from || hh>=night_from;
137   } else { /// late day ... night .... day till mindnight
138      return (hh>=night_from && hh<day_from);
139   }
140 }
141