Добавлена возможность сохранять состояние (вкл/выкл) режима "Избранное"; не сбрасывается выключением матрицы, не сбрасывается перезапуском модуля esp. Убрана очистка параметров WiFi при старте с зажатой кнопкой; регулируется директивой ESP_RESET_ON_STASRT, которая определена как false по умолчанию.

This commit is contained in:
gunner47
2019-09-20 23:22:35 +03:00
parent 0a95e3e1b5
commit 8277bd8aac
7 changed files with 66 additions and 35 deletions

View File

@@ -9,9 +9,10 @@
class FavoritesManager
{
public:
static bool FavoritesRunning; // флаг "работает режим автоматической смены избранных эффектов"
static uint8_t FavoritesRunning; // флаг "работает режим автоматической смены избранных эффектов"
static uint16_t Interval; // статический интервал (время между сменами эффектов)
static uint16_t Dispersion; // дополнительный динамический (случайный) интервал (время между сменами эффектов)
static uint8_t UseSavedFavoritesRunning; // флаг, определяющий, нужно ли использовать сохранённое значение FavoritesRunning при перезапуске; еслин нет, "избранное" будет выключено при старте
static uint8_t FavoriteModes[MODE_AMOUNT]; // массив, каждый элемент которого соответствует флагу "эффект №... добавлен в избранные"
static void SetStatus(char* statusText) // помещает в statusText состояние режима работы избранных эффектов
@@ -19,8 +20,10 @@ class FavoritesManager
char buff[6];
strcpy_P(statusText, PSTR("FAV "));
strcat_P(statusText, FavoritesRunning ? PSTR("1") : PSTR("0"));
itoa(FavoritesRunning, buff, 10);
strcat(statusText, buff);
strcat_P(statusText, PSTR(" "));
buff[0] = '\0';
itoa(Interval, buff, 10);
strcat(statusText, buff);
@@ -32,9 +35,14 @@ class FavoritesManager
strcat_P(statusText, PSTR(" "));
buff[0] = '\0';
itoa(UseSavedFavoritesRunning, buff, 10);
strcat(statusText, buff);
strcat_P(statusText, PSTR(" "));
buff[0] = '\0';
for (uint8_t i = 0; i < MODE_AMOUNT; i++)
{
itoa((uint8_t)FavoriteModes[i], buff, 10);
itoa(FavoriteModes[i], buff, 10);
strcat(statusText, buff);
if (i < MODE_AMOUNT - 1) strcat_P(statusText, PSTR(" "));
buff[0] = '\0';
@@ -46,12 +54,13 @@ class FavoritesManager
static void ConfigureFavorites(const char* statusText) // принимает statusText, парсит его и инициализирует свойства класса значениями из statusText'а
{
FavoritesRunning = getFavoritesRunning(statusText);
if (!FavoritesRunning)
if (FavoritesRunning == 0)
{
nextModeAt = 0;
}
Interval = getInterval(statusText);
Dispersion = getDispersion(statusText);
UseSavedFavoritesRunning = getUseSavedFavoritesRunning(statusText);
for (uint8_t i = 0; i < MODE_AMOUNT; i++)
{
FavoriteModes[i] = getModeOnOff(statusText, i);
@@ -67,7 +76,7 @@ class FavoritesManager
#endif
)
{
if (!FavoritesRunning ||
if (FavoritesRunning == 0 ||
!*ONflag // лампа не переключается на следующий эффект при выключенной матрице
#ifdef USE_NTP
|| *dawnFlag // лампа не переключается на следующий эффект при включенном будильнике
@@ -79,7 +88,7 @@ class FavoritesManager
if (nextModeAt == 0) // лампа не переключается на следующий эффект сразу после включения режима избранных эффектов
{
nextModeAt = getNexTime();
nextModeAt = getNextTime();
return false;
}
@@ -87,7 +96,7 @@ class FavoritesManager
{
*currentMode = getNextFavoriteMode(currentMode);
*loadingFlag = true;
nextModeAt = getNexTime();
nextModeAt = getNextTime();
#ifdef GENERAL_DEBUG
Serial.printf_P(PSTR("Переключение на следующий избранный режим: %d\n\n"), (*currentMode));
@@ -101,25 +110,28 @@ class FavoritesManager
static void ReadFavoritesFromEeprom()
{
Interval = EepromManager::ReadUint16(EEPROM_FAVORITES_START_ADDRESS);
Dispersion = EepromManager::ReadUint16(EEPROM_FAVORITES_START_ADDRESS + 2);
Interval = EepromManager::ReadUint16(EEPROM_FAVORITES_START_ADDRESS + 1);
Dispersion = EepromManager::ReadUint16(EEPROM_FAVORITES_START_ADDRESS + 3);
UseSavedFavoritesRunning = EEPROM.read(EEPROM_FAVORITES_START_ADDRESS + 5);
FavoritesRunning = UseSavedFavoritesRunning > 0 ? EEPROM.read(EEPROM_FAVORITES_START_ADDRESS) : FavoritesRunning;
for (uint8_t i = 0; i < MODE_AMOUNT; i++)
{
FavoriteModes[i] = EEPROM.read(EEPROM_FAVORITES_START_ADDRESS + i + 4);
FavoriteModes[i] = EEPROM.read(EEPROM_FAVORITES_START_ADDRESS + i + 6);
FavoriteModes[i] = FavoriteModes[i] > 0 ? 1 : 0;
}
}
static void SaveFavoritesToEeprom()
{
// FavoritesRunning в EEPROM не сохраняем для экономии ресурса памяти
EepromManager::WriteUint16(EEPROM_FAVORITES_START_ADDRESS, Interval);
EepromManager::WriteUint16(EEPROM_FAVORITES_START_ADDRESS + 2, Dispersion);
EEPROM.put(EEPROM_FAVORITES_START_ADDRESS, FavoritesRunning);
EepromManager::WriteUint16(EEPROM_FAVORITES_START_ADDRESS + 1, Interval);
EepromManager::WriteUint16(EEPROM_FAVORITES_START_ADDRESS + 3, Dispersion);
EEPROM.put(EEPROM_FAVORITES_START_ADDRESS + 5, UseSavedFavoritesRunning);
for (uint8_t i = 0; i < MODE_AMOUNT; i++)
{
EEPROM.put(EEPROM_FAVORITES_START_ADDRESS + i + 4, FavoriteModes[i] > 0 ? 1 : 0);
EEPROM.put(EEPROM_FAVORITES_START_ADDRESS + i + 6, FavoriteModes[i] > 0 ? 1 : 0);
}
EEPROM.commit();
@@ -127,14 +139,14 @@ class FavoritesManager
static void TurnFavoritesOff()
{
FavoritesRunning = false;
FavoritesRunning = 0;
nextModeAt = 0;
}
private:
static uint32_t nextModeAt; // ближайшее время переключения на следующий избранный эффект (millis())
static bool isStatusTextCorrect(const char* statusText) // валидирует statusText (проверяет, правильное ли коичество компонентов он содержит)
static bool isStatusTextCorrect(const char* statusText) // валидирует statusText (проверяет, правильное ли количество компонентов он содержит)
{
char buff[MAX_UDP_BUFFER_SIZE];
strcpy(buff, statusText);
@@ -152,23 +164,24 @@ class FavoritesManager
static uint8_t getStatusTextNormalComponentsCount() // возвращает правильное ли коичество компонентов для statusText в зависимости от определённого формата команды и количества эффектов
{
// "FAV 0/1 <цифра> <цифра> <массив цифр 0/1 для каждого режима>" (вкл/выкл, интервал в секундах, разброс в секундах, вкл/выкл каждого эффекта в избранные)
// "FAV 0/1 <цифра> <цифра> 0/1 <массив цифр 0/1 для каждого режима>" (вкл/выкл, интервал в секундах, разброс в секундах, использовать ли хранимый вкл/выкл, вкл/выкл каждого эффекта в избранные)
return
1 + // "FAV"
1 + // On/Off
1 + // вкл/выкл
1 + // интервал
1 + // разброс
1 + // использовать ли хранимый вкл/выкл
MODE_AMOUNT; // 0/1 для каждого эффекта
}
static bool getFavoritesRunning(const char* statusText) // возвращает признак вкл/выкл режима избранных эффектов из statusText
static uint8_t getFavoritesRunning(const char* statusText) // возвращает признак вкл/выкл режима избранных эффектов из statusText
{
char lexem[2];
memset(lexem, 0, 2);
strcpy(lexem, getLexNo(statusText, 1));
return lexem != NULL
? !strcmp(lexem, "1")
: false;
: 0;
}
static uint16_t getInterval(const char* statusText) // возвращает интервал (постоянную составляющую) переключения избранных эффектов из statusText
@@ -191,11 +204,21 @@ class FavoritesManager
: DEFAULT_FAVORITES_DISPERSION;
}
static uint8_t getUseSavedFavoritesRunning(const char* statusText)// возвращает признак вкл/выкл режима избранных эффектов из statusText
{
char lexem[2];
memset(lexem, 0, 2);
strcpy(lexem, getLexNo(statusText, 4));
return lexem != NULL
? !strcmp(lexem, "1")
: 0;
}
static bool getModeOnOff(const char* statusText, uint8_t modeId) // возвращает признак включения указанного эффекта в избранные эффекты
{
char lexem[2];
memset(lexem, 0, 2);
strcpy(lexem, getLexNo(statusText, modeId + 4));
strcpy(lexem, getLexNo(statusText, modeId + 5));
return lexem != NULL
? !strcmp(lexem, "1")
: false;
@@ -248,7 +271,7 @@ class FavoritesManager
return result;
}
static uint32_t getNexTime() // определяет время следующего переключения на следующий избранный эффект
static uint32_t getNextTime() // определяет время следующего переключения на следующий избранный эффект
{
return millis() + Interval * 1000 + random(0, Dispersion + 1) * 1000;
}