Функциональная декомпозиция, диаграмма "классов"

UI					всё, что связано с отображением
1.  ScreenManager		выбор отображаемого экрана
2.  MainScreen			управление UI'ем главного экрана (видимость, enable, цвета, позиции и т.д.)
3.  ConnectivityScreen	управление UI'ем экрана уствройств (видимость, enable, цвета, позиции и т.д.)
4.  ModesScreen			управление UI'ем экрана выбора эффектов (видимость, enable, цвета, позиции и т.д.)
5.  FavoritesScreen		управление UI'ем экрана избранных эффектов (видимость, enable, цвета, позиции и т.д.)
6.  AlarmScreen			управление UI'ем экрана будильника (видимость, enable, цвета, позиции и т.д.)
7.  TimerScreen			управление UI'ем экрана таймера (видимость, enable, цвета, позиции и т.д.)
8.  SettingsScreen      управление UI'ем экрана настроек (OTA)

Backend				всё, что связано с логикой
9.  DeviceManager		backend функции, связанных с управлением лампами (состояние, эффекты, подключение и т.д.)
10.  DiscoverManager		функции обнаружения ламп в локальной WiFi сети
11. PollingManager		функции регулярного опроса ламп по таймеру для получения актуальных настроек
12. StringHelper		разные вспомогательные функции для работы со строками

System				все системные объекты и функции
13. System_DB			хранилище
14. System_WiFi			модуль работы с WiFi



Свойства и методы "классов"

ScreenManager
	CurrentScreenId						свойство: "Текущий отображаемый 'экран'"
	ShowScreen							метод: принимает номер "экрана", устанавливает свойство видимости в true для этого экрана и в false для остальных экранов; вызывает перерисовку "экранов"
	RebuildAllScreens					метод: перерисовывает "экраны", делает их блоки видимыми или видимыми в зависимости от выставленных свойств видимости
	CloseApplication					метод: закрывает приложение
	Color_DarkGrey						свойство (константа): код цвета "тёмно-серый"
	Color_LightGrey						свойство (константа): код цвета "светло-серый"
	Color_LightLightGrey				свойство (константа): код цвета "светло-светло-серый"
	Color_LightGreyBackground			свойство (константа): код цвета "светло-серый" для фона
	Color_Red							свойство (константа): код цвета "красный"

MainScreen
	Visible								свойство: "Видимость главного экрана"
	BlockControlEventsEmitting			свойство: "Не генерировать события от элементов управления" (слайдеров, кнопок и т.д.); нужно, например, чтобы предотвратить slider.setPosition при его enable/disable
	HideSyncIcon						свойство: "Скрыть/показать иконку обновления статуса"
	Initialize							метод (событие): действия при инициализации "экрана" (однократно)
	BackPressed							метод (событие): действия при нажатии системной кнопки "Назад" на главном "экране"
	ConnectivityButtonClick				метод (событие): действия при нажатии кнопки перехода на "экран" устройств
	ModesButtonClick					метод (событие): действия при нажатии кнопки перехода на "экран" эффектов
	FavoritesButtonClick				метод (событие): действия при нажатии кнопки перехода на "экран" избранных эффектов
	AlarmButtonClick					метод (событие): действия при нажатии кнопки перехода на "экран" будильника
	TimerButtonClick					метод (событие): действия при нажатии кнопки перехода на "экран" таймера
	OnOffButtonClick					метод (событие): действия при нажатии кнопки Вкл/Выкл
	BrightnessSliderPositionChanged		метод (событие): действия при изменении слайдера яркости
	SpeedSliderPositionChanged			метод (событие): действия при изменении слайдера скокрости
	ScaleSliderPositionChanged			метод (событие): действия при изменении слайдера масштаба
	BrightnessListPickerAfterPicking	метод (событие): действия при выборе точного значения яркости из контекстного списка
	SpeedListPickerAfterPicking			метод (событие): действия при выборе точного значения скорости из контекстного списка
	ScaleListPickerAfterPicking			метод (событие): действия при выборе точного значения масштаба из контекстного списка
	UpdateControls						метод: обновить отображение элементов управления (статусы enabled/disabled) в зависимости от сохранённых свойств (модели данных)
	PopulateListPickerElements			метод: заполнить контекстный список яркости/скорости/масштаба эффектов значениями, близкими к текущей позиции соответствующего слайдера
	SetDebugText						метод: установить отладочный текст основной отладочной текстовой метке

