6 #ifndef ACE_TIME_BROKERS_H
7 #define ACE_TIME_BROKERS_H
39 #include <AceCommon.h>
42 #include "ZoneContext.h"
45 class __FlashStringHelper;
56 template <
typename ZR>
61 const ZR* zoneRule =
nullptr)
62 : mZoneContext(zoneContext)
72 bool isNull()
const {
return mZoneRule ==
nullptr; }
74 #if ACE_TIME_USE_PROGMEM
76 int16_t fromYear()
const {
77 return pgm_read_word(&mZoneRule->fromYear);
80 int16_t toYear()
const {
81 return pgm_read_word(&mZoneRule->toYear);
84 uint8_t inMonth()
const {
85 return pgm_read_byte(&mZoneRule->inMonth);
88 uint8_t onDayOfWeek()
const {
89 return pgm_read_byte(&mZoneRule->onDayOfWeek);
92 int8_t onDayOfMonth()
const {
93 return pgm_read_byte(&mZoneRule->onDayOfMonth);
96 uint16_t atTimeMinutes()
const {
97 return internal::timeCodeToMinutes(
98 pgm_read_byte(&mZoneRule->atTimeCode),
99 pgm_read_byte(&mZoneRule->atTimeModifier));
102 uint8_t atTimeSuffix()
const {
103 return internal::toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
106 int16_t deltaMinutes()
const {
107 return internal::toDeltaMinutes(pgm_read_byte(&mZoneRule->deltaCode));
110 const char* letter()
const {
111 uint8_t index = pgm_read_byte(&mZoneRule->letterIndex);
112 return mZoneContext->
letters[index];
117 int16_t fromYear()
const {
return mZoneRule->fromYear; }
119 int16_t toYear()
const {
return mZoneRule->toYear; }
121 uint8_t inMonth()
const {
return mZoneRule->inMonth; }
123 uint8_t onDayOfWeek()
const {
return mZoneRule->onDayOfWeek; }
125 int8_t onDayOfMonth()
const {
return mZoneRule->onDayOfMonth; }
127 uint16_t atTimeMinutes()
const {
128 return internal::timeCodeToMinutes(
129 mZoneRule->atTimeCode, mZoneRule->atTimeModifier);
132 uint8_t atTimeSuffix()
const {
133 return internal::toSuffix(mZoneRule->atTimeModifier);
136 int16_t deltaMinutes()
const {
137 return internal::toDeltaMinutes(mZoneRule->deltaCode);
140 const char* letter()
const {
141 uint8_t index = mZoneRule->letterIndex;
142 return mZoneContext->
letters[index];
158 template <
typename ZP,
typename ZR>
163 const ZP* zonePolicy)
164 : mZoneContext(zoneContext)
165 , mZonePolicy(zonePolicy)
174 bool isNull()
const {
return mZonePolicy ==
nullptr; }
176 #if ACE_TIME_USE_PROGMEM
178 uint8_t numRules()
const {
179 return pgm_read_byte(&mZonePolicy->numRules);
183 const ZR* rules = (
const ZR*) pgm_read_ptr(&mZonePolicy->rules);
189 uint8_t numRules()
const {
return mZonePolicy->numRules; }
199 const ZP* mZonePolicy;
211 template <
typename ZE,
typename ZP,
typename ZR>
216 const ZE* zoneEra =
nullptr)
217 : mZoneContext(zoneContext)
227 bool isNull()
const {
return mZoneEra ==
nullptr; }
230 return mZoneEra == other.mZoneEra;
233 #if ACE_TIME_USE_PROGMEM
238 (
const ZP*) pgm_read_ptr(&mZoneEra->zonePolicy));
241 int16_t offsetMinutes()
const {
242 return internal::toOffsetMinutes(
243 pgm_read_byte(&mZoneEra->offsetCode),
244 pgm_read_byte(&mZoneEra->deltaCode));
247 int16_t deltaMinutes()
const {
248 return internal::toDeltaMinutes(pgm_read_byte(&mZoneEra->deltaCode));
251 const char* format()
const {
252 return (
const char*) pgm_read_ptr(&mZoneEra->format);
255 int16_t untilYear()
const {
256 return pgm_read_word(&mZoneEra->untilYear);
259 uint8_t untilMonth()
const {
260 return pgm_read_byte(&mZoneEra->untilMonth);
263 uint8_t untilDay()
const {
264 return pgm_read_byte(&mZoneEra->untilDay);
267 uint16_t untilTimeMinutes()
const {
268 return internal::timeCodeToMinutes(
269 pgm_read_byte(&mZoneEra->untilTimeCode),
270 pgm_read_byte(&mZoneEra->untilTimeModifier));
273 uint8_t untilTimeSuffix()
const {
274 return internal::toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
283 int16_t offsetMinutes()
const {
284 return internal::toOffsetMinutes(
285 mZoneEra->offsetCode, mZoneEra->deltaCode);
288 int16_t deltaMinutes()
const {
289 return internal::toDeltaMinutes(mZoneEra->deltaCode);
292 const char* format()
const {
return mZoneEra->format; }
294 int16_t untilYear()
const {
return mZoneEra->untilYear; }
296 uint8_t untilMonth()
const {
return mZoneEra->untilMonth; }
298 uint8_t untilDay()
const {
return mZoneEra->untilDay; }
300 uint16_t untilTimeMinutes()
const {
301 return internal::timeCodeToMinutes(
302 mZoneEra->untilTimeCode, mZoneEra->untilTimeModifier);
305 uint8_t untilTimeSuffix()
const {
306 return internal::toSuffix(mZoneEra->untilTimeModifier);
324 template <
typename ZI,
typename ZE,
typename ZP,
typename ZR>
328 mZoneInfo(zoneInfo) {}
341 return mZoneInfo == (
const ZI*) zoneKey;
345 return mZoneInfo == zoneInfoBroker.mZoneInfo;
348 bool isNull()
const {
return mZoneInfo ==
nullptr; }
350 #if ACE_TIME_USE_PROGMEM
352 const internal::ZoneContext* zoneContext()
const {
353 return (
const internal::ZoneContext*)
354 pgm_read_ptr(&mZoneInfo->zoneContext);
357 const __FlashStringHelper* name()
const {
358 return FPSTR(pgm_read_ptr(&mZoneInfo->name));
361 uint32_t zoneId()
const {
362 return pgm_read_dword(&mZoneInfo->zoneId);
365 uint8_t numEras()
const {
366 return pgm_read_byte(&mZoneInfo->numEras);
369 const ZoneEraBroker<ZE, ZP, ZR> era(uint8_t i)
const {
370 auto eras = (
const ZE*) pgm_read_ptr(&mZoneInfo->eras);
371 return ZoneEraBroker<ZE, ZP, ZR>(zoneContext(), &eras[i]);
374 bool isLink()
const {
375 return mZoneInfo->targetInfo !=
nullptr;
378 ZoneInfoBroker targetInfo()
const {
379 return ZoneInfoBroker(
380 (
const ZI*) pgm_read_ptr(&mZoneInfo->targetInfo));
385 const internal::ZoneContext* zoneContext()
const {
386 return mZoneInfo->zoneContext;
389 const char* name()
const {
return mZoneInfo->name; }
391 uint32_t zoneId()
const {
return mZoneInfo->zoneId; }
393 uint8_t numEras()
const {
return mZoneInfo->numEras; }
399 const ZoneInfoBroker targetInfo()
const {
400 return ZoneInfoBroker(mZoneInfo->targetInfo);
419 template <
typename ZI,
typename ZE,
typename ZP,
typename ZR>
423 kname.printTo(printer);
426 template <
typename ZI,
typename ZE,
typename ZP,
typename ZR>
428 ace_common::printReplaceCharTo(printer, findShortName(name()),
'_',
' ');
439 template <
typename ZI>
443 mZoneRegistry(zoneRegistry) {}
451 #if ACE_TIME_USE_PROGMEM
453 const ZI* zoneInfo(uint16_t i)
const {
454 return (
const ZI*) pgm_read_ptr(&mZoneRegistry[i]);
459 const ZI* zoneInfo(uint16_t i)
const {
460 return mZoneRegistry[i];
466 const ZI*
const* mZoneRegistry;
479 template <
typename ZI,
typename ZE,
typename ZP,
typename ZR>
509 ZoneInfo, ZoneEra, ZonePolicy, ZoneRule>;
518 ZoneInfo, ZoneEra, ZonePolicy, ZoneRule>;
537 ZoneInfo, ZoneEra, ZonePolicy, ZoneRule>;
546 ZoneInfo, ZoneEra, ZonePolicy, ZoneRule>;
Helper functions are used in both Basic brokers and Extended brokers.
internal::ZoneEraBroker< ZoneEra, ZonePolicy, ZoneRule > ZoneEraBroker
Data broker for accessing ZoneEra.
A factory that creates an ZoneInfoBroker.
ZoneInfoBroker< ZI, ZE, ZP, ZR > createZoneInfoBroker(uintptr_t zoneKey) const
Data broker for accessing ZoneEra.
Data broker for accessing ZoneInfo.
void printNameTo(Print &printer) const
Print a human-readable identifier (e.g.
void printShortNameTo(Print &printer) const
Print a short human-readable identifier (e.g.
bool equals(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...
Metadata about the zone database.
uint8_t numFragments
Number of fragments.
const char *const * fragments
Zone Name fragment list.
const char *const * letters
Zone Rule letters list.