Exemple #1
0
void platform_can_send( unsigned id, u32 canid, u8 idtype, u8 len, const u8 *data )
{
  CanTxMsg TxMessage;
  const char *s = ( char * )data;
  char *d;
  
  switch( idtype )
  {
    case 0: /* Standard ID Type  */
      TxMessage.IDE = CAN_ID_STD;
      TxMessage.StdId = canid;
      break;
    case 1: /* Extended ID Type */
      TxMessage.IDE=CAN_ID_EXT;
      TxMessage.ExtId = canid;
      break;
  }
  
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=len;
  
  d = ( char * )TxMessage.Data;
  DUFF_DEVICE_8( len,  *d++ = *s++ );
  
  CAN_Transmit( CAN1, &TxMessage );
}
Exemple #2
0
void platform_can_recv( unsigned id, u32 *canid, u8 *idtype, u8 *len, u8 *data )
{
  CanRxMsg RxMessage;
  const char *s;
  char *d;
  u32 i = 0;
  
  // Check up to 256 times for message
  while( ( CAN_MessagePending(CAN1, CAN_FIFO0) < 1 ) && ( i++ != 0xFF ) );
    
  RxMessage.StdId=0x00;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.DLC=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  
  if( RxMessage.IDE == CAN_ID_STD )
  {
    *canid = ( u32 )RxMessage.StdId;
    *idtype = 0;
  }
  else
  {
    *canid = ( u32 )RxMessage.ExtId;
    *idtype = 1;
  }
  
  *len = RxMessage.DLC;
  
  s = ( const char * )RxMessage.Data;
  d = ( char* )data;
  DUFF_DEVICE_8( RxMessage.DLC,  *d++ = *s++ );
}
Exemple #3
0
void platform_can_send( unsigned id, u32 canid, u8 idtype, u8 len, const u8 *data )
{
    tCANMsgObject msg_tx;
    const char *s = ( char * )data;
    char *d;

    // Wait for outgoing messages to clear
    while( can_tx_flag == 1 );

    msg_tx.ulFlags = MSG_OBJ_TX_INT_ENABLE;

    if( idtype == ELUA_CAN_ID_EXT )
        msg_tx.ulFlags |= MSG_OBJ_EXTENDED_ID;

    msg_tx.ulMsgIDMask = 0;
    msg_tx.ulMsgID = canid;
    msg_tx.ulMsgLen = len;
    msg_tx.pucMsgData = ( u8 * )can_tx_buf;

    d = can_tx_buf;
    DUFF_DEVICE_8( len,  *d++ = *s++ );

    can_tx_flag = 1;
    CANMessageSet(CAN0_BASE, 2, &msg_tx, MSG_OBJ_TYPE_TX);
}
Exemple #4
0
int platform_can_recv( unsigned id, u32 *canid, u8 *idtype, u8 *len, u8 *data )
{
  CanRxMsg RxMessage;
  const char *s;
  char *d;

  if( CAN_MessagePending( CAN1, CAN_FIFO0 ) > 0 )
  {
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

    if( RxMessage.IDE == CAN_ID_STD )
    {
      *canid = ( u32 )RxMessage.StdId;
      *idtype = ELUA_CAN_ID_STD;
    }
    else
    {
      *canid = ( u32 )RxMessage.ExtId;
      *idtype = ELUA_CAN_ID_EXT;
    }

    *len = RxMessage.DLC;

    s = ( const char * )RxMessage.Data;
    d = ( char* )data;
    DUFF_DEVICE_8( RxMessage.DLC,  *d++ = *s++ );
    return PLATFORM_OK;
  }
  else
    return PLATFORM_UNDERFLOW;
}
Exemple #5
0
int platform_can_send( unsigned id, u32 canid, u8 idtype, u8 len, const u8 *data )
{
  CanTxMsg TxMessage;
  const char *s = ( char * )data;
  char *d;
  
  switch( idtype )
  {
    case ELUA_CAN_ID_STD:
      TxMessage.IDE = CAN_ID_STD;
      TxMessage.StdId = canid;
      break;
    case ELUA_CAN_ID_EXT:
      TxMessage.IDE = CAN_ID_EXT;
      TxMessage.ExtId = canid;
      break;
  }
  
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=len;
  
  d = ( char * )TxMessage.Data;
  DUFF_DEVICE_8( len,  *d++ = *s++ );

  if( CAN_Transmit( CAN1, &TxMessage ) == CAN_NO_MB )
    return PLATFORM_ERR;

  return PLATFORM_OK;
}
Exemple #6
0
// Get data from buffer of size dsize
// resid - resource ID (BUF_ID_UART ...)
// resnum - resource number (0, 1, 2...)
// data - pointer for where data should go
// dsize - length of data to get
// Returns PLATFORM_OK on success, PLATFORM_ERR on failure, 
//   PLATFORM_UNDERFLOW on buffer empty
int buf_read( unsigned resid, unsigned resnum, t_buf_data *data )
{
  BUF_CHECK_RESNUM( resid, resnum );
  BUF_GETPTR( resid, resnum );

  int old_status;
  const char* s = ( const char* )( pbuf->buf + pbuf->rptr );
  char* d = ( char* )data;
  
  if( pbuf->logsize == BUF_SIZE_NONE || READ16( pbuf->count ) == 0 )
    return PLATFORM_UNDERFLOW;
 
  DUFF_DEVICE_8( BUF_REALDSIZE( pbuf ),  *d++ = *s++ );

  old_status = platform_cpu_set_global_interrupts( PLATFORM_CPU_DISABLE );
  pbuf->count --;
  platform_cpu_set_global_interrupts( old_status );
  BUF_MOD_INCR( pbuf, rptr );
  
  return PLATFORM_OK;
}
Exemple #7
0
// Write to buffer
// resid - resource ID (BUF_ID_UART ...)
// resnum - resource number (0, 1, 2...)
// data - pointer for where data will come from
// Returns PLATFORM_OK on success, PLATFORM_ERR on failure
// [TODO] maybe add a buffer overflow flag
int buf_write( unsigned resid, unsigned resnum, t_buf_data *data )
{
  BUF_CHECK_RESNUM( resid, resnum );
  BUF_GETPTR( resid, resnum );
  const char* s = ( const char* )data;
  char* d = ( char* )( pbuf->buf + pbuf->wptr );
  
  if( pbuf->logsize == BUF_SIZE_NONE )
    return PLATFORM_ERR;    
  if( pbuf->count > BUF_REALSIZE( pbuf ) )
  {
    fprintf( stderr, "[ERROR] Buffer overflow on resid=%d, resnum=%d!\n", resid, resnum );
    return PLATFORM_ERR; 
  }
  DUFF_DEVICE_8( BUF_REALDSIZE( pbuf ),  *d++ = *s++ );
  
  BUF_MOD_INCR( pbuf, wptr );
    pbuf->count ++;
    
  return PLATFORM_OK;
}