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 #if ACE_TIME_USE_PROGMEM
84 int8_t fromYearTiny()
const {
85 return pgm_read_byte(&mZoneRule->fromYearTiny);
88 int8_t toYearTiny()
const {
89 return pgm_read_byte(&mZoneRule->toYearTiny);
92 uint8_t inMonth()
const {
93 return pgm_read_byte(&mZoneRule->inMonth);
96 int8_t onDayOfWeek()
const {
97 return pgm_read_byte(&mZoneRule->onDayOfWeek);
100 int8_t onDayOfMonth()
const {
101 return pgm_read_byte(&mZoneRule->onDayOfMonth);
104 uint16_t atTimeMinutes()
const {
105 return internal::timeCodeToMinutes(
106 pgm_read_byte(&mZoneRule->atTimeCode),
107 pgm_read_byte(&mZoneRule->atTimeModifier));
110 uint8_t atTimeSuffix()
const {
111 return internal::toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
114 int16_t deltaMinutes()
const {
115 return 15 * (int8_t) pgm_read_byte(&mZoneRule->deltaCode);
118 uint8_t letter()
const {
119 return pgm_read_byte(&mZoneRule->letter);
124 int8_t fromYearTiny()
const {
return mZoneRule->fromYearTiny; }
126 int8_t toYearTiny()
const {
return mZoneRule->toYearTiny; }
128 uint8_t inMonth()
const {
return mZoneRule->inMonth; }
130 uint8_t onDayOfWeek()
const {
return mZoneRule->onDayOfWeek; }
132 int8_t onDayOfMonth()
const {
return mZoneRule->onDayOfMonth; }
134 uint16_t atTimeMinutes()
const {
135 return internal::timeCodeToMinutes(
136 mZoneRule->atTimeCode, mZoneRule->atTimeModifier);
139 uint8_t atTimeSuffix()
const {
140 return internal::toSuffix(mZoneRule->atTimeModifier);
143 int16_t deltaMinutes()
const {
return 15 * mZoneRule->deltaCode; }
145 uint8_t letter()
const {
return mZoneRule->letter; }
150 const ZoneRule* mZoneRule;
157 mZonePolicy(zonePolicy) {}
160 mZonePolicy(
nullptr) {}
168 bool isNull()
const {
return mZonePolicy ==
nullptr; }
170 #if ACE_TIME_USE_PROGMEM
172 uint8_t numRules()
const {
173 return pgm_read_byte(&mZonePolicy->numRules);
177 const ZoneRule* rules =
178 (
const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
182 uint8_t numLetters()
const {
183 return pgm_read_byte(&mZonePolicy->numLetters);
186 const char* letter(uint8_t i)
const {
187 const char*
const* letters = (
const char*
const*)
188 pgm_read_ptr(&mZonePolicy->letters);
189 return (
const char*) pgm_read_ptr(&letters[i]);
194 uint8_t numRules()
const {
return mZonePolicy->numRules; }
200 uint8_t numLetters()
const {
return mZonePolicy->numLetters; }
202 const char* letter(uint8_t i)
const {
203 return mZonePolicy->letters[i];
209 const ZonePolicy* mZonePolicy;
227 const ZoneEra* zoneEra()
const {
return mZoneEra; }
229 bool isNull()
const {
return mZoneEra ==
nullptr; }
231 #if ACE_TIME_USE_PROGMEM
233 int16_t offsetMinutes()
const {
234 return 15 * (int8_t) pgm_read_byte(&mZoneEra->offsetCode);
239 (
const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
242 int16_t deltaMinutes()
const {
243 return 15 * (int8_t) pgm_read_byte(&mZoneEra->deltaCode);
246 const char* format()
const {
247 return (
const char*) pgm_read_ptr(&mZoneEra->format);
250 int8_t untilYearTiny()
const {
251 return pgm_read_byte(&mZoneEra->untilYearTiny);
254 uint8_t untilMonth()
const {
255 return pgm_read_byte(&mZoneEra->untilMonth);
258 uint8_t untilDay()
const {
259 return pgm_read_byte(&mZoneEra->untilDay);
262 uint16_t untilTimeMinutes()
const {
263 return internal::timeCodeToMinutes(
264 pgm_read_byte(&mZoneEra->untilTimeCode),
265 pgm_read_byte(&mZoneEra->untilTimeModifier));
268 uint8_t untilTimeSuffix()
const {
269 return internal::toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
274 int16_t offsetMinutes()
const {
return 15 * mZoneEra->offsetCode; }
280 int16_t deltaMinutes()
const {
return 15 * mZoneEra->deltaCode; }
282 const char* format()
const {
return mZoneEra->format; }
284 int8_t untilYearTiny()
const {
return mZoneEra->untilYearTiny; }
286 uint8_t untilMonth()
const {
return mZoneEra->untilMonth; }
288 uint8_t untilDay()
const {
return mZoneEra->untilDay; }
290 uint16_t untilTimeMinutes()
const {
291 return internal::timeCodeToMinutes(
292 mZoneEra->untilTimeCode, mZoneEra->untilTimeModifier);
295 uint8_t untilTimeSuffix()
const {
296 return internal::toSuffix(mZoneEra->untilTimeModifier);
302 const ZoneEra* mZoneEra;
309 mZoneInfo(zoneInfo) {}
317 const ZoneInfo* zoneInfo()
const {
return mZoneInfo; }
319 #if ACE_TIME_USE_PROGMEM
321 const char* name()
const {
322 return (
const char*) pgm_read_ptr(&mZoneInfo->name);
325 uint32_t zoneId()
const {
326 return pgm_read_dword(&mZoneInfo->zoneId);
329 int16_t startYear()
const {
330 const ZoneContext* zoneContext =
331 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
332 return zoneContext->startYear;
335 int16_t untilYear()
const {
336 const ZoneContext* zoneContext =
337 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
338 return zoneContext->untilYear;
341 uint8_t numEras()
const {
342 return pgm_read_byte(&mZoneInfo->numEras);
346 const ZoneEra* eras = (
const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
352 const char* name()
const {
return mZoneInfo->name; }
354 uint32_t zoneId()
const {
return mZoneInfo->zoneId; }
356 int16_t startYear()
const {
return mZoneInfo->zoneContext->startYear; }
358 int16_t untilYear()
const {
return mZoneInfo->zoneContext->untilYear; }
360 uint8_t numEras()
const {
return mZoneInfo->numEras; }
369 const ZoneInfo* mZoneInfo;
379 mZoneRegistry(zoneRegistry) {}
387 #if ACE_TIME_USE_PROGMEM
389 const ZoneInfo* zoneInfo(uint16_t i)
const {
390 return (
const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
395 const ZoneInfo* zoneInfo(uint16_t i)
const {
396 return mZoneRegistry[i];
402 const ZoneInfo*
const*
const mZoneRegistry;
420 return ((int8_t)((uint8_t)deltaCode & 0x0f) - 4) * 15;
429 return (offsetCode * 15) + (((uint8_t)deltaCode & 0xf0) >> 4);
436 mZoneRule(zoneRule) {}
439 mZoneRule(
nullptr) {}
447 bool isNull()
const {
return mZoneRule ==
nullptr; }
449 #if ACE_TIME_USE_PROGMEM
451 int8_t fromYearTiny()
const {
452 return pgm_read_byte(&mZoneRule->fromYearTiny);
455 int8_t toYearTiny()
const {
456 return pgm_read_byte(&mZoneRule->toYearTiny);
459 uint8_t inMonth()
const {
460 return pgm_read_byte(&mZoneRule->inMonth);
463 uint8_t onDayOfWeek()
const {
464 return pgm_read_byte(&mZoneRule->onDayOfWeek);
467 int8_t onDayOfMonth()
const {
468 return pgm_read_byte(&mZoneRule->onDayOfMonth);
471 uint16_t atTimeMinutes()
const {
472 return internal::timeCodeToMinutes(
473 pgm_read_byte(&mZoneRule->atTimeCode),
474 pgm_read_byte(&mZoneRule->atTimeModifier));
477 uint8_t atTimeSuffix()
const {
478 return internal::toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
481 int16_t deltaMinutes()
const {
485 uint8_t letter()
const {
486 return pgm_read_byte(&mZoneRule->letter);
491 int8_t fromYearTiny()
const {
return mZoneRule->fromYearTiny; }
493 int8_t toYearTiny()
const {
return mZoneRule->toYearTiny; }
495 uint8_t inMonth()
const {
return mZoneRule->inMonth; }
497 int8_t onDayOfWeek()
const {
return mZoneRule->onDayOfWeek; }
499 int8_t onDayOfMonth()
const {
return mZoneRule->onDayOfMonth; }
501 uint16_t atTimeMinutes()
const {
502 return internal::timeCodeToMinutes(
503 mZoneRule->atTimeCode, mZoneRule->atTimeModifier);
506 uint8_t atTimeSuffix()
const {
507 return internal::toSuffix(mZoneRule->atTimeModifier);
510 int16_t deltaMinutes()
const {
514 uint8_t letter()
const {
return mZoneRule->letter; }
519 const ZoneRule* mZoneRule;
526 mZonePolicy(zonePolicy) {}
534 bool isNull()
const {
return mZonePolicy ==
nullptr; }
536 #if ACE_TIME_USE_PROGMEM
538 uint8_t numRules()
const {
539 return pgm_read_byte(&mZonePolicy->numRules);
543 const ZoneRule* rules =
544 (
const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
548 uint8_t numLetters()
const {
549 return pgm_read_byte(&mZonePolicy->numLetters);
552 const char* letter(uint8_t i)
const {
553 const char*
const* letters = (
const char*
const*)
554 pgm_read_ptr(&mZonePolicy->letters);
555 return (
const char*) pgm_read_ptr(&letters[i]);
560 uint8_t numRules()
const {
return mZonePolicy->numRules; }
566 uint8_t numLetters()
const {
return mZonePolicy->numLetters; }
568 const char* letter(uint8_t i)
const {
569 return mZonePolicy->letters[i];
575 const ZonePolicy*
const mZonePolicy;
593 const ZoneEra* zoneEra()
const {
return mZoneEra; }
595 bool isNull()
const {
return mZoneEra ==
nullptr; }
597 #if ACE_TIME_USE_PROGMEM
601 (
const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
604 int16_t offsetMinutes()
const {
606 pgm_read_byte(&mZoneEra->offsetCode),
607 pgm_read_byte(&mZoneEra->deltaCode));
610 int16_t deltaMinutes()
const {
614 const char* format()
const {
615 return (
const char*) pgm_read_ptr(&mZoneEra->format);
618 int8_t untilYearTiny()
const {
619 return pgm_read_byte(&mZoneEra->untilYearTiny);
622 uint8_t untilMonth()
const {
623 return pgm_read_byte(&mZoneEra->untilMonth);
626 uint8_t untilDay()
const {
627 return pgm_read_byte(&mZoneEra->untilDay);
630 uint16_t untilTimeMinutes()
const {
631 return internal::timeCodeToMinutes(
632 pgm_read_byte(&mZoneEra->untilTimeCode),
633 pgm_read_byte(&mZoneEra->untilTimeModifier));
636 uint8_t untilTimeSuffix()
const {
637 return internal::toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
646 int16_t offsetMinutes()
const {
650 int16_t deltaMinutes()
const {
654 const char* format()
const {
return mZoneEra->format; }
656 int8_t untilYearTiny()
const {
return mZoneEra->untilYearTiny; }
658 uint8_t untilMonth()
const {
return mZoneEra->untilMonth; }
660 uint8_t untilDay()
const {
return mZoneEra->untilDay; }
662 uint16_t untilTimeMinutes()
const {
663 return internal::timeCodeToMinutes(
664 mZoneEra->untilTimeCode, mZoneEra->untilTimeModifier);
667 uint8_t untilTimeSuffix()
const {
668 return internal::toSuffix(mZoneEra->untilTimeModifier);
674 const ZoneEra* mZoneEra;
682 mZoneInfo(zoneInfo) {}
690 const ZoneInfo* zoneInfo()
const {
return mZoneInfo; }
692 #if ACE_TIME_USE_PROGMEM
694 const char* name()
const {
695 return (
const char*) pgm_read_ptr(&mZoneInfo->name);
698 uint32_t zoneId()
const {
699 return pgm_read_dword(&mZoneInfo->zoneId);
702 int16_t startYear()
const {
703 const ZoneContext* zoneContext =
704 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
705 return zoneContext->startYear;
708 int16_t untilYear()
const {
709 const ZoneContext* zoneContext =
710 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
711 return zoneContext->untilYear;
714 uint8_t numEras()
const {
715 return pgm_read_byte(&mZoneInfo->numEras);
719 const ZoneEra* eras = (
const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
725 const char* name()
const {
return mZoneInfo->name; }
727 uint32_t zoneId()
const {
return mZoneInfo->zoneId; }
729 int16_t startYear()
const {
return mZoneInfo->zoneContext->startYear; }
731 int16_t untilYear()
const {
return mZoneInfo->zoneContext->untilYear; }
733 uint8_t numEras()
const {
return mZoneInfo->numEras; }
742 const ZoneInfo* mZoneInfo;
752 mZoneRegistry(zoneRegistry) {}
760 #if ACE_TIME_USE_PROGMEM
762 const ZoneInfo* zoneInfo(uint16_t i)
const {
763 return (
const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
768 const ZoneInfo* zoneInfo(uint16_t i)
const {
769 return mZoneRegistry[i];
775 const ZoneInfo*
const*
const mZoneRegistry;