fix: add explicit route send failure results
This commit is contained in:
+85
-32
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user