您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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