/* 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 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 := '000110'B, 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 := '000000'B, 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 := '000000'B, 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 := '000110'B, 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 := '000000'B, 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 := '000000'B, 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 := '000000'B, 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 := '000000'B, 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 ( '000001'B, '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 ( '000001'B, '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 ( '000001'B, '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 := '000000'B, 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 := '000000'B, 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("--------------------------------------------")
}

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

