diff --git a/android/LedLamp.aia b/android/LedLamp.aia index 656a561..df543aa 100644 Binary files a/android/LedLamp.aia and b/android/LedLamp.aia differ diff --git a/android/LedLamp.apk b/android/LedLamp.apk index bbba2f8..b1ec33c 100644 Binary files a/android/LedLamp.apk and b/android/LedLamp.apk differ diff --git a/android/Декомпозиция.txt b/android/Декомпозиция.txt index b17e95b..3dc69ac 100644 --- a/android/Декомпозиция.txt +++ b/android/Декомпозиция.txt @@ -67,12 +67,12 @@ ConnectivityScreen SaveAllConnectionButtonClick метод (событие): действия при нажатии на кнопку "Сканировать и добавить" DeviceSocketListViewAfterPicking метод (событие): действия при выборе устройства из списка сохранённых и его подключение BaсkButtonClick метод (событие): действия при нажатии кнопки "Назад" на "экране" устройств + SettingsButtonClick метод: отобразить экран настроек UpdateConnectivityStatus метод: обновить статус устройства "Подключен"/"Отключен" на "экране" устройств UpdateCurrentDeviceSocket метод: отобразить текущее устройство (DeviceManager.CurrentDeviceSocket) в полях ввода IP адреса и порта на "экране" устройств UpdateCurrentDevicesSockets метод: отобразить текущий список сохранённых устройств (DeviceManager.Devices) на "экране" устройств ValidateAndAddDeviceSocketToList метод: валидировать значения полей ввода IP адреса и порта и добавть запись в список сохранённых устройств; перерисовать этот список UpdateScreen метод: обновить все элементы управления на "экране" устройств согласно модели данных - SettingsButtonClick метод: отобразить экран настроек ModesScreen Visible свойство: "Видимость экрана эффектов" @@ -87,6 +87,7 @@ FavoritesScreen OnOffSwitchChanged метод (событие): действия при установке/снятии переключателя включения режима избранных эффектов IntervalListPickerAfterPicking метод (событие): действия при выборе интервала времени (статической состявляющей) между автоматическими переключениями избранных эффектов DispersionListPickerAfterPicking метод (событие): действия при выборе разброса времени (случайной состявляющей) между автоматическими переключениями избранных эффектов + UseSavedOnOffSwitchChanged метод (событие): действия при сохранении/удалении сохранённого состояния переключателя включения режима избранных эффектов ListViewIconClick метод (событие): действия при добавлении/удалении эффекта в/из список избранных ListViewelementTouchUp метод (событие): служебный метод, необходимый для корректной отрисовки фона элемента в списке избранных эффектов Initialize метод: настраивает и заполняющий специфический (кастомный) компонент ListViewer @@ -139,11 +140,16 @@ TimerScreen SettingsScreen Visible свойство: "Видимость экрана настроек" + Initialized свойство: "Экран настроек инициализирован" + BlockControlEventsEmitting свойство: "Не генерировать события от элементов управления" (переключателя); нужно, например, чтобы предотвратить switch.changed при его enable/disable BaсkButtonClick метод (событие): действия при нажатии кнопки "Назад" на "экране" настроек OtaButtonClick метод (событие): действия при нажатии кнопки "Режим обновления" на "экране" настроек + ButtonEnabledSwitchChanged метод (событие): действия при установке/снятии переключателя разблокировки аппаратной кнопки на лампе + UpdateScreen метод: обновить все элементы управления на "экране" настроек согласно модели данных + UpdateControls метод: обновить отображение элементов управления (статусы enabled/disabled) в зависимости от сохранённых свойств (модели данных) DeviceManager - Connected свойство: подключено ли устройство (лампа)? точнее, был ли получен ответ на последнюю высланную ему команду + Connected свойство: подключено ли устройство (лампа) точнее, был ли получен ответ на последнюю высланную ему команду State свойство: полученное командой GET состояние устройства (CURR...), список (не строка) Devices свойство: список устройств (хранимое свойство) CurrentDeviceSocket свойство: текущее устройство (хранимое свойство) @@ -163,6 +169,7 @@ DeviceManager GetCurrentEspMode метод: получить значение текущего состояния ESP_MODE (из свойства State) GetCurrentUseNtp метод: получить значение текущего состояния USE_NTP 9из свойства State) GetTimerOnOffFromState метод: получить значение текущего состояния таймера (из свойства State) + GetButtonEnabled метод: получить значение текущего состояния (заблокирована/разблокирована) аппаратной кнопки на лампе GetCurrentTime метод: получить значение текущего времени на устройстве (из свойства State) SaveDeviceSocketSettings метод: сохранить с базу данных приложения хранимые значения (текущее стройство и список устройств) SetDeviceOffline метод: установить свойства Connected и State в начальное состояние (очистить), соответствует состоянию "устройство не подключено" @@ -192,7 +199,10 @@ DeviceManager GeFavoritesOnOff метод: получить состояние вкл/выкл режима избранных эффектов (из свойства FavoritesState) GeFavoritesInterval метод: получить интервал времени смены избранных эффектов (из свойства FavoritesState) GeFavoritesDispersion метод: получить разброс времени смены избранных эффектов (из свойства FavoritesState) + GetFavoritesUseSavedOnOff метод: получить сохранённое состояние переключателя включения режима избранных эффектов GeFavoritesModesList метод: получить список эффектов с указанным состояние (включен/исключён в избранные) для каждого из них + RequestOtaUpdate метод: перевести лампу в состояние ожидания прошивки по воздуху + SendEnableHardwareButtonCommand метод: установить состояние (заблокирована/разблокирована) аппаратной кнопки на лампе DiscoverManager TimeoutMs свойство: время ожидания ответа от устройств на multicast команду DISCOVER diff --git a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino index eaeca55..8935051 100644 --- a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino +++ b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino @@ -94,6 +94,8 @@ - * периодически - определяется константой PRINT_TIME в Constants.h - от раза в час (красным цветом) до раза в минуту (синим цветом) с яркостью текущего эффекта как при включенной, так и при выключенной матрице --- 19.10.2019 - Добавлены "ночные часы" (от NIGHT_HOURS_START до NIGHT_HOURS_STOP включительно) и "дневные часы" (всё остальное время), для которых доступна регулировка яркости для вывода времени бегущей строкой - NIGHT_HOURS_BRIGHTNESS и DAY_HOURS_BRIGHTNESS + --- 20.10.2019 + - Добавлена блокировка кнопки на лампе из приложения; сохраняется в EEPROM память */ // Ссылка для менеджера плат: @@ -189,6 +191,7 @@ bool loadingFlag = true; bool ONflag = false; uint32_t eepromTimeout; bool settChanged = false; +bool buttonEnabled = true; unsigned char matrixValue[8][16]; @@ -235,6 +238,8 @@ void setup() wifiManager.resetSettings(); // сброс сохранённых SSID и пароля при старте с зажатой кнопкой, если разрешено LOG.println(F("Настройки WiFiManager сброшены")); } + buttonEnabled = true; // при сбросе параметров WiFi сразу после старта с зажатой кнопкой, также разблокируется кнопка, если была заблокирована раньше + EepromManager::SaveButtonEnabled(&buttonEnabled); ESP.wdtFeed(); #endif #endif @@ -253,7 +258,7 @@ void setup() // EEPROM EepromManager::InitEepromSettings( // инициализация EEPROM; запись начального состояния настроек, если их там ещё нет; инициализация настроек лампы значениями из EEPROM - modes, alarms, &espMode, &ONflag, &dawnMode, ¤tMode, + modes, alarms, &espMode, &ONflag, &dawnMode, ¤tMode, &buttonEnabled, &(FavoritesManager::ReadFavoritesFromEeprom), &(FavoritesManager::SaveFavoritesToEeprom)); LOG.printf_P(PSTR("Рабочий режим лампы: ESP_MODE = %d\n"), espMode); @@ -373,7 +378,10 @@ void loop() #endif #ifdef ESP_USE_BUTTON - buttonTick(); + if (buttonEnabled) + { + buttonTick(); + } #endif #ifdef OTA diff --git a/firmware/GyverLamp_v1.4/MqttManager.h b/firmware/GyverLamp_v1.4/MqttManager.h index 0403ed2..e52d7eb 100644 --- a/firmware/GyverLamp_v1.4/MqttManager.h +++ b/firmware/GyverLamp_v1.4/MqttManager.h @@ -17,8 +17,10 @@ * DAWN1 - установить "рассвет" за 5 минут до будильника (1 = 5 минут - номер опции в выпадающем списке в приложении, нумерация с единицы) * TMR_SET 1 3 300 - установить таймер; описание параметров - см. команду TMR ниже * FAV_SET 1 60 120 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 - установить режим "избранное", параметры - см. команду FAV ниже + * BTN ON - разблокировать кнопку на лампе + * BTN OFF - заблокировать кнопку на лампе * Лампа отправляет своё состояние сразу после включения и после каждого изменения в топик LedLamp/LedLamp_00316765/state; payload: - * "CURR 7 14 4 50 1 1 1 0 21:25:50", где: + * "CURR 7 14 4 50 1 1 1 0 1 21:25:50", где: * CURR - идентификатор команды, CURR - текущее состояние лампы * 7 - номер текущего эффекта * 14 - яркость @@ -26,8 +28,9 @@ * 50 - масштаб * 1 - признак "матрица включена" * 1 - режим ESP_MODE - * 1 - признак "работает таймер" - * 0 - признак USE_NTP (пытаться синхронизировать время по серверам времени в интернете) + * 1 - признак USE_NTP (пытаться синхронизировать время по серверам времени в интернете) + * 0 - признак "работает таймер" + * 1 - признак "кнопка разблокирована" * 21:25:50 - текущее время (если не синхронизировано, показывает время от старта модуля) * "ALMS 1 0 0 0 0 0 0 0 390 0 0 0 0 0 0 1" * ALMS - идентификатор команды, ALMS - настройки будильников diff --git a/firmware/GyverLamp_v1.4/button.ino b/firmware/GyverLamp_v1.4/button.ino index 71d8eae..e70a806 100644 --- a/firmware/GyverLamp_v1.4/button.ino +++ b/firmware/GyverLamp_v1.4/button.ino @@ -6,6 +6,11 @@ static bool startButtonHolding = false; // флаг: кно void buttonTick() { + if (!buttonEnabled) // события кнопки не обрабатываются, если она заблокирована + { + return; + } + touch.tick(); uint8_t clickCount = touch.hasClicks() ? touch.getClicks() : 0U; diff --git a/firmware/GyverLamp_v1.4/parsing.ino b/firmware/GyverLamp_v1.4/parsing.ino index fdfd11b..3b9c7fe 100644 --- a/firmware/GyverLamp_v1.4/parsing.ino +++ b/firmware/GyverLamp_v1.4/parsing.ino @@ -290,6 +290,30 @@ void processInputBuffer(char *inputBuffer, char *outputBuffer, bool generateOutp #endif } + else if (!strncmp_P(inputBuffer, PSTR("BTN"), 3)) + { + if (strstr_P(inputBuffer, PSTR("ON")) - inputBuffer == 4) + { + buttonEnabled = true; + EepromManager::SaveButtonEnabled(&buttonEnabled); + sendCurrent(inputBuffer); + } + else if (strstr_P(inputBuffer, PSTR("OFF")) - inputBuffer == 4) + { + buttonEnabled = false; + EepromManager::SaveButtonEnabled(&buttonEnabled); + sendCurrent(inputBuffer); + } + + #if (USE_MQTT) + if (espMode == 1U) + { + strcpy(MqttManager::mqttBuffer, inputBuffer); + MqttManager::needToPublish = true; + } + #endif + } + else { inputBuffer[0] = '\0'; @@ -324,6 +348,7 @@ void sendCurrent(char *outputBuffer) #endif sprintf_P(outputBuffer, PSTR("%s %u"), outputBuffer, (uint8_t)TimerManager::TimerRunning); + sprintf_P(outputBuffer, PSTR("%s %u"), outputBuffer, (uint8_t)buttonEnabled); #ifdef USE_NTP sprintf_P(outputBuffer, PSTR("%s %s"), outputBuffer, timeClient.getFormattedTime().c_str()); diff --git a/firmware/GyverLamp_v1.4/timerMinim.h b/firmware/GyverLamp_v1.4/timerMinim.h index 57f1deb..0d793a6 100644 --- a/firmware/GyverLamp_v1.4/timerMinim.h +++ b/firmware/GyverLamp_v1.4/timerMinim.h @@ -26,7 +26,7 @@ void timerMinim::setInterval(uint32_t interval) bool timerMinim::isReady() { - if ((long)millis() - _timer >= _interval) + if ((uint32_t)millis() - _timer >= _interval) { _timer = millis(); return true;