10#ifndef M5_UNIT_RTC_UNIT_PCF8563_HPP
11#define M5_UNIT_RTC_UNIT_PCF8563_HPP
13#include <M5UnitComponent.hpp>
49 explicit UnitPCF8563(
const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
52 virtual ~UnitPCF8563()
56 virtual bool begin()
override;
57 virtual void update(
const bool force =
false)
override;
200 uint32_t
writeTimer(
const uint32_t msec,
const bool repeat =
false);
300#if defined(__M5_RTC_BASE_H__) || defined(__M5UNIFIED_HPP__)
311 inline bool getDateTime(m5::rtc_date_t* date, m5::rtc_time_t* time)
315 if (!
read_datetime(date ? &d : nullptr, time ? &t : nullptr)) {
322 *time = {t.hours, t.minutes, t.seconds};
332 inline bool setDateTime(
const m5::rtc_date_t* date,
const m5::rtc_time_t* time)
334 pcf8563::rtc_date_t d;
335 pcf8563::rtc_time_t t;
337 d = {date->year, date->month, date->date, date->weekDay};
340 t = {time->hours, time->minutes, time->seconds};
346 inline bool getDateTime(m5::rtc_datetime_t* dt)
348 return dt ? getDateTime(&dt->date, &dt->time) : false;
351 inline bool getDate(m5::rtc_date_t* date)
353 return getDateTime(date,
nullptr);
356 inline bool getTime(m5::rtc_time_t* time)
358 return getDateTime(
nullptr, time);
362 inline bool setDateTime(
const m5::rtc_datetime_t& dt)
364 return setDateTime(&dt.date, &dt.time);
367 inline bool setDateTime(
const m5::rtc_datetime_t* dt)
369 return dt ? setDateTime(&dt->date, &dt->time) : false;
372 inline bool setDate(
const m5::rtc_date_t* date)
374 return setDateTime(date,
nullptr);
377 inline bool setDate(
const m5::rtc_date_t& date)
379 return setDateTime(&date,
nullptr);
382 inline bool setTime(
const m5::rtc_time_t* time)
384 return setDateTime(
nullptr, time);
387 inline bool setTime(
const m5::rtc_time_t& time)
389 return setDateTime(
nullptr, &time);
393 inline m5::rtc_time_t getTime()
395 pcf8563::rtc_time_t t{};
397 return {t.hours, t.minutes, t.seconds};
400 inline m5::rtc_date_t getDate()
402 pcf8563::rtc_date_t d{};
404 return {d.year, d.month, d.date, d.weekDay};
407 inline m5::rtc_datetime_t getDateTime()
409 pcf8563::rtc_datetime_t dt{};
411 return {{dt.date.year, dt.date.month, dt.date.date, dt.date.weekDay},
412 {dt.time.hours, dt.time.minutes, dt.time.seconds}};
421 int setAlarmIRQ(
const m5::rtc_date_t* date,
const m5::rtc_time_t* time);
423 inline int setAlarmIRQ(
const m5::rtc_date_t& date,
const m5::rtc_time_t& time)
425 return setAlarmIRQ(&date, &time);
428 inline int setAlarmIRQ(
const m5::rtc_time_t& time)
430 return setAlarmIRQ(
nullptr, &time);
437 int setAlarmIRQ(
const int afterSeconds);
443 uint32_t setTimerIRQ(
const uint32_t timer_msec);
446 inline bool getVoltLow()
452 inline bool getIRQstatus()
458 return (val & 0x0C) != 0;
461 inline void clearIRQ()
471 void setSystemTimeFromRtc(
struct timezone* tz =
nullptr);
479 bool read_register(
const uint8_t reg, uint8_t* buf,
const size_t len);
480 bool read_register8(
const uint8_t reg, uint8_t& val);
481 bool write_register(
const uint8_t reg,
const uint8_t* buf,
const size_t len);
482 bool write_register8(
const uint8_t reg,
const uint8_t val);
486 bool read_datetime(pcf8563::rtc_date_t* date, pcf8563::rtc_time_t* time);
488 bool write_datetime(
const pcf8563::rtc_date_t* date,
const pcf8563::rtc_time_t* time);
495 static void IRAM_ATTR isr_handler(
void* arg);
496 void check_irq_flags();
499 volatile bool _isr_fired{};
505constexpr uint8_t CONTROL1_REG{0x00};
506constexpr uint8_t CONTROL2_REG{0x01};
507constexpr uint8_t SECONDS_REG{0x02};
508constexpr uint8_t MINUTES_REG{0x03};
509constexpr uint8_t HOURS_REG{0x04};
510constexpr uint8_t DAYS_REG{0x05};
511constexpr uint8_t WEEKDAYS_REG{0x06};
512constexpr uint8_t MONTHS_REG{0x07};
513constexpr uint8_t YEARS_REG{0x08};
514constexpr uint8_t ALARM_MINUTES_REG{0x09};
515constexpr uint8_t ALARM_HOURS_REG{0x0A};
516constexpr uint8_t ALARM_DAY_REG{0x0B};
517constexpr uint8_t ALARM_WEEKDAY_REG{0x0C};
518constexpr uint8_t CLKOUT_CONTROL_REG{0x0D};
519constexpr uint8_t TIMER_CONTROL_REG{0x0E};
520constexpr uint8_t TIMER_REG{0x0F};
Real-time clock unit using PCF8563 compatible chip (BM8563/HYM8563)
Definition unit_PCF8563.hpp:23
bool readTimerInterrupt(bool &enabled)
Read timer interrupt enable state.
Definition unit_PCF8563.cpp:505
bool writeDate(const pcf8563::rtc_date_t &date)
Write date to RTC.
Definition unit_PCF8563.cpp:295
bool write_datetime(const pcf8563::rtc_date_t *date, const pcf8563::rtc_time_t *time)
Write time and/or date registers (nullable pointer support)
Definition unit_PCF8563.cpp:229
bool writeDateTime(const pcf8563::rtc_datetime_t &dt)
Write date and time to RTC.
Definition unit_PCF8563.cpp:306
bool readAlarm(pcf8563::rtc_time_t &time, pcf8563::rtc_date_t &date)
Read alarm settings.
Definition unit_PCF8563.cpp:357
bool readTime(pcf8563::rtc_time_t &time)
Read time from RTC.
Definition unit_PCF8563.cpp:278
bool clearTimerFlag()
Clear timer flag (TF bit)
Definition unit_PCF8563.cpp:532
bool writeTimerControl(const bool enabled, const pcf8563::TimerClock clock)
Write timer control settings.
Definition unit_PCF8563.cpp:488
bool readAlarmFlag(bool &fired)
Read alarm flag.
Definition unit_PCF8563.cpp:398
bool read_datetime(pcf8563::rtc_date_t *date, pcf8563::rtc_time_t *time)
Read time and/or date registers (nullable pointer support)
Definition unit_PCF8563.cpp:200
bool writeStop(const bool stop)
Write RTC clock stop state.
Definition unit_PCF8563.cpp:566
bool writeAlarm(const pcf8563::rtc_time_t &time, const pcf8563::rtc_date_t &date)
Set alarm and enable interrupt.
Definition unit_PCF8563.cpp:329
bool write_control2_bits(const uint8_t mask, const uint8_t bits)
Write CONTROL2 register with bit mask (read-modify-write)
Definition unit_PCF8563.cpp:262
bool readVoltLow(bool &low)
Read voltage-low flag (battery backup status)
Definition unit_PCF8563.cpp:574
bool readAlarmInterrupt(bool &enabled)
Read alarm interrupt enable state.
Definition unit_PCF8563.cpp:382
bool readTimerFlag(bool &fired)
Read timer flag.
Definition unit_PCF8563.cpp:521
bool writeTimerValue(const uint8_t count)
Write timer countdown value.
Definition unit_PCF8563.cpp:500
bool readDate(pcf8563::rtc_date_t &date)
Read date from RTC.
Definition unit_PCF8563.cpp:289
bool writeTime(const pcf8563::rtc_time_t &time)
Write time to RTC.
Definition unit_PCF8563.cpp:284
bool writeTimerInterrupt(const bool enabled)
Write timer interrupt enable state.
Definition unit_PCF8563.cpp:516
bool readStop(bool &stopped)
Read RTC clock stop state.
Definition unit_PCF8563.cpp:555
bool readDateTime(pcf8563::rtc_datetime_t &dt)
Read date and time from RTC.
Definition unit_PCF8563.cpp:300
void config(const config_t &cfg)
Set the configuration.
Definition unit_PCF8563.hpp:67
bool readTimerPeriodic(bool &periodic)
Read timer periodic mode (TI_TP bit)
Definition unit_PCF8563.cpp:537
void(*)() irq_callback_t
IRQ callback type.
Definition unit_PCF8563.hpp:28
bool clearAlarmFlag()
Clear alarm flag (AF bit)
Definition unit_PCF8563.cpp:409
bool writeAlarmInterrupt(const bool enabled)
Write alarm interrupt enable state.
Definition unit_PCF8563.cpp:393
bool read_control2(uint8_t &val)
Read CONTROL2 register.
Definition unit_PCF8563.cpp:257
config_t config() const
Gets the configuration.
Definition unit_PCF8563.hpp:62
bool readTimerValue(uint8_t &count)
Read timer countdown value.
Definition unit_PCF8563.cpp:494
bool readTimerControl(bool &enabled, pcf8563::TimerClock &clock)
Read timer control settings.
Definition unit_PCF8563.cpp:475
bool writeTimerPeriodic(const bool periodic)
Write timer periodic mode (TI_TP bit)
Definition unit_PCF8563.cpp:548
uint32_t writeTimer(const uint32_t msec, const bool repeat=false)
Set countdown timer with millisecond duration.
Definition unit_PCF8563.cpp:416
Settings for begin.
Definition unit_PCF8563.hpp:34
pcf8563::ClockOutput clkout
CLKOUT pin output frequency (default: disabled)
Definition unit_PCF8563.hpp:40
uint32_t polling_interval
Polling interval in milliseconds for IRQ status check in update()
Definition unit_PCF8563.hpp:42
irq_callback_t on_timer
Callback invoked from update() when timer fires (nullptr: disabled)
Definition unit_PCF8563.hpp:46
bool polling
true: poll IRQ status via I2C in update(), false: use hardware interrupt via int_pin
Definition unit_PCF8563.hpp:38
int16_t int_pin
GPIO pin connected to PCF8563 INT pin (-1: not connected)
Definition unit_PCF8563.hpp:36
irq_callback_t on_alarm
Callback invoked from update() when alarm fires (nullptr: disabled)
Definition unit_PCF8563.hpp:44
Calendar date (year, month, day, weekday)
Definition unit_PCF8563_types.hpp:85
int16_t year
year 1900-2099
Definition unit_PCF8563_types.hpp:87
int8_t date
date 1-31
Definition unit_PCF8563_types.hpp:91
int8_t month
month 1-12
Definition unit_PCF8563_types.hpp:89
int8_t weekDay
weekDay 0:sun / 1:mon / 2:tue / 3:wed / 4:thu / 5:fri / 6:sat
Definition unit_PCF8563_types.hpp:93
Combined date and time.
Definition unit_PCF8563_types.hpp:155
Time of day (hours, minutes, seconds)
Definition unit_PCF8563_types.hpp:25
Type definitions for PCF8563 Unit.
ClockOutput
CLKOUT pin output frequency (register 0x0D)
Definition unit_PCF8563_types.hpp:245
TimerClock
Timer clock source for PCF8563 countdown timer.
Definition unit_PCF8563_types.hpp:234