#include "Debug.h" #include "Rtc.h" #include "Pins.h" #include #include #define LOGGER_NAME "Rtc" using namespace utils; namespace rtc { void setup() { VERBOSE("setup"); hardware::i2c::powerOn(); RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock RTC.control(DS3231_A1_INT_ENABLE, DS3231_OFF); //Alarm 1 OFF RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON hardware::i2c::powerOff(); //TODO : check wether the osc has been halted (meaning the battery could be dead) } float getTemperature() { hardware::i2c::powerOn(); float temperature = RTC.readTempRegister(); hardware::i2c::powerOff(); return temperature; } bool isAccurate() { hardware::i2c::powerOn(); bool accurate = RTC.status(DS3231_HALTED_FLAG) == DS3231_OFF; hardware::i2c::powerOff(); return accurate; } timestamp_t getTime() { tmElements_t time; getTime(time); return time::makeTimestamp(time); } void getTime(tmElements_t &time) { hardware::i2c::powerOn(); RTC.readTime(time); hardware::i2c::powerOff(); VERBOSE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second); } void setTime(const tmElements_t &time) { VERBOSE_FORMAT("setTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second); hardware::i2c::powerOn(); RTC.writeTime(time); RTC.control(DS3231_HALTED_FLAG, DS3231_OFF); hardware::i2c::powerOff(); } void setAlarm(uint16_t seconds) { tmElements_t currentTime; tmElements_t alarmTime; getTime(currentTime); time::breakTime(time::makeTimestamp(currentTime) + seconds, alarmTime); setAlarm(alarmTime); } void setAlarm(const tmElements_t &time) { hardware::i2c::powerOn(); RTC.writeAlarm1(DS3231_ALM_HMS, time); RTC.control(DS3231_A1_FLAG, DS3231_OFF); //reset Alarm 1 flag RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON NOTICE_FORMAT("setAlarm", "Next alarm : %d:%d:%d", time.Hour, time.Minute, time.Second); hardware::i2c::powerOff(); } }