# Архитектура ## Глобальные структуры Главная глобальная структура: ```c extern AppContext_t g_app; ``` Она содержит: - `role` - текущая роль `APP_ROLE_MASTER` или `APP_ROLE_SLAVE`. - `zigbee_state` - состояние Zigbee подключения. - `slave_inputs.buttons[3]` - три кнопки. - `slave_inputs.analog` - один аналоговый канал. - `zigbee` - PAN ID, канал, endpoint и cluster id. - `uptime_ms`, `last_report_ms` - таймеры приложения. ## Payload slave Slave должен отправлять структуру `AppSlaveInputs_t`: ```c typedef struct { AppButton_t buttons[3]; AppAnalogChannel_t analog; uint32_t sequence; } AppSlaveInputs_t; ``` Для стабильного Zigbee протокола проект формирует `AppSlaveReport_t` через `App_MakeSlaveReport()`. В Zigbee лучше передавать поля в фиксированном порядке, а не сырую C-структуру целиком: - `sequence`, 4 байта - `buttons`, битовая маска 3 младших бит - `analog_raw`, 2 байта - `analog_percent`, 1 байт ## Режим master Master: 1. Создает или открывает Zigbee сеть. 2. Регистрирует endpoint `APP_ZIGBEE_ENDPOINT`. 3. Принимает отчеты cluster `APP_ZIGBEE_CLUSTER_INPUTS`. 4. Передает распакованный отчет в `ZigbeePort_OnSlaveReportReceived()`. 5. Обновляет `g_app.master_node`. ## Режим slave Slave: 1. Присоединяется к сети master. 2. Опрос кнопок проходит с debounce `APP_BUTTON_DEBOUNCE_MS`. 3. ADC фильтруется IIR фильтром 1/8. 4. Отчет отправляется каждые `APP_ZIGBEE_REPORT_PERIOD_MS`.