Skip to content

Commit

Permalink
Add API to configure reset trigger
Browse files Browse the repository at this point in the history
  • Loading branch information
marvinroger committed Feb 6, 2016
1 parent 00c95b8 commit cfbcb59
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 14 deletions.
2 changes: 2 additions & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ setGlobalInputHandler KEYWORD2
setSetupFunction KEYWORD2
setLoopFunction KEYWORD2
setResetHook KEYWORD2
setResetTrigger KEYWORD2
disableResetTrigger KEYWORD2
isReadyToOperate KEYWORD2
setResettable KEYWORD2
setNodeProperty KEYWORD2
Expand Down
19 changes: 17 additions & 2 deletions src/Homie.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@
using namespace HomieInternals;

HomieClass::HomieClass() {
this->_shared_interface.fwname = strdup("undefined");
this->_shared_interface.fwversion = strdup("undefined");
this->_shared_interface.fwname = strdup(DEFAULT_FW_NAME);
this->_shared_interface.fwversion = strdup(DEFAULT_FW_VERSION);
this->_shared_interface.resettable = true;
this->_shared_interface.readyToOperate = false;
this->_shared_interface.inputHandler = [](String node, String property, String message) { return false; };
this->_shared_interface.setupFunction = [](void) {};
this->_shared_interface.loopFunction = [](void) {};
this->_shared_interface.resetHook = [](void) {};
this->_shared_interface.resetTriggerEnabled = true;
this->_shared_interface.resetTriggerPin = DEFAULT_RESET_PIN;
this->_shared_interface.resetTriggerState = DEFAULT_RESET_STATE;
this->_shared_interface.resetTriggerTime = DEFAULT_RESET_TIME;
}

HomieClass::~HomieClass() {
Expand Down Expand Up @@ -77,6 +81,17 @@ void HomieClass::setResetHook(void (*callback)(void)) {
this->_shared_interface.resetHook = callback;
}

void HomieClass::setResetTrigger(uint8_t pin, byte state, uint16_t time) {
this->_shared_interface.resetTriggerEnabled = true;
this->_shared_interface.resetTriggerPin = pin;
this->_shared_interface.resetTriggerState = state;
this->_shared_interface.resetTriggerTime = time;
}

void HomieClass::disableResetTrigger() {
this->_shared_interface.resetTriggerEnabled = false;
}

bool HomieClass::setNodeProperty(HomieNode& node, const char* property, const char* value, bool retained) {
if (!this->isReadyToOperate()) {
return false;
Expand Down
2 changes: 2 additions & 0 deletions src/Homie.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ namespace HomieInternals {
void setGlobalInputHandler(bool (*callback)(String node, String property, String message));
void setResettable(bool resettable);
void setResetHook(void (*callback)(void));
void setResetTrigger(uint8_t pin, byte state, uint16_t time);
void disableResetTrigger();
void setSetupFunction(void (*callback)(void));
void setLoopFunction(void (*callback)(void));
bool isReadyToOperate();
Expand Down
1 change: 0 additions & 1 deletion src/Homie/Boot/Boot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ Boot::Boot(const char* name)
}

void Boot::setup() {
pinMode(PIN_RESET, INPUT_PULLUP);
pinMode(BUILTIN_LED, OUTPUT);
digitalWrite(BUILTIN_LED, HIGH); // low active

Expand Down
26 changes: 16 additions & 10 deletions src/Homie/Boot/BootNormal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,26 +206,32 @@ void BootNormal::_mqttCallback(char* topic, byte* payload, unsigned int length)
}

void BootNormal::_handleReset() {
this->_resetDebouncer.update();
if (this->_shared_interface->resetTriggerEnabled) {
this->_resetDebouncer.update();

if (this->_resetDebouncer.read() == LOW) {
Logger.logln("Resetting");
Config.erase();
if (this->_resetDebouncer.read() == this->_shared_interface->resetTriggerState) {
Logger.logln("Resetting");
Config.erase();

this->_shared_interface->resetHook();
this->_shared_interface->resetHook();

Logger.logln("↻ Rebooting in config mode");
ESP.restart();
Logger.logln("↻ Rebooting in config mode");
ESP.restart();
}
}
}

void BootNormal::setup() {
Boot::setup();

this->_resetDebouncer.attach(PIN_RESET);
this->_resetDebouncer.interval(5000UL);
if (this->_shared_interface->resetTriggerEnabled) {
pinMode(this->_shared_interface->resetTriggerPin, INPUT_PULLUP);

this->_shared_interface->setupFunction();
this->_resetDebouncer.attach(this->_shared_interface->resetTriggerPin);
this->_resetDebouncer.interval(this->_shared_interface->resetTriggerTime);

this->_shared_interface->setupFunction();
}

Config.log();
}
Expand Down
7 changes: 6 additions & 1 deletion src/Homie/Constants.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ namespace HomieInternals {
const uint16_t DEFAULT_OTA_PORT = 35590;
const char DEFAULT_OTA_PATH[] = "/ota";

const uint8_t PIN_RESET = 0; // == D3 on nodeMCU
const uint8_t DEFAULT_RESET_PIN = 0; // == D3 on nodeMCU
const byte DEFAULT_RESET_STATE = LOW;
const uint16_t DEFAULT_RESET_TIME = 5000UL;

const char DEFAULT_FW_NAME[] = "undefined";
const char DEFAULT_FW_VERSION[] = "undefined";

const float LED_WIFI_DELAY = 1;
const float LED_MQTT_DELAY = 0.2;
Expand Down
6 changes: 6 additions & 0 deletions src/Homie/Datatypes/SharedInterface.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@ namespace HomieInternals {
void (*setupFunction)(void);
void (*loopFunction)(void);
void (*resetHook)(void);

bool resetTriggerEnabled;
uint8_t resetTriggerPin;
byte resetTriggerState;
uint16_t resetTriggerTime;

PubSubClient* mqtt;
};
}

0 comments on commit cfbcb59

Please sign in to comment.