/* Copyright (c) 2000-2019 Ericsson Telecom AB
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
* Michael Josenhans
******************************************************************************/
//
//  File:               SocketCAN_RAW_test.ttcn
//  Description:        SocketCAN testcases for CAN_RAW frames
//



module SocketCAN_RAW_test
{
import from SocketCANtest all
import from SocketCAN_Types all;
import from Can all
import from Raw all
import from CanError all

testcase tc_can_raw_send_and_receive_can_frame() runs on MTC {
  var PTC v_ptc_rawSendInitiator := PTC.create("PTC1_ptc_rawSendInitiator") alive
  var PTC v_ptc_rawFrameReceiver := PTC.create("PTC2_ptc_rawFrameReceiver") alive

  f_addSyncSlaveSet(v_ptc_rawSendInitiator, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawFrameReceiver, v_PTCSet)
  connect(mtc:pt_sync, v_ptc_rawSendInitiator:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawFrameReceiver:pt_sync)

  var SocketCAN_CAN_or_CAN_FD_frame v_frame_to_send
  v_frame_to_send := {can_frame := 
    {can_id := '00000015'O, 
      can_pdu := '0123456789ABCDEF'O}
  }

  v_ptc_rawSendInitiator.start(f_ptc_RawSendInitiator(e_testbody1, v_frame_to_send))
  v_ptc_rawFrameReceiver.start(f_ptc_RawFrameReceiver(e_testbody3, v_frame_to_send))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")

  disconnect(mtc:pt_sync, v_ptc_rawSendInitiator:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawFrameReceiver:pt_sync)

  all component.kill;      
}

testcase tc_can_raw_send_and_receive_canfd_frame() runs on MTC {
  var PTC v_ptc_rawSendInitiator := PTC.create("PTC1_ptc_rawSendInitiator") alive
  var PTC v_ptc_rawFrameReceiver := PTC.create("PTC2_ptc_rawFrameReceiver") alive


  f_addSyncSlaveSet(v_ptc_rawSendInitiator, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawFrameReceiver, v_PTCSet)
  
  connect(mtc:pt_sync, v_ptc_rawSendInitiator:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawFrameReceiver:pt_sync)

  var SocketCAN_CAN_or_CAN_FD_frame v_canfd_frame_to_send
  v_canfd_frame_to_send := {canfd_frame := 
    {can_id := '00000015'O, 
      can_flags := '10101010'B,
      can_pdu := '0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF'O}
  }

  v_ptc_rawSendInitiator.start(f_ptc_RawSendInitiator(e_testbody2, v_canfd_frame_to_send))
  v_ptc_rawFrameReceiver.start(f_ptc_RawFrameReceiver(e_testbody3, v_canfd_frame_to_send))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")


  disconnect(mtc:pt_sync, v_ptc_rawSendInitiator:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawFrameReceiver:pt_sync)

  all component.kill;      
}

testcase tc_can_raw_setsockopt_CAN_RAW_FILTER() runs on MTC {

  var PTC v_ptc_rawSetFilters := PTC.create("PTC1_ptc_rawSetFilters") alive
  var PTC v_ptc_rawDeactivateFilters := PTC.create("PTC1_ptc_rawDeactivateFilters") alive

  f_addSyncSlaveSet(v_ptc_rawSetFilters, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawDeactivateFilters, v_PTCSet)
  connect(mtc:pt_sync, v_ptc_rawSetFilters:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawDeactivateFilters:pt_sync)

  // activate filters
  const CAN_RAW_filter c_rfilter0 := {
    can_id := '00000123'O,
    can_mask := bit2oct(oct2bit(CAN_EFF_FLAG) or4b oct2bit(CAN_RTR_FLAG) or4b oct2bit(CAN_SFF_MASK))};
  const CAN_RAW_filter c_rfilter1 := {
    can_id := '00000200'O, 
    can_mask := '00000700'O};
  const CAN_RAW_filter c_rfilter2 := {
    can_id := bit2oct(oct2bit('12345678'O) or4b oct2bit(CAN_EFF_FLAG)), 
    can_mask := bit2oct(oct2bit(CAN_EFF_FLAG) or4b oct2bit(CAN_RTR_FLAG) or4b oct2bit(CAN_EFF_MASK))};
  const SocketCAN_setsockopt_commandu c_commandu_activate_filters := {rfilter:={c_rfilter0, c_rfilter1, c_rfilter2}}
  const SocketCAN_setsockopt_commandu c_commandu_deactivate_filters := {rfilter:={}}

  // activate filters command
  v_ptc_rawSetFilters.start(f_raw_setsockopt(e_testbody1, c_commandu_activate_filters))

  // deactivate filters command
  v_ptc_rawDeactivateFilters.start(f_raw_setsockopt(e_testbody3, c_commandu_deactivate_filters))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete; v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")

  disconnect(mtc:pt_sync, v_ptc_rawSetFilters:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawDeactivateFilters:pt_sync)

  all component.kill;    
}

testcase tc_can_raw_setsockopt_CAN_RAW_ERR_FILTER() runs on MTC {

  var PTC v_ptc_rawActivateErrorMask := PTC.create("PTC1_ptc_rawActivateErrorMask") alive
  var PTC v_ptc_rawDeactivateErrorMask := PTC.create("PTC1_ptc_rawDeactivateErrorMask") alive

  f_addSyncSlaveSet(v_ptc_rawActivateErrorMask, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawDeactivateErrorMask, v_PTCSet)
  connect(mtc:pt_sync, v_ptc_rawActivateErrorMask:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawDeactivateErrorMask:pt_sync)

  const SocketCAN_setsockopt_commandu c_commandu_activate_err_mask := {err_mask := oct2bit(CAN_ERR_TX_TIMEOUT) or4b oct2bit(CAN_ERR_BUSOFF)}
  const SocketCAN_setsockopt_commandu c_commandu_deactivate_err_mask := {err_mask := oct2bit('00000000'O)}

  // activate error mask command
  v_ptc_rawActivateErrorMask.start(f_raw_setsockopt(e_testbody1, c_commandu_activate_err_mask))

  // deactivate error mask command
  v_ptc_rawDeactivateErrorMask.start(f_raw_setsockopt(e_testbody3, c_commandu_deactivate_err_mask))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete; v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")

  disconnect(mtc:pt_sync, v_ptc_rawActivateErrorMask:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawDeactivateErrorMask:pt_sync)

  all component.kill;    
}

testcase tc_can_raw_setsockopt_CAN_RAW_LOOPBACK() runs on MTC {

  var PTC v_ptc_rawActivateLoopback := PTC.create("PTC1_ptc_rawActivateLoopback") alive
  var PTC v_ptc_rawDeactivateLoopback := PTC.create("PTC1_ptc_rawDeactivateLoopback") alive

  f_addSyncSlaveSet(v_ptc_rawActivateLoopback, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawDeactivateLoopback, v_PTCSet)
  connect(mtc:pt_sync, v_ptc_rawActivateLoopback:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawDeactivateLoopback:pt_sync)

  const SocketCAN_setsockopt_commandu c_commandu_activate_loopback := {loopback := Enable}
  const SocketCAN_setsockopt_commandu c_commandu_deactivate_loopback := {loopback := Disable}

  // activate error mask command
  v_ptc_rawActivateLoopback.start(f_raw_setsockopt(e_testbody1, c_commandu_activate_loopback))

  // deactivate error mask command
  v_ptc_rawDeactivateLoopback.start(f_raw_setsockopt(e_testbody3, c_commandu_deactivate_loopback))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete; v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")

  disconnect(mtc:pt_sync, v_ptc_rawActivateLoopback:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawDeactivateLoopback:pt_sync)

  all component.kill;      
}

testcase tc_can_raw_setsockopt_CAN_RAW_RECV_OWN_MSGS() runs on MTC {

  var PTC v_ptc_rawActivateReceiveOwnMessages := PTC.create("PTC1_ptc_rawActivateReceiveOwnMessages") alive
  var PTC v_ptc_rawDeactivateReceiveOwnMessages := PTC.create("PTC1_ptc_rawDeactivateReceiveOwnMessages") alive

  f_addSyncSlaveSet(v_ptc_rawActivateReceiveOwnMessages, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawDeactivateReceiveOwnMessages, v_PTCSet)
  connect(mtc:pt_sync, v_ptc_rawActivateReceiveOwnMessages:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawDeactivateReceiveOwnMessages:pt_sync)

  const SocketCAN_setsockopt_commandu c_commandu_activate_ReceiveOwnMessages := {recv_own_msgs := Enable}
  const SocketCAN_setsockopt_commandu c_commandu_deactivate_ReceiveOwnMessages := {recv_own_msgs := Disable}

  // activate error mask command
  v_ptc_rawActivateReceiveOwnMessages.start(f_raw_setsockopt(e_testbody1, c_commandu_activate_ReceiveOwnMessages))

  // deactivate error mask command
  v_ptc_rawDeactivateReceiveOwnMessages.start(f_raw_setsockopt(e_testbody3, c_commandu_deactivate_ReceiveOwnMessages))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete; v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")

  disconnect(mtc:pt_sync, v_ptc_rawActivateReceiveOwnMessages:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawDeactivateReceiveOwnMessages:pt_sync)

  all component.kill;      
}

testcase tc_can_raw_setsockopt_CAN_RAW_FD_FRAMES() runs on MTC {

  var PTC v_ptc_rawActivateFD_Frames := PTC.create("PTC1_ptc_rawActivateFD_Frames") alive
  var PTC v_ptc_rawDeactivateFD_Frames := PTC.create("PTC1_ptc_rawDeactivateFD_Frames") alive

  f_addSyncSlaveSet(v_ptc_rawActivateFD_Frames, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawDeactivateFD_Frames, v_PTCSet)
  connect(mtc:pt_sync, v_ptc_rawActivateFD_Frames:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawDeactivateFD_Frames:pt_sync)

  const SocketCAN_setsockopt_commandu c_commandu_activate_FD_Frames := {fd_frames := Enable}
  const SocketCAN_setsockopt_commandu c_commandu_deactivate_FD_Frames := {fd_frames := Disable}

  // activate error mask command
  v_ptc_rawActivateFD_Frames.start(f_raw_setsockopt(e_testbody1, c_commandu_activate_FD_Frames))

  // deactivate error mask command
  v_ptc_rawDeactivateFD_Frames.start(f_raw_setsockopt(e_testbody3, c_commandu_deactivate_FD_Frames))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete; v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")

  disconnect(mtc:pt_sync, v_ptc_rawActivateFD_Frames:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawDeactivateFD_Frames:pt_sync)

  all component.kill;
}

testcase tc_can_raw_setsockopt_CAN_RAW_JOIN_FILTERS() runs on MTC {

  var PTC v_ptc_rawActivateJoinFilters := PTC.create("PTC1_ptc_rawActivateJoinFilters") alive
  var PTC v_ptc_rawDeactivateJoinFilters := PTC.create("PTC1_ptc_rawDeactivateJoinFilters") alive

  f_addSyncSlaveSet(v_ptc_rawActivateJoinFilters, v_PTCSet)
  f_addSyncSlaveSet(v_ptc_rawDeactivateJoinFilters, v_PTCSet)
  connect(mtc:pt_sync, v_ptc_rawActivateJoinFilters:pt_sync)
  connect(mtc:pt_sync, v_ptc_rawDeactivateJoinFilters:pt_sync)

  const SocketCAN_setsockopt_commandu c_commandu_activate_JoinFilters := {join_filters := Enable}
  const SocketCAN_setsockopt_commandu c_commandu_deactivate_JoinFilters := {join_filters := Disable}

  // activate error mask command
  v_ptc_rawActivateJoinFilters.start(f_raw_setsockopt(e_testbody1, c_commandu_activate_JoinFilters))

  // deactivate error mask command
  v_ptc_rawDeactivateJoinFilters.start(f_raw_setsockopt(e_testbody3, c_commandu_deactivate_JoinFilters))

  var e_Phase v_phase

  for(v_phase := c_firstPhase; v_phase < e_testcase_complete; v_phase := f_incMTCPhase(v_phase)) {
    f_startPhase(v_phase)
    log("MTC: ", v_phase)
    f_awaitEndPhase(v_phase)
  }

  all component.done;
  log("MTC done")

  disconnect(mtc:pt_sync, v_ptc_rawActivateJoinFilters:pt_sync)
  disconnect(mtc:pt_sync, v_ptc_rawDeactivateJoinFilters:pt_sync)

  all component.kill;
}



//=========================================================================
// Control
//=========================================================================

// Insert control part here if applicable!

}  // end of module
