6 #ifndef ACE_TIME_BROKERS_MID_H
7 #define ACE_TIME_BROKERS_MID_H
26 #include <AceCommon.h>
29 #include "ZoneInfoMid.h"
31 class __FlashStringHelper;
35 namespace zoneinfomid {
49 inline int16_t toDeltaMinutes(uint8_t deltaCode) {
50 return ((int16_t)(deltaCode & 0x0f) - 4) * 15;
59 inline int16_t toOffsetMinutes(uint8_t offsetCode, uint8_t deltaCode) {
60 return ((int8_t)offsetCode * 15) + ((deltaCode & 0xf0) >> 4);
70 inline uint16_t timeCodeToMinutes(uint8_t code, uint8_t modifier) {
71 return code * (uint16_t) 15 + (modifier & 0x0f);
79 inline uint8_t toSuffix(uint8_t modifier) {
80 return modifier & 0xf0;
90 template <
typename ZC>
94 : mZoneContext(zoneContext)
103 bool isNull()
const {
return mZoneContext ==
nullptr; }
105 const ZC* raw()
const {
return mZoneContext; }
107 int16_t startYear()
const {
108 return (int16_t) pgm_read_word(&mZoneContext->startYear);
111 int16_t untilYear()
const {
112 return (int16_t) pgm_read_word(&mZoneContext->untilYear);
115 int16_t startYearAccurate()
const {
116 return (int16_t) pgm_read_word(&mZoneContext->startYearAccurate);
119 int16_t untilYearAccurate()
const {
120 return (int16_t) pgm_read_word(&mZoneContext->untilYearAccurate);
123 int16_t baseYear()
const {
124 return (int16_t) pgm_read_word(&mZoneContext->baseYear);
127 int16_t maxTransitions()
const {
128 return (int16_t) pgm_read_word(&mZoneContext->maxTransitions);
131 const __FlashStringHelper* tzVersion()
const {
132 return (
const __FlashStringHelper*)
133 pgm_read_ptr(&mZoneContext->tzVersion);
136 uint8_t numFragments()
const {
137 return (uint8_t) pgm_read_byte(&mZoneContext->numFragments);
140 uint8_t numLetters()
const {
141 return (uint8_t) pgm_read_byte(&mZoneContext->numLetters);
144 const __FlashStringHelper*
const* fragments()
const {
145 return (
const __FlashStringHelper*
const*)
146 pgm_read_ptr(&mZoneContext->fragments);
149 const __FlashStringHelper* letter(uint8_t i)
const {
150 const char *
const* letters = (
const char*
const*)
151 pgm_read_ptr(&mZoneContext->letters);
152 const char* letter = (
const char*) pgm_read_ptr(letters + i);
153 return (
const __FlashStringHelper*) letter;
157 const ZC* mZoneContext;
168 template <
typename ZC,
typename ZR>
172 const ZC* zoneContext =
nullptr,
173 const ZR* zoneRule =
nullptr)
174 : mZoneContext(zoneContext)
175 , mZoneRule(zoneRule)
184 bool isNull()
const {
return mZoneRule ==
nullptr; }
186 int16_t fromYear()
const {
187 return pgm_read_word(&mZoneRule->fromYear);
190 int16_t toYear()
const {
191 return pgm_read_word(&mZoneRule->toYear);
194 uint8_t inMonth()
const {
195 return pgm_read_byte(&mZoneRule->inMonth);
198 uint8_t onDayOfWeek()
const {
199 return pgm_read_byte(&mZoneRule->onDayOfWeek);
202 int8_t onDayOfMonth()
const {
203 return pgm_read_byte(&mZoneRule->onDayOfMonth);
206 uint32_t atTimeSeconds()
const {
207 return 60 * timeCodeToMinutes(
208 pgm_read_byte(&mZoneRule->atTimeCode),
209 pgm_read_byte(&mZoneRule->atTimeModifier));
212 uint8_t atTimeSuffix()
const {
213 return toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
216 int32_t deltaSeconds()
const {
217 return 60 * toDeltaMinutes(pgm_read_byte(&mZoneRule->deltaCode));
220 const __FlashStringHelper* letter()
const {
221 uint8_t index = pgm_read_byte(&mZoneRule->letterIndex);
226 const ZC* mZoneContext;
237 template <
typename ZC,
typename ZP,
typename ZR>
241 const ZC* zoneContext,
242 const ZP* zonePolicy)
243 : mZoneContext(zoneContext)
244 , mZonePolicy(zonePolicy)
253 bool isNull()
const {
return mZonePolicy ==
nullptr; }
255 uint8_t numRules()
const {
256 return pgm_read_byte(&mZonePolicy->numRules);
260 const ZR* rules = (
const ZR*) pgm_read_ptr(&mZonePolicy->rules);
265 const ZC* mZoneContext;
266 const ZP* mZonePolicy;
279 template <
typename ZC,
typename ZE,
typename ZP,
typename ZR>
283 const ZC* zoneContext =
nullptr,
284 const ZE* zoneEra =
nullptr)
285 : mZoneContext(zoneContext)
295 bool isNull()
const {
return mZoneEra ==
nullptr; }
298 return mZoneEra == other.mZoneEra;
304 (
const ZP*) pgm_read_ptr(&mZoneEra->zonePolicy));
307 int32_t offsetSeconds()
const {
308 return 60 * toOffsetMinutes(
309 pgm_read_byte(&mZoneEra->offsetCode),
310 pgm_read_byte(&mZoneEra->deltaCode));
313 int32_t deltaSeconds()
const {
314 return 60 * toDeltaMinutes(pgm_read_byte(&mZoneEra->deltaCode));
317 const char* format()
const {
318 return (
const char*) pgm_read_ptr(&mZoneEra->format);
321 int16_t untilYear()
const {
322 return pgm_read_word(&mZoneEra->untilYear);
325 uint8_t untilMonth()
const {
326 return pgm_read_byte(&mZoneEra->untilMonth);
329 uint8_t untilDay()
const {
330 return pgm_read_byte(&mZoneEra->untilDay);
333 uint32_t untilTimeSeconds()
const {
334 return 60 * timeCodeToMinutes(
335 pgm_read_byte(&mZoneEra->untilTimeCode),
336 pgm_read_byte(&mZoneEra->untilTimeModifier));
339 uint8_t untilTimeSuffix()
const {
340 return toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
344 const ZC* mZoneContext;
357 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
361 mZoneInfo(zoneInfo) {}
374 return mZoneInfo == (
const ZI*) zoneKey;
378 return mZoneInfo == zoneInfoBroker.mZoneInfo;
381 bool isNull()
const {
return mZoneInfo ==
nullptr; }
383 const ZoneContextBroker<ZC> zoneContext()
const {
384 const ZC* context = (
const ZC*) pgm_read_ptr(&mZoneInfo->zoneContext);
385 return ZoneContextBroker<ZC>(context);
388 const __FlashStringHelper* name()
const {
389 return FPSTR(pgm_read_ptr(&mZoneInfo->name));
392 uint32_t zoneId()
const {
393 return pgm_read_dword(&mZoneInfo->zoneId);
396 uint8_t numEras()
const {
397 return pgm_read_byte(&mZoneInfo->numEras);
400 const ZoneEraBroker<ZC, ZE, ZP, ZR> era(uint8_t i)
const {
401 auto eras = (
const ZE*) pgm_read_ptr(&mZoneInfo->eras);
402 return ZoneEraBroker<ZC, ZE, ZP, ZR>(zoneContext().raw(), &eras[i]);
405 bool isLink()
const {
406 return mZoneInfo->targetInfo !=
nullptr;
409 ZoneInfoBroker targetInfo()
const {
410 return ZoneInfoBroker(
411 (
const ZI*) pgm_read_ptr(&mZoneInfo->targetInfo));
428 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
431 ace_common::KString kname(name(), zc.fragments(), zc.numFragments());
432 kname.printTo(printer);
435 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
438 ace_common::printReplaceCharTo(
439 printer, zoneinfo::findShortName(name()),
'_',
' ');
450 template <
typename ZI>
454 mZoneRegistry(zoneRegistry) {}
462 const ZI* zoneInfo(uint16_t i)
const {
463 return (
const ZI*) pgm_read_ptr(&mZoneRegistry[i]);
467 const ZI*
const* mZoneRegistry;
483 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
Helper functions are used in both Basic brokers and Extended brokers.
Data broker for accessing a ZoneContext.
Data broker for accessing ZoneEra.
Data broker for accessing ZoneInfo.
void printShortNameTo(Print &printer) const
Print a short human-readable identifier (e.g.
void printNameTo(Print &printer) const
Print a human-readable identifier (e.g.
bool equals(uintptr_t zoneKey) const
A storage object that creates an ZoneInfoBroker from a key that identifies the ZoneInfo.
ZoneInfoBroker< ZC, ZI, ZE, ZP, ZR > createZoneInfoBroker(uintptr_t zoneKey) const
Data broker for accessing ZonePolicy.
Data broker for accessing the ZoneRegistry.
Data broker for accessing ZoneRule.
Macros and definitions that provide a consistency layer among the various Arduino boards for compatib...