6 #ifndef ACE_TIME_BROKERS_H 7 #define ACE_TIME_BROKERS_H 39 #include "../common/compat.h" 48 return code * (uint16_t) 15 + (modifier & 0x0f);
56 return modifier & 0xf0;
69 mZoneRule(zoneRule) {}
80 bool isNull()
const {
return mZoneRule ==
nullptr; }
82 bool isNotNull()
const {
return mZoneRule !=
nullptr; }
84 #if ACE_TIME_USE_PROGMEM 86 int8_t fromYearTiny()
const {
87 return pgm_read_byte(&mZoneRule->fromYearTiny);
90 int8_t toYearTiny()
const {
91 return pgm_read_byte(&mZoneRule->toYearTiny);
94 uint8_t inMonth()
const {
95 return pgm_read_byte(&mZoneRule->inMonth);
98 int8_t onDayOfWeek()
const {
99 return pgm_read_byte(&mZoneRule->onDayOfWeek);
102 int8_t onDayOfMonth()
const {
103 return pgm_read_byte(&mZoneRule->onDayOfMonth);
106 uint16_t atTimeMinutes()
const {
107 return internal::timeCodeToMinutes(
108 pgm_read_byte(&mZoneRule->atTimeCode),
109 pgm_read_byte(&mZoneRule->atTimeModifier));
112 uint8_t atTimeSuffix()
const {
113 return internal::toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
116 int16_t deltaMinutes()
const {
117 return 15 * (int8_t) pgm_read_byte(&mZoneRule->deltaCode);
120 uint8_t letter()
const {
121 return pgm_read_byte(&mZoneRule->letter);
126 int8_t fromYearTiny()
const {
return mZoneRule->fromYearTiny; }
128 int8_t toYearTiny()
const {
return mZoneRule->toYearTiny; }
130 uint8_t inMonth()
const {
return mZoneRule->inMonth; }
132 uint8_t onDayOfWeek()
const {
return mZoneRule->onDayOfWeek; }
134 int8_t onDayOfMonth()
const {
return mZoneRule->onDayOfMonth; }
136 uint16_t atTimeMinutes()
const {
137 return internal::timeCodeToMinutes(
138 mZoneRule->atTimeCode, mZoneRule->atTimeModifier);
141 uint8_t atTimeSuffix()
const {
142 return internal::toSuffix(mZoneRule->atTimeModifier);
145 int16_t deltaMinutes()
const {
return 15 * mZoneRule->deltaCode; }
147 uint8_t letter()
const {
return mZoneRule->letter; }
159 mZonePolicy(zonePolicy) {}
162 mZonePolicy(
nullptr) {}
170 bool isNull()
const {
return mZonePolicy ==
nullptr; }
172 bool isNotNull()
const {
return mZonePolicy !=
nullptr; }
174 #if ACE_TIME_USE_PROGMEM 176 uint8_t numRules()
const {
177 return pgm_read_byte(&mZonePolicy->numRules);
182 (
const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
186 uint8_t numLetters()
const {
187 return pgm_read_byte(&mZonePolicy->numLetters);
190 const char* letter(uint8_t i)
const {
191 const char*
const* letters = (
const char*
const*)
192 pgm_read_ptr(&mZonePolicy->letters);
193 return (
const char*) pgm_read_ptr(&letters[i]);
198 uint8_t numRules()
const {
return mZonePolicy->numRules; }
204 uint8_t numLetters()
const {
return mZonePolicy->numLetters; }
206 const char* letter(uint8_t i)
const {
207 return mZonePolicy->letters[i];
231 const ZoneEra* zoneEra()
const {
return mZoneEra; }
233 bool isNull()
const {
return mZoneEra ==
nullptr; }
235 bool isNotNull()
const {
return mZoneEra !=
nullptr; }
237 #if ACE_TIME_USE_PROGMEM 239 int16_t offsetMinutes()
const {
240 return 15 * (int8_t) pgm_read_byte(&mZoneEra->offsetCode);
245 (
const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
248 int16_t deltaMinutes()
const {
249 return 15 * (int8_t) pgm_read_byte(&mZoneEra->deltaCode);
252 const char* format()
const {
253 return (
const char*) pgm_read_ptr(&mZoneEra->format);
256 int8_t untilYearTiny()
const {
257 return pgm_read_byte(&mZoneEra->untilYearTiny);
260 uint8_t untilMonth()
const {
261 return pgm_read_byte(&mZoneEra->untilMonth);
264 uint8_t untilDay()
const {
265 return pgm_read_byte(&mZoneEra->untilDay);
268 uint16_t untilTimeMinutes()
const {
269 return internal::timeCodeToMinutes(
270 pgm_read_byte(&mZoneEra->untilTimeCode),
271 pgm_read_byte(&mZoneEra->untilTimeModifier));
274 uint8_t untilTimeSuffix()
const {
275 return internal::toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
280 int16_t offsetMinutes()
const {
return 15 * mZoneEra->offsetCode; }
286 int16_t deltaMinutes()
const {
return 15 * mZoneEra->deltaCode; }
288 const char* format()
const {
return mZoneEra->format; }
290 int8_t untilYearTiny()
const {
return mZoneEra->untilYearTiny; }
292 uint8_t untilMonth()
const {
return mZoneEra->untilMonth; }
294 uint8_t untilDay()
const {
return mZoneEra->untilDay; }
296 uint16_t untilTimeMinutes()
const {
297 return internal::timeCodeToMinutes(
298 mZoneEra->untilTimeCode, mZoneEra->untilTimeModifier);
301 uint8_t untilTimeSuffix()
const {
302 return internal::toSuffix(mZoneEra->untilTimeModifier);
315 mZoneInfo(zoneInfo) {}
323 const ZoneInfo* zoneInfo()
const {
return mZoneInfo; }
325 #if ACE_TIME_USE_PROGMEM 327 const char* name()
const {
328 return (
const char*) pgm_read_ptr(&mZoneInfo->name);
331 uint32_t zoneId()
const {
332 return pgm_read_dword(&mZoneInfo->zoneId);
335 int16_t startYear()
const {
337 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
341 int16_t untilYear()
const {
343 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
347 uint8_t numEras()
const {
348 return pgm_read_byte(&mZoneInfo->numEras);
352 const ZoneEra* eras = (
const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
358 const char* name()
const {
return mZoneInfo->name; }
360 uint32_t zoneId()
const {
return mZoneInfo->zoneId; }
362 int16_t startYear()
const {
return mZoneInfo->zoneContext->startYear; }
364 int16_t untilYear()
const {
return mZoneInfo->zoneContext->untilYear; }
366 uint8_t numEras()
const {
return mZoneInfo->numEras; }
385 mZoneRegistry(zoneRegistry) {}
393 #if ACE_TIME_USE_PROGMEM 395 const ZoneInfo* zoneInfo(uint16_t i)
const {
396 return (
const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
401 const ZoneInfo* zoneInfo(uint16_t i)
const {
402 return mZoneRegistry[i];
408 const ZoneInfo*
const*
const mZoneRegistry;
418 inline int16_t toDeltaMinutes(int8_t deltaCode) {
419 return ((int8_t)((uint8_t)deltaCode & 0x0f) - 4) * 15;
425 inline int16_t toOffsetMinutes(int8_t offsetCode, int8_t deltaCode) {
426 return (offsetCode * 15) + (((uint8_t)deltaCode & 0xf0) >> 4);
433 mZoneRule(zoneRule) {}
436 mZoneRule(
nullptr) {}
444 bool isNull()
const {
return mZoneRule ==
nullptr; }
446 bool isNotNull()
const {
return mZoneRule !=
nullptr; }
448 #if ACE_TIME_USE_PROGMEM 450 int8_t fromYearTiny()
const {
451 return pgm_read_byte(&mZoneRule->fromYearTiny);
454 int8_t toYearTiny()
const {
455 return pgm_read_byte(&mZoneRule->toYearTiny);
458 uint8_t inMonth()
const {
459 return pgm_read_byte(&mZoneRule->inMonth);
462 uint8_t onDayOfWeek()
const {
463 return pgm_read_byte(&mZoneRule->onDayOfWeek);
466 int8_t onDayOfMonth()
const {
467 return pgm_read_byte(&mZoneRule->onDayOfMonth);
470 uint16_t atTimeMinutes()
const {
471 return internal::timeCodeToMinutes(
472 pgm_read_byte(&mZoneRule->atTimeCode),
473 pgm_read_byte(&mZoneRule->atTimeModifier));
476 uint8_t atTimeSuffix()
const {
477 return internal::toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
480 int16_t deltaMinutes()
const {
481 return toDeltaMinutes(pgm_read_byte(&mZoneRule->deltaCode));
484 uint8_t letter()
const {
485 return pgm_read_byte(&mZoneRule->letter);
490 int8_t fromYearTiny()
const {
return mZoneRule->fromYearTiny; }
492 int8_t toYearTiny()
const {
return mZoneRule->toYearTiny; }
494 uint8_t inMonth()
const {
return mZoneRule->inMonth; }
496 int8_t onDayOfWeek()
const {
return mZoneRule->onDayOfWeek; }
498 int8_t onDayOfMonth()
const {
return mZoneRule->onDayOfMonth; }
500 uint16_t atTimeMinutes()
const {
501 return internal::timeCodeToMinutes(
502 mZoneRule->atTimeCode, mZoneRule->atTimeModifier);
505 uint8_t atTimeSuffix()
const {
506 return internal::toSuffix(mZoneRule->atTimeModifier);
509 int16_t deltaMinutes()
const {
510 return toDeltaMinutes(mZoneRule->deltaCode);
513 uint8_t letter()
const {
return mZoneRule->letter; }
525 mZonePolicy(zonePolicy) {}
533 bool isNull()
const {
return mZonePolicy ==
nullptr; }
535 bool isNotNull()
const {
return mZonePolicy !=
nullptr; }
537 #if ACE_TIME_USE_PROGMEM 539 uint8_t numRules()
const {
540 return pgm_read_byte(&mZonePolicy->numRules);
545 (
const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
549 uint8_t numLetters()
const {
550 return pgm_read_byte(&mZonePolicy->numLetters);
553 const char* letter(uint8_t i)
const {
554 const char*
const* letters = (
const char*
const*)
555 pgm_read_ptr(&mZonePolicy->letters);
556 return (
const char*) pgm_read_ptr(&letters[i]);
561 uint8_t numRules()
const {
return mZonePolicy->numRules; }
567 uint8_t numLetters()
const {
return mZonePolicy->numLetters; }
569 const char* letter(uint8_t i)
const {
570 return mZonePolicy->letters[i];
594 const ZoneEra* zoneEra()
const {
return mZoneEra; }
596 bool isNull()
const {
return mZoneEra ==
nullptr; }
598 bool isNotNull()
const {
return mZoneEra !=
nullptr; }
600 #if ACE_TIME_USE_PROGMEM 604 (
const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
607 int16_t offsetMinutes()
const {
608 return toOffsetMinutes(
609 pgm_read_byte(&mZoneEra->offsetCode),
610 pgm_read_byte(&mZoneEra->deltaCode));
613 int16_t deltaMinutes()
const {
614 return toDeltaMinutes(pgm_read_byte(&mZoneEra->deltaCode));
617 const char* format()
const {
618 return (
const char*) pgm_read_ptr(&mZoneEra->format);
621 int8_t untilYearTiny()
const {
622 return pgm_read_byte(&mZoneEra->untilYearTiny);
625 uint8_t untilMonth()
const {
626 return pgm_read_byte(&mZoneEra->untilMonth);
629 uint8_t untilDay()
const {
630 return pgm_read_byte(&mZoneEra->untilDay);
633 uint16_t untilTimeMinutes()
const {
634 return internal::timeCodeToMinutes(
635 pgm_read_byte(&mZoneEra->untilTimeCode),
636 pgm_read_byte(&mZoneEra->untilTimeModifier));
639 uint8_t untilTimeSuffix()
const {
640 return internal::toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
649 int16_t offsetMinutes()
const {
650 return toOffsetMinutes(mZoneEra->offsetCode, mZoneEra->deltaCode);
653 int16_t deltaMinutes()
const {
654 return toDeltaMinutes(mZoneEra->deltaCode);
657 const char* format()
const {
return mZoneEra->format; }
659 int8_t untilYearTiny()
const {
return mZoneEra->untilYearTiny; }
661 uint8_t untilMonth()
const {
return mZoneEra->untilMonth; }
663 uint8_t untilDay()
const {
return mZoneEra->untilDay; }
665 uint16_t untilTimeMinutes()
const {
666 return internal::timeCodeToMinutes(
667 mZoneEra->untilTimeCode, mZoneEra->untilTimeModifier);
670 uint8_t untilTimeSuffix()
const {
671 return internal::toSuffix(mZoneEra->untilTimeModifier);
685 mZoneInfo(zoneInfo) {}
693 const ZoneInfo* zoneInfo()
const {
return mZoneInfo; }
695 #if ACE_TIME_USE_PROGMEM 697 const char* name()
const {
698 return (
const char*) pgm_read_ptr(&mZoneInfo->name);
701 uint32_t zoneId()
const {
702 return pgm_read_dword(&mZoneInfo->zoneId);
705 int16_t startYear()
const {
707 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
711 int16_t untilYear()
const {
713 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
717 uint8_t numEras()
const {
718 return pgm_read_byte(&mZoneInfo->numEras);
722 const ZoneEra* eras = (
const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
728 const char* name()
const {
return mZoneInfo->name; }
730 uint32_t zoneId()
const {
return mZoneInfo->zoneId; }
732 int16_t startYear()
const {
return mZoneInfo->zoneContext->startYear; }
734 int16_t untilYear()
const {
return mZoneInfo->zoneContext->untilYear; }
736 uint8_t numEras()
const {
return mZoneInfo->numEras; }
755 mZoneRegistry(zoneRegistry) {}
763 #if ACE_TIME_USE_PROGMEM 765 const ZoneInfo* zoneInfo(uint16_t i)
const {
766 return (
const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
771 const ZoneInfo* zoneInfo(uint16_t i)
const {
772 return mZoneRegistry[i];
778 const ZoneInfo*
const*
const mZoneRegistry;
An entry in ZoneInfo which describes which ZonePolicy was being followed during a particular time per...
const int16_t startYear
Start year of the zone files.
Data broker for accessing the ZoneRegistry.
Data broker for accessing ZoneRule.
A collection of transition rules which describe the DST rules of a given administrative region...
Representation of a given time zone, implemented as an array of ZoneEra records.
A collection of transition rules which describe the DST rules of a given administrative region...
const int16_t startYear
Start year of the zone files.
Representation of a given time zone, implemented as an array of ZoneEra records.
uint8_t toSuffix(uint8_t modifier)
Extract the 'w', 's' 'u' suffix from the 'modifier' field, so that they can be compared against kSuff...
Data broker for accessing ZonePolicy.
An entry in ZoneInfo which describes which ZonePolicy was being followed during a particular time per...
Data broker for accessing ZonePolicy.
A time zone transition rule.
Metadata about the zone database.
Metadata about the zone database.
Data broker for accessing ZoneInfo.
A time zone transition rule.
uint16_t timeCodeToMinutes(uint8_t code, uint8_t modifier)
Convert (timeCode, timeModifier) fields in zoneinfo to minutes.
Data broker for accessing the ZoneRegistry.
Data broker for accessing ZoneEra.
const int16_t untilYear
Until year of the zone files.
Data broker for accessing ZoneEra.
Data broker for accessing ZoneRule.
Data broker for accessing ZoneInfo.
const int16_t untilYear
Until year of the zone files.