1414 * License along with this library; if not, write to the Free Software
1515 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1616 *
17+ * reworked for newlib and lwIP-v2:
18+ * time source is SNTP/settimeofday()
19+ * system time is micros64() / NONOS-SDK's system_get_time()
20+ * synchronisation of the two through timeshift64
1721 */
1822
1923#include < stdlib.h>
2024#include < ../include/time.h> // See issue #6714
2125#include < sys/time.h>
2226#include < sys/reent.h>
23- #include " sntp.h"
24- #include " coredecls.h"
27+ #include < errno.h>
2528
26- #include < Arduino.h> // configTime()
29+ #include < sntp.h> // nonos-sdk
30+ #include < coredecls.h>
31+ #include < Schedule.h>
2732
28- #include " sntp-lwip2.h "
33+ #include < Arduino.h > // configTime()
2934
3035extern " C" {
3136
@@ -42,16 +47,11 @@ extern struct tm* sntp_localtime(const time_t *clock);
4247extern uint64_t micros64 ();
4348extern void sntp_set_daylight (int daylight);
4449
45- // time gap in seconds from 01.01.1900 (NTP time) to 01.01.1970 (UNIX time)
46- #define DIFF1900TO1970 2208988800UL
47-
48- bool timeshift64_is_set = false ;
4950static uint64_t timeshift64 = 0 ;
5051
5152void tune_timeshift64 (uint64_t now_us)
5253{
5354 timeshift64 = now_us - micros64 ();
54- timeshift64_is_set = true ;
5555}
5656
5757static void setServer (int id, const char * name_or_ip)
@@ -73,7 +73,8 @@ int clock_gettime(clockid_t unused, struct timespec *tp)
7373 return 0 ;
7474}
7575
76- // backport Espressif api
76+ // /////////////////////////////////////////
77+ // backport legacy nonos-sdk Espressif api
7778
7879bool sntp_set_timezone_in_seconds (int32_t timezone_sec)
7980{
@@ -93,16 +94,20 @@ char* sntp_get_real_time(time_t t)
9394
9495uint32 sntp_get_current_timestamp ()
9596{
96- return sntp_real_timestamp ;
97+ return time ( nullptr ) ;
9798}
9899
100+ // backport legacy nonos-sdk Espressif api
101+ // /////////////////////////////////////////
102+
99103time_t time (time_t * t)
100104{
105+ time_t currentTime_s = (micros64 () + timeshift64) / 1000000ULL ;
101106 if (t)
102107 {
103- *t = sntp_real_timestamp ;
108+ *t = currentTime_s ;
104109 }
105- return sntp_real_timestamp ;
110+ return currentTime_s ;
106111}
107112
108113int _gettimeofday_r (struct _reent * unused, struct timeval *tp, void *tzp)
@@ -111,8 +116,6 @@ int _gettimeofday_r(struct _reent* unused, struct timeval *tp, void *tzp)
111116 (void ) tzp;
112117 if (tp)
113118 {
114- if (!timeshift64_is_set)
115- tune_timeshift64 (sntp_real_timestamp * 1000000ULL );
116119 uint64_t currentTime_us = timeshift64 + micros64 ();
117120 tp->tv_sec = currentTime_us / 1000000ULL ;
118121 tp->tv_usec = currentTime_us % 1000000ULL ;
@@ -146,7 +149,7 @@ void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, c
146149 newlib inspection and internal structure hacking
147150 (no sprintf, no sscanf, -7584 flash bytes):
148151
149- ***/
152+ *** hack starts here: ** * /
150153
151154 static char gmt[] = " GMT" ;
152155
@@ -169,12 +172,12 @@ void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, c
169172 tzr->offset = -_timezone;
170173 }
171174
175+ /* ** end of hack ***/
176+
172177 // sntp servers
173178 setServer (0 , server1);
174179 setServer (1 , server2);
175180 setServer (2 , server3);
176-
177- /* ** end of posix replacement ***/
178181}
179182
180183void setTZ (const char * tz){
@@ -197,3 +200,35 @@ void configTime(const char* tz, const char* server1, const char* server2, const
197200 sntp_init ();
198201}
199202
203+ static TrivialCB _settimeofday_cb;
204+
205+ void settimeofday_cb (TrivialCB&& cb)
206+ {
207+ _settimeofday_cb = std::move (cb);
208+ }
209+
210+ void settimeofday_cb (const TrivialCB& cb)
211+ {
212+ _settimeofday_cb = cb;
213+ }
214+
215+ extern " C" {
216+
217+ #include < lwip/apps/sntp.h>
218+
219+ int settimeofday (const struct timeval * tv, const struct timezone * tz)
220+ {
221+ if (tz || !tv)
222+ // tz is obsolete (cf. man settimeofday)
223+ return EINVAL;
224+
225+ // reset time subsystem
226+ tune_timeshift64 (tv->tv_sec * 1000000ULL + tv->tv_usec );
227+
228+ if (_settimeofday_cb)
229+ schedule_recurrent_function_us ([](){ _settimeofday_cb (); return false ; }, 0 );
230+
231+ return 0 ;
232+ }
233+
234+ };
0 commit comments