работает слейв и мастер
This commit is contained in:
58
docs/ARCHITECTURE.md
Normal file
58
docs/ARCHITECTURE.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Архитектура
|
||||
|
||||
## Глобальные структуры
|
||||
|
||||
Главная глобальная структура:
|
||||
|
||||
```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`.
|
||||
Reference in New Issue
Block a user