Add helper to allow writing partial register data

This commit is contained in:
BlackMark 2020-05-16 17:02:54 +02:00
parent 80cce4671f
commit 92096b6101

View File

@ -126,6 +126,35 @@ class DS3231 {
}
}
template <uint8_t Address, uint8_t Offset, typename Register>
static void writePartialRegister(const Register &reg)
{
static_assert(Offset < sizeof(Register), "Offset out of bounds");
if constexpr (Address == TIME_REG_ADDR) {
static_assert(type::is_same_v<Register, detail::TimeReg>, "Invalid register type");
} else if constexpr (Address == ALARM1_REG_ADDR) {
static_assert(type::is_same_v<Register, detail::Alarm1Reg>, "Invalid register type");
} else if constexpr (Address == ALARM2_REG_ADDR) {
static_assert(type::is_same_v<Register, detail::Alarm2Reg>, "Invalid register type");
} else if constexpr (Address == CONTROL_REG_ADDR) {
static_assert(type::is_same_v<Register, detail::ControlReg>, "Invalid register type");
} else if constexpr (Address == CONTROL_STATUS_REG_ADDR) {
static_assert(type::is_same_v<Register, detail::ControlStatusReg>, "Invalid register type");
} else if constexpr (Address == AGING_OFFSET_REG_ADDR) {
static_assert(type::is_same_v<Register, detail::AgingOffsetReg>, "Invalid register type");
} else if constexpr (Address == TEMP_REG_ADDR) {
static_assert(type::is_same_v<Register, detail::TempReg>, "Invalid register type");
} else {
static_assert(type::always_false_v<Register>, "Invalid register address");
}
I2cDriver::template start<I2C_ADDRESS>(false);
I2cDriver::write(Address + Offset);
I2cDriver::template writeBytes<sizeof(Register) - Offset>(reinterpret_cast<const uint8_t *>(&reg) + Offset);
I2cDriver::stop();
}
static uint8_t calcDayOfWeek(uint16_t year, uint8_t month, uint16_t day)
{
day += month < 3 ? year-- : year - 2;