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;
412 inline int16_t toDeltaMinutes(int8_t deltaCode) {
413 return ((int8_t)((uint8_t)deltaCode & 0x0f) - 4) * 15;
419 inline int16_t toOffsetMinutes(int8_t offsetCode, int8_t deltaCode) {
420 return (offsetCode * 15) + (((uint8_t)deltaCode & 0xf0) >> 4);
427 mZoneRule(zoneRule) {}
430 mZoneRule(
nullptr) {}
438 bool isNull()
const {
return mZoneRule ==
nullptr; }
440 #if ACE_TIME_USE_PROGMEM
442 int8_t fromYearTiny()
const {
443 return pgm_read_byte(&mZoneRule->fromYearTiny);
446 int8_t toYearTiny()
const {
447 return pgm_read_byte(&mZoneRule->toYearTiny);
450 uint8_t inMonth()
const {
451 return pgm_read_byte(&mZoneRule->inMonth);
454 uint8_t onDayOfWeek()
const {
455 return pgm_read_byte(&mZoneRule->onDayOfWeek);
458 int8_t onDayOfMonth()
const {
459 return pgm_read_byte(&mZoneRule->onDayOfMonth);
462 uint16_t atTimeMinutes()
const {
463 return internal::timeCodeToMinutes(
464 pgm_read_byte(&mZoneRule->atTimeCode),
465 pgm_read_byte(&mZoneRule->atTimeModifier));
468 uint8_t atTimeSuffix()
const {
469 return internal::toSuffix(pgm_read_byte(&mZoneRule->atTimeModifier));
472 int16_t deltaMinutes()
const {
473 return toDeltaMinutes(pgm_read_byte(&mZoneRule->deltaCode));
476 uint8_t letter()
const {
477 return pgm_read_byte(&mZoneRule->letter);
482 int8_t fromYearTiny()
const {
return mZoneRule->fromYearTiny; }
484 int8_t toYearTiny()
const {
return mZoneRule->toYearTiny; }
486 uint8_t inMonth()
const {
return mZoneRule->inMonth; }
488 int8_t onDayOfWeek()
const {
return mZoneRule->onDayOfWeek; }
490 int8_t onDayOfMonth()
const {
return mZoneRule->onDayOfMonth; }
492 uint16_t atTimeMinutes()
const {
493 return internal::timeCodeToMinutes(
494 mZoneRule->atTimeCode, mZoneRule->atTimeModifier);
497 uint8_t atTimeSuffix()
const {
498 return internal::toSuffix(mZoneRule->atTimeModifier);
501 int16_t deltaMinutes()
const {
502 return toDeltaMinutes(mZoneRule->deltaCode);
505 uint8_t letter()
const {
return mZoneRule->letter; }
510 const ZoneRule* mZoneRule;
517 mZonePolicy(zonePolicy) {}
525 bool isNull()
const {
return mZonePolicy ==
nullptr; }
527 #if ACE_TIME_USE_PROGMEM
529 uint8_t numRules()
const {
530 return pgm_read_byte(&mZonePolicy->numRules);
534 const ZoneRule* rules =
535 (
const ZoneRule*) pgm_read_ptr(&mZonePolicy->rules);
539 uint8_t numLetters()
const {
540 return pgm_read_byte(&mZonePolicy->numLetters);
543 const char* letter(uint8_t i)
const {
544 const char*
const* letters = (
const char*
const*)
545 pgm_read_ptr(&mZonePolicy->letters);
546 return (
const char*) pgm_read_ptr(&letters[i]);
551 uint8_t numRules()
const {
return mZonePolicy->numRules; }
557 uint8_t numLetters()
const {
return mZonePolicy->numLetters; }
559 const char* letter(uint8_t i)
const {
560 return mZonePolicy->letters[i];
566 const ZonePolicy*
const mZonePolicy;
584 const ZoneEra* zoneEra()
const {
return mZoneEra; }
586 bool isNull()
const {
return mZoneEra ==
nullptr; }
588 #if ACE_TIME_USE_PROGMEM
592 (
const ZonePolicy*) pgm_read_ptr(&mZoneEra->zonePolicy));
595 int16_t offsetMinutes()
const {
596 return toOffsetMinutes(
597 pgm_read_byte(&mZoneEra->offsetCode),
598 pgm_read_byte(&mZoneEra->deltaCode));
601 int16_t deltaMinutes()
const {
602 return toDeltaMinutes(pgm_read_byte(&mZoneEra->deltaCode));
605 const char* format()
const {
606 return (
const char*) pgm_read_ptr(&mZoneEra->format);
609 int8_t untilYearTiny()
const {
610 return pgm_read_byte(&mZoneEra->untilYearTiny);
613 uint8_t untilMonth()
const {
614 return pgm_read_byte(&mZoneEra->untilMonth);
617 uint8_t untilDay()
const {
618 return pgm_read_byte(&mZoneEra->untilDay);
621 uint16_t untilTimeMinutes()
const {
622 return internal::timeCodeToMinutes(
623 pgm_read_byte(&mZoneEra->untilTimeCode),
624 pgm_read_byte(&mZoneEra->untilTimeModifier));
627 uint8_t untilTimeSuffix()
const {
628 return internal::toSuffix(pgm_read_byte(&mZoneEra->untilTimeModifier));
637 int16_t offsetMinutes()
const {
638 return toOffsetMinutes(mZoneEra->offsetCode, mZoneEra->deltaCode);
641 int16_t deltaMinutes()
const {
642 return toDeltaMinutes(mZoneEra->deltaCode);
645 const char* format()
const {
return mZoneEra->format; }
647 int8_t untilYearTiny()
const {
return mZoneEra->untilYearTiny; }
649 uint8_t untilMonth()
const {
return mZoneEra->untilMonth; }
651 uint8_t untilDay()
const {
return mZoneEra->untilDay; }
653 uint16_t untilTimeMinutes()
const {
654 return internal::timeCodeToMinutes(
655 mZoneEra->untilTimeCode, mZoneEra->untilTimeModifier);
658 uint8_t untilTimeSuffix()
const {
659 return internal::toSuffix(mZoneEra->untilTimeModifier);
665 const ZoneEra* mZoneEra;
673 mZoneInfo(zoneInfo) {}
681 const ZoneInfo* zoneInfo()
const {
return mZoneInfo; }
683 #if ACE_TIME_USE_PROGMEM
685 const char* name()
const {
686 return (
const char*) pgm_read_ptr(&mZoneInfo->name);
689 uint32_t zoneId()
const {
690 return pgm_read_dword(&mZoneInfo->zoneId);
693 int16_t startYear()
const {
694 const ZoneContext* zoneContext =
695 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
696 return zoneContext->startYear;
699 int16_t untilYear()
const {
700 const ZoneContext* zoneContext =
701 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
702 return zoneContext->untilYear;
705 uint8_t numEras()
const {
706 return pgm_read_byte(&mZoneInfo->numEras);
710 const ZoneEra* eras = (
const ZoneEra*) pgm_read_ptr(&mZoneInfo->eras);
716 const char* name()
const {
return mZoneInfo->name; }
718 uint32_t zoneId()
const {
return mZoneInfo->zoneId; }
720 int16_t startYear()
const {
return mZoneInfo->zoneContext->startYear; }
722 int16_t untilYear()
const {
return mZoneInfo->zoneContext->untilYear; }
724 uint8_t numEras()
const {
return mZoneInfo->numEras; }
733 const ZoneInfo* mZoneInfo;
743 mZoneRegistry(zoneRegistry) {}
751 #if ACE_TIME_USE_PROGMEM
753 const ZoneInfo* zoneInfo(uint16_t i)
const {
754 return (
const ZoneInfo*) pgm_read_ptr(&mZoneRegistry[i]);
759 const ZoneInfo* zoneInfo(uint16_t i)
const {
760 return mZoneRegistry[i];
766 const ZoneInfo*
const*
const mZoneRegistry;