From d4a3cadd09eaa486ccad1b47e0013ae2bd8da26c Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Thu, 13 May 2021 16:18:22 +0200 Subject: [PATCH] Removed unnecessary ISR from PIR sensor switch UM. --- .../usermod_PIR_sensor_switch.h | 76 ++++++------------- 1 file changed, 22 insertions(+), 54 deletions(-) diff --git a/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h index 23635d0cf..19102a223 100644 --- a/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h +++ b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h @@ -48,11 +48,11 @@ public: /** * Enable/Disable the PIR sensor */ - void EnablePIRsensor(bool enable) { m_PIRenabled = enable; } + void EnablePIRsensor(bool en) { enabled = en; } /** * Get PIR sensor enabled/disabled state */ - bool PIRsensorEnabled() { return m_PIRenabled; } + bool PIRsensorEnabled() { return enabled; } private: // PIR sensor pin @@ -64,9 +64,9 @@ private: // off timer start time uint32_t m_offTimerStart = 0; // current PIR sensor pin state - byte m_PIRsensorPinState = LOW; - // PIR sensor enabled - ISR attached - bool m_PIRenabled = true; + byte sensorPinState = LOW; + // PIR sensor enabled + bool enabled = true; // status of initialisation bool initDone = false; // on and off presets @@ -88,16 +88,6 @@ private: static const char _nightTime[]; static const char _mqttOnly[]; - /** - * return or change if new PIR sensor state is available - */ - static volatile bool newPIRsensorState(bool changeState = false, bool newState = false); - - /** - * PIR sensor state has changed - */ - static void IRAM_ATTR ISR_PIRstateChange(); - /** * check if it is daytime * if sunrise/sunset is not defined (no NTP or lat/lon) default to nighttime @@ -159,10 +149,11 @@ private: */ bool updatePIRsensorState() { - if (newPIRsensorState()) { - m_PIRsensorPinState = digitalRead(PIRsensorPin); + bool pinState = digitalRead(PIRsensorPin); + if (pinState != sensorPinState) { + sensorPinState = pinState; // change previous state - if (m_PIRsensorPinState == HIGH) { + if (sensorPinState == HIGH) { m_offTimerStart = 0; if (!m_mqttOnly && (!m_nightTimeOnly || (m_nightTimeOnly && !isDayTime()))) switchStrip(true); publishMqtt("on"); @@ -170,7 +161,6 @@ private: // start switch off timer m_offTimerStart = millis(); } - newPIRsensorState(true, false); return true; } return false; @@ -183,7 +173,7 @@ private: { if (m_offTimerStart > 0 && millis() - m_offTimerStart > m_switchOffDelay) { - if (m_PIRenabled == true) + if (enabled == true) { if (!m_mqttOnly && (!m_nightTimeOnly || (m_nightTimeOnly && !isDayTime()))) switchStrip(false); publishMqtt("off"); @@ -206,15 +196,13 @@ public: // pin retrieved from cfg.json (readFromConfig()) prior to running setup() if (!pinManager.allocatePin(PIRsensorPin,false)) { PIRsensorPin = -1; // allocation failed - m_PIRenabled = false; + enabled = false; DEBUG_PRINTLN(F("PIRSensorSwitch pin allocation failed.")); } else { // PIR Sensor mode INPUT_PULLUP pinMode(PIRsensorPin, INPUT_PULLUP); - if (m_PIRenabled) { - // assign interrupt function and set CHANGE mode - attachInterrupt(digitalPinToInterrupt(PIRsensorPin), ISR_PIRstateChange, CHANGE); - newPIRsensorState(true, false); + if (enabled) { + sensorPinState = digitalRead(PIRsensorPin); } } initDone = true; @@ -253,7 +241,7 @@ public: JsonObject user = root["u"]; if (user.isNull()) user = root.createNestedObject("u"); - if (m_PIRenabled) + if (enabled) { // off timer String uiDomString = F("PIR "); @@ -319,7 +307,7 @@ public: void addToConfig(JsonObject &root) { JsonObject top = root.createNestedObject(FPSTR(_name)); - top[FPSTR(_enabled)] = m_PIRenabled; + top[FPSTR(_enabled)] = enabled; top[FPSTR(_switchOffDelay)] = m_switchOffDelay / 1000; top["pin"] = PIRsensorPin; top[FPSTR(_onPreset)] = m_onPreset; @@ -335,7 +323,7 @@ public: */ void readFromConfig(JsonObject &root) { - bool oldEnabled = m_PIRenabled; + bool oldEnabled = enabled; int8_t oldPin = PIRsensorPin; JsonObject top = root[FPSTR(_name)]; @@ -347,11 +335,11 @@ public: if (top[FPSTR(_enabled)] != nullptr) { if (top[FPSTR(_enabled)].is()) { - m_PIRenabled = top[FPSTR(_enabled)].as(); // reading from cfg.json + enabled = top[FPSTR(_enabled)].as(); // reading from cfg.json } else { // change from settings page String str = top[FPSTR(_enabled)]; // checkbox -> off or on - m_PIRenabled = (bool)(str!="off"); // off is guaranteed to be present + enabled = (bool)(str!="off"); // off is guaranteed to be present } } @@ -391,11 +379,7 @@ public: // reading config prior to setup() DEBUG_PRINTLN(F("PIR config loaded.")); } else { - if (oldPin != PIRsensorPin || oldEnabled != m_PIRenabled) { - if (oldEnabled) { - // remove old ISR if disabling usermod - detachInterrupt(oldPin); - } + if (oldPin != PIRsensorPin || oldEnabled != enabled) { // check if pin is OK if (oldPin != PIRsensorPin && oldPin >= 0) { // if we are changing pin in settings page @@ -406,12 +390,11 @@ public: } else { // allocation failed PIRsensorPin = -1; - m_PIRenabled = false; + enabled = false; } } - if (m_PIRenabled) { - attachInterrupt(digitalPinToInterrupt(PIRsensorPin), ISR_PIRstateChange, CHANGE); - newPIRsensorState(true, false); + if (enabled) { + sensorPinState = digitalRead(PIRsensorPin); } DEBUG_PRINTLN(F("PIR config (re)loaded.")); } @@ -428,21 +411,6 @@ public: } }; -////////////////////////////////////////////////////// -// PIRsensorSwitch static method implementations - -volatile bool PIRsensorSwitch::newPIRsensorState(bool changeState, bool newState) -{ - static volatile bool s_PIRsensorState = false; - if (changeState) s_PIRsensorState = newState; - return s_PIRsensorState; -} - -void IRAM_ATTR PIRsensorSwitch::ISR_PIRstateChange() -{ - newPIRsensorState(true, true); -} - // strings to reduce flash memory usage (used more than twice) const char PIRsensorSwitch::_name[] PROGMEM = "PIRsensorSwitch"; const char PIRsensorSwitch::_enabled[] PROGMEM = "PIRenabled";