diff --git a/android/LedLamp.aia b/android/LedLamp.aia index 14ecc7c..72abdcc 100644 Binary files a/android/LedLamp.aia and b/android/LedLamp.aia differ diff --git a/android/LedLamp.apk b/android/LedLamp.apk index 5a64a7b..d50fb05 100644 Binary files a/android/LedLamp.apk and b/android/LedLamp.apk differ diff --git a/firmware/GyverLamp_v1.4/EepromManager.h b/firmware/GyverLamp_v1.4/EepromManager.h index 4f88382..59ea2da 100644 --- a/firmware/GyverLamp_v1.4/EepromManager.h +++ b/firmware/GyverLamp_v1.4/EepromManager.h @@ -48,13 +48,14 @@ * * 111-134 24 настройки режима избранных эффектов (интервал - 2 байта; разброс - 2 байта; вкл/выкл каждого эффекта - 20 (MODE_AMOUNT) байт; вкл/выкл не хранится в EEPROM) * + * 197 1 состояние лампы (вкл/выкл) * 198 1 признак первого запуска (определяет необходимость первоначальной записи всех хранимых настроек) * 199 1 время до "рассвета" (dawnMode) * 200 1 текущий режим (currentMode) * * Не используются адреса: * 96-110 15 резерв, можно добавить ещё 5 эффектов - * 135-197 63 если добавить ещё 10 эффектов, начальный адрес неиспользуемой памяти сдвинется с 135 на 145 + * 135-196 62 если добавить ещё 10 эффектов, начальный адрес неиспользуемой памяти сдвинется с 135 на 145 */ #include @@ -63,6 +64,7 @@ #define EEPROM_ALARM_START_ADDRESS (0U) // начальный адрес в EEPROM памяти для записи настроек будильников #define EEPROM_MODES_START_ADDRESS (21U) // начальный адрес в EEPROM памяти для записи настроек эффектов (яркость, скорость, масштаб) #define EEPROM_FAVORITES_START_ADDRESS (111U) // начальный адрес в EEPROM памяти для записи настроек режима избранных эффектов +#define EEPROM_LAMP_ON_ADDRESS (197U) // адрес в EEPROM памяти для записи состояния лампы (вкл/выкл) #define EEPROM_FIRST_RUN_ADDRESS (198U) // адрес в EEPROM памяти для записи признака первого запуска (определяет необходимость первоначальной записи всех хранимых настроек) #define EEPROM_DAWN_MODE_ADDRESS (199U) // адрес в EEPROM памяти для записи времени до "рассвета" #define EEPROM_CURRENT_MODE_ADDRESS (200U) // адрес в EEPROM памяти для записи номера текущего эффекта лампы @@ -77,7 +79,7 @@ class EepromManager { public: - static void InitEepromSettings(ModeType modes[], AlarmType alarms[], uint8_t* dawnMode, int8_t* currentMode, + static void InitEepromSettings(ModeType modes[], AlarmType alarms[], bool* onFlag, uint8_t* dawnMode, int8_t* currentMode, void (*readFavoritesSettings)(), void (*saveFavoritesSettings)()) { // записываем в EEPROM начальное состояние настроек, если их там ещё нет @@ -102,6 +104,7 @@ class EepromManager EEPROM.commit(); } + EEPROM.write(EEPROM_LAMP_ON_ADDRESS, 0); EEPROM.write(EEPROM_DAWN_MODE_ADDRESS, 0); EEPROM.write(EEPROM_CURRENT_MODE_ADDRESS, 0); @@ -124,6 +127,7 @@ class EepromManager readFavoritesSettings(); + *onFlag = (bool)EEPROM.read(EEPROM_LAMP_ON_ADDRESS); *dawnMode = EEPROM.read(EEPROM_DAWN_MODE_ADDRESS); *currentMode = EEPROM.read(EEPROM_CURRENT_MODE_ADDRESS); } @@ -134,12 +138,13 @@ class EepromManager EEPROM.commit(); } - static void HandleEepromTick(bool* settChanged, uint32_t* eepromTimeout, int8_t* currentMode, ModeType modes[], void (*saveFavoritesSettings)()) + static void HandleEepromTick(bool* settChanged, uint32_t* eepromTimeout, bool* onFlag, int8_t* currentMode, ModeType modes[], void (*saveFavoritesSettings)()) { if (*settChanged && millis() - *eepromTimeout > EEPROM_WRITE_DELAY) { *settChanged = false; *eepromTimeout = millis(); + SaveOnFlag(onFlag); SaveModesSettings(currentMode, modes); if (EEPROM.read(EEPROM_CURRENT_MODE_ADDRESS) != *currentMode) { @@ -157,6 +162,12 @@ class EepromManager EEPROM.commit(); } + static void SaveOnFlag(bool* onFlag) + { + EEPROM.write(EEPROM_LAMP_ON_ADDRESS, *onFlag); + EEPROM.commit(); + } + static void SaveDawnMode(uint8_t* dawnMode) { EEPROM.write(EEPROM_DAWN_MODE_ADDRESS, *dawnMode); diff --git a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino index 6f4ad02..9698cdd 100644 --- a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino +++ b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino @@ -58,6 +58,10 @@ - Большая оптимизация использования памяти - Исправлена ошибка невключения эффекта "Белый свет" приложением и кнопкой - Исправлена ошибка неправильного выбора интервала в режиме Избранное в android приложении + --- 16.09.2019 + - Добавлено сохранение состояния (вкл/выкл) лампы в EEPROM память + - Добавлен новый эффект белого света (с горизонтальной полосой) + - Реорганизован код, исправлены ошибки */ // Ссылка для менеджера плат: @@ -68,7 +72,6 @@ #include "Constants.h" #include #include -#include #include #include #include @@ -119,7 +122,7 @@ static const uint8_t maxDim = max(WIDTH, HEIGHT); ModeType modes[MODE_AMOUNT]; AlarmType alarms[7]; -uint8_t dawnOffsets[] = {5, 10, 15, 20, 25, 30, 40, 50, 60};// опции для выпадающего списка параметра "время перед 'рассветом'" (будильник); синхронизировано с android приложением +static const uint8_t dawnOffsets[] PROGMEM = {5, 10, 15, 20, 25, 30, 40, 50, 60}; // опции для выпадающего списка параметра "время перед 'рассветом'" (будильник); синхронизировано с android приложением uint8_t dawnMode; bool dawnFlag = false; long thisTime; @@ -127,7 +130,7 @@ bool manualOff = false; int8_t currentMode = 0; bool loadingFlag = true; -bool ONflag = true; +bool ONflag = false; uint32_t eepromTimeout; bool settChanged = false; @@ -237,7 +240,7 @@ void setup() Udp.begin(localPort); EepromManager::InitEepromSettings( // инициализация EEPROM; запись начального состояния настроек, если их там ещё нет; инициализация настроек лампы значениями из EEPROM - modes, alarms, &dawnMode, ¤tMode, + modes, alarms, &ONflag, &dawnMode, ¤tMode, &(FavoritesManager::ReadFavoritesFromEeprom), &(FavoritesManager::SaveFavoritesToEeprom)); @@ -256,7 +259,8 @@ void loop() { parseUDP(); effectsTick(); - EepromManager::HandleEepromTick(&settChanged, &eepromTimeout, ¤tMode, modes, &(FavoritesManager::SaveFavoritesToEeprom)); + EepromManager::HandleEepromTick(&settChanged, &eepromTimeout, &ONflag, + ¤tMode, modes, &(FavoritesManager::SaveFavoritesToEeprom)); #ifdef USE_NTP timeTick(); #endif @@ -266,7 +270,8 @@ void loop() #ifdef OTA otaManager.HandleOtaUpdate(); // ожидание и обработка команды на обновление прошивки по воздуху #endif - TimerManager::HandleTimer(&ONflag, &changePower); // обработка событий таймера отключения лампы + TimerManager::HandleTimer(&ONflag, &settChanged, // обработка событий таймера отключения лампы + &eepromTimeout, &changePower); if (FavoritesManager::HandleFavorites( // обработка режима избранных эффектов &ONflag, ¤tMode, diff --git a/firmware/GyverLamp_v1.4/TimerManager.h b/firmware/GyverLamp_v1.4/TimerManager.h index 8bc4992..39eafe4 100644 --- a/firmware/GyverLamp_v1.4/TimerManager.h +++ b/firmware/GyverLamp_v1.4/TimerManager.h @@ -11,6 +11,8 @@ class TimerManager static void HandleTimer( // функция, обрабатывающая срабатывание таймера, гасит матрицу bool* ONflag, + bool* settChanged, + uint32_t* eepromTimeout, void (*changePower)()) { if (!TimerManager::TimerHasFired && diff --git a/firmware/GyverLamp_v1.4/button.ino b/firmware/GyverLamp_v1.4/button.ino index 7ac1768..67baeb3 100644 --- a/firmware/GyverLamp_v1.4/button.ino +++ b/firmware/GyverLamp_v1.4/button.ino @@ -19,6 +19,8 @@ void buttonTick() ONflag = !ONflag; changePower(); } + settChanged = true; + eepromTimeout = millis(); loadingFlag = true; } diff --git a/firmware/GyverLamp_v1.4/parsing.ino b/firmware/GyverLamp_v1.4/parsing.ino index 68a93b0..b5db4de 100644 --- a/firmware/GyverLamp_v1.4/parsing.ino +++ b/firmware/GyverLamp_v1.4/parsing.ino @@ -75,6 +75,8 @@ void parseUDP() { ONflag = true; loadingFlag = true; + settChanged = true; + eepromTimeout = millis(); changePower(); sendCurrent(); } @@ -82,6 +84,8 @@ void parseUDP() else if (!strncmp_P(inputBuffer, PSTR("P_OFF"), 5)) { ONflag = false; + settChanged = true; + eepromTimeout = millis(); changePower(); sendCurrent(); }