Проект

Общее

Профиль

ECMAScript

В CBA можно применять скрипты, написанные с использованием стандарта ECMA-262 Редакция 5.1.

Реализованы следующие расширения, применяемые во всех скриптах:

Объект console, в котором реализованы методы log, error, info, warn. В качестве параметров можно передавать любой объект. Он будет выведен в отладочной консоли соответствующего цвета: чёрным, красным, голубым и серо-жёлтым соответственно.

Класс Message. В нём реализованы свойства:

  • id - число, идентификатор сообщения
  • idLen - число, длина идентификатора сообщения (8 для LIN / 11 или 29 для CAN)
  • isExtended - булевое, 29 бит идентификатор или 11
  • hash - строка, служебное
  • frame - формат сообщения. can - стандартное CAN сообщение, fd - сообщение CAN-FD, lin - LIN сообщение
  • data - массив, данные для сообщения
  • dlc - число, длина сообщения 1-8 для CAN и LIN, 12/16/20/24/32/48/64 для CAN-FD

Пример использования:

let message = new Message();
message.id = 0x123;
message.dlc = 5;
for (let i = 0; i < 5; i++) message.data[i] = i;

Объект msg, образован от Message. Может использоваться системой.

Массив data (синоним d) ссылается на массив msg.data.

Использование скриптов в CAN Бомбере.

В Бомбере можно использовать отдельно скрипт для расчёта контрольной суммы в сообщении, а так же для манипуляций с входящими и исходящими данными.
Здесь глобальный объект msg используется для обмена данными между формой Бомбера и скриптом.

Расчёт контрольной суммы

Скрипт расчёта контрольной суммы вызывается непосредственно перед отправкой сообщения в шину. Скрипт может содержать несколько функций расчёта контрольной суммы. Для этого перед функциями расчёта контрольных сумм вставляют аннотацию, сигнализирующую, что функция отвечает за расчёт контрольной функции. В результате загрузки такого скрипта в Бомбере в выпадающем списке доступных алгоритмов появятся алгоритмы, описанные в скрипте.

Пример скрипта расчёта SAE J1850:

const TableCRC8_SAE_J1850 = (function InitTableCRC8_SAE_J1850(){
  let table = new Uint8Array( 256 );
  for( let crc, bit, i = 0; i < 256; i++ ){
    for( crc = i, bit = 0; bit < 8; bit++ )
      if ((crc <<= 1) & 0x100) crc ^= 0x1D;
    table[ i ] = crc;
  }
  return table;
})();

@Algorithm('SAE J1850')
function calc(){
  let crc = 0xFF;
  for( let idx = 0; idx < msg.dlc - 1; idx++ )
    crc = TableCRC8_SAE_J1850[ crc ^ msg.data[ idx ] ];
  msg.data[ msg.dlc - 1 ] = crc ^ 0xFF;
}

Скрипт Бомбера

Скрипт Бомбера может содержать две функции: main и onReceive.
Функция main вызывается на каждой итерации Бомбера.
Функция onReceive вызывается каждый раз, когда из шины в приложение прилетает сообщение. Это сообщение передаётся параметром данной функции и имеет тип Message.
Так же в процессе работы можно остановить работу Бомпера вызывом глобального метода bfStop.

Пример скрипта:

function onReceive( rcvMsg ){
  if (rcvMsg.id == 0x7ea && rcvMsg.data[ 0 ] == 4 && rcvMsg.data[ 1 ] == 0x62) {
    console.log( 'A = ', rcvMsg.data[ 2 ].toString( 16 ), ' / B = ', rcvMsg.data[ 3 ].toString( 16 );
  }
}

function main(){
  if ((data[ 4 ]++) == 255) data[ 3 ]++;
  if ((data[ 4 ] | data[ 3 ]) == 0) bfStop();
}