1039 lines
43 KiB
Python
1039 lines
43 KiB
Python
# Copyright 2024 Volvo Car Corporation
|
|
# Licensed under Apache 2.0.
|
|
|
|
"""Unit tests for merge_a2l.py."""
|
|
|
|
import unittest
|
|
from unittest.mock import mock_open, patch, MagicMock
|
|
from pathlib import Path
|
|
from powertrain_build.a2l_merge import A2lMerge
|
|
from .a2l_merge_data import A2L_MERGED_1, A2L_MERGED_2
|
|
|
|
# Fake unit config files
|
|
UCFG = {
|
|
'VcAesSupM': {
|
|
'inports': {},
|
|
'outports': {},
|
|
"local_vars": {
|
|
"rVcAesSupM_p_SupMonrSCTarDly": {
|
|
"type": "Float32",
|
|
"unit": "kPa",
|
|
"description": "Low pass filtered supercharger target pressure",
|
|
"max": "300",
|
|
"min": "0",
|
|
"lsb": "1",
|
|
"offset": "0",
|
|
"class": "CVC_DISP",
|
|
"handle": "VcAesSupM__gen3/VcAesSupM/Subsystem/VcAesSupM/VcAesSupM/"
|
|
"1_SupMonr/11_SupChrgrSys/111_SignalCalc/FirstOrderFilter/Sum2",
|
|
"configs": [
|
|
"Vc_Aes_SupM_B_CodeGenSprChrg"],
|
|
"width": "1"
|
|
}
|
|
},
|
|
"calib_consts": {
|
|
"cVcAesSupM_B_SupMonrHiCluOnSw": {
|
|
"type": "Bool",
|
|
"unit": "",
|
|
"description": "Switch to bypass SC clutch on flag supercharger high boost",
|
|
"max": " ",
|
|
"min": " ",
|
|
"lsb": "1",
|
|
"offset": "0",
|
|
"class": "CVC_CAL",
|
|
"handle": "VcAesSupM__gen3/VcAesSupM/Subsystem/VcAesSupM/VcAesSupM/"
|
|
"1_SupMonr/11_SupChrgrSys/112_EnaCond/B_SupMonrHiCluOnSw",
|
|
"configs": [
|
|
"Vc_Aes_SupM_B_CodeGenSprChrg"],
|
|
"width": "1"
|
|
},
|
|
"cVcAesSupM_B_dcl_mimic": {
|
|
"type": "Bool",
|
|
"unit": "",
|
|
"description": "Mimics hand coded a2l files",
|
|
"max": " ",
|
|
"min": " ",
|
|
"lsb": "1",
|
|
"offset": "0",
|
|
"class": "CVC_CAL",
|
|
"handle": "VcAesSupM__gen3/VcAesSupM/Subsystem/VcAesSupM/VcAesSupM/"
|
|
"1_SupMonr/11_SupChrgrSys/112_EnaCond/B_SupMonrHiCluOnSw",
|
|
"configs": [
|
|
"Vc_Aes_SupM_B_CodeGenSprChrg"],
|
|
"width": "1"
|
|
}
|
|
}
|
|
},
|
|
}
|
|
SRC_DIR = Path(__file__).parent
|
|
|
|
|
|
def chk_if_in_unit(_, label):
|
|
"""Return true if label is included in the unit."""
|
|
if label in ['rVcAesSupM_p_SupMonrSCTarDly', 'cVcAesSupM_B_SupMonrHiCluOnSw']:
|
|
return True
|
|
return False
|
|
|
|
|
|
class TestA2lMerge(unittest.TestCase):
|
|
"""Test case for testing the A2lMerge class."""
|
|
|
|
def setUp(self):
|
|
"""Set-up common data structures for all tests in the test case."""
|
|
self.prj_cfg = MagicMock()
|
|
self.prj_cfg.get_unit_cfg_deliv_dir.return_value = 'mocked'
|
|
self.prj_cfg.get_prj_config.return_value = 'GEP3_SPA' # Just a dummy project
|
|
self.ucfg = MagicMock()
|
|
self.ucfg.check_if_in_unit_cfg.side_effect = chk_if_in_unit
|
|
self.ucfg.get_per_unit_cfg.return_value = UCFG
|
|
|
|
def test_init(self):
|
|
"""Test parsing of a2l-files."""
|
|
a2l = A2lMerge(self.prj_cfg, self.ucfg,
|
|
[str(Path(SRC_DIR, 'cnfg_files', 'VcAesSupM.a2l'))],
|
|
[str(Path(SRC_DIR, 'cnfg_files', 'test.a2l'))])
|
|
result = a2l._blks
|
|
expected = A2L_MERGED_1
|
|
self.assertDictEqual(result, expected)
|
|
|
|
def test_init_no_unit(self):
|
|
"""Test parsing of a2l-files not matching any unit-name."""
|
|
a2l = A2lMerge(self.prj_cfg, self.ucfg,
|
|
[str(Path(SRC_DIR, 'cnfg_files', 'test_mrg__kalle.a2l'))],
|
|
[str(Path(SRC_DIR, 'cnfg_files', 'test.a2l'))])
|
|
result = a2l._blks
|
|
expected = A2L_MERGED_2
|
|
self.assertEqual(result, expected)
|
|
|
|
def test_init_no_file(self):
|
|
"""Test using A2lMerge with invalid filename."""
|
|
self.assertRaises(FileNotFoundError, A2lMerge, self.prj_cfg, self.ucfg,
|
|
[str(Path(SRC_DIR, 'cnfg_files', 'missing_file.a2l'))],
|
|
[str(Path(SRC_DIR, 'cnfg_files', 'test.a2l'))])
|
|
|
|
def test_multiple_definitions(self):
|
|
"""Example from VEP4_GEN3_LP_7DCT-61"""
|
|
ucfg = {
|
|
'test_consumer': {
|
|
'inports': {
|
|
"sVcDtcAtr_D_TrgGear": {
|
|
"handle": "VcVexhTar/VcVexhTar/Subsystem/VcVexhTar/input_3",
|
|
"name": "sVcDtcAtr_D_TrgGear",
|
|
"configs": "((ALWAYS_ACTIVE))",
|
|
"description": "Target gear ",
|
|
"type": "Int8",
|
|
"unit": "-",
|
|
"offset": -1,
|
|
"lsb": 1,
|
|
"min": 0,
|
|
"max": 8,
|
|
"class": "CVC_EXT",
|
|
"width": 1
|
|
},
|
|
},
|
|
'outports': {},
|
|
"local_vars": {},
|
|
"calib_consts": {}
|
|
},
|
|
'test_producer': {
|
|
'outports': {
|
|
"sVcDtcAtr_D_TrgGear": {
|
|
"handle": "VcDtcAtr/VcDtcAtr/Subsystem/VcDtcAtr/sVcDtcAtr_D_TrgGear",
|
|
"name": "sVcDtcAtr_D_TrgGear",
|
|
"configs": "((ALWAYS_ACTIVE))",
|
|
"description": "Target gear",
|
|
"type": "Int8",
|
|
"unit": "-",
|
|
"offset": 0,
|
|
"lsb": 1,
|
|
"min": -1,
|
|
"max": 8,
|
|
"class": "CVC_DISP",
|
|
"width": 1
|
|
},
|
|
},
|
|
'inports': {},
|
|
"local_vars": {},
|
|
"calib_consts": {}
|
|
},
|
|
}
|
|
self.ucfg.get_per_unit_cfg.return_value = ucfg
|
|
|
|
a2l = A2lMerge(
|
|
self.prj_cfg, self.ucfg,
|
|
[
|
|
str(Path(SRC_DIR, 'cnfg_files', 'test_producer.a2l')),
|
|
str(Path(SRC_DIR, 'cnfg_files', 'test_consumer.a2l')),
|
|
],
|
|
[]
|
|
)
|
|
result = a2l._blks
|
|
expected = {
|
|
'COMPU_METHOD': {'Scaling_1': ' /begin COMPU_METHOD\n'
|
|
' Scaling_1 /* Name */\n'
|
|
' "" /* LongIdentifier */\n'
|
|
' RAT_FUNC /* ConversionType */\n'
|
|
' "%3.0" /* Format */\n'
|
|
' "-" /* Unit */\n'
|
|
' COEFFS 0 1 1 0 0 1\n'
|
|
' /end COMPU_METHOD',
|
|
'Scaling_0': ' /begin COMPU_METHOD\n'
|
|
' Scaling_0 /* Name */\n'
|
|
' "" /* LongIdentifier */\n'
|
|
' RAT_FUNC /* ConversionType */\n'
|
|
' "%3.0" /* Format */\n'
|
|
' "-" /* Unit */\n'
|
|
' COEFFS 0 1 0 0 0 1\n'
|
|
' /end COMPU_METHOD'},
|
|
'MEASUREMENT': {'sVcDtcAtr_D_TrgGear': ' /begin MEASUREMENT\n'
|
|
' sVcDtcAtr_D_TrgGear\t/* Name '
|
|
'*/\n'
|
|
' "Target gear"\t/* '
|
|
'LongIdentifier */\n'
|
|
' SBYTE\t/* Datatype */\n'
|
|
' Scaling_0\t/* Conversion */\n'
|
|
' 1\t/* Resolution */\n'
|
|
' 0\t/* Accuracy */\n'
|
|
' -1\t/* LowerLimit */\n'
|
|
' 8\t/* UpperLimit */\n'
|
|
' READ_WRITE\n'
|
|
' /begin IF_DATA '
|
|
'ASAP1B_ADDRESS\n'
|
|
' KP_BLOB 0x00000000\n'
|
|
' /end IF_DATA\n'
|
|
' /end MEASUREMENT'}
|
|
}
|
|
self.assertEqual(result, expected)
|
|
|
|
def test_kp_blob_patch(self):
|
|
"""Example from VEP4_GEN3_LP_7DCT-61"""
|
|
ucfg = {
|
|
'test_consumer': {
|
|
'inports': {
|
|
"sVcDtcAtr_D_TrgGear": {
|
|
"handle": "VcVexhTar/VcVexhTar/Subsystem/VcVexhTar/input_3",
|
|
"name": "sVcDtcAtr_D_TrgGear",
|
|
"configs": "((ALWAYS_ACTIVE))",
|
|
"description": "Target gear ",
|
|
"type": "Int8",
|
|
"unit": "-",
|
|
"offset": -1,
|
|
"lsb": 1,
|
|
"min": 0,
|
|
"max": 8,
|
|
"class": "CVC_EXT",
|
|
"width": 1
|
|
},
|
|
},
|
|
'outports': {},
|
|
"local_vars": {},
|
|
"calib_consts": {}
|
|
},
|
|
'test_producer': {
|
|
'outports': {
|
|
"sVcDtcAtr_D_TrgGear": {
|
|
"handle": "VcDtcAtr/VcDtcAtr/Subsystem/VcDtcAtr/sVcDtcAtr_D_TrgGear",
|
|
"name": "sVcDtcAtr_D_TrgGear",
|
|
"configs": "((ALWAYS_ACTIVE))",
|
|
"description": "Target gear",
|
|
"type": "Int8",
|
|
"unit": "-",
|
|
"offset": 0,
|
|
"lsb": 1,
|
|
"min": -1,
|
|
"max": 8,
|
|
"class": "CVC_DISP",
|
|
"width": 1
|
|
},
|
|
},
|
|
'inports': {},
|
|
"local_vars": {},
|
|
"calib_consts": {}
|
|
},
|
|
}
|
|
self.ucfg.get_per_unit_cfg.return_value = ucfg
|
|
self.prj_cfg.get_a2l_cfg.return_value = {
|
|
'asap2_version': "1 51",
|
|
'name': 'Test',
|
|
'ip_address': "127.0.0.1",
|
|
'ip_port': '0x0ABC',
|
|
'allow_kp_blob': False
|
|
}
|
|
|
|
a2l = A2lMerge(
|
|
self.prj_cfg, self.ucfg,
|
|
[
|
|
str(Path(SRC_DIR, 'cnfg_files', 'test_producer.a2l')),
|
|
str(Path(SRC_DIR, 'cnfg_files', 'test_consumer.a2l')),
|
|
],
|
|
[]
|
|
)
|
|
result = []
|
|
mopen = mock_open()
|
|
mopen.return_value.write = result.append
|
|
with patch('builtins.open', mopen, create=True):
|
|
a2l.merge('testfile')
|
|
expected = [
|
|
' /begin MEASUREMENT',
|
|
' sVcDtcAtr_D_TrgGear\t/* Name */',
|
|
' "Target gear"\t/* LongIdentifier */',
|
|
' SBYTE\t/* Datatype */',
|
|
' Scaling_0\t/* Conversion */',
|
|
' 1\t/* Resolution */',
|
|
' 0\t/* Accuracy */',
|
|
' -1\t/* LowerLimit */',
|
|
' 8\t/* UpperLimit */',
|
|
' READ_WRITE',
|
|
' ECU_ADDRESS 0x00000000',
|
|
' /end MEASUREMENT',
|
|
'',
|
|
' /begin COMPU_METHOD',
|
|
' Scaling_0 /* Name */',
|
|
' "" /* LongIdentifier */',
|
|
' RAT_FUNC /* ConversionType */',
|
|
' "%3.0" /* Format */',
|
|
' "-" /* Unit */',
|
|
' COEFFS 0 1 0 0 0 1',
|
|
' /end COMPU_METHOD',
|
|
'',
|
|
' /begin COMPU_METHOD',
|
|
' Scaling_1 /* Name */',
|
|
' "" /* LongIdentifier */',
|
|
' RAT_FUNC /* ConversionType */',
|
|
' "%3.0" /* Format */',
|
|
' "-" /* Unit */',
|
|
' COEFFS 0 1 1 0 0 1',
|
|
' /end COMPU_METHOD',
|
|
'',
|
|
'',
|
|
]
|
|
self.assertEqual(result[0], '\n'.join(expected))
|
|
|
|
def test_complete_patch(self):
|
|
"""Example from VEP4_GEN3_LP_7DCT-61"""
|
|
ucfg = {
|
|
'test_consumer': {
|
|
'inports': {
|
|
"sVcDtcAtr_D_TrgGear": {
|
|
"handle": "VcVexhTar/VcVexhTar/Subsystem/VcVexhTar/input_3",
|
|
"name": "sVcDtcAtr_D_TrgGear",
|
|
"configs": "((ALWAYS_ACTIVE))",
|
|
"description": "Target gear ",
|
|
"type": "Int8",
|
|
"unit": "-",
|
|
"offset": -1,
|
|
"lsb": 1,
|
|
"min": 0,
|
|
"max": 8,
|
|
"class": "CVC_EXT",
|
|
"width": 1
|
|
},
|
|
},
|
|
'outports': {},
|
|
"local_vars": {},
|
|
"calib_consts": {}
|
|
},
|
|
'test_producer': {
|
|
'outports': {
|
|
"sVcDtcAtr_D_TrgGear": {
|
|
"handle": "VcDtcAtr/VcDtcAtr/Subsystem/VcDtcAtr/sVcDtcAtr_D_TrgGear",
|
|
"name": "sVcDtcAtr_D_TrgGear",
|
|
"configs": "((ALWAYS_ACTIVE))",
|
|
"description": "Target gear",
|
|
"type": "Int8",
|
|
"unit": "-",
|
|
"offset": 0,
|
|
"lsb": 1,
|
|
"min": -1,
|
|
"max": 8,
|
|
"class": "CVC_DISP",
|
|
"width": 1
|
|
},
|
|
},
|
|
'inports': {},
|
|
"local_vars": {},
|
|
"calib_consts": {}
|
|
},
|
|
}
|
|
self.ucfg.get_per_unit_cfg.return_value = ucfg
|
|
self.prj_cfg.get_a2l_cfg.return_value = {
|
|
'asap2_version': "1 51",
|
|
'name': 'Test-Project',
|
|
'ip_address': "127.0.0.1",
|
|
'ip_port': '0x0ABC',
|
|
'allow_kp_blob': True
|
|
}
|
|
|
|
a2l = A2lMerge(
|
|
self.prj_cfg, self.ucfg,
|
|
[
|
|
str(Path(SRC_DIR, 'cnfg_files', 'test_producer.a2l')),
|
|
str(Path(SRC_DIR, 'cnfg_files', 'test_consumer.a2l')),
|
|
],
|
|
[]
|
|
)
|
|
result = []
|
|
mopen = mock_open()
|
|
mopen.return_value.write = result.append
|
|
with patch('builtins.open', mopen, create=True):
|
|
a2l.merge('testfile', True)
|
|
expected = [
|
|
'ASAP2_VERSION 1 51',
|
|
'/begin PROJECT Test_Project ""',
|
|
' /begin MODULE XCP ""',
|
|
' /begin A2ML',
|
|
' struct Protocol_Layer {',
|
|
' uint; /* XCP protocol layer version, current 0x100 */',
|
|
' uint; /* T1 [ms] */',
|
|
' uint; /* T2 [ms] */',
|
|
' uint; /* T3 [ms] */',
|
|
' uint; /* T4 [ms] */',
|
|
' uint; /* T5 [ms] */',
|
|
' uint; /* T6 [ms] */',
|
|
' uint; /* T7 [ms] */',
|
|
' uchar; /* MAX_CTO */',
|
|
' uint; /* MAX_DTO */',
|
|
' enum {',
|
|
' "BYTE_ORDER_MSB_LAST" = 0,',
|
|
' "BYTE_ORDER_MSB_FIRST" = 1',
|
|
' };',
|
|
' enum {',
|
|
' "ADDRESS_GRANULARITY_BYTE" = 1,',
|
|
' "ADDRESS_GRANULARITY_WORD" = 2,',
|
|
' "ADDRESS_GRANULARITY_DWORD" = 4',
|
|
' };',
|
|
' taggedstruct {',
|
|
' ("OPTIONAL_CMD" enum {',
|
|
' "GET_COMM_MODE_INFO" = 251,',
|
|
' "GET_ID" = 250,',
|
|
' "SET_REQUEST" = 249,',
|
|
' "GET_SEED" = 248,',
|
|
' "UNLOCK" = 247,',
|
|
' "SET_MTA" = 246,',
|
|
' "UPLOAD" = 245,',
|
|
' "SHORT_UPLOAD" = 244,',
|
|
' "BUILD_CHECKSUM" = 243,',
|
|
' "TRANSPORT_LAYER_CMD" = 242,',
|
|
' "USER_CMD" = 241,',
|
|
' "DOWNLOAD" = 240,',
|
|
' "DOWNLOAD_NEXT" = 239,',
|
|
' "DOWNLOAD_MAX" = 238,',
|
|
' "SHORT_DOWNLOAD" = 237,',
|
|
' "MODIFY_BITS" = 236,',
|
|
' "SET_CAL_PAGE" = 235,',
|
|
' "GET_CAL_PAGE" = 234,',
|
|
' "GET_PAG_PROCESSOR_INFO" = 233,',
|
|
' "GET_SEGMENT_INFO" = 232,',
|
|
' "GET_PAGE_INFO" = 231,',
|
|
' "SET_SEGMENT_MODE" = 230,',
|
|
' "GET_SEGMENT_MODE" = 229,',
|
|
' "COPY_CAL_PAGE" = 228,',
|
|
' "CLEAR_DAQ_LIST" = 227,',
|
|
' "SET_DAQ_PTR" = 226,',
|
|
' "WRITE_DAQ" = 225,',
|
|
' "SET_DAQ_LIST_MODE" = 224,',
|
|
' "GET_DAQ_LIST_MODE" = 223,',
|
|
' "START_STOP_DAQ_LIST" = 222,',
|
|
' "START_STOP_SYNCH" = 221,',
|
|
' "GET_DAQ_CLOCK" = 220,',
|
|
' "READ_DAQ" = 219,',
|
|
' "GET_DAQ_PROCESSOR_INFO" = 218,',
|
|
' "GET_DAQ_RESOLUTION_INFO" = 217,',
|
|
' "GET_DAQ_LIST_INFO" = 216,',
|
|
' "GET_DAQ_EVENT_INFO" = 215,',
|
|
' "FREE_DAQ" = 214,',
|
|
' "ALLOC_DAQ" = 213,',
|
|
' "ALLOC_ODT" = 212,',
|
|
' "ALLOC_ODT_ENTRY" = 211,',
|
|
' "PROGRAM_START" = 210,',
|
|
' "PROGRAM_CLEAR" = 209,',
|
|
' "PROGRAM" = 208,',
|
|
' "PROGRAM_RESET" = 207,',
|
|
' "GET_PGM_PROCESSOR_INFO" = 206,',
|
|
' "GET_SECTOR_INFO" = 205,',
|
|
' "PROGRAM_PREPARE" = 204,',
|
|
' "PROGRAM_FORMAT" = 203,',
|
|
' "PROGRAM_NEXT" = 202,',
|
|
' "PROGRAM_MAX" = 201,',
|
|
' "PROGRAM_VERIFY" = 200',
|
|
' })*;',
|
|
' "COMMUNICATION_MODE_SUPPORTED" taggedunion {',
|
|
' "BLOCK" taggedstruct {',
|
|
' "SLAVE" ;',
|
|
' "MASTER" struct {',
|
|
' uchar; /* MAX_BS */',
|
|
' uchar; /* MIN_ST */',
|
|
' };',
|
|
' };',
|
|
' "INTERLEAVED" uchar; /* QUEUE_SIZE */',
|
|
' };',
|
|
' "SEED_AND_KEY_EXTERNAL_FUNCTION" char[256];/* Name of the Seed&Key function */',
|
|
' };',
|
|
' };',
|
|
'',
|
|
' struct Daq {',
|
|
' enum {',
|
|
' "STATIC" = 0,',
|
|
' "DYNAMIC" = 1',
|
|
' };',
|
|
' uint; /* MAX_DAQ */',
|
|
' uint; /* MAX_EVENT_CHANNEL */',
|
|
' uchar; /* MIN_DAQ */',
|
|
' enum {',
|
|
' "OPTIMISATION_TYPE_DEFAULT" = 0,',
|
|
' "OPTIMISATION_TYPE_ODT_TYPE_16" = 1,',
|
|
' "OPTIMISATION_TYPE_ODT_TYPE_32" = 2,',
|
|
' "OPTIMISATION_TYPE_ODT_TYPE_64" = 3,',
|
|
' "OPTIMISATION_TYPE_ODT_TYPE_ALIGNMENT" = 4,',
|
|
' "OPTIMISATION_TYPE_MAX_ENTRY_SIZE" = 5',
|
|
' };',
|
|
' enum {',
|
|
' "ADDRESS_EXTENSION_FREE" = 0,',
|
|
' "ADDRESS_EXTENSION_ODT" = 1,',
|
|
' "ADDRESS_EXTENSION_DAQ" = 3',
|
|
' };',
|
|
' enum {',
|
|
' "IDENTIFICATION_FIELD_TYPE_ABSOLUTE" = 0,',
|
|
' "IDENTIFICATION_FIELD_TYPE_RELATIVE_BYTE" = 1,',
|
|
' "IDENTIFICATION_FIELD_TYPE_RELATIVE_WORD" = 2,',
|
|
' "IDENTIFICATION_FIELD_TYPE_RELATIVE_WORD_ALIGNED" = 3',
|
|
' };',
|
|
' enum {',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_DAQ_BYTE" = 1,',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_DAQ_WORD" = 2,',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_DAQ_DWORD" = 4,',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_DAQ_DLONG" = 8',
|
|
' };',
|
|
' uchar; /* MAX_ODT_ENTRY_SIZE_DAQ */',
|
|
' enum {',
|
|
' "NO_OVERLOAD_INDICATION" = 0,',
|
|
' "OVERLOAD_INDICATION_PID" = 1,',
|
|
' "OVERLOAD_INDICATION_EVENT" = 2',
|
|
' };',
|
|
' taggedstruct {',
|
|
' "PRESCALER_SUPPORTED" ;',
|
|
' "RESUME_SUPPORTED" ;',
|
|
' block "STIM" struct {',
|
|
' enum {',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_STIM_BYTE" = 1,',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_STIM_WORD" = 2,',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_STIM_DWORD" = 4,',
|
|
' "GRANULARITY_ODT_ENTRY_SIZE_STIM_DLONG" = 8',
|
|
' };',
|
|
' uchar; /* MAX_ODT_ENTRY_SIZE_STIM */',
|
|
' taggedstruct {',
|
|
' "BIT_STIM_SUPPORTED" ;',
|
|
' };',
|
|
' };',
|
|
' block "TIMESTAMP_SUPPORTED" struct {',
|
|
' uint; /* TIMESTAMP_TICKS */',
|
|
' enum {',
|
|
' "NO_TIME_STAMP" = 0,',
|
|
' "SIZE_BYTE" = 1,',
|
|
' "SIZE_WORD" = 2,',
|
|
' "SIZE_DWORD" = 4',
|
|
' };',
|
|
' enum {',
|
|
' "UNIT_1NS" = 0,',
|
|
' "UNIT_10NS" = 1,',
|
|
' "UNIT_100NS" = 2,',
|
|
' "UNIT_1US" = 3,',
|
|
' "UNIT_10US" = 4,',
|
|
' "UNIT_100US" = 5,',
|
|
' "UNIT_1MS" = 6,',
|
|
' "UNIT_10MS" = 7,',
|
|
' "UNIT_100MS" = 8,',
|
|
' "UNIT_1S" = 9',
|
|
' };',
|
|
' taggedstruct {',
|
|
' "TIMESTAMP_FIXED" ;',
|
|
' };',
|
|
' };',
|
|
' "PID_OFF_SUPPORTED" ;',
|
|
' (block "DAQ_LIST" struct {',
|
|
' uint; /* DAQ_LIST_NUMBER */',
|
|
' taggedstruct {',
|
|
' "DAQ_LIST_TYPE" enum {',
|
|
' "DAQ" = 1,',
|
|
' "STIM" = 2,',
|
|
' "DAQ_STIM" = 3',
|
|
' };',
|
|
' "MAX_ODT" uchar;',
|
|
' "MAX_ODT_ENTRIES" uchar;',
|
|
' "FIRST_PID" uchar;',
|
|
' "EVENT_FIXED" uint;',
|
|
' block "PREDEFINED" taggedstruct {',
|
|
' (block "ODT" struct {',
|
|
' uchar; /* ODT number */',
|
|
' taggedstruct {',
|
|
' ("ODT_ENTRY" struct {',
|
|
' uchar; /* ODT_ENTRY number */',
|
|
' ulong; /* address of element */',
|
|
' uchar; /* address extension of element */',
|
|
' uchar; /* size of element [AG] */',
|
|
' uchar; /* BIT_OFFSET */',
|
|
' })*;',
|
|
' };',
|
|
' })*;',
|
|
' };',
|
|
' };',
|
|
' })*;',
|
|
' (block "EVENT" struct {',
|
|
' char[101]; /* EVENT_CHANNEL_NAME */',
|
|
' char[9]; /* EVENT_CHANNEL_SHORT_NAME */',
|
|
' uint; /* EVENT_CHANNEL_NUMBER */',
|
|
' enum {',
|
|
' "DAQ" = 1,',
|
|
' "STIM" = 2,',
|
|
' "DAQ_STIM" = 3',
|
|
' };',
|
|
' uchar; /* MAX_DAQ_LIST */',
|
|
' uchar; /* TIME_CYCLE */',
|
|
' uchar; /* TIME_UNIT */',
|
|
' uchar; /* PRIORITY */',
|
|
' })*;',
|
|
' };',
|
|
' };',
|
|
'',
|
|
' taggedunion Daq_Event {',
|
|
' "FIXED_EVENT_LIST" taggedstruct {',
|
|
' ("EVENT" uint)*;',
|
|
' };',
|
|
' "VARIABLE" taggedstruct {',
|
|
' block "AVAILABLE_EVENT_LIST" taggedstruct {',
|
|
' ("EVENT" uint)*;',
|
|
' };',
|
|
' block "DEFAULT_EVENT_LIST" taggedstruct {',
|
|
' ("EVENT" uint)*;',
|
|
' };',
|
|
' };',
|
|
' };',
|
|
'',
|
|
' struct Pag {',
|
|
' uchar; /* MAX_SEGMENTS */',
|
|
' taggedstruct {',
|
|
' "FREEZE_SUPPORTED" ;',
|
|
' };',
|
|
' };',
|
|
'',
|
|
' struct Pgm {',
|
|
' enum {',
|
|
' "PGM_MODE_ABSOLUTE" = 1,',
|
|
' "PGM_MODE_FUNCTIONAL" = 2,',
|
|
' "PGM_MODE_ABSOLUTE_AND_FUNCTIONAL" = 3',
|
|
' };',
|
|
' uchar; /* MAX_SECTORS */',
|
|
' uchar; /* MAX_CTO_PGM */',
|
|
' taggedstruct {',
|
|
' (block "SECTOR" struct {',
|
|
' char[101]; /* SECTOR_NAME */',
|
|
' uchar; /* SECTOR_NUMBER */',
|
|
' ulong; /* Address */',
|
|
' ulong; /* Length */',
|
|
' uchar; /* CLEAR_SEQUENCE_NUMBER */',
|
|
' uchar; /* PROGRAM_SEQUENCE_NUMBER */',
|
|
' uchar; /* PROGRAM_METHOD */',
|
|
' })*;',
|
|
' "COMMUNICATION_MODE_SUPPORTED" taggedunion {',
|
|
' "BLOCK" taggedstruct {',
|
|
' "SLAVE" ;',
|
|
' "MASTER" struct {',
|
|
' uchar; /* MAX_BS_PGM */',
|
|
' uchar; /* MIN_ST_PGM */',
|
|
' };',
|
|
' };',
|
|
' "INTERLEAVED" uchar; /* QUEUE_SIZE_PGM */',
|
|
' };',
|
|
' };',
|
|
' };',
|
|
'',
|
|
' struct Segment {',
|
|
' uchar; /* SEGMENT_NUMBER */',
|
|
' uchar; /* number of pages */',
|
|
' uchar; /* ADDRESS_EXTENSION */',
|
|
' uchar; /* COMPRESSION_METHOD */',
|
|
' uchar; /* ENCRYPTION_METHOD */',
|
|
' taggedstruct {',
|
|
' block "CHECKSUM" struct {',
|
|
' enum {',
|
|
' "XCP_ADD_11" = 1,',
|
|
' "XCP_ADD_12" = 2,',
|
|
' "XCP_ADD_14" = 3,',
|
|
' "XCP_ADD_22" = 4,',
|
|
' "XCP_ADD_24" = 5,',
|
|
' "XCP_ADD_44" = 6,',
|
|
' "XCP_CRC_16" = 7,',
|
|
' "XCP_CRC_16_CITT" = 8,',
|
|
' "XCP_CRC_32" = 9,',
|
|
' "XCP_USER_DEFINED" = 255',
|
|
' };',
|
|
' taggedstruct {',
|
|
' "MAX_BLOCK_SIZE" ulong;',
|
|
' "EXTERNAL_FUNCTION" char[256]; /* Name of the Checksum.DLL */',
|
|
' };',
|
|
' };',
|
|
' (block "PAGE" struct {',
|
|
' uchar; /* PAGE_NUMBER */',
|
|
' enum {',
|
|
' "ECU_ACCESS_NOT_ALLOWED" = 0,',
|
|
' "ECU_ACCESS_WITHOUT_XCP_ONLY" = 1,',
|
|
' "ECU_ACCESS_WITH_XCP_ONLY" = 2,',
|
|
' "ECU_ACCESS_DONT_CARE" = 3',
|
|
' };',
|
|
' enum {',
|
|
' "XCP_READ_ACCESS_NOT_ALLOWED" = 0,',
|
|
' "XCP_READ_ACCESS_WITHOUT_ECU_ONLY" = 1,',
|
|
' "XCP_READ_ACCESS_WITH_ECU_ONLY" = 2,',
|
|
' "XCP_READ_ACCESS_DONT_CARE" = 3',
|
|
' };',
|
|
' enum {',
|
|
' "XCP_WRITE_ACCESS_NOT_ALLOWED" = 0,',
|
|
' "XCP_WRITE_ACCESS_WITHOUT_ECU_ONLY" = 1,',
|
|
' "XCP_WRITE_ACCESS_WITH_ECU_ONLY" = 2,',
|
|
' "XCP_WRITE_ACCESS_DONT_CARE" = 3',
|
|
' };',
|
|
' taggedstruct {',
|
|
' "INIT_SEGMENT" uchar; /* references segment that initialises this page */',
|
|
' };',
|
|
' })*;',
|
|
' (block "ADDRESS_MAPPING" struct {',
|
|
' ulong; /* source address */',
|
|
' ulong; /* destination address */',
|
|
' ulong; /* length */',
|
|
' })*;',
|
|
' "PGM_VERIFY" ulong; /* verification value for PGM */',
|
|
' };',
|
|
' };',
|
|
'',
|
|
' taggedstruct Common_Parameters {',
|
|
' block "PROTOCOL_LAYER" struct Protocol_Layer;',
|
|
' block "SEGMENT" struct Segment;',
|
|
' block "DAQ" struct Daq;',
|
|
' block "PAG" struct Pag;',
|
|
' block "PGM" struct Pgm;',
|
|
' block "DAQ_EVENT" taggedunion Daq_Event;',
|
|
' };',
|
|
'',
|
|
' struct UDP_IP_Parameters {',
|
|
' uint; /* XCP on UDP_IP version, currently 0x0100 */',
|
|
' uint; /* PORT */',
|
|
' taggedunion {',
|
|
' "HOST_NAME" char[256];',
|
|
' "ADDRESS" char[15];',
|
|
' };',
|
|
' };',
|
|
'',
|
|
' block "IF_DATA" taggedunion if_data {',
|
|
' "XCP" struct {',
|
|
' taggedstruct Common_Parameters; /* default parameters */',
|
|
' taggedstruct {',
|
|
' block "XCP_ON_UDP_IP" struct {',
|
|
' struct UDP_IP_Parameters; /* specific for UDP_IP */',
|
|
' taggedstruct Common_Parameters; /* overruling of default */',
|
|
' };',
|
|
' };',
|
|
' };',
|
|
' };',
|
|
' /end A2ML',
|
|
'',
|
|
' /begin MOD_COMMON ""',
|
|
' BYTE_ORDER MSB_LAST',
|
|
' ALIGNMENT_BYTE 1',
|
|
' ALIGNMENT_WORD 1',
|
|
' ALIGNMENT_LONG 1',
|
|
' ALIGNMENT_FLOAT32_IEEE 1',
|
|
' ALIGNMENT_FLOAT64_IEEE 1',
|
|
' /end MOD_COMMON',
|
|
'',
|
|
' /begin IF_DATA XCP',
|
|
' /begin PROTOCOL_LAYER',
|
|
' 0x0100',
|
|
' 0x03E8',
|
|
' 0xC8',
|
|
' 0x00',
|
|
' 0x00',
|
|
' 0x00',
|
|
' 0x00',
|
|
' 0x00',
|
|
' 0x60',
|
|
' 0x12C',
|
|
' BYTE_ORDER_MSB_LAST',
|
|
' ADDRESS_GRANULARITY_BYTE',
|
|
' OPTIONAL_CMD ALLOC_ODT_ENTRY',
|
|
' OPTIONAL_CMD ALLOC_ODT',
|
|
' OPTIONAL_CMD ALLOC_DAQ',
|
|
' OPTIONAL_CMD FREE_DAQ',
|
|
' OPTIONAL_CMD GET_DAQ_RESOLUTION_INFO',
|
|
' OPTIONAL_CMD GET_DAQ_PROCESSOR_INFO',
|
|
' OPTIONAL_CMD START_STOP_SYNCH',
|
|
' OPTIONAL_CMD GET_DAQ_CLOCK',
|
|
' OPTIONAL_CMD START_STOP_DAQ_LIST',
|
|
' OPTIONAL_CMD GET_DAQ_LIST_MODE',
|
|
' OPTIONAL_CMD SET_DAQ_LIST_MODE',
|
|
' OPTIONAL_CMD WRITE_DAQ',
|
|
' OPTIONAL_CMD SET_DAQ_PTR',
|
|
' OPTIONAL_CMD CLEAR_DAQ_LIST',
|
|
' OPTIONAL_CMD SHORT_UPLOAD',
|
|
' OPTIONAL_CMD UPLOAD',
|
|
' OPTIONAL_CMD SET_MTA',
|
|
' OPTIONAL_CMD GET_ID',
|
|
' OPTIONAL_CMD GET_COMM_MODE_INFO',
|
|
' OPTIONAL_CMD BUILD_CHECKSUM',
|
|
' OPTIONAL_CMD SET_SEGMENT_MODE',
|
|
' OPTIONAL_CMD GET_SEGMENT_MODE',
|
|
' OPTIONAL_CMD SET_REQUEST',
|
|
' OPTIONAL_CMD GET_SEED',
|
|
' OPTIONAL_CMD UNLOCK',
|
|
' OPTIONAL_CMD COPY_CAL_PAGE',
|
|
' SEED_AND_KEY_EXTERNAL_FUNCTION Seed_Key.dll/* Add name of seed & key dll file here.*/',
|
|
' /end PROTOCOL_LAYER',
|
|
'',
|
|
' /begin DAQ',
|
|
' DYNAMIC',
|
|
' 0x00',
|
|
' 0x06',
|
|
' 0x00',
|
|
' OPTIMISATION_TYPE_DEFAULT',
|
|
' ADDRESS_EXTENSION_FREE',
|
|
' IDENTIFICATION_FIELD_TYPE_ABSOLUTE',
|
|
' GRANULARITY_ODT_ENTRY_SIZE_DAQ_BYTE',
|
|
' 0x60',
|
|
' NO_OVERLOAD_INDICATION',
|
|
' /begin TIMESTAMP_SUPPORTED',
|
|
' 0x01',
|
|
' SIZE_DWORD',
|
|
' UNIT_100US',
|
|
' TIMESTAMP_FIXED',
|
|
' /end TIMESTAMP_SUPPORTED',
|
|
'',
|
|
'',
|
|
' /end DAQ',
|
|
'',
|
|
' /begin PAG',
|
|
' 0x01',
|
|
' FREEZE_SUPPORTED',
|
|
' /end PAG',
|
|
' /begin PGM',
|
|
' PGM_MODE_ABSOLUTE',
|
|
' 0x01',
|
|
' 0x00',
|
|
' /begin SECTOR',
|
|
' "Sector"',
|
|
' 0x00',
|
|
' 0x22014',
|
|
' 0x38',
|
|
' 0x00',
|
|
' 0x00',
|
|
' 0x00',
|
|
' /end SECTOR',
|
|
' /end PGM',
|
|
'',
|
|
' /begin XCP_ON_UDP_IP',
|
|
' 0x0100',
|
|
' 0x0ABC',
|
|
' ADDRESS "127.0.0.1"',
|
|
' /end XCP_ON_UDP_IP',
|
|
' /end IF_DATA',
|
|
'',
|
|
' /begin MOD_PAR ""',
|
|
' /begin MEMORY_SEGMENT',
|
|
' caldata "caldata"',
|
|
' DATA FLASH INTERN 0x00000 0x0000 -1 -1 -1 -1 -1',
|
|
' /begin IF_DATA XCP',
|
|
' /begin SEGMENT',
|
|
' 0x00',
|
|
' 0x02',
|
|
' 0x00',
|
|
' 0x00',
|
|
' 0x00',
|
|
' /begin CHECKSUM',
|
|
' XCP_CRC_16_CITT',
|
|
' /end CHECKSUM',
|
|
' /begin PAGE',
|
|
' 0x00',
|
|
' ECU_ACCESS_WITH_XCP_ONLY',
|
|
' XCP_READ_ACCESS_WITH_ECU_ONLY',
|
|
' XCP_WRITE_ACCESS_NOT_ALLOWED',
|
|
' INIT_SEGMENT 0x00',
|
|
' /end PAGE',
|
|
' /begin PAGE',
|
|
' 0x01',
|
|
' ECU_ACCESS_WITH_XCP_ONLY',
|
|
' XCP_READ_ACCESS_WITH_ECU_ONLY',
|
|
' XCP_WRITE_ACCESS_WITH_ECU_ONLY',
|
|
' INIT_SEGMENT 0x00',
|
|
' /end PAGE',
|
|
' /end SEGMENT',
|
|
' /end IF_DATA',
|
|
' /end MEMORY_SEGMENT',
|
|
' /begin MEMORY_SEGMENT',
|
|
' text ".text"',
|
|
' CODE ROM INTERN 0x26030 0x72c10 -1 -1 -1 -1 -1',
|
|
' /begin IF_DATA XCP',
|
|
' /begin SEGMENT',
|
|
' 0x01',
|
|
' 0x01',
|
|
' 0x00',
|
|
' 0x00',
|
|
' 0x00',
|
|
' /begin CHECKSUM',
|
|
' XCP_CRC_16_CITT',
|
|
' /end CHECKSUM',
|
|
' /begin PAGE',
|
|
' 0x01',
|
|
' ECU_ACCESS_WITH_XCP_ONLY',
|
|
' XCP_READ_ACCESS_WITH_ECU_ONLY',
|
|
' XCP_WRITE_ACCESS_WITH_ECU_ONLY',
|
|
' INIT_SEGMENT 0x00',
|
|
' /end PAGE',
|
|
' /end SEGMENT',
|
|
' /end IF_DATA',
|
|
' /end MEMORY_SEGMENT',
|
|
' /end MOD_PAR',
|
|
'',
|
|
' /begin COMPU_METHOD BitSlice.CONVERSION ""',
|
|
' RAT_FUNC "%6.2f" ""',
|
|
' COEFFS 0 1 0 0 0 1',
|
|
' /end COMPU_METHOD',
|
|
'',
|
|
' /* SPM declarations start. */',
|
|
'',
|
|
' /begin MEASUREMENT',
|
|
' sVcDtcAtr_D_TrgGear /* Name */',
|
|
' "Target gear" /* LongIdentifier */',
|
|
' SBYTE /* Datatype */',
|
|
' Scaling_0 /* Conversion */',
|
|
' 1 /* Resolution */',
|
|
' 0 /* Accuracy */',
|
|
' -1 /* LowerLimit */',
|
|
' 8 /* UpperLimit */',
|
|
' READ_WRITE',
|
|
' /begin IF_DATA ASAP1B_ADDRESS',
|
|
' KP_BLOB 0x00000000',
|
|
' /end IF_DATA',
|
|
' /end MEASUREMENT',
|
|
'',
|
|
' /begin COMPU_METHOD',
|
|
' Scaling_0 /* Name */',
|
|
' "" /* LongIdentifier */',
|
|
' RAT_FUNC /* ConversionType */',
|
|
' "%3.0" /* Format */',
|
|
' "-" /* Unit */',
|
|
' COEFFS 0 1 0 0 0 1',
|
|
' /end COMPU_METHOD',
|
|
'',
|
|
' /begin COMPU_METHOD',
|
|
' Scaling_1 /* Name */',
|
|
' "" /* LongIdentifier */',
|
|
' RAT_FUNC /* ConversionType */',
|
|
' "%3.0" /* Format */',
|
|
' "-" /* Unit */',
|
|
' COEFFS 0 1 1 0 0 1',
|
|
' /end COMPU_METHOD',
|
|
'',
|
|
'',
|
|
'',
|
|
' /* SPM declarations end. */',
|
|
'',
|
|
' /begin RECORD_LAYOUT __UBYTE_Z',
|
|
' FNC_VALUES 1 UBYTE ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __UWORD_Z',
|
|
' FNC_VALUES 1 UWORD ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __ULONG_Z',
|
|
' FNC_VALUES 1 ULONG ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __SBYTE_Z',
|
|
' FNC_VALUES 1 SBYTE ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __SWORD_Z',
|
|
' FNC_VALUES 1 SWORD ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __SLONG_Z',
|
|
' FNC_VALUES 1 SLONG ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __FLOAT32_IEEE_Z',
|
|
' FNC_VALUES 1 FLOAT32_IEEE ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __FLOAT64_IEEE_Z',
|
|
' FNC_VALUES 1 FLOAT64_IEEE ROW_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __UBYTE_S',
|
|
' FNC_VALUES 1 UBYTE COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __UWORD_S',
|
|
' FNC_VALUES 1 UWORD COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __ULONG_S',
|
|
' FNC_VALUES 1 ULONG COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __SBYTE_S',
|
|
' FNC_VALUES 1 SBYTE COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __SWORD_S',
|
|
' FNC_VALUES 1 SWORD COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __SLONG_S',
|
|
' FNC_VALUES 1 SLONG COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __FLOAT32_IEEE_S',
|
|
' FNC_VALUES 1 FLOAT32_IEEE COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT __FLOAT64_IEEE_S',
|
|
' FNC_VALUES 1 FLOAT64_IEEE COLUMN_DIR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__UBYTE_S',
|
|
' AXIS_PTS_X 1 UBYTE INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__UWORD_S',
|
|
' AXIS_PTS_X 1 UWORD INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__ULONG_S',
|
|
' AXIS_PTS_X 1 ULONG INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__SBYTE_S',
|
|
' AXIS_PTS_X 1 SBYTE INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__SWORD_S',
|
|
' AXIS_PTS_X 1 SWORD INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__SLONG_S',
|
|
' AXIS_PTS_X 1 SLONG INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__FLOAT32_IEEE_S',
|
|
' AXIS_PTS_X 1 FLOAT32_IEEE INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /begin RECORD_LAYOUT SSV__FLOAT64_IEEE_S',
|
|
' AXIS_PTS_X 1 FLOAT64_IEEE INDEX_INCR DIRECT',
|
|
' /end RECORD_LAYOUT',
|
|
'',
|
|
' /end MODULE',
|
|
'/end PROJECT',
|
|
''
|
|
]
|
|
self.assertListEqual(result[0].split('\n'), expected)
|