-
Ricardo Bartels authoredRicardo Bartels authored
config.h 4.12 KiB
/*
ESP8266 + FastLED + IR Remote: https://github.com/NimmLor/esp8266-fastled-iot-webserver
Copyright (C) 2021 Ricardo Bartels
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// define EEPROM settings
// https://www.kriwanek.de/index.php/de/homeautomation/esp8266/364-eeprom-für-parameter-verwenden
#define CONFIG_SAVE_MAX_DELAY 10 // delay in seconds when the settings are saved after last change occured
#define CONFIG_COMMIT_DELAY 200 // commit delay in ms
typedef struct {
uint8_t brightness;
uint8_t currentPatternIndex;
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t power;
uint8_t autoplay;
uint8_t autoplayDuration;
uint8_t currentPaletteIndex;
uint8_t speed;
char hostname[33];
uint8_t MQTTEnabled;
char MQTTHost[65];
uint16_t MQTTPort;
char MQTTUser[33];
char MQTTPass[65];
char MQTTTopic[65];
char MQTTDeviceName[33];
} configData_t;
configData_t cfg;
configData_t default_cfg;
// save last "timestamp" the config has been saved
unsigned long last_config_change = 0;
void saveConfig(bool force = false) {
if (last_config_change == 0 && force == false) {
return;
}
static bool write_config = false;
static bool write_config_done = false;
static bool commit_config = false;
if (force == true) {
write_config = true;
commit_config = true;
}
if (last_config_change > 0) {
if (last_config_change + (CONFIG_SAVE_MAX_DELAY * 1000) < millis()) {
// timer expired and config has not been written
if (write_config_done == false) {
write_config = true;
// config has been written but we should wait 200ms to commit
} else if (last_config_change + (CONFIG_SAVE_MAX_DELAY * 1000) + CONFIG_COMMIT_DELAY < millis()) {
commit_config = true;
}
}
}
// Save configuration from RAM into EEPROM
if (write_config == true) {
SERIAL_DEBUG_LN(F("Saving Config"))
EEPROM.begin(4095);
EEPROM.put(0, cfg );
write_config_done = true;
write_config = false;
}
if (commit_config == true) {
if (force == true) delay(CONFIG_COMMIT_DELAY);
SERIAL_DEBUG_LN(F("Comitting config"))
EEPROM.commit();
EEPROM.end();
// reset all triggers
last_config_change = 0;
write_config = false;
write_config_done = false;
commit_config = false;
}
}
// trigger a config write/commit
void setConfigChanged() {
// start timer
last_config_change = millis();
}
// overwrite all config settings with "0"
void resetConfig() {
// delete EEPROM config
EEPROM.begin(4095);
for (unsigned int i = 0 ; i < sizeof(cfg) ; i++) {
EEPROM.write(i, 0);
}
delay(CONFIG_COMMIT_DELAY);
EEPROM.commit();
EEPROM.end();
// set to default config
cfg = default_cfg;
saveConfig(true);
}
// parse and set a new hostname to config
void setHostname(String new_hostname) {
int j = 0;
for (unsigned int i = 0; i < new_hostname.length() && i < sizeof(cfg.hostname); i++) {
if (new_hostname.charAt(i) == '-' or \
(new_hostname.charAt(i) >= '0' && new_hostname.charAt(i) <= '9') or \
(new_hostname.charAt(i) >= 'A' && new_hostname.charAt(i) <= 'Z') or \
(new_hostname.charAt(i) >= 'a' && new_hostname.charAt(i) <= 'z')) {
cfg.hostname[j] = new_hostname.charAt(i);
j++;
}
}
cfg.hostname[j] = '\0';
setConfigChanged();
}
// EOF