# Архитектура

## Глобальные структуры

Главная глобальная структура:

```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`.
