# ProtoCAN: глобальное время и завершение инициализации платы Профиль библиотеки [`c/global-time`](../../../c/global-time/README.md). Время использует штатную команду BROADCAST RTCSETUP. Общий флаг готовности — новое соглашение этого профиля поверх DISCRETE/FLAGS; его нельзя считать уже реализованным всеми историческими приборами ProtoCAN. ## Плата → верхний уровень: готовность После успешной инициализации оборудования и параметров плата отправляет: | Поле | Значение | |---|---| | IDE / RTR | 1 / 0 | | Priority | 1, standard | | Route | 1, от устройства | | DeviceType / DeviceID | собственный адрес платы | | MsgType | 0x1, DISCRETE | | MsgBody | 0x3000: подтип FLAGS=3, страница 0 | | DLC | 1 | | DATA[0] | 0x01: бит 0 означает «инициализация завершена» | Биты DATA[0] 1..7 зарезервированы нулями. Пакет не меняет локальные технологические флаги «Статус инициализации» в ОАП конкретных приборов. В этом профиле Body `0x3000`, DLC1, DATA01 закреплены за общим событием готовности; приборы с другим историческим назначением этой комбинации требуют адаптера. Для PERIPH5 / УМП1, Type1/ID5: ```text CAN ID 0x19513000, DLC 1, DATA 01 ``` Плата посылает готовность хотя бы один раз, даже если успела получить broadcast ещё до завершения собственной инициализации. Пока синхронизация не получена, событие повторяется не чаще одного раза в 1000 мс. Повтор не означает новый reset; мастер может объединять несколько близких запросов в один broadcast. ## Верхний уровень → все платы: дата и время При получении готовности мастер читает свою текущую дату, формирует штатный RTCSETUP и отправляет один кадр всем узлам. Может также периодически передавать RTCSETUP для коррекции дрейфа; библиотека принимает каждый корректный пакет. | Поле | Значение | |---|---| | IDE / RTR | 1 / 0 | | Priority | 0 или 1 | | Route | 0, от ПМ | | DeviceType / DeviceID | 0 / 0, верхний уровень | | MsgType | 0, BROADCAST | | MsgBody | 0x0030: команда RTCSETUP=3, параметр=0 | | DLC | ровно 7 | | DATA | hour, minute, second, year−2000, month, day, weekday | Все поля двоичные, без BCD. Диапазоны: часы 0..23, минуты/секунды 0..59, год 0..99, месяц 1..12, число согласно календарю, день недели 0..6. Профиль использует 0=воскресенье, 1=понедельник; библиотека сохраняет переданную фазу недели и затем продвигает её вместе с календарём. Дата имеет приоритет для абсолютной метки; несоответствие фазы недели календарю не меняет дату. Пример: 2026-10-19 12:34:56, понедельник: ```text CAN ID 0x00000030, DLC 7, DATA 0C 22 38 1A 0A 13 01 ``` Каждая плата независимо проверяет кадр и календарь, рассчитывает смещение от своей временной базы и атомарно корректирует её. Повреждённый или чужой кадр не меняет время и качество предыдущей синхронизации. При отсутствии новых пакетов часы продолжают локальный отсчёт. Тайм-ауты основаны на независимом uptime; перевод календаря назад не удлиняет и не сокращает их. ## Миллисекунды и потребители Нулевой миллисекундной долей опорной даты считается момент RX ISR. Тики, прошедшие до обработки в main, прибавляются к присланному времени. Исходный кадр содержит только целые секунды: локальное разрешение 1 мс не означает погрешность синхронизации между платами 1 мс. Мастер выбирает общую шкалу, например UTC, и момент отправки около секундной границы. Часовой пояс, leap seconds и компенсация арбитража CAN не передаются. Логгер снимает `gt_stamp` с секундами от 2000 года, миллисекундной долей, признаком синхронизации, номером коррекции и независимым uptime. 64-битная календарная метка не помещается в старое 32-битное поле времени логгеров; изменение формата архива выполняет конкретное приложение. ## Верхний уровень: точки подключения `gt_parse_ready()` извлекает Type/ID из сообщения платы. `gt_make_rtc()` проверяет дату и формирует кадр с DLC7; ненулевые миллисекунды на входе отклоняются, чтобы не терять точность молча. Источник календаря, CAN-транспорт и обработчик входящего события предоставляет приложение мастера. Для TMS320F28335 готовый порт занимает eCAN-A mailbox7/8 и по выбору CPU Timer2/INT14 либо hook существующего ISR 1 мс. Подробные порядок вызовов, требования к общему CAN ISR и проверки — в README библиотеки.