21#define MESHX_TXCM_INIT_MAGIC 0x4455
25#define MESHX_TXCM_TASK_STACK_SIZE 2048
29#define MESHX_TXCM_TASK_PRIO 5
33#define MESHX_TXCM_SIG_Q_LEN 10
37#define MESHX_TXCM_SIG_Q_DEPTH sizeof(meshx_txcm_request_t)
53typedef struct meshx_txcm_tx_q
57 uint16_t msg_param_len;
79static meshx_err_t meshx_tx_queue_is_full(
const meshx_tx_queue_t *q);
80static meshx_err_t meshx_tx_queue_is_empty(
const meshx_tx_queue_t *q);
81static meshx_err_t meshx_tx_queue_dequeue(meshx_tx_queue_t *q, meshx_txcm_tx_q_t *item);
82static meshx_err_t meshx_tx_queue_peek(
const meshx_tx_queue_t *q, meshx_txcm_tx_q_t *item);
83static meshx_err_t meshx_tx_queue_enqueue(meshx_tx_queue_t *q,
const meshx_txcm_tx_q_t *item);
84static meshx_err_t meshx_tx_queue_enqueue_front(meshx_tx_queue_t *q,
const meshx_txcm_tx_q_t *item);
89static void meshx_txcm_task_handler(
const dev_struct_t *args);
105 meshx_tx_queue_t txcm_tx_queue;
114 .max_msg_length = MESHX_TXCM_SIG_Q_LEN,
115 .max_msg_depth = MESHX_TXCM_SIG_Q_DEPTH,
118 .task_name =
"meshx_txcm_task",
119 .priority = MESHX_TXCM_TASK_PRIO,
120 .stack_size = MESHX_TXCM_TASK_STACK_SIZE,
151static meshx_err_t meshx_tx_queue_is_full(
const meshx_tx_queue_t *q)
165static meshx_err_t meshx_tx_queue_is_empty(
const meshx_tx_queue_t *q)
181static meshx_err_t meshx_tx_queue_enqueue(meshx_tx_queue_t *q,
const meshx_txcm_tx_q_t *item)
184 err = meshx_tx_queue_is_full(q);
191 memcpy(q->q_param + q->tail, item,
sizeof(meshx_txcm_tx_q_t));
212static meshx_err_t meshx_tx_queue_enqueue_front(meshx_tx_queue_t *q,
const meshx_txcm_tx_q_t *item)
215 err = meshx_tx_queue_is_full(q);
224 memcpy(q->q_param + q->head, item,
sizeof(meshx_txcm_tx_q_t));
243static meshx_err_t meshx_tx_queue_peek(
const meshx_tx_queue_t *q, meshx_txcm_tx_q_t *item)
246 err = meshx_tx_queue_is_empty(q);
253 memcpy(item, q->q_param + q->head,
sizeof(meshx_txcm_tx_q_t));
272 const meshx_tx_queue_t *q,
273 const uint8_t *param,
277 err = meshx_tx_queue_is_empty(q);
283 int16_t head = q->head;
284 int16_t tail = q->tail;
291 if (strcmp((
const char*)param, (
const char*)q->q_param[tail].msg_param) == 0
292 && q->q_param[tail].dest_addr == dest_addr)
312static meshx_err_t meshx_tx_queue_dequeue(meshx_tx_queue_t *q, meshx_txcm_tx_q_t *item)
340static meshx_err_t meshx_txcm_msg_q_front_try_send(
bool resend)
343 meshx_txcm_tx_q_t front_tx =
348 MESHX_LOGD(
MODULE_ID_TXCM,
"TXCM_Q Stat: %x|%x|%x", g_txcm.txcm_tx_queue.head, g_txcm.txcm_tx_queue.tail, g_txcm.txcm_tx_queue.count);
349 if (resend ==
false && (meshx_tx_queue_peek(&g_txcm.txcm_tx_queue, &front_tx) !=
MESHX_SUCCESS))
360 MESHX_LOGD(
MODULE_ID_TXCM,
"Try to send message from Tx Control Tx Queue resend|state:%d|%d", resend,front_tx.msg_state);
362 err = meshx_tx_queue_dequeue(&g_txcm.txcm_tx_queue, &front_tx);
369 if ((int16_t)front_tx.retry_cnt-- <= 0)
376 if (front_tx.send_fn != NULL)
378 err = front_tx.send_fn(front_tx.msg_param, front_tx.msg_param_len);
390 err = meshx_tx_queue_enqueue_front(&g_txcm.txcm_tx_queue, &front_tx);
423 static meshx_txcm_tx_q_t new_tx;
436 err = meshx_tx_queue_search(&g_txcm.txcm_tx_queue, request->
msg_param, request->
dest_addr);
443 memset(&new_tx, 0,
sizeof(meshx_txcm_tx_q_t));
445 new_tx.msg_type = msg_type;
446 new_tx.send_fn = request->
send_fn;
454 err = meshx_tx_queue_enqueue(&g_txcm.txcm_tx_queue, &new_tx);
461 err = meshx_txcm_msg_q_front_try_send(
false);
519 err = meshx_txcm_msg_q_front_try_send(
true);
533 err = meshx_txcm_msg_q_front_try_send(
false);
555 meshx_txcm_tx_q_t front_tx;
556 if(meshx_tx_queue_peek(&g_txcm.txcm_tx_queue, &front_tx) ==
MESHX_SUCCESS)
558 if(front_tx.dest_addr == request->
dest_addr)
560 err = meshx_tx_queue_dequeue(&g_txcm.txcm_tx_queue, &front_tx);
580 err = meshx_txcm_msg_q_front_try_send(
false);
596static void meshx_txcm_task_handler(
const dev_struct_t *args)
639 if(g_txcm.init_magic == MESHX_TXCM_INIT_MAGIC)
644 g_txcm.init_magic = MESHX_TXCM_INIT_MAGIC;
645 g_txcm.txcm_task.arg = pdev;
684 uint16_t msg_param_len,
698 if(msg_param_len != 0 && msg_param != NULL)
707 memcpy(new_req.
msg_param, msg_param, msg_param_len);
This file contains the headers for meshx.c.
const void * meshx_cptr_t
struct dev_struct dev_struct_t
Structure representing the device composition and elements.
CONTROL_TASK_MSG_EVT_TXCM_MSG_TIMEOUT
@ CONTROL_TASK_MSG_CODE_TXCM
meshx_err_t control_task_msg_publish(control_task_msg_code_t msg_code, control_task_msg_evt_t msg_evt, const void *msg_evt_params, size_t sizeof_msg_evt_params)
Publish a control task message.
meshx_err_t control_task_msg_subscribe(control_task_msg_code_t msg_code, control_task_msg_evt_t evt_bmap, control_task_msg_handle_t callback)
Subscribe to a control task message.
meshx_err_t
MeshX Error Codes.
#define MESHX_LOGW(module_id, format,...)
#define MESHX_LOGI(module_id, format,...)
#define MESHX_LOGE(module_id, format,...)
#define MESHX_LOGD(module_id, format,...)
meshx_err_t meshx_msg_q_create(meshx_msg_q_t *msg_q_handle)
Create a MeshX Message Queue.
struct meshx_msg_q meshx_msg_q_t
MeshX Message Queue Structure.
meshx_err_t meshx_msg_q_send(meshx_msg_q_t *msg_q_handle, void const *msg, size_t msg_len, uint32_t delay_ms)
Send a Message to a MeshX Message Queue Back.
meshx_err_t meshx_msg_q_recv(meshx_msg_q_t *msg_q_handle, void *msg, uint32_t delay_ms)
Receive a Message from a MeshX Message Queue.
meshx_err_t meshx_rtos_free(void **ptr)
Frees memory allocated to a pointer and sets it to NULL.
meshx_err_t meshx_rtos_malloc(void **ptr, size_t size)
Allocates memory dynamically in a thread-safe manner using FreeRTOS.
void(* meshx_task_cb_t)(void *arg)
MeshX Task Function.
struct meshx_task meshx_task_t
MeshX Task Structure.
meshx_err_t meshx_task_create(meshx_task_t *task_handle)
Create a MeshX Task.
MeshX Tx Control Module This header file contains the definitions and function prototypes for the Mes...
meshx_err_t meshx_txcm_init(dev_struct_t *pdev)
Initializes the MeshX Tx Control Module.
meshx_err_t meshx_txcm_request_send(meshx_txcm_sig_t request_type, uint16_t dest_addr, meshx_cptr_t msg_param, uint16_t msg_param_len, meshx_txcm_fn_model_send_t send_fn)
Sends a request to the Tx Control module.
control_task_msg_handle_t meshx_txcm_cb_t
struct meshx_txcm_request meshx_txcm_request_t
Structure for Tx Control module requests.
meshx_txcm_sig_t
Enumeration of signal types for the Tx Control Module.
@ MESHX_TXCM_SIG_ENQ_SEND
@ MESHX_TXCM_SIG_DIRECT_SEND
#define MESHX_TXCM_TX_Q_LEN
Maximum number of transmission items in the Tx queue.
#define MESHX_TXCM_MSG_PARAM_MAX_LEN
Maximum length of the message parameters in bytes.
meshx_txcm_msg_state_t
Enumeration of message states for the Tx Control Module.
@ MESHX_TXCM_MSG_STATE_SENDING
@ MESHX_TXCM_MSG_STATE_NACK
@ MESHX_TXCM_MSG_STATE_NEW
@ MESHX_TXCM_MSG_STATE_ACK
@ MESHX_TXCM_MSG_STATE_WAITING_ACK
@ MESHX_TXCM_MSG_STATE_MAX
#define MESHX_TXCM_MSG_RETRY_MAX
Maximum number of retries for a message.
@ MESHX_TXCM_MSG_TYPE_UNACKED
@ MESHX_TXCM_MSG_TYPE_MAX
@ MESHX_TXCM_MSG_TYPE_ACKED
meshx_err_t(* meshx_txcm_fn_model_send_t)(meshx_cptr_t msg_param, size_t msg_param_len)
Function pointer the Model client layer needs to provide for the msg to be sent for both MESHX_TXCM_S...
meshx_err_t meshx_txcm_event_cb_reg(meshx_txcm_cb_t event_cb)
Registers a callback function for handling Tx Control module events.
meshx_txcm_sig_t request_type
meshx_txcm_fn_model_send_t send_fn