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.