59 lines
1.9 KiB
Markdown
59 lines
1.9 KiB
Markdown
# Архитектура
|
||
|
||
## Глобальные структуры
|
||
|
||
Главная глобальная структура:
|
||
|
||
```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`.
|