| /* 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 |
| |
| |
| } |