diff --git a/ds3231.hpp b/ds3231.hpp index 2f48644..f7f0c6c 100644 --- a/ds3231.hpp +++ b/ds3231.hpp @@ -126,6 +126,35 @@ class DS3231 { } } + template + static void writePartialRegister(const Register ®) + { + static_assert(Offset < sizeof(Register), "Offset out of bounds"); + + if constexpr (Address == TIME_REG_ADDR) { + static_assert(type::is_same_v, "Invalid register type"); + } else if constexpr (Address == ALARM1_REG_ADDR) { + static_assert(type::is_same_v, "Invalid register type"); + } else if constexpr (Address == ALARM2_REG_ADDR) { + static_assert(type::is_same_v, "Invalid register type"); + } else if constexpr (Address == CONTROL_REG_ADDR) { + static_assert(type::is_same_v, "Invalid register type"); + } else if constexpr (Address == CONTROL_STATUS_REG_ADDR) { + static_assert(type::is_same_v, "Invalid register type"); + } else if constexpr (Address == AGING_OFFSET_REG_ADDR) { + static_assert(type::is_same_v, "Invalid register type"); + } else if constexpr (Address == TEMP_REG_ADDR) { + static_assert(type::is_same_v, "Invalid register type"); + } else { + static_assert(type::always_false_v, "Invalid register address"); + } + + I2cDriver::template start(false); + I2cDriver::write(Address + Offset); + I2cDriver::template writeBytes(reinterpret_cast(®) + Offset); + I2cDriver::stop(); + } + static uint8_t calcDayOfWeek(uint16_t year, uint8_t month, uint16_t day) { day += month < 3 ? year-- : year - 2;