diff --git a/App/route_msg.c b/App/route_msg.c index 9f53e6c..1e30c9d 100644 --- a/App/route_msg.c +++ b/App/route_msg.c @@ -12,6 +12,22 @@ typedef struct { static route_slot_t g_route_slots[ROUTE_MSG_POOL_SIZE]; +const char *route_send_result_to_str(route_send_result_t result) +{ + switch (result) { + case ROUTE_SEND_OK: + return "ok"; + case ROUTE_SEND_INVALID_INPUT: + return "invalid"; + case ROUTE_SEND_POOL_EXHAUSTED: + return "pool"; + case ROUTE_SEND_QUEUE_FULL: + return "queue"; + default: + return "unknown"; + } +} + void route_msg_init(void) { memset(g_route_slots, 0, sizeof(g_route_slots)); @@ -108,15 +124,15 @@ void route_msg_free_from_isr(route_msg_t *msg) taskEXIT_CRITICAL_FROM_ISR(saved_interrupt_status); } -static bool route_prepare(route_msg_t *msg, - uint8_t src_id, - uint8_t dst_mask, - uint8_t conn_type, - const uint8_t *data, - uint16_t len) +static route_send_result_t route_prepare(route_msg_t *msg, + uint8_t src_id, + uint8_t dst_mask, + uint8_t conn_type, + const uint8_t *data, + uint16_t len) { if (msg == NULL || data == NULL || len == 0u || len > ROUTE_MSG_MAX_PAYLOAD) { - return false; + return ROUTE_SEND_INVALID_INPUT; } msg->src_id = src_id; @@ -124,51 +140,88 @@ static bool route_prepare(route_msg_t *msg, msg->conn_type = conn_type; msg->len = len; memcpy(msg->data, data, len); - return true; + return ROUTE_SEND_OK; } -bool route_send(QueueHandle_t queue, - uint8_t src_id, - uint8_t dst_mask, - uint8_t conn_type, - const uint8_t *data, - uint16_t len, - TickType_t wait_ticks) +static route_send_result_t route_validate_args(QueueHandle_t queue, + const uint8_t *data, + uint16_t len) { - route_msg_t *msg = route_msg_alloc(wait_ticks); + if (queue == NULL || data == NULL || len == 0u || len > ROUTE_MSG_MAX_PAYLOAD) { + return ROUTE_SEND_INVALID_INPUT; + } - if (!route_prepare(msg, src_id, dst_mask, conn_type, data, len)) { + return ROUTE_SEND_OK; +} + +route_send_result_t route_send(QueueHandle_t queue, + uint8_t src_id, + uint8_t dst_mask, + uint8_t conn_type, + const uint8_t *data, + uint16_t len, + TickType_t wait_ticks) +{ + route_send_result_t result; + route_msg_t *msg; + + result = route_validate_args(queue, data, len); + if (result != ROUTE_SEND_OK) { + return result; + } + + msg = route_msg_alloc(wait_ticks); + + if (msg == NULL) { + return ROUTE_SEND_POOL_EXHAUSTED; + } + + result = route_prepare(msg, src_id, dst_mask, conn_type, data, len); + if (result != ROUTE_SEND_OK) { route_msg_free(msg); - return false; + return result; } if (xQueueSend(queue, &msg, wait_ticks) != pdPASS) { route_msg_free(msg); - return false; + return ROUTE_SEND_QUEUE_FULL; } - return true; + return ROUTE_SEND_OK; } -bool route_send_from_isr(QueueHandle_t queue, - uint8_t src_id, - uint8_t dst_mask, - uint8_t conn_type, - const uint8_t *data, - uint16_t len, - BaseType_t *xHigherPriorityTaskWoken) +route_send_result_t route_send_from_isr(QueueHandle_t queue, + uint8_t src_id, + uint8_t dst_mask, + uint8_t conn_type, + const uint8_t *data, + uint16_t len, + BaseType_t *xHigherPriorityTaskWoken) { - route_msg_t *msg = route_msg_alloc_from_isr(xHigherPriorityTaskWoken); + route_send_result_t result; + route_msg_t *msg; - if (!route_prepare(msg, src_id, dst_mask, conn_type, data, len)) { + result = route_validate_args(queue, data, len); + if (result != ROUTE_SEND_OK) { + return result; + } + + msg = route_msg_alloc_from_isr(xHigherPriorityTaskWoken); + + if (msg == NULL) { + return ROUTE_SEND_POOL_EXHAUSTED; + } + + result = route_prepare(msg, src_id, dst_mask, conn_type, data, len); + if (result != ROUTE_SEND_OK) { route_msg_free_from_isr(msg); - return false; + return result; } if (xQueueSendFromISR(queue, &msg, xHigherPriorityTaskWoken) != pdPASS) { route_msg_free_from_isr(msg); - return false; + return ROUTE_SEND_QUEUE_FULL; } - return true; + return ROUTE_SEND_OK; } diff --git a/App/route_msg.h b/App/route_msg.h index 2fe0d9b..5da2005 100644 --- a/App/route_msg.h +++ b/App/route_msg.h @@ -29,6 +29,13 @@ typedef enum { ROUTE_CONN_C2 } route_conn_type_t; +typedef enum { + ROUTE_SEND_OK = 0, + ROUTE_SEND_INVALID_INPUT, + ROUTE_SEND_POOL_EXHAUSTED, + ROUTE_SEND_QUEUE_FULL +} route_send_result_t; + typedef struct { uint8_t src_id; uint8_t dst_mask; @@ -42,20 +49,21 @@ route_msg_t *route_msg_alloc(TickType_t wait_ticks); route_msg_t *route_msg_alloc_from_isr(BaseType_t *xHigherPriorityTaskWoken); void route_msg_free(route_msg_t *msg); void route_msg_free_from_isr(route_msg_t *msg); -bool route_send(QueueHandle_t queue, - uint8_t src_id, - uint8_t dst_mask, - uint8_t conn_type, - const uint8_t *data, - uint16_t len, - TickType_t wait_ticks); -bool route_send_from_isr(QueueHandle_t queue, - uint8_t src_id, - uint8_t dst_mask, - uint8_t conn_type, - const uint8_t *data, - uint16_t len, - BaseType_t *xHigherPriorityTaskWoken); +const char *route_send_result_to_str(route_send_result_t result); +route_send_result_t route_send(QueueHandle_t queue, + uint8_t src_id, + uint8_t dst_mask, + uint8_t conn_type, + const uint8_t *data, + uint16_t len, + TickType_t wait_ticks); +route_send_result_t route_send_from_isr(QueueHandle_t queue, + uint8_t src_id, + uint8_t dst_mask, + uint8_t conn_type, + const uint8_t *data, + uint16_t len, + BaseType_t *xHigherPriorityTaskWoken); #ifdef __cplusplus }