Добавлена блокировка кнопки на лампе из android приложения

This commit is contained in:
gunner47
2019-10-20 20:38:08 +03:00
parent ec679047bf
commit 772d2b50d4
8 changed files with 59 additions and 8 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -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

View File

@@ -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, &currentMode,
modes, alarms, &espMode, &ONflag, &dawnMode, &currentMode, &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

View File

@@ -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 - настройки будильников

View File

@@ -6,6 +6,11 @@ static bool startButtonHolding = false; // флаг: кно
void buttonTick()
{
if (!buttonEnabled) // события кнопки не обрабатываются, если она заблокирована
{
return;
}
touch.tick();
uint8_t clickCount = touch.hasClicks() ? touch.getClicks() : 0U;

View File

@@ -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());

View File

@@ -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;