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 ); }
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++ ); }
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); }
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; }
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; }
// 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; }
// 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; }