blob: a0e4d190b6a532d1a1f856f9448eb2c455d4e79a [file] [log] [blame]
/* 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 J1939test {
import from SocketCAN_Types all;
import from SocketCAN_PortType all;
import from SocketCAN_Templates all;
import from J1939 all;
const float c_guard := 10.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_close_socket,
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 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
}
//component declarations
type component MTC{
timer t_guard
port SyncMasterPort pt_sync
var PTCSet v_PTCSet := {}
}
altstep alt_awaitPhaseStartReq(in e_Phase p_phase) runs on PTC {
var PhaseStartReq v_PhaseStartReq;
[] pt_sync.receive (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 (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 (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 PhaseStartReq v_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)
pt_sync.send(v_phaseStartReq) to v_PTCSet[v_i]
}
}
function f_incPTCPhase(in e_Phase p_currentPhase) runs on PTC 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 PTC{
// just to allow matching with integer ranges on the reception side, as it is not poosible to do so with enums
var PhaseEndInd v_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 PTC 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 PhaseEndInd v_PhaseEndInd
for(v_i := 0; v_i < v_amount; v_i := v_i +1) {
alt {
[] pt_sync.receive (PhaseEndInd: {phase :=p_phase, phase_int := ?}){}
// value between p_phase +1 and e_testcase_complete:
[] pt_sync.receive (PhaseEndInd: {phase :=?, phase_int := (enum2int(p_phase) .. (enum2int(c_testcase_complete)))}){}
[] t_guard.timeout {
log("Timeout in MTC phase:", p_phase)
setverdict(inconc)
}
[] pt_sync.receive (?) -> 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_open_socket(in SocketCAN_socket p_socket)
runs on PTC
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("timeout!")
setverdict(fail)}
[] t_guard.timeout {
log("timeout!")
setverdict(fail)}
}
t_guard.stop
return v_result
}
function f_ioctl_get_if_index(in SocketCAN_socketid p_socket_id)
runs on PTC
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_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 PTC
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("timeout!")
setverdict(fail)}
}
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 PTC
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("timeout!")
setverdict(fail)
}
}
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 PTC
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("timeout!")
setverdict(fail)
}
}
return v_result
}
function f_receive_j1939_message_data(
in SocketCAN_socketid p_socket_id,
template J1939_PGN p_pgn_expected,
template J1939_ADDR p_addr_expected,
template J1939_NAME p_name_expected,
template SocketCAN_J1939_PDU p_pdu_expected
)
runs on PTC {
var SocketCAN_receive_j1939_message v_result
timer t_guard
t_guard.start(c_guard)
// receive frame or timeout
alt {
[] pt_socketCAN.receive(a_SocketCAN_receive_j1939_message(
p_socket_id,
?,
p_pgn_expected,
p_addr_expected,
p_name_expected,
p_pdu_expected))-> value v_result
{log("SocketCan:Expected frame received", v_result)}
[] pt_socketCAN.receive(SocketCAN_receive_j1939_message:?) -> value v_result
{log("SocketCan:Unexpected j1939 message received!", v_result)
setverdict(fail)}
[] t_guard.timeout {
log("timeout!")
setverdict(fail)}
}
}
function f_receive_no_data_but_timeout(in SocketCAN_socketid p_socket_id, in float p_timeout_period)
runs on PTC {
var SocketCAN_receive_j1939_message v_result
timer t_guard
t_guard.start(p_timeout_period)
// receive j1939 message or timeout
alt {
[] pt_socketCAN.receive(a_SocketCAN_receive_j1939_message(
p_socket_id,
?,
?,
?,
?,
?)) -> value v_result {
log("SocketCan:Unexpected j1939 message received!", v_result)
setverdict(fail)
}
[] t_guard.timeout {
log("Expected timeout!")}
}
}
function f_j1939_send_data(in SocketCAN_socketid p_socket_id,
in SocketCAN_J1939_PDU p_pdu)
runs on PTC
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("timeout!")
setverdict(fail)}
}
return v_result
}
function f_receive_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)
// 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)}
[] pt_socketCAN.receive(SocketCAN_receive_j1939_message:?) -> value v_result
{log("SocketCan:Unexpected frame received!", v_result)
setverdict(fail)}
[] t_guard.timeout {
log("timeout!")
setverdict(fail)}
}
}
function f_setsockopt(in SocketCAN_socketid p_socket_id,
in SocketCAN_setsockopt_commandu p_command)
runs on PTC
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("timeout!")
setverdict(fail)
}
}
return v_result
}
function f_close_socket (in SocketCAN_socketid p_socket_id)
runs on PTC {
pt_socketCAN.send(SocketCAN_close:{id:= p_socket_id});
}
function f_open_j1939()
runs on PTC
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_J1939SendInitiator(
in e_Phase p_phase,
in J1939_Priority p_send_prio,
in J1939_ADDR p_j1939_addr_source,
in J1939_PGN p_j1939_pgn_destination,
in J1939_ADDR p_j1939_addr_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,
J1939_NO_NAME /* p_j1939_name_source */,
J1939_NO_PGN /* p_j1939_pgn_source */,
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,
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_J1939SendInitiatorWithConnect(
in e_Phase p_phase,
in J1939_ADDR p_j1939_addr_source,
in J1939_PGN p_j1939_pgn_destination,
in J1939_ADDR p_j1939_addr_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,
J1939_NO_NAME /* p_j1939_name_source */,
J1939_NO_PGN /* p_j1939_pgn_source */,
p_j1939_addr_source)
var SocketCAN_connect_result v_connect_result
v_connect_result := f_connect(
v_socket_id,
v_ifr.if_index,
J1939_NO_NAME,
p_j1939_pgn_destination,
p_j1939_addr_destination)
f_sendPhaseEndInd()
alt_awaitPhaseStartReq(p_phase)
var SocketCAN_j1939_send_data_result send_data_result
send_data_result := f_j1939_send_data(
v_socket_id,
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_J1939FrameReceiver(
in e_Phase p_phase,
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,
J1939_NO_NAME,
J1939_NO_PGN,
p_j1939_addr_source)
f_sendPhaseEndInd()
alt_awaitPhaseStartReq(p_phase)
f_receive_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,
in J1939_PGN p_j1939_pgn_destination,
in J1939_ADDR p_j1939_addr_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_IDLE_ADDR /* p_j1939_addr_source */)
// var SocketCAN_connect_result v_connect_result
// v_connect_result := f_connect(v_socket_id,
// v_ifr.if_index,
// p_j1939_name_destination,
// p_j1939_pgn_destination,
// p_j1939_pgn_addr)
var SocketCAN_setsockopt_result v_setsockopt_result
const SocketCAN_setsockopt_commandu c_commandu_activate_broadcast := {j1939_broadcast := Enable}
// configure filters:
v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_broadcast)
// configure filters:
const J1939_filter c_j1939_filter0 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn :=J1939_PGN_ADDRESS_CLAIMED,
pgn_mask := J1939_PGN_PDU1_MAX}};
const J1939_filter c_j1939_filter1 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn := J1939_PGN_REQUEST, //J1939_PGN_ADDRESS_REQUEST
pgn_mask := J1939_PGN_PDU1_MAX}};
const J1939_filter c_j1939_filter2 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn := J1939_PGN_ADDRESS_COMMANDED,
pgn_mask := J1939_PGN_MAX}};
const SocketCAN_setsockopt_commandu c_commandu_activate_j1939_filters :=
{j1939_filter:={c_j1939_filter0, c_j1939_filter1, c_j1939_filter2}}
v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_j1939_filters)
f_sendPhaseEndInd()
alt_awaitPhaseStartReq(p_phase)
var SocketCAN_j1939_send_data_to_result send_data_to_result
var J1939_hdr v_j1939_destination := {
name := omit,
pgn := J1939_PGN_ADDRESS_CLAIMED,
addr:= J1939_NO_ADDR}
send_data_to_result := f_j1939_send_data_to(
v_socket_id,
v_ifr.if_index,
v_j1939_destination,
p_j1939_name_source /*p_pdu_send*/)
// var SocketCAN_j1939_send_data_result send_data_result
// send_data_result := f_j1939_send_data(v_socket_id,
// 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_J1939FrameReceiverDynamic(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_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_J1939FrameSequenceReceiver(
in e_Phase p_sequence_expected_phase,
in J1939_NAME p_j1939_name_source,
template J1939_PGN p_peer_pgn,
template J1939_ADDR p_peer_addr,
template J1939_NAME p_peer_name,
template SocketCAN_J1939_PDUs p_pdu_sequence_expected,
in e_Phase p_no_further_frames_expected_phase,
in float p_timeout_period) 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 */)
f_sendPhaseEndInd()
alt_awaitPhaseStartReq(p_sequence_expected_phase)
var integer v_i
for( v_i := 0; v_i < lengthof(p_pdu_sequence_expected); v_i := v_i +1) {
f_receive_j1939_data(
v_socket_id,
v_ifr,
p_peer_pgn,
p_peer_addr,
p_peer_name,
p_pdu_sequence_expected[v_i])
}
f_sendPhaseEndInd()
alt_awaitPhaseStartReq(p_no_further_frames_expected_phase)
f_receive_no_data_but_timeout(v_socket_id, p_timeout_period)
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_j1939_address_claim(in e_Phase p_phase,
in J1939_NAME p_j1939_name_source) 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,
'80'O)//J1939_IDLE_ADDR)
f_sendPhaseEndInd()
var SocketCAN_setsockopt_result v_setsockopt_result
v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_broadcast:=Enable})
// configure filters:
const J1939_filter c_j1939_filter0 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn :=J1939_PGN_ADDRESS_CLAIMED,
pgn_mask := J1939_PGN_PDU1_MAX}};
const J1939_filter c_j1939_filter1 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn := J1939_PGN_REQUEST, //J1939_PGN_ADDRESS_REQUEST
pgn_mask := J1939_PGN_PDU1_MAX}};
const J1939_filter c_j1939_filter2 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn := J1939_PGN_ADDRESS_COMMANDED,
pgn_mask := J1939_PGN_MAX}};
const SocketCAN_setsockopt_commandu c_commandu_activate_j1939_filters :=
{j1939_filter:={c_j1939_filter0, c_j1939_filter1, c_j1939_filter2}}
v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_j1939_filters)
alt_awaitPhaseStartReq(p_phase)
var SocketCAN_j1939_send_data_to_result send_data_to_result
var J1939_hdr v_j1939_destination := {
name := omit,
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]
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*/)
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_j1939_address_claim2(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)
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,
J1939_IDLE_ADDR)
f_sendPhaseEndInd()
var SocketCAN_setsockopt_result v_setsockopt_result
v_setsockopt_result := f_setsockopt(v_socket_id, {j1939_broadcast:=Enable})
// configure filters:
const J1939_filter c_j1939_filter0 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn :=J1939_PGN_ADDRESS_CLAIMED,
pgn_mask := J1939_PGN_PDU1_MAX}};
const J1939_filter c_j1939_filter1 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn := J1939_PGN_REQUEST, //J1939_PGN_ADDRESS_REQUEST
pgn_mask := J1939_PGN_PDU1_MAX}};
const J1939_filter c_j1939_filter2 := {
name_filter:= omit,
addr_filter:= omit,
pgn_filter :={
pgn := J1939_PGN_ADDRESS_COMMANDED,
pgn_mask := J1939_PGN_MAX}};
const SocketCAN_setsockopt_commandu c_commandu_activate_j1939_filters :=
{j1939_filter:={c_j1939_filter0, c_j1939_filter1, c_j1939_filter2}}
v_setsockopt_result := f_setsockopt(v_socket_id, c_commandu_activate_j1939_filters)
alt_awaitPhaseStartReq(p_phase)
var SocketCAN_j1939_send_data_to_result send_data_to_result
var J1939_hdr v_j1939_destination := {
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,
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()
}
// control
// {
// execute(tc_can_raw0())
// }
}