Yacht Devices Новости: NMEA 2000 Bridge: совместимость старых датчиков с новыми дисплеями
23.12.2021
Новая прошивка собирает быстрые пакеты NMEA 2000 и пересылает их кадры строго по порядку в соответствии с новыми требованиями дисплеев Garmin, B&G, Simrad и Lowrance.
Каждый раз, выпуская новую прошивку Bridge, мы уверены, что лучше уже некуда. Но в 2019 году добавили тригонометрические функции для координат и углов, а также шифрование для распространения защищённых программ и блокировки пользовательского кода при создании собственных устройств на базе Bridge. В конце 2019 года появился и дизассемблер, позволяющий разработчикам подробно изучать программу.
В начале этого года мы добавили настройку пользовательских программ через строки описания установки. Теперь пользователь или установщик может менять конфигурацию без доступа к коду и без навыков программирования.
А теперь мы многое переработали внутри, существенно ускорив Bridge. Рекомендуем обновление всем: внутренние изменения особенно важны при больших нагрузках.
Также добавлены три константы: M_180P, M_1800P и M_P180 — представления float32 чисел 180/π, 1800/π и π/180. Константы M_PI, M_2PI и M_PI2, равные π, 2*π и π/2, были в Bridge всегда.
Bridge использует 32-битные числа с плавающей точкой, чего достаточно для координат с разрешением 10 см. Результат 1800/M_PI, шестнадцатеричное 0x440f3d4c, на 0,0000031 меньше точного 1800/π. А M_1800P, 0x440f3d4d, на 0,0000029 больше. Формально новая константа точнее, но разница невелика относительно отклонения обоих значений от точного. Поэкспериментировать с float32 можно здесь: https://www.h-schmidt.net/FloatConverter/IEEE754.html
Рекомендуем новые константы: код понятнее, вычислений меньше. Bridge не оптимизирует код и каждый раз для 1800/M_PI загружает два числа и выполняет деление.
Ещё одна новинка — настройка STRICT_QUEUE, по умолчанию OFF. Быстрые пакеты NMEA 2000 позволяют передавать до 223 байтов полезных данных стандартными кадрами CAN по 8 байтов. Первый байт кадра содержит номера последовательности и кадра, второй байт первого кадра — длину полезных данных.
Например, быстрый пакет с 23 байтами данных, или 17 в шестнадцатеричной записи:
19FF1404 40 17 89 98 00 01 BC 43 19FF1404 41 00 F8 05 1B 4A 45 50 19FF1404 42 BB 8C 1B 77 00 01 00 19FF1404 43 01 00 FC FF FF FF FF
Номер последовательности занимает три старших бита первого байта и позволяет различать два последовательных быстрых пакета с одинаковым PGN.
Стандарт NMEA 2000 не требует строгого порядка кадров быстрого пакета на шине. Многие микросхемы имеют три аппаратных буфера передачи CAN. Первые три кадра можно загрузить в них и вернуться к другим задачам. Контроллер дождётся свободной шины, передаст первый кадр, сообщит программе об освобождении буфера и одновременно начнёт передачу второго.
Программа загрузит последний кадр в первый буфер. Его приоритет выше, чем у второго и третьего. Поэтому в зависимости от нагрузки шины, обработки прерываний и других факторов кадры могут уйти в порядке 0, 1, 3, 2; 0, 1, 2, 3 или даже 0, 3, 1, 2.
Последние дисплеи Navico (B&G, Simrad, Lowrance) и Garmin требуют строгого порядка кадров быстрого пакета. Мы считаем это неправильным. Для датчиков с недорогими микросхемами это может снизить производительность: ради порядка придётся использовать один буфер и загружать кадры по одному.
Более того, старые сертифицированные датчики NMEA 2000 могут оказаться несовместимы с новыми дисплеями. Например, Simrad GO7 XSR с прошивкой 18.3 не показывает данные двигателя, если порядок кадров нарушен.
Строгий порядок можно включить на одном интерфейсе Bridge через STRICT_QUEUE=CAN1 или STRICT_QUEUE=CAN2, либо на обоих через STRICT_QUEUE=ON. Это немного влияет на производительность.
Новая настройка позволяет обеспечить совместимость существующих устройств NMEA 2000 с новыми прошивками Navico. По умолчанию Bridge сразу пересылает полученный кадр на другой интерфейс, поэтому STRICT_QUEUE=ON влияет только на сообщения самого Bridge или пользовательской программы. Чтобы сначала собрать быстрый пакет, например PGN 126996 или 126998, и затем передать кадры строго по порядку в CAN1, задайте:
PGNS_TO_ASSEMBLY=126996, 126998
FW_CAN1_TO_CAN2=ON
FW_CAN2_TO_CAN1=ON
STRICT_QUEUE=CAN1
Надеемся, Navico и Garmin отменят требование строгого порядка в будущих обновлениях.
Новая прошивка 1.40 для NMEA 2000 Bridge доступна на странице загрузок .
