You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 rivejä
1.9 KiB

  1. #include "Debug.h"
  2. #include "Rtc.h"
  3. #include "Pins.h"
  4. #include <Wire.h>
  5. #include <uDS3231.h>
  6. #define LOGGER_NAME "Rtc"
  7. using namespace utils;
  8. namespace rtc {
  9. void setup() {
  10. VERBOSE("setup");
  11. hardware::i2c::powerOn();
  12. RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock
  13. RTC.control(DS3231_A1_INT_ENABLE, DS3231_OFF); //Alarm 1 OFF
  14. RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
  15. hardware::i2c::powerOff();
  16. //TODO : check wether the osc has been halted (meaning the battery could be dead)
  17. }
  18. float getTemperature() {
  19. hardware::i2c::powerOn();
  20. float temperature = RTC.readTempRegister();
  21. hardware::i2c::powerOff();
  22. return temperature;
  23. }
  24. timestamp_t getTime() {
  25. tmElements_t time;
  26. getTime(time);
  27. return time::makeTimestamp(time);
  28. }
  29. void getTime(tmElements_t &time) {
  30. hardware::i2c::powerOn();
  31. RTC.readTime(time);
  32. hardware::i2c::powerOff();
  33. VERBOSE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
  34. }
  35. void setTime(const tmElements_t &time) {
  36. VERBOSE_FORMAT("setTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
  37. hardware::i2c::powerOn();
  38. RTC.writeTime(time);
  39. hardware::i2c::powerOff();
  40. }
  41. void setAlarm(uint16_t seconds) {
  42. tmElements_t currentTime;
  43. tmElements_t alarmTime;
  44. getTime(currentTime);
  45. time::breakTime(time::makeTimestamp(currentTime) + seconds, alarmTime);
  46. setAlarm(alarmTime);
  47. }
  48. void setAlarm(const tmElements_t &time) {
  49. hardware::i2c::powerOn();
  50. RTC.writeAlarm1(DS3231_ALM_HMS, time);
  51. RTC.control(DS3231_A1_FLAG, DS3231_OFF); //reset Alarm 1 flag
  52. RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON
  53. RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON
  54. VERBOSE_FORMAT("setAlarm", "Next alarm : %d:%d:%d", time.Hour, time.Minute, time.Second);
  55. hardware::i2c::powerOff();
  56. }
  57. }