/******************************************************************************
 * Copyright (c) 2010, 2016  Ericsson 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
 ******************************************************************************/

//Revision R1A

module Bcm
{
import from Can all;
import from General_Types all; 

const integer CAN_FRAME_MAX_NUMBER := 256;  

type enumerated BcmFlagsBitIndex_enum {
  e_CAN_BCM_SETTIMER_BITINDEX            (0),
  e_CAN_BCM_STARTTIMER_BITINDEX          (1),
  e_CAN_BCM_TX_COUNTEVT_BITINDEX         (2),
  e_CAN_BCM_TX_ANNOUNCE_BITINDEX         (3),
  e_CAN_BCM_TX_CP_CAN_ID_BITINDEX        (4),
  e_CAN_BCM_RX_FILTER_ID_BITINDEX        (5),
  e_CAN_BCM_RX_CHECK_DLC_BITINDEX        (6),
  e_CAN_BCM_RX_NO_AUTOTIMER_BITINDEX     (7),
  e_CAN_BCM_RX_ANNOUNCE_RESUME_BITINDEX  (8),
  e_CAN_BCM_TX_RESET_MULTI_IDX_BITINDEX  (9),
  e_CAN_BCM_RX_RTR_FRAME_BITINDEX        (10)
}

type enumerated BcmFlags_enum {
  e_CAN_BCM_SETTIMER            (1),
  e_CAN_BCM_STARTTIMER          (2),
  e_CAN_BCM_TX_COUNTEVT         (4),
  e_CAN_BCM_TX_ANNOUNCE         (8),
  e_CAN_BCM_TX_CP_CAN_ID        (16),
  e_CAN_BCM_RX_FILTER_ID        (32),
  e_CAN_BCM_RX_CHECK_DLC        (64),
  e_CAN_BCM_RX_NO_AUTOTIMER     (128),
  e_CAN_BCM_RX_ANNOUNCE_RESUME  (256),
  e_CAN_BCM_TX_RESET_MULTI_IDX  (512),
  e_CAN_BCM_RX_RTR_FRAME        (1024)
}

type enumerated BcmOpcode_enum {
  e_CAN_BCM_TX_SETUP    (1),	  // create (cyclic) transmission task
  e_CAN_BCM_TX_DELETE   (2),	  // remove (cyclic) transmission task
  e_CAN_BCM_TX_READ     (3),	  // read properties of (cyclic) transmission task
  e_CAN_BCM_TX_SEND     (4),      // send one CAN frame
  e_CAN_BCM_RX_SETUP    (5),      // create RX content filter subscription
  e_CAN_BCM_RX_DELETE   (6),      // remove RX content filter subscription
  e_CAN_BCM_RX_READ     (7),      // read properties of RX content filter subscription
  e_CAN_BCM_TX_STATUS   (8),      // reply to TX_READ request
  e_CAN_BCM_TX_EXPIRED  (9),      // notification on performed transmissions (count=0)
  e_CAN_BCM_RX_STATUS   (10),     // reply to RX_READ request
  e_CAN_BCM_RX_TIMEOUT  (11),     // cyclic message is absent
  e_CAN_BCM_RX_CHANGED  (12)      // updated CAN frame (detected content change)
}

type integer    Bcm_long    (-2147483648 .. +2147483647);

type record Bcm_timeval {
  Bcm_long tv_sec, 
  Bcm_long tv_usec
}

//type record length (0 .. CAN_FRAME_MAX_NUMBER) of CAN_frame Can_frame;

type record SocketCAN_bcm_frame {
  OCT4              opcode,
  bitstring         flags   length (32),
  LIN4_BO_LAST      count,    
  Bcm_timeval       ival1,
  Bcm_timeval       ival2,
  CAN_id            can_id,
  union {
  record length (0 .. CAN_FRAME_MAX_NUMBER) of CAN_frame can_frame,
  record length (0 .. CAN_FRAME_MAX_NUMBER) of CANFD_frame canfd_frame
  } frames   // should become optional and the records have at least the length 1
}

}
