Files
templates/doc/setcan/ALTERA_LOGIC_STREAM.md

14 KiB
Raw Blame History

Altera Logic — ONLINE через SETCAN / GAS / UART

Версия профиля: 1. Реализация, порты и тесты принадлежат templates. Это профиль существующего classic SETCAN/ProtoCAN с 29-битным ID; он не подменяется кадром SETP v2 и не использует старые команды A5 CMD FPGA.

Адрес и носители

Поле Значение
Priority 1, стандартный
Route 1, от устройства
DeviceType 0x6
DeviceID 0xE
Device Name Altera Logic
MsgType 0x3, GAS
CAN Extended ID, data frame, DLC=8

CAN доставляет ID + 8 байт непосредственно. UART доставляет ровно тот же ID и те же данные в существующем контейнере pcan_frame:

AA 55 | LEN | SEQ | FLAGS | CAN_ID u32 LE | DATA | CRC16 u16 LE

Для этого профиля LEN=14, FLAGS=1 (IDE), DIR/RTR/ERR сброшены, итоговая длина 19 байтов. CRC-16/CCITT-FALSE считается существующим кодеком по LEN…DATA. SEQ — транспортный 8-битный счётчик; порядок выборок определяется полем SampleIndex, поэтому независимые CAN/UART потоки дают одинаковый результат. Предоставленные простые C-билдеры устанавливают SEQ=0; устройство может вести его самостоятельно, используя pcan_frame_encode. Настройки прямого UART-порта GUI: 921600, 8N1, без flow control.

GAS: метаданные потока

CAN ID 0x1EE3FE00, MsgBody/GAS address 0xFE00, DLC=8.

Регистры GAS Байты DATA Поле
FE00 0…1 Tag/version = 0x4C01
FE01 2…3 SessionID u16
FE02…FE03 4…7 SamplePeriodNs u32, строго больше 0

Порядок байтов little-endian. Число каналов профиля фиксировано: 16. Частота выборок = 1e9 / SamplePeriodNs.

Пример сессии 1 с частотой 1000 выборок/с:

ID:   1EE3FE00
DATA: 01 4C 01 00 40 42 0F 00

Источник отправляет метаданные перед первой выборкой и повторяет примерно раз в секунду, чтобы подключившийся GUI мог присоединиться к потоку. Повтор с теми же SessionID/периодом историю не очищает.

При перезапуске потока или изменении периода источник увеличивает SessionID по модулю 65536. Новый SessionID очищает историю; задержанные метаданные предыдущей сессии игнорируются. Разница менее 32768 считается движением вперёд. Если после аппаратного сброса устройство начало счётчик с меньшего значения, нужно остановить и снова включить приём в GUI (либо сохранять счётчик сессий на устройстве). Без полученных метаданных отсчёты не отображаются.

GAS: одна выборка всех 16 каналов

CAN ID 0x1EE3FF00, MsgBody/GAS address 0xFF00, DLC=8.

Регистры GAS Байты DATA Поле
FF00 0…1 SessionID u16, должен совпадать с метаданными
FF01 2…3 Sample u16: бит n = уровень канала Dn
FF02…FF03 4…7 SampleIndex u32

Пример: сессия 1, выборка 0, D0 и D15 равны 1:

ID:   1EE3FF00
DATA: 01 00 01 80 00 00 00 00

SampleIndex увеличивается на каждой аппаратной выборке, в том числе если пакет не удалось передать. GUI замечает скачок индекса, учитывает потерянные выборки и рисует разрыв, не соединяя его выдуманными состояниями. Время получается из индекса и периода устройства, а не из времени прихода UART.

Переполнение индекса u32 разворачивается в u64 на приёмнике. Однозначное восстановление порядка требует разрыва меньше 2^31 выборок. При более долгом перерыве следует начать новую сессию. При подключении после полного оборота индекса GUI не знает число оборотов до первой принятой выборки.

Одновременный CAN+UART приём объединяет один поток: одинаковые или запоздалые индексы в одной сессии не добавляются повторно. Их число показывается как «дубли/старые». Поздние данные старой сессии игнорируются по SessionID. Если два источника прислали разные значения с одинаковыми SessionID/индексом, остаётся первый принятый пакет: это не механизм голосования или сверки каналов.

Нагрузка и история

Профиль передаёт одну 16-битную выборку на CAN-кадр. Это осознанный обмен пропускной способности на независимую проверку сессии, потерь и дублей. Начальный профиль для устройства — 1000 выборок/с.

На UART при 921600 бод и 19 байтах × 10 бит на пакет теоретический потолок составляет около 4850 выборок/с, без учёта метаданных и пауз. Для непрерывной передачи 50 Мвыб/с этот транспорт не подходит. Высокоскоростной буферный захват остаётся отдельным режимом.

Общая C-история ограничена 8192 последними принятыми выборками. Старые данные вытесняются; полный длительный архив в этом режиме не ведётся. GUI обновляет экран не чаще 20 раз в секунду. Пауза фиксирует показанное окно, но приём продолжается. CSV сохраняет текущее окно с индексами, временем и признаками разрывов.

API для прошивки / порта

Маркеры в ONLINE GUI

Колесо внутри графика прокручивает его по X (влево/вправо), Ctrl + колесо — по Y (вверх/вниз), не меняя масштаб. Когда вся ось помещается в окно, прокрутка этой оси не требуется. После ручной прокрутки X автоматический переход к концу потока отключается до сброса масштаба. Qt-порт этой обработки: python/altera_logic/plot_scroll.py.

Масштабирование внутри графика: зажать ЛКМ и двигать вправо/влево для X; Ctrl + ЛКМ и движение вверх/вниз — для Y. Начальная точка остаётся на месте в видимой области. Масштаб X: 1…16, Y: 1…8. «Сброс масштаба» возвращает обе оси к 1. ЛКМ за линию маркера перемещает маркер; Ctrl отдаёт приоритет масштабу Y. Обычный клик устанавливает выбранный маркер, если он включён. При увеличении Y растягиваются дорожки цифровых каналов, не изменяются измеренные значения. Прокрутка позволяет просматривать увеличенную область.

Две пары X1/X2 и X3/X4 включаются независимо и показывают время каждого маркера, знаковый интервал Δt = X2 X1 (либо X4 X3) и f = 1/|Δt|. При совпадении маркеров частота отображается как «—». Это обратный интервал, а не автоматическое определение частоты сигнала. Две пары Y1/Y2 и Y3/Y4 включаются независимо, показывают оба положения и знаковую ΔY в процентах высоты графика (это не измерение напряжения). Панель измерений построена по примеру AndroidGUI: отдельная строка для каждой пары и ползунок выбранного маркера. dB для цифровых дорожек не вычисляются. Разности вычисляет общий C-код set_plot.c через protocan.plot.PlotMath, тот же код используется Android-портом. Линии можно перетаскивать мышью; список «Установить кликом» выбирает маркер для установки в любой точке. Режим «Курсор» возвращает обычный просмотр выборок. Снятие галочки скрывает линии, сохраняя их позиции. «Маркеры в окно» возвращает их в текущую область. Для измерения неподвижного фрагмента включите паузу. X сохраняет положение во времени при обновлении истории и может уйти за окно; новая сессия устанавливает начальные позиции. Визуальная модель находится в python/altera_logic/markers.py, обработка мыши и рисование — в SETGUI.

c/set-protocol/include/altera_stream.h экспортирует:

  • las_metadata — общий билдер метаданных для CAN либо UART;
  • las_data — общий билдер выборки для CAN либо UART;
  • las_can / las_uart — два входа одного декодера и истории;
  • las_snapshot — хронологический снимок с индексами и разрывами;
  • las_get — диагностика: потери, дубли, неправильные кадры, CRC.

Пример формирования одной выборки для CAN, без HAL-зависимостей:

#include "altera_stream.h"
uint8_t bytes[32];
uint32_t id;
size_t size;
/* SessionID=1, период=1 мс. CAN-драйверу передаются id и size байт. */
size = las_metadata(LAS_DEVICE_ID, 1, 1000000, 0, &id, bytes, sizeof(bytes));
/* board_can_send_extended(id, bytes, size); */
size = las_data(LAS_DEVICE_ID, 1, 0, 0x8001, 0, &id, bytes, sizeof(bytes));
/* board_can_send_extended(id, bytes, size); */
/* Для UART последний флаг носителя заменить с 0 на 1:
   билдер вернёт полный пакет AA55, который передаётся в UART без изменений. */

Драйвер платы должен передавать каждый пакет полностью и сохранять порядок, периодически публиковать метаданные и увеличивать SampleIndex даже при потере пакета в своей очереди. CAN-контроллер и трансивер остаются аппаратным портом.

Размещение реализации и границы

  • templates/c/set-protocol/src/altera_stream.c: протокол и кольцевая история.
  • templates/python/altera_logic/stream.py: тонкий ctypes-порт и CSV-модель.
  • templates/python/altera_logic/stream_port.py: Qt UART/CAN-приём и жизненный цикл.
  • SETGUI: только визуальная вкладка и подключение к существующему CAN-источнику.

Текущий FPGA RTL с протоколом A5 CMD не становится SETCAN-источником от обновления GUI. Нужен передатчик этого профиля в прошивке/RTL либо внешний мост, который получает реальные выборки и публикует их в описанном формате. В этой версии реализованы GUI-приёмник, общие C-билдеры для устройства и демопроизводитель; FPGA RTL и физический CAN-контроллер не изменены.