From 0f948e0498a74e51b80905b4e047bce52060467f Mon Sep 17 00:00:00 2001 From: qubeck Date: Mon, 15 Jan 2018 16:09:30 +0100 Subject: [PATCH] changed alexa change propagation to a queue based impl. to be more efficient --- code/espurna/alexa.ino | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/code/espurna/alexa.ino b/code/espurna/alexa.ino index 15accce0..a7991bac 100644 --- a/code/espurna/alexa.ino +++ b/code/espurna/alexa.ino @@ -9,17 +9,18 @@ Copyright (C) 2016-2018 by Xose PĂ©rez #if ALEXA_SUPPORT #include -#include +#include fauxmoESP alexa; // ----------------------------------------------------------------------------- // ALEXA // ----------------------------------------------------------------------------- -struct alexa_dev { - bool _alexa_change = false; - bool _alexa_state = false; +struct AlexaDevChange { + AlexaDevChange(unsigned char device_id, bool state) : device_id(device_id), state(state) {}; + unsigned char device_id = 0; + bool state = false; }; -std::map alexa_devices; +static std::queue _alexa_dev_changes; void _alexaWebSocketOnSend(JsonObject& root) { root["alexaVisible"] = 1; @@ -59,8 +60,8 @@ void alexaSetup() { } alexa.onSetState([&](unsigned char device_id, const char * name, bool state) { - alexa_devices[device_id]._alexa_change = true; - alexa_devices[device_id]._alexa_state = state; + AlexaDevChange change(device_id, state); + _alexa_dev_changes.push(change); }); alexa.onGetState([relays](unsigned char device_id, const char * name) { @@ -73,14 +74,12 @@ void alexaLoop() { alexa.handle(); - for (std::map::iterator it=alexa_devices.begin(); it!=alexa_devices.end(); ++it) { - if (it->second._alexa_change) { - DEBUG_MSG_P(PSTR("[ALEXA] Device #%d state: %s\n"), it->first, it->second._alexa_state ? "ON" : "OFF"); - it->second._alexa_change = false; - relayStatus(it->first, it->second._alexa_state); - } + while (!_alexa_dev_changes.empty()) { + AlexaDevChange& change = _alexa_dev_changes.front(); + DEBUG_MSG_P(PSTR("[ALEXA] Device #%d state: %s\n"), change.device_id, change.state ? "ON" : "OFF"); + relayStatus(change.device_id, change.state); + _alexa_dev_changes.pop(); } - } #endif