15#define TINY_CTS_HAS_SYSTEM_TIME 1
19#define TINY_CTS_HAS_SETTIMEOFDAY 1
21#elif defined(__has_include) && !defined(ARDUINO_ARCH_RENESAS) && \
22 !defined(ARDUINO_ARCH_RENESAS_UNO) && !defined(ARDUINO_ARCH_RENESAS_PORTENTA)
23#if __has_include(<sys/time.h>)
25#define TINY_CTS_HAS_SYSTEM_TIME 1
26#define TINY_CTS_HAS_SETTIMEOFDAY 1
32#ifndef TINY_CTS_MILLIS
34#define TINY_CTS_MILLIS() (::millis())
37#define TINY_CTS_MILLIS() \
38 (static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::milliseconds>( \
39 std::chrono::steady_clock::now().time_since_epoch()) \
81 void setTime(uint32_t unixSeconds, uint16_t milliseconds = 0) {
82 setTimeMs(unixSeconds * 1000ULL + milliseconds);
87 _lastMillis = TINY_CTS_MILLIS();
91 void clear() { _timeMs = 0; }
92 bool isSet()
const {
return _timeMs != 0; }
95 if (_timeMs == 0)
return 0;
96 uint32_t now = TINY_CTS_MILLIS();
97 _timeMs +=
static_cast<uint32_t
>(now - _lastMillis);
103 uint64_t _timeMs = 0;
104 uint32_t _lastMillis = 0;
107#ifdef TINY_CTS_HAS_SYSTEM_TIME
116 explicit TinyCTSSystemSource(uint32_t minValidSeconds = 1700000000UL)
117 : _minValid(minValidSeconds) {}
122 if (gettimeofday(&tv,
nullptr) != 0)
return 0;
123 uint64_t sec =
static_cast<uint64_t
>(tv.tv_sec);
124 uint64_t ms = sec * 1000ULL + tv.tv_usec / 1000;
126 uint64_t ms =
static_cast<uint64_t
>(
127 std::chrono::duration_cast<std::chrono::milliseconds>(
128 std::chrono::system_clock::now().time_since_epoch())
130 uint64_t sec = ms / 1000;
132 return sec < _minValid ? 0 : ms;
137#if defined(TINY_CTS_HAS_SETTIMEOFDAY)
139 tv.tv_sec =
static_cast<time_t
>(unixMs / 1000);
140 tv.tv_usec =
static_cast<suseconds_t
>(unixMs % 1000 * 1000);
141 return settimeofday(&tv,
nullptr) == 0;
165 explicit TinyCTSSourceAdapter(T& source) : _source(source) {}
166 uint64_t
getTimeMs()
override {
return _source.getTimeMs(); }
A software clock: you set the UTC time (from an RTC, a GPS, ...) and it keeps counting with millis()....
Definition TinyCTSTimeSource.h:79
bool setTimeMs(uint64_t unixMs) override
Set the current UTC time, e.g. when a client writes the Current Time characteristic....
Definition TinyCTSTimeSource.h:85
uint64_t getTimeMs() override
The current UTC time in milliseconds since 1970-01-01. It must not block.
Definition TinyCTSTimeSource.h:94
uint64_t getTimeMs() override
The current UTC time in milliseconds since 1970-01-01. It must not block.
Definition TinyCTSTimeSource.h:166
bool setTimeMs(uint64_t unixMs) override
Definition TinyCTSTimeSource.h:136
uint64_t getTimeMs() override
The current UTC time in milliseconds since 1970-01-01. It must not block.
Definition TinyCTSTimeSource.h:119
Abstract base class of the time sources: an object that knows the current UTC time.
Definition TinyCTSTimeSource.h:51
virtual bool setTimeMs(uint64_t unixMs)
Set the current UTC time, e.g. when a client writes the Current Time characteristic....
Definition TinyCTSTimeSource.h:67
virtual uint64_t getTimeMs()=0
The current UTC time in milliseconds since 1970-01-01. It must not block.