6 #ifndef ACE_TIME_BROKERS_HIGH_H
7 #define ACE_TIME_BROKERS_HIGH_H
26 #include <AceCommon.h>
29 #include "ZoneInfoHigh.h"
31 class __FlashStringHelper;
35 namespace zoneinfohigh {
44 return int32_t(60) * (int8_t) deltaMinutes;
51 return int32_t(15) * (int16_t) offsetCode + (int32_t) offsetRemainder;
61 return code * (uint32_t) 15 + (modifier & 0x0f);
70 return modifier & 0xf0;
80 template <
typename ZC>
84 : mZoneContext(zoneContext)
93 bool isNull()
const {
return mZoneContext ==
nullptr; }
95 const ZC* raw()
const {
return mZoneContext; }
97 int16_t startYear()
const {
98 return (int16_t) pgm_read_word(&mZoneContext->startYear);
101 int16_t untilYear()
const {
102 return (int16_t) pgm_read_word(&mZoneContext->untilYear);
105 int16_t startYearAccurate()
const {
106 return (int16_t) pgm_read_word(&mZoneContext->startYearAccurate);
109 int16_t untilYearAccurate()
const {
110 return (int16_t) pgm_read_word(&mZoneContext->untilYearAccurate);
113 int16_t baseYear()
const {
114 return (int16_t) pgm_read_word(&mZoneContext->baseYear);
117 int16_t maxTransitions()
const {
118 return (int16_t) pgm_read_word(&mZoneContext->maxTransitions);
121 const __FlashStringHelper* tzVersion()
const {
122 return (
const __FlashStringHelper*)
123 pgm_read_ptr(&mZoneContext->tzVersion);
126 uint8_t numFragments()
const {
127 return (uint8_t) pgm_read_byte(&mZoneContext->numFragments);
130 uint8_t numLetters()
const {
131 return (uint8_t) pgm_read_byte(&mZoneContext->numLetters);
134 const __FlashStringHelper*
const* fragments()
const {
135 return (
const __FlashStringHelper*
const*)
136 pgm_read_ptr(&mZoneContext->fragments);
139 const __FlashStringHelper* letter(uint8_t i)
const {
140 const char *
const* letters = (
const char*
const*)
141 pgm_read_ptr(&mZoneContext->letters);
142 const char* letter = (
const char*) pgm_read_ptr(letters + i);
143 return (
const __FlashStringHelper*) letter;
147 const ZC* mZoneContext;
158 template <
typename ZC,
typename ZR>
162 const ZC* zoneContext =
nullptr,
163 const ZR* zoneRule =
nullptr)
164 : mZoneContext(zoneContext)
165 , mZoneRule(zoneRule)
174 bool isNull()
const {
return mZoneRule ==
nullptr; }
176 int16_t fromYear()
const {
177 return pgm_read_word(&mZoneRule->fromYear);
180 int16_t toYear()
const {
181 return pgm_read_word(&mZoneRule->toYear);
184 uint8_t inMonth()
const {
185 return pgm_read_byte(&mZoneRule->inMonth);
188 uint8_t onDayOfWeek()
const {
189 return pgm_read_byte(&mZoneRule->onDayOfWeek);
192 int8_t onDayOfMonth()
const {
193 return pgm_read_byte(&mZoneRule->onDayOfMonth);
196 uint32_t atTimeSeconds()
const {
198 pgm_read_word(&mZoneRule->atTimeCode),
199 pgm_read_byte(&mZoneRule->atTimeModifier));
202 uint8_t atTimeSuffix()
const {
203 return toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
206 int32_t deltaSeconds()
const {
210 const __FlashStringHelper* letter()
const {
211 uint8_t index = pgm_read_byte(&mZoneRule->letterIndex);
216 const ZC* mZoneContext;
227 template <
typename ZC,
typename ZP,
typename ZR>
231 const ZC* zoneContext,
232 const ZP* zonePolicy)
233 : mZoneContext(zoneContext)
234 , mZonePolicy(zonePolicy)
243 bool isNull()
const {
return mZonePolicy ==
nullptr; }
245 uint8_t numRules()
const {
246 return pgm_read_byte(&mZonePolicy->numRules);
250 const ZR* rules = (
const ZR*) pgm_read_ptr(&mZonePolicy->rules);
255 const ZC* mZoneContext;
256 const ZP* mZonePolicy;
269 template <
typename ZC,
typename ZE,
typename ZP,
typename ZR>
273 const ZC* zoneContext =
nullptr,
274 const ZE* zoneEra =
nullptr)
275 : mZoneContext(zoneContext)
285 bool isNull()
const {
return mZoneEra ==
nullptr; }
288 return mZoneEra == other.mZoneEra;
294 (
const ZP*) pgm_read_ptr(&mZoneEra->zonePolicy));
297 int32_t offsetSeconds()
const {
299 pgm_read_word(&mZoneEra->offsetCode),
300 pgm_read_byte(&mZoneEra->offsetRemainder));
303 int32_t deltaSeconds()
const {
307 const char* format()
const {
308 return (
const char*) pgm_read_ptr(&mZoneEra->format);
311 int16_t untilYear()
const {
312 return pgm_read_word(&mZoneEra->untilYear);
315 uint8_t untilMonth()
const {
316 return pgm_read_byte(&mZoneEra->untilMonth);
319 uint8_t untilDay()
const {
320 return pgm_read_byte(&mZoneEra->untilDay);
323 uint32_t untilTimeSeconds()
const {
325 pgm_read_word(&mZoneEra->untilTimeCode),
326 pgm_read_byte(&mZoneEra->untilTimeModifier));
329 uint8_t untilTimeSuffix()
const {
330 return toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
334 const ZC* mZoneContext;
347 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
351 mZoneInfo(zoneInfo) {}
364 return mZoneInfo == (
const ZI*) zoneKey;
368 return mZoneInfo == zoneInfoBroker.mZoneInfo;
371 bool isNull()
const {
return mZoneInfo ==
nullptr; }
373 const ZoneContextBroker<ZC> zoneContext()
const {
374 const ZC* context = (
const ZC*) pgm_read_ptr(&mZoneInfo->zoneContext);
375 return ZoneContextBroker<ZC>(context);
378 const __FlashStringHelper* name()
const {
379 return FPSTR(pgm_read_ptr(&mZoneInfo->name));
382 uint32_t zoneId()
const {
383 return pgm_read_dword(&mZoneInfo->zoneId);
386 uint8_t numEras()
const {
387 return pgm_read_byte(&mZoneInfo->numEras);
390 const ZoneEraBroker<ZC, ZE, ZP, ZR> era(uint8_t i)
const {
391 auto eras = (
const ZE*) pgm_read_ptr(&mZoneInfo->eras);
392 return ZoneEraBroker<ZC, ZE, ZP, ZR>(zoneContext().raw(), &eras[i]);
395 bool isLink()
const {
396 return mZoneInfo->targetInfo !=
nullptr;
399 ZoneInfoBroker targetInfo()
const {
400 return ZoneInfoBroker(
401 (
const ZI*) pgm_read_ptr(&mZoneInfo->targetInfo));
418 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
421 ace_common::KString kname(name(), zc.fragments(), zc.numFragments());
422 kname.printTo(printer);
425 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
428 ace_common::printReplaceCharTo(
429 printer, zoneinfo::findShortName(name()),
'_',
' ');
440 template <
typename ZI>
444 mZoneRegistry(zoneRegistry) {}
452 const ZI* zoneInfo(uint16_t i)
const {
453 return (
const ZI*) pgm_read_ptr(&mZoneRegistry[i]);
457 const ZI*
const* mZoneRegistry;
473 template <
typename ZC,
typename ZI,
typename ZE,
typename ZP,
typename ZR>
Helper functions are used in both Basic brokers and Extended brokers.
uint32_t timeCodeToSeconds(uint16_t code, uint8_t modifier)
Convert (code, modifier) holding the UNTIL time in ZoneInfo or AT time in ZoneRule into seconds.
uint8_t toSuffix(uint8_t modifier)
Extract the 'w', 's' 'u' suffix from the 'modifier' field, so that they can be compared against kSuff...
int32_t toDeltaSeconds(uint8_t deltaMinutes)
Convert the deltaMinutes holding the RULES/DSTOFF field in ZoneEra or the SAVE field in ZoneRule to d...
int32_t toOffsetSeconds(uint16_t offsetCode, uint8_t offsetRemainder)
Convert (code, remainder) holding the STDOFF field of ZoneEra into seconds.
Data broker for accessing a ZoneContext.
Data broker for accessing ZoneEra.
Data broker for accessing ZoneInfo.
bool equals(uintptr_t zoneKey) const
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.
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...