Setup AbstractRTC, cleanup init(), and add some declarations

pull/120/head
Andre LaFleur 2021-12-18 10:52:19 -07:00
parent 715bbaf85d
commit bac7b4eb51
3 changed files with 33 additions and 23 deletions

View File

@ -46,12 +46,14 @@ void Watchy::init(String datetime){
} }
void Watchy::displayBusyCallback(const void*){ void Watchy::displayBusyCallback(const void*){
gpio_wakeup_enable((gpio_num_t)BUSY, GPIO_INTR_LOW_LEVEL); gpio_wakeup_enable((gpio_num_t)BUSY, GPIO_INTR_LOW_LEVEL);
esp_sleep_enable_gpio_wakeup(); esp_sleep_enable_gpio_wakeup();
esp_light_sleep_start(); esp_light_sleep_start();
} }
void Watchy::deepSleep(){ void Watchy::deepSleep(){
display.hibernate();
displayFullInit = false; // Notify not to init it again
RTC.clearAlarm(); //resets the alarm flag in the RTC RTC.clearAlarm(); //resets the alarm flag in the RTC
// Set pins 0-39 to input to avoid power leaking out // Set pins 0-39 to input to avoid power leaking out
for(int i=0; i<40; i++) { for(int i=0; i<40; i++) {
@ -588,7 +590,7 @@ weatherData Watchy::getWeatherData(){
} }
float Watchy::getBatteryVoltage(){ float Watchy::getBatteryVoltage(){
if(RTC.rtcType == DS3231){ if(RTC.rtcType == DS3232_RTC_TYPE){
return analogReadMilliVolts(V10_ADC_PIN) / 1000.0f * 2.0f; // Battery voltage goes through a 1/2 divider. return analogReadMilliVolts(V10_ADC_PIN) / 1000.0f * 2.0f; // Battery voltage goes through a 1/2 divider.
}else{ }else{
return analogReadMilliVolts(V15_ADC_PIN) / 1000.0f * 2.0f; return analogReadMilliVolts(V15_ADC_PIN) / 1000.0f * 2.0f;

View File

@ -7,29 +7,34 @@ void WatchyRTC::init(){
byte error; byte error;
Wire.beginTransmission(RTC_DS_ADDR); Wire.beginTransmission(RTC_DS_ADDR);
error = Wire.endTransmission(); error = Wire.endTransmission();
if(error == 0){ if (error == 0) {
rtcType = DS3231_RTC_TYPE; rtcType = DS3232_RTC_TYPE;
}else{ _rtc = DS3232();
Wire.beginTransmission(RTC_PCF_ADDR); return;
error = Wire.endTransmission();
if(error == 0){
rtcType = PCF8563_RTC_TYPE;
}else{
//RTC Error
}
} }
Wire.beginTransmission(RTC_PCF_ADDR);
error = Wire.endTransmission();
if (error == 0) {
rtcType = PCF8563_RTC_TYPE;
_rtc = PCF8563();
return;
}
rtcType = NO_RTC_TYPE;
_rtc = AbstractRTC();
} }
void WatchyRTC::config(String datetime){ void WatchyRTC::config(String datetime){
if(rtcType == DS3231_RTC_TYPE){ if (rtcType == DS3232_RTC_TYPE) {
_DSConfig(datetime); _DSConfig(datetime);
}else{ } else {
_PCFConfig(datetime); _PCFConfig(datetime);
} }
} }
void WatchyRTC::clearAlarm(){ void WatchyRTC::clearAlarm(){
if(rtcType == DS3231_RTC_TYPE){ if(rtcType == DS3232_RTC_TYPE){
rtc_ds.alarm(ALARM_2); rtc_ds.alarm(ALARM_2);
}else{ }else{
int nextAlarmMinute = 0; int nextAlarmMinute = 0;
@ -41,7 +46,7 @@ void WatchyRTC::clearAlarm(){
} }
void WatchyRTC::read(tmElements_t &tm){ void WatchyRTC::read(tmElements_t &tm){
if(rtcType == DS3231_RTC_TYPE){ if(rtcType == DS3232_RTC_TYPE){
rtc_ds.read(tm); rtc_ds.read(tm);
tm.Year = tm.Year - 30; //reset to offset from 2000 tm.Year = tm.Year - 30; //reset to offset from 2000
}else{ }else{
@ -61,7 +66,7 @@ void WatchyRTC::read(tmElements_t &tm){
} }
void WatchyRTC::set(tmElements_t tm){ void WatchyRTC::set(tmElements_t tm){
if(rtcType == DS3231_RTC_TYPE){ if(rtcType == DS3232_RTC_TYPE){
tm.Year = tm.Year + 2000 - YEAR_OFFSET_DS; tm.Year = tm.Year + 2000 - YEAR_OFFSET_DS;
time_t t = makeTime(tm); time_t t = makeTime(tm);
rtc_ds.set(t); rtc_ds.set(t);
@ -73,7 +78,7 @@ void WatchyRTC::set(tmElements_t tm){
} }
uint8_t WatchyRTC::temperature(){ uint8_t WatchyRTC::temperature(){
if(rtcType == DS3231_RTC_TYPE){ if(rtcType == DS3232_RTC_TYPE){
return rtc_ds.temperature(); return rtc_ds.temperature();
}else{ }else{
return 255; //error return 255; //error

View File

@ -4,13 +4,17 @@
#include <DS3232RTC.h> #include <DS3232RTC.h>
#include <Rtc_Pcf8563.h> #include <Rtc_Pcf8563.h>
#define DS3231_RTC_TYPE 0 #define DS3232_RTC_TYPE 0
#define PCF8563_RTC_TYPE 1 #define PCF8563_RTC_TYPE 1
#define NO_RTC_TYPE 255
#define RTC_DS_ADDR 0x68 #define RTC_DS_ADDR 0x68
#define RTC_PCF_ADDR 0x51 #define RTC_PCF_ADDR 0x51
#define YEAR_OFFSET_DS 1970 #define YEAR_OFFSET_DS 1970
#define YEAR_OFFSET_PCF 2000 #define YEAR_OFFSET_PCF 2000
#define NO_TEMPERATURE_ERR 255
// TODO: So we're relying on an rtcType as a multiplexer, making our WatchyRTC code a bit // TODO: So we're relying on an rtcType as a multiplexer, making our WatchyRTC code a bit
// more complex. A way around this is to use a command pattern instead: // more complex. A way around this is to use a command pattern instead:
// https://sourcemaking.com/design_patterns/command // https://sourcemaking.com/design_patterns/command
@ -41,10 +45,9 @@ class WatchyRTC {
void set(tmElements_t tm); void set(tmElements_t tm);
uint8_t temperature(); uint8_t temperature();
private: private:
void _DSConfig(String datetime);
void _PCFConfig(String datetime);
int _getDayOfWeek(int d, int m, int y); int _getDayOfWeek(int d, int m, int y);
String _getValue(String data, char separator, int index); String _getValue(String data, char separator, int index);
AbstractRTC _rtc;
}; };
#endif #endif