765 lines
32 KiB
Python
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)
|