From d667f5e81dc0e3ab7ddc07ffc3d536b08a8c89f2 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sun, 26 Dec 2021 23:07:37 -0600 Subject: [PATCH] Added homeSpan.setStatusAutoOff(uint16_t duration) Optional method to automatically turn off Status LED after a *duration* seconds. LED will resume normal operation any time it is re-triggered with a new pattern. This also resets the elapsed time used to check for autoOff. --- src/HomeSpan.cpp | 11 ++++++++--- src/HomeSpan.h | 4 +++- src/Utils.cpp | 35 +++++++++++++++++++++++++++++++---- src/Utils.h | 39 +++++++++++++++++++++++++++++---------- 4 files changed, 71 insertions(+), 18 deletions(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index d0612f2..543f770 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -58,7 +58,7 @@ void Span::begin(Category catID, const char *displayName, const char *hostNameBa esp_task_wdt_delete(xTaskGetIdleTaskHandleForCPU(0)); // required to avoid watchdog timeout messages from ESP32-C3 controlButton.init(controlPin); - statusLED.init(statusPin); + statusLED.init(statusPin,0,autoOffLED); int maxLimit=CONFIG_LWIP_MAX_SOCKETS-2-otaEnabled; if(maxConnections>maxLimit) @@ -85,7 +85,7 @@ void Span::begin(Category catID, const char *displayName, const char *hostNameBa nvs_get_blob(wifiNVS,"WIFIDATA",&homeSpan.network.wifiData,&len); // retrieve data delay(2000); - + Serial.print("\n************************************************************\n" "Welcome to HomeSpan!\n" "Apple HomeKit for the Espressif ESP-32 WROOM and Arduino IDE\n" @@ -95,8 +95,11 @@ void Span::begin(Category catID, const char *displayName, const char *hostNameBa Serial.print("Message Logs: Level "); Serial.print(logLevel); Serial.print("\nStatus LED: Pin "); - if(statusPin>=0) + if(statusPin>=0){ Serial.print(statusPin); + if(autoOffLED>0) + Serial.printf(" (Auto Off=%d sec)",autoOffLED); + } else Serial.print("- *** WARNING: Status LED Pin is UNDEFINED"); Serial.print("\nDevice Control: Pin "); @@ -291,6 +294,8 @@ void Span::poll() { commandMode(); // COMMAND MODE } } + + statusLED.check(); } // poll diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 3a3f39c..9acd360 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -119,7 +119,8 @@ struct Span{ unsigned long alarmConnect=0; // time after which WiFi connection attempt should be tried again const char *defaultSetupCode=DEFAULT_SETUP_CODE; // Setup Code used for pairing - int statusPin=DEFAULT_STATUS_PIN; // pin for status LED + int statusPin=DEFAULT_STATUS_PIN; // pin for Status LED + uint16_t autoOffLED=0; // automatic turn-off duration (in seconds) for Status LED int controlPin=DEFAULT_CONTROL_PIN; // pin for Control Pushbutton uint8_t logLevel=DEFAULT_LOG_LEVEL; // level for writing out log messages to serial monitor uint8_t maxConnections=DEFAULT_MAX_CONNECTIONS; // number of simultaneous HAP connections @@ -173,6 +174,7 @@ struct Span{ void setControlPin(uint8_t pin){controlPin=pin;} // sets Control Pin void setStatusPin(uint8_t pin){statusPin=pin;} // sets Status Pin + void setStatusAutoOff(uint16_t duration){autoOffLED=duration;} // sets Status LED auto off (seconds) int getStatusPin(){return(statusPin);} // get Status Pin void setApSSID(const char *ssid){network.apSSID=ssid;} // sets Access Point SSID void setApPassword(const char *pwd){network.apPassword=pwd;} // sets Access Point Password diff --git a/src/Utils.cpp b/src/Utils.cpp index e6f5294..953b9bb 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -232,13 +232,13 @@ Blinker::Blinker(){ ////////////////////////////////////// -Blinker::Blinker(int pin, int timerNum){ - init(pin, timerNum); +Blinker::Blinker(int pin, int timerNum, uint16_t autoOffDuration){ + init(pin, timerNum, autoOffDuration); } ////////////////////////////////////// -void Blinker::init(int pin, int timerNum){ +void Blinker::init(int pin, int timerNum, uint16_t autoOffDuration){ this->pin=pin; if(pin<0) @@ -247,6 +247,8 @@ void Blinker::init(int pin, int timerNum){ pinMode(pin,OUTPUT); digitalWrite(pin,0); + pauseDuration=autoOffDuration*1000; + #if SOC_TIMER_GROUP_TIMERS_PER_GROUP>1 // ESP32 and ESP32-S2 contains two timers per timer group group=((timerNum/2)%2==0)?TIMER_GROUP_0:TIMER_GROUP_1; idx=(timerNum%2==0)?TIMER_0:TIMER_1; // ESP32-C3 only contains one timer per timer group @@ -327,7 +329,9 @@ void Blinker::start(int period, float dutyCycle, int nBlinks, int delayTime){ if(pin<0) return; - gpio_set_direction((gpio_num_t)pin, GPIO_MODE_INPUT_OUTPUT); // needed to ensure digitalRead() functions correctly on ESP32-C3 + pauseTime=millis(); + isPaused=false; + gpio_set_direction((gpio_num_t)pin, GPIO_MODE_INPUT_OUTPUT); // needed to ensure digitalRead() functions correctly on ESP32-C3; also needed to re-enable after pause() period*=10; onTime=dutyCycle*period; @@ -357,6 +361,10 @@ void Blinker::on(){ if(pin<0) return; + pauseTime=millis(); + isPaused=false; + gpio_set_direction((gpio_num_t)pin, GPIO_MODE_INPUT_OUTPUT); + stop(); digitalWrite(pin,1); } @@ -368,6 +376,25 @@ void Blinker::off(){ if(pin<0) return; + pauseTime=millis(); + isPaused=false; + gpio_set_direction((gpio_num_t)pin, GPIO_MODE_INPUT_OUTPUT); + stop(); digitalWrite(pin,0); } + +////////////////////////////////////// + +void Blinker::check(){ + + if(pin<0) + return; + + if(pauseDuration==0 || isPaused || (millis()-pauseTime)