R4A version of SocketCAN test port Signed-off-by: Lenard Nagy <lenard.nagy@ericsson.com>
diff --git a/README.md b/README.md index 7e94e9e..c475a24 100644 --- a/README.md +++ b/README.md
@@ -1,7 +1,4 @@ -# titan.TestPorts.SocketCANasp -# compiled with: Titan CRL 113 200/6 R5A -# GCC 7.3.0 Using OpenSSL 1.0.2n - +# titan.TestPorts.SocketCANasp Main project page: @@ -22,28 +19,33 @@ http://www.can-cia.de/fileadmin/resources/documents/proceedings/2012_hartkopp.pdf http://v2.can-newsletter.org/uploads/media/raw/46c15d02e1fdd3b04e671693ec548ff7.pdf -# See file: src/initscript.sh: +# See file: demo/initscript.sh: #-------------------------------------- #!/bin/bash + +# create a virtual can interface: + +sudo modprobe vcan +sudo ip link add dev vcan0 type vcan +sudo ip link set vcan0 up + +#!/bin/bash + # Add vcan module to kernel sudo modprobe vcan # Setup of virtual can vcan0 sudo ip link add dev vcan0 type vcan -# set it up at as a canfd can interface +# set it up at as a canfd capable can interface sudo ip link set vcan0 mtu 72 sudo ip link set vcan0 up -# Setup of virtual can vcan1 -sudo ip link add dev vcan1 type vcan -sudo ip link set vcan1 up +# or create a physical can interface +# sudo ip link set can0 up type can bitrate 1000000 -# example configuration of a physical can bus interface -#sudo ip link set can0 up type can bitrate 1000000 - -ifconfig +ip a #-------------------------------------- @@ -56,10 +58,12 @@ make clean; make ttcn3_start SocketCAN SocketCAN.cfg +or +ttcn3_start SocketCAN CAN_matrix_test.cfg or to run a certain testcase: -ttcn3_start SocketCAN SocketCAN.cfg SocketCANtest.tc_can_raw1 SocketCANtest.tc_can_bcm1 +ttcn3_start SocketCAN SocketCAN.cfg SocketCAN_RAW_test.tc_can_raw_send_and_receive_can_frame SocketCAN_RAW_test.tc_can_raw_setsockopt_CAN_RAW_FILTER Review the newly created log files in the src directory and use e.g. Wireshark to trace the CAN interfacce. @@ -78,16 +82,22 @@ test interfaces for each interface have to be defined in the MTC. -CAN RAW: - CAN and CANFD has been implemented and tested. - Depending on the availability of the C-code #define CANFD_SUPPORT - in src/SocketCAN_PT.cc CAN-FD support is enabled at compile time. - If you kernel does not have CANFD support comment out the #define CANFD_SUPPORT - the file "src/SocketCAN_PT.cc" + CAN FD has been implemented, however not been tested. + Depending on the availability of the C-code #define "CAN_FD_FRAME" + in /usr/include/linux/can/bcm.h, CAN-FD support is enabled at compile time. + The RAW setsockopt has path coverage. However no test coverage that insures + the setsockopt functionality provided by the kernel is working correctly. + For this purpose in the future might be added additional test cases. -CAN BCM: TX_SETUP, TX_DELETE have been tested, TX_READ is known to fail test cases. - The BCM has test coverage for TX_SETUP and TX_DELETE. + Some tests have indicated, that that SocketCAN BCM does not support concurrently + active BCM channels. + The BCM has test coverage for TX_SETUP and TX_DELETE. However no test coverage + that insures the BCM functionality provided by the kernel is working correctly. + For this purpose in the future might be added additional test cases. Return values other than the error code by the BCM are not yet supported. + BCM wth CAN FD frames has not been tested yet. -ISOTP: Iso TP functionality has been added, however currently no options like padding @@ -103,13 +113,45 @@ There is an endlessly running test case: ttcn3_start SocketCAN SocketCAN.cfg Isotptest.tc_Isotp_Example001 +-CAN J1939: +Configure CAN J1939 as following (requires Kernel 5.4 and compiled with can-j1939 kernel module): +sudo modprobe vcan +sudo ip link add vcan0 type vcan +sudo ip link set vcan0 up +sudo modprobe can-j1939 + +For the following test cases, the messages are so huge that screen output of the log file takes too long. +Thus comment out as following the following lines in J1939.cfg: +//FileMask := LOG_ALL | DEBUG | MATCHING +//ConsoleMask := LOG_ALL | DEBUG | MATCHING + +ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message +ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message_parallel + +Here above lines can be commented in: +ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_address_claim +ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_request_for_address_claimed + + + + -Merging of logfiles: To merge the logfies from multiple Parallel Test Componets (PTCs) from a - single run in timely order into sigle file, run in demo directory: - $ ./merge.sh - the merged and pretty printed log file is found in "demo/log_merged_pretty.txt" + single run in timely order into sigle file, run: + ttcn3_logmerge -o log_merged.txt *.log + The merged log-file is found at log_merged.txt - --Dunping CAN Frames using SocketCAN: + -Pretty printing the log file: + ttcn3_logformat -o log_merged_format.log log_merged.log + +-Dumping CAN Frames using SocketCAN: To dump all received can frames of e.g. "vcan0" run a seperate terminal: - $ candump "vcan0" + $ candump -td -d "vcan0" + +-Spying J1939 CAN-Frames using SocketCAN (only for SocketCAN J1939): + $ j1939spy -td -P -b 4193977 vcan0 + +- Runnung ttcn compiler and merging logs: + +rm *.log;make;ttcn3_start SocketCAN J1939.cfg J1939_Isobus_test.tc_can_j1939_IsobusVtEcuSimulation ;ttcn3_logmerge -o log_merged.log *.log;ttcn3_logformat -o log_merged_format.log log_merged.log;kate log_merged_format.log + 2004 history | grep ttcn
diff --git a/demo/Isobus.ttcn b/demo/Isobus.ttcn index 6c525f6..20b6702 100644 --- a/demo/Isobus.ttcn +++ b/demo/Isobus.ttcn
@@ -15,58 +15,27 @@ module Isobus { import from General_Types all -import from Can all import from IsobusCMMessageTypes all import from IsobusNMMessageTypes all import from IsobusVTMessageTypes all import from J1939 all -// Note: -// SocketCAN Error frames are not considered here -// SocketCAN RTR frames are not considered here -// SocketCAN Basic frames are not considered here - -external function encode_CAN_frame_j1939mod(in CAN_frame_j1939mod pdu) return octetstring +external function f_encode_J1939_message(in J1939_messageWithPGN pdu) return octetstring with { extension "prototype(convert) encode(RAW)" } -external function decode_CAN_frame_j1939mod(in octetstring data) return CAN_frame_j1939mod +external function f_decode_J1939_message(in octetstring data) return J1939_messageWithPGN with { extension "prototype(convert) decode(RAW)" } -const octetstring ISOBUS_PRIORITY_MASK := '1C000000'O; -const octetstring ISOBUS_RESERVED_MASK := '02000000'O; -const octetstring ISOBUS_DATAPAGE_MASK := '01000000'O; -const octetstring ISOBUS_PDUFORMAT_MASK := '00FF0000'O; -const octetstring ISOBUS_PDUSPECIFIC_MASK := '0000FF00'O; -const octetstring ISOBUS_SOURCEADDRESS_MASK := '000000FF'O; - type J1939_Priority Priority -type record J1939_header { // Error & RTR Frames are not considered here - //PGN pgn optional, - //BIT3 ignore, - Priority prio, - BIT1 res, - BIT1 dp, - OCT1 pf, - OCT1 ps, - SourceAddress sa -} with { variant "FIELDORDER(msb)" } +type record J1939PDU_with_NAME +{ + J1939_ADDR addr, + J1939_NAME name, + J1939_messageWithPGN pdu +} with {variant "" }; - -type record J1939mod { // Error & RTR Frames are not considered here - //PGN pgn optional, - //BIT3 ignore, - Priority prio, - BIT1 res, - BIT1 dp, - OCT1 pf, - OCT1 ps, - SourceAddress sa, - OCT3 comp -} with { variant "FIELDORDER(msb)" } - - -type union AnyIsoBusPdu { +type union Isobus_message { ETP_DT etp_dt, // extended TP data transfer ETP_CM etp_cm, // extended TP connection management VT2ECU vt2ecu, // Message Virtual Terminal (VT) to ECU @@ -75,240 +44,35 @@ TP_DT tp_dt, // TP data transfer TP_CM tp_cm, // TP connection management NetworkMessage networkMessage, // Network Message according ISO 11873-4 - CannotClaimSourceAddress cannotClaimSourceAddress, - AddressClaimed addressClaimed, + //CannotClaimSourceAddress cannotClaimSourceAddress, + //AddressClaimed addressClaimed, + AddressClaimed addressClaimedOrCannotClaimSourceAddress, CommandedAddress commandedAddress // other upper layer isobus protocols like Task Comtroller are added here ... } with { variant "" } -type record CAN_frame_j1939 { - J1939_header can_j1939, - AnyIsoBusPdu can_pdu -}with { variant "" } - -type record CAN_frame_j1939mod { - J1939mod can_j1939, - AnyIsoBusPdu can_pdu -}with { - variant (can_pdu) "CROSSTAG( - etp_dt, can_j1939.comp = 'C70000'O; //199 - etp_cm, can_j1939.comp = 'C80000'O; //200 - vt2ecu, can_j1939.comp = 'E60000'O; //230 - ecu2vt, can_j1939.comp = 'E70000'O; //231 - requestForAddressClaimed, can_j1939.comp = 'EA0000'O; //234 - tp_dt, can_j1939.comp = 'EB0000'O; //235 - tp_cm, can_j1939.comp = 'EC0000'O; //236 - networkMessage, can_j1939.comp = 'ED0000'O; //237 - cannotClaimSourceAddress, can_j1939.comp = 'EEFFFE'O; //238 all and conjuction needed!!!!!! - addressClaimed, can_j1939.comp = 'EEFF00'O; //238 all and conjuction needed!!!!!! - commandedAddress, can_j1939.comp = 'FED800'O)" //254 all and conjuction needed!!!!!! +type record J1939_messageWithPGN { +J1939_PGN pgn, +Isobus_message pdu } - -function j1939frame2can(in CAN_frame_j1939 p_can_frame_j1939, in Priority p_priority, in DestinationAddress p_da, in SourceAddress p_sa) return CAN_frame { - var CAN_frame v_can_frame - v_can_frame.can_id := pdu1_j1939id2canid(p_can_frame_j1939.can_j1939, p_priority, p_da, p_sa) - // v_can_frame.can_pdu := encode_AnyIsoBusPdu(p_can_frame_j1939.can_pdu) - v_can_frame.can_pdu := substr(f_encode_CAN_frame_j1939(p_can_frame_j1939),0,3)//strip 3 byte header - return v_can_frame -} - -function pdu1_j1939id2canid(in J1939_header p_j1939, in Priority p_priority, in DestinationAddress p_da, in SourceAddress p_sa) return CAN_id{ - var CAN_id v_can_id - v_can_id := bit2oct(oct2bit(p_sa) or4b (oct2bit(p_da) << 8) or4b (oct2bit(p_j1939.pf) << 16) or4b ((p_j1939.dp) << 24) or4b - ((p_j1939.res) << 25) or4b (int2bit(p_priority, 32) << 26)) - return v_can_id -} - -/* -function j1939id2canid(in J1939 p_j1939) return CAN_id{ -var CAN_id v_can_id -v_can_id := (p_j1939.sa << 0) or4b (p_j1939.ps << 8) or4b (p_j1939.pf << 16) or4b bit2oct(p_j1939.dp << 24) or4b -bit2oct(p_j1939.res << 25) or4b bit2oct(p_j1939.prio << 26) -return v_can_id -} -*/ - -function j1939id2canid(in J1939_header p_j1939) return CAN_id{ - var CAN_id v_can_id - v_can_id := int2oct( - oct2int(p_j1939.sa) + oct2int(p_j1939.ps)*256 + oct2int(p_j1939.pf) * 256 * 256 + - bit2int(p_j1939.dp) * 256 * 256 * 256 + bit2int(p_j1939.res) * 256 * 256 * 256 * 2 + - p_j1939.prio * 256 * 256 * 256 * 2 * 2, - 4 ) - return v_can_id -} - -//--------------------------------------------------------------------------------------- -function can2j1939frame(CAN_frame p_can_frame) return CAN_frame_j1939 { - //--------------------------------------------------------------------------------------- - var CAN_frame_j1939 v_can_frame_j1939 - - //log("can_id", p_can_frame.can_id) - //log("can_pdu", p_can_frame.can_pdu) - - v_can_frame_j1939:=f_decode_CAN_frame_j1939(p_can_frame.can_id& p_can_frame.can_pdu) - - //log("Higher layer octet pdustring: ", v_can_frame_j1939) - return v_can_frame_j1939 -} - -function canid2j1939(in CAN_id p_can_id) return J1939_header { - //--------------------------------------------------------------------------------------- - - var bitstring v_can_id_bitstring:= oct2bit(p_can_id) - var J1939_header v_j1939 - - v_j1939.prio :=bit2int(substr(v_can_id_bitstring, 0, 6)); //3 ,3 - v_j1939.res :=v_can_id_bitstring[6]; - v_j1939.dp :=v_can_id_bitstring[7]; - v_j1939.pf :=p_can_id[1];//(p_can_id and4b ISOBUS_PDUFORMAT_MASK) >> 2 // shift 16 bits = 2 octets - v_j1939.ps :=p_can_id[2];// (p_can_id and4b ISOBUS_PDUSPECIFIC_MASK) >> 1 // shift 8 bits = 1 octet - v_j1939.sa :=p_can_id[3];//(p_can_id and4b ISOBUS_SOURCEADDRESS_MASK) - - return v_j1939 -} - -//********************************************************************************- - - - -//--------------------------------------------------------------------------- -function f_insert_aux_hdr(in octetstring p_os) return octetstring -//--------------------------------------------------------------------------- -{ - var OCT3 v_os - - - v_os[0]:=p_os[1];//pf - if(p_os[1] == 'FE'O) - { - if (p_os[2]=='D8'O) {v_os[1]:='D8'O;v_os[2]:='00'O;} - } - - else if(p_os[1] == 'EE'O) - { - if (p_os[2] == 'FF'O) - { if (p_os[3]=='FE'O) {v_os[1]:='FF'O;v_os[2]:='FE'O;} - else {v_os[1]:='FF'O;v_os[2]:='00'O;} - } - - } - - - else { v_os[1]:='00'O;v_os[2]:='00'O;} - - - //log("replace(p_os,4,0,v_os) :",replace(p_os,4,0,v_os)) - - return replace(p_os,4,0,v_os)//insert aux header -} - -//--------------------------------------------------------------------------- -function f_remove_aux_hdr(in octetstring p_os) return octetstring -//--------------------------------------------------------------------------- -{ - //log("p_os :",p_os) - - - p_os[1]:=p_os[4]; //pf := aux[0]; - if (p_os[4] == 'EE'O) - { - if (p_os[6] == 'FE'O ) { //'EEFFFE' O - p_os[2]:=p_os[5]; //ps := aux[1]; - p_os[3]:=p_os[6]; //sa := aux[2]; - } - else { //'EEFFXX'O - p_os[2]:=p_os[5]; //ps := aux[1]; - } - } - else if (p_os[4] == 'FE'O) //'FED8XX'O - { - p_os[2]:=p_os[5]; //ps := aux[1]; - } - - - //log("p_os :",p_os) - - //log("replace(p_os,4,3,''O) :",replace(p_os,4,3,''O)) - return replace(p_os,4,3,''O); //remove aux header -} - -//--------------------------------------------------------------------------- -function f_map_mod2frame(in CAN_frame_j1939mod p_frame) return CAN_frame_j1939 -//--------------------------------------------------------------------------- -{ - var CAN_frame_j1939 v_CAN_frame_j1939 - - v_CAN_frame_j1939.can_pdu:=p_frame.can_pdu; - v_CAN_frame_j1939.can_j1939.prio:=p_frame.can_j1939.prio; - v_CAN_frame_j1939.can_j1939.res:=p_frame.can_j1939.res; - v_CAN_frame_j1939.can_j1939.dp:=p_frame.can_j1939.dp; - v_CAN_frame_j1939.can_j1939.pf:=p_frame.can_j1939.pf; - v_CAN_frame_j1939.can_j1939.ps:=p_frame.can_j1939.ps; - v_CAN_frame_j1939.can_j1939.sa:=p_frame.can_j1939.sa; - - - //log("v_CAN_frame_j1939 :",v_CAN_frame_j1939) - return v_CAN_frame_j1939 - -} - - -//--------------------------------------------------------------------------- -function f_map_frame2mod(in CAN_frame_j1939 p_frame) return CAN_frame_j1939mod -//--------------------------------------------------------------------------- -{ - var CAN_frame_j1939mod v_CAN_frame_j1939mod - - - v_CAN_frame_j1939mod.can_pdu:=p_frame.can_pdu; - v_CAN_frame_j1939mod.can_j1939.prio:=p_frame.can_j1939.prio; - v_CAN_frame_j1939mod.can_j1939.res:=p_frame.can_j1939.res; - v_CAN_frame_j1939mod.can_j1939.dp:=p_frame.can_j1939.dp; - v_CAN_frame_j1939mod.can_j1939.pf:=p_frame.can_j1939.pf; - v_CAN_frame_j1939mod.can_j1939.ps:=p_frame.can_j1939.ps; - v_CAN_frame_j1939mod.can_j1939.sa:=p_frame.can_j1939.sa; - if (p_frame.can_j1939.pf == 'EE'O) - { - if (p_frame.can_j1939.ps == 'D8'O) { - v_CAN_frame_j1939mod.can_j1939.comp := p_frame.can_j1939.pf&p_frame.can_j1939.ps&'00'O; - } else if (p_frame.can_j1939.ps == 'FF'O) { - if (p_frame.can_j1939.sa == 'FE'O) { - v_CAN_frame_j1939mod.can_j1939.comp := p_frame.can_j1939.pf&p_frame.can_j1939.ps&p_frame.can_j1939.sa - } else {//?? - v_CAN_frame_j1939mod.can_j1939.comp:=p_frame.can_j1939.pf&'0000'O; - } - } else {//?? - v_CAN_frame_j1939mod.can_j1939.comp:=p_frame.can_j1939.pf&'0000'O; - } - } else { - v_CAN_frame_j1939mod.can_j1939.comp := p_frame.can_j1939.pf&'0000'O; - } - //log("v_CAN_frame_j1939mod :",v_CAN_frame_j1939mod) - return v_CAN_frame_j1939mod; -} - - - -//--------------------------------------------------------------------------- -function f_encode_CAN_frame_j1939(in CAN_frame_j1939 pdu) return octetstring -//--------------------------------------------------------------------------- -{ - - return f_remove_aux_hdr(encode_CAN_frame_j1939mod(f_map_frame2mod(pdu))) - - -} -//--------------------------------------------------------------------------- -function f_decode_CAN_frame_j1939(in octetstring data) return CAN_frame_j1939 -//--------------------------------------------------------------------------- -{ - log("f_insert_aux_hdr(data)", f_insert_aux_hdr(data)); - return f_map_mod2frame(decode_CAN_frame_j1939mod(f_insert_aux_hdr(data))) - - +with { + variant (pdu) "CROSSTAG( + etp_dt, pgn = '00C700'O; //199 + etp_cm, pgn = '00C800'O; //200 + vt2ecu, pgn = '00E600'O; //230 + ecu2vt, pgn = '00E700'O; //231 + requestForAddressClaimed, pgn = '00EA00'O; //234 + tp_dt, pgn = '00EB00'O; //235 + tp_cm, pgn = '00EC00'O; //236 + networkMessage, pgn = '00ED00'O; //237 + // cannotClaimSourceAddress, pgn = '00EEFFFE'O; //238 where the SA is 'FE'O + // addressClaimed, pgn = '00EEFFXX'O; //238 where the SA is XX != FE! + addressClaimedOrCannotClaimSourceAddress, pgn = '00EEFF'O; //238, the SA determies + // if it is addressClaimed (SA != 'FE'O) + // or it is cannotClaimSourceAddress (SA == 'FE'O) + commandedAddress, pgn = '00FED8'O)" //254 }
diff --git a/demo/IsobusMessageTypes.ttcn b/demo/IsobusMessageTypes.ttcn index e706f17..794f35d 100644 --- a/demo/IsobusMessageTypes.ttcn +++ b/demo/IsobusMessageTypes.ttcn
@@ -9,8 +9,7 @@ type integer INT24nb (0..16777215) with { variant "FIELDLENGTH(24), COMP(nosign), BYTEORDER(last)" }; type INT24nb PGN -type bitstring BIT21 length(21) with { variant "FIELDLENGTH(21)" }; - + type integer INT2 (0..65535) with { variant "FIELDLENGTH(16)" };
diff --git a/demo/IsobusNMMessageTypes.ttcn b/demo/IsobusNMMessageTypes.ttcn index 3a4ed24..c110803 100644 --- a/demo/IsobusNMMessageTypes.ttcn +++ b/demo/IsobusNMMessageTypes.ttcn
@@ -5,6 +5,7 @@ module IsobusNMMessageTypes { +import from J1939 all import from General_Types all import from IsobusMessageTypes all @@ -20,39 +21,22 @@ variant "FIELDLENGTH(6)" } -type BIT1 SelfConfigurableAddressBits -type BIT3 IndustryGroupBits -type BIT4 DeviceClassInstanceBits -type BIT7 DeviceClassBits -type BIT1 ReservedBits -type BIT8 FunctionBits -type BIT5 FunctionInstanceBits -type BIT3 ECUInstanceBits -type BIT11 ManufacturerCodeBits -type BIT21 IdentityNumberBits -type record NAME { - SelfConfigurableAddressBits selfConfigurableAddressValue, - IndustryGroupBits industryGroupValue, - DeviceClassInstanceBits deviceClassInstanceValue, - DeviceClassBits deviceClassValue, - ReservedBits reserveValued, - FunctionBits functionValue, - FunctionInstanceBits functionInstanceValue, - ECUInstanceBits ecuInstancceValue, - ManufacturerCodeBits manufacturerCodeValue, - IdentityNumberBits identityNumberBits -} with { variant "FIELDORDER(msb)" } + type record CannotClaimSourceAddress { - NAME name + J1939_NAME_RECORD_REVERSE_BYTE_ENCODING name + // or alternatively + // J1939_NAME name } with { variant "" } type record AddressClaimed { - NAME name + J1939_NAME_RECORD_REVERSE_BYTE_ENCODING name + // or alternatively + // J1939_NAME name } with { variant "" } type record RequestForAddressClaimed { @@ -62,8 +46,10 @@ type record CommandedAddress { - NAME name, - SourceAddress newSourceAddress + J1939_NAME_RECORD_REVERSE_BYTE_ENCODING name, + // or alternatively + // J1939_NAME name + SourceAddress newSourceAddress } with { variant "" } // --------- NetworkMessage ------------- @@ -129,7 +115,7 @@ { INT1 maxTransferRate, PGN pgn, - NAME name, + J1939_NAME name, OCT8 nameQualifier } with {variant "" }; @@ -178,7 +164,7 @@ type record SA_NAME_pair { SourceAddress sourceAddress, - NAME name + J1939_NAME name } with {variant "" }; type record N_NTX_Response @@ -327,7 +313,7 @@ { Function msgFunction (192), PortPair portPair, - NAME nameOfCF + J1939_NAME nameOfCF } with { variant "" } @@ -335,7 +321,7 @@ { Function msgFunction (193), PortPair portPair, - NAME nameOfCF + J1939_NAME nameOfCF } with { variant "" }
diff --git a/demo/IsobusVTMessageTypes.ttcn b/demo/IsobusVTMessageTypes.ttcn index ab0edba..b127d80 100644 --- a/demo/IsobusVTMessageTypes.ttcn +++ b/demo/IsobusVTMessageTypes.ttcn
@@ -3,16 +3,6 @@ import from General_Types all import from IsobusMessageTypes all -external function encode_VT2ECU(in VT2ECU pdu) return octetstring -with { extension "prototype(convert) encode(RAW)" } -external function decode_VT2ECU(in octetstring data) return VT2ECU -with { extension "prototype(convert) decode(RAW)" } - -external function encode_ECU2VT(in ECU2VT pdu) return octetstring -with { extension "prototype(convert) encode(RAW)" } -external function decode_ECU2VT(in octetstring data) return ECU2VT -with { extension "prototype(convert) decode(RAW)" } - type INT1 VTfunction type integer AnyObjectID (0..65535) with { variant "FIELDLENGTH(16)" }; // includes also 65535 as no object @@ -62,9 +52,8 @@ e_SoftKeyActivationReq_KeyAactivationCode keyActivationCode, ValidObjectID objectID, ValidObjectID parentObjectID, - KeyNumberType keyNumber, - OCT1 reserved8 ('FF'O) -} with {variant "" }; + KeyNumberType keyNumber +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record SoftKeyActivationRes { @@ -72,9 +61,8 @@ e_SoftKeyActivationReq_KeyAactivationCode keyActivationCode, ValidObjectID objectID, ValidObjectID parentObjectID, - KeyNumberType keyNumber, - OCT1 reserved8 ('FF'O) -} with {variant "" }; + KeyNumberType keyNumber +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_ButtonActivationReq_KeyAactivationCode { buttonHasBeenUnlatchedorReleased (0), @@ -89,9 +77,8 @@ e_ButtonActivationReq_KeyAactivationCode keyAactivationCode, ValidObjectID objectID, ValidObjectID parentObjectID, - KeyNumberType buttonKeyCode, - OCT1 reserved8 ('FF'O) -} with {variant "" }; + KeyNumberType buttonKeyCode +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_ButtonActivationRes_KeyAactivationCode { buttonHasBeenUnlatchedorReleased (0), @@ -106,9 +93,8 @@ e_ButtonActivationRes_KeyAactivationCode keyAactivationCode, ValidObjectID objectID, ValidObjectID parentObjectID, - KeyNumberType buttonKeyCode, - OCT1 reserved8 ('FF'O) -} with {variant "" }; + KeyNumberType buttonKeyCode +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_PointingEvent_touchState { released (0), // version 4 and later @@ -121,19 +107,15 @@ VTfunction vtfunction (2), PositionType x_position, PositionType y_position, - e_PointingEvent_touchState touchState, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_PointingEvent_touchState touchState +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record PointingEventRes { VTfunction vtfunction (2), PositionType x_position, PositionType y_position, - e_PointingEvent_touchState touchState, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_PointingEvent_touchState touchState +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_VTOnUserLayoutHideShow_state { hidden (0), @@ -175,61 +157,41 @@ VTfunction vtfunction (3), ValidObjectID objectID, e_VTSelectInputObject_selection selection, - VTSelectInputObject_Bitmask bitmask, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + VTSelectInputObject_Bitmask bitmask +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTSelectInputObjectReq_v3AndPrior { VTfunction vtfunction (3), ValidObjectID objectID, - e_VTSelectInputObject_selection selection, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_VTSelectInputObject_selection selection +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTSelectInputObjectReq_v4AndLater { VTfunction vtfunction (3), ValidObjectID objectID, e_VTSelectInputObject_selection selection, - VTSelectInputObject_v4AndLater_Bitmask bitmask, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + VTSelectInputObject_v4AndLater_Bitmask bitmask +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTSelectInputObjectRes { VTfunction vtfunction (3), ValidObjectID objectID, e_VTSelectInputObject_selection selection, - VTSelectInputObject_Bitmask bitmask, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + VTSelectInputObject_Bitmask bitmask +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTSelectInputObjectRes_v4AndPrior { VTfunction vtfunction (3), ValidObjectID objectID, - e_VTSelectInputObject_selection selection, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_VTSelectInputObject_selection selection +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTSelectInputObjectRes_v5AndLater { VTfunction vtfunction (3), ValidObjectID objectID, e_VTSelectInputObject_selection selection, - VTSelectInputObject_v4AndLater_Bitmask bitmask, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + VTSelectInputObject_v4AndLater_Bitmask bitmask +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTESC_ErrorCodes{ boolean noInputFieldIsSelected, @@ -247,22 +209,13 @@ type record VTESCReq { VTfunction vtfunction (4), AnyObjectID objectID, // Object ID where input was aborted if no error code - VTESC_ErrorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + VTESC_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTESCRes { VTfunction vtfunction (4), - AnyObjectID objectID, // Object ID where input was aborted if no error code - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + AnyObjectID objectID // Object ID where input was aborted if no error code +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTChangeNumericValueReq { @@ -304,13 +257,8 @@ type record VTChangeActiveMaskRes { VTfunction vtfunction (6), - ValidObjectID activeMaskObjectID, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ValidObjectID activeMaskObjectID +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTChangeSoftKeyMaskErrorCodes{ @@ -330,20 +278,15 @@ VTfunction vtfunction (7), ValidObjectID dataOrAlarmMaskObjectID, ValidObjectID softKeyMaskObjectID, - VTChangeSoftKeyMaskErrorCodes errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTChangeSoftKeyMaskErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTChangeSoftKeyMaskRes { VTfunction vtfunction (7), ValidObjectID dataOrAlarmMaskObjectID, - ValidObjectID softKeyMaskObjectID, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ValidObjectID softKeyMaskObjectID +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTChangeStringValueReq { @@ -361,11 +304,8 @@ VTfunction vtfunction (8), OCT1 reserved2 ('FF'O), OCT1 reserved3 ('FF'O), - ValidObjectID inputStringOrStringVariableObjectID, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ValidObjectID inputStringOrStringVariableObjectID +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTOnUserLayoutHideShowReq { @@ -373,9 +313,9 @@ ValidObjectID objectID1, e_VTOnUserLayoutHideShow_state state1, AnyObjectID objectID2, - e_VTOnUserLayoutHideShow_state state2, // If the previous attribute is the NULL Object ID, this bit shall be set to false. - OCT1 reserved8 ('FF'O) -} with { variant "" }; + e_VTOnUserLayoutHideShow_state state2 // If the previous attribute is the NULL Object ID, this bit shall be set to false. + +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTOnUserLayoutHideShowRes { @@ -383,9 +323,8 @@ ValidObjectID objectID1, e_VTOnUserLayoutHideShow_state state1, AnyObjectID objectID2, - e_VTOnUserLayoutHideShow_state state2, // If the previous attribute is the NULL Object ID, this bit shall be set to false. - OCT1 reserved8 ('FF'O) -} with { variant "" }; + e_VTOnUserLayoutHideShow_state state2 // If the previous attribute is the NULL Object ID, this bit shall be set to false. +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTControlAudioSignalTerminationParameterTerminationCause { @@ -404,14 +343,8 @@ type record VTControlAudioSignalTerminationInd // version V4 or higher { VTfunction vtfunction (10), - VTControlAudioSignalTerminationParameterTerminationCause terminationCause, - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTControlAudioSignalTerminationParameterTerminationCause terminationCause +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type octetstring ObjectPoolRecords with { variant "" }; @@ -423,15 +356,8 @@ type record EndOfObjectPoolReq { - VTfunction vtfunction (18), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (18) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record EndOfObjectPoolResErrorCodes { @@ -465,9 +391,8 @@ EndOfObjectPoolResErrorCodes errorCodes, AnyObjectID parentObjectIDoFaultyObject, // set to NULL Object ID if there are no AnyObjectID objectIDofFaultyObject, // set to NULL Object ID if there are no - EndOfObjectPoolResObjectPoolErrorCodes objectPoolErrorCodes, - OCT1 reserved8 ('FF'O) -} with { variant "" }; + EndOfObjectPoolResObjectPoolErrorCodes objectPoolErrorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTfunction32VT2ECU { @@ -552,15 +477,8 @@ type record ESCreq { - VTfunction vtfunction (146), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (146) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ESCerrorCodes { @@ -595,12 +513,8 @@ { VTfunction vtfunction (160), ValidObjectID objectID, - e_HideShowObject_state hideShow, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_HideShowObject_state hideShow +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record HideShowObjectRes_errorCodes{ boolean referencesToMissingObjects, @@ -619,11 +533,8 @@ VTfunction vtfunction (160), ValidObjectID objectID, e_HideShowObject_state hideShow, - HideShowObjectRes_errorCodes errorCodes, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + HideShowObjectRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record VTfunction161VT2ECU { @@ -646,12 +557,8 @@ { VTfunction vtfunction (161), ValidObjectID objectID, - e_EnableDisableObject_DisableEnable DisableEnable, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_EnableDisableObject_DisableEnable DisableEnable +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record EnableDisableObjectRes_errorCodes { boolean reserved0 (false), @@ -670,11 +577,8 @@ VTfunction vtfunction (161), ValidObjectID objectID, e_EnableDisableObject_DisableEnable DisableEnable, - EnableDisableObjectRes_errorCodes errorCodes, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + EnableDisableObjectRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} @@ -688,12 +592,8 @@ type record SelectInputObjectReq{ VTfunction vtfunction (162), AnyObjectID objectID, - e_SelectInputObjectReq_Option option, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_SelectInputObjectReq_Option option +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_SelectInputObjectRes_Response { objectReferencedByObjectIDisNotSelectedOrObjectIDisTheNULLobject (0), @@ -716,12 +616,8 @@ type record SelectInputObjectRes{ VTfunction vtfunction (162), AnyObjectID objectID, - e_SelectInputObjectRes_Response response, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + e_SelectInputObjectRes_Response response +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ControlAudioSignalReq{ VTfunction vtfunction (163), @@ -751,25 +647,14 @@ type record ControlAudioSignalRes{ VTfunction vtfunction (163), - ControlAudioSignalRes_ErrorCodes errorCodes, - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + ControlAudioSignalRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record SetAudioVolumeReq { VTfunction vtfunction (164), - PercentType volumeInPercent, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + PercentType volumeInPercent +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record SetAudioVolumeErrorCodes { @@ -787,14 +672,8 @@ type record SetAudioVolumeRes { VTfunction vtfunction (164), - SetAudioVolumeErrorCodes errorCodes, - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + SetAudioVolumeErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeChildLocationReq { @@ -802,9 +681,8 @@ ValidObjectID parentObjectID, ValidObjectID objectIDofObjectToMove, DeltaPositionType relativeChangeInXposition, - DeltaPositionType relativeChangeInYposition, - OCT1 reserved8 ('FF'O) -} with { variant "" }; + DeltaPositionType relativeChangeInYposition +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeChildLocationRes_errorCodes { @@ -824,19 +702,16 @@ VTfunction vtfunction (165), ValidObjectID parentObjectID, ValidObjectID objectIDofObjectToMove, - ChangeChildLocationRes_errorCodes errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeChildLocationRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeSizeReq { VTfunction vtfunction (166), ValidObjectID objectIDofObjectToSize, WidthType newWidth, - HeightType newHeight, - OCT1 reserved8 ('FF'O) -} with { variant "" }; + HeightType newHeight +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeSizeRes_errorCodes @@ -856,23 +731,15 @@ { VTfunction vtfunction (166), ValidObjectID objectIDofObjectToSize, - ChangeSizeRes_errorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeSizeRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeBackgroundColourReq { VTfunction vtfunction (167), ValidObjectID objectIDofObjectToChange, - ColorType newBackgroundColour, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ColorType newBackgroundColour +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeBackgroundColourRes_errorCodes { boolean invalidObjectID, @@ -891,11 +758,8 @@ VTfunction vtfunction (167), ValidObjectID objectIDofObjectToChange, ColorType newBackgroundColour, - ChangeBackgroundColourRes_errorCodes errorCodes, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeBackgroundColourRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeNumericValueReq{ VTfunction vtfunction (168), @@ -940,12 +804,8 @@ { VTfunction vtfunction (169), ValidObjectID objectID, - ChangeEndPointRes_errorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeEndPointRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} @@ -980,12 +840,8 @@ { VTfunction vtfunction (170), ValidObjectID objectID, - ChangeFontAttributesRes_errorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeFontAttributesRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeFontAttributesReq { @@ -994,9 +850,8 @@ ColorType fontColour, FontSize fontSize, FontType fontType, - FontStyle fontStyle, - OCT1 reserved8 ('FF'O) -} with { variant "" }; + FontStyle fontStyle +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeLineAttributesRes_errorCodes { @@ -1015,12 +870,8 @@ { VTfunction vtfunction (171), ValidObjectID objectID, - ChangeLineAttributesRes_errorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeLineAttributesRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeLineAttributesReq { @@ -1028,9 +879,8 @@ ValidObjectID ObjectIDofObjectToChange, ColorType lineColour, LineWidth lineWidth, - LineArt LineArt, - OCT1 reserved8 ('FF'O) -} with { variant "" }; + LineArt LineArt +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeFillAttributesRes_errorCodes { @@ -1049,12 +899,8 @@ { VTfunction vtfunction (172), ValidObjectID objectID, - ChangeFillAttributesRes_errorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeFillAttributesRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeFillAttributesReq { @@ -1063,19 +909,15 @@ ColorType lineColour, LineWidth lineWidth, LineArt lineArt, - ValidObjectID fillPatternObjectID, - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ValidObjectID fillPatternObjectID +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeActiveMaskReq { VTfunction vtfunction (173), ValidObjectID workingSetObjectID, - ValidObjectID newActiveMaskObjectID, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + ValidObjectID newActiveMaskObjectID +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeActiveMaskRes_errorCodes { boolean invalidWorkingSetObjectID, @@ -1092,13 +934,8 @@ type record ChangeActiveMaskRes { VTfunction vtfunction (173), - ValidObjectID newActiveMaskObjectID, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} -with {variant "" }; + ValidObjectID newActiveMaskObjectID +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_ChangeSoftKeyMaskReq_MaskType { Data (1), @@ -1110,10 +947,8 @@ VTfunction vtfunction (174), e_ChangeSoftKeyMaskReq_MaskType maskType, ValidObjectID DataOrAlarmMaskObjectID, - ValidObjectID NewSoftKeyMaskObjectID, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O)} -with {variant "" }; + ValidObjectID NewSoftKeyMaskObjectID + } with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeSoftKeyMaskRes_errorCodes { boolean invalidDataOrAlarmMaskObjectID, @@ -1132,9 +967,8 @@ VTfunction vtfunction (174), ValidObjectID DataOrAlarmMaskObjectID, ValidObjectID NewSoftKeyMaskObjectID, - ChangeSoftKeyMaskRes_errorCodes errorCodes, - OCT1 reserved8 ('FF'O)} -with {variant "" }; + ChangeSoftKeyMaskRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeAttributeReq { @@ -1162,12 +996,8 @@ VTfunction vtfunction (175), ValidObjectID objectID, AttributeID attributeID, - ChangeAttributeRes_errorCodes errorCodes, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} -with {variant "" }; + ChangeAttributeRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangePriorityRes_errorCodes { boolean invalidObjectID, @@ -1186,20 +1016,15 @@ VTfunction vtfunction (176), ValidObjectID objectIDofArlarmMask, Priority newPriority, - ChangePriorityRes_errorCodes errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangePriorityRes_errorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangePriorityReq { VTfunction vtfunction (176), ValidObjectID objectIDofArlarmMask, - Priority newPriority, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + Priority newPriority +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeListItemRes_errorCodes { boolean invalidObjectID, // Invalid Input List object ID or Output List object ID , @@ -1220,9 +1045,8 @@ ValidObjectID objectID, // of an Input List object, Output List object, Animation object, // or External Object Definition object Index listIndex, // (items are numbered 0-n) - AnyObjectID newObjectID, // or 0xFFFF to set empty item - OCT1 reserved8 ('FF'O) -} with { variant "" }; + AnyObjectID newObjectID // or 0xFFFF to set empty item +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeListItemReq { @@ -1230,22 +1054,13 @@ ValidObjectID objectID, // of an Input List object, Output List object, Animation object, // or External Object Definition object Index listIndex, // (items are numbered 0-n) - AnyObjectID newObjectID, // or 0xFFFF to set empty item - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + AnyObjectID newObjectID // or 0xFFFF to set empty item +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record DeleteObjectPoolReq { - VTfunction vtfunction (178), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + VTfunction vtfunction (178) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record DeleteObjectPoolRes_ErrorCodes { boolean deletionError, @@ -1261,14 +1076,8 @@ type record DeleteObjectPoolRes { VTfunction vtfunction (178), - DeleteObjectPoolRes_ErrorCodes errorCodes, - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + DeleteObjectPoolRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeStringValueReq { @@ -1300,10 +1109,8 @@ OCT1 reserved2 ('FF'O), OCT1 reserved3 ('FF'O), ValidObjectID objectID, - ChangeStringValueRes_ErrorCodes errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with {variant "" }; + ChangeStringValueRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeChildPositionReq { @@ -1351,14 +1158,8 @@ type record ChangeObjectLabelRes { VTfunction vtfunction (181), - ChangeObjectLabelRes_ErrorCodes errorCodes, - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangeObjectLabelRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangeObjectLabelReq { @@ -1393,13 +1194,8 @@ { VTfunction vtfunction (182), ValidObjectID objectIDofTheOutputPolygonObjectToChange, - ChangePolygonPointRes_ErrorCodes errorCodes, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ChangePolygonPointRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ChangePolygonPointReq { @@ -1439,9 +1235,8 @@ VTfunction vtfunction (183), ValidObjectID objectIDofaOutputPolygonObjectToScale, WidthType newWidthAttribute, - HeightType newHeightAttribute, - OCT1 reserved8 ('FF'O) -} with { variant "" }; + HeightType newHeightAttribute +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record GraphicsContextRes_ErrorCodes { boolean invalidObjectIDorObjectIsNotAGraphics, @@ -1460,11 +1255,8 @@ VTfunction vtfunction (184), ValidObjectID objectIDofAGraphicsContextObject, INT1 subcommandID, - GraphicsContextRes_ErrorCodes errorCodes, - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + GraphicsContextRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record SetGraphicsCursor { @@ -1694,12 +1486,8 @@ { VTfunction vtfunction (185), ValidObjectID objectID, - AttributeID AttributeIDofTheObject, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + AttributeID AttributeIDofTheObject +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record SelectColourMapRes_ErrorCodes { boolean invalidObjectID, @@ -1717,48 +1505,25 @@ { VTfunction vtfunction (186), ValidObjectID objectIDofTheColourMapObject, - SelectColourMapRes_ErrorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + SelectColourMapRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record SelectColourMapReq { VTfunction vtfunction (186), - ValidObjectID ObjectIDofTheColourMapObjectOrFFFFtoRestoreTheDefaultColourTable, + ValidObjectID ObjectIDofTheColourMapObjectOrFFFFtoRestoreTheDefaultColourTable // (See A.3 VT standard colour palette) - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record IdentifyVTRes { - VTfunction vtfunction (187), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (187) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record IdentifyVTReq { - VTfunction vtfunction (187), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (187) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExecuteExtendedMacroRes_ErrorCodes { boolean objectIDdoesNotExist, @@ -1776,23 +1541,14 @@ { VTfunction vtfunction (188), ValidObjectID ObjectIDofMacroObject, - ExecuteExtendedMacroRes_ErrorCodes errorCodes, - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ExecuteExtendedMacroRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExecuteExtendedMacroReq { VTfunction vtfunction (188), - ValidObjectID ObjectIDofMacroObject, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ValidObjectID ObjectIDofMacroObject +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record LockUnlockMaskRes_ErrorCodes { @@ -1811,13 +1567,8 @@ { VTfunction vtfunction (189), e_LockUnlockMaskReqCommand command, - LockUnlockMaskRes_ErrorCodes errorCodes, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + LockUnlockMaskRes_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_LockUnlockMaskReqCommand { unlockDataMaskOrUserLayoutDataMask (0), @@ -1830,10 +1581,8 @@ VTfunction vtfunction (189), e_LockUnlockMaskReqCommand command, ValidObjectID ObjectIDofTheDataMaskOrUserLayoutDataMaskToLockOrUnlock, - INT2 lockTimeout, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + INT2 lockTimeout +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExecuteMacroReq_ErrorCodes { boolean objectIDdoesNotExist, @@ -1851,34 +1600,21 @@ { VTfunction vtfunction (190), ValidObjectID objectIDofMacroObject, - ExecuteMacroReq_ErrorCodes errorCodes, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ExecuteMacroReq_ErrorCodes errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExecuteMacroReq { VTfunction vtfunction (190), - ValidObjectID objectIDofMacroObject, - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) - } with { variant "" }; + ValidObjectID objectIDofMacroObject + } with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record GetMemoryReq { - VTfunction vtfunction (194), + VTfunction vtfunction (192), OCT1 reserved2 ('FF'O), - INT3 memoryRequired, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + INT3 memoryRequired +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_GetMemoryResVersionNumber { compliantWithHannoverAgritechnica_2001_limitedfeatureSet (0), @@ -1896,51 +1632,32 @@ type record GetMemoryRes { - VTfunction vtfunction (194), + VTfunction vtfunction (192), e_GetMemoryResVersionNumber versionNumber, - e_GetMemoryResStatus status, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + e_GetMemoryResStatus status +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record GetNumberOfSoftKeysReq { - VTfunction vtfunction (192), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (194) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record GetNumberOfSoftKeysRes { - VTfunction vtfunction (192), - OCT1 navigationSoftKeys_, + VTfunction vtfunction (194), + OCT1 navigationSoftKeys, OCT1 reserved3 ('FF'O), OCT1 reserved4 ('FF'O), OCT1 x_dots, OCT1 y_dots, - OCT1 numberOfVirtualSoftKeys_, - OCT1 numberOfPhysicalSoftKeys_ + OCT1 numberOfVirtualSoftKeys, + OCT1 numberOfPhysicalSoftKeys } with { variant "" }; type record GetTextFontDataReq { - VTfunction vtfunction (195), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (195) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record TextFontDataRes_small_font_sizes { @@ -1991,17 +1708,87 @@ TextFontDataRes_type_attribute type_attribute } with { variant "" }; + + +type enumerated e_Codeplane { + codeplane0 (0), + codeplane1 (1), + codeplane2 (2), + codeplane3 (3), + codeplane4 (4), + codeplane5 (5), + codeplane6 (6), + codeplane7 (7), + codeplane8 (8), + codeplane9 (9), + codeplane10 (10), + codeplane11 (11), + codeplane12 (12), + codeplane13 (13), + codeplane14 (14), + codeplane15 (15), + codeplane16 (16)} +with {variant "PADDING(octet)"} + + +type record GetSupportedWidecharsReq +{ + VTfunction vtfunction (193), + e_Codeplane codeplane, + OCT2 firstWideCharInInquiryRange, + OCT2 lastWideCharInInquiryRange +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} + +type record WideCharRange +{ + OCT2 firstWideChar, + OCT2 lastWideChar +} with { variant "" }; + +type record of WideCharRange WideCharRangeArray + +type record GetSupportedWidecharsRes +{ + VTfunction vtfunction (193), + e_Codeplane codeplane, + OCT2 firstWideCharInInquiryRange, + OCT2 lastWideCharInInquiryRange, + INT1 numberOfRanges, + WideCharRangeArray wideCharRangeArray +} with { + variant (numberOfRanges) "LENGTHTO(wideCharRangeArray)"; + variant (numberOfRanges) "UNIT(elements)"} + +type record GetWindowMaskDataReq +{ + VTfunction vtfunction (196) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} + +type record GetWindowMaskDataRes +{ + VTfunction vtfunction (196), + OCT1 BackgroundColourVTUserLayoutDataMasks, + OCT1 BackgroundColourVTKeyCells +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} + +type record GetSupportedObjectsReq +{ + VTfunction vtfunction (197) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} + +type record GetSupportedObjectsRes +{ + VTfunction vtfunction (197), + INT2 numberOfBytesToFollow, + OCT1 supportedObjectTypes +} with { + variant (numberOfBytesToFollow) "LENGTHTO(supportedObjectTypes)"; + variant (numberOfBytesToFollow) "UNIT(elements)"} + type record GetHardwareReq { - VTfunction vtfunction (199), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (199) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_GetHardwareResGraphicType { @@ -2034,102 +1821,6 @@ INT2 yPixels } with { variant "" }; -type enumerated e_Codeplane { - codeplane0 (0), - codeplane1 (1), - codeplane2 (2), - codeplane3 (3), - codeplane4 (4), - codeplane5 (5), - codeplane6 (6), - codeplane7 (7), - codeplane8 (8), - codeplane9 (9), - codeplane10 (10), - codeplane11 (11), - codeplane12 (12), - codeplane13 (13), - codeplane14 (14), - codeplane15 (15), - codeplane16 (16)} -with {variant "PADDING(octet)"} - - -type record GetSupportedWidecharsReq -{ - VTfunction vtfunction (193), - e_Codeplane codeplane, - OCT2 firstWideCharInInquiryRange, - OCT2 lastWideCharInInquiryRange, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; - -type record WideCharRange -{ - OCT2 firstWideChar, - OCT2 lastWideChar -} with { variant "" }; - -type record of WideCharRange WideCharRangeArray - -type record GetSupportedWidecharsRes -{ - VTfunction vtfunction (193), - e_Codeplane codeplane, - OCT2 firstWideCharInInquiryRange, - OCT2 lastWideCharInInquiryRange, - INT1 numberOfRanges, - WideCharRangeArray wideCharRangeArray -} with { - variant (numberOfRanges) "LENGTHTO(wideCharRangeArray)"; - variant (numberOfRanges) "UNIT(elements)"} - -type record GetWindowMaskDataReq -{ - VTfunction vtfunction (196), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; - -type record GetWindowMaskDataRes -{ - VTfunction vtfunction (196), - OCT1 BackgroundColourVTUserLayoutDataMasks, - OCT1 BackgroundColourVTKeyCells, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; - -type record GetSupportedObjectsReq -{ - VTfunction vtfunction (197), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; - -type record GetSupportedObjectsRes -{ - VTfunction vtfunction (197), - INT2 numberOfBytesToFollow, - OCT1 supportedObjectTypes -} with { - variant (numberOfBytesToFollow) "LENGTHTO(supportedObjectTypes)"; - variant (numberOfBytesToFollow) "UNIT(elements)"} - type record StoreVersionRes_errorCodesType { boolean reserved0, boolean versionLabelIsNotCorrect, @@ -2141,6 +1832,12 @@ boolean reserved7 } with {variant ""} +type record StoreVersionReq +{ + VTfunction vtfunction (208), + VersionLabel7Char versionLabel +} with { variant "" }; + type record StoreVersionRes { VTfunction vtfunction (208), @@ -2148,16 +1845,8 @@ OCT1 reserved3 ('FF'O), OCT1 reserved4 ('FF'O), OCT1 reserved5 ('FF'O), - StoreVersionRes_errorCodesType errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; - -type record StoreVersionReq -{ - VTfunction vtfunction (208), - VersionLabel7Char versionLabel -} with { variant "" }; + StoreVersionRes_errorCodesType errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record WorkingSetMaintenanceBitMask { boolean initiatingWorkingSetMaintenance, @@ -2204,10 +1893,8 @@ OCT1 reserved3 ('FF'O), OCT1 reserved4 ('FF'O), OCT1 reserved5 ('FF'O), - LoadVersionRes_errorCodesType errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + LoadVersionRes_errorCodesType errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record DeleteVersionRes_errorCodesType { boolean reserved0, @@ -2227,10 +1914,8 @@ OCT1 reserved3 ('FF'O), OCT1 reserved4 ('FF'O), OCT1 reserved5 ('FF'O), - DeleteVersionRes_errorCodesType errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + DeleteVersionRes_errorCodesType errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record DeleteVersionReq { @@ -2254,15 +1939,8 @@ type record ExtendedGetVersionsReq { - VTfunction vtfunction (211), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (211) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExtendedStoreVersionRes_errorCodesType { boolean reserved0, @@ -2282,10 +1960,8 @@ OCT1 reserved3 ('FF'O), OCT1 reserved4 ('FF'O), OCT1 reserved5 ('FF'O), - ExtendedStoreVersionRes_errorCodesType errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ExtendedStoreVersionRes_errorCodesType errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExtendedStoreVersionReq { @@ -2311,10 +1987,8 @@ OCT1 reserved3 ('FF'O), OCT1 reserved4 ('FF'O), OCT1 reserved5 ('FF'O), - ExtendedLoadVersionRes_errorCodesType errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ExtendedLoadVersionRes_errorCodesType errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExtendedLoadVersionReq { @@ -2340,10 +2014,8 @@ OCT1 reserved3 ('FF'O), OCT1 reserved4 ('FF'O), OCT1 reserved5 ('FF'O), - ExtendedDeleteVersionRes_errorCodesType errorCodes, - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + ExtendedDeleteVersionRes_errorCodesType errorCodes +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record ExtendedDeleteVersionReq { @@ -2353,21 +2025,16 @@ type record GetVersionsReq { - VTfunction vtfunction (223), - OCT1 reserved2 ('FF'O), - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + VTfunction vtfunction (223) +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} + +type record of VersionLabel7Char VersionLabel7Chars type record GetVersionsRes { VTfunction vtfunction (224), INT1 numberOfVersionStrings, - VersionLabel7Char versionStrings + VersionLabel7Chars versionStrings } with{ variant (numberOfVersionStrings) "LENGTHTO(versionStrings)"; @@ -2377,39 +2044,21 @@ type record VTUnsupportedVTFunctionInd { VTfunction vtfunction (253), - OCT1 unsupportedVTfunction, // should be VTfunction, but since unsupported is OCT1 - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + OCT1 unsupportedVTfunction // should be VTfunction, but since unsupported is OCT1 +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type record UnsupportedVTFunctionInd { VTfunction vtfunction (253), - OCT1 unsupportedVTfunction, // should be VTfunction, but since unsupported is OCT1 - OCT1 reserved3 ('FF'O), - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) + OCT1 unsupportedVTfunction // should be VTfunction, but since unsupported is OCT1 +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} -} with { variant "" }; - -type record WorkingSetMaintenanceReq +type record WorkingSetMaintenanceInd { VTfunction vtfunction (255), WorkingSetMaintenanceBitMask bitMask, - e_WorkingSetMaintenanceVersionNumber versionNumber, - OCT1 reserved4 ('FF'O), - OCT1 reserved5 ('FF'O), - OCT1 reserved6 ('FF'O), - OCT1 reserved7 ('FF'O), - OCT1 reserved8 ('FF'O) -} with { variant "" }; + e_WorkingSetMaintenanceVersionNumber versionNumber +} with {variant "PADDING(88), PADDING_PATTERN('11111111'B)"} type enumerated e_BusyCodes { vtIsBusyUpdatingVisibleMask (0), @@ -2422,7 +2071,7 @@ vtIsOutOfMemory (7)} with {variant "PADDING(octet)"} -type record VTStatusReq +type record VTStatusInd { VTfunction vtfunction (254), OCT1 sourceAddressOfActiveWorkingSetMaster, @@ -2487,10 +2136,10 @@ LockUnlockMaskRes lockUnlockMaskRes, ExecuteMacroRes executeMacroRes, GetMemoryRes getMemoryRes, + GetSupportedWidecharsRes getSupportedWidecharsRes, GetNumberOfSoftKeysRes getNumberOfSoftKeysRes, GetTextFontDataRes getTextFontDataRes, GetHardwareRes getHardwareRes, - GetSupportedWidecharsRes getSupportedWidecharsRes, GetWindowMaskDataRes getWindowMaskDataRes, GetSupportedObjectsRes getSupportedObjectsRes, StoreVersionRes storeVersionRes, @@ -2502,7 +2151,7 @@ ExtendedDeleteVersionRes extendedDeleteVersionRes, GetVersionsRes getVersionsRes, VTUnsupportedVTFunctionInd vtUnsupportedVTFunctionInd, - VTStatusReq vtStatusReq + VTStatusInd vtStatusInd } with {variant "TAG ( // put all VT2ECU messages here @@ -2556,10 +2205,10 @@ lockUnlockMaskRes, vtfunction = 189; executeMacroRes, vtfunction = 190; getMemoryRes, vtfunction = 192; + getSupportedWidecharsRes, vtfunction = 193; getNumberOfSoftKeysRes, vtfunction = 194; getTextFontDataRes, vtfunction = 195; getHardwareRes, vtfunction = 199; - getSupportedWidecharsRes, vtfunction = 193; getWindowMaskDataRes, vtfunction = 196; getSupportedObjectsRes, vtfunction = 197; storeVersionRes, vtfunction = 208; @@ -2571,7 +2220,7 @@ extendedDeleteVersionRes, vtfunction = 214; getVersionsRes, vtfunction = 224; vtUnsupportedVTFunctionInd, vtfunction = 253; - vtStatusReq, vtfunction = 254;)" + vtStatusInd, vtfunction = 254;)" } type union ECU2VT @@ -2586,7 +2235,7 @@ VTESCRes vtESCRes, VTChangeNumericValueRes vtChangeNumericValueRes, VTChangeActiveMaskRes vtChangeActiveMaskRes, - VTChangeSoftKeyMaskReq vtChangeSoftKeyMaskReq, + VTChangeSoftKeyMaskRes vtChangeSoftKeyMaskRes, VTChangeStringValueRes vtChangeStringValueRes, VTOnUserLayoutHideShowRes vtOnUserLayoutHideShowRes, ObjectPoolTransferInd objectPoolTransferInd, @@ -2631,10 +2280,10 @@ LockUnlockMaskReq lockUnlockMaskReq, ExecuteMacroReq executeMacroReq, GetMemoryReq getMemoryReq, + GetSupportedWidecharsReq getSupportedWidecharsReq, GetNumberOfSoftKeysReq getNumberOfSoftKeysReq, GetTextFontDataReq getTextFontDataReq, GetHardwareReq getHardwareReq, - GetSupportedWidecharsReq getSupportedWidecharsReq, GetWindowMaskDataReq getWindowMaskDataReq, GetSupportedObjectsReq getSupportedObjectsReq, StoreVersionReq storeVersionReq, @@ -2646,7 +2295,7 @@ ExtendedDeleteVersionReq extendedDeleteVersionReq, GetVersionsReq getVersionsReq, UnsupportedVTFunctionInd unsupportedVTFunctionInd, - WorkingSetMaintenanceReq workingSetMaintenanceReq + WorkingSetMaintenanceInd workingSetMaintenanceInd // put all ECU2VT response messages here //Dummy_ECU2VT_Res dummy_ECU2VT_Res } @@ -2659,7 +2308,7 @@ vtESCRes, vtfunction = 4; vtChangeNumericValueRes, vtfunction = 5; vtChangeActiveMaskRes, vtfunction = 6; - vtChangeSoftKeyMaskReq, vtfunction = 7; + vtChangeSoftKeyMaskRes, vtfunction = 7; vtChangeStringValueRes, vtfunction = 8; vtOnUserLayoutHideShowRes, vtfunction = 9; objectPoolTransferInd, vtfunction = 17; @@ -2704,10 +2353,10 @@ lockUnlockMaskReq, vtfunction = 189; executeMacroReq, vtfunction = 190; getMemoryReq, vtfunction = 192; + getSupportedWidecharsReq, vtfunction = 193; getNumberOfSoftKeysReq, vtfunction = 194; getTextFontDataReq, vtfunction = 195; getHardwareReq, vtfunction = 199; - getSupportedWidecharsReq, vtfunction = 193; getWindowMaskDataReq, vtfunction = 196; getSupportedObjectsReq, vtfunction = 197; storeVersionReq, vtfunction = 208; @@ -2719,7 +2368,7 @@ extendedDeleteVersionReq, vtfunction = 214; getVersionsReq, vtfunction = 223; unsupportedVTFunctionInd, vtfunction = 253; - workingSetMaintenanceReq, vtfunction = 255; + workingSetMaintenanceInd, vtfunction = 255; ) " }
diff --git a/demo/IsobusVT_Templates.ttcn b/demo/IsobusVT_Templates.ttcn new file mode 100644 index 0000000..e9d8cd5 --- /dev/null +++ b/demo/IsobusVT_Templates.ttcn
@@ -0,0 +1,524 @@ +module IsobusVT_Templates { + +import from IsobusMessageTypes all +import from IsobusVTMessageTypes all +import from IsobusCMMessageTypes all +import from IsobusNMMessageTypes all +import from Isobus all +import from General_Types all +import from J1939 all + +template J1939PDU_with_NAME t_J1939PDU_with_NAME(template J1939_ADDR p_addr, template J1939_NAME p_name, template J1939_messageWithPGN p_pdu) +:= { + addr := p_addr, + name := p_name, + pdu := p_pdu +} + +template Isobus.J1939_messageWithPGN t_ButtonActivationReq( + template e_ButtonActivationReq_KeyAactivationCode p_keyAactivationCode, + template ValidObjectID p_objectID, + template ValidObjectID p_parentObjectID, + template KeyNumberType p_buttonKeyCode) +:= {pgn := '00E600'O, pdu := {vt2ecu := {buttonActivationReq := { + vtfunction := 1, + keyAactivationCode := p_keyAactivationCode, + objectID := p_objectID, + parentObjectID := p_parentObjectID, + buttonKeyCode := p_buttonKeyCode + }}}} + +template Isobus.J1939_messageWithPGN t_ButtonActivationRes ( + template e_ButtonActivationRes_KeyAactivationCode p_keyAactivationCode, + template ValidObjectID p_objectID, + template ValidObjectID p_parentObjectID, + template KeyNumberType p_buttonKeyCode +) +:= {pgn := '00E700'O, pdu := {ecu2vt := {buttonActivationRes := { + vtfunction := 1, + keyAactivationCode := p_keyAactivationCode, + objectID := p_objectID, + parentObjectID := p_parentObjectID, + buttonKeyCode := p_buttonKeyCode + }}}} + +template Isobus.J1939_messageWithPGN t_PointingEventReq ( + template PositionType p_x_position, + template PositionType p_y_position, + template e_PointingEvent_touchState p_touchState) +:= {pgn := '00E600'O, pdu := {vt2ecu := {pointingEventReq := { + vtfunction := 2, + x_position := p_x_position, + y_position := p_y_position, + touchState := p_touchState + }}}} + +template Isobus.J1939_messageWithPGN t_PointingEventRes ( + template PositionType p_x_position, + template PositionType p_y_position, + template e_PointingEvent_touchState p_touchState) +:= {pgn := '00E700'O, pdu := {ecu2vt := {pointingEventRes := { + vtfunction := 2, + x_position := p_x_position, + y_position := p_y_position, + touchState := p_touchState + }}}} + +template Isobus.J1939_messageWithPGN t_VTSelectInputObjectReq ( + template ValidObjectID p_objectID, + template e_VTSelectInputObject_selection p_selection, + template boolean p_objectIsOpenForDataInput, + template boolean p_reserved + // p_reserved for v3 or earlier: true , for v4 and later: false +) := {pgn := '00E600'O, pdu := {vt2ecu := {vtSelectInputObjectReq := { + vtfunction := 3, + objectID := p_objectID, + selection := p_selection, + bitmask := { + objectIsOpenForDataInput := p_objectIsOpenForDataInput, + reserved1 := p_reserved, + reserved2 := p_reserved, + reserved3 := p_reserved, + reserved4 := p_reserved, + reserved5 := p_reserved, + reserved6 := p_reserved, + reserved7 := p_reserved} + }}}} + +//template VTSelectInputObjectReq_v3AndPrior t_VTSelectInputObjectReq_v3AndPrior ( +// template ValidObjectID p_objectID, +// template e_VTSelectInputObject_selection p_selection) := { +// vtfunction := 3, +// objectID := p_objectID, +// selection := p_selection, +// reserved5 := 'FF'O, +// reserved6 := 'FF'O, +// reserved7 := 'FF'O, +// reserved8 := 'FF'O +//} + +//template VTSelectInputObjectReq_v4AndLater t_VTSelectInputObjectReq_v4AndLater ( +// template ValidObjectID p_objectID, +// template e_VTSelectInputObject_selection p_selection, +// template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := { +// vtfunction := 3, +// objectID := p_objectID, +// selection := p_selection, +// bitmask := p_bitmask, +// reserved6 := 'FF'O, +// reserved7 := 'FF'O, +// reserved8 := 'FF'O +//} + +template Isobus.J1939_messageWithPGN t_VTSelectInputObjectRes( + template ValidObjectID p_objectID, + template e_VTSelectInputObject_selection p_selection, + template boolean p_objectIsOpenForDataInput, + template boolean p_reserved + // p_reserved for v3 or earlier: true , for v4 and later: false +) := {pgn := '00E700'O, pdu := {ecu2vt := {vtSelectInputObjectRes := { + vtfunction := 3, + objectID := p_objectID, + selection := p_selection, + bitmask := { + objectIsOpenForDataInput := p_objectIsOpenForDataInput, + reserved1 := p_reserved, + reserved2 := p_reserved, + reserved3 := p_reserved, + reserved4 := p_reserved, + reserved5 := p_reserved, + reserved6 := p_reserved, + reserved7 := p_reserved} + }}}} + +//template VTSelectInputObjectRes_v4AndPrior t_VTSelectInputObjectRes_v4AndPrior( +// template ValidObjectID p_objectID, +// template e_VTSelectInputObject_selection p_selection) := { +// vtfunction := 3, +// objectID := p_objectID, +// selection := p_selection +//} + +//template VTSelectInputObjectRes_v5AndLater t_VTSelectInputObjectRes_v5AndLater( +// template ValidObjectID p_objectID, +// template e_VTSelectInputObject_selection p_selection, +// template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := { +// vtfunction := 3, +// objectID := p_objectID, +// selection := p_selection, +// bitmask := p_bitmask +//} + +template Isobus.J1939_messageWithPGN t_VTESCReq ( + template AnyObjectID p_objectID, + template VTESC_ErrorCodes p_errorCodes) +:= {pgn := '00E600'O, pdu := {vt2ecu := {vtESCReq := { + vtfunction := 4, + objectID := p_objectID, + errorCodes := p_errorCodes + }}}} + +template Isobus.J1939_messageWithPGN t_VTESCRes ( + template AnyObjectID p_objectID) +:= {pgn := '00E700'O, pdu := {ecu2vt := {vtESCRes := { + vtfunction := 4, + objectID := p_objectID + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeNumericValueReq ( + template ValidObjectID p_objectID, + template OCT4 p_value) +:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeNumericValueReq := { + vtfunction := 5, + objectID := p_objectID, + reserved4 := 'FF'O, + value_ := p_value + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeNumericValueRes ( + template ValidObjectID p_objectID, + template OCT4 p_value) +:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeNumericValueRes := { + vtfunction := 5, + objectID := p_objectID, + reserved4 := 'FF'O, + value_ := p_value + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeActiveMaskReq ( + template ValidObjectID p_activeMaskOrWindowMaskOrKeyGroupObjectID, + template VTChangeActiveMasErrorcodes p_errorCodes, + template ValidObjectID p_objectIDcontainingError, + template ValidObjectID p_parentObjectIDofErrorObjectID) +:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeActiveMaskReq := { + vtfunction := 6, + activeMaskOrWindowMaskOrKeyGroupObjectID := p_activeMaskOrWindowMaskOrKeyGroupObjectID, + errorCodes := p_errorCodes, + objectIDcontainingError := p_objectIDcontainingError, + parentObjectIDofErrorObjectID := p_parentObjectIDofErrorObjectID + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeActiveMaskRes ( + template ValidObjectID p_activeMaskObjectID) +:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeActiveMaskRes := { + vtfunction := 6, + activeMaskObjectID := p_activeMaskObjectID + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeSoftKeyMaskReq( + template ValidObjectID p_dataOrAlarmMaskObjectID, + template ValidObjectID p_softKeyMaskObjectID, + template VTChangeSoftKeyMaskErrorCodes p_errorCodes) +:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeSoftKeyMaskReq := { + vtfunction := 7, + dataOrAlarmMaskObjectID := p_dataOrAlarmMaskObjectID, + softKeyMaskObjectID := p_softKeyMaskObjectID, + errorCodes := p_errorCodes + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeSoftKeyMaskRes( + template ValidObjectID p_dataOrAlarmMaskObjectID, + template ValidObjectID p_softKeyMaskObjectID) +:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeSoftKeyMaskRes := { + vtfunction := 7, + dataOrAlarmMaskObjectID := p_dataOrAlarmMaskObjectID, + softKeyMaskObjectID := p_softKeyMaskObjectID + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeStringValueReq ( + template ValidObjectID p_inputStringOrStringVariableObjectID, + template INT1 p_numberOfBytes, + template octetstring p_enteredStringValue) +:= {pgn := '00E600'O, pdu := {vt2ecu := {vtChangeStringValueReq := { + vtfunction := 8, + inputStringOrStringVariableObjectID := p_inputStringOrStringVariableObjectID, + numberOfBytes := lengthof(p_enteredStringValue), + enteredStringValue := p_enteredStringValue + }}}} + +template Isobus.J1939_messageWithPGN t_VTChangeStringValueRes ( + template ValidObjectID p_inputStringOrStringVariableObjectID) +:= {pgn := '00E700'O, pdu := {ecu2vt := {vtChangeStringValueRes := { + vtfunction := 8, + reserved2 := 'FF'O, + reserved3 := 'FF'O, + inputStringOrStringVariableObjectID := p_inputStringOrStringVariableObjectID + }}}} + +template Isobus.J1939_messageWithPGN t_ObjectPoolTransferInd( + template ObjectPoolRecords p_objectPoolRecords) +:= {pgn := '00E700'O, + pdu := {ecu2vt := {objectPoolTransferInd := { + vtfunction := 17, + objectPoolRecords := p_objectPoolRecords + }}} +} + +template Isobus.J1939_messageWithPGN t_EndOfObjectPoolReq +:= {pgn := '00E700'O, + pdu := {ecu2vt := {endOfObjectPoolReq := { + vtfunction := 18 + }}} +} + + +template Isobus.J1939_messageWithPGN t_EndOfObjectPoolRes ( + template EndOfObjectPoolResErrorCodes p_errorCodes, + template AnyObjectID p_parentObjectIDoFaultyObject, + template AnyObjectID p_objectIDofFaultyObject, + template EndOfObjectPoolResObjectPoolErrorCodes p_objectPoolErrorCodes +):= {pgn := '00E600'O, + pdu := {vt2ecu := {endOfObjectPoolRes := { + vtfunction := 18, + errorCodes := p_errorCodes, + parentObjectIDoFaultyObject := p_parentObjectIDoFaultyObject, // set to NULL Object ID if there are no + objectIDofFaultyObject := p_objectIDofFaultyObject, // set to NULL Object ID if there are no + objectPoolErrorCodes := p_objectPoolErrorCodes + }}} +} + +template Isobus.J1939_messageWithPGN t_GetMemoryReq( + template INT3 p_memoryRequired) +:= { + pgn := '00E700'O, + pdu := {ecu2vt := {getMemoryReq := { + vtfunction := 192, + reserved2 := 'FF'O, + memoryRequired := p_memoryRequired + } + } + } +} + +template Isobus.J1939_messageWithPGN t_GetMemoryRes( + template e_GetMemoryResVersionNumber p_versionNumber, + template e_GetMemoryResStatus p_status) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {getMemoryRes := { + vtfunction := 192, + versionNumber := p_versionNumber, + status := p_status + }}}} + + +template Isobus.J1939_messageWithPGN t_GetSupportedWidecharsReq( + template e_Codeplane p_codeplane, + template OCT2 p_firstWideCharInInquiryRange, + template OCT2 p_lastWideCharInInquiryRange) +:= { + pgn := '00E700'O, + pdu := {ecu2vt := { getSupportedWidecharsReq := { + vtfunction := 193, + codeplane := p_codeplane, + firstWideCharInInquiryRange := p_firstWideCharInInquiryRange, + lastWideCharInInquiryRange := p_lastWideCharInInquiryRange + }}}} + +template Isobus.J1939_messageWithPGN t_GetSupportedWidecharsRes( + template e_Codeplane p_codeplane, + template OCT2 p_firstWideCharInInquiryRange, + template OCT2 p_lastWideCharInInquiryRange, + template INT1 p_numberOfRanges, + WideCharRangeArray p_wideCharRangeArray) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {getSupportedWidecharsRes := { + vtfunction := 193, + codeplane := p_codeplane, + firstWideCharInInquiryRange := p_firstWideCharInInquiryRange, + lastWideCharInInquiryRange := p_lastWideCharInInquiryRange, + numberOfRanges := p_numberOfRanges, + wideCharRangeArray := p_wideCharRangeArray + }}}} + + +template Isobus.J1939_messageWithPGN t_GetNumberOfSoftKeysReq +:= { + pgn := '00E700'O, + pdu := {ecu2vt := {getNumberOfSoftKeysReq := { + vtfunction := 194 + } + } + } +} + +template Isobus.J1939_messageWithPGN t_GetNumberOfSoftKeysRes( + template OCT1 p_navigationSoftKeys, + template OCT1 p_x_dots, + template OCT1 p_y_dots, + template OCT1 p_numberOfVirtualSoftKeys, + template OCT1 p_numberOfPhysicalSoftKeys +) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {getNumberOfSoftKeysRes := { + vtfunction := 194, + navigationSoftKeys := p_navigationSoftKeys, + reserved3 := 'FF'O, + reserved4 := 'FF'O, + x_dots := p_x_dots, + y_dots := p_y_dots, + numberOfVirtualSoftKeys := p_numberOfVirtualSoftKeys, + numberOfPhysicalSoftKeys := p_numberOfPhysicalSoftKeys + }}}} + +template Isobus.J1939_messageWithPGN t_GetTextFontDataReq +:= { + pgn := '00E700'O, + pdu := {ecu2vt := {getTextFontDataReq := { + vtfunction := 195 + } + } + } +} + +template Isobus.J1939_messageWithPGN t_GetTextFontDataRes( + template TextFontDataRes_small_font_sizes p_small_font_sizes, + template TextFontDataRes_large_font_sizes p_large_font_sizes, + template TextFontDataRes_type_attribute p_type_attribute +) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {getTextFontDataRes := { + vtfunction := 195, + reserved2 := 'FF'O, + reserved3 := 'FF'O, + reserved4 := 'FF'O, + reserved5 := 'FF'O, + small_font_sizes := p_small_font_sizes, + large_font_sizes := p_large_font_sizes, + type_attribute := p_type_attribute + }}}} + +template Isobus.J1939_messageWithPGN t_GetHardwareReq +:= { + pgn := '00E700'O, + pdu := {ecu2vt := {getHardwareReq := { + vtfunction := 199 + } + } + } +} + +template Isobus.J1939_messageWithPGN t_GetHardwareRes( + template BootTimeType p_bootTimeInSeconds, + template e_GetHardwareResGraphicType p_graphicType, + template GetHardwareResHardwareType p_hardware, + template INT2 p_xPixels, + template INT2 p_yPixels +) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {getHardwareRes := { + vtfunction := 199, + bootTimeInSeconds := p_bootTimeInSeconds, // 255 for information not available + graphicType := p_graphicType, + hardware := p_hardware, + xPixels := p_xPixels, + yPixels := p_yPixels + }}}} + +template Isobus.J1939_messageWithPGN t_StoreVersionReq(VersionLabel7Char p_versionLabel) +:= { + pgn := '00E700'O, + pdu := {ecu2vt := {storeVersionReq := { + vtfunction := 208, + versionLabel := p_versionLabel + } + } + } +} + +template Isobus.J1939_messageWithPGN t_StoreVersionRes( + StoreVersionRes_errorCodesType p_errorCodes +) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {storeVersionRes := { + vtfunction := 208, + reserved2 := 'FF'O, + reserved3 := 'FF'O, + reserved4 := 'FF'O, + reserved5 := 'FF'O, + errorCodes := p_errorCodes + }}}} + + +template Isobus.J1939_messageWithPGN t_LoadVersionReq(VersionLabel7Char p_versionLabel) +:= { + pgn := '00E700'O, + pdu := {ecu2vt := {loadVersionReq := { + vtfunction := 209, + versionLabel := p_versionLabel + } + } + } +} + +template Isobus.J1939_messageWithPGN t_LoadVersionRes( + template LoadVersionRes_errorCodesType p_errorCodes +) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {loadVersionRes := { + vtfunction := 209, + reserved2 := 'FF'O, + reserved3 := 'FF'O, + reserved4 := 'FF'O, + reserved5 := 'FF'O, + errorCodes := p_errorCodes + }}}} + +template Isobus.J1939_messageWithPGN t_GetVersionsReq +:= { + pgn := '00E700'O, + pdu := {ecu2vt := {getVersionsReq := { + vtfunction := 223 + } + } + } +} + +template Isobus.J1939_messageWithPGN t_GetVersionsRes( + template INT1 p_numberOfVersionStrings, + template VersionLabel7Chars p_versionStrings +) +:= { + pgn := '00E600'O, + pdu := {vt2ecu := {getVersionsRes := { + vtfunction := 224, + numberOfVersionStrings := p_numberOfVersionStrings, + versionStrings := p_versionStrings + }}}} + +template Isobus.J1939_messageWithPGN t_VTStatusInd( + template OCT1 p_sourceAddressOfActiveWorkingSetMaster, + template OCT2 p_objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet, + template OCT2 p_objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet, + template e_BusyCodes p_vtBusyCodes, + template OCT1 p_vtFunctionCode) := {pgn := '00E600'O, + pdu := {vt2ecu := {vtStatusInd := { + vtfunction := 254, + sourceAddressOfActiveWorkingSetMaster := p_sourceAddressOfActiveWorkingSetMaster, + objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet := p_objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet, + objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet := p_objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet, + vtBusyCodes := p_vtBusyCodes, + vtFunctionCode := p_vtFunctionCode + }}} +} + +template Isobus.J1939_messageWithPGN t_WorkingSetMaintenanceInd( + template boolean p_initiatingWorkingSetMaintenance, + template e_WorkingSetMaintenanceVersionNumber p_versionNumber) := { + pgn := '00E700'O, + pdu := { + ecu2vt := {workingSetMaintenanceInd := { + vtfunction := 255, + bitMask := { initiatingWorkingSetMaintenance := p_initiatingWorkingSetMaintenance, reserved1 := false, reserved2 := false, reserved3 := false, reserved4 := false, reserved5 := false, reserved6 := false, reserved7 := false }, + versionNumber := p_versionNumber + }}} +} + +} +
diff --git a/demo/Isobus_Templates.ttcn b/demo/Isobus_Templates.ttcn deleted file mode 100644 index 48e6e26..0000000 --- a/demo/Isobus_Templates.ttcn +++ /dev/null
@@ -1,395 +0,0 @@ -module Isobus_Templates { - -import from IsobusMessageTypes all -import from IsobusVTMessageTypes all -import from IsobusCMMessageTypes all -import from IsobusNMMessageTypes all -import from Isobus all -import from General_Types all - - -template CAN_frame_j1939 t_message(Isobus.Priority prio_param, BIT1 res_param, BIT1 dp_param, - OCT1 pf_param, OCT1 ps_param, SourceAddress sa_param, template AnyIsoBusPdu t_can_pdu) -:= { can_j1939 := { - prio := prio_param, - res := res_param, - dp := dp_param, - pf := pf_param, - ps := ps_param, - sa := sa_param}, - can_pdu := t_can_pdu -} - -template CAN_frame_j1939 t_network_message(Isobus.Priority prio_param, BIT1 res_param, BIT1 dp_param, - OCT1 pf_param, OCT1 ps_param, SourceAddress sa_param, template IsobusNMMessageTypes.NetworkMessage t_networkMessage) -:= { can_j1939 := { - prio := prio_param, - res := res_param, - dp := dp_param, - pf := pf_param, - ps := ps_param, - sa := sa_param}, - can_pdu := {networkMessage := t_networkMessage} -} - -template ECU2VT t_GetMemoryReqX( INT3 p_memoryRequired) := { - getMemoryReq := { - vtfunction := 194, - reserved2 := 'FF'O, - memoryRequired := p_memoryRequired, - reserved7 := 'FF'O, - reserved8 := 'FF'O - } -}; - -template AnyIsoBusPdu t_ecu2vt(template ECU2VT t_Message) := { - ecu2vt := t_Message -}; - -template AnyIsoBusPdu t_vt2ecu(template VT2ECU t_Message) := { - vt2ecu := t_Message -}; - -template AnyIsoBusPdu t_GetMemoryReq_pdu(INT3 p_memoryRequired) := { - ecu2vt := {getMemoryReq := t_GetMemoryReq(p_memoryRequired)} -} - - -template ButtonActivationReq t_ButtonActivationReq( - template e_ButtonActivationReq_KeyAactivationCode p_keyAactivationCode, - template ValidObjectID p_objectID, - template ValidObjectID p_parentObjectID, - template KeyNumberType p_buttonKeyCode) := { - vtfunction := 1, - keyAactivationCode := p_keyAactivationCode, - objectID := p_objectID, - parentObjectID := p_parentObjectID, - buttonKeyCode := p_buttonKeyCode, - reserved8 := 'FF'O -} - -template ButtonActivationRes t_ButtonActivationRes ( - template e_ButtonActivationRes_KeyAactivationCode p_keyAactivationCode, - template ValidObjectID p_objectID, - template ValidObjectID p_parentObjectID, - template KeyNumberType p_buttonKeyCode -) := { - vtfunction := 1, - keyAactivationCode := p_keyAactivationCode, - objectID := p_objectID, - parentObjectID := p_parentObjectID, - buttonKeyCode := p_buttonKeyCode, - reserved8 := 'FF'O -} - -template PointingEventReq t_PointingEventReq ( - template PositionType p_x_position, - template PositionType p_y_position, - template e_PointingEvent_touchState p_touchState) := { - vtfunction := 2, - x_position := p_x_position, - y_position := p_y_position, - touchState := p_touchState, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template PointingEventRes t_PointingEventRes ( - template PositionType p_x_position, - template PositionType p_y_position, - template e_PointingEvent_touchState p_touchState) := { - vtfunction := 2, - x_position := p_x_position, - y_position := p_y_position, - touchState := p_touchState, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTSelectInputObjectReq t_VTSelectInputObjectReq ( - template ValidObjectID p_objectID, - template e_VTSelectInputObject_selection p_selection, - template boolean p_objectIsOpenForDataInput, - template boolean p_reserved - // p_reserved for v3 or earlier: true , for v4 and later: false -) := { - vtfunction := 3, - objectID := p_objectID, - selection := p_selection, - bitmask := { - objectIsOpenForDataInput := p_objectIsOpenForDataInput, - reserved1 := p_reserved, - reserved2 := p_reserved, - reserved3 := p_reserved, - reserved4 := p_reserved, - reserved5 := p_reserved, - reserved6 := p_reserved, - reserved7 := p_reserved}, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTSelectInputObjectReq_v3AndPrior t_VTSelectInputObjectReq_v3AndPrior ( - template ValidObjectID p_objectID, - template e_VTSelectInputObject_selection p_selection) := { - vtfunction := 3, - objectID := p_objectID, - selection := p_selection, - reserved5 := 'FF'O, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTSelectInputObjectReq_v4AndLater t_VTSelectInputObjectReq_v4AndLater ( - template ValidObjectID p_objectID, - template e_VTSelectInputObject_selection p_selection, - template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := { - vtfunction := 3, - objectID := p_objectID, - selection := p_selection, - bitmask := p_bitmask, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTSelectInputObjectRes t_VTSelectInputObjectRes( - template ValidObjectID p_objectID, - template e_VTSelectInputObject_selection p_selection, - template boolean p_objectIsOpenForDataInput, - template boolean p_reserved - // p_reserved for v3 or earlier: true , for v4 and later: false -) := { - vtfunction := 3, - objectID := p_objectID, - selection := p_selection, - bitmask := { - objectIsOpenForDataInput := p_objectIsOpenForDataInput, - reserved1 := p_reserved, - reserved2 := p_reserved, - reserved3 := p_reserved, - reserved4 := p_reserved, - reserved5 := p_reserved, - reserved6 := p_reserved, - reserved7 := p_reserved}, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTSelectInputObjectRes_v4AndPrior t_VTSelectInputObjectRes_v4AndPrior( - template ValidObjectID p_objectID, - template e_VTSelectInputObject_selection p_selection) := { - vtfunction := 3, - objectID := p_objectID, - selection := p_selection, - reserved5 := 'FF'O, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTSelectInputObjectRes_v5AndLater t_VTSelectInputObjectRes_v5AndLater( - template ValidObjectID p_objectID, - template e_VTSelectInputObject_selection p_selection, - template VTSelectInputObject_v4AndLater_Bitmask p_bitmask) := { - vtfunction := 3, - objectID := p_objectID, - selection := p_selection, - bitmask := p_bitmask, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTESCReq t_VTESCReq ( - template AnyObjectID p_objectID, - template VTESC_ErrorCodes p_errorCodes) := { - vtfunction := 4, - objectID := p_objectID, - errorCodes := p_errorCodes, - reserved5 := 'FF'O, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTESCRes t_VTESCRes ( - template AnyObjectID p_objectID) :={ - vtfunction := 4, - objectID := p_objectID, - reserved4 := 'FF'O, - reserved5 := 'FF'O, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTChangeNumericValueReq t_VTChangeNumericValueReq ( - template ValidObjectID p_objectID, - template OCT4 p_value) := { - vtfunction := 5, - objectID := p_objectID, - reserved4 := 'FF'O, - value_ := p_value -} - -template VTChangeNumericValueRes t_VTChangeNumericValueRes ( - template ValidObjectID p_objectID, - template OCT4 p_value) := { - vtfunction := 5, - objectID := p_objectID, - reserved4 := 'FF'O, - value_ := p_value -} - -template VTChangeActiveMaskReq t_VTChangeActiveMaskReq ( - template ValidObjectID p_activeMaskOrWindowMaskOrKeyGroupObjectID, - template VTChangeActiveMasErrorcodes p_errorCodes, - template ValidObjectID p_objectIDcontainingError, - template ValidObjectID p_parentObjectIDofErrorObjectID) := -{ - vtfunction := 6, - activeMaskOrWindowMaskOrKeyGroupObjectID := p_activeMaskOrWindowMaskOrKeyGroupObjectID, - errorCodes := p_errorCodes, - objectIDcontainingError := p_objectIDcontainingError, - parentObjectIDofErrorObjectID := p_parentObjectIDofErrorObjectID -} - -template VTChangeActiveMaskRes t_VTChangeActiveMaskRes ( - template ValidObjectID p_activeMaskObjectID) := { - vtfunction := 6, - activeMaskObjectID := p_activeMaskObjectID, - reserved4 := 'FF'O, - reserved5 := 'FF'O, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTChangeSoftKeyMaskReq t_VTChangeSoftKeyMaskReq( - template ValidObjectID p_dataOrAlarmMaskObjectID, - template ValidObjectID p_softKeyMaskObjectID, - template VTChangeSoftKeyMaskErrorCodes p_errorCodes) := -{ - vtfunction := 7, - dataOrAlarmMaskObjectID := p_dataOrAlarmMaskObjectID, - softKeyMaskObjectID := p_softKeyMaskObjectID, - errorCodes := p_errorCodes, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTChangeSoftKeyMaskRes t_VTChangeSoftKeyMaskRes( - template ValidObjectID p_dataOrAlarmMaskObjectID, - template ValidObjectID p_softKeyMaskObjectID) := -{ - vtfunction := 7, - dataOrAlarmMaskObjectID := p_dataOrAlarmMaskObjectID, - softKeyMaskObjectID := p_softKeyMaskObjectID, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template VTChangeStringValueReq t_VTChangeStringValueReq ( - template ValidObjectID p_inputStringOrStringVariableObjectID, - template octetstring p_enteredStringValue) := -{ - vtfunction := 8, - inputStringOrStringVariableObjectID := p_inputStringOrStringVariableObjectID, - numberOfBytes := lengthof(p_enteredStringValue), - enteredStringValue := p_enteredStringValue -} - -template VTChangeStringValueRes t_VTChangeStringValueRes ( - template ValidObjectID p_inputStringOrStringVariableObjectID) := -{ - vtfunction := 8, - reserved2 := 'FF'O, - reserved3 := 'FF'O, - inputStringOrStringVariableObjectID := p_inputStringOrStringVariableObjectID, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template GetSupportedWidecharsReq t_GetSupportedWidecharsReq(e_Codeplane p_codeplane, OCT2 p_firstWideCharInInquiryRange, OCT2 p_lastWideCharInInquiryRange) := { - vtfunction := 193, - codeplane := p_codeplane, - firstWideCharInInquiryRange := p_firstWideCharInInquiryRange, - lastWideCharInInquiryRange := p_lastWideCharInInquiryRange, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template GetSupportedWidecharsRes t_GetSupportedWidecharsRes(e_Codeplane p_codeplane, OCT2 p_firstWideCharInInquiryRange, - OCT2 p_lastWideCharInInquiryRange, - INT1 p_numberOfRanges, - WideCharRangeArray p_wideCharRangeArray) := -{ - vtfunction := 193, - codeplane := p_codeplane, - firstWideCharInInquiryRange := p_firstWideCharInInquiryRange, - lastWideCharInInquiryRange := p_lastWideCharInInquiryRange, - numberOfRanges := p_numberOfRanges, - wideCharRangeArray := p_wideCharRangeArray -} - -template GetMemoryReq t_GetMemoryReq(INT3 p_memoryRequired) := { - vtfunction := 194, - reserved2 := 'FF'O, - memoryRequired := p_memoryRequired, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template GetMemoryRes t_GetMemoryRes(e_GetMemoryResVersionNumber p_versionNumber, e_GetMemoryResStatus p_status) := { - vtfunction := 194, - versionNumber := p_versionNumber, - status := p_status, - reserved4 := 'FF'O, - reserved5 := 'FF'O, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template AnyIsoBusPdu t_WorkingSetMaintenanceReq_pdu( - WorkingSetMaintenanceBitMask p_bitMask, - e_WorkingSetMaintenanceVersionNumber p_versionNumber) := { - ecu2vt := {workingSetMaintenanceReq := t_WorkingSetMaintenanceReq(p_bitMask, p_versionNumber)} -} - -template WorkingSetMaintenanceReq t_WorkingSetMaintenanceReq( - WorkingSetMaintenanceBitMask p_bitMask, - e_WorkingSetMaintenanceVersionNumber p_versionNumber) := { - vtfunction := 255, - bitMask := p_bitMask, - versionNumber := p_versionNumber, - reserved4 := 'FF'O, - reserved5 := 'FF'O, - reserved6 := 'FF'O, - reserved7 := 'FF'O, - reserved8 := 'FF'O -} - -template N_SP_Response t_N_SP_Response(template e_PortNumber t_fromPort, - template e_PortNumber t_toPort, - template N_SP_Response.requestedParametrics requestedParametrics_param) := { - msgFunction := 132, - portPair := {fromPort := t_fromPort, toPort := t_toPort}, - requestedParametrics := requestedParametrics_param -} - -template AnyIsoBusPdu t_N_SP_Response_pdu(template e_PortNumber t_fromPort, - template e_PortNumber t_toPort, - template N_SP_Response.requestedParametrics t_requestedParametrics_param) := { - networkMessage := {n_SP_Response := t_N_SP_Response(t_fromPort, t_toPort, t_requestedParametrics_param) - }} - - -} -
diff --git a/demo/Isobus_test.ttcn b/demo/Isobus_test.ttcn new file mode 100644 index 0000000..d170980 --- /dev/null +++ b/demo/Isobus_test.ttcn
@@ -0,0 +1,1290 @@ +/* Copyright (c) 2000-2019 Ericsson Telecom AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v2.0 +* which accompanies this distribution, and is available at +* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +* +* Contributors: +* Michael Josenhans +******************************************************************************/ +// +// File: J1939test.ttcn +// Description: J1939 port type test +// + + +module Isobus_test { + +import from SocketCAN_Types all; +import from SocketCAN_PortType all; +import from SocketCAN_Templates all; +import from J1939 all; +import from IsobusVT_Templates all; +import from Isobus all; + +template WorkingSetMaintenanceMessages t_WorkingSetMaintenanceTick(template boolean p_tickvalue) := +{workingSetMaintenanceTick := p_tickvalue} + +template WorkingSetMaintenanceMessages t_WorkingSetMaintenanceInitialize(template boolean p_tickvalue) := +{workingSetMaintenanceInitialize := p_tickvalue} +const float c_guard := 50.0 + +type enumerated SocketCAN_open_socket_type +{ + OPEN_CAN_RAW, + OPEN_CAN_BCM, + OPEN_CAN_ISOTP, + OPEN_CAN_J1939 +} + +type enumerated e_Phase { + e_open_socket, + e_testbody1, + e_testbody2, + e_testbody3, + e_testbody4, + e_testbody5, + e_testbody6, + e_testbody7, + e_testbodyEnd, + e_testcase_complete +} + +type record SocketCAN_open_j1939_result{ + SocketCAN_ifr ifr, + SocketCAN_socketid socket_id} + +type record J1939_message { + e_Phase phase, + SocketCAN_J1939_PDU j1939_pdu +} + +const integer J1939_MAX_PDU_NUMBER := 256; // for testing purposes + +type record length (0 .. J1939_MAX_PDU_NUMBER) of SocketCAN_J1939_PDU SocketCAN_J1939_PDUs + +// workarounds as (x .. enum2int(e_testcase_complete)) fails but: +// workarounds as (x .. enum2int(c_testcase_complete)) works +const e_Phase c_firstPhase := e_open_socket +const e_Phase c_testcase_complete := e_testcase_complete + +type record PhaseStartReq { + e_Phase phase, + integer phase_int +} +type record PhaseEndInd { + e_Phase phase, + integer phase_int +} + +type boolean HaltReq +type boolean HaltInd + +type union Command_MTC2PTC{ + PhaseStartReq phaseStartReq, + HaltReq haltReq +} + +type union Command_PTC2MTC{ + PhaseEndInd phaseEndInd, + HaltInd haltInd +} + +type port SyncMasterPort message { + out Command_MTC2PTC + in Command_PTC2MTC +} with { extension "internal" } + +type port SyncSlavePort message { + in Command_MTC2PTC + out Command_PTC2MTC +} with { extension "internal" } + +type port J1939PDU_PT message { + inout J1939PDU_with_NAME +} with { extension "internal" } + +type boolean PoolUploadOngoing + +type port PoolUploadOngoingIn message { + in PoolUploadOngoing +} with { extension "internal" } + +type port PoolUploadOngoingOut message { + out PoolUploadOngoing +} with { extension "internal" } + +type boolean VTStatusTick + +type port VTStatusTickIn message { + in VTStatusTick +} with { extension "internal" } + +type port VTStatusTickOut message { + out VTStatusTick +} with { extension "internal" } + +type boolean WorkingSetMaintenaceOnOff + +type port WorkingSetMaintenaceOnOffIn message { + in WorkingSetMaintenaceOnOff +} with { extension "internal" } + +type port WorkingSetMaintenaceOnOffOut message { + out WorkingSetMaintenaceOnOff +} with { extension "internal" } + +type union WorkingSetMaintenanceMessages +{ + // put all workingSetMaintenance messages here + boolean workingSetMaintenanceTick, + boolean workingSetMaintenanceInitialize +} + +type port WorkingSetMaintenanceIn message { + in WorkingSetMaintenanceMessages +} with { extension "internal" } + +type port WorkingSetMaintenanceOut message { + out WorkingSetMaintenanceMessages +} with { extension "internal" } + +//component declarations + +type component SyncPTC { + port SyncSlavePort pt_sync + var e_Phase v_phase := c_firstPhase +} + +type component PTC_Isobus_VT_VTSTATUSCycleSend_CT extends SyncPTC +{ + port VTStatusTickOut pt_VTStatusTick + port PoolUploadOngoingIn pt_PoolUploadOngoing + //variables + //timers +} + +type component PTC_Isobus_ECU_VTSTATUSCycleReceive_CT extends SyncPTC +{ + port VTStatusTickIn pt_VTStatusTick + port WorkingSetMaintenaceOnOffOut pt_WorkingSetMaintenaceOnOff + //variables + //timers +} + +type component PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT extends SyncPTC +{ + port WorkingSetMaintenaceOnOffIn pt_WorkingSetMaintenaceOnOff + port WorkingSetMaintenanceOut pt_WorkingSetMaintenance + //timers +} + +type component PTC_Isobus_VT_CT extends SyncPTC +{ + port J1939PDU_PT pt_j1939PDU + port VTStatusTickIn pt_VTStatusTick + //variables + var J1939_ADDR v_peeraddr := J1939_NO_ADDR + var J1939_NAME v_peername := J1939_NO_NAME + //timers +} + +type component PTC_Isobus_ECU_CT extends SyncPTC +{ + port J1939PDU_PT pt_j1939PDU + port WorkingSetMaintenanceIn pt_WorkingSetMaintenance + port VTStatusTickOut pt_VTStatusTick + //variables + var J1939_ADDR v_peeraddr := J1939_NO_ADDR + var J1939_NAME v_peername := J1939_NO_NAME + //timers +} + +type component PTCAdapter extends SyncPTC { + port SocketCAN_PT pt_socketCAN + port J1939PDU_PT pt_j1939PDU +} + +type record of PTCs PTCSet + +type union PTCs{ + PTCAdapter ptc_Adapter, + PTC_Isobus_VT_VTSTATUSCycleSend_CT ptc_Isobus_VT_VTSTATUSCycleSend_CT, + PTC_Isobus_VT_CT ptc_Isobus_VT_CT, + PTC_Isobus_ECU_CT ptc_Isobus_ECU_CT, + PTC_Isobus_ECU_VTSTATUSCycleReceive_CT ptc_Isobus_ECU_VTSTATUSCycleReceive_CT, + PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT +} + + +type component MTC{ + timer t_guard + port SyncMasterPort pt_sync + var PTCSet v_PTCSet := {} +} + +altstep alt_awaitPhaseStartReq(in e_Phase p_phase) runs on SyncPTC { + var Command_MTC2PTC v_PhaseStartReq; + [] pt_sync.receive (Command_MTC2PTC:{phaseStartReq:={phase := p_phase, phase_int := ?}}){ + log("PTC name: ", self) + log("Waits for start of phase: ", p_phase) + } + // between v_phase and p_phase + [] pt_sync.receive (Command_MTC2PTC:{phaseStartReq:={phase := ?, phase_int := (enum2int(c_firstPhase) .. enum2int(v_phase))}}) -> value v_PhaseStartReq + { + //v_phase := f_incPhase(v_phase) + log("PTC name: ", self) + log("Waits for start of phase: ", p_phase) + log("Received completion of phase: ", p_phase) + f_sendPhaseEndInd() + repeat + } + [] pt_sync.receive (Command_MTC2PTC:{phaseStartReq:={phase := ?, phase_int :=?}}) -> value v_PhaseStartReq + {log("Received unexpected message:", v_PhaseStartReq);setverdict(inconc)} +} + +function f_startPhase (in e_Phase p_phase) runs on MTC { + var integer v_i + var integer v_amount := sizeof(v_PTCSet) + var Command_MTC2PTC v_phaseStartReq := {phaseStartReq:={ phase := p_phase, phase_int := enum2int(p_phase)}} + + for (v_i := 0; v_i < v_amount; v_i := v_i +1){ + log("MTC instance: ", self) + if (ischosen(v_PTCSet[v_i].ptc_Adapter)) { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Adapter} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT)) { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_CT)) { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_VT_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_CT)){ pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_ECU_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT)) { pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT)){ pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT} + else { + log("Chosen PTC type misssing, please add handling for all PTC types!"); + setverdict(inconc)}//something wrong, this should not happen + } +} + +function f_haltAllComponents () runs on MTC { + var integer v_i + var integer v_amount := sizeof(v_PTCSet) + var Command_MTC2PTC v_haltReq := {haltReq:=true} + for (v_i := 0; v_i < v_amount; v_i := v_i +1){ + log("MTC instance: ", self) + if (ischosen(v_PTCSet[v_i].ptc_Adapter)) { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Adapter} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT)) { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_VT_VTSTATUSCycleSend_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_VT_CT)) { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_VT_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_CT)){ pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_ECU_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT)) { pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_ECU_VTSTATUSCycleReceive_CT} + else if (ischosen(v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT)){ pt_sync.send(v_haltReq) to v_PTCSet[v_i].ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT} + else { + log("Chosen PTC type misssing, please add handling for all PTC types!"); + setverdict(inconc)}//something wrong, this should not happen + } +} + +function f_incPTCPhase(in e_Phase p_currentPhase) runs on SyncPTC return e_Phase { + var e_Phase v_nextPhase + log("PTC: ", self) + log("PTC instance: ", self) + log("Current PTC phase: ", p_currentPhase) + int2enum( enum2int(p_currentPhase)+1, v_nextPhase) + log("Next PTC phase:", v_nextPhase) + return v_nextPhase +} + +function f_sendPhaseEndInd() runs on SyncPTC{ + // just to allow matching with integer ranges on the reception side, as it is not poosible to do so with enums + var Command_PTC2MTC v_PhaseEndInd := {phaseEndInd :={phase := v_phase, phase_int := enum2int(v_phase)}} + pt_sync.send(v_PhaseEndInd) + log("PTC: PhaseEndInd to MTC with content: ", v_PhaseEndInd, self) + v_phase := f_incPTCPhase(v_phase) +} + +function f_addSyncSlaveSet (in PTCs p_slave, + inout PTCSet p_set) { + p_set[sizeof(p_set)] := p_slave + return +} +function f_incMTCPhase(in e_Phase p_currentPhase) runs on MTC return e_Phase { + var e_Phase v_nextPhase + log("MTC: ", self) + log("Current phase: ", p_currentPhase) + int2enum( enum2int(p_currentPhase)+1, v_nextPhase) + log("Next phase:", v_nextPhase) + return v_nextPhase +} + +function f_awaitEndPhase(in e_Phase p_phase) runs on MTC { + var integer v_amount:= sizeof(v_PTCSet); + var integer v_i + t_guard.start(c_guard) + var Command_PTC2MTC v_PhaseEndInd + + log("Available PTCs", v_PTCSet) + + for(v_i := 0; v_i < v_amount; v_i := v_i +1) { + alt { + [] pt_sync.receive (Command_PTC2MTC:{phaseEndInd:= {phase :=p_phase, phase_int := ?}}) -> value v_PhaseEndInd + { + log("Nth PTC", v_i, "of n PTCs: ", v_amount, "Ended phase: ", v_PhaseEndInd.phaseEndInd.phase) + } + // value between p_phase +1 and e_testcase_complete: + [] pt_sync.receive (Command_PTC2MTC:{phaseEndInd:= {phase :=?, phase_int := (enum2int(p_phase) .. (enum2int(c_testcase_complete)))}}) -> value v_PhaseEndInd + { + log("Nth PTC", v_i, "of n PTCs: ", v_amount, "Ended phase: ", v_PhaseEndInd.phaseEndInd.phase) + } + [] t_guard.timeout { + log("Timeout in MTC phase:", p_phase) + setverdict(inconc) + } + [] pt_sync.receive (Command_PTC2MTC:{phaseEndInd:=?}) -> value v_PhaseEndInd { + log("Unexpected phase recieved: ", v_PhaseEndInd) + log("Expected phase range: ", p_phase) + log(" to ", c_testcase_complete) + setverdict(inconc) + } + [] any port.receive{ + log("Expected phase:", p_phase) + setverdict(inconc) + } + + } + } + t_guard.stop +} + +function f_awaitAllComponentsHalt() runs on MTC { + var integer v_amount:= sizeof(v_PTCSet); + var integer v_i + t_guard.start(c_guard) + + for(v_i := 0; v_i < v_amount; v_i := v_i +1) { + alt { + [] pt_sync.receive (Command_PTC2MTC:{haltInd :=?}){ + } + [] t_guard.timeout { + log("Timeout in MTC while waiting for command HaltRes") + setverdict(inconc) + } + [] any port.receive{ + log("Received unexpeced message") + setverdict(inconc) + } + } + } + t_guard.stop +} +function f_open_socket(in SocketCAN_socket p_socket) +runs on PTCAdapter +return SocketCAN_socket_result { + + var SocketCAN_socket_result v_result + timer t_guard + t_guard.start(c_guard) + + pt_socketCAN.send(p_socket) + + // receive response + alt { + [] pt_socketCAN.receive( + a_SocketCAN_socket_result(a_result(SocketCAN_SUCCESS))) -> value v_result + {log("SocketCan:Socket opened: ", v_result.id)} + [] pt_socketCAN.receive(a_SocketCAN_socket_result(a_result(SocketCAN_ERROR))) + {log("Received Opening Socket failed"); setverdict(fail)} + [] t_guard.timeout { + log("guard timeout!") + setverdict(fail)} + } + t_guard.stop + return v_result +} + +function f_ioctl_get_if_index(in SocketCAN_socketid p_socket_id) +runs on PTCAdapter +return SocketCAN_ioctl_result { + var SocketCAN_ioctl_result v_result + timer t_guard + t_guard.start(c_guard) + + pt_socketCAN.send(SocketCAN_ioctl:{id:= p_socket_id, ifu := omit}); + // receive response + alt { + [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_SUCCESS))) -> value v_result + {log("Retrieved interface index", v_result.ifr.if_index)} + [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_ERROR))) + {log("Retrieving interface index failed", p_socket_id); setverdict(fail)} + [] t_guard.timeout { + log("guard timeout!") + setverdict(fail) + } + } + t_guard.stop + return v_result +} + +function f_connect(in SocketCAN_socketid p_socket_id, + in SocketCAN_if_index p_if_index, + in J1939_NAME p_j1939_name_destination, + in J1939_PGN p_j1939_pgn_destination, + in J1939_ADDR p_j1939_pgn_addr) +runs on PTCAdapter +return SocketCAN_connect_result { + var SocketCAN_connect_result v_result + timer t_guard + t_guard.start(c_guard) + + pt_socketCAN.send(SocketCAN_Types.SocketCAN_connect:{id:= p_socket_id, + connectu := {j1939 := {if_index:= p_if_index, + j1939_destination:= { + name := p_j1939_name_destination /* or J1939_NO_NAME */, + pgn := p_j1939_pgn_destination /* or J1939_NO_PGN */, + addr := p_j1939_pgn_addr /* or J1939_NO_ADDR */}}}}); + // SocketCAN_connect receive response + alt { + [] pt_socketCAN.receive(a_SocketCAN_connect_result(a_result(SocketCAN_SUCCESS))) -> value v_result + {log("Connecting socket", p_socket_id)} + [] pt_socketCAN.receive(a_SocketCAN_connect_result(a_result(SocketCAN_ERROR))) + {log("Connecting socket failed.", p_socket_id); setverdict(fail)} + [] t_guard.timeout { + log("guard timeout!") + setverdict(fail)} + } + t_guard.stop + return v_result +} + +function f_bind( + in SocketCAN_socketid p_socket_id, + in SocketCAN_if_index p_if_index, + in J1939_NAME p_j1939_name_source, + in J1939_PGN p_j1939_pgn_source, + in J1939_ADDR p_j1939_addr_source) +runs on PTCAdapter +return SocketCAN_bind_result { + var SocketCAN_bind_result v_result + timer t_guard + t_guard.start(c_guard) + + log("p_socket_id", p_socket_id) + log("p_if_index", p_if_index) + log("p_j1939_name_source", p_j1939_name_source) + log("p_j1939_pgn_source", p_j1939_pgn_source) + log("p_j1939_addr_source", p_j1939_addr_source) + + + pt_socketCAN.send(SocketCAN_bind:{id:= p_socket_id, + bindu := {j1939 := {if_index:= p_if_index, + j1939_source:= + {name := p_j1939_name_source /* or J1939_NO_NAME */, + pgn := p_j1939_pgn_source /* or J1939_NO_PGN */, + addr := p_j1939_addr_source /* or J1939_NO_ADDR or J1939_IDLE_ADDR */ }}}}); + alt { + [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_SUCCESS))) -> value v_result + {log("Binding socket", p_socket_id)} + [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_ERROR))) {} + [] t_guard.timeout { + log("guard timeout!") + setverdict(fail) + } + } + t_guard.stop + return v_result +} + +function f_j1939_send_data_to( + in SocketCAN_socketid p_socket_id, + in SocketCAN_if_index p_if_index, + in J1939_hdr p_j1939_destination, + in SocketCAN_J1939_PDU p_pdu) +runs on PTCAdapter +return SocketCAN_j1939_send_data_to_result { + var SocketCAN_j1939_send_data_to_result v_result + + timer t_guard + t_guard.start(c_guard) + + pt_socketCAN.send(SocketCAN_j1939_send_data_to:{ + id := p_socket_id, + if_index := p_if_index, + j1939_destination := p_j1939_destination, + pdu := p_pdu}); + + alt { + [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_SUCCESS))) -> value v_result + {log("Sending j1939_send_data_to", p_socket_id)} + [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_ERROR))) + {log("Sending j1939_send_data_to failed", p_socket_id); setverdict(fail)} + [] t_guard.timeout { + log("guard timeout!") + setverdict(fail) + } + } + t_guard.stop + return v_result +} + +function f_j1939_send_data(in SocketCAN_socketid p_socket_id, + in SocketCAN_J1939_PDU p_pdu) +runs on PTCAdapter +return SocketCAN_j1939_send_data_result { + + var SocketCAN_j1939_send_data_result v_result + + timer t_guard + t_guard.start(c_guard) + log("SocketCAN_j1939_send_data_to:{id}:", p_socket_id) + log("SocketCAN_j1939_send_data_to:{pdu}:", p_pdu) + + pt_socketCAN.send(SocketCAN_j1939_send_data:{ + id:= p_socket_id, + pdu:=p_pdu}); + alt { + [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_result(a_result(SocketCAN_SUCCESS))) -> value v_result + {log("Writing data on J1939 socket: ", p_socket_id)} + [] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_result(a_result(SocketCAN_ERROR))) + {log("Writing data on J1939 socket failed", p_socket_id); + setverdict(fail)} + [] t_guard.timeout { + log("guard timeout!") + setverdict(fail)} + } + t_guard.stop + return v_result +} + +function f_setsockopt(in SocketCAN_socketid p_socket_id, + in SocketCAN_setsockopt_commandu p_command) +runs on PTCAdapter +return SocketCAN_setsockopt_result{ + var SocketCAN_setsockopt_result v_result + + timer t_guard + t_guard.start(c_guard) + + pt_socketCAN.send(SocketCAN_Types.SocketCAN_setsockopt:{id:= p_socket_id, command := p_command}); + alt { + [] pt_socketCAN.receive(a_SocketCAN_setsockopt_result(a_result(SocketCAN_SUCCESS))) -> value v_result + {log("Writing data", p_socket_id)} + [] pt_socketCAN.receive(a_SocketCAN_setsockopt_result(a_result(SocketCAN_ERROR))) + {log("Writing data failed", p_socket_id); setverdict(fail)} + [] t_guard.timeout { + log("guard timeout!") + setverdict(fail) + } + } + t_guard.stop + return v_result +} + +function f_close_socket (in SocketCAN_socketid p_socket_id) +runs on PTCAdapter { + pt_socketCAN.send(SocketCAN_close:{id:= p_socket_id}); +} + +function f_open_j1939() +runs on PTCAdapter +return SocketCAN_open_j1939_result { + var SocketCAN_socketid v_socket_id + v_socket_id := f_open_socket({domain:=PF_CAN, ptype := SOCK_DGRAM, protocol:= CAN_J1939}).id + var SocketCAN_ifr v_ifr + v_ifr := f_ioctl_get_if_index(v_socket_id).ifr + + var SocketCAN_open_j1939_result v_result + v_result := {ifr := v_ifr, socket_id := v_socket_id} + + return v_result +} + +function f_ptc_J1939Adapter( + in e_Phase p_phase, + in J1939_Priority p_send_prio, + in J1939_NAME p_j1939_name_source) runs on PTCAdapter { + map(self:pt_socketCAN, system:pt_socketCAN) + var SocketCAN_socketid v_socket_id + var SocketCAN_ifr v_ifr + + alt_awaitPhaseStartReq(e_open_socket) + var SocketCAN_open_j1939_result res + res := f_open_j1939() + v_socket_id := res.socket_id + v_ifr := res.ifr + var SocketCAN_bind_result v_bind_result + v_bind_result := f_bind(v_socket_id, + v_ifr.if_index, + p_j1939_name_source, + J1939_NO_PGN, /* p_j1939_pgn_source */ + J1939_NO_ADDR /* p_j1939_addr_source */) + var SocketCAN_setsockopt_result v_setsockopt_result + v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio}) + const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} + // configure broadcast: + v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast) + f_sendPhaseEndInd() //e_open_socket + alt_awaitPhaseStartReq(p_phase) + f_sendPhaseEndInd() + alt_awaitPhaseStartReq(e_testbodyEnd) + f_sendPhaseEndInd() + + + var SocketCAN_receive_j1939_message v_result + var SocketCAN_j1939_send_data_to_result v_send_data_to_result + var J1939PDU_with_NAME v_pgn_and_pdu_with_name + var boolean condition := true + var boolean v_guard :=true + + timer t_guard + + + + while (condition) + { + alt + { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + [v_guard] pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=?,pdu:=?}) + -> value v_pgn_and_pdu_with_name + { + t_guard.start(c_guard) + + var octetstring v_j1939_pdu, v_pgn_and_pdu + v_pgn_and_pdu := f_encode_J1939_message (v_pgn_and_pdu_with_name.pdu) + v_j1939_pdu := substr(v_pgn_and_pdu,3,lengthof(v_pgn_and_pdu)-3)// strip PGN + + var J1939_hdr v_j1939_destination := { + name := v_pgn_and_pdu_with_name.name, + pgn := substr(v_pgn_and_pdu,0,3), // strip PDU, pgn_destination + addr:= v_pgn_and_pdu_with_name.addr + } + + + pt_socketCAN.send(SocketCAN_j1939_send_data_to:{ + id := v_socket_id, + if_index := v_ifr.if_index, + j1939_destination := v_j1939_destination, + // strip PGN + pdu := v_j1939_pdu}); + + v_guard:=false; //stop receiving until send confirmation received + } + + [not(v_guard)] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_SUCCESS))) -> value v_send_data_to_result + { + log("Sending j1939_send_data_to:", v_socket_id, ", ", v_ifr.if_index) + v_guard:=true + t_guard.stop + } + + [not(v_guard)] pt_socketCAN.receive(a_SocketCAN_j1939_send_data_to_result(a_result(SocketCAN_ERROR))) + { + log("Sending j1939_send_data_to failed", v_socket_id); + v_guard:=true + t_guard.stop + setverdict(fail) + } + + [] pt_socketCAN.receive(a_SocketCAN_receive_j1939_message( + v_socket_id, + v_ifr, + ?, /* any pgn */ + ?, /* any peer_addr */ + ?, /* any peer_name */ + ? /* any j1939_pdu */)) -> value v_result + { + log("SocketCan:J1939 message from socket received", v_result) + pt_j1939PDU.send({addr:=v_result.destAddr, name:= v_result.name, + // concatenate received pgn and pdu + pdu:=f_decode_J1939_message(v_result.pgn & v_result.pdu) /* concatenate pgn & pdu */}); + } + [] pt_sync.receive + { + log("Fail:Unexpected message from port pt_sync received"); + setverdict(fail) + } + [v_guard] pt_socketCAN.receive + { + log("Fail:Unexpected message from port pt_socketCAN received") + //this should catch any incoming message type not matched on the first alternatives + setverdict(fail) + } + + [v_guard] pt_j1939PDU.receive + { + log("Fail:Unexpected message from port pt_j1939PDU received") + //this should catch any incoming message type not matched on the first alternatives + setverdict(fail) + } + + [v_guard] any port.receive + { + log("Fail:Message received on a different port") + //this should catch any incoming message type not matched on the first alternatives on any other port + setverdict(fail) + } + + [not(v_guard)] t_guard.timeout { + log("guard timeout!") + setverdict(fail) + } + }//endalt + } // end while + + + f_close_socket (v_socket_id) + unmap(self:pt_socketCAN, system:pt_socketCAN) + setverdict(pass) +} + +function f_ptc_J1939ECUApplication(in e_Phase p_phase) runs on PTC_Isobus_ECU_CT +{ + + var boolean condition := true + alt_awaitPhaseStartReq(p_phase) + f_sendPhaseEndInd() + alt_awaitPhaseStartReq(e_testbodyEnd) + + + while (condition) + { + var J1939PDU_with_NAME v_pgn_and_pdu_with_name + + alt + { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=?, + pdu:=t_VTStatusInd(?, ?, ?, ?, ?)}) -> value v_pgn_and_pdu_with_name + { + v_peeraddr := v_pgn_and_pdu_with_name.addr + v_peername := v_pgn_and_pdu_with_name.name + // store peer name + //log incoming message + log("SocketCan:Expected message VTStatusReq received!", v_pgn_and_pdu_with_name) + pt_VTStatusTick.send( true ); + } + [] pt_WorkingSetMaintenance.receive(t_WorkingSetMaintenanceTick(?)) { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */ + v_peername, /* set peername */ + t_WorkingSetMaintenanceInd(true, compliantWithVTVersion4) + + )) + } + + []pt_WorkingSetMaintenance.receive(t_WorkingSetMaintenanceInitialize(true)) { + // the ECU has received the first VTStatus message + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */ + v_peername, /* set peername */ + t_GetHardwareReq + )) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername, + pdu:=t_GetHardwareRes(?, ?, ?, ?, ?)}) -> value v_pgn_and_pdu_with_name + { + log("SocketCan:Expected message GetHardwareRes received!", v_pgn_and_pdu_with_name) + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */ + v_peername, /* set peername */ + t_GetNumberOfSoftKeysReq + )) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername, + pdu:=t_GetNumberOfSoftKeysRes(?, ?, ?, ?, ?)}) -> value v_pgn_and_pdu_with_name + { + log("SocketCan:Expected message GetNumberOfSoftKeysRes received!", v_pgn_and_pdu_with_name) + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */ + v_peername, /* set peername */ + t_GetTextFontDataReq + )) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername, + pdu:=t_GetTextFontDataRes(?, ?, ?)}) -> value v_pgn_and_pdu_with_name + { + log("SocketCan:Expected message GetTextFontDataRes received!", v_pgn_and_pdu_with_name) + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */ + v_peername, /* set peername */ + t_GetMemoryReq(100000) + )) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername, + pdu:=t_GetMemoryRes(?, ?)}) -> value v_pgn_and_pdu_with_name + { + log("SocketCan:Expected message GetMemoryRes received!", v_pgn_and_pdu_with_name) + log("SocketCan:Sending broken object pool!") + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */ + v_peername, /* set peername */ + t_ObjectPoolTransferInd('0123456789ABCDEF'O))) + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* set addr 0xFF, applies as name is set */ + v_peername, /* set peername */ + t_EndOfObjectPoolReq)) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername, + pdu:=t_EndOfObjectPoolRes(?, ?, ?, + /* objectPoolErrorCodes */ { + methodOrAttributeNotSupportedByTheVT :=?, + unknownObjectReference :=true, + anyOtherError :=?, + objectPoolWasDeletedFromVolatileMemory :=?, + reserved4 :=false, + reserved5 :=false, + reserved6 :=false, + reserved7 :=false + })}) -> value v_pgn_and_pdu_with_name + { + log("Expected message EndOfObjectPoolRes received!", v_pgn_and_pdu_with_name) + f_sendPhaseEndInd() + + setverdict ( pass ); + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:= ?, name:=v_peername, + pdu:=t_EndOfObjectPoolRes(?, ?, ?, + /* objectPoolErrorCodes */ { + methodOrAttributeNotSupportedByTheVT :=?, + unknownObjectReference :=?, + anyOtherError :=?, + objectPoolWasDeletedFromVolatileMemory :=?, + reserved4 :=false, + reserved5 :=false, + reserved6 :=false, + reserved7 :=false + })}) -> value v_pgn_and_pdu_with_name + { + log("Unxxpected message EndOfObjectPoolRes response parameter received!", v_pgn_and_pdu_with_name) + f_sendPhaseEndInd() + + setverdict ( fail ); + } + + [] pt_j1939PDU.receive(J1939PDU_with_NAME:{addr:=?, name:=?,pdu:=?}) -> value v_pgn_and_pdu_with_name + { + log("Unexpected message received!", v_pgn_and_pdu_with_name) + } + + [] pt_j1939PDU.receive + {log("Unexpected message received")} //this should catch any incoming message type not matched on the first alternatives + + // [] any port.receive + // { + // setverdict(fail) + // log("Message received on a different port") //this should catch any incoming message type not matched on the first alternatives on any other port + // } + }//endalt + } // end while +} + +function f_ptc_J1939VTApplication(in e_Phase p_phase) runs on PTC_Isobus_VT_CT +{ + var boolean condition := true + alt_awaitPhaseStartReq(p_phase) + f_sendPhaseEndInd() + alt_awaitPhaseStartReq(e_testbodyEnd) + + + while (condition) + { + var J1939PDU_with_NAME v_pgn_and_pdu_with_name + alt + { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + []pt_VTStatusTick.receive(VTStatusTick:?) + { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + J1939_NO_ADDR, /* send broadcast, as name is set to J1939_NO_NAME */ + J1939_NO_NAME, /* set peername */ + t_VTStatusInd(J1939_IDLE_ADDR, + 'FFFF'O, + 'FFFF'O, + vtIsBusyUpdatingVisibleMask, + 'FF'O) + )) + } + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_WorkingSetMaintenanceInd(?, ?)}) -> value v_pgn_and_pdu_with_name + { + //log incoming message + log("SocketCan:Expected WorkingSetMaintenanceInd message received!", v_pgn_and_pdu_with_name) + log("The version number is", v_pgn_and_pdu_with_name.pdu.pdu.ecu2vt.workingSetMaintenanceInd.versionNumber) + v_peeraddr := v_pgn_and_pdu_with_name.addr + v_peername := v_pgn_and_pdu_with_name.name + // store peer name + } + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_GetHardwareReq}) -> value v_pgn_and_pdu_with_name + { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + v_pgn_and_pdu_with_name.addr, + v_pgn_and_pdu_with_name.name, /* respond to sender */ + t_GetHardwareRes( + /* bootTimeInSeconds */ 255, + /* graphicType */ colors256, + /* hardware */ { + touchScreenandPointingEvent := true, + pointingDeviceAndPointingEvent := false, + multipleFrequencyAudioOutput := true, + adjustableVolumeAudioOutput := true, + simultaneousActivationsOfPhysicalSoftKeys := false, + simultaneousActivationsOfButtons := false, + dragOperationViaPointingEvent := true, + intermediateCoordinatesDuringDragOperation := true }, + /* xPixels */ 480, + /* yPixels */480) + )) + } + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_GetNumberOfSoftKeysReq}) -> value v_pgn_and_pdu_with_name + { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + v_pgn_and_pdu_with_name.addr, + v_pgn_and_pdu_with_name.name, /* respond to sender */ + t_GetNumberOfSoftKeysRes( + /* navigationSoftKeys */ '00'O, + /* x_dots */ '7D'O, + /* y_dots */ '48'O, + /* numberOfVirtualSoftKeys */ '40'O , + /* numberOfPhysicalSoftKeys */ '0C'O + ))) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_GetTextFontDataReq}) -> value v_pgn_and_pdu_with_name + { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + v_pgn_and_pdu_with_name.addr, + v_pgn_and_pdu_with_name.name, /* respond to sender */ + t_GetTextFontDataRes( + /* small_font_sizes */ { + font_8x8 := true, + font_8x12 := true, + font_12x16 := true, + font_16x16 := true, + font_16x24 := true, + font_24x32 := true, + font_32x32 := true, + reserved := false }, + /* large_font_sizes */ { + font_32x48 := true, + font_48x64 := true, + font_64x64 := true, + font_64x96 := true, + font_96x128 := true, + font_128x128 := true, + font_128x192 := true, + reserved := false }, + /* type_attribute */ { + bold_text := true, + crossed_out_text := true, + underlined_text := true, + italics_text := true, + inverted_text := true, + flash_inverted := true, + flash_background_and_foreground := true, + proportional_font_rendering := true } + ))) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_GetMemoryReq(?)}) -> value v_pgn_and_pdu_with_name + { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + v_pgn_and_pdu_with_name.addr, + v_pgn_and_pdu_with_name.name, /* respond to sender */ + t_GetMemoryRes( + /* versionNumber */ compliantWithISVersionISO11783_6_2010_E_Second_Edition_version_4, + /* status */ thereCanBeEnoughMemory + ))) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_GetVersionsReq}) -> value v_pgn_and_pdu_with_name + { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + v_pgn_and_pdu_with_name.addr, + v_pgn_and_pdu_with_name.name, /* respond to sender */ + t_GetVersionsRes( + /* numberOfVersionStrings */ 0, + /* versionStrings */ { } + ))) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_ObjectPoolTransferInd(?)}) -> value v_pgn_and_pdu_with_name + { + log("Received Object Pool", v_pgn_and_pdu_with_name.pdu.pdu.ecu2vt.objectPoolTransferInd.objectPoolRecords) + log("From addr:", v_pgn_and_pdu_with_name.addr) + log("From name:", v_pgn_and_pdu_with_name.name) + } + + []pt_j1939PDU.receive(J1939PDU_with_NAME:{ + addr := ?, + name:=?, + pdu:=t_EndOfObjectPoolReq}) -> value v_pgn_and_pdu_with_name + { + pt_j1939PDU.send(t_J1939PDU_with_NAME( + v_pgn_and_pdu_with_name.addr, + v_pgn_and_pdu_with_name.name, /* respond to sender */ + t_EndOfObjectPoolRes( + /* errorCodes */ { + thereAreErrorsInTheObjectPool := false, + vtRanOutOfMemoryDuringTransfer := false, + reserved2 := false, + reserved3 := false, + anyOtherError := false, + reserved5 := false, + reserved6 := false, + reserved7 := false}, + /* parentObjectIDoFaultyObject */ 1, + /* objectIDofFaultyObject */ 2, + /* objectPoolErrorCodes */ { + methodOrAttributeNotSupportedByTheVT :=false, + unknownObjectReference :=true, + anyOtherError :=false, + objectPoolWasDeletedFromVolatileMemory :=false, + reserved4 :=false, + reserved5 :=false, + reserved6 :=false, + reserved7 :=false + } + ))) + f_sendPhaseEndInd() + + setverdict ( pass ); + } + + [] pt_j1939PDU.receive(J1939PDU_with_NAME:{addr := ?, name:=?,pdu:=?}) -> value v_pgn_and_pdu_with_name + { + log("SocketCan:Unexpected message received!", v_pgn_and_pdu_with_name) + } + + [] pt_j1939PDU.receive + {log("Unexpected message received")} + //this should catch any incoming message type not matched on the first alternatives + + [] any port.receive + { + setverdict(fail) + log("Message received on a different port")} + //this should catch any incoming message type not matched on the first alternatives on any other port + + }//endalt + } // end while + + setverdict(pass) +} + + +function f_ptc_J1939VTStatusCycleSend(in e_Phase p_phase) runs on PTC_Isobus_VT_VTSTATUSCycleSend_CT +{ + //periodic sending + timer VTStatusClock := 1.0 + var boolean condition := true + alt_awaitPhaseStartReq(p_phase) + f_sendPhaseEndInd() + alt_awaitPhaseStartReq(e_testbodyEnd) + f_sendPhaseEndInd() + + while (condition) + { + pt_VTStatusTick.send(true); + + VTStatusClock.start + alt + { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + []VTStatusClock.timeout; + } + }//endwhile + + setverdict(pass) + +}//endfunction + +function f_ptc_J1939_VTStatusCycleReceive(in e_Phase p_phase) runs on PTC_Isobus_ECU_VTSTATUSCycleReceive_CT +{ + + timer T_VTStatusReceive := 3.0 + var boolean v_VTStatusReceive_running := false + var boolean condition := true + //periodic reception + + alt_awaitPhaseStartReq(p_phase) + f_sendPhaseEndInd() + alt_awaitPhaseStartReq(e_testbodyEnd) + f_sendPhaseEndInd() + + while (condition) + { + select (v_VTStatusReceive_running) // state + { + case (true) { + alt { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + []pt_VTStatusTick.receive(?) { + //log incoming message + T_VTStatusReceive.stop; + T_VTStatusReceive.start; + pt_WorkingSetMaintenaceOnOff.send( true ); + } + + []T_VTStatusReceive.timeout + { + pt_WorkingSetMaintenaceOnOff.send( false ); + v_VTStatusReceive_running := false + } + }//endalt + } + case (false) { + alt { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + []pt_VTStatusTick.receive(?) { + //log incoming message + T_VTStatusReceive.start; + v_VTStatusReceive_running := true + pt_WorkingSetMaintenaceOnOff.send( true ); + } + } //endalt + } + } + + } + setverdict(pass) + +}//endfunction + + +function J1939_ECU_WorkingSetMaintenanceIndCycleSend(in e_Phase p_phase) runs on PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT +{ + timer T_WorkingSetMaintenanceIndCycleSend := 1.0 + var boolean v_WorkingSetMaintenaceOn := false + var boolean condition := true + + //periodic reception + + alt_awaitPhaseStartReq(p_phase) + f_sendPhaseEndInd() + alt_awaitPhaseStartReq(e_testbodyEnd) + f_sendPhaseEndInd() + + while (condition) + { + select (v_WorkingSetMaintenaceOn) { + case (true) { + alt { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + []pt_WorkingSetMaintenaceOnOff.receive(true) + // timer already running + { + //do not do anything + //log incoming message + } + []pt_WorkingSetMaintenaceOnOff.receive(false) { + T_WorkingSetMaintenanceIndCycleSend.stop; + //log incoming message + // do not start timer + v_WorkingSetMaintenaceOn := false // timer is not running + // trigger ECU reset + } + []T_WorkingSetMaintenanceIndCycleSend.timeout + { + // restart timer + T_WorkingSetMaintenanceIndCycleSend.start + pt_WorkingSetMaintenance.send( t_WorkingSetMaintenanceTick(true)) + } + } //endalt + } + case (false) { + alt { + [] pt_sync.receive (Command_MTC2PTC:{haltReq:=?}){ + pt_sync.send(Command_PTC2MTC:{haltInd:=true}) + log("PTC name: ", self) + log("Got HaltReq command") + condition := false + } + + []pt_WorkingSetMaintenaceOnOff.receive(true) { + // timer not running + // start timer + T_WorkingSetMaintenanceIndCycleSend.start + //log incoming message + v_WorkingSetMaintenaceOn := true // timer is running + pt_WorkingSetMaintenance.send( t_WorkingSetMaintenanceTick(true) ) + pt_WorkingSetMaintenance.send( t_WorkingSetMaintenanceInitialize(true) ) + } + []pt_WorkingSetMaintenaceOnOff.receive(false) { + //timer is stopped + //log incoming message + // do not start timer + // trigger ECU reset + } + } + } //endalt + } + } + setverdict ( pass ); +}//endfunction + + +}
diff --git a/demo/Isobus_test_encoder.ttcn b/demo/Isobus_test_encoder.ttcn new file mode 100644 index 0000000..f69a236 --- /dev/null +++ b/demo/Isobus_test_encoder.ttcn
@@ -0,0 +1,762 @@ +/* Copyright (c) 2000-2019 Ericsson Telecom AB AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* http://www.eclipse.org/legal/epl-v10.html +* +* Contributors: +* Michael Josenhans +******************************************************************************/ +// +// File: Isobustest_plain_socketcan.ttcn +// Description: Encoder / Decoder for Isobus message frames +// +// Revision R1A + +module Isobustest_test_encoder{ + +import from Isobus all +import from IsobusVT_Templates all +import from J1939 all + +//component declarations +type component MTC_CT +{ +} + +testcase tc_encdec() runs on MTC_CT +{ + template J1939_messageWithPGN t_address_claimed := {pgn := '00EEFF'O, + pdu := {addressClaimedOrCannotClaimSourceAddress := { name := { + identityNumber := 514, + manufacturerCode := 368, + ecuInstance := 3, + functionInstance := 5, + function_ := 3, + reserved := 0, + vehicleSystem := 101, + vehicleSystemInstance := 1, + industryGroup := 3, + arbitraryAddresssBit := 0 + }}}} + + log(f_encode_J1939_message(valueof(t_address_claimed))) + log("--------------------------------------------") + log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_address_claimed)))) + log("--------------------------------------------") + + template J1939_messageWithPGN t_requestForAddressClaimed := {pgn := '00EA00'O, + pdu := {requestForAddressClaimed := {pgn := 123}}} + + log(f_encode_J1939_message(valueof(t_requestForAddressClaimed))) + log("--------------------------------------------") + log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_requestForAddressClaimed)))) + log("--------------------------------------------") + + // template CAN_frame_j1939 t_CAN_frame_j1939_3 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := 'FD'O, sa := 'C0'O }, can_pdu := { cannotClaimSourceAddress := { name := { + // arbitraryAddresssBitValue := 0, + // industryGroupValue := 3, + // vehicleSystemInstanceValue := 1, + // vehicleSystemValue := 101, + // reservedValue := 0, + // functionValue := 3, + // functionInstanceValue := 5, + // ecuInstanceValue := 3, + // manufacturerCodeValue := 368, + // identityNumberValue := 514 } }}} + // log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3))) + // log("--------------------------------------------") + // log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3)))) + // log("--------------------------------------------") + + template J1939_messageWithPGN t_commandedAddress := {pgn := '00FED8'O, + pdu := { commandedAddress := { + name := { + identityNumber := 514, + manufacturerCode := 368, + ecuInstance := 3, + functionInstance := 5, + function_ := 3, + reserved := 0, + vehicleSystem := 101, + vehicleSystemInstance := 1, + industryGroup := 3, + arbitraryAddresssBit := 0 }, + newSourceAddress:='AA'O + } } } + + log(f_encode_J1939_message(valueof(t_commandedAddress))) + log("--------------------------------------------") + log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_commandedAddress)))) + log("--------------------------------------------") +} + +testcase tc_encdec_vtStatusReq() runs on MTC_CT +{ + template J1939_messageWithPGN t_commandedAddress := {pgn := '00E600'O, + pdu := {vt2ecu := {vtStatusInd := + { vtfunction := 254, + sourceAddressOfActiveWorkingSetMaster := '11'O, + objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet := '2233'O, + objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet := '4455'O, + vtBusyCodes := vtIsBusyExecutingACommand, + vtFunctionCode := '66'O}}}} + log(f_encode_J1939_message(valueof(t_commandedAddress))) + log("--------------------------------------------") + log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_commandedAddress)))) + log("--------------------------------------------") +} + +testcase tc_encdec_getMemoryReq() runs on MTC_CT +{ + template J1939_messageWithPGN t_commandedAddress := {pgn := '00E700'O, + pdu := {ecu2vt := {getMemoryReq := + { vtfunction := 192, + reserved2 := 'FF'O, + memoryRequired := 1234567}}}} + log(f_encode_J1939_message(valueof(t_commandedAddress))) + log("--------------------------------------------") + log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_commandedAddress)))) + log("--------------------------------------------") +} + +testcase tc_encdec_getMemoryReq_with_template() runs on MTC_CT // using a template +{ + template J1939_messageWithPGN t_getMemoryReq := t_GetMemoryReq(1234567) + log(f_encode_J1939_message(valueof(t_getMemoryReq))) + log("--------------------------------------------") + log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_getMemoryReq)))) + log("--------------------------------------------") +} + +testcase tc_encdec_workingSetMaintenanceReq() runs on MTC_CT // using a template +{ + template J1939_messageWithPGN t_workingSetMaintenanceReq := t_WorkingSetMaintenanceInd( + true, + compliantWithVTVersion4) + log(f_encode_J1939_message(valueof(t_workingSetMaintenanceReq))) + log("--------------------------------------------") + log(f_decode_J1939_message(f_encode_J1939_message(valueof(t_workingSetMaintenanceReq)))) + log("--------------------------------------------") +} + + +//testcase tc_dec_largemessage() runs on MTC_CT +//{ +// +// var octetstring j1939_pdu +// //j1939_pdu := '18EAFFFE00EE00'O +// //j1939_pdu := '18EEFFF83102032E003D0080'O +// //j1939_pdu := '18EEFFF73102032E008200A0'O +// //j1939_pdu := '18EAF8F8EBFE00'O +// j1939_pdu := '18ECF8F810160004FFEBFE00'O +// +// // j1939_pdu := '00E726F8B3DA590B0066696C6520736572766572'O +// // j1939_pdu := '03FE00F8FE2A66696C65207365727665722A3139373136392A2D2A'O +// // j1939_pdu := '03FE00F82A66696C65207365727665722A3139373136392A2D2A'O +// // j1939_pdu := '03FE00262A6661726D20646973706C61792A3139373136392A2D2A'O +// // j1939_pdu := '03FE00F72A7461736B20636F6E74726F6C6C65722A3139373136392A2D2A'O +// // j1939_pdu := '03FE00FD2A6661726D20646973706C61792A3139373136392A2D2A'O +// // j1939_pdu := '01FD00F82D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O +// // j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O +// // j1939_pdu := '01FD00F72D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O +// // j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O +// // j1939_pdu := '01FD00FD2D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O +// // j1939_pdu := '02FE00FD016661726D20646973706C617920312E33372E31362E3733352A'O +// // j1939_pdu := '02FE0026026661726D20646973706C617920312E33372E31362E3733352A69736F627573206C69627261727920312E32362E332E3932382A'O +// // j1939_pdu := '02FE00F8096E696E67757065782066696C6520736572766572207573657220696E74657266616365204E5820322E322E342E3237302A746F6F6C206C69627261727920322E34322E382E3834302A6C6F67206C69627261727920322E302E31312E3136342A636F6E66696775726174696F6E206C69627261727920312E31322E322E3139332A43414E20627573206861726477617265206C69627261727920312E31392E352E3139382A7365637572697479206C69627261727920312E31312E302E3332312A69736F627573206C69627261727920312E32362E332E3932382A69736F62757320636F6D6D6F6E206C69627261727920322E31322E302E3139332A66696C652073657276657220312E342E352E3235382A'O +// // j1939_pdu := '9CFE0DF8FE01FFFFFFFFFFFFFF'O +// +// log(j1939_pdu) +// log("--------------------------------------------") +// log(f_decode_CAN_frame_j1939(j1939_pdu)) +// log("--------------------------------------------") +//} + +testcase tc_dec_message1() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e600'O + j1939_pdu := 'fefeffffffff00ff'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message2() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e700'O + j1939_pdu := 'ff0104ffffffffff'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message3() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e700'O + j1939_pdu := 'c7ffffffffffffff'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message4() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e600'O + j1939_pdu := 'c7ff02cde001e001'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message5() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e700'O + j1939_pdu := 'c2ffffffffffffff'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message6() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e600'O + j1939_pdu := 'c200ffff7d48400c'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message7() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e700'O + j1939_pdu := 'C3FFFFFFFFFFFFFF'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message8() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e600'O + j1939_pdu := 'C3FFFFFFFF7F7FFF'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message9() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e700'O + j1939_pdu := 'C0FF00000000FFFF'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message10() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e600'O + j1939_pdu := 'C00400FFFFFFFFFF'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message11() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e700'O + j1939_pdu := 'DFFFFFFFFFFFFFFF'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message12() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e600'O + j1939_pdu := 'E00130303034333030'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message13() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e700'O + j1939_pdu := 'D130303034333030'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message14() runs on MTC_CT +{ + + var J1939_PGN j1939_pgn + var octetstring j1939_pdu + + + j1939_pgn := '00e600'O + j1939_pdu := 'D1FFFFFFFF00FFFF'O + + log(j1939_pgn, j1939_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn & j1939_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message15() runs on MTC_CT +{ + + var octetstring j1939_pgn_and_pdu + + + j1939_pgn_and_pdu := '00E600E00130303032303036'O + + log(j1939_pgn_and_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn_and_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message16() runs on MTC_CT +{ + + var octetstring j1939_pgn_and_pdu + + + j1939_pgn_and_pdu := '00E700D130303032303036'O + + log(j1939_pgn_and_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn_and_pdu)) + log("--------------------------------------------") +} + +testcase tc_dec_message17() runs on MTC_CT +{ + + var octetstring j1939_pgn_and_pdu + + + j1939_pgn_and_pdu := '00E60009D00701FFFF01FF'O + j1939_pgn_and_pdu := '00E70009D00701FFFF01FF'O + j1939_pgn_and_pdu := '00E600FEF8D007FFFF00FF'O + j1939_pgn_and_pdu := '00E600B3FFFFDA5900FFFF'O + j1939_pgn_and_pdu := '00E700A82BD3FFBC0B0000'O + j1939_pgn_and_pdu := '00E600A82BD300BC0B0000'O + j1939_pgn_and_pdu := '00E700A82CD3FFBB0B0000'O + j1939_pgn_and_pdu := '00E600A82CD300BB0B0000'O + j1939_pgn_and_pdu := '00E700A82DD3FFBB0B0000'O + j1939_pgn_and_pdu := '00E600A82DD300BB0B0000'O + j1939_pgn_and_pdu := '00E600D1FFFFFFFF00FFFF'O + j1939_pgn_and_pdu := '00E700B3DA590B0066696C6520736572766572'O + j1939_pgn_and_pdu := '00E60009D00701FFFF00FF'O + j1939_pgn_and_pdu := '00E70009D00701FFFF00FF'O + j1939_pgn_and_pdu := '00E700B302D72B00746F756368206F72207072657373206B657920746F206D6F766520686572652066726F6D20565420233100'O + j1939_pgn_and_pdu := '00E600B3FFFF02D700FFFF'O + j1939_pgn_and_pdu := '00E700B3B42D08006E696E6775706578'O + j1939_pgn_and_pdu := '00E600B3FFFFB42D00FFFF'O + j1939_pgn_and_pdu := '00E700A875D6FFC4DA0000'O + j1939_pgn_and_pdu := '00E600A875D600C4DA0000'O + //.. + j1939_pgn_and_pdu := '00E700AD0000ED03FFFFFF'O + j1939_pgn_and_pdu := '00E600ADED0300FFFFFFFF'O + + log(j1939_pgn_and_pdu) + log("--------------------------------------------") + log(f_decode_J1939_message(j1939_pgn_and_pdu)) + log("--------------------------------------------") +} + + + + +function f_reverse_j1939_name_withoutencoding(in J1939_NAME p_j1939_name) +//runs on PTC_isobus_CT +return J1939_NAME{ + var J1939_NAME v_j1939_name_reverse := + + p_j1939_name[7]& p_j1939_name[6]& p_j1939_name[5]& + p_j1939_name[4]& p_j1939_name[3]& p_j1939_name[2]& + p_j1939_name[1]& p_j1939_name[0]; + return v_j1939_name_reverse +} + +// f_reverse_j1939_name() has the same behaviour as f_reverse_j1939_name_withoutencoding() + +function f_reverse_j1939_name(in J1939_NAME p_j1939_name) +//runs on PTC_isobus_CT +return J1939_NAME{ + var J1939_NAME v_j1939_name_reverse := f_encode_J1939_name(p_j1939_name) + + return v_j1939_name_reverse +} + +testcase tc_dec_name_1() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E003D0080'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name(f_decode_J1939_name(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_2() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E008200A0'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name(f_decode_J1939_name(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_3() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E001D0080'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name(f_decode_J1939_name(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_4() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E008100A0'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name(f_decode_J1939_name(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_5() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E00800AA1'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name(f_decode_J1939_name(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_6() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E193D0B93'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name(f_decode_J1939_name(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_record_1() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E003D0080'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name_record(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_record_2() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E008200A0'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name_record(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_record_3() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E001D0080'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name_record(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_record_4() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E008100A0'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name_record(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_record_5() runs on MTC_CT +{ + + var J1939_NAME j1939_name_reverse, j1939_name + + j1939_name_reverse := '3102032E00800AA1'O + + j1939_name := f_reverse_j1939_name(j1939_name_reverse) + + log("j1939 name reverse:-------------------------") + log(j1939_name_reverse) + log("j1939 name----------------------------------") + log(j1939_name) + log("--------------------------------------------") + log(f_decode_J1939_name_record(j1939_name)) + log("--------------------------------------------") + log(f_encode_J1939_name_record(f_decode_J1939_name_record(j1939_name))) + log("--------------------------------------------") +} + +testcase tc_dec_name_record_encode_1() runs on MTC_CT +{ + + var J1939_NAME_RECORD j1939_name_record := { + arbitraryAddresssBit := 1, + industryGroup := 2, + vehicleSystemInstance := 0, + vehicleSystem := 0, + reserved := 0, + function_ := 129, + functionInstance := 0, + ecuInstance := 0, + manufacturerCode := 368, + identityNumber := 999 + } + + log("j1939 name_record --------------------------") + log(j1939_name_record) + log("--------------------------------------------") + log(f_encode_J1939_name_record(j1939_name_record)) + log("--------------------------------------------") + log(f_decode_J1939_name_record(f_encode_J1939_name_record(j1939_name_record))) + log("--------------------------------------------") +} +// result NAME = A00081002E0003E7 + +testcase tc_dec_name_record_encode_2() runs on MTC_CT +{ + + var J1939_NAME_RECORD j1939_name_record := { + arbitraryAddresssBit := 1, + industryGroup := 2, + vehicleSystemInstance := 0, + vehicleSystem := 0, + reserved := 0, + function_ := 128, + functionInstance := 0, + ecuInstance := 0, + manufacturerCode := 368, + identityNumber := 998 + } + + log("j1939 name_record --------------------------") + log(j1939_name_record) + log("--------------------------------------------") + log(f_encode_J1939_name_record(j1939_name_record)) + log("--------------------------------------------") + log(f_decode_J1939_name_record(f_encode_J1939_name_record(j1939_name_record))) + log("--------------------------------------------") +} + +// result NAME = A00080002E0003E6 + +} with { encode "RAW" } +
diff --git a/demo/Isobustest.ttcn b/demo/Isobustest.ttcn deleted file mode 100644 index 943a8ab..0000000 --- a/demo/Isobustest.ttcn +++ /dev/null
@@ -1,837 +0,0 @@ -/* Copyright (c) 2000-2019 Ericsson Telecom AB AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/legal/epl-v10.html -* -* Contributors: -* Michael Josenhans -******************************************************************************/ -// -// File: Isobustest.ttcn -// Description: Encoder / Decoder for Isobus message frames -// -// Revision R1A - -module Isobustest { - -import from General_Types all -import from CanError all -import from SocketCANtest all -import from SocketCAN_Types all -import from SocketCAN_PortType all -import from SocketCAN_Templates all -import from Can all -import from Isobus all -import from IsobusMessageTypes all -import from Isobus_Templates all -import from J1939 all - - import from IsobusNMMessageTypes all - -type union CAN_ID { - OCT4 can_eff, // 29-bit can address - OCT2 can_sff, // 11-bit can address - RTR can_rtr, - BIT29 can_err // up to 29 can error bits -} - -type bitstring BIT29 length(29) -type enumerated RTR { RTRNULL } - -type union Can_IDs { - BIT29 can_eff, // CAN extended format - BIT11 can_sff, // CAN basic format - RTR can_rtr, // Remote Transmission Request (RTR), seldom used - BIT29 can_err // CAN Error -} -with { variant "" } - -type record Can_IDwithType { - INT1 cantype, // can_id >> 29 bit - Can_IDs can_ids // can_id and4b '1FFFFFFF'O -} -with { - variant (can_ids) "CROSSTAG( - can_eff, cantype = 4; - can_rtr, cantype = 2; - can_err, cantype = 1; - can_sff, cantype = 0)" -} - -//component declarations -type component MTC_CT -{ -} - -type component PTC_isobus_CT -{ - port SocketCAN_PT pt_socketCAN - port Isobus_PT pt_isobus - //variables - //timers - timer T0:= 0.2 -} - -const integer MAX_CONNECTIONS := 65535 - -type record length (0..MAX_CONNECTIONS) of PTC2_CT OpenConnections -type record length (0..MAX_CONNECTIONS) of boolean OpenConnectionsFlags - -type component PTC1_CT -{ - port Isobus_PT pt_isobus - //variables - var OpenConnections openConnections - var OpenConnectionsFlags openConnectionsFlags - //timers - timer T1:= 0.2 - -} -type component PTC2_CT -{ - port Isobus_PT pt_isobus - //variables - var octetstring receivedUnacknowledgedData - var INT2 msgSizeInBytes - var INT2 receivedUnacknowledgedMsgSizeInBytes - var INT1 nextExpectedPacketNumber - var PGN pgnOfMultiPacketMessage - var OCT1 ps, sa - var CAN_id tp_dt_can_id - //timers - timer T2:= 0.2 -} - -type port Isobus_PT message { - out CAN_frame_j1939 - in CAN_frame_j1939 -} with { extension "internal" } - -type port SyncMasterPort message { - out PhaseStartReq - in PhaseEndInd -} with { extension "internal" } - -type port SyncSlavePort message { - in PhaseStartReq - out PhaseEndInd -} with { extension "internal" } - -type record of PTC PTCSet - - -type component PTC { - port SyncSlavePort pt_sync - port SocketCAN_PT pt_socketCAN - var e_Phase v_phase := c_firstPhase -} - - -function f_open_socket2(in SocketCAN_open_socket_type v_socket_type) -runs on PTC_isobus_CT -return SocketCAN_socket_result { - - var SocketCAN_socket_result v_result - timer t_guard - t_guard.start(c_guard) - - var SocketCAN_socket socket - - if(v_socket_type==OPEN_CAN_RAW) { - socket := {domain:=PF_CAN, ptype := SOCK_RAW, protocol:= CAN_RAW}; - } else if (v_socket_type == OPEN_CAN_BCM) { - socket := {domain:=PF_CAN, ptype := SOCK_DGRAM, protocol:= CAN_BCM}; - } - pt_socketCAN.send(socket) - - // receive response - alt { - [] pt_socketCAN.receive( - a_SocketCAN_socket_result(a_result(SocketCAN_SUCCESS))) -> value v_result - {log("SocketCan:Socket opened: ", v_result.id)} - [] pt_socketCAN.receive(a_SocketCAN_socket_result(a_result(SocketCAN_ERROR))) - {log("Received Opening Socket failed"); setverdict(fail)} - [] t_guard.timeout { - log("timeout!") - setverdict(fail)} - [] t_guard.timeout { - log("timeout!") - setverdict(fail)} - } - t_guard.stop - return v_result -} - -function f_open_raw2() -runs on PTC_isobus_CT -return SocketCAN_open_raw_result { - var SocketCAN_socketid v_socket_id - v_socket_id := f_open_socket2(OPEN_CAN_RAW).id - var SocketCAN_ifr v_ifr - v_ifr := f_ioctl_get_if_index2(v_socket_id).ifr - var SocketCAN_bind_result v_bind_result - v_bind_result := f_bind2(v_socket_id, v_ifr.if_index) - - var SocketCAN_open_raw_result v_result - v_result := {ifr := v_ifr, socket_id := v_socket_id} - - return v_result -} - -function f_ioctl_get_if_index2(in SocketCAN_socketid p_socket_id) -runs on PTC_isobus_CT -return SocketCAN_ioctl_result { - var SocketCAN_ioctl_result v_result - timer t_guard - t_guard.start(c_guard) - - pt_socketCAN.send(SocketCAN_ioctl:{id:= p_socket_id, ifu := omit}); - // receive response - alt { - [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_SUCCESS))) -> value v_result - {log("Retrieved interface index", v_result.ifr.if_index)} - [] pt_socketCAN.receive(a_SocketCAN_ioctl_result(a_result(SocketCAN_ERROR))) - {log("Retrieving interface index failed", p_socket_id); setverdict(fail)} - [] t_guard.timeout { - log("timeout!") - setverdict(fail) - } - } - return v_result -} - -function f_bind2(in SocketCAN_socketid p_socket_id, - in SocketCAN_if_index p_if_index) -runs on PTC_isobus_CT -return SocketCAN_bind_result { - var SocketCAN_bind_result v_result - timer t_guard - t_guard.start(c_guard) - - pt_socketCAN.send(SocketCAN_bind:{id:= p_socket_id, bindu := {raw := {if_index:= p_if_index}}}); - alt { - [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_SUCCESS))) -> value v_result - {log("Binding socket", p_socket_id)} - [] pt_socketCAN.receive(a_SocketCAN_bind_result(a_result(SocketCAN_ERROR))) {} - [] t_guard.timeout { - log("timeout!") - setverdict(fail) - } - } - return v_result -} - -function f_close_socket2 (in SocketCAN_socketid p_socket_id) -runs on PTC_isobus_CT { - pt_socketCAN.send(SocketCAN_close:{id:= p_socket_id}); -} - -function f_behaviour_isobus(in PTC1_CT v_ptc1) runs on PTC_isobus_CT -{ - - map(self:pt_socketCAN, system:pt_socketCAN) - connect(v_ptc1:pt_isobus, self:pt_isobus) - - var SocketCAN_socketid v_socket_id - var SocketCAN_ifr v_ifr - var SocketCAN_send_data_ifu v_ifu - - var SocketCAN_open_raw_result res - res := f_open_raw2(); - v_socket_id := res.socket_id - v_ifr := res.ifr - v_ifu.if_name := v_ifr.if_name - - log("socket open(): ", res) - - var boolean condition3 := true - //periodic reception - - while (condition3) - { - //var SocketCAN_socket_result v_result_socketcan - var SocketCAN_receive_CAN_or_CAN_FD_frame v_result_socketcan - //T0.start; - - alt - { - [] pt_socketCAN.receive(a_SocketCAN_receive_CAN_frame(v_socket_id, t_CAN_EFF_FLAG, ?)) -> value v_result_socketcan - { - //log("SocketCan:Expected frame received", v_result_socketcan) - // it is assumed that no can fd frames are received here - if(ischosen(v_result_socketcan.frame.can_frame)){ - var CAN_frame_j1939 v_CAN_frame_j1939 := can2j1939frame(v_result_socketcan.frame.can_frame) - pt_isobus.send(v_CAN_frame_j1939) to v_ptc1 - } else { - setverdict(inconc, "reception of canfd frame not expected") - } - } - }//endalt - } - f_close_socket2(v_socket_id) - disconnect(self:pt_isobus, v_ptc1:pt_isobus) - unmap(self:pt_socketCAN, system:pt_socketCAN) - setverdict(pass) -}//endfunction - - -function f_behaviour1_sync() runs on PTC1_CT -{ - - var boolean condition1 := true - var CAN_frame_j1939 v_can_frame_j1939 - //periodic reception - - while (condition1) - { - //T1.start; - - alt - { - - /* []syncport.receive("halt") { - condition1:=false } */ - - []pt_isobus.receive(CAN_frame_j1939:?) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received: ", v_can_frame_j1939); - } - - //[]T1.timeout; - - }//endalt - } -}//endfunction var boolean condition1 - -function f_get_component (in OCT1 connectioninitiator, in OCT1 connectionresponder) runs on PTC1_CT return PTC2_CT { - - var PTC2_CT v_PTC2 - - var integer index - index:= oct2int(connectioninitiator) + 256 * oct2int(connectionresponder) - - if (openConnectionsFlags[index] == false){ - - v_PTC2 := PTC2_CT.create - v_PTC2.start(f_behaviour_connections()); - openConnectionsFlags[index] := true - openConnections[index] := v_PTC2 - connect(v_PTC2:pt_isobus, self:pt_isobus) - } else { - v_PTC2 := openConnections[index] - } - return v_PTC2 -} - - - -function f_behaviour2_sync() runs on PTC1_CT -{ - - var boolean condition1 := true - var CAN_frame_j1939 v_can_frame_j1939 - - // initialization - - var integer i - for(i:=1;i<=MAX_CONNECTIONS; i:= i+1){ - openConnectionsFlags[i] := false - } - - //periodic reception - - - - - while (condition1) - { - //T1.start; - - alt - { - - /* []syncport.receive("halt") { - condition1:=false } */ - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { requestToSend := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received requestToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - - var PTC2_CT v_PTC2 - v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps) - pt_isobus.send(v_can_frame_j1939) to v_PTC2 - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { clearToSend := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received requestToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa); - - var PTC2_CT v_PTC2 - v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa) - pt_isobus.send(v_can_frame_j1939) to v_PTC2 - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { endOfMessageAcknowledgement := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received requestToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa); - - var PTC2_CT v_PTC2 - v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa) - pt_isobus.send(v_can_frame_j1939) to v_PTC2 - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { connectionAbort := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received requestToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa); - - var PTC2_CT v_PTC2 - v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.ps, v_can_frame_j1939.can_j1939.sa) - pt_isobus.send(v_can_frame_j1939) to v_PTC2 - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { broadcastAnnounce := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received requestToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - - var PTC2_CT v_PTC2 - v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps) - pt_isobus.send(v_can_frame_j1939) to v_PTC2 - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_dt := ?}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received tp_ct: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - - var PTC2_CT v_PTC2 - v_PTC2 := f_get_component(v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps) - pt_isobus.send(v_can_frame_j1939) to v_PTC2 - } - []pt_isobus.receive(CAN_frame_j1939:?) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received: ", v_can_frame_j1939); - } - - //[]T1.timeout; - - }//endalt - } -}//endfunction var boolean condition1 -function f_behaviour_connections() runs on PTC2_CT -{ - - var boolean condition1 := true - var CAN_frame_j1939 v_can_frame_j1939 - - // initialization - - //periodic reception - - - - - while (condition1) - { - //T1.start; - - alt - { - - /* []syncport.receive("halt") { - condition1:=false } */ - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { requestToSend := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - msgSizeInBytes := v_can_frame_j1939.can_pdu.tp_cm.requestToSend.msgSizeInBytes - receivedUnacknowledgedData := ''O - receivedUnacknowledgedMsgSizeInBytes := 0 - pgnOfMultiPacketMessage := v_can_frame_j1939.can_pdu.tp_cm.requestToSend.pgnOfMultiPacketMessage - ps := v_can_frame_j1939.can_j1939.ps - sa := v_can_frame_j1939.can_j1939.sa - //log incoming message - log ("received requestToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - alt // connection open requested - { - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { clearToSend := {ctrl := '11'O, - totalNumberOfPackets := ?, - nextPacketNumber :=1, - reserved4 := ?, - reserved5 := ?, - pgnOfMultiPacketMessage := ?}}}}) -> value v_can_frame_j1939 { - //T1.stop; - nextExpectedPacketNumber := v_can_frame_j1939.can_pdu.tp_cm.clearToSend.nextPacketNumber - //log incoming message - log ("received clearToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - alt // connection open - receivig data - { - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_dt := ?}}) -> value v_can_frame_j1939 { - //T1.stop; - if ((msgSizeInBytes - receivedUnacknowledgedMsgSizeInBytes) > 7) { - tp_dt_can_id := j1939id2canid(v_can_frame_j1939.can_j1939) // actuallay it is only necessary to store it once - receivedUnacknowledgedData := receivedUnacknowledgedData & v_can_frame_j1939.can_pdu.tp_dt.data - receivedUnacknowledgedMsgSizeInBytes := receivedUnacknowledgedMsgSizeInBytes + 7 - nextExpectedPacketNumber := nextExpectedPacketNumber + 1 } - else { - log("v_can_frame_j1939.can_j1939: ", v_can_frame_j1939.can_j1939) - tp_dt_can_id := j1939id2canid(v_can_frame_j1939.can_j1939) // actuallay it is only necessary to store it once - receivedUnacknowledgedData := receivedUnacknowledgedData & substr(v_can_frame_j1939.can_pdu.tp_dt.data - ,0 , (msgSizeInBytes - receivedUnacknowledgedMsgSizeInBytes)) - nextExpectedPacketNumber := 0 - receivedUnacknowledgedMsgSizeInBytes := msgSizeInBytes - } - //log incoming message - log ("received tp_dt: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - repeat - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { clearToSend := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - log ("received clearToSend: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - repeat - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { endOfMessageAcknowledgement := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - log ("received endOfMessageAcknowledgement: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - if (receivedUnacknowledgedMsgSizeInBytes == msgSizeInBytes) { - var octetstring receivedData - //var PGN pgn := v_can_frame_j1939.can_pdu.tp_cm.endOfMessageAcknowledgement.pgnOfMultiPacketMessage - if (oct2int((int2oct(pgnOfMultiPacketMessage, 3) and4b '00FF00'O)>> 1 ) < 240) { - log ("pgnOfMultiPacketMessage: ", pgnOfMultiPacketMessage, ", ", int2oct(pgnOfMultiPacketMessage, 3)) - log ("ps: ", ps) - log ("sa: ", sa) - receivedData := int2oct(oct2int((int2oct(pgnOfMultiPacketMessage, 3) and4b '03FFFF'O)>> 1 ), 2) & ps & sa & receivedUnacknowledgedData - } - else - { - log ("pgnOfMultiPacketMessage: ", pgnOfMultiPacketMessage, ", ", int2oct(pgnOfMultiPacketMessage, 3)) - log ("sa: ", sa) - receivedData := (int2oct(pgnOfMultiPacketMessage, 3) and4b '03FFFF'O) & sa & receivedUnacknowledgedData - } - //var octetstring receivedData := (tp_dt_can_id and4b '0003FFFF'O) & receivedUnacknowledgedData - log("tp_dt_can_id: ", tp_dt_can_id) - //var octetstring receivedData := tp_dt_can_id & receivedUnacknowledgedData - //var octetstring receivedData := receivedUnacknowledgedData - //log ("received tp_dt frame with PGN: ", receivedData); - // changed by MJ - - //receivedData := receivedUnacknowledgedData - log ("received multipart frame", receivedData); - v_can_frame_j1939:=f_decode_CAN_frame_j1939(receivedData) - log ("received tp_dt frame j1939: ", v_can_frame_j1939); - } - else { - log ("received incomplete message frame: ", receivedUnacknowledgedData); - } - } - } - } - []pt_isobus.receive(CAN_frame_j1939:{can_j1939 := ?, can_pdu := {tp_cm := { connectionAbort := ?}}}) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - log ("received connectionAbort: ", v_can_frame_j1939, v_can_frame_j1939.can_j1939.sa, v_can_frame_j1939.can_j1939.ps); - } - } - - - } - []pt_isobus.receive(CAN_frame_j1939:?) -> value v_can_frame_j1939 { - //T1.stop; - //log incoming message - //log ("received: ", v_can_frame_j1939); - } - - //[]T1.timeout; - - }//endalt - } -}//endfunction var boolean condition1 - - -testcase tc_encdec() runs on MTC_CT - -{ - - template CAN_frame_j1939 t_CAN_frame_j1939 := { can_j1939 := { prio := 6, res := '0'B, dp := '1'B, pf := 'E9'O, ps := 'FD'O, sa := 'E6'O }, - can_pdu := { addressClaimed := { name := { selfConfigurableAddressValue := '0'B, industryGroupValue := '011'B, deviceClassInstanceValue := '0001'B, deviceClassValue := '0000001'B, reserveValued := '0'B, functionValue := '00000011'B, functionInstanceValue := '00101'B, ecuInstancceValue := '110'B, manufacturerCodeValue := '10000000000'B, identityNumberBits := '101000010000101000000'B } }}} - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log("--------------------------------------------") - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) - log("--------------------------------------------") - - template CAN_frame_j1939 t_CAN_frame_j1939_2 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := 'FD'O, sa := 'C0'O }, can_pdu := { requestForAddressClaimed := {pgn := 123}} } - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_2))) - log("--------------------------------------------") - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_2)))) - log("--------------------------------------------") - - template CAN_frame_j1939 t_CAN_frame_j1939_3 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := 'FD'O, sa := 'C0'O }, can_pdu := { cannotClaimSourceAddress := { name := { selfConfigurableAddressValue := '0'B, industryGroupValue := '011'B, deviceClassInstanceValue := '0001'B, deviceClassValue := '0000001'B, reserveValued := '0'B, functionValue := '00000011'B, functionInstanceValue := '00101'B, ecuInstancceValue := '110'B, manufacturerCodeValue := '10000000000'B, identityNumberBits := '101000010000101000000'B } }}} - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3))) - log("--------------------------------------------") - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_3)))) - log("--------------------------------------------") - - template CAN_frame_j1939 t_CAN_frame_j1939_6 := { can_j1939 := { prio := 6, res := '0'B, dp := '1'B, pf := 'E6'O , ps := 'FD'O, sa := '00'O }, can_pdu := { commandedAddress := { - name := { selfConfigurableAddressValue := '0'B, industryGroupValue := '011'B, deviceClassInstanceValue := '0001'B, deviceClassValue := '0000001'B, reserveValued := '0'B, functionValue := '00000011'B, functionInstanceValue := '00101'B, ecuInstancceValue := '110'B, manufacturerCodeValue := '10000000000'B, identityNumberBits := '101000010000101000000'B }, - newSourceAddress:='AA'O - } } } - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_6))) - log("--------------------------------------------") - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939_6)))) - log("--------------------------------------------") -} - -testcase tc_encdec_vt2ecu_vtStatusReq() runs on MTC_CT -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := - {vt2ecu := {vtStatusReq := - { vtfunction := 254, - sourceAddressOfActiveWorkingSetMaster := '11'O, - objectIDOfTheVisibleDataAlarmMaskOfTheActiveWorkingSet := '2233'O, - objectIDOfTheVisibleSoftKeyMaskOfTheActiveWorkingSet := '4455'O, - vtBusyCodes := vtIsBusyExecutingACommand, - vtFunctionCode := '66'O}}}} - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - -testcase tc_encdec_ecu2vt_getMemoryReq() runs on MTC_CT -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := - {ecu2vt := {getMemoryReq := - { vtfunction := 194, - reserved2 := 'FF'O, - memoryRequired := 1234567, - reserved7 := 'FF'O, - reserved8 := 'FF'O}}}} - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - -testcase tc_encdec_ecu2vt_getMemoryReq_with_templateI() runs on MTC_CT // using a template -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := - {ecu2vt := {getMemoryReq := t_GetMemoryReq(1234567)}}} - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - -testcase tc_encdec_ecu2vt_getMemoryReq_with_template_II() runs on MTC_CT // using a template -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := - t_GetMemoryReq_pdu(1234567)} - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - -testcase tc_encdec_networkMessage_N_SP_Response_pdu_with_template() runs on MTC_CT // using a template -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := t_message ( 1, '1'B, '0'B, '0A'O, '0B'O, '0C'O , - t_N_SP_Response_pdu(port_3, port_4, {'01'O,'02'O,'03'O,'04'O,'05'O,'06'O,'07'O})) - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - -testcase tc_encdec_networkMessage_N_SP_Response_with_template() runs on MTC_CT // using a template -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := t_network_message ( 1, '1'B, '0'B, '0A'O, '0B'O, '0C'O , - {n_SP_Response := t_N_SP_Response(port_3, port_4, {'01'O,'02'O,'03'O,'04'O,'05'O,'06'O,'07'O})}) - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - -testcase tc_encdec_N_SP_Response_with_template() runs on MTC_CT // using a template -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := t_message ( 1, '1'B, '0'B, '0A'O, '0B'O, '0C'O , - {networkMessage := {n_SP_Response := t_N_SP_Response(port_3, port_4, {'01'O,'02'O,'03'O,'04'O,'05'O,'06'O,'07'O})}}) - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - -testcase tc_encdec_ecu2vt_workingSetMaintenanceReq() runs on MTC_CT // using a template -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := { can_j1939 := { prio := 0, res := '0'B, dp := '0'B, pf := '00'O, ps := '00'O, sa := '00'O }, can_pdu := - t_WorkingSetMaintenanceReq_pdu({ - initiatingWorkingSetMaintenance := true, - reserved1 := false, - reserved2 := false, - reserved3 := false, - reserved4 := false, - reserved5 := false, - reserved6 := false, - reserved7 := false}, compliantWithVTVersion4)} - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - - -testcase tc_encdec_etp_dt () runs on MTC_CT // using a template -{ - template CAN_frame_j1939 t_CAN_frame_j1939 := { can_j1939 := { prio := 0, res := '1'B, dp := '1'B, pf := 'FE'O, ps := '00'O, sa := 'F8'O }, - can_pdu := { etp_dt := { seq_no := 105, data := '6C652073657276'O } } } - log(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939))) - log(f_decode_CAN_frame_j1939(f_encode_CAN_frame_j1939(valueof(t_CAN_frame_j1939)))) -} - - -testcase tc_dec_requestForAddressClaimed() runs on MTC_CT -{ - - var octetstring j1939_pdu - j1939_pdu := '98EAFFFE00EE00'O - - log(j1939_pdu) - log("--------------------------------------------") - log(f_decode_CAN_frame_j1939(j1939_pdu)) - log("--------------------------------------------") -} - - -testcase tc_dec_largemessage() runs on MTC_CT -{ - - var octetstring j1939_pdu -//j1939_pdu := '18EAFFFE00EE00'O -//j1939_pdu := '18EEFFF83102032E003D0080'O -//j1939_pdu := '18EEFFF73102032E008200A0'O -//j1939_pdu := '18EAF8F8EBFE00'O -j1939_pdu := '18ECF8F810160004FFEBFE00'O - -// j1939_pdu := '00E726F8B3DA590B0066696C6520736572766572'O -// j1939_pdu := '03FE00F8FE2A66696C65207365727665722A3139373136392A2D2A'O -// j1939_pdu := '03FE00F82A66696C65207365727665722A3139373136392A2D2A'O -// j1939_pdu := '03FE00262A6661726D20646973706C61792A3139373136392A2D2A'O -// j1939_pdu := '03FE00F72A7461736B20636F6E74726F6C6C65722A3139373136392A2D2A'O -// j1939_pdu := '03FE00FD2A6661726D20646973706C61792A3139373136392A2D2A'O -// j1939_pdu := '01FD00F82D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O -// j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O -// j1939_pdu := '01FD00F72D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O -// j1939_pdu := '01FD00262D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O -// j1939_pdu := '01FD00FD2D2A3139373136392A2D2A2D2A6E696E67757065782A2D2A'O -// j1939_pdu := '02FE00FD016661726D20646973706C617920312E33372E31362E3733352A'O -// j1939_pdu := '02FE0026026661726D20646973706C617920312E33372E31362E3733352A69736F627573206C69627261727920312E32362E332E3932382A'O -// j1939_pdu := '02FE00F8096E696E67757065782066696C6520736572766572207573657220696E74657266616365204E5820322E322E342E3237302A746F6F6C206C69627261727920322E34322E382E3834302A6C6F67206C69627261727920322E302E31312E3136342A636F6E66696775726174696F6E206C69627261727920312E31322E322E3139332A43414E20627573206861726477617265206C69627261727920312E31392E352E3139382A7365637572697479206C69627261727920312E31312E302E3332312A69736F627573206C69627261727920312E32362E332E3932382A69736F62757320636F6D6D6F6E206C69627261727920322E31322E302E3139332A66696C652073657276657220312E342E352E3235382A'O -// j1939_pdu := '9CFE0DF8FE01FFFFFFFFFFFFFF'O - - log(j1939_pdu) - log("--------------------------------------------") - log(f_decode_CAN_frame_j1939(j1939_pdu)) - log("--------------------------------------------") -} - - -import from IsobusVTMessageTypes all - -testcase tc_decode_VT2ECU() runs on MTC_CT -{ - - var octetstring j1939_vt_pdu - j1939_vt_pdu := 'c7ff02cde001e001'O - j1939_vt_pdu := 'c200ffff7d48400c'O - j1939_vt_pdu := 'c3ffffffff7f7fff'O - j1939_vt_pdu := 'c00400ffffffffff'O - j1939_vt_pdu := 'e00130303034333030'O - j1939_vt_pdu := 'd1ffffffff00ffff'O - j1939_vt_pdu := '09d00701ffff01ff'O - j1939_vt_pdu := 'b3ffffda5900ffff'O - j1939_vt_pdu := 'a82bd300bc0b0000'O - j1939_vt_pdu := 'a82cd300bb0b0000'O - j1939_vt_pdu := 'a82dd300bb0b0000'O - j1939_vt_pdu := 'b3ffff02d700ffff'O - j1939_vt_pdu := 'a875d600c4da0000'O - j1939_vt_pdu := 'a876d600c2da0000'O - j1939_vt_pdu := 'a877d600ffff0000'O - j1939_vt_pdu := 'a878d600ffff0000'O - j1939_vt_pdu := 'a879d600ffff0000'O - j1939_vt_pdu := 'a87ad600ffff0000'O - j1939_vt_pdu := 'a87bd600ffff0000'O - j1939_vt_pdu := 'a87cd600ffff0000'O - j1939_vt_pdu := 'a87dd600ffff0000'O - j1939_vt_pdu := 'a87ed600ffff0000'O - //j1939_vt_pdu := 'ade90300ffffffff'O - //j1939_vt_pdu := '09d00700ffff00ff'O - - log(j1939_vt_pdu) - log("--------------------------------------------") - log(decode_VT2ECU(j1939_vt_pdu)) - log("--------------------------------------------") -} - -//test case declarations -testcase tc_Example001() runs on MTC_CT -{ - - var PTC_isobus_CT v_PTC_isobus - var PTC1_CT v_PTC1 - - //create components - v_PTC_isobus:=PTC_isobus_CT.create; - v_PTC1:=PTC1_CT.create; - - //connnect ports - //map ports - - //start components - - v_PTC1.start(f_behaviour1_sync()); - v_PTC_isobus.start(f_behaviour_isobus(v_PTC1)); - - //wait for termination - all component.done - - - //unmap ports - //disconnect ports - //terminate all parallel test componenets - all component.kill - -} -//when the test case terminates, MTC will terminate as well -//PTCs terminate (reach the state done) when the function with which they were started terminates - - -//test case declarations -testcase tc_Example002() runs on MTC_CT -{ - - var PTC_isobus_CT v_PTC_isobus - var PTC1_CT v_PTC1 - - //create components - v_PTC_isobus:=PTC_isobus_CT.create; - v_PTC1:=PTC1_CT.create; - - //connnect ports - //map ports - - //start components - - v_PTC1.start(f_behaviour2_sync()); - v_PTC_isobus.start(f_behaviour_isobus(v_PTC1)); - - //wait for termination - all component.done - - - //unmap ports - //disconnect ports - //terminate all parallel test componenets - all component.kill - -} -//when the test case terminates, MTC will terminate as well -//PTCs terminate (reach the state done) when the function with which they were started terminates - - -control -{ - - - execute(tc_Example001()) - - -}//endcontrol - -} with { encode "RAW" } -
diff --git a/demo/J1939.cfg b/demo/J1939.cfg index 4825fd6..290e64d 100644 --- a/demo/J1939.cfg +++ b/demo/J1939.cfg
@@ -28,5 +28,7 @@ [EXECUTE] //CAN J1939 tests -SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame -SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame_parallel +SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message +SocketCAN_J1939_test.tc_can_j1939_send_and_receive_message_parallel +J1939_Isobus_test.tc_can_j1939_IsobusVtEcuSimulation +J1939_Isobus_test.tc_can_j1939_IsobusEcuSimulation
diff --git a/demo/J1939.ttcn b/demo/J1939.ttcn deleted file mode 100644 index 404728b..0000000 --- a/demo/J1939.ttcn +++ /dev/null
@@ -1,25 +0,0 @@ -/* Copyright (c) 2000-2019 Ericsson Telecom AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v2.0 -* which accompanies this distribution, and is available at -* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html -* -* Contributors: -* Michael Josenhans -******************************************************************************/ - -module J1939 { -import from General_Types all; - -type record CAN_identifier { -BIT3 priority, -BIT1 reseved, -BIT1 datapage, -OCT1 pduformat, -OCT1 destinationAddress, -OCT1 sourceAddress -} - -type OCT3 PGN - -}
diff --git a/demo/J1939_Isobus_test.ttcn b/demo/J1939_Isobus_test.ttcn new file mode 100644 index 0000000..d1c4073 --- /dev/null +++ b/demo/J1939_Isobus_test.ttcn
@@ -0,0 +1,230 @@ +/* Copyright (c) 2000-2019 Ericsson Telecom AB +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v2.0 +* which accompanies this distribution, and is available at +* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html +* +* Contributors: +* Michael Josenhans +******************************************************************************/ +// +// File: SocketCAN_J1939_test.ttcn +// Description: SocketCAN J1939 testcases for J1939 messages +// + + + +module J1939_Isobus_test +{ +import from J1939 all +import from Isobus_test all + +testcase tc_can_j1939_IsobusVtEcuSimulation() runs on MTC { + + // before running this test cases start the j1939 address claim deamons via commandline + /* + + j1939acd -r 100,80-120 -c /tmp/A00080002E0003E6.jacd A00080002E0003E6 vcan0 + j1939acd -r 100,80-120 -c /tmp/A00081002E0003E7.jacd A00081002E0003E7 vcan0 + */ + + var PTCAdapter v_ptc_J1939VTAdapter := PTCAdapter.create("PTC1_ptc_j1939VTAdapter") alive + var PTCAdapter v_ptc_J1939ECUAdapter := PTCAdapter.create("PTC2_ptc_j1939ECUAdapter") alive + var PTC_Isobus_VT_CT v_ptc_J1939VTApplication := PTC_Isobus_VT_CT.create("PTC1_ptc_j1939VTApplication") alive + var PTC_Isobus_VT_VTSTATUSCycleSend_CT v_ptc_J1939VT_VTStatusCycleSend := PTC_Isobus_VT_VTSTATUSCycleSend_CT.create("PTC_Isobus_VT_VTSTATUSCycleSend") alive + var PTC_Isobus_ECU_CT v_ptc_J1939ECUApplication := PTC_Isobus_ECU_CT.create("PTC2_ptc_j1939ECUApplication") alive + var PTC_Isobus_ECU_VTSTATUSCycleReceive_CT v_ptc_J1939_VTStatusCycleReceive := PTC_Isobus_ECU_VTSTATUSCycleReceive_CT.create("PTC_Isobus_VT_VTSTATUSCycleReceive") alive + var PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend := PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT. create( "PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend" ) alive; + + + f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939VTAdapter}, v_PTCSet); + f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939ECUAdapter}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_VT_CT:=v_ptc_J1939VTApplication}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_VT_VTSTATUSCycleSend_CT:=v_ptc_J1939VT_VTStatusCycleSend}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_ECU_CT:=v_ptc_J1939ECUApplication}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_ECU_VTSTATUSCycleReceive_CT:=v_ptc_J1939_VTStatusCycleReceive}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT:=v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend}, v_PTCSet); + + connect(mtc:pt_sync, v_ptc_J1939VTAdapter:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939ECUAdapter:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939VTApplication:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939VT_VTStatusCycleSend:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939ECUApplication:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939_VTStatusCycleReceive:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_sync) + + + connect(v_ptc_J1939VTAdapter:pt_j1939PDU, v_ptc_J1939VTApplication:pt_j1939PDU) + connect(v_ptc_J1939VT_VTStatusCycleSend:pt_VTStatusTick, v_ptc_J1939VTApplication:pt_VTStatusTick) + connect(v_ptc_J1939ECUAdapter:pt_j1939PDU, v_ptc_J1939ECUApplication:pt_j1939PDU) + connect(v_ptc_J1939ECUApplication:pt_VTStatusTick, v_ptc_J1939_VTStatusCycleReceive:pt_VTStatusTick) + connect(v_ptc_J1939_VTStatusCycleReceive:pt_WorkingSetMaintenaceOnOff, v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenaceOnOff) + connect(v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenance, v_ptc_J1939ECUApplication:pt_WorkingSetMaintenance) + + + + const integer c_send_prio := 2 + const J1939_NAME c_name_VT := 'A00080002E0003E6'O + const J1939_NAME c_name_ECU := 'A00081002E0003E7'O + + v_ptc_J1939VTAdapter.start(f_ptc_J1939Adapter( + e_testbody1, + c_send_prio, + c_name_VT)) /* name source */ + + v_ptc_J1939ECUAdapter.start(f_ptc_J1939Adapter( + e_testbody1, + c_send_prio, + c_name_ECU ))/* name source */ + + v_ptc_J1939VTApplication.start(f_ptc_J1939VTApplication(e_testbody1)); + v_ptc_J1939ECUApplication.start(f_ptc_J1939ECUApplication(e_testbody1)); + + v_ptc_J1939VT_VTStatusCycleSend.start(f_ptc_J1939VTStatusCycleSend(e_testbody1)); + + v_ptc_J1939_VTStatusCycleReceive.start(f_ptc_J1939_VTStatusCycleReceive(e_testbody1)); + + v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend.start(J1939_ECU_WorkingSetMaintenanceIndCycleSend(e_testbody1)) + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + + f_haltAllComponents() + f_awaitAllComponentsHalt() + + all component.done; + log("MTC done") + + disconnect(v_ptc_J1939VTAdapter:pt_j1939PDU, v_ptc_J1939VTApplication:pt_j1939PDU) + disconnect(v_ptc_J1939ECUAdapter:pt_j1939PDU, v_ptc_J1939ECUApplication:pt_j1939PDU) + + all component.kill; +} + +testcase tc_can_j1939_IsobusVtSimulation() runs on MTC { + + // before running this test cases start the j1939 address claim deamons via commandline + /* + j1939acd -r 100,80-120 -c /tmp/A00080002E0003E6.jacd A00080002E0003E6 vcan0 + */ + + var PTCAdapter v_ptc_J1939VTAdapter := PTCAdapter.create("PTC1_ptc_j1939VTAdapter") alive + var PTC_Isobus_VT_CT v_ptc_J1939VTApplication := PTC_Isobus_VT_CT.create("PTC1_ptc_j1939VTApplication") alive + var PTC_Isobus_VT_VTSTATUSCycleSend_CT v_ptc_J1939VT_VTStatusCycleSend := PTC_Isobus_VT_VTSTATUSCycleSend_CT.create("PTC_Isobus_VT_VTSTATUSCycleSend") alive + + f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939VTAdapter}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_VT_CT:=v_ptc_J1939VTApplication}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_VT_VTSTATUSCycleSend_CT:=v_ptc_J1939VT_VTStatusCycleSend}, v_PTCSet); + + connect(mtc:pt_sync, v_ptc_J1939VTAdapter:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939VTApplication:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939VT_VTStatusCycleSend:pt_sync) + + + connect(v_ptc_J1939VTAdapter:pt_j1939PDU, v_ptc_J1939VTApplication:pt_j1939PDU) + connect(v_ptc_J1939VT_VTStatusCycleSend:pt_VTStatusTick, v_ptc_J1939VTApplication:pt_VTStatusTick) + + const integer c_send_prio := 2 + const J1939_NAME c_name_VT := 'A00080002E0003E6'O + + v_ptc_J1939VTAdapter.start(f_ptc_J1939Adapter( + e_testbody1, + c_send_prio, + c_name_VT)) /* name source */ + + v_ptc_J1939VTApplication.start(f_ptc_J1939VTApplication(e_testbody1)); + + v_ptc_J1939VT_VTStatusCycleSend.start(f_ptc_J1939VTStatusCycleSend(e_testbody1)); + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + + f_haltAllComponents() + f_awaitAllComponentsHalt() + + all component.done; + log("MTC done") + + disconnect(v_ptc_J1939VTAdapter:pt_j1939PDU, v_ptc_J1939VTApplication:pt_j1939PDU) + + all component.kill; +} + +testcase tc_can_j1939_IsobusEcuSimulation() runs on MTC { + + // before running this test cases start the j1939 address claim deamons via commandline + /* + j1939acd -r 100,80-120 -c /tmp/A00081002E0003E7.jacd A00081002E0003E7 vcan0 + */ + + var PTCAdapter v_ptc_J1939ECUAdapter := PTCAdapter.create("PTC2_ptc_j1939ECUAdapter") alive + var PTC_Isobus_ECU_CT v_ptc_J1939ECUApplication := PTC_Isobus_ECU_CT.create("PTC2_ptc_j1939ECUApplication") alive + var PTC_Isobus_ECU_VTSTATUSCycleReceive_CT v_ptc_J1939_VTStatusCycleReceive := PTC_Isobus_ECU_VTSTATUSCycleReceive_CT.create("PTC_Isobus_VT_VTSTATUSCycleReceive") alive + var PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend := PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT. create( "PTC_Isobus_ECU_WorkingSetMaintenanceIndCycleSend" ) alive; + + f_addSyncSlaveSet({ptc_Adapter:=v_ptc_J1939ECUAdapter}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_ECU_CT:=v_ptc_J1939ECUApplication}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_ECU_VTSTATUSCycleReceive_CT:=v_ptc_J1939_VTStatusCycleReceive}, v_PTCSet); + f_addSyncSlaveSet({ptc_Isobus_ECU_WorkingSetMaintenanceIndCycleSend_CT:=v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend}, v_PTCSet); + + connect(mtc:pt_sync, v_ptc_J1939ECUAdapter:pt_sync) + + connect(mtc:pt_sync, v_ptc_J1939ECUApplication:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939_VTStatusCycleReceive:pt_sync) + connect(mtc:pt_sync, v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_sync) + + + connect(v_ptc_J1939ECUAdapter:pt_j1939PDU, v_ptc_J1939ECUApplication:pt_j1939PDU) + connect(v_ptc_J1939ECUApplication:pt_VTStatusTick, v_ptc_J1939_VTStatusCycleReceive:pt_VTStatusTick) + connect(v_ptc_J1939_VTStatusCycleReceive:pt_WorkingSetMaintenaceOnOff, v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenaceOnOff) + connect(v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend:pt_WorkingSetMaintenance, v_ptc_J1939ECUApplication:pt_WorkingSetMaintenance) + + + + const integer c_send_prio := 2 + const J1939_NAME c_name_ECU := 'A00081002E0003E7'O + + v_ptc_J1939ECUAdapter.start(f_ptc_J1939Adapter( + e_testbody1, + c_send_prio, + c_name_ECU ))/* name source */ + + v_ptc_J1939ECUApplication.start(f_ptc_J1939ECUApplication(e_testbody1)); + + v_ptc_J1939_VTStatusCycleReceive.start(f_ptc_J1939_VTStatusCycleReceive(e_testbody1)); + + v_ptc_J1939_ECU_WorkingSetMaintenanceIndCycleSend.start(J1939_ECU_WorkingSetMaintenanceIndCycleSend(e_testbody1)) + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + + f_haltAllComponents() + f_awaitAllComponentsHalt() + + all component.done; + log("MTC done") + + disconnect(v_ptc_J1939ECUAdapter:pt_j1939PDU, v_ptc_J1939ECUApplication:pt_j1939PDU) + + all component.kill; +} + +//========================================================================= +// Control +//========================================================================= + +// Insert control part here if applicable! + +} // end of module
diff --git a/demo/J1939test.ttcn b/demo/J1939test.ttcn index a0e4d19..7db1488 100644 --- a/demo/J1939test.ttcn +++ b/demo/J1939test.ttcn
@@ -20,7 +20,7 @@ import from SocketCAN_Templates all; import from J1939 all; -const float c_guard := 10.0 +const float c_guard := 50.0 type enumerated SocketCAN_open_socket_type { @@ -83,7 +83,6 @@ type record of PTC PTCSet - type component PTC { port SyncSlavePort pt_sync port SocketCAN_PT pt_socketCAN @@ -446,16 +445,65 @@ p_peer_addr, p_peer_name, p_j1939_pdu__expected)) -> value v_result - {log("SocketCan:Expected frame received", v_result)} + { + log("SocketCan:Expected frame received", v_result) + setverdict(pass) + } [] pt_socketCAN.receive(SocketCAN_receive_j1939_message:?) -> value v_result - {log("SocketCan:Unexpected frame received!", v_result) - setverdict(fail)} + { + log("SocketCan:Unexpected frame received!", v_result) + } [] t_guard.timeout { log("timeout!") setverdict(fail)} } } +function f_receive_messages_until_expected_message_got_j1939_data( + in SocketCAN_socketid p_socket_id, + template SocketCAN_ifr p_ifr, + template J1939_PGN p_peer_pgn, + template J1939_ADDR p_peer_addr, + template J1939_NAME p_peer_name, + template SocketCAN_J1939_PDU p_j1939_pdu__expected) +runs on PTC { + var SocketCAN_receive_j1939_message v_result + + timer t_guard + t_guard.start(c_guard) + var boolean exitloop := true + + while (exitloop == true) + { + // receive frame or timeout + log("SocketCan:Waiting for frame") + // receive frame or timeout + alt { + [] pt_socketCAN.receive(a_SocketCAN_receive_j1939_message( + p_socket_id, + p_ifr, + p_peer_pgn, + p_peer_addr, + p_peer_name, + p_j1939_pdu__expected)) -> value v_result + { + log("SocketCan:Expected frame received", v_result) + exitloop := false + setverdict(pass) + } +// [] pt_socketCAN.receive(SocketCAN_receive_j1939_message:?) -> value v_result +// { +// log("SocketCan:Unexpected frame received!", v_result) +// } + [] t_guard.timeout + { + log("timeout!") + exitloop := false + setverdict(fail) + } + } + } +} function f_setsockopt(in SocketCAN_socketid p_socket_id, in SocketCAN_setsockopt_commandu p_command) @@ -523,13 +571,12 @@ p_j1939_addr_source) var SocketCAN_setsockopt_result v_setsockopt_result v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio}) - v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio}) f_sendPhaseEndInd() alt_awaitPhaseStartReq(p_phase) var SocketCAN_j1939_send_data_to_result send_data_to_result var J1939_hdr v_j1939_destination := { - //name := p_j1939_name_source, + //name := p_j1939_name_destination, pgn := p_j1939_pgn_destination, addr:= p_j1939_addr_destination} @@ -547,6 +594,105 @@ f_sendPhaseEndInd() } +function f_ptc_J1939SendToNameInitiator( + in e_Phase p_phase, + in J1939_Priority p_send_prio, + in J1939_NAME p_j1939_name_source, + in J1939_PGN p_j1939_pgn_destination, + in J1939_NAME p_j1939_name_destination, + in SocketCAN_J1939_PDU p_pdu_send) runs on PTC { + map(self:pt_socketCAN, system:pt_socketCAN) + var SocketCAN_socketid v_socket_id + var SocketCAN_ifr v_ifr + + alt_awaitPhaseStartReq(e_open_socket) + var SocketCAN_open_j1939_result res + res := f_open_j1939() + v_socket_id := res.socket_id + v_ifr := res.ifr + var SocketCAN_bind_result v_bind_result + v_bind_result := f_bind(v_socket_id, + v_ifr.if_index, + p_j1939_name_source, + J1939_NO_PGN, /* p_j1939_pgn_source */ + J1939_NO_ADDR /* p_j1939_addr_source */) + var SocketCAN_setsockopt_result v_setsockopt_result + v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio}) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(p_phase) + var SocketCAN_j1939_send_data_to_result send_data_to_result + var J1939_hdr v_j1939_destination := { + name := p_j1939_name_destination, + pgn := p_j1939_pgn_destination + //addr:= p_j1939_addr_destination + } + + send_data_to_result := f_j1939_send_data_to( + v_socket_id, + v_ifr.if_index, + v_j1939_destination, + p_pdu_send) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(e_close_socket) + f_close_socket (v_socket_id) + unmap(self:pt_socketCAN, system:pt_socketCAN) + setverdict(pass) + f_sendPhaseEndInd() +} + +function f_ptc_J1939SendToGlobalAddressInitiator( + in e_Phase p_phase, + in J1939_Priority p_send_prio, + in J1939_NAME p_j1939_name_source, + in J1939_PGN p_j1939_pgn_destination, + in SocketCAN_J1939_PDU p_pdu_send) runs on PTC { + map(self:pt_socketCAN, system:pt_socketCAN) + var SocketCAN_socketid v_socket_id + var SocketCAN_ifr v_ifr + + alt_awaitPhaseStartReq(e_open_socket) + var SocketCAN_open_j1939_result res + res := f_open_j1939() + v_socket_id := res.socket_id + v_ifr := res.ifr + var SocketCAN_bind_result v_bind_result + v_bind_result := f_bind(v_socket_id, + v_ifr.if_index, + p_j1939_name_source, + J1939_NO_PGN, /* p_j1939_pgn_source */ + J1939_NO_ADDR /* p_j1939_addr_source */) + var SocketCAN_setsockopt_result v_setsockopt_result + v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_prio:=p_send_prio}) + f_sendPhaseEndInd() + const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} + + // configure broadcast: + v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast) + + + alt_awaitPhaseStartReq(p_phase) + var SocketCAN_j1939_send_data_to_result send_data_to_result + var J1939_hdr v_j1939_destination := { + //name := p_j1939_name_destination, + pgn := p_j1939_pgn_destination, + addr:= J1939_NO_ADDR /*addr_destination */ + } + + send_data_to_result := f_j1939_send_data_to( + v_socket_id, + v_ifr.if_index, + v_j1939_destination, + p_pdu_send) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(e_close_socket) + f_close_socket (v_socket_id) + unmap(self:pt_socketCAN, system:pt_socketCAN) + setverdict(pass) + f_sendPhaseEndInd() +} function f_ptc_J1939SendInitiatorWithConnect( in e_Phase p_phase, @@ -634,6 +780,136 @@ f_sendPhaseEndInd() } +function f_ptc_J1939FrameReceiverByName( + in e_Phase p_phase, + in J1939_NAME p_j1939_name_local, + template J1939_PGN p_pgn_local, + template J1939_ADDR p_peer_addr, + template J1939_NAME p_peer_name, + template SocketCAN_J1939_PDU p_j1939_pdu_expected) runs on PTC { + map(self:pt_socketCAN, system:pt_socketCAN) + var SocketCAN_socketid v_socket_id + var SocketCAN_ifr v_ifr + + alt_awaitPhaseStartReq(e_open_socket) + var SocketCAN_open_j1939_result res + res := f_open_j1939() + v_socket_id := res.socket_id + v_ifr := res.ifr + var SocketCAN_bind_result v_bind_result + v_bind_result := f_bind(v_socket_id, + v_ifr.if_index, + p_j1939_name_local, + J1939_NO_PGN, + J1939_NO_ADDR) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(p_phase) + f_receive_j1939_data( + v_socket_id, + v_ifr, + p_pgn_local, + p_peer_addr, + p_peer_name, + p_j1939_pdu_expected) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(e_close_socket) + f_close_socket (v_socket_id) + unmap(self:pt_socketCAN, system:pt_socketCAN) + setverdict(pass) + f_sendPhaseEndInd() +} + + +function f_ptc_J1939FrameBroadcastReceiver( + in e_Phase p_phase, + in J1939_NAME p_j1939_name_local, + template J1939_PGN p_pgn_local, + template SocketCAN_J1939_PDU p_j1939_pdu_expected) runs on PTC { + map(self:pt_socketCAN, system:pt_socketCAN) + var SocketCAN_socketid v_socket_id + var SocketCAN_ifr v_ifr + + alt_awaitPhaseStartReq(e_open_socket) + var SocketCAN_open_j1939_result res + res := f_open_j1939() + v_socket_id := res.socket_id + v_ifr := res.ifr + var SocketCAN_bind_result v_bind_result + v_bind_result := f_bind(v_socket_id, + v_ifr.if_index, + p_j1939_name_local, + J1939_NO_PGN, + J1939_NO_ADDR) + var SocketCAN_setsockopt_result v_setsockopt_result + const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} + + // configure broadcast: + v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast) + + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(p_phase) + f_receive_j1939_data( + v_socket_id, + v_ifr, + p_pgn_local, + ?, /* p_peer_addr */ + ?, /* p_peer_name */ + p_j1939_pdu_expected) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(e_close_socket) + f_close_socket (v_socket_id) + unmap(self:pt_socketCAN, system:pt_socketCAN) + setverdict(pass) + f_sendPhaseEndInd() +} + +function f_ptc_J1939FrameReceiverUntilExpectedMessage( + in e_Phase p_phase, + in J1939_NAME p_j1939_name_source, + in J1939_PGN p_j1939_pgn_source, + in J1939_ADDR p_j1939_addr_source, + template J1939_PGN p_peer_pgn, + template J1939_ADDR p_peer_addr, + template J1939_NAME p_peer_name, + template SocketCAN_J1939_PDU p_j1939_pdu_expected) runs on PTC { + map(self:pt_socketCAN, system:pt_socketCAN) + var SocketCAN_socketid v_socket_id + var SocketCAN_ifr v_ifr + + alt_awaitPhaseStartReq(e_open_socket) + var SocketCAN_open_j1939_result res + res := f_open_j1939() + v_socket_id := res.socket_id + v_ifr := res.ifr + var SocketCAN_bind_result v_bind_result + v_bind_result := f_bind(v_socket_id, + v_ifr.if_index, + p_j1939_name_source, + p_j1939_pgn_source, + p_j1939_addr_source) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(p_phase) + f_receive_messages_until_expected_message_got_j1939_data( + v_socket_id, + v_ifr, + p_peer_pgn, + p_peer_addr, + p_peer_name, + p_j1939_pdu_expected) + f_sendPhaseEndInd() + + alt_awaitPhaseStartReq(e_close_socket) + f_close_socket (v_socket_id) + unmap(self:pt_socketCAN, system:pt_socketCAN) + setverdict(pass) + f_sendPhaseEndInd() +} + function f_ptc_J1939SendInitiatorDynamic(in e_Phase p_phase, in J1939_NAME p_j1939_name_source, in J1939_NAME p_j1939_name_destination, @@ -664,7 +940,7 @@ var SocketCAN_setsockopt_result v_setsockopt_result const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable} - // configure filters: + // configure broadcast: v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast) // configure filters: const J1939_filter c_j1939_filter0 := { @@ -870,16 +1146,17 @@ pgn := J1939_PGN_ADDRESS_CLAIMED, addr:= J1939_NO_ADDR} - var J1939_NAME v_j1939_name_source_reverse := - p_j1939_name_source[7]& p_j1939_name_source[6]& p_j1939_name_source[5]& - p_j1939_name_source[4]& p_j1939_name_source[3]& p_j1939_name_source[2]& - p_j1939_name_source[1]& p_j1939_name_source[0] + var J1939_NAME v_j1939_name_encoded := f_encode_J1939_name(p_j1939_name_source) +// p_j1939_name_source[7]& p_j1939_name_source[6]& p_j1939_name_source[5]& +// p_j1939_name_source[4]& p_j1939_name_source[3]& p_j1939_name_source[2]& +// p_j1939_name_source[1]& p_j1939_name_source[0] + send_data_to_result := f_j1939_send_data_to( v_socket_id, v_ifr.if_index, v_j1939_destination, - v_j1939_name_source_reverse /*p_pdu_send*/) + v_j1939_name_encoded /*p_pdu_send*/) f_sendPhaseEndInd() @@ -890,7 +1167,7 @@ f_sendPhaseEndInd() } -function f_j1939_address_claim2(in e_Phase p_phase, +function f_j1939_request_for_address_claimed(in e_Phase p_phase, in J1939_NAME p_j1939_name_source, in SocketCAN_J1939_PDU p_pdu_send) runs on PTC { map(self:pt_socketCAN, system:pt_socketCAN) @@ -948,7 +1225,7 @@ name := omit, pgn := J1939_PGN_REQUEST, addr:= J1939_NO_ADDR} - + send_data_to_result := f_j1939_send_data_to( v_socket_id, v_ifr.if_index,
diff --git a/demo/Makefile b/demo/Makefile index b47299d..aea14be 100644 --- a/demo/Makefile +++ b/demo/Makefile
@@ -86,13 +86,14 @@ TTCN3_MODULES = ../src/Bcm.ttcn ../src/Can.ttcn ../src/CanError.ttcn ../src/General_Types.ttcn ../src/Raw.ttcn \ SocketCAN_BCM_test.ttcn ../src/SocketCAN_PortType.ttcn SocketCAN_RAW_test.ttcn ../src/SocketCAN_Templates.ttcn \ ../src/SocketCAN_Types.ttcn ../src/J1939.ttcn \ -SocketCANtest.ttcn Isobus.ttcn Isobustest.ttcn IsobusMessageTypes.ttcn \ -Isobus_Templates.ttcn IsobusNMMessageTypes.ttcn IsobusCMMessageTypes.ttcn IsobusVTMessageTypes.ttcn \ +SocketCANtest.ttcn Isobus.ttcn IsobusMessageTypes.ttcn \ +IsobusVT_Templates.ttcn IsobusNMMessageTypes.ttcn IsobusCMMessageTypes.ttcn IsobusVTMessageTypes.ttcn \ Isotp.ttcn Isotptest.ttcn \ CAN_matrix_general_types.ttcn CAN_matrix_test.ttcn CAN_matrix.ttcn CAN_matrix_messages.ttcn CANFD_matrix_messages.ttcn \ CAN_matrix_signals.ttcn CAN_matrix_templates.ttcn \ UnifiedDiagnosticServices.ttcn UnifiedDiagnosticServicestest.ttcn UnifiedDiagnosticServices_Template.ttcn \ -J1939test.ttcn SocketCAN_J1939_test.ttcn +J1939test.ttcn SocketCAN_J1939_test.ttcn Isobus_test.ttcn J1939_Isobus_test.ttcn \ +Isobus_test_encoder.ttcn # ASN.1 modules of this project: ASN1_MODULES = @@ -102,13 +103,14 @@ GENERATED_SOURCES = Bcm.cc Can.cc CanError.cc General_Types.cc Raw.cc \ SocketCAN_BCM_test.cc SocketCAN_PortType.cc SocketCAN_RAW_test.cc SocketCAN_Templates.cc \ SocketCAN_Types.cc J1939.cc \ -SocketCANtest.cc Isobus.cc Isobustest.cc IsobusMessageTypes.cc \ -Isobus_Templates.cc IsobusNMMessageTypes.cc IsobusCMMessageTypes.cc IsobusVTMessageTypes.cc \ +SocketCANtest.cc Isobus.cc IsobusMessageTypes.cc \ +IsobusVT_Templates.cc IsobusNMMessageTypes.cc IsobusCMMessageTypes.cc IsobusVTMessageTypes.cc \ Isotp.cc Isotptest.cc \ CAN_matrix_general_types.cc CAN_matrix_test.cc CAN_matrix.cc CAN_matrix_messages.cc CANFD_matrix_messages.cc \ CAN_matrix_signals.cc CAN_matrix_templates.cc \ UnifiedDiagnosticServices.cc UnifiedDiagnosticServicestest.cc UnifiedDiagnosticServices_Template.cc \ -J1939test.cc SocketCAN_J1939_test.cc +J1939test.cc SocketCAN_J1939_test.cc Isobus_test.cc J1939_Isobus_test.cc \ +Isobustest_test_encoder.cc GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh)
diff --git a/demo/SocketCAN_J1939_test.ttcn b/demo/SocketCAN_J1939_test.ttcn index 64b8da4..6dd2bee 100644 --- a/demo/SocketCAN_J1939_test.ttcn +++ b/demo/SocketCAN_J1939_test.ttcn
@@ -62,7 +62,7 @@ return v_pdu } -testcase tc_can_j1939_send_and_receive_can_frame() runs on MTC { +testcase tc_can_j1939_send_and_receive_message() runs on MTC { var PTC v_ptc_j1939SendInitiator := PTC.create("PTC1_ptc_j1939SendInitiator") alive var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive @@ -80,8 +80,18 @@ var octetstring v_pdu_send := ''O + + // According to ETP specification messages of 117440505 Bytes are possible, + // however the maximum possible message size for the current Linux kernels + // ETP implemantion messages depends upon the available RAM. + // Tests on my Laptop have shown that 4193975 bytes work + // When using very large messages, disable logging by commenting out + // the following lines in J1939.cfg and set the test cases guard timer + // c_guard appropriate (e.g. 100s): + // FileMask := LOG_ALL | DEBUG | MATCHING + // ConsoleMask := LOG_ALL | DEBUG | MATCHING //v_pdu_send := create_octetstring_of_size(117440505) - + v_pdu_send := create_octetstring_of_size (4193975) //4193976 log("length of v_pdu_send: ", lengthof(v_pdu_send)) @@ -99,8 +109,8 @@ c_addr_destination1, /* p_j1939_addr_source */ c_pgn_destination1, /* p_peer_pgn */ c_addr_source1, /* p_peer_addr */ - J1939_NO_NAME, /* p_peer_name */ - v_pdu_send /* p_j1939_pdu_expected */)) + J1939_NO_NAME, /* p_peer_name */ + v_pdu_send /* p_j1939_pdu_expected */)) var e_Phase v_phase @@ -119,7 +129,7 @@ all component.kill; } -testcase tc_can_j1939_send_and_receive_can_frame_parallel() runs on MTC { +testcase tc_can_j1939_send_and_receive_message_parallel() runs on MTC { var PTC v_ptc_j1939SendInitiator1 := PTC.create("PTC1_ptc_j1939SendInitiator1") alive var PTC v_ptc_j1939FrameReceiver1 := PTC.create("PTC2_ptc_j1939FrameReceiver1") alive var PTC v_ptc_j1939SendInitiator2 := PTC.create("PTC1_ptc_j1939SendInitiator2") alive @@ -145,8 +155,10 @@ var octetstring v_pdu_send2 := ''O //v_pdu_send := create_octetstring_of_size(117440505) v_pdu_send1 := create_octetstring_of_size(4193976) + //v_pdu_send1 := create_octetstring_of_size(2093976) log("length of v_pdu_send1: ", lengthof(v_pdu_send1)) v_pdu_send2 := create_octetstring_of_size(4193976) + //v_pdu_send2 := create_octetstring_of_size(2093976) log("length of v_pdu_send2: ", lengthof(v_pdu_send2)) v_ptc_j1939SendInitiator1.start(f_ptc_J1939SendInitiator( @@ -198,14 +210,14 @@ all component.kill; } -testcase tc_can_f_j1939_address_claim() runs on MTC { +testcase tc_can_j1939_address_claim() runs on MTC { var PTC v_ptc_j1939AddressClaimInitiator := PTC.create("PTC1_ptc_j1939AddressClaimInitiator") alive f_addSyncSlaveSet(v_ptc_j1939AddressClaimInitiator, v_PTCSet) connect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync) - const J1939_NAME c_j1939_name_source := '1122334455667788'O + const J1939_NAME c_j1939_name_source := '1122334455667789'O v_ptc_j1939AddressClaimInitiator.start(f_j1939_address_claim( e_testbody1, @@ -228,17 +240,128 @@ all component.kill; } -testcase tc_can_f_j1939_address_claim2() runs on MTC { - var PTC v_ptc_j1939AddressClaimInitiator := PTC.create("PTC1_ptc_j1939AddressClaimInitiator") alive +testcase tc_can_j1939_send_to_name_and_receive_message() runs on MTC { +// before running this test cases start the j1939 address claim deamons via commandline +//j1939acd -r 100,80-120 -c /tmp/1122334455667789.jacd 1122334455667789 +//j1939acd -r 100,80-120 -c /tmp/1122334455667788.jacd 1122334455667788 - f_addSyncSlaveSet(v_ptc_j1939AddressClaimInitiator, v_PTCSet) + var PTC v_ptc_j1939SendInitiatorECU := PTC.create("PTC1_ptc_j1939SendInitiatorECU") alive + var PTC v_ptc_j1939FrameReceiverVT := PTC.create("PTC2_ptc_j1939FrameReceiverVT") alive - connect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync) + f_addSyncSlaveSet(v_ptc_j1939SendInitiatorECU, v_PTCSet) + f_addSyncSlaveSet(v_ptc_j1939FrameReceiverVT, v_PTCSet) - const J1939_NAME c_j1939_name_source := '1122334455667788'O + connect(mtc:pt_sync, v_ptc_j1939SendInitiatorECU:pt_sync) + connect(mtc:pt_sync, v_ptc_j1939FrameReceiverVT:pt_sync) + + + const J1939_NAME c_name_VT := '1122334455667788'O + const J1939_NAME c_name_ECU := '1122334455667789'O + const integer c_send_prio := 2 + const octetstring c_pgn_ECU2VT := '00E700'O // ECU to VT + + + + var octetstring v_pdu_send := 'FEFEFFFFFFFF00FF'O + + v_ptc_j1939SendInitiatorECU.start(f_ptc_J1939SendToNameInitiator( + e_testbody3, + c_send_prio, + c_name_ECU, /* name source */ + c_pgn_ECU2VT, /* pgn destination */ + c_name_VT, /* name destination */ + v_pdu_send)) + + v_ptc_j1939FrameReceiverVT.start(f_ptc_J1939FrameReceiverByName( + e_testbody4, + c_name_VT, /* p_j1939_name_local */ + c_pgn_ECU2VT, /* p_pgn_local */ + J1939_NO_ADDR, /* p_peer_addr */ + c_name_ECU, /* p_peer_name */ + v_pdu_send /* p_j1939_pdu_expected */)) + + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + + all component.done; + log("MTC done") + + disconnect(mtc:pt_sync, v_ptc_j1939SendInitiatorECU:pt_sync) + disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiverVT:pt_sync) + all component.kill; +} + +testcase tc_can_j1939_send_to_global_address_and_receive_message() runs on MTC { +// before running this test cases start the j1939 address claim deamons via commandline +//j1939acd -r 100,80-120 -c /tmp/1122334455667789.jacd 1122334455667789 +//j1939acd -r 100,80-120 -c /tmp/1122334455667788.jacd 1122334455667788 + + var PTC v_ptc_j1939SendInitiatorVT := PTC.create("PTC1_ptc_j1939SendInitiatorVT") alive + var PTC v_ptc_j1939FrameReceiverECU := PTC.create("PTC2_ptc_j1939FrameReceiverECU") alive + + f_addSyncSlaveSet(v_ptc_j1939SendInitiatorVT, v_PTCSet) + f_addSyncSlaveSet(v_ptc_j1939FrameReceiverECU, v_PTCSet) + + connect(mtc:pt_sync, v_ptc_j1939SendInitiatorVT:pt_sync) + connect(mtc:pt_sync, v_ptc_j1939FrameReceiverECU:pt_sync) + + + const J1939_NAME c_name_VT := '1122334455667788'O + const J1939_NAME c_name_ECU := '1122334455667789'O + const integer c_send_prio := 2 + const octetstring c_pgn_VT2ECU := '00E600'O // VT to ECU + + + + var octetstring v_pdu_send := 'FF0104FFFFFFFFFF'O + + v_ptc_j1939SendInitiatorVT.start(f_ptc_J1939SendToGlobalAddressInitiator( + e_testbody3, + c_send_prio, + c_name_VT, /* name source */ + c_pgn_VT2ECU, /* pgn destination */ + v_pdu_send)) + + v_ptc_j1939FrameReceiverECU.start(f_ptc_J1939FrameBroadcastReceiver( + e_testbody4, + c_name_ECU, /* p_j1939_name_local */ + c_pgn_VT2ECU, /* p_pgn_local */ + v_pdu_send /* p_j1939_pdu_expected */)) + + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + + all component.done; + log("MTC done") + + disconnect(mtc:pt_sync, v_ptc_j1939SendInitiatorVT:pt_sync) + disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiverECU:pt_sync) + all component.kill; +} + + +testcase tc_can_j1939_request_for_address_claimed() runs on MTC { + var PTC v_ptc_j1939RequestForAddressClaimedInitiator := PTC.create("PTC1_ptc_j1939v_ptc_j1939RequestForAddressClaimedInitiator") alive + + f_addSyncSlaveSet(v_ptc_j1939RequestForAddressClaimedInitiator, v_PTCSet) + + connect(mtc:pt_sync, v_ptc_j1939RequestForAddressClaimedInitiator:pt_sync) + + //const J1939_NAME c_j1939_name_source := '1122334455667788'O + const J1939_NAME c_j1939_name_source := J1939_NO_NAME const octetstring c_j1939_pdu_send := '00EE00'O - v_ptc_j1939AddressClaimInitiator.start(f_j1939_address_claim2( + v_ptc_j1939RequestForAddressClaimedInitiator.start(f_j1939_request_for_address_claimed( e_testbody1, c_j1939_name_source, c_j1939_pdu_send)) @@ -254,12 +377,141 @@ all component.done; log("MTC done") - disconnect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync) + disconnect(mtc:pt_sync, v_ptc_j1939RequestForAddressClaimedInitiator:pt_sync) all component.kill; } +testcase tc_can_j1939_receive_message() runs on MTC { + var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive + + f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet) + + connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) + + + const octetstring c_addr_source1 := J1939_NO_ADDR + const octetstring c_pgn_destination1 := '00E600'O // ECU to VT + const octetstring c_addr_destination1 := 'F8'O // '90'O + + + + template octetstring v_pdu_receive := ?//''O + + v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiver( + e_testbody2, + c_addr_destination1, /* p_j1939_addr_source */ + c_pgn_destination1, /* p_peer_pgn */ + c_addr_source1, /* p_peer_addr */ + J1939_NO_NAME, /* p_peer_name */ + v_pdu_receive /* p_j1939_pdu_expected */)) + + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + + all component.done; + log("MTC done") + + disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) + + all component.kill; +} + +testcase tc_can_j1939_receive_message_VT2ECU() runs on MTC { + var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive + + f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet) + + connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) + + template J1939_NAME t_name_source := '80001d002e030231'O //J1939_NO_NAME + template octetstring t_pgn_source := '00E600'O // VT to ECU + template octetstring t_addr_source := ? //'F7'O //J1939_IDLE_ADDR + const octetstring c_pgn_local := '00E600'O //J1939_NO_PGN + const octetstring c_addr_local := 'F8'O // J1939_NO_ADDR + const J1939_NAME c_name_local := J1939_NO_NAME // '80003d002e030231'O //'80001d002e030231'O + + + var template octetstring v_pdu_receive := 'c7ff02cde001e001'O + + //log("length of v_pdu_receive: ", lengthof(v_pdu_receive)) + + v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiverUntilExpectedMessage( + e_testbody2, + c_name_local, + c_pgn_local, + c_addr_local, /* p_j1939_addr_source */ + t_pgn_source, /* p_peer_pgn */ + t_addr_source, /* p_peer_addr */ + t_name_source, /* p_peer_name */ + v_pdu_receive /* p_j1939_pdu_expected */)) + + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + all component.done; + log("MTC done") + + disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) + + all component.kill; +} +testcase tc_can_j1939_receive_message_ECU2VT() runs on MTC { + var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive + + f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet) + + connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) + + const J1939_NAME c_name_source := '80001d002e030231'O //J1939_NO_NAME + const octetstring c_pgn_source := '00E700'O // ECU to VT + const octetstring c_addr_source := 'F8'O //J1939_NO_ADDR + template octetstring c_pgn_destination := '00E700'O //J1939_NO_PGN + template octetstring c_addr_destination := ? //J1939_NO_ADDR + template J1939_NAME c_name_destination := ? //J1939_NO_NAME //'000000002e030231'O //'80001d002e030231'O + + + var template octetstring v_pdu_receive := ? // 'ff0104ffffffffff'O + + + //log("length of v_pdu_receive: ", lengthof(v_pdu_receive)) + + v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiverUntilExpectedMessage( + e_testbody2, + c_name_source, + c_pgn_source, + c_addr_source, /* p_j1939_addr_source */ + c_pgn_destination, /* p_peer_pgn */ + c_addr_destination, /* p_peer_addr */ + c_name_destination, /* p_peer_name */ + v_pdu_receive /* p_j1939_pdu_expected */)) + + var e_Phase v_phase + + for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { + f_startPhase(v_phase) + log("MTC: ", v_phase) + f_awaitEndPhase(v_phase) + } + + all component.done; + log("MTC done") + + disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) + + all component.kill; +} + //========================================================================= // Control //=========================================================================
diff --git a/demo/SocketCAN_Templates.ttcn b/demo/SocketCAN_Templates.ttcn deleted file mode 100644 index 5ec6cfe..0000000 --- a/demo/SocketCAN_Templates.ttcn +++ /dev/null
@@ -1,107 +0,0 @@ -/* Copyright (c) 2000-2019 Ericsson Telecom AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v2.0 -* which accompanies this distribution, and is available at -* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html -* -* Contributors: -* Michael Josenhans -******************************************************************************/ -// -// File: SocketCANtest.ttcn -// Description: SocketCAN port type test -// - - -module SocketCAN_Templates { - -import from SocketCAN_Types all; -import from Bcm all -import from Can all - -template SocketCAN_Result a_result(in SocketCAN_Result_code v_result_code) := { - result_code := v_result_code, - err := *, - err_text := * -} - -template SocketCAN_socket_result -a_SocketCAN_socket_result(template SocketCAN_Result p_result) := { - id := ?, - result := p_result -} - -template SocketCAN_ioctl_result -a_SocketCAN_ioctl_result(template SocketCAN_Result p_result) := { - ifr := ?, - result := p_result -} - -template SocketCAN_connect_result -a_SocketCAN_connect_result(template SocketCAN_Result p_result) := { - result := p_result -} - -template SocketCAN_bind_result -a_SocketCAN_bind_result(template SocketCAN_Result p_result) := { - result := p_result -} - -template SocketCAN_send_data_result -a_SocketCAN_send_data_result(template SocketCAN_Result p_result) := { - result := p_result -} - -template SocketCAN_write_data_result -a_SocketCAN_write_data_result(template SocketCAN_Result p_result) := { - result := p_result -} - -template SocketCAN_receive_CAN_or_CAN_FD_frame a_SocketCAN_receive_CAN_frame( - template SocketCAN_socketid p_id, - template CAN_id p_can_id, - template CAN_PDU p_can_pdu) := { - // recieved CAN frame - id := p_id, - ifr := ?, - frame := {can_frame := {can_id := p_can_id, can_pdu := p_can_pdu}}, - timestamp := ? -} - - -template SocketCAN_receive_CAN_or_CAN_FD_frame a_SocketCAN_receive_CAN_FD_frame( - template SocketCAN_socketid p_id, - template CAN_id p_can_id, - template CAN_PDU p_can_pdu) := { - // recieved CAN or CAN FD frame - id := p_id, - ifr := ?, - frame := {canfd_frame := {can_id := p_can_id, can_pdu := p_can_pdu}}, - timestamp := ? -} - -template SocketCAN_receive_CAN_or_CAN_FD_frame a_SocketCAN_receive_CAN_or_CAN_FD_frame( - template SocketCAN_socketid p_id, - template SocketCAN_CAN_or_CAN_FD_frame p_frame) := { - // recieved CAN or CAN FD frame - id := p_id, - ifr := ?, - frame := p_frame, - timestamp := ? -} - -template SocketCAN_receive_BCM_message a_SocketCAN_receive_BCM_message( - template SocketCAN_socketid p_id, - template SocketCAN_bcm_frame p_frame) := { - // recieved CAN or CAN FD frame - id := p_id, - ifr := ?, - frame := p_frame -} - -template SocketCAN_setsockopt_result -a_SocketCAN_setsockopt_result(template SocketCAN_Result p_result) := { - result := p_result -} - -} \ No newline at end of file
diff --git a/demo/initscript.sh b/demo/initscript.sh old mode 100755 new mode 100644
diff --git a/doc/README.md b/doc/README.md deleted file mode 100644 index de9ee7f..0000000 --- a/doc/README.md +++ /dev/null
@@ -1,144 +0,0 @@ -# titan.TestPorts.SocketCANasp - -Main project page: - -https://projects.eclipse.org/projects/tools.titan - -The source code of the TTCN-3 compiler and executor: - -https://github.com/eclipse/titan.core - - -References: -https://www.kernel.org/doc/Documentation/networking/can.txt - -Other useful documentation: -https://docs.python.org/3/library/socket.html (search for: "AF_CAN") -https://media.readthedocs.org/pdf/python-can/latest/python-can.pdf -http%3A%2F%2Fwww.can-cia.de%2Ffileadmin%2Fresources%2Fdocuments%2Fproceedings%2F2012_hartkopp.pdf -http://www.can-cia.de/fileadmin/resources/documents/proceedings/2012_hartkopp.pdf -http://v2.can-newsletter.org/uploads/media/raw/46c15d02e1fdd3b04e671693ec548ff7.pdf - -# See file: demo/initscript.sh: - -#-------------------------------------- -#!/bin/bash - - -# create a virtual can interface: - -sudo modprobe vcan -sudo ip link add dev vcan0 type vcan -sudo ip link set vcan0 up - -#!/bin/bash - -# Add vcan module to kernel -sudo modprobe vcan - -# Setup of virtual can vcan0 -sudo ip link add dev vcan0 type vcan -# set it up at as a canfd capable can interface -sudo ip link set vcan0 mtu 72 -sudo ip link set vcan0 up - -# or create a physical can interface -# sudo ip link set can0 up type can bitrate 1000000 - -ip a - -#-------------------------------------- - -cd src -./demo/initscript.sh - -or alternatively -source demo/initscript.sh - -make clean; make - -ttcn3_start SocketCAN SocketCAN.cfg -or -ttcn3_start SocketCAN CAN_matrix_test.cfg - -or to run a certain testcase: - -ttcn3_start SocketCAN SocketCAN.cfg SocketCAN_RAW_test.tc_can_raw_send_and_receive_can_frame SocketCAN_RAW_test.tc_can_raw_setsockopt_CAN_RAW_FILTER - -Review the newly created log files in the src directory -and use e.g. Wireshark to trace the CAN interfacce. - -#-------------------------------------- -Notes: --Using multiple Test interfacces: - Currently the init script sets up multiple virtual can interfaces ("vcan0", - "vcan1" in oder to allow using multiple CAN interfaces. - The CAN interfaces have to be defined in the TTCN configuration files or may - alternatively be defined in the optional parameters of port messages commands - ioctl and send_data. - - Handling of multiple CAN interfaces is work in progress and no test cases are - provided. In order to configure usage with multiple test interfaces, - test interfaces for each interface have to be defined in the MTC. - --CAN RAW: - CAN FD has been implemented, however not been tested. - Depending on the availability of the C-code #define "CAN_FD_FRAME" - in /usr/include/linux/can/bcm.h, CAN-FD support is enabled at compile time. - The RAW setsockopt has path coverage. However no test coverage that insures - the setsockopt functionality provided by the kernel is working correctly. - For this purpose in the future might be added additional test cases. - --CAN BCM: - TX_SETUP, TX_DELETE have been tested, TX_READ is known to fail test cases. - Some tests have indicated, that that SocketCAN BCM does not support concurrently - active BCM channels. - The BCM has test coverage for TX_SETUP and TX_DELETE. However no test coverage - that insures the BCM functionality provided by the kernel is working correctly. - For this purpose in the future might be added additional test cases. - Return values other than the error code by the BCM are not yet supported. - BCM wth CAN FD frames has not been tested yet. - --ISOTP: - Iso TP functionality has been added, however currently no options like padding - are supported. Feel free to request needed options. - - First install the isotp kernel module as descibed here: - https://github.com/hartkopp/can-isotp-modules - - ./make_isotp.sh - sudo insmod ./can-isotp.ko - - - There is an endlessly running test case: - ttcn3_start SocketCAN SocketCAN.cfg Isotptest.tc_Isotp_Example001 - --CAN J1939: -Configure CAN J1939 as following (requires Kernel 5.4 and compiled with can-j1939 kernel module): -sudo modprobe vcan -sudo ip link add vcan0 type vcan -sudo ip link set vcan0 up -sudo modprobe can-j1939 - -For the following test cases, the messages are so huge that screen output of the log file takes too long. -Thus comment out as following the following lines in J1939.cfg: -//FileMask := LOG_ALL | DEBUG | MATCHING -//ConsoleMask := LOG_ALL | DEBUG | MATCHING - -ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame -ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_j1939_send_and_receive_can_frame_parallel - -Here above lines can be commented in: -ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_address_claim -ttcn3_start SocketCAN J1939.cfg SocketCAN_J1939_test.tc_can_f_j1939_address_claim2 - - --Merging of logfiles: - To merge the logfies from multiple Parallel Test Componets (PTCs) from a - single run in timely order into sigle file, run: - $TTCN3_DIR/bin/ttcn3_logmerge -o log_merged.txt *.log - The merged log-file is found at log_merged.txt - --Dumping CAN Frames using SocketCAN: - To dump all received can frames of e.g. "vcan0" run a seperate terminal: - $ candump "vcan0"
diff --git a/src/J1939.ttcn b/src/J1939.ttcn index be62538..6021cd8 100644 --- a/src/J1939.ttcn +++ b/src/J1939.ttcn
@@ -11,9 +11,24 @@ module J1939 { import from General_Types all; +external function f_encode_J1939_name(in J1939_NAME pdu) return octetstring +with { extension "prototype(convert) encode(RAW)" } +external function f_decode_J1939_name(in octetstring data) return J1939_NAME +with { extension "prototype(convert) decode(RAW)" } + +external function f_encode_J1939_name_record(in J1939_NAME_RECORD pdu) return octetstring +with { extension "prototype(convert) encode(RAW)" } +external function f_decode_J1939_name_record(in octetstring data) return J1939_NAME_RECORD +with { extension "prototype(convert) decode(RAW)" } + +external function f_encode_J1939_name_record_reverse_byte_order(in J1939_NAME_RECORD_REVERSE_BYTE_ENCODING pdu) return octetstring +with { extension "prototype(convert) encode(RAW)" } +external function f_decode_J1939_name_record_reverse_byte_order(in octetstring data) return J1939_NAME_RECORD_REVERSE_BYTE_ENCODING +with { extension "prototype(convert) decode(RAW)" } + const octetstring J1939_MAX_UNICAST_ADDR := 'FD'O const octetstring J1939_IDLE_ADDR := 'FE'O -const octetstring J1939_NO_ADDR := 'FF'O +const octetstring J1939_NO_ADDR := 'FF'O /* == broadcast or no addr */ const J1939_NAME J1939_NO_NAME := '0000000000000000'O const octetstring J1939_PGN_REQUEST := '00ea00'O /* Request PG */ const octetstring J1939_PGN_ADDRESS_CLAIMED := '00ee00'O /* Address Claimed */ @@ -22,10 +37,78 @@ const octetstring J1939_PGN_MAX := '03ffff'O const octetstring J1939_NO_PGN := '040000'O +const octetstring c_pgn_VT2ECU := '00E600'O // VT to ECU +const octetstring c_pgn_ECU2VT := '00E700'O // ECU to VT + + + + type OCT3 J1939_PGN // max 0x3ffff -type OCT8 J1939_NAME +type OCT8 J1939_NAME with {variant "BYTEORDER(last)"} type OCT1 J1939_ADDR +type record J1939_NAME_RECORD{ + J1939_ARBITRARY_ADDRESS_BIT arbitraryAddresssBit, // selfConfigurableAddressValue + J1939_INDUSTRY_GROUP industryGroup, // deviceClassInstanceValue + J1939_VEHICLE_SYSTEM_INSTANCE vehicleSystemInstance, // deviceClassInstanceValue + J1939_VEHICLE_SYSTEM vehicleSystem, + J1939_RESERVED reserved, + J1939_FUNCTION function_, + J1939_FUNCTION_INSTANCE functionInstance, + J1939_ECU_INSTANCE ecuInstance, + J1939_MANUFACTURER_CODE manufacturerCode, + J1939_IDENTITY_NUMBER identityNumber +} with { variant "FIELDORDER(msb)" + variant (identityNumber) "BYTEORDER(last)" + variant (manufacturerCode) "BYTEORDER(last)" +} + +type record J1939_NAME_RECORD_REVERSE_BYTE_ENCODING{ + J1939_IDENTITY_NUMBER identityNumber, + J1939_MANUFACTURER_CODE manufacturerCode, + J1939_ECU_INSTANCE ecuInstance, + J1939_FUNCTION_INSTANCE functionInstance, + J1939_FUNCTION function_, + J1939_RESERVED reserved, + J1939_VEHICLE_SYSTEM vehicleSystem, + J1939_VEHICLE_SYSTEM_INSTANCE vehicleSystemInstance, // deviceClassInstanceValue + J1939_INDUSTRY_GROUP industryGroup, // deviceClassInstanceValue + J1939_ARBITRARY_ADDRESS_BIT arbitraryAddresssBit // selfConfigurableAddressValue +} with { variant "FIELDORDER(lsb)" /* it has no effect here, added for visibility only */ + + variant (identityNumber) "BYTEORDER(first)" + variant (manufacturerCode) "BYTEORDER(first)" + /* the following variants are not needed: + variant (ecuInstance) "BYTEORDER(first)" + variant (functionInstance) "BYTEORDER(first)" + variant (function_) "BYTEORDER(first)" + variant (reserved) "BYTEORDER(first)" + variant (vehicleSystem) "BYTEORDER(first)" + variant (vehicleSystemInstance) "BYTEORDER(first)" + variant (industryGroup) "BYTEORDER(first)" + variant (arbitraryAddresssBit) "BYTEORDER(first)" + */ +} + +type INT1BIT J1939_ARBITRARY_ADDRESS_BIT +type INT3BIT J1939_INDUSTRY_GROUP +type INT4BIT J1939_VEHICLE_SYSTEM_INSTANCE +type INT7BIT J1939_VEHICLE_SYSTEM +type INT1BIT J1939_RESERVED +type INT8BIT J1939_FUNCTION +type INT5BIT J1939_FUNCTION_INSTANCE +type INT3BIT J1939_ECU_INSTANCE +type INT11BIT J1939_MANUFACTURER_CODE +type INT21BIT J1939_IDENTITY_NUMBER + +type integer INT1BIT (0..1) with { variant "FIELDLENGTH(1)"} // 2^1-1 +type integer INT3BIT (0..7) with { variant "FIELDLENGTH(3)"} // 2^3-1 +type integer INT4BIT (0..15) with { variant "FIELDLENGTH(4)"} // 2^4-1 +type integer INT5BIT (0..31) with { variant "FIELDLENGTH(5)"} // 2^5-1 +type integer INT7BIT (0..127) with { variant "FIELDLENGTH(7)"} // 2^7-1 +type integer INT8BIT (0..255) with { variant "FIELDLENGTH(8)"} // 2^8-1 +type integer INT11BIT (0..2047) with { variant "FIELDLENGTH(11),BYTEORDER(last)"} // 2^11-1 +type integer INT21BIT (0..2097151) with { variant "FIELDLENGTH(21),BYTEORDER(last)"} // 2^21-1 type integer J1939_Priority (0..7) @@ -39,6 +122,6 @@ J1939_PGN pgn optional, // * 1 byte address * J1939_ADDR addr optional -} +} with { variant "" } -} +} with { encode "RAW" }
diff --git a/src/SocketCAN_PT.cc b/src/SocketCAN_PT.cc index 69f6c42..5208cb6 100644 --- a/src/SocketCAN_PT.cc +++ b/src/SocketCAN_PT.cc
@@ -49,6 +49,7 @@ #include <cstddef> #include <cstring> #include <iostream> +#include <openssl/bn.h> struct bcm_msg_head; struct can_frame; @@ -180,8 +181,20 @@ nbytes = recvfrom(sock, msg, J1939_RECIEVE_BUFSIZE, 0, (struct sockaddr*) &addr, &addr_len); + BIGNUM* bn = BN_new(); + BN_add_word(bn, (BN_ULONG)(addr.can_addr.j1939.name / ULONG_MAX)); + BN_add_word(bn, (BN_ULONG)(addr.can_addr.j1939.name % ULONG_MAX)); + int_val_t ival(bn); + INTEGER tmp; + tmp.set_val(ival); + + //nbytes = read(sock, msg, J1939_RECIEVE_BUFSIZE); if (nbytes > 0 && nbytes < J1939_RECIEVE_BUFSIZE) { + log("SocketCAN: Received j1939 message addr %x, name %llx, pgn %x", + addr.can_addr.j1939.addr, + addr.can_addr.j1939.name, + addr.can_addr.j1939.pgn); struct ifreq ifr; ifr.ifr_ifindex = addr.can_ifindex; parameters.ifr().if__index() = ifr.ifr_ifindex; @@ -189,9 +202,10 @@ parameters.id() = a; parameters.pdu() = OCTETSTRING(nbytes, msg); parameters.pgn() = int2oct(addr.can_addr.j1939.pgn, 3); - parameters.name() = int2oct(addr.can_addr.j1939.name, 8); + parameters.name() = int2oct(tmp, 8); parameters.destAddr() = int2oct(addr.can_addr.j1939.addr, 1); + incoming_message(parameters); } delete[] msg; @@ -856,7 +870,13 @@ log("entering SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__bind)"); int sock; - struct sockaddr_can addr = { }; + struct sockaddr_can addr = {}; + + addr.can_family = AF_CAN; + addr.can_addr.j1939.addr = J1939_NO_ADDR; + addr.can_addr.j1939.name = J1939_NO_NAME; + addr.can_addr.j1939.pgn = J1939_NO_PGN; + int cn = send_par.id(); int res; SocketCAN__Types::SocketCAN__bind__result result; @@ -1327,9 +1347,11 @@ nrOfBytestoSend = send_par.pdu().lengthof(); nrOfBytesRemaining = nrOfBytestoSend; do { + log("SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to):Sending of remaining of bytes %ld", nrOfBytesRemaining); nrOfBytesSent = sendto(sock, (const void*)((const unsigned char*)send_par.pdu()+nrOfBytestoSend-nrOfBytesRemaining), nrOfBytesRemaining, 0, (struct sockaddr*) &destaddr, sizeof(destaddr)); nrOfBytesRemaining = nrOfBytesRemaining - nrOfBytesSent; + log("SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to):Sent bytes %d, remaining of bytes %ld", nrOfBytesSent, nrOfBytesRemaining); } while ((nrOfBytesSent >= 0) and (nrOfBytesRemaining != 0)); log( @@ -1361,15 +1383,15 @@ log("SocketCAN: Nr of bytes sent = %ld", nrOfBytesSent); } else { - TTCN_error("SocketCAN: Unknown socket reference: %d \n", cn); result.result().result__code() = SocketCAN__Types::SocketCAN__Result__code::SocketCAN__ERROR; result.result().err() = OMIT_VALUE; result.result().err__text() = "Unknown socket reference"; + TTCN_error("SocketCAN: Unknown socket reference: %d \n", cn); } + log("Creating incoming message for SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)"); incoming_message(result); - log( - "leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)"); + log("leaving SocketCAN__PT_PROVIDER::outgoing_send(SocketCAN__j1939__send__data__to)"); #else // CANJ1939_SUPPORT TTCN_error("SocketCAN: CAN J1939 is not supported by your current kernel error"); #endif // CANJ1939_SUPPORT
diff --git a/src/SocketCAN_Templates.ttcn b/src/SocketCAN_Templates.ttcn index 57616a7..a5901e6 100644 --- a/src/SocketCAN_Templates.ttcn +++ b/src/SocketCAN_Templates.ttcn
@@ -20,7 +20,7 @@ import from Can all import from J1939 all -template SocketCAN_Result a_result(in SocketCAN_Result_code v_result_code) := { +template SocketCAN_Result a_result(template SocketCAN_Result_code v_result_code) := { result_code := v_result_code, err := *, err_text := *