Compare commits

..

No commits in common. "dfd2289aefcf71238e55344084716943033e5101" and "ff52f4f15245035b204d7fd76bcde1f5e62f3dfe" have entirely different histories.

3 changed files with 25 additions and 78 deletions

View File

@ -1,24 +0,0 @@
#pragma once
#include <stdint.h>
namespace rtc {
enum class Alarm1Rate : uint8_t {
ONCE_PER_S = 0b1111,
WHEN_S_MATCH = 0b1110,
WHEN_M_S_MATCH = 0b1100,
WHEN_H_M_S_MATCH = 0b1000,
WHEN_DATE_H_M_S_MATCH = 0b00000,
WHEN_DAY_H_N_S_MATCH = 0b10000,
};
enum class Alarm2Rate : uint8_t {
ONCE_PER_M = 0b111,
WHEN_M_MATCH = 0b110,
WHEN_H_M_MATCH = 0b100,
WHEN_DATE_H_M_MATCH = 0b0000,
WHEN_DAY_H_N_MATCH = 0b1000,
};
} // namespace rtc

View File

@ -187,19 +187,6 @@ class DS3231 {
writePartialRegister<START_OFFSET, END_OFFSET>(timeReg);
}
static void setAlarm1(const DateTime &alarmTime, const Alarm1Rate &alarmRate, bool enableInterrupt = true)
{
setAlarmHelper(alarmTime, alarmRate);
if (enableInterrupt)
enableInterruptHelper<detail::ControlRegFlags::A1IE>();
}
static void setAlarm2(const DateTime &alarmTime, const Alarm2Rate &alarmRate, bool enableInterrupt = true)
{
setAlarmHelper(alarmTime, alarmRate);
if (enableInterrupt)
enableInterruptHelper<detail::ControlRegFlags::A2IE>();
}
static bool checkAlarm1()
{
return checkAlarmHelper<detail::ControlStatusRegFlags::A1F>();
@ -299,38 +286,6 @@ class DS3231 {
writePartialRegister<0, sizeof(Register) - 1>(reg);
}
template <typename AlarmRate>
static inline void setAlarmHelper(const DateTime &alarmTime, const AlarmRate &alarmRate)
{
constexpr auto IsAlarm1 = util::is_same_v<AlarmRate, Alarm1Rate>;
static_assert(IsAlarm1 || util::is_same_v<AlarmRate, Alarm2Rate>, "Must use valid alarm rate");
using alarm_reg_t = util::conditional_t<IsAlarm1, detail::Alarm1Reg, detail::Alarm2Reg>;
alarm_reg_t alarmReg;
alarmReg.setAlarmRate(alarmRate);
alarmReg.setDate(alarmTime.day);
alarmReg.setHours(alarmTime.hour);
alarmReg.setMinutes(alarmTime.minute);
if constexpr (IsAlarm1)
alarmReg.setSeconds(alarmTime.second);
writeRegister(alarmReg);
}
template <detail::ControlRegFlags AlarmFlag>
static inline void enableInterruptHelper()
{
constexpr auto IsAlarm1Flag = AlarmFlag == detail::ControlRegFlags::A1IE;
constexpr auto IsAlarm2Flag = AlarmFlag == detail::ControlRegFlags::A2IE;
static_assert(IsAlarm1Flag || IsAlarm2Flag, "Must use valid alarm flag");
auto controlReg = readRegister<CONTROL_REG_ADDR>();
using Flags = typename decltype(controlReg)::Flags;
controlReg &= ~Flags::BBSQW;
controlReg |= Flags::INTCN | AlarmFlag;
writeRegister(controlReg);
}
template <detail::ControlStatusRegFlags AlarmFlag>
static inline bool checkAlarmHelper()
{

View File

@ -2,7 +2,6 @@
#include <stdint.h>
#include "alarms.hpp"
#include "flags.hpp"
namespace rtc {
@ -195,6 +194,15 @@ struct [[gnu::packed]] Alarm1Reg
uint8_t hours = 0;
uint8_t day_date = 0;
enum class AlarmRate {
ONCE_PER_S = 0b1111,
WHEN_S_MATCH = 0b1110,
WHEN_M_S_MATCH = 0b1100,
WHEN_H_M_S_MATCH = 0b1000,
WHEN_DATE_H_M_S_MATCH = 0b00000,
WHEN_DAY_H_N_S_MATCH = 0b10000,
};
//////////////////////////////////////////////////////////////////////////
inline uint8_t getSeconds() const
@ -217,7 +225,7 @@ struct [[gnu::packed]] Alarm1Reg
{
return getEncodedDate(date, day_date);
}
inline Alarm1Rate getAlarmRate() const
inline AlarmRate getAlarmRate() const
{
constexpr auto M_FLAG = 7;
const auto m1 = (seconds >> M_FLAG) & 1;
@ -228,9 +236,9 @@ struct [[gnu::packed]] Alarm1Reg
if (m == 0) {
constexpr auto DAY_FLAG = 6;
const auto dayFormat = ((day_date >> DAY_FLAG) & 1) << 4;
return static_cast<Alarm1Rate>(dayFormat);
return static_cast<AlarmRate>(dayFormat);
}
return static_cast<Alarm1Rate>(m);
return static_cast<AlarmRate>(m);
}
//////////////////////////////////////////////////////////////////////////
@ -255,7 +263,7 @@ struct [[gnu::packed]] Alarm1Reg
{
setEncodedDate(day_date, date);
}
inline void setAlarmRate(const Alarm1Rate &alarmRate)
inline void setAlarmRate(const AlarmRate &alarmRate)
{
const auto alarmRateFlags = static_cast<uint8_t>(alarmRate);
constexpr auto M_FLAG = 7;
@ -280,6 +288,14 @@ struct [[gnu::packed]] Alarm2Reg
uint8_t hours = 0;
uint8_t day_date = 0;
enum class AlarmRate {
ONCE_PER_M = 0b111,
WHEN_M_MATCH = 0b110,
WHEN_H_M_MATCH = 0b100,
WHEN_DATE_H_M_MATCH = 0b0000,
WHEN_DAY_H_N_MATCH = 0b1000,
};
//////////////////////////////////////////////////////////////////////////
inline uint8_t getMinutes() const
@ -298,7 +314,7 @@ struct [[gnu::packed]] Alarm2Reg
{
return getEncodedDate(date, day_date);
}
inline Alarm2Rate getAlarmRate() const
inline AlarmRate getAlarmRate() const
{
constexpr auto M_FLAG = 7;
const auto m2 = (minutes >> M_FLAG) & 1;
@ -308,9 +324,9 @@ struct [[gnu::packed]] Alarm2Reg
if (m == 0) {
constexpr auto DAY_FLAG = 6;
const auto dayFormat = ((day_date >> DAY_FLAG) & 1) << 3;
return static_cast<Alarm2Rate>(dayFormat);
return static_cast<AlarmRate>(dayFormat);
}
return static_cast<Alarm2Rate>(m);
return static_cast<AlarmRate>(m);
}
//////////////////////////////////////////////////////////////////////////
@ -331,7 +347,7 @@ struct [[gnu::packed]] Alarm2Reg
{
setEncodedDate(day_date, date);
}
inline void setAlarmRate(const Alarm2Rate &alarmRate)
inline void setAlarmRate(const AlarmRate &alarmRate)
{
const auto alarmRateFlags = static_cast<uint8_t>(alarmRate);
constexpr auto M_FLAG = 7;