Инструкция по созданию модулей

Модуль разбивается на разделы (название в квадратных скобках).
В разделах есть подразделы, на этом вложенность заканчивается.
Подразделы — фактически управляющие команды.

Основу модуля составляют триггеры — команды, реагирующие на некоторые сообщения (или их часть).
Не требуется знать программирование, чтобы писать подобные модули. Далее подробное описание.

Стандартные Разделы

  • главный раздел [main]
  • чтение ошибок [readdtc]
  • информация [getinfo]
  • непрерывные данные [data]
  • стирание ошибок [erasedtc]
  • флешер [readflash], [readeeprom], [writeeeprom]

возможно появятся и другие типы

Нестандартные Разделы

Нестандартный раздел может иметь любое имя, отличное от стандартного.
Обязательным параметром такого раздела является buttonимя кнопки. Оно вписывается в подраздел settings:

[unlock]
[unlock/settings]
button="Unlock Computer"

Дополнительным параметром является

ACTION — действие на кнопку, может быть одним из:

Чтение ошибок = 1
Стирание ошибок = 2
ECU Info = 3
READEEPROM = 4
READFLASH = 5
WRITEEEPROM = 6
CUSTOMACTION = 7 (по умолчанию), DEC

Раздел [main]

параметр name — имя модуля (отображается в окне работы с модулем).

Другие разделы. Подраздел [имяраздела/settings]

Общие параметры данного раздела, действуют только в рамках раздела
CANID — идентификатор CAN, Hex
FIRSTBYTE — DEC, первый байт данных в многострочных ответах, по умолчанию 4
TEXTTYPE — DEC, возвращаемый результат это текст или не текст (применяется для строковых параметров, в основном, в getinfo)
пока есть два типа

  • 0binary, при котором возвращаемое значение будет сконвертировано из HEX в строку
  • 1 — текст (по умолчанию), конвертация не производится, выводятся все печатные символы

ERR — файл с расшифровками ошибок, STR (возможно использовать макрос %LOCALE% для загрузки файлов с расшифровками ошибок на нужном языке, например, ERR=errors_%LOCALE%.txt для русского языка будет errors_ru_RU.txt
DTCSIZE — размер ошибок в ответах блока (2,4), DEC
script — имя файла со скриптом python (должен лежать в директории с конфигом), STR
size — (только для бинарных операций) размер конечного файла в байтах, DEC
mpause — глобальная пауза в миллисекундах на отсылку всех сообщения раздела
skipbytes — количество байт сообщения, которое нужно «пропустить» при разборе длинных сообщений
filter — фильтр CANID сообщений, чтобы отсеивать сообщения, используется синтаксис как в программе, например «*7??,*5??», STR
usetriggers — возможность импортировать триггеры из другого раздела, STR
формат: <имя раздела>,<нач знач индекса>,<кон знач индекса>
например,
usetriggers=readeeprom,1,27
— импорт производится из раздела readeeprom с 1 по 27 включительно.
При импорте, нумерация триггеров производится так, как если бы они были просто скопированы, т.е. сквозным образом
если импортированы триггеры 2-4, то необходимо наличие триггера с номером 1 и далее 5, чтобы обеспечить непрерывность индексирования.

Подраздел [имяраздела/send]

Отправка первых сообщений (инициализация)
messages — список сообщений, STR
сообщения имеют формат CANID;DLC;DATA0 DATA1…, например,

messages=000007F1;8;02 10 60 00 00 00 00 00

если нужно послать несколько сообщений, они разделяются символом \n

timeout — время ожидание ответа на сообщение в секундах, DEC (по умолчанию 2 сек)
фактически определяет время ожидания, прежде, чем будет осуществлён переход к следующему триггеру.

Подраздел [имяраздела/triggerX]

где X — десятичное число
Последовательность триггеров начиная с 1 (до 500 шт).
Последовательность должна быть непрерывной, т.к. разборщик, увидев разрыв нумерации, далее не идёт.
Каждый триггер описывает каким образом программа должна реагировать на определённое CAN сообщение.

Команды

wait — сообщение на которое реагирует триггер (формат сообщений такой же как messages)
сравнивается только часть сообщения указанной длины
например,

[getinfo/trigger1]
wait=000007F9;2;03 7F

если первые два байта сообщения равны 03 7F, триггер будет выполнен.
также может содержать * вместо любого символа (маска), например wait=777;1;1* будет откликаться на все сообщения начинающиеся на 1

messages — список сообщений, формат см. выше. Сообщения, которые необходимо посылать когда срабатывает данный trigger
timeout — время ожидания ответа на сообщение в секундах, DEC (по умолчанию 2 сек)
pause — пауза до отсылки _первого_ сообщения в триггере, DEC, миллисекунды
mpause — пауза до отсылки любого сообщения в триггере в миллисекундах, DEC (если есть параметр pause, то соотв для первого сообщения будет сумма)

command — команда, DEC
В настоящее время команда — это составное число (бинарное сложение)

  • 0 — ничего не делать (по умолчанию)
  • 1 — остановить прием передачу сообщений и выйти
  • 2 — успех
  • 4 — ошибка
  • 8 — вывести текущее сообщение CAN

Т.е. например, если реакция на сообщение должна быть успех и выйти, то пишется 3 (сумма признаков)

progress — прогресс от 1-100, DEC
прогресс в окне ожидания, рекомендуется заполнять для длительных операций
прогрессы триггеров складываются т.е. если у вас четыре триггера с прогрессом, в каждом надо поставить 25

firstbyteDEC, номер байта, с которого начинать вывод текста в сообщении триггера
printSTR, строка которую вывести, когда будет вызван данный триггер
при этом в строке можно использовать макросы:

  • %TRGMSG% — первое сообщение из очереди триггера (если были применены какие-либо функции преобразования — преобразованное);
  • %TRGID%» — идентификатор триггера из списка;
  • %EVMSG% — сообщение на которое откликнулся триггер (полное, без сокращений);
  • %EVMSGLIT% — тоже самое, только не в виде сообщения, а текст из сообщения начиная с firstbyte (доп параметр в триггер);
  • %EVCANID% — идентефикатор интерфейса события;
 
Дополнительные возможности параметризованного вывода предоставляет функция printf.
 
printf — функция вывода в окно вывода, реализованная на языке python. Должна использоваться совместно с параметром script в разделе settings.
Задает название функции в скрипте, производящей вывод, STR.
 
Например,
printf=calcV
 
В скрипте python определяется таким образом:
def calcV(dwCanid, dwDLC, strMsg):
    msg = bytearray.fromhex(strMsg)
    dwVoltage = (msg[5] << 8) + msg[4]
    fVoltage = dwVoltage*4.801/1000
    return «Voltage = {:.2f}».format(fVoltage)

type — тип триггера, DEC

  • 0 — простой (по умолчанию)
  • 1 — постоянный — этот триггер не удаляется
  • 2 — самостоятельный — этому триггер не требуется реакция на сообщение, он просто является аналогом send но в очереди триггеров
  • 3 — чтение binary — читает binary данные из CAN потока, самовозобновляемый, как и 2
  • 4 — запись binary — пишет binary данные в CAN поток, самовозобновляемый, как и 2

start — начало цикла, для создания циклов, HEX
finish — конец цикла, HEX
counter — количество повторений данного триггер, DEC. Приводит к простому дублированию в течение counter раз.

если заданы start и finish, то посылаемые сообщения в команде messages могут содержать ?? этот символ будет заменён на текущий итератор (HEX)
start1, finish1 — если ?? два (для второго)

callbackSTR функция python из скрипта, имя которого указывается в settings.

Обработка триггеров происходит сверху-вниз
По мере вызова триггеры уничтожаются, остаются только триггеры типа «постоянный». Чтобы избежать бесконечных циклов, постоянный триггер не может быть самостоятельным.

если вызвана команда 1 (стоп), то дальнейшая обработка будет остановлена.

для разделов readeeprom, writeeeprom
действуют дополнительные параметры триггеров для записи/чтения в/из бинарного файла
bstart — начальный адрес, HEX
bfinish — конечный адрес, HEX
Эти адреса передаются в виде сообщений посредством callback — обязательный параметр в этом случае, описание см. выше.
Сам binary пишется/читается последовательно, т.е. от написанных команд зависит каким образом будет сформирован конечный файл при чтении, или каким образом
будут переданы команды на запись из файла в ЭБУ.
cont — триггер типа continuous, т.е. имеющий составные индексируемые CAN-фреймы
infostart — указывается для пометки сообщения, после которого блок должен начать возвращать информацию (до этого все сообщения игнорируются), DEC. Этот параметр используется для получения данных о DTC и getinfo, чтобы не перепутать с предварительными техническими сообщениями. По умолчанию, он равен 0, но в случае, если прямо за текущим триггером должны пойти информационные сообщения, то необходимо указать infostart=1, фактически это указывает программе, на сколько сообщений от текущего отступить, перед чтением информационных сообщений.

CALLBACK

CALLBACK — это скрипт python, в которой вы декларируете функции определённого вида

def HyS(strBytes, dwLen, strTemplate)

strBytes — массив байтов из сообщения, в виде строки. Для перевода в байты, преобразовать с помощью встроенных функций:
pMsgBytes = bytearray.fromhex(strBytes)
dwLen — длина сообщения
pTemplate — шаблон сообщения из скрипта (параметр messages), который Вы, в зависимости от своих вычислений меняете, тоже в виде строки

Возвращаемое значение — tuple: длина сообщения, которое требуется послать (по идее оно должно равняться длине сообщения из pTemplate), и сообщение с изменёнными данными, например,

return (8,pTemplate.hex())

для команды callback в блоке типа read/write binary

def GetB(dwAddr, dwLen, strMsg):
dwAddr — адрес из диапазона скрипта от bstart до bfinish
dwLen — длина подготовленного к отправке сообщения
strMsg — шаблон сообщения из скрипта (параметр messages), который меняется, текстовый формат (см. выше)

Возвращаемое значение — tuple: длина в байтах, которое предполагается прочитать или записать, и само сообщение

Внимание! Если callback возвращает 0, то данный триггер немедленно удаляется/закрывается и управление передается на следующий trigger.

Индексированные [getinfo], [data]

если вы хотите вернуть несколько значений в [getinfo] или [data] например номер блока, вин автомобиля и т.п. информацию, то нужно создать несколько разделов для каждого из значений: [getinfo], [getinfo1], [getinfo2]…
Они будут выполняться последовательно при нажатии кнопки Get Info.

Если при отладке модуля он ушел в бесконечный цикл, то можно нажать Ctrl+C — выполнения модуля прервется.