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; }
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);
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];
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);
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 {
331 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
335 int16_t untilYear()
const {
337 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
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; }
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; }
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);
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];
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);
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 {
695 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
699 int16_t untilYear()
const {
701 (
const ZoneContext*) pgm_read_ptr(&mZoneInfo->zoneContext);
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; }
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;
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.