You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
937 lines
29 KiB
937 lines
29 KiB
|
2 months ago
|
/******************************************************************************
|
||
|
|
*
|
||
|
|
* ASAP2 file: variants.a2l
|
||
|
|
*
|
||
|
|
******************************************************************************/
|
||
|
|
ASAP2_VERSION 1 71
|
||
|
|
/begin PROJECT ProjectName "Project Comment Goes Here"
|
||
|
|
|
||
|
|
/begin HEADER "Header Comments go here"
|
||
|
|
|
||
|
|
/end HEADER
|
||
|
|
|
||
|
|
/begin MODULE ModuleName "Module Comment Goes Here"
|
||
|
|
|
||
|
|
/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 CAN_Parameters {
|
||
|
|
uint; /* XCP on CAN version, currentl 0x0100 */
|
||
|
|
taggedstruct {
|
||
|
|
"CAN_ID_BROADCAST" ulong; /* Auto-detection CAN-ID */
|
||
|
|
"CAN_ID_MASTER" ulong; /* CMD/STIM CAN-ID */
|
||
|
|
"CAN_ID_SLAVE" ulong; /* RES/ERR/EV/SERV/DAQ CAN-ID */
|
||
|
|
"BAUDRATE" ulong; /* Baudrate in Hz */
|
||
|
|
"SAMPLE_POINT" uchar; /* Sample point in of bit time */
|
||
|
|
"SAMPLE_RATE" enum {
|
||
|
|
"SINGLE" = 1,
|
||
|
|
"TRIPLE" = 3
|
||
|
|
};
|
||
|
|
"BTL_CYCLES" uchar; /* slots per bit time */
|
||
|
|
"SJW" uchar;
|
||
|
|
"SYNC_EDGE" enum {
|
||
|
|
"SINGLE" = 1,
|
||
|
|
"DUAL" = 2
|
||
|
|
};
|
||
|
|
"MAX_DLC_REQUIRED" ; /* master to slave frames */
|
||
|
|
(block "DAQ_LIST_CAN_ID" struct {
|
||
|
|
uint; /* reference to DAQ_LIST_NUMBER */
|
||
|
|
taggedstruct {
|
||
|
|
"VARIABLE" ;
|
||
|
|
"FIXED" ulong; /* this DAQ_LIST always on this CAN_ID */
|
||
|
|
};
|
||
|
|
})*;
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
struct SxI_Parameters {
|
||
|
|
uint; /* XCP on SxI version, currently 0x0100 */
|
||
|
|
ulong; /* BAUDRATE [Hz] */
|
||
|
|
taggedstruct {
|
||
|
|
"ASYNCH_FULL_DUPLEX_MODE" struct {
|
||
|
|
enum {
|
||
|
|
"PARITY_NONE" = 0,
|
||
|
|
"PARITY_ODD" = 1,
|
||
|
|
"PARITY_EVEN" = 2
|
||
|
|
};
|
||
|
|
enum {
|
||
|
|
"ONE_STOP_BIT" = 1,
|
||
|
|
"TWO_STOP_BITS" = 2
|
||
|
|
};
|
||
|
|
};
|
||
|
|
"SYNCH_FULL_DUPLEX_MODE_BYTE" ;
|
||
|
|
"SYNCH_FULL_DUPLEX_MODE_WORD" ;
|
||
|
|
"SYNCH_FULL_DUPLEX_MODE_DWORD" ;
|
||
|
|
"SYNCH_MASTER_SLAVE_MODE_BYTE" ;
|
||
|
|
"SYNCH_MASTER_SLAVE_MODE_WORD" ;
|
||
|
|
"SYNCH_MASTER_SLAVE_MODE_DWORD" ;
|
||
|
|
};
|
||
|
|
enum {
|
||
|
|
"HEADER_LEN_BYTE" = 0,
|
||
|
|
"HEADER_LEN_CTR_BYTE" = 1,
|
||
|
|
"HEADER_LEN_FILL_BYTE" = 2,
|
||
|
|
"HEADER_LEN_WORD" = 3,
|
||
|
|
"HEADER_LEN_CTR_WORD" = 4,
|
||
|
|
"HEADER_LEN_FILL_WORD" = 5
|
||
|
|
};
|
||
|
|
enum {
|
||
|
|
"NO_CHECKSUM" = 0,
|
||
|
|
"CHECKSUM_BYTE" = 1,
|
||
|
|
"CHECKSUM_WORD" = 2
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
struct TCP_IP_Parameters {
|
||
|
|
uint; /* XCP on TCP_IP version, currently 0x0100 */
|
||
|
|
uint; /* PORT */
|
||
|
|
taggedunion {
|
||
|
|
"HOST_NAME" char[256];
|
||
|
|
"ADDRESS" char[15];
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
struct UDP_Parameters {
|
||
|
|
uint; /* XCP on UDP version, currently 0x0100 */
|
||
|
|
uint; /* PORT */
|
||
|
|
taggedunion {
|
||
|
|
"HOST_NAME" char[256];
|
||
|
|
"ADDRESS" char[15];
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
struct ep_parameters {
|
||
|
|
uchar; /* ENDPOINT_NUMBER, not endpoint address */
|
||
|
|
enum {
|
||
|
|
"BULK_TRANSFER" = 2,
|
||
|
|
"INTERRUPT_TRANSFER" = 3
|
||
|
|
};
|
||
|
|
uint; /* wMaxPacketSize: Maximum packet
|
||
|
|
size of endpoint in bytes */
|
||
|
|
uchar; /* bInterval: polling of endpoint */
|
||
|
|
enum {
|
||
|
|
"MESSAGE_PACKING_SINGLE" = 0,
|
||
|
|
"MESSAGE_PACKING_MULTIPLE" = 1,
|
||
|
|
"MESSAGE_PACKING_STREAMING" = 2
|
||
|
|
};
|
||
|
|
enum {
|
||
|
|
"ALIGNMENT_8_BIT" = 0,
|
||
|
|
"ALIGNMENT_16_BIT" = 1,
|
||
|
|
"ALIGNMENT_32_BIT" = 2,
|
||
|
|
"ALIGNMENT_64_BIT" = 3
|
||
|
|
};
|
||
|
|
taggedstruct {
|
||
|
|
"RECOMMENDED_HOST_BUFSIZE" uint; /* Recommended size for the host
|
||
|
|
buffer size. The size is defined
|
||
|
|
as multiple of wMaxPacketSize. */
|
||
|
|
};
|
||
|
|
}; /* end of ep_parameters */
|
||
|
|
|
||
|
|
struct USB_Parameters {
|
||
|
|
uint; /* XCP on USB version
|
||
|
|
e.g. "1.0" = 0x0100 */
|
||
|
|
uint; /* Vendor ID */
|
||
|
|
uint; /* Product ID */
|
||
|
|
uchar; /* Number of interface */
|
||
|
|
enum {
|
||
|
|
"HEADER_LEN_BYTE" = 0,
|
||
|
|
"HEADER_LEN_CTR_BYTE" = 1,
|
||
|
|
"HEADER_LEN_FILL_BYTE" = 2,
|
||
|
|
"HEADER_LEN_WORD" = 3,
|
||
|
|
"HEADER_LEN_CTR_WORD" = 4,
|
||
|
|
"HEADER_LEN_FILL_WORD" = 5
|
||
|
|
};
|
||
|
|
taggedunion {
|
||
|
|
block "OUT_EP_CMD_STIM" struct ep_parameters;
|
||
|
|
};
|
||
|
|
taggedunion {
|
||
|
|
block "IN_EP_RESERR_DAQ_EVSERV" struct ep_parameters;
|
||
|
|
};
|
||
|
|
taggedstruct {
|
||
|
|
"ALTERNATE_SETTING_NO" uchar; /* Number of alternate setting */
|
||
|
|
"INTERFACE_STRING_DESCRIPTOR" char[101];
|
||
|
|
(block "OUT_EP_ONLY_STIM" struct ep_parameters)*;
|
||
|
|
(block "IN_EP_ONLY_DAQ" struct ep_parameters)*;
|
||
|
|
block "IN_EP_ONLY_EVSERV" struct ep_parameters;
|
||
|
|
(block "DAQ_LIST_USB_ENDPOINT" struct {
|
||
|
|
uint; /* reference to DAQ_LIST_NUMBER */
|
||
|
|
taggedstruct {
|
||
|
|
"FIXED_IN" uchar; /* this DAQ list always
|
||
|
|
ENDPOINT_NUMBER, not endpoint address */
|
||
|
|
"FIXED_OUT" uchar; /* this STIM list always
|
||
|
|
ENDPOINT_NUMBER, not endpoint address */
|
||
|
|
};
|
||
|
|
})*; /* end of DAQ_LIST_USB_ENDPOINT */
|
||
|
|
}; /* end of optional */
|
||
|
|
};
|
||
|
|
|
||
|
|
struct SIMULINK_Parameters {
|
||
|
|
taggedstruct {
|
||
|
|
"MODEL_NAME" char[64];
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
enum packet_assignment_type {
|
||
|
|
"NOT_ALLOWED" = 0,
|
||
|
|
"FIXED" = 1,
|
||
|
|
"VARIABLE_INITIALISED" = 2,
|
||
|
|
"VARIABLE" = 3
|
||
|
|
}; /* end of packet_assignment_type */
|
||
|
|
|
||
|
|
struct buffer {
|
||
|
|
uchar; /* FLX_BUF */
|
||
|
|
taggedstruct {
|
||
|
|
"MAX_FLX_LEN_BUF" taggedunion {
|
||
|
|
"FIXED" uchar; /* constant value */
|
||
|
|
"VARIABLE" uchar; /* initial value */
|
||
|
|
}; /* end of MAX_FLX_LEN_BUF */
|
||
|
|
block "LPDU_ID" taggedstruct {
|
||
|
|
"FLX_SLOT_ID" taggedunion {
|
||
|
|
"FIXED" uint;
|
||
|
|
"VARIABLE" taggedstruct {
|
||
|
|
"INITIAL_VALUE" uint;
|
||
|
|
};
|
||
|
|
}; /* end of FLX_SLOT_ID */
|
||
|
|
"OFFSET" taggedunion {
|
||
|
|
"FIXED" uchar;
|
||
|
|
"VARIABLE" taggedstruct {
|
||
|
|
"INITIAL_VALUE" uchar;
|
||
|
|
};
|
||
|
|
}; /* end of OFFSET */
|
||
|
|
"CYCLE_REPETITION" taggedunion {
|
||
|
|
"FIXED" uchar;
|
||
|
|
"VARIABLE" taggedstruct {
|
||
|
|
"INITIAL_VALUE" uchar;
|
||
|
|
};
|
||
|
|
}; /* end of CYCLE_REPETITION */
|
||
|
|
"CHANNEL" taggedunion {
|
||
|
|
"FIXED" enum {
|
||
|
|
"A" = 0,
|
||
|
|
"B" = 1
|
||
|
|
};
|
||
|
|
"VARIABLE" taggedstruct {
|
||
|
|
"INITIAL_VALUE" enum {
|
||
|
|
"A" = 0,
|
||
|
|
"B" = 1
|
||
|
|
};
|
||
|
|
};
|
||
|
|
}; /* end of CHANNEL */
|
||
|
|
}; /* end of LPDU_ID */
|
||
|
|
block "XCP_PACKET" taggedstruct {
|
||
|
|
"CMD" enum packet_assignment_type; /* end of CMD */
|
||
|
|
"RES_ERR" enum packet_assignment_type; /* end of RES_ERR */
|
||
|
|
"EV_SERV" enum packet_assignment_type; /* end of EV_SERV */
|
||
|
|
"DAQ" enum packet_assignment_type; /* end of DAQ */
|
||
|
|
"STIM" enum packet_assignment_type; /* end of STIM */
|
||
|
|
}; /* end of XCP_PACKET */
|
||
|
|
};
|
||
|
|
}; /* end of buffer */
|
||
|
|
|
||
|
|
struct FLX_Parameters {
|
||
|
|
|
||
|
|
uint; /* XCP on FlexRay version */
|
||
|
|
/* e.g. "1.0" = 0x0100 */
|
||
|
|
|
||
|
|
uint; /* T1_FLX [ms] */
|
||
|
|
|
||
|
|
char[256]; /* FIBEX-file */
|
||
|
|
/* including CHI information */
|
||
|
|
/* including extension */
|
||
|
|
/* without path */
|
||
|
|
|
||
|
|
char[256]; /* Cluster-ID */
|
||
|
|
|
||
|
|
uchar; /* NAX */
|
||
|
|
|
||
|
|
enum {
|
||
|
|
"HEADER_NAX" = 0,
|
||
|
|
"HEADER_NAX_FILL" = 1,
|
||
|
|
"HEADER_NAX_CTR" = 2,
|
||
|
|
"HEADER_NAX_FILL3" = 3,
|
||
|
|
"HEADER_NAX_CTR_FILL2" = 4,
|
||
|
|
"HEADER_NAX_LEN" = 5,
|
||
|
|
"HEADER_NAX_CTR_LEN" = 6,
|
||
|
|
"HEADER_NAX_FILL2_LEN" = 7,
|
||
|
|
"HEADER_NAX_CTR_FILL_LEN" = 8
|
||
|
|
};
|
||
|
|
enum {
|
||
|
|
"PACKET_ALIGNMENT_8" = 0,
|
||
|
|
"PACKET_ALIGNMENT_16" = 1,
|
||
|
|
"PACKET_ALIGNMENT_32" = 2
|
||
|
|
};
|
||
|
|
taggedunion {
|
||
|
|
block "INITIAL_CMD_BUFFER" struct buffer;
|
||
|
|
};
|
||
|
|
taggedunion {
|
||
|
|
block "INITIAL_RES_ERR_BUFFER" struct buffer;
|
||
|
|
};
|
||
|
|
taggedstruct {
|
||
|
|
(block "POOL_BUFFER" struct buffer)*;
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
block "IF_DATA" taggedunion if_data {
|
||
|
|
|
||
|
|
"CANAPE_EXT" struct {
|
||
|
|
int; /* version number */
|
||
|
|
taggedstruct {
|
||
|
|
"LINK_MAP" struct {
|
||
|
|
char[256]; /* segment name */
|
||
|
|
long; /* base address of the segment */
|
||
|
|
uint; /* address extension of the segment */
|
||
|
|
uint; /* flag: address is relative to DS */
|
||
|
|
long; /* offset of the segment address */
|
||
|
|
uint; /* datatypValid */
|
||
|
|
uint; /* enum datatyp */
|
||
|
|
uint; /* bit offset of the segment */
|
||
|
|
};
|
||
|
|
"DISPLAY" struct {
|
||
|
|
long; /* display color */
|
||
|
|
double; /* minimal display value (phys)*/
|
||
|
|
double; /* maximal display value (phys)*/
|
||
|
|
};
|
||
|
|
"VIRTUAL_CONVERSION" struct {
|
||
|
|
char[256]; /* name of the conversion formula */
|
||
|
|
};
|
||
|
|
};
|
||
|
|
};
|
||
|
|
"CANAPE_MODULE" struct {
|
||
|
|
taggedstruct {
|
||
|
|
("RECORD_LAYOUT_STEPSIZE" struct {
|
||
|
|
char[256]; /* name of record layout*/
|
||
|
|
uint; /* stepsize for FNC_VALUES */
|
||
|
|
uint; /* stepsize for AXIS_PTS_X */
|
||
|
|
uint; /* stepsize for AXIS_PTS_Y */
|
||
|
|
uint; /* stepsize for AXIS_PTS_Z */
|
||
|
|
uint; /* stepsize for AXIS_PTS_4 */
|
||
|
|
uint; /* stepsize for AXIS_PTS_5 */
|
||
|
|
})*;
|
||
|
|
};
|
||
|
|
};
|
||
|
|
/*********************************************************/
|
||
|
|
/* XCP */
|
||
|
|
/*********************************************************/
|
||
|
|
"XCP" struct {
|
||
|
|
taggedstruct Common_Parameters; /* default parameters */
|
||
|
|
taggedstruct {
|
||
|
|
block "XCP_ON_CAN" struct {
|
||
|
|
struct CAN_Parameters; /* specific for CAN */
|
||
|
|
taggedstruct Common_Parameters; /* overruling of default */
|
||
|
|
};
|
||
|
|
block "XCP_ON_SxI" struct {
|
||
|
|
struct SxI_Parameters; /* specific for SxI */
|
||
|
|
taggedstruct Common_Parameters; /* overruling of default */
|
||
|
|
};
|
||
|
|
block "XCP_ON_TCP_IP" struct {
|
||
|
|
struct TCP_IP_Parameters; /* specific for TCP_IP */
|
||
|
|
taggedstruct Common_Parameters; /* overruling of default */
|
||
|
|
};
|
||
|
|
block "XCP_ON_UDP_IP" struct {
|
||
|
|
struct UDP_Parameters; /* specific for UDP */
|
||
|
|
taggedstruct Common_Parameters; /* overruling of default */
|
||
|
|
};
|
||
|
|
block "XCP_ON_USB" struct {
|
||
|
|
struct USB_Parameters; /* specific for USB */
|
||
|
|
taggedstruct Common_Parameters; /* overruling of default */
|
||
|
|
};
|
||
|
|
block "XCP_ON_FLX" struct {
|
||
|
|
struct FLX_Parameters; /* specific for FlexRay */
|
||
|
|
taggedstruct Common_Parameters; /* overruling of default */
|
||
|
|
};
|
||
|
|
};
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
/end A2ML
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
/begin IF_DATA XCP
|
||
|
|
|
||
|
|
|
||
|
|
/begin PROTOCOL_LAYER
|
||
|
|
0x0100
|
||
|
|
0x03E8
|
||
|
|
0x00C8
|
||
|
|
0x0000
|
||
|
|
0x0000
|
||
|
|
0x0000
|
||
|
|
0x0000
|
||
|
|
0x0000
|
||
|
|
0xFC
|
||
|
|
0x0578
|
||
|
|
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 START_STOP_DAQ_LIST
|
||
|
|
OPTIONAL_CMD SET_DAQ_LIST_MODE
|
||
|
|
OPTIONAL_CMD WRITE_DAQ
|
||
|
|
OPTIONAL_CMD SET_DAQ_PTR
|
||
|
|
OPTIONAL_CMD GET_CAL_PAGE
|
||
|
|
OPTIONAL_CMD SET_CAL_PAGE
|
||
|
|
OPTIONAL_CMD COPY_CAL_PAGE
|
||
|
|
OPTIONAL_CMD SHORT_DOWNLOAD
|
||
|
|
OPTIONAL_CMD DOWNLOAD_MAX
|
||
|
|
OPTIONAL_CMD DOWNLOAD
|
||
|
|
OPTIONAL_CMD SHORT_UPLOAD
|
||
|
|
OPTIONAL_CMD UPLOAD
|
||
|
|
OPTIONAL_CMD SET_MTA
|
||
|
|
/end PROTOCOL_LAYER
|
||
|
|
|
||
|
|
|
||
|
|
/begin DAQ
|
||
|
|
DYNAMIC
|
||
|
|
0x0000
|
||
|
|
0x0080
|
||
|
|
0x00
|
||
|
|
OPTIMISATION_TYPE_DEFAULT
|
||
|
|
ADDRESS_EXTENSION_FREE
|
||
|
|
IDENTIFICATION_FIELD_TYPE_RELATIVE_WORD_ALIGNED
|
||
|
|
GRANULARITY_ODT_ENTRY_SIZE_DAQ_BYTE
|
||
|
|
0xFF
|
||
|
|
OVERLOAD_INDICATION_PID
|
||
|
|
PRESCALER_SUPPORTED
|
||
|
|
|
||
|
|
/begin STIM
|
||
|
|
GRANULARITY_ODT_ENTRY_SIZE_STIM_BYTE
|
||
|
|
0xFF
|
||
|
|
|
||
|
|
/end STIM
|
||
|
|
|
||
|
|
/begin TIMESTAMP_SUPPORTED
|
||
|
|
0x0001
|
||
|
|
SIZE_DWORD
|
||
|
|
UNIT_1US
|
||
|
|
TIMESTAMP_FIXED
|
||
|
|
/end TIMESTAMP_SUPPORTED
|
||
|
|
|
||
|
|
|
||
|
|
/begin EVENT
|
||
|
|
"1 ms"
|
||
|
|
"1 ms"
|
||
|
|
0x0000
|
||
|
|
DAQ
|
||
|
|
0xFF
|
||
|
|
0x01
|
||
|
|
0x06
|
||
|
|
0x00
|
||
|
|
/end EVENT
|
||
|
|
|
||
|
|
/end DAQ
|
||
|
|
|
||
|
|
|
||
|
|
/begin XCP_ON_UDP_IP
|
||
|
|
0x0100
|
||
|
|
0x15B3
|
||
|
|
ADDRESS "192.168.7.1"
|
||
|
|
/end XCP_ON_UDP_IP
|
||
|
|
|
||
|
|
/end IF_DATA
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
/begin MOD_PAR "MOD PAR Comment Goes Here"
|
||
|
|
|
||
|
|
/begin MEMORY_SEGMENT tstCom_cal_impl
|
||
|
|
"tstCom_cal_impl"
|
||
|
|
DATA
|
||
|
|
FLASH
|
||
|
|
INTERN
|
||
|
|
0x0023F020
|
||
|
|
0x948
|
||
|
|
-1 -1 -1 -1 -1 /begin IF_DATA XCP
|
||
|
|
/begin SEGMENT
|
||
|
|
0x00
|
||
|
|
0x02
|
||
|
|
0x00
|
||
|
|
0x00
|
||
|
|
0x00
|
||
|
|
/begin PAGE
|
||
|
|
0x00
|
||
|
|
ECU_ACCESS_DONT_CARE
|
||
|
|
XCP_READ_ACCESS_DONT_CARE
|
||
|
|
XCP_WRITE_ACCESS_NOT_ALLOWED
|
||
|
|
/end PAGE
|
||
|
|
/begin PAGE
|
||
|
|
0x01
|
||
|
|
ECU_ACCESS_DONT_CARE
|
||
|
|
XCP_READ_ACCESS_DONT_CARE
|
||
|
|
XCP_WRITE_ACCESS_DONT_CARE
|
||
|
|
/end PAGE
|
||
|
|
/end SEGMENT
|
||
|
|
/end IF_DATA
|
||
|
|
/end MEMORY_SEGMENT
|
||
|
|
|
||
|
|
/end MOD_PAR
|
||
|
|
|
||
|
|
/begin MOD_COMMON "Mod Common Comment Here"
|
||
|
|
BYTE_ORDER MSB_LAST
|
||
|
|
ALIGNMENT_BYTE 1
|
||
|
|
ALIGNMENT_WORD 2
|
||
|
|
ALIGNMENT_LONG 8
|
||
|
|
ALIGNMENT_FLOAT32_IEEE 4
|
||
|
|
ALIGNMENT_FLOAT64_IEEE 8
|
||
|
|
ALIGNMENT_INT64 4
|
||
|
|
/end MOD_COMMON
|
||
|
|
|
||
|
|
/begin CHARACTERISTIC PUMKF /* name */
|
||
|
|
"Pump characteristic map"
|
||
|
|
/* long identifier */
|
||
|
|
MAP /* type */
|
||
|
|
0x7140 /* address */
|
||
|
|
DAMOS_KF /* deposit */
|
||
|
|
100.0 /* maxdiff */
|
||
|
|
R_VOLTAGE /* conversion */
|
||
|
|
0.0 /* lower limit */
|
||
|
|
5000.0 /* upper limit */
|
||
|
|
MAX_REFRESH 3 15 /* 15 msec */
|
||
|
|
/begin DEPENDENT_CHARACTERISTIC
|
||
|
|
"sin(X1)"
|
||
|
|
ALPHA
|
||
|
|
/end DEPENDENT_CHARACTERISTIC
|
||
|
|
/begin VIRTUAL_CHARACTERISTIC
|
||
|
|
"sqrt(X1)"
|
||
|
|
B_AREA
|
||
|
|
/end VIRTUAL_CHARACTERISTIC
|
||
|
|
REF_MEMORY_SEGMENT Data1
|
||
|
|
/begin FUNCTION_LIST
|
||
|
|
NL_ADJUSTMENT
|
||
|
|
FL_ADJUSTMENT
|
||
|
|
SPEED_LIM
|
||
|
|
/end FUNCTION_LIST
|
||
|
|
/begin IF_DATA DIM
|
||
|
|
EXTERNAL
|
||
|
|
INDIRECT
|
||
|
|
/end IF_DATA
|
||
|
|
/begin AXIS_DESCR /* description of X-axis points */
|
||
|
|
STD_AXIS /* standard axis points */
|
||
|
|
N /* reference to input quantity */
|
||
|
|
CON_N /* conversion */
|
||
|
|
13 /* maximum number of axis points*/
|
||
|
|
0.0 /* lower limit */
|
||
|
|
5800.0 /* upper limit */
|
||
|
|
MAX_GRAD 20.0 /* X-axis: maximum gradient */
|
||
|
|
/end AXIS_DESCR
|
||
|
|
/begin AXIS_DESCR /* description of Y-axis points */
|
||
|
|
STD_AXIS /* standard axis points */
|
||
|
|
AMOUNT /* reference to input quantity */
|
||
|
|
CON_ME /* conversion */
|
||
|
|
17 /* maximum number of axis points*/
|
||
|
|
0.0 /* lower limit */
|
||
|
|
43.0 /* upper limit */
|
||
|
|
/end AXIS_DESCR
|
||
|
|
/end CHARACTERISTIC
|
||
|
|
|
||
|
|
/begin RECORD_LAYOUT DAMOS_KF
|
||
|
|
FNC_VALUES 7 SWORD COLUMN_DIR DIRECT
|
||
|
|
AXIS_PTS_X 3 SWORD INDEX_INCR DIRECT
|
||
|
|
AXIS_PTS_Y 6 UBYTE INDEX_INCR DIRECT
|
||
|
|
NO_AXIS_PTS_X 2 UBYTE
|
||
|
|
NO_AXIS_PTS_Y 5 UBYTE
|
||
|
|
SRC_ADDR_X 1 UBYTE
|
||
|
|
SRC_ADDR_Y 4 UBYTE
|
||
|
|
ALIGNMENT_BYTE 2
|
||
|
|
/end RECORD_LAYOUT
|
||
|
|
|
||
|
|
/begin COMPU_VTAB V_GEAR_BOX
|
||
|
|
//"variants of criterion ""Type of Gear Box"""
|
||
|
|
"variants of criterion Type of Gear Box"
|
||
|
|
TAB_VERB
|
||
|
|
3
|
||
|
|
17 "Limousine"
|
||
|
|
39 "Kombi"
|
||
|
|
41 "Cabrio"
|
||
|
|
DEFAULT_VALUE "unknown"
|
||
|
|
/end COMPU_VTAB
|
||
|
|
|
||
|
|
/begin VARIANT_CODING
|
||
|
|
VAR_SEPARATOR "." /* PUMKF.1 */
|
||
|
|
VAR_NAMING NUMERIC
|
||
|
|
|
||
|
|
/* variant criterion "Car body" with three variants */
|
||
|
|
/begin VAR_CRITERION Car
|
||
|
|
"Car body"
|
||
|
|
Limousine Kombi Cabrio
|
||
|
|
VAR_MEASUREMENT S_CAR
|
||
|
|
VAR_SELECTION_CHARACTERISTIC V_CAR
|
||
|
|
/end VAR_CRITERION
|
||
|
|
/* variant criterion "Type of gear box" with two variants */
|
||
|
|
/begin VAR_CRITERION Gear
|
||
|
|
"Type of gear box"
|
||
|
|
Manual Automatic
|
||
|
|
/end VAR_CRITERION
|
||
|
|
|
||
|
|
/begin VAR_FORBIDDEN_COMB /* forbidden: Limousine-Manual*/
|
||
|
|
Car Limousine
|
||
|
|
Gear Manual
|
||
|
|
/end VAR_FORBIDDEN_COMB
|
||
|
|
/begin VAR_FORBIDDEN_COMB /* forbidden: Cabrio-Automatic*/
|
||
|
|
Car Cabrio
|
||
|
|
Gear Automatic
|
||
|
|
/end VAR_FORBIDDEN_COMB
|
||
|
|
/begin VAR_CHARACTERISTIC
|
||
|
|
PUMKF /*define PUMKF as variant coded*/
|
||
|
|
Gear /* Gear box variants */
|
||
|
|
/begin VAR_ADDRESS
|
||
|
|
0x7140
|
||
|
|
0x7168
|
||
|
|
/end VAR_ADDRESS
|
||
|
|
/end VAR_CHARACTERISTIC
|
||
|
|
/begin VAR_CHARACTERISTIC
|
||
|
|
NLLM /*define NLLM as variant coded */
|
||
|
|
Gear Car
|
||
|
|
/* gear box including the 2 variants "Manual" and "Automatic" */
|
||
|
|
/* car body including the 3 variants "Limousine", "Kombi" and "Cabrio" */
|
||
|
|
|
||
|
|
/* four addresses corresponding to the four valid combinations */
|
||
|
|
/* of criterion 'Gear' and 'Car' (see example for VAR_CRITERION)*/
|
||
|
|
/begin VAR_ADDRESS
|
||
|
|
0x8840
|
||
|
|
0x8858
|
||
|
|
0x8870
|
||
|
|
0x8888
|
||
|
|
/end VAR_ADDRESS
|
||
|
|
/end VAR_CHARACTERISTIC
|
||
|
|
/end VARIANT_CODING
|
||
|
|
|
||
|
|
|
||
|
|
/end MODULE
|
||
|
|
|
||
|
|
/end PROJECT
|