diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 45e20b9..1bbd4a4 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -85,14 +85,12 @@ String readEEPROM(int offset, int len) { res += char(EEPROM.read(i + offset)); //DBG_OUTPUT_PORT.println(char(EEPROM.read(i + offset))); } - - //DBG_OUTPUT_PORT.print("Read EEPROM: ["); - //DBG_OUTPUT_PORT.print(res); - //DBG_OUTPUT_PORT.println("]"); + DBG_OUTPUT_PORT.printf("readEEPROM(): %s\n", res.c_str()); return res; } void writeEEPROM(int offset, int len, String value) { + DBG_OUTPUT_PORT.printf("writeEEPROM(): %s\n", value.c_str()); for (int i = 0; i < len; ++i) { if (i < value.length()) { @@ -100,13 +98,32 @@ void writeEEPROM(int offset, int len, String value) { } else { EEPROM.write(i + offset, NULL); } - - DBG_OUTPUT_PORT.print("Wrote EEPROM: "); - DBG_OUTPUT_PORT.println(value[i]); } } +// *************************************************************************** +// Saved state handling +// *************************************************************************** +// https://stackoverflow.com/questions/9072320/split-string-into-string-array +String getValue(String data, char separator, int index) +{ + int found = 0; + int strIndex[] = {0, -1}; + int maxIndex = data.length()-1; + + for(int i=0; i<=maxIndex && found<=index; i++){ + if(data.charAt(i)==separator || i==maxIndex){ + found++; + strIndex[0] = strIndex[1]+1; + strIndex[1] = (i == maxIndex) ? i+1 : i; + } + } + + return found>index ? data.substring(strIndex[0], strIndex[1]) : ""; +} + + // *************************************************************************** // Callback for WiFiManager library when config mode is entered // *************************************************************************** @@ -546,6 +563,42 @@ void setup() { }); server.begin(); + + #ifdef ENABLE_STATE_SAVE + // Load state string from EEPROM + String saved_state_string = readEEPROM(256, 32); + String chk = getValue(saved_state_string, '|', 0); + if (chk == "STA") { + DBG_OUTPUT_PORT.printf("Found saved state: %s\n", saved_state_string.c_str()); + String str_mode = getValue(saved_state_string, '|', 1); + mode = static_cast(str_mode.toInt()); + String str_ws2812fx_mode = getValue(saved_state_string, '|', 2); + ws2812fx_mode = str_ws2812fx_mode.toInt(); + String str_ws2812fx_speed = getValue(saved_state_string, '|', 3); + ws2812fx_speed = str_ws2812fx_speed.toInt(); + String str_brightness = getValue(saved_state_string, '|', 4); + brightness = str_brightness.toInt(); + String str_red = getValue(saved_state_string, '|', 5); + main_color.red = str_red.toInt(); + String str_green = getValue(saved_state_string, '|', 6); + main_color.green = str_green.toInt(); + String str_blue = getValue(saved_state_string, '|', 7); + main_color.blue = str_blue.toInt(); + + DBG_OUTPUT_PORT.printf("ws2812fx_mode: %d\n", ws2812fx_mode); + DBG_OUTPUT_PORT.printf("ws2812fx_speed: %d\n", ws2812fx_speed); + DBG_OUTPUT_PORT.printf("brightness: %d\n", brightness); + DBG_OUTPUT_PORT.printf("main_color.red: %d\n", main_color.red); + DBG_OUTPUT_PORT.printf("main_color.green: %d\n", main_color.green); + DBG_OUTPUT_PORT.printf("main_color.blue: %d\n", main_color.blue); + + strip.setMode(ws2812fx_mode); + strip.setSpeed(convertSpeed(ws2812fx_speed)); + strip.setBrightness(brightness); + strip.setColor(main_color.red, main_color.green, main_color.blue); + } + sprintf(last_state, "STA|%2d|%3d|%3d|%3d|%3d|%3d|%3d", mode, ws2812fx_mode, ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue); + #endif } @@ -618,4 +671,23 @@ void loop() { if (mode != TV && mode != CUSTOM) { strip.service(); } + + + #ifdef ENABLE_STATE_SAVE + // Check for state changes + sprintf(current_state, "STA|%2d|%3d|%3d|%3d|%3d|%3d|%3d", mode, strip.getMode(), ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue); + + if (strcmp(current_state, last_state) != 0) { + // DBG_OUTPUT_PORT.printf("STATE CHANGED: %s / %s\n", last_state, current_state); + strcpy(last_state, current_state); + time_statechange = millis(); + state_save_requested = true; + } + if (state_save_requested && time_statechange + timeout_statechange_save <= millis()) { + time_statechange = 0; + state_save_requested = false; + writeEEPROM(256, 32, last_state); // 256 --> last_state (reserved 32 bytes) + EEPROM.commit(); + } + #endif } diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index 4f50f97..7ae8967 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -60,6 +60,15 @@ struct ledstate // Data structure to store a state of a single led uint8_t blue; }; -typedef struct ledstate LEDState; // Define the datatype LEDState -LEDState ledstates[NUMLEDS]; // Get an array of led states to store the state of the whole strip -LEDState main_color = { 255, 0, 0 }; // Store the "main color" of the strip used in single color modes +typedef struct ledstate LEDState; // Define the datatype LEDState +LEDState ledstates[NUMLEDS]; // Get an array of led states to store the state of the whole strip +LEDState main_color = { 255, 0, 0 }; // Store the "main color" of the strip used in single color modes + +#define ENABLE_STATE_SAVE // If defined, save state on reboot +#ifdef ENABLE_STATE_SAVE + char current_state[32]; // Keeps the current state representation + char last_state[32]; // Save the last state as string representation + unsigned long time_statechange = 0; // Time when the state last changed + int timeout_statechange_save = 5000; // Timeout in ms to wait before state is saved + bool state_save_requested = false; // State has to be saved after timeout +#endif diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index cf05430..57c4f6d 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -17,7 +17,9 @@ void getArgs() { ws2812fx_speed = 196; } - ws2812fx_mode = constrain(server.arg("m").toInt(), 0, strip.getModeCount()-1); + if (server.arg("m") != "") { + ws2812fx_mode = constrain(server.arg("m").toInt(), 0, strip.getModeCount()-1); + } main_color.red = constrain(main_color.red, 0, 255); main_color.green = constrain(main_color.green, 0, 255);