Files
powertrain-build/tests/powertrain_build/test_a2l_templates.py
olindgre 2ece01e1d7 Make powertrain-build not overlap with pybuild in site-packages
Change-Id: I7b59f3f04f0f787d35db0b9389f295bf1ad24f56
2024-09-17 10:25:04 +02:00

765 lines
32 KiB
Python

# Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0.
"""Unit tests for merge_a2l.py."""
import unittest
from powertrain_build.a2l_templates import A2lProjectTemplate, A2lSilverTemplate
class TestA2lProjectTemplate(unittest.TestCase):
"""Tests for powertrain_build.a2l_templates."""
def test_a2l_project_template(self):
"""Test powertrain_build.a2l_templates.A2lProjectTemplate."""
events = []
events = [
{
'time_cycle': '0x01',
'time_unit': '0x07',
'name': 'Raster0',
'channel_id': '0x0001'
},
{
'time_cycle': '0x10',
'time_unit': '0x07',
'name': 'Raster1',
'channel_id': '0x0002'
},
]
a2l_template = A2lProjectTemplate(
'SPM',
"1 60",
"test-project",
events,
"127.0.0.1",
"0x0AA"
)
a2l = a2l_template.render()
expected = [
'ASAP2_VERSION 1 60',
'/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',
'',
' /begin EVENT',
' "Raster0" /* EVENT CHANNEL NAME */',
' "Raster0" /* EVENT CHANNEL SHORT NAME */',
' 0x0001 /* EVENT CHANNEL NUMBER */',
' DAQ_STIM',
' 0xFF',
' 0x01 /* EVENT TIME CYCLE */',
' 0x07 /* EVENT TIME UNIT */',
' 0x00',
' /end EVENT',
' /begin EVENT',
' "Raster1" /* EVENT CHANNEL NAME */',
' "Raster1" /* EVENT CHANNEL SHORT NAME */',
' 0x0002 /* EVENT CHANNEL NUMBER */',
' DAQ_STIM',
' 0xFF',
' 0x10 /* EVENT TIME CYCLE */',
' 0x07 /* EVENT TIME UNIT */',
' 0x00',
' /end EVENT',
'',
' /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',
' 0x0AA',
' 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. */',
'',
'SPM',
'',
' /* 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(a2l.split('\n'), expected)
def test_a2l_silver_template(self):
"""Test powertrain_build.a2l_templates.test_A2lSilverTemplate."""
test_a2l = '\n'.join([
'/begin CHARACTERISTIC',
' char_dummy /* Name */',
' "åäö" /* LongIdentifier */',
' VALUE /* Type */',
' 0x00000000 /* address: char_dummy */',
' UBYTE_COL_DIRECT /* Deposit */',
' 0 /* MaxDiff */',
' Scaling_1 /* Conversion */',
' 0 /* LowerLimit */',
' 1 /* UpperLimit */',
'/end CHARACTERISTIC',
'',
'/begin FUNCTION',
' DummyFunction /* Name */',
' "" /* LongIdentifier */',
' /begin DEF_CHARACTERISTIC',
' char_dummy /* Identifier */',
' /end DEF_CHARACTERISTIC',
' /begin IN_MEASUREMENT',
' meas_dummy /* Identifier */',
' /end IN_MEASUREMENT',
' /begin LOC_MEASUREMENT',
' loc_meas_dummy /* Identifier */',
' /end LOC_MEASUREMENT',
' /begin OUT_MEASUREMENT',
' out_meas_dummy /* Identifier */',
' /end OUT_MEASUREMENT',
' /begin SUB_FUNCTION',
' DummySub.Instance1 /* Identifier */',
' /end SUB_FUNCTION',
'/end FUNCTION'
])
silver_template = A2lSilverTemplate(test_a2l)
result = silver_template.render()
expected = '\n'.join([
'/* QTronic Header */',
'ASAP2_VERSION 1 6',
'/begin PROJECT SPM ""',
'/begin MODULE SPM ""',
'',
'/begin CHARACTERISTIC',
' char_dummy /* Name */',
' "???" /* LongIdentifier */',
' VALUE /* Type */',
' 0x00000000 /* address: char_dummy */',
' UBYTE_COL_DIRECT /* Deposit */',
' 0 /* MaxDiff */',
' Scaling_1 /* Conversion */',
' 0 /* LowerLimit */',
' 1 /* UpperLimit */',
'/end CHARACTERISTIC',
'',
'/begin FUNCTION',
' DummyFunction /* Name */',
' "" /* LongIdentifier */',
' /begin DEF_CHARACTERISTIC',
' char_dummy /* Identifier */',
' /end DEF_CHARACTERISTIC',
' /begin IN_MEASUREMENT',
' meas_dummy /* Identifier */',
' /end IN_MEASUREMENT',
' /begin LOC_MEASUREMENT',
' loc_meas_dummy /* Identifier */',
' /end LOC_MEASUREMENT',
' /begin OUT_MEASUREMENT',
' out_meas_dummy /* Identifier */',
' /end OUT_MEASUREMENT',
' /begin SUB_FUNCTION',
' DummySub.Instance1 /* Identifier */',
' /end SUB_FUNCTION',
'/end FUNCTION'
'',
'/end MODULE',
'/end PROJECT'
])
self.assertEqual(expected, result)