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();
}