Добавить heartbeat и передачу CAN по изменению и таймеру

Для всех Mode передавать пакеты при обновлении данных и повторять каждый через 1300 мс от последнего CAN ACK. Отдельно отправлять heartbeat раз в секунду. Сохранить маски рассылки, отключение потоков нулевым периодом и неблокирующее восстановление после ошибок TX.

Проверены границы периодов, все Mode, занятый mailbox, отмена без CANAA, отсутствие ACK, переполнение Timer1, первый снимок и справедливость потоков. Изменённые модули ecan.c и main.c скомпилированы компилятором TI C2000.
This commit is contained in:
2026-10-16 23:17:00 +03:00
parent 345c81166e
commit 13f1a2c5fd
7 changed files with 351 additions and 120 deletions
+22
View File
@@ -73,3 +73,25 @@ SetGUI проверено программно; обмен новой проши
Конфигурация **Release** перенесена из 167 без изменений и не проверялась;
для сборки прошивки используйте **Debug**.
## Телеметрия CAN: heartbeat, изменения и повтор 1,3 с
Для всех Mode технологические пакеты выбранных масками регистров R0–R127
передаются при первом снимке, изменении любого из трёх слов или через 1300 мс
после последнего успешного CAN ACK этого пакета. Неудачная попытка не обновляет
подтверждённый снимок. Конечные пакеты карты дополняются нулями за R127.
Сканирование изменений идёт по Timer1 с шагом 20 мс; готовая очередь выдаётся
по мере освобождения mailbox, без ожидания нового периода между её кадрами.
Фактическую отправку могут задержать занятая шина, ошибки и работа main.
Heartbeat отправляется независимо раз в секунду: адрес `0x0100`, затем три
16-битных слова — счётчик секунд, Mode, Desk. После задержки main отправляется
последнее значение, без очереди пропущенных секундных кадров.
Ноль в `Cancount[0]` или `Cancount[1]` по-прежнему отключает данные соответствующей
маски. Любое ненулевое значение включает новый режим изменения/1300 мс;
прежний числовой делитель периода больше не используется. Heartbeat остаётся
включённым при отключённых потоках данных. Параметры EEPROM не переносятся.
После ошибки TX новая попытка разрешается через секунду без ожидания в цикле.
Проверка без CAN-адаптера: `python tests/can_telemetry/run_test.py`.