ConnectivityScreen
	Visible								свойство: "Видимость экрана устройств"
	HideSyncIcon						свойство: "Скрыть/показать иконку обновления статуса"
	IpAddressInputLostFocus				метод (событие): действия при потери фокуса поля ввода IP адреса
	PortInputLostFocus					метод (событие): действия при потери фокуса поля ввода порта
	SaveConnectionButtonClick			метод (событие): действия при нажатии на кнопку "Добавить"
	RemoveConnectionButtonClick			метод (событие): действия при нажатии на кнопку "Удалить"
	SaveAllConnectionButtonClick		метод (событие): действия при нажатии на кнопку "Сканировать и добавить"
	DeviceSocketListViewAfterPicking	метод (событие): действия при выборе устройства из списка сохранённых и его подключение
	BaсkButtonClick						метод (событие): действия при нажатии кнопки "Назад" на "экране" устройств
	SettingsButtonClick					метод: отобразить экран настроек
	UpdateConnectivityStatus			метод: обновить статус устройства "Подключен"/"Отключен" на "экране" устройств
	UpdateCurrentDeviceSocket			метод: отобразить текущее устройство (DeviceManager.CurrentDeviceSocket) в полях ввода IP адреса и порта на "экране" устройств
	UpdateCurrentDevicesSockets			метод: отобразить текущий список сохранённых устройств (DeviceManager.Devices) на "экране" устройств
	ValidateAndAddDeviceSocketToList	метод: валидировать значения полей ввода IP адреса и порта и добавть запись в список сохранённых устройств; перерисовать этот список
	UpdateScreen						метод: обновить все элементы управления на "экране" устройств согласно модели данных

ModesScreen
	Visible								свойство: "Видимость экрана эффектов"
	ModesListViewAfterPicking			метод (событие): действия при выборе эффекта из списка эффектов
	BaсkButtonClick						метод (событие): действия при нажатии кнопки "Назад" на "экране" эффектов

FavoritesScreen
	Visible								свойство: "Видимость экрана устройств"
	Initialized							свойство: "Экран автоматического переключения избранных эффектов инициализирован"
	BlockControlEventsEmitting			свойство: "Не генерировать события от элементов управления" (переключателей, лист пикеров и т.д.)
	BaсkButtonClick						метод (событие): действия при нажатии кнопки "Назад" на "экране" избранных эффектов
	OnOffSwitchChanged					метод (событие): действия при установке/снятии переключателя включения режима избранных эффектов
	IntervalListPickerAfterPicking		метод (событие): действия при выборе интервала времени (статической состявляющей) между автоматическими переключениями избранных эффектов
	DispersionListPickerAfterPicking	метод (событие): действия при выборе разброса времени (случайной состявляющей) между автоматическими переключениями избранных эффектов
	UseSavedOnOffSwitchChanged			метод (событие): действия при сохранении/удалении сохранённого состояния переключателя включения режима избранных эффектов
	ListViewIconClick					метод (событие): действия при добавлении/удалении эффекта в/из список избранных
	ListViewelementTouchUp				метод (событие): служебный метод, необходимый для корректной отрисовки фона элемента в списке избранных эффектов
	Initialize							метод: настраивает и заполняющий специфический (кастомный) компонент ListViewer
	MarkListItemAsFavorite				метод: устанавливает признак включения/исключения эффекта в избранные в свойстве "состояние режима избранных эффектов"
	UpdateScreen						метод: обновить все элементы управления на "экране" избранных эффектов согласно модели данных
	UpdateControls						метод: обновить отображение элементов управления (статусы enabled/disabled) в зависимости от сохранённых свойств (модели данных)
	SetFavoriteSettings					метод: меняет состояние "экрана" избранных эффектов (устанавливает недоступность элементов управления и отображает анимацию) и вызывает DeviceManager.SetFavoriteSettings
	SetIntervalListPicker				метод: иниицализирует значение поля выбора интервала времени автоматической смены избранных эффектов согласно модели данных
	SetDispersionListPicker				метод: иниицализирует значение поля выбора разброса времени автоматической смены избранных эффектов согласно модели данных

AlarmScreen
	Visible								свойство: "Видимость экрана устройств"
	Initialized							свойство: "Экран управления будильниками инициализирован"
	BlockControlEventsEmitting			свойство: "Не генерировать события от элементов управления" (переключателей, тайм пикеров и т.д.); нужно, например, чтобы предотвратить switch.changed при его enable/disable
	BaсkButtonClick						метод (событие): действия при нажатии кнопки "Назад" на "экране" будильника
	MonSwitchChanged					метод (событие): действия при установке/снятии переключателя включения будильника
	TueSwitchChanged					метод (событие): действия при установке/снятии переключателя включения будильника
	WedSwitchChanged					метод (событие): действия при установке/снятии переключателя включения будильника
	ThuSwitchChanged					метод (событие): действия при установке/снятии переключателя включения будильника
	FriSwitchChanged					метод (событие): действия при установке/снятии переключателя включения будильника
	SatSwitchChanged					метод (событие): действия при установке/снятии переключателя включения будильника
	SunSwitchChanged					метод (событие): действия при установке/снятии переключателя включения будильника
	MonTimePickerAfterTimeSet			метод (событие): действия при выборе времени будильника
	TueTimePickerAfterTimeSet			метод (событие): действия при выборе времени будильника
	FriTimePickerAfterTimeSet			метод (событие): действия при выборе времени будильника
	WedTimePickerAfterTimeSet			метод (событие): действия при выборе времени будильника
	ThuTimePickerAfterTimeSet			метод (событие): действия при выборе времени будильника
	SatTimePickerAfterTimeSet			метод (событие): действия при выборе времени будильника
	SunTimePickerAfterTimeSet			метод (событие): действия при выборе времени будильника
	TimeBeforeAlarmListPickerAfterPicking	метод (событие): действия при выборе времени срабатывания будильника перед "рассветом"
	UpdateScreen						метод: обновить все элементы управления на "экране" управления будильниками согласно модели данных
	UpdateControls						метод: обновить отображение элементов управления (статусы enabled/disabled) в зависимости от сохранённых свойств (модели данных)

TimerScreen
	Visible								свойство: "Видимость экрана устройств"
	Initialized							свойство: "Экран управления таймером инициализирован"
	BlockControlEventsEmitting			свойство: "Не генерировать события от элементов управления" (лист пикера); нужно, например, чтобы предотвратить listpicker.afterpicking при его enable/disable
	AnimationTimerOn					свойство: "таймер, управляющий анимацией функции таймера лампы, включен"
	RemainingSeconds					свойство: "время до срабатывания таймера лампы" и одновремнно "время до окончания работы таймера, управляющего анимацией функции таймера лампы"
	TimerTickMs							свойство: "шаг таймера, управляющего анимацией функции таймера лампы"
	BaсkButtonClick						метод (событие): действия при нажатии кнопки "Назад" на "экране" таймера
	TimeListPickerAfterPicking			метод (событие): действия при выборе пользователем времени до срабатывания таймера лампы (отправка команды модулю)
	UpdateControls						метод: обновить отображение элементов управления (статусы enabled/disabled) в зависимости от сохранённых свойств (модели данных)
	UpdateScreen						метод: обновить все элементы управления на "экране" управления таймером согласно модели данных
	GetRemainingLabelText				метод: получить текст для вывода на метке оставшегося до срабатывания таймера времени
	GetTimerSecondsToFire				метод: получить количество секунд до срабатывания таймера из полученного в качестве аргумента значения TimeListPicker (выбранной пользователем опции)
	HandleAnimation						метод: обработать таймер, управляющий анимацией функции таймера лампы (запуск, если не запущен, принудительная остановка, если нужно)
	AnimationTimerTimerNow				метод: действия при срабатывании события таймера, управляющий анимацией функции таймера лампы (показать/скрыть иконку, обновить текст оставшегося времени)
	StopAnimationTimer					метод: остановить таймер, управляющий анимацией функции таймера лампы, сбросить его сохранённое состояние в исходное (модель данных)

SettingsScreen
	Visible								свойство: "Видимость экрана настроек"
	Initialized							свойство: "Экран настроек инициализирован"
	BlockControlEventsEmitting			свойство: "Не генерировать события от элементов управления" (переключателя); нужно, например, чтобы предотвратить switch.changed при его enable/disable
	BaсkButtonClick						метод (событие): действия при нажатии кнопки "Назад" на "экране" настроек
	OtaButtonClick						метод (событие): действия при нажатии кнопки "Режим обновления" на "экране" настроек
	ButtonEnabledSwitchChanged			метод (событие): действия при установке/снятии переключателя разблокировки аппаратной кнопки на лампе
	UpdateScreen						метод: обновить все элементы управления на "экране" настроек согласно модели данных
	UpdateControls						метод: обновить отображение элементов управления (статусы enabled/disabled) в зависимости от сохранённых свойств (модели данных)

DeviceManager
	Connected							свойство: подключено ли устройство (лампа) точнее, был ли получен ответ на последнюю высланную ему команду
	State								свойство: полученное командой GET состояние устройства (CURR...), список (не строка)
	Devices								свойство: список устройств (хранимое свойство)
	CurrentDeviceSocket					свойство: текущее устройство (хранимое свойство)
	FavoritesState						свойство: текущее состояние избранных эффектов (вкл/выкл, интервал, разброс, список эффектов)
	AlarmState							свойство: текущее состояние будильников по дням (вкл/выкл, время каждого, время срабатывания перед "рассветом")
	TimerState							свойство: текущее состояние таймера (ответ команды TMR_GET)
	Modes								свойство: список доступных режимов, захардкожен одновременно в лампе и в приложении, должен совпадать
	Initialize							метод: вычитывание хранимых свойств и инициализация соответствующих переменных
	ConnectDeviceSocket					метод: стартовать таймер (polling timer) с регулярной отправкой команд GET/DEB на устройство
	DisconnectDeviceSocket				метод: остановить таймер (polling timer) с регулярной отправкой команд GET/DEB на устройство; очистить свойства Connected и State
	GetCurrentModeId					метод: получить номер текущего эффекта (из свойства State)
	GetCurrentModeName					метод: получить имя текущего эффекта (из свойства State)
	GetCurrentBrightness				метод: получить значение текущей яркости (из свойства State)
	GetCurrentSpeed						метод: получить значение текущей скорости (из свойства State)
	GetCurrentScale						метод: получить значение текущего масштаба (из свойства State)
	GetCurrentOn						метод: получить значение текущего состояния Вкл/Выкл (из свойства State)
	GetCurrentEspMode					метод: получить значение текущего состояния ESP_MODE (из свойства State)
	GetCurrentUseNtp					метод: получить значение текущего состояния USE_NTP 9из свойства State)
	GetTimerOnOffFromState				метод: получить значение текущего состояния таймера (из свойства State)
	GetButtonEnabled					метод: получить значение текущего состояния (заблокирована/разблокирована) аппаратной кнопки на лампе
	GetCurrentTime						метод: получить значение текущего времени на устройстве (из свойства State)
	SaveDeviceSocketSettings			метод: сохранить с базу данных приложения хранимые значения (текущее стройство и список устройств)
	SetDeviceOffline					метод: установить свойства Connected и State в начальное состояние (очистить), соответствует состоянию "устройство не подключено"
	ResetCurrentDevice					метод: установить свойство CurrentDeviceSocket в начальное состояние (очистить), соответствует состоянию "устройство не выбрано"
	ResetCurrentDevices					метод: установить свойство Devices в начальное состояние (очистить), соответствует состоянию "профили устройств не заданы"
	ValidateIpPort						метод: валидировать переданное в качестве параметра значение IP адреса или порта
	SendUdpCommand						метод: отправить команду, приянтую в качестве входного аргумента, на подключенное устройствоС (обобщённый метод)
	HandleDeviceResponse				метод: обработать ответ от подключенного устройства на отправленные команды
	ResetAlarmState						метод: "забыть" состояние будильников в android приложении (перед последующим запросом этого состояния)
	GetAlarmsSettings					метод: отправить команду запроса состояния будильников ALM_GET на устройство
	GetAlarmOnOff						метод: получить состояние вкл/выкл будильника для указанного во входном аргументе дня (из свойства AlarmState)
	GetAlarmTime						метод: получить время срабатывания будильника для указанного во входном аргументе дня (из свойства AlarmState)
	GetTimeBeforeAlarmIndex				метод: получить время срабатывания будильника перед "рассветом"
	SetAlarmOnOff						метод: отправить команду вкл/выкл будильника для заданного дня ALM_SET на устройство
	SetAlarmTime						метод: отправить команду установки времени срабатывания будильника для заданного дня ALM_SET на устройство
	SetTimeBeforeAlarm					метод: отправить команду установки времени срабатывания будильника перед "рассветом" DAWN на устройство
	ResetTimerState						метод: "забыть" состояние таймера в android приложении (перед последующим запросом этого состояния)
	GetTimerSettings					метод: отправить команду запроса состояния таймера TMR_GET на устройство
	GetTimerOnOff						метод: получить значение текущего состояния таймера (из свойства TimerState)
	GetTimerTimeOption					метод: получить выбранное пользователем значение предуст ановки времени таймера (из свойства TimerState)
	GetTimerRemainingSeconds			метод: получить оставшееся до срабатывания таймера время (из свойства TimerState)
	SetTimerSettings					метод: отправить команду установки таймера TMR_SET
	GetFavoriteSettings					метод: отправить команду запроса состояния избранных эффектов FAV_GET на устройство
	SetFavoriteSettings					метод: отправить команду установки состояния избранных эффектов FAV_SET
	GeFavoritesModeOnOff				метод: получить состояние (включен/исключён в избранные) для заданного эффекта (из свойства FavoritesState)
	SeFavoritesModeOnOff				метод: установить состояние (включен/исключён в избранные) для заданного эффекта (из свойства FavoritesState)
	GeFavoritesOnOff					метод: получить состояние вкл/выкл режима избранных эффектов (из свойства FavoritesState)
	GeFavoritesInterval					метод: получить интервал времени смены избранных эффектов (из свойства FavoritesState)
	GeFavoritesDispersion				метод: получить разброс времени смены избранных эффектов (из свойства FavoritesState)
	GetFavoritesUseSavedOnOff			метод: получить сохранённое состояние переключателя включения режима избранных эффектов
	GeFavoritesModesList				метод: получить список эффектов с указанным состояние (включен/исключён в избранные) для каждого из них
	RequestOtaUpdate					метод: перевести лампу в состояние ожидания прошивки по воздуху
	SendEnableHardwareButtonCommand		метод: установить состояние (заблокирована/разблокирована) аппаратной кнопки на лампе

DiscoverManager
	TimeoutMs							свойство: время ожидания ответа от устройств на multicast команду DISCOVER
	SendMulticastCommand				метод: стартовать UDP сервер (для отправки multicast команды DISCOVER на адрес широковещательных сообщений сети и получения ответа)
	UdpServerStarted					метод (событие): отправить multicast команду DISCOVER на адрес широковещательных сообщений сети; стартовать таймер завершения работы сервера
	UdpServerDataRecieved				метод (событие): получить и обработать ответы от устройств на multicast команду DISCOVER
	TimerTimerNow						метод (событие): завершить работу UDP сервера и таймера (при первом срабатывании события таймера)
	GetBroacdastIP						метод: получить адрес широковещательных сообщений мобильного устройства, используя текущий IP адрес WiFi подключения

PollingManager
	Timeout								свойство: время ожидания ответа от устройств на команды управления
	UdpPort								свойство: номер UDP порта
	TimerIntervalMs						свойство: время работы таймера (ограничение используемого компонента), по его истечении таймер постоянно перезапускается для непрерывной работы
	TimerTickMs							свойство: интервал времени, через который будет сгенерировано событие таймера
	LastResponse						свойство: текст последнего полученного ответа от модуля esp
	LastResponseTime					свойство: время последнего полученного ответа от модуля esp
	TimerTimerNow						метод (событие): действия при срабатывании события polling таймера (отправка команд и перезапуск таймера)
	UdpClientRecieved					метод (событие): действия при получении ответа на отправленные команды от подключенного устройства
	StartPolling						метод: старт polling таймера
	StopPolling							метод: стоп polling таймера
	UpdateDeviceStatus					метод: обновить сворйство DeviceManager.Connected, если не установлена (или пропала) связь с устройством; ввиду специфики реализации библиотечного компонента UDP Client приложение постоянно получает его события Recieved с последней строкой-ответом от модуля esp; отсутствие связи с модулем определяется как повторяющийся ответ (он уникален, потому что содержит время) или устаревший ответ (время последнего ответа больше интервала таймера)
	RequestDeviceState					метод: запросить состояние устройства (определить команду и отправить её в udp пакете)
	SendGetCommandToDevice				метод: отправить команду GET на подключенное устройство
	SendPowerOnOffCommandToDevice		метод: отправить команды On/Off (в зависимости от входного параметра) на подключенное устройство
	SendSetModeCommandToDevice			метод: отправить команду смены эффекта на подключенное устройство
	SendSetBrightnessCommandToDevice	метод: отправить команду установки яркости на подключенное устройство
	SendSetSpeedCommandToDevice			метод: отправить команду установки скорости на подключенное устройство
	SendSetScaleCommandToDevice			метод: отправить команду установки масштаба на подключенное устройство

StringHelper
	GetIpPortString						метод: получить строку формата IP:PORT из входных параметров IP и PORT
	GetIpFromIpPortString				метод: получить IP из входного параметра формата IP:PORT
	GetPortFromIpPortString				метод: получить PORT из входного параметра формата IP:PORT
	GetFormattedTimeFromMinutes			метод: получить строку с временем в формате hh:mm из входного аргумента (количество минут)
	GetMinutesFromFormattedTime			метод: получить количество минут из форматированной строки (hh:mm), переданной в качестве входного аргумента

