32#include "../../SensorBuildOpt.h"
33#if !SENSORLIB_EXCLUDE_PCF85063
35#include "../../platform/comm/I2CDeviceNoHal.hpp"
36#include "../SensorRTC.h"
91 bool begin(TwoWire &wire,
int sda = -1,
int scl = -1)
95#elif defined(ESP_PLATFORM)
97#if defined(SENSORLIB_USE_I2C_LEGACY)
106 bool begin(i2c_port_t port_num,
int sda = -1,
int scl = -1)
117 bool begin(i2c_master_bus_handle_t handle)
175 uint8_t second =
BCD2DEC(buffer[0] & 0x7F);
176 uint8_t minute =
BCD2DEC(buffer[1] & 0x7F);
179 hour =
BCD2DEC(buffer[2] & 0x3F);
182 hour =
BCD2DEC(buffer[2] & 0x1F);
185 uint8_t day =
BCD2DEC(buffer[3] & 0x3F);
186 uint8_t week =
BCD2DEC(buffer[4] & 0x07);
187 uint8_t month =
BCD2DEC(buffer[5] & 0x1F);
188 uint16_t year =
BCD2DEC(buffer[6]) + 2000;
190 return RTC_DateTime(year, month, day, hour, minute, second, week);
287 buffer[0] =
BCD2DEC(buffer[0] & 0x80);
288 buffer[1] =
BCD2DEC(buffer[1] & 0x40);
289 buffer[2] =
BCD2DEC(buffer[2] & 0x40);
290 buffer[3] =
BCD2DEC(buffer[3] & 0x08);
291 buffer[4] =
BCD2DEC(buffer[4] & 0x08);
293 return RTC_Alarm(buffer[2], buffer[1], buffer[0], buffer[3], buffer[4]);
319 void setAlarm(uint8_t hour, uint8_t minute, uint8_t second, uint8_t day, uint8_t week)
321 uint8_t buffer[5] = {0};
332 buffer[0] &= ~PCF85063_ALARM_ENABLE;
343 buffer[1] &= ~PCF85063_ALARM_ENABLE;
355 buffer[2] &= ~PCF85063_ALARM_ENABLE;
363 buffer[3] =
DEC2BCD(((day) < (1) ? (1) : ((day) > (daysInMonth) ? (daysInMonth) : (day))));
364 buffer[3] &= ~PCF85063_ALARM_ENABLE;
375 buffer[4] &= ~PCF85063_ALARM_ENABLE;
462 if (val == -1)
return;
498 bool initImpl(uint8_t param)
override
519 if ((val & 0x80) == 0) {
525 SENSORLIB_LOG_E(
"Failed to write to RAM memory register. Maybe this chip is pcf8563.");
#define SENSORLIB_LOG_E(...)
bool begin(SensorCommCustom::CustomCallback callback, uint8_t addr)
Initialize the sensor using custom callback interface.
uint8_t getMinute() const
uint8_t getSecond() const
uint8_t getMinute() const
uint8_t getSecond() const
bool(*)(uint8_t addr, uint8_t reg, uint8_t *buf, size_t len, bool writeReg, bool isWrite) CustomCallback
bool clrRegBit(uint8_t reg, uint8_t bit)
bool getRegBit(uint8_t reg, uint8_t bit)
int readReg(uint8_t reg) const
int writeRegBuff(uint8_t reg, uint8_t *buf, size_t len)
int writeReg(uint8_t reg, uint8_t val)
int readRegBuff(uint8_t reg, uint8_t *buf, size_t len) const
bool setRegBit(uint8_t reg, uint8_t bit)
Driver for the PCF85063 real-time clock (RTC) over I2C.
ClockHz
Clock output frequency selection.
@ CLK_4096HZ
4.096 kHz output
@ CLK_LOW
Lowest/low-power output option (chip-specific)
@ CLK_8192HZ
8.192 kHz output
@ CLK_16384HZ
16.384 kHz output
@ CLK_2048HZ
2.048 kHz output
@ CLK_32768HZ
32.768 kHz output
@ CLK_1024HZ
1.024 kHz output
void resetAlarm()
Clear/reset the alarm flag.
static constexpr uint8_t PCF85063_CTRL1_SOFTRST_EN_MASK
static constexpr uint8_t PCF85063_CTRL1_CIE_EN_MASK
static constexpr uint8_t PCF85063_MONTH_REG
static constexpr uint8_t PCF85063_SEC_REG
static constexpr uint8_t PCF85063_CTRL1_REG
static constexpr uint8_t PCF8563_ALRM_HR_REG
bool isRunning()
Check whether the RTC oscillator is currently running.
static constexpr uint8_t PCF85063_ALRM_MIN_REG
static constexpr uint8_t PCF85063_CTRL1_CLOCK_EN_MASK
bool isAlarmActive()
Check whether the alarm flag is active.
void setDateTime(RTC_DateTime datetime) override
Set the RTC date and time.
void setAlarmByHours(uint8_t hour)
Convenience: enable only hour alarm.
const char * getChipName() override
Get RTC chip name.
void start()
Start the RTC oscillator (timekeeping runs).
RTC_Alarm getAlarm()
Read current alarm configuration from the device.
static constexpr uint8_t PCF85063_HR_REG
SensorPCF85063()=default
Construct a SensorPCF85063 instance.
void reset() override
Reset the RTC.
bool begin(SensorCommCustom::CustomCallback callback)
Initialize device using a custom transport callback.
static constexpr uint8_t PCF85063_ALARM_ENABLE
static constexpr uint8_t PCF85063_CTRL1_HOUR_FORMAT_12H_MASK
static constexpr uint8_t PCF85063_RAM_REG
static constexpr uint8_t PCF85063_YEAR_REG
void disableAlarm()
Disable alarm interrupt/event generation.
static constexpr uint8_t PCF85063_ALRM_WEEK_REG
static constexpr uint8_t PCF85063_MIN_REG
void enableAlarm()
Enable alarm interrupt/event generation.
static constexpr uint8_t PCF85063_NO_ALARM
static constexpr uint8_t PCF85063_CTRL2_REG
RTC_DateTime getDateTime() override
Read the RTC date and time.
static constexpr uint8_t PCF85063_ALRM_SEC_REG
~SensorPCF85063()=default
Destructor.
static constexpr uint8_t PCF85063_DAY_REG
bool isClockIntegrityGuaranteed()
Check whether the clock integrity is guaranteed.
void setAlarmByMinutes(uint8_t minute)
Convenience: enable only minute alarm.
void setAlarmBySecond(uint8_t second)
Convenience: enable only second alarm.
void setAlarm(RTC_Alarm alarm)
Set alarm using RTC_Alarm object.
static constexpr uint8_t PCF85063_OFFSET_REG
bool is24Hour
Hour mode flag (true = 24-hour mode).
void setAlarmByWeekDay(uint8_t week)
Convenience: enable only weekday alarm.
void setClockOutput(ClockHz hz)
Configure the clock output frequency.
static constexpr uint8_t PCF85063_WEEKDAY_REG
static constexpr uint8_t PCF85063_TIMER_MD_REG
static constexpr uint8_t PCF85063_CTRL1_TEST_EN_MASK
static constexpr uint8_t PCF85063_TIMER_VAL_REG
static constexpr uint8_t PCF85063_ALRM_DAY_REG
void setAlarm(uint8_t hour, uint8_t minute, uint8_t second, uint8_t day, uint8_t week)
Set the alarm fields (hour/minute/second/day/weekday).
void setAlarmByDays(uint8_t day)
Convenience: enable only day-of-month alarm.
void stop()
Stop the RTC oscillator (timekeeping stops).
uint32_t getDayOfWeek(uint32_t day, uint32_t month, uint32_t year)
Calculate the day of the week for a given date using Zeller's congruence.
virtual void setDateTime(RTC_DateTime datetime)=0
Set the date and time of the RTC using an RTC_DateTime object.
static uint8_t BCD2DEC(uint8_t val)
Convert a Binary Coded Decimal (BCD) number to a decimal number.
uint8_t getDaysInMonth(uint8_t month, uint16_t year)
Get the number of days in a given month of a specific year, considering leap years.
virtual RTC_DateTime getDateTime()=0
Get the current date and time from the RTC.
static uint8_t DEC2BCD(uint8_t val)
Convert a decimal number to a Binary Coded Decimal (BCD) number.
constexpr uint32_t _bv(uint8_t b)
const uint8_t PCF85063_SLAVE_ADDRESS