diff --git a/ConfigDataStructure.py b/ConfigDataStructure.py index 81d8d45..7c4698d 100644 --- a/ConfigDataStructure.py +++ b/ConfigDataStructure.py @@ -10,6 +10,7 @@ configItems = [ {"label":"MQTT Password", "key":"mqttPass", "type":"C", "length":32, "default":"geheim123"}, {"label":"MQTT ClientId", "key":"mqttClientId", "type":"C", "length":32, "default":"RgbLed1"}, {"label":"MQTT Port", "key":"mqttPort", "type":"I", "default":8883}, + {"label":"MQTT Topic Flow Command", "key":"mqttTopicFlowCommand", "type":"C", "length":64, "default":"IoT/RgbLed1/FlowCommand"}, {"label":"MQTT Topic Color Command", "key":"mqttTopicColorCommand", "type":"C", "length":64, "default":"IoT/RgbLed1/ColorCommand"}, {"label":"MQTT Topic Command", "key":"mqttTopicCommand", "type":"C", "length":64, "default":"IoT/RgbLed1/Command"}, {"label":"MQTT DebugTopic", "key":"mqttDebugTopic", "type":"C", "length":64, "default":"IoT/RgbLed1/Debug"}, diff --git a/application.cpp b/application.cpp index fff1991..d80da1e 100644 --- a/application.cpp +++ b/application.cpp @@ -47,6 +47,58 @@ Adafruit_NeoPixel pixels(NUM_OF_LEDs, PIXEL_PIN, NEO_RGB + NEO_KHZ400); bool show = false; +typedef enum { + E_FC_IDLE, + E_FC_ABORT, + E_FC_FADE_ON, + E_FC_FADE_OFF, +} e_colorFlowCmds; + +e_colorFlowCmds colorFlowCmd = E_FC_IDLE; + +typedef enum { + E_FE_IDLE, + E_FE_INCREASE_BRIGHTNESS, + E_FE_DECREASE_BRIGHTNESS, +} e_colorFlowStates; + + + +static void colorFlowEngine() { + e_colorFlowStates colorFlowState = E_FE_IDLE; + + if (colorFlowCmd == E_FC_ABORT) { + colorFlowState = E_FE_IDLE; + colorFlowCmd = E_FC_IDLE; + } + + switch (colorFlowState) { + case E_FE_IDLE: + switch (colorFlowCmd) { + case E_FC_FADE_ON: + colorFlowState = E_FE_INCREASE_BRIGHTNESS; + break; + case E_FC_FADE_OFF: + colorFlowState = E_FE_DECREASE_BRIGHTNESS; + break; + case E_FC_IDLE: + case E_FC_ABORT: + default: + break; + } + colorFlowCmd = E_FC_IDLE; + break; + case E_FE_INCREASE_BRIGHTNESS: + // fade up + show = true; + break; + case E_FE_DECREASE_BRIGHTNESS: + // fade down + show = true; + break; + } +} + static CRGB evaluationColorWord(char* cmd) { @@ -97,6 +149,7 @@ static CRGB evaluationColorWord(char* cmd) { void subscribeApplication() { mqttClient.subscribe(configBlock.mqttTopicColorCommand); mqttClient.subscribe(configBlock.mqttTopicCommand); + mqttClient.subscribe(configBlock.mqttTopicFlowCommand); } @@ -133,7 +186,17 @@ static void setColor(int8_t ledNumber, uint8_t red, uint8_t green, uint8_t blue) void callbackApplication(char *topic, uint8_t tokenCnt, char **tokens) { - if (! strcmp(topic, configBlock.mqttTopicCommand)) { + if (! strcmp(topic, configBlock.mqttTopicFlowCommand)) { + switch (tokenCnt) { + case 1: + if (! strcmp(tokens[0], "up")) { + colorFlowCmd = E_FC_FADE_ON; + } else if (! strcmp(tokens[0], "down")) { + colorFlowCmd = E_FC_FADE_OFF; + } + break; + } + } else if (! strcmp(topic, configBlock.mqttTopicCommand)) { int32_t n, b; CRGB pseudoColors; switch (tokenCnt) { @@ -149,6 +212,7 @@ void callbackApplication(char *topic, uint8_t tokenCnt, char **tokens) { setColor(n, b, b, b); break; } + colorFlowCmd = E_FC_ABORT; } else if (! strcmp(topic, configBlock.mqttTopicColorCommand)) { int32_t n, red, green, blue; CRGB colors; @@ -180,6 +244,7 @@ void callbackApplication(char *topic, uint8_t tokenCnt, char **tokens) { setColor(n, red, green, blue); break; } + colorFlowCmd = E_FC_ABORT; } } @@ -204,7 +269,7 @@ void setupApplication() { void loopApplication() { mqttLoop(); - + colorFlowEngine(); if (show) { show = false; diff --git a/configuration.cpp b/configuration.cpp index 1c70afe..b53b6be 100644 --- a/configuration.cpp +++ b/configuration.cpp @@ -36,6 +36,7 @@ void configServeIndex() { strcpy(configBlock.mqttPass, "geheim123"); strcpy(configBlock.mqttClientId, "RgbLed1"); configBlock.mqttPort = 8883; + strcpy(configBlock.mqttTopicFlowCommand, "IoT/RgbLed1/FlowCommand"); strcpy(configBlock.mqttTopicColorCommand, "IoT/RgbLed1/ColorCommand"); strcpy(configBlock.mqttTopicCommand, "IoT/RgbLed1/Command"); strcpy(configBlock.mqttDebugTopic, "IoT/RgbLed1/Debug"); @@ -194,6 +195,21 @@ void configServeIndex() { buffer += configBlock.mqttPort; buffer += "\""; + buffer += + " />" + " " + " " + "