28 #define SIZE_MAP        100 // The size of the message link map    29 #define QUEUE_SIZE      10  // Length of the data queues    30 #define STACKSIZE_TASK  256 // Stacksize for new tasks    31 #define PRIORITY_TASK   2   // Taskpriority    45 static CARME_CAN_MESSAGE rx_msg; 
    46 static CARME_CAN_MESSAGE tx_msg; 
    48 static QueueHandle_t can_tx_queue; 
    49 static QueueHandle_t can_rx_queue; 
    52 static uint16_t n_message_map; 
    54 static SemaphoreHandle_t can_semaphore; 
    65 static void ucan_write_data(
void *pv_data)
    68         xQueueReceive(can_tx_queue, &tx_msg, portMAX_DELAY); 
    71         if(xSemaphoreTake(can_semaphore, portMAX_DELAY) == pdTRUE) {
    72             CARME_CAN_Write(&tx_msg); 
    73             xSemaphoreGive(can_semaphore); 
    86 static void ucan_read_data(
void *pv_data)
    90         if(xSemaphoreTake(can_semaphore, portMAX_DELAY) == pdTRUE) {
    91             if (CARME_CAN_Read(&rx_msg) == CARME_NO_ERROR) {
    92                 xSemaphoreGive(can_semaphore); 
    94                 xQueueSend(can_rx_queue, &rx_msg, portMAX_DELAY);
    96                 xSemaphoreGive(can_semaphore); 
   109 static void ucan_dispatch_data(
void *pv_data)
   111     CARME_CAN_MESSAGE tmp_msg;
   116         xQueueReceive(can_rx_queue, &tmp_msg, portMAX_DELAY); 
   119         for(
int i = 0; i < n_message_map; i++) {
   121             if((tmp_msg.id & message_map[i].
mask) == message_map[i].
message_id) {
   122                 queue = message_map[i].
queue;
   125                 xQueueSend(queue, &tmp_msg, portMAX_DELAY); 
   141 static void ucan_setup_acceptance_filter(
void)
   143     CARME_CAN_ACCEPTANCE_FILTER af;
   146     CARME_CAN_SetMode(CARME_CAN_DF_RESET);
   149     af.afm = MODE_SINGLE;
   164     CARME_CAN_SetAcceptaceFilter(&af);
   167     CARME_CAN_SetMode(CARME_CAN_DF_NORMAL);
   188     message_map[n_message_map].
mask = 
mask;
   217     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   218     g.GPIO_Pin = GPIO_Pin_0;
   219     g.GPIO_Mode = GPIO_Mode_OUT;
   220     g.GPIO_OType = GPIO_OType_PP;
   221     g.GPIO_Speed = GPIO_Speed_2MHz;
   222     g.GPIO_PuPd = GPIO_PuPd_NOPULL;
   223     GPIO_Init(GPIOA, &g);
   226     CARME_CAN_Init(CARME_CAN_BAUD_250K, CARME_CAN_DF_RESET);
   227     CARME_CAN_SetMode(CARME_CAN_DF_NORMAL);
   233     for(
int i = 0; i < 7; i++) {
   239     can_tx_queue = xQueueCreate(
QUEUE_SIZE, 
sizeof(CARME_CAN_MESSAGE));
   240     can_rx_queue = xQueueCreate(
QUEUE_SIZE, 
sizeof(CARME_CAN_MESSAGE));
   243     can_semaphore = xSemaphoreCreateBinary();
   244     xSemaphoreGive(can_semaphore);
   266     CARME_CAN_MESSAGE tmp_msg;
   272     tmp_msg.dlc = n_data_bytes; 
   274     memcpy(tmp_msg.data, data, min(n_data_bytes, 8)); 
   276     xQueueSend(can_tx_queue, &tmp_msg, portMAX_DELAY); 
 
struct msg_link_s msg_link_t
This datatype combines a message queue its id and a mask for filtering. 
 
#define UCAN_LOG_RECEIVE
Set loglevel to recieved messages. 
 
This datatype combines a message queue its id and a mask for filtering. 
 
bool ucan_init(void)
Initialize the hardware and call each init function  global. 
 
#define UCAN_LOG_SENT
Enable or disable logging by setting this to either true or false. 
 
bool ucan_link_message_to_queue(uint16_t message_id, QueueHandle_t queue)
Link a single message type to a queue  global. 
 
bool ucan_send_data(uint8_t n_data_bytes, uint16_t msg_id, const uint8_t *data)
Send data to the can output message queue  global. 
 
#define UCAN_LOG_SENDING
Set loglevel to sent messages. 
 
uint16_t mask
Mask for filtering rules. 
 
bool ucan_link_message_to_queue_mask(uint16_t mask, uint16_t message_id, QueueHandle_t queue)
Set a message mask to map multiple message to a queue  global. 
 
uint16_t message_id
ID of the queue for dispatching rules. 
 
#define UCAN_LOG_DROP
Set loglevel to dropped messages (unable to dispatch) 
 
QueueHandle_t queue
FreeRTOS message queue. 
 
#define UCAN_LOG_DISPATCH
Set loglevel to dispatched messages.