47 #define CHECK_BIT(var,pos) ((var) & (1<<(pos))) 50 client_t canfactory_clients[MAX_CANFACTORY_CLIENTS];
52 MAILMESSAGE __esos_ecan_mailMsg;
53 uint8_t u8_numCANFactoryClients = 0;
55 __eds__ ECANMSG __esos_ecan_msgBuf[__ESOS_ECAN_HW_NUM_BUFS] __attribute__((space(dma),aligned(__ESOS_ECAN_HW_NUM_BUFS*16),eds));
72 static uint8_t au8_msgBuf[10], u8_y;
73 static MAILMESSAGE st_Msg;
75 static uint16_t u16_rx_buff_id, u16_msg_id;
87 if ( __ESOS_ECAN_HW_ARE_MESSAGES_WAITING() ) {
91 u16_rx_buff_id = __ESOS_ECAN_HW_GET_BUFFER_ID();
92 u16_msg_id = __esos_ecan_msgBuf[ u16_rx_buff_id ].w0.SID;
93 u8_len = __esos_ecan_msgBuf[ u16_rx_buff_id ].w2.DLC;
96 for ( u8_i = 0; u8_i < u8_numCANFactoryClients; ++u8_i ) {
97 if ( ( canfactory_clients[ u8_i ].m_idMaskControl == MASKCONTROL_FIELD_NONZERO && (
esos_ecan_mask_check(canfactory_clients[u8_i].u16_canID, u16_msg_id, canfactory_clients[u8_i].u16_idMask)) ) |
98 ( canfactory_clients[ u8_i ].m_idMaskControl == MASKCONTROL_EQUAL && ( u16_msg_id == canfactory_clients[ u8_i ].u16_idMask ) )
104 *( ( uint16_t* ) &au8_msgBuf[0] ) = u16_msg_id;
105 for ( u8_count = 0; u8_count < u8_len; ++u8_count ) {
106 au8_msgBuf[
sizeof( uint16_t ) + u8_count ] = __esos_ecan_msgBuf[ u16_rx_buff_id ].data.u8[u8_count];
109 ESOS_TASK_MAKE_MSG_AUINT8( st_Msg, au8_msgBuf,
sizeof(
uint8_t ) * u8_len +
sizeof( uint16_t ) );
110 ESOS_TASK_SEND_MESSAGE( hTask, &st_Msg );
112 if (CHECK_DEBUG_MODE_ENABLED()){
123 if (CHECK_DEBUG_MODE_ENABLED()){
128 ESOS_TASK_SEND_STRING(
"Message ID: ");
129 ESOS_TASK_WAIT_ON_SEND_UINT12_AS_HEX_STRING(u16_msg_id);
130 ESOS_TASK_SEND_STRING(
" rejected by acceptance filter.\n");
135 __esos_ecan_hw_mark_message_received( u16_rx_buff_id );
137 else if (!__ESOS_ECAN_HW_ARE_MESSAGES_WAITING()){
154 static ECANMSG temp_Msg;
155 static uint8_t u8_len, u8_payload_len;
156 static uint16_t u16_can_id;
158 ESOS_TASK_GET_NEXT_MESSAGE( &st_Msg );
159 u8_len = ESOS_GET_PMSG_DATA_LENGTH( ( &st_Msg ) );
160 u16_can_id = st_Msg.au16_Contents[0];
161 u8_payload_len = u8_len - 2;
163 for ( u8_i = 0; u8_i < u8_payload_len; ++u8_i ) {
164 temp_Msg.data.u8[ u8_i ] = st_Msg.au8_Contents[ u8_i + 2 ];
175 __esos_ecan_hw_format_and_send( &temp_Msg, u16_can_id, u8_payload_len );
188 canfactory_clients[ u8_numCANFactoryClients ].pf_task = (*pst_Task).pfn;
189 canfactory_clients[ u8_numCANFactoryClients ].u16_canID = u16_can_id;
190 canfactory_clients[ u8_numCANFactoryClients ].u16_idMask = u16_mask;
191 canfactory_clients[ u8_numCANFactoryClients++ ].m_idMaskControl = m_mask_control;
199 for ( u8_i = 0; u8_i < u8_numCANFactoryClients; ++u8_i ) {
200 if ( canfactory_clients[ u8_i ].pf_task == pst_Task && canfactory_clients[ u8_i ].u16_canID == u16_can_id && canfactory_clients[ u8_i ].u16_idMask == u16_mask && canfactory_clients[ u8_i ].m_idMaskControl == m_mask_control ) {
203 for ( u8_n = u8_i; u8_n < u8_numCANFactoryClients - 1; ++u8_n ) {
204 canfactory_clients[ u8_n ] = canfactory_clients[ u8_n + 1 ];
206 --u8_numCANFactoryClients;
217 for (i = 15; i >= 0; i--) {
218 if (CHECK_BIT(u16_mask,i)) {
219 u8_errorCount += (CHECK_BIT(u16_subscribed,i) ^ CHECK_BIT(u16_recieved,i));
222 if (u8_errorCount == 0) {
void esos_ecan_canfactory_subscribe(ESOS_TASK_HANDLE pst_Task, uint16_t u16_can_id, uint16_t u16_mask, maskcontrol_t m_mask_control)
BOOL esos_ecan_mask_check(uint16_t u16_subscribed, uint16_t u16_recieved, uint16_t u16_mask)
#define ESOS_TASK_SIGNAL_AVAILABLE_OUT_COMM()
#define ESOS_TASK_YIELD()
#define ESOS_TASK_WAIT_ON_SEND_STRING(psz_out)
ESOS_TASK_HANDLE esos_GetTaskHandle(uint8_t(*taskname)(ESOS_TASK_HANDLE pstTask))
#define ESOS_TASK_WAIT_WHILE(cond)
#define ESOS_TASK_WAIT_ON_AVAILABLE_OUT_COMM()
#define ESOS_TASK_BEGIN()
#define ESOS_TASK_IVE_GOT_MAIL()
This file contains routines which configure and use an ECAN interface on the Microchip PIC24 MCUs...
ESOS_USER_TASK(CANFactory)
#define ESOS_TASK_WAIT_ON_SEND_UINT8_AS_DEC_STRING(u8_out)
#define ESOS_TASK_MAILBOX_GOT_AT_LEAST_DATA_BYTES(pstTask, x)
void esos_ecan_canfactory_unsubscribe(uint8_t(*pst_Task)(ESOS_TASK_HANDLE), uint16_t u16_can_id, uint16_t u16_mask, maskcontrol_t m_mask_control)
unsigned char uint8_t
An abbreviation for an 8-bit unsigned integer.