MeshX 0.3
This repository provides an implementation for Bluetooth Low Energy (BLE) Mesh network nodes. The project allows you to create BLE mesh nodes that can communicate with each other, enabling the development of smart home solutions or other IoT-based applications.
Loading...
Searching...
No Matches
meshx_txcm.c
Go to the documentation of this file.
1
12#include "meshx.h"
13#include "sys/queue.h"
14#include "string.h"
15#include "meshx_txcm.h"
16
17#if CONFIG_TXCM_ENABLE
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)
38
45typedef meshx_err_t (*meshx_txcm_sig_proc_t)(meshx_txcm_request_t *request);
46
53typedef struct meshx_txcm_tx_q
54{
55 uint16_t dest_addr;
56 uint16_t retry_cnt;
57 uint16_t msg_param_len;
58 meshx_txcm_msg_type_t msg_type;
59 meshx_txcm_msg_state_t msg_state;
61 uint8_t msg_param[MESHX_TXCM_MSG_PARAM_MAX_LEN];
62}meshx_txcm_tx_q_t;
63
69typedef struct {
70 int16_t head;
71 int16_t tail;
72 uint16_t count;
73 meshx_txcm_tx_q_t q_param[MESHX_TXCM_TX_Q_LEN];
74} meshx_tx_queue_t;
75
76/****************************************************************************
77 * Private functions Ring buffer
78 ****************************************************************************/
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);
85
86/****************************************************************************
87 * Private functions Tx Control
88 ****************************************************************************/
89static void meshx_txcm_task_handler(const dev_struct_t *args);
90static meshx_err_t meshx_txcm_sig_resend(meshx_txcm_request_t *request);
91static meshx_err_t meshx_txcm_sig_enq_send(meshx_txcm_request_t *request);
92static meshx_err_t meshx_txcm_sig_ack(const meshx_txcm_request_t *request);
93static meshx_err_t meshx_txcm_sig_direct_send(meshx_txcm_request_t *request);
94
101static struct{
102 uint16_t init_magic;
103 meshx_task_t txcm_task;
104 meshx_msg_q_t txcm_sig_queue;
105 meshx_tx_queue_t txcm_tx_queue;
106} g_txcm = {
107 .init_magic = 0,
108 .txcm_tx_queue = {
109 .head = 0,
110 .tail = 0,
111 .count = 0,
112 },
113 .txcm_sig_queue = {
114 .max_msg_length = MESHX_TXCM_SIG_Q_LEN,
115 .max_msg_depth = MESHX_TXCM_SIG_Q_DEPTH,
116 },
117 .txcm_task = {
118 .task_name = "meshx_txcm_task",
119 .priority = MESHX_TXCM_TASK_PRIO,
120 .stack_size = MESHX_TXCM_TASK_STACK_SIZE,
121 .task_cb = (meshx_task_cb_t) &meshx_txcm_task_handler,
122 }
123};
124
133static meshx_txcm_sig_proc_t g_sig_proc_table[MESHX_TXCM_SIG_MAX] =
134{
135 [MESHX_TXCM_SIG_ACK] = (meshx_txcm_sig_proc_t)&meshx_txcm_sig_ack,
136 [MESHX_TXCM_SIG_RESEND] = (meshx_txcm_sig_proc_t)&meshx_txcm_sig_resend,
137 [MESHX_TXCM_SIG_ENQ_SEND] = (meshx_txcm_sig_proc_t)&meshx_txcm_sig_enq_send,
138 [MESHX_TXCM_SIG_DIRECT_SEND] = (meshx_txcm_sig_proc_t)&meshx_txcm_sig_direct_send,
139};
140
151static meshx_err_t meshx_tx_queue_is_full(const meshx_tx_queue_t *q)
152{
153 return q->count == MESHX_TXCM_TX_Q_LEN ? MESHX_SUCCESS : MESHX_NO_MEM;
154}
155
165static meshx_err_t meshx_tx_queue_is_empty(const meshx_tx_queue_t *q)
166{
167 return q->count == 0 ? MESHX_SUCCESS : MESHX_INVALID_STATE;
168}
169
181static meshx_err_t meshx_tx_queue_enqueue(meshx_tx_queue_t *q, const meshx_txcm_tx_q_t *item)
182{
184 err = meshx_tx_queue_is_full(q);
185 if (err == MESHX_SUCCESS)
186 {
187 return MESHX_NO_MEM;
188 }
189
190 // Copy the entire item structure into the q_param.
191 memcpy(q->q_param + q->tail, item, sizeof(meshx_txcm_tx_q_t));
192
193 q->tail = (q->tail + 1) % MESHX_TXCM_TX_Q_LEN;
194
195 // Increment count.
196 q->count++;
197
198 return MESHX_SUCCESS;
199}
200
212static meshx_err_t meshx_tx_queue_enqueue_front(meshx_tx_queue_t *q, const meshx_txcm_tx_q_t *item)
213{
215 err = meshx_tx_queue_is_full(q);
216 if (err == MESHX_SUCCESS)
217 {
218 return MESHX_NO_MEM;
219 }
220 // Increment tail and wrap around if necessary.
221 q->head = (q->head - 1 + MESHX_TXCM_TX_Q_LEN) % MESHX_TXCM_TX_Q_LEN;
222
223 // Copy the entire item structure into the q_param.
224 memcpy(q->q_param + q->head, item, sizeof(meshx_txcm_tx_q_t));
225
226 // Increment count.
227 q->count++;
228
229 return MESHX_SUCCESS;
230}
243static meshx_err_t meshx_tx_queue_peek(const meshx_tx_queue_t *q, meshx_txcm_tx_q_t *item)
244{
246 err = meshx_tx_queue_is_empty(q);
247 if (err == MESHX_SUCCESS)
248 {
249 return MESHX_INVALID_STATE;
250 }
251
252 // Copy the entire item structure from the q_param.
253 memcpy(item, q->q_param + q->head, sizeof(meshx_txcm_tx_q_t));
254
255 return MESHX_SUCCESS;
256}
257
271static meshx_err_t meshx_tx_queue_search(
272 const meshx_tx_queue_t *q,
273 const uint8_t *param,
274 uint16_t dest_addr)
275{
277 err = meshx_tx_queue_is_empty(q);
278 if (err == MESHX_SUCCESS)
279 {
280 return MESHX_INVALID_STATE;
281 }
282
283 int16_t head = q->head;
284 int16_t tail = q->tail;
285
286 while(head != tail)
287 {
288 // Move tail back
289 tail = (tail - 1 + MESHX_TXCM_TX_Q_LEN) % MESHX_TXCM_TX_Q_LEN;
290 // compare param with q_param[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)
293 {
294 MESHX_LOGD(MODULE_ID_TXCM, "Found param in queue");
295 return MESHX_SUCCESS;
296 }
297 }
298
299 return MESHX_NOT_FOUND;
300}
312static meshx_err_t meshx_tx_queue_dequeue(meshx_tx_queue_t *q, meshx_txcm_tx_q_t *item)
313{
314 meshx_err_t err = meshx_tx_queue_peek(q, item);
315 if (err != MESHX_SUCCESS)
316 {
317 return err;
318 }
319
320 // Move head forward
321 q->head = (q->head + 1) % MESHX_TXCM_TX_Q_LEN;
322
323 // Decrement count
324 q->count--;
325
326 return MESHX_SUCCESS;
327}
328
340static meshx_err_t meshx_txcm_msg_q_front_try_send(bool resend)
341{
343 meshx_txcm_tx_q_t front_tx =
344 {
345 .msg_state = MESHX_TXCM_MSG_STATE_MAX
346 };
347
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))
350 {
351 return MESHX_SUCCESS;
352 }
353
354 if (!(resend || front_tx.msg_state == MESHX_TXCM_MSG_STATE_NEW))
355 {
356 return MESHX_SUCCESS;
357 }
358 if(resend)
359 {
360 MESHX_LOGD(MODULE_ID_TXCM, "Try to send message from Tx Control Tx Queue resend|state:%d|%d", resend,front_tx.msg_state);
361 }
362 err = meshx_tx_queue_dequeue(&g_txcm.txcm_tx_queue, &front_tx);
363 if (err)
364 {
365 MESHX_LOGE(MODULE_ID_TXCM, "Failed to receive message from Tx Control Tx Queue: %p", (void *)err);
366 return err;
367 }
368
369 if ((int16_t)front_tx.retry_cnt-- <= 0)
370 {
371 front_tx.msg_state = MESHX_TXCM_MSG_STATE_NACK;
372 return MESHX_TIMEOUT;
373 }
374
375 front_tx.msg_state = MESHX_TXCM_MSG_STATE_SENDING;
376 if (front_tx.send_fn != NULL)
377 {
378 err = front_tx.send_fn(front_tx.msg_param, front_tx.msg_param_len);
379 if(err != MESHX_SUCCESS)
380 {
381 front_tx.msg_state = MESHX_TXCM_MSG_STATE_NACK;
382 return err;
383 }
384 }
385
386 if (front_tx.msg_type == MESHX_TXCM_MSG_TYPE_ACKED)
387 {
388 /* Requeue to TX Front as we are waiting for Ack */
389 front_tx.msg_state = MESHX_TXCM_MSG_STATE_WAITING_ACK;
390 err = meshx_tx_queue_enqueue_front(&g_txcm.txcm_tx_queue, &front_tx);
391 if (err)
392 {
393 MESHX_LOGE(MODULE_ID_TXCM, "Failed to send message to Tx Control Tx Queue: %p", (void *)err);
394 return err;
395 }
396 }
397 else
398 {
399 /* Un-Acked msg need not to be retained */
401 }
402 return err;
403}
404
418static meshx_err_t meshx_txcm_proccess_request_msg(
419 meshx_txcm_request_t *request,
420 meshx_txcm_msg_type_t msg_type)
421{
423 static meshx_txcm_tx_q_t new_tx;
424
425 if ( request == NULL
426 || request->send_fn == NULL
427 || msg_type >= MESHX_TXCM_MSG_TYPE_MAX
429 )
430 {
431 return MESHX_INVALID_ARG;
432 }
433
434 MESHX_LOGD(MODULE_ID_TXCM, "Processing a new request");
435
436 err = meshx_tx_queue_search(&g_txcm.txcm_tx_queue, request->msg_param, request->dest_addr);
437 if (err == MESHX_SUCCESS)
438 {
439 MESHX_LOGD(MODULE_ID_TXCM, "Message already in queue");
440 return MESHX_SUCCESS;
441 }
442
443 memset(&new_tx, 0, sizeof(meshx_txcm_tx_q_t));
444
445 new_tx.msg_type = msg_type;
446 new_tx.send_fn = request->send_fn;
447 new_tx.dest_addr = request->dest_addr;
448 new_tx.msg_param_len = request->msg_param_len;
449 new_tx.msg_state = MESHX_TXCM_MSG_STATE_NEW;
450 new_tx.retry_cnt = MESHX_TXCM_MSG_RETRY_MAX;
451
452 memcpy(new_tx.msg_param, request->msg_param, request->msg_param_len);
453
454 err = meshx_tx_queue_enqueue(&g_txcm.txcm_tx_queue, &new_tx);
455 if (err)
456 {
457 MESHX_LOGE(MODULE_ID_TXCM, "Failed to send message to Tx Control Tx Queue: %p", (void *)err);
458 return err;
459 }
460
461 err = meshx_txcm_msg_q_front_try_send(false);
462 if(err)
463 {
464 MESHX_LOGE(MODULE_ID_TXCM, "Failed to process front of Tx Control Tx Queue: %p", (void *)err);
465 }
466 return err;
467}
468
481static meshx_err_t meshx_txcm_sig_enq_send(meshx_txcm_request_t *request)
482{
483 MESHX_LOGD(MODULE_ID_TXCM, "Enqueuing a new request");
484 return meshx_txcm_proccess_request_msg(request, MESHX_TXCM_MSG_TYPE_ACKED);
485}
486
499static meshx_err_t meshx_txcm_sig_direct_send(meshx_txcm_request_t *request)
500{
501 MESHX_LOGD(MODULE_ID_TXCM, "Processing a new direct request");
502 /* The same path can take care as the msg type */
503 return meshx_txcm_proccess_request_msg(request, MESHX_TXCM_MSG_TYPE_UNACKED);
504}
505
513static meshx_err_t meshx_txcm_sig_resend(meshx_txcm_request_t *request)
514{
515 MESHX_UNUSED(request);
517
518 MESHX_LOGD(MODULE_ID_TXCM, "Processing a retry");
519 err = meshx_txcm_msg_q_front_try_send(true);
520 if(err == MESHX_TIMEOUT)
521 {
522 MESHX_LOGD(MODULE_ID_TXCM, "Timeout");
526 request->msg_param,
527 request->msg_param_len
528 );
529 if(err)
530 {
531 MESHX_LOGE(MODULE_ID_TXCM, "Failed to process front of Tx Control Tx Queue: %p", (void *)err);
532 }
533 err = meshx_txcm_msg_q_front_try_send(false);
534 }
535 meshx_rtos_free(&request->msg_param);
536 return err;
537}
538
549static meshx_err_t meshx_txcm_sig_ack(const meshx_txcm_request_t *request)
550{
551 MESHX_UNUSED(request);
553
554 MESHX_LOGD(MODULE_ID_TXCM, "Processing an ack");
555 meshx_txcm_tx_q_t front_tx;
556 if(meshx_tx_queue_peek(&g_txcm.txcm_tx_queue, &front_tx) == MESHX_SUCCESS)
557 {
558 if(front_tx.dest_addr == request->dest_addr)
559 {
560 err = meshx_tx_queue_dequeue(&g_txcm.txcm_tx_queue, &front_tx);
561 if (err)
562 {
563 MESHX_LOGE(MODULE_ID_TXCM, "Failed to receive message from Tx Control Tx Queue: %p", (void *)err);
564 return err;
565 }
566 MESHX_LOGD(MODULE_ID_TXCM, "Received message from Tx Control Tx Queue");
567 front_tx.msg_state = MESHX_TXCM_MSG_STATE_ACK;
568 }
569 else
570 {
571 MESHX_LOGW(MODULE_ID_TXCM, "Async status received from address 0x%X", front_tx.dest_addr);
573 }
574 }
575 err = meshx_rtos_free(request->msg_param);
576 if (err)
577 {
578 MESHX_LOGE(MODULE_ID_TXCM, "RTOS Free failed: %p", (void *)err);
579 }
580 err = meshx_txcm_msg_q_front_try_send(false);
581 return err;
582}
583
596static void meshx_txcm_task_handler(const dev_struct_t *args)
597{
598 MESHX_UNUSED(args);
599 MESHX_LOGI(MODULE_ID_TXCM, "MeshX Tx Control Task started");
601
602 while(true)
603 {
604 meshx_txcm_request_t request;
605 /* Wait for a signal from the signal queue */
606 if(meshx_msg_q_recv(&g_txcm.txcm_sig_queue, &request, UINT32_MAX) != MESHX_SUCCESS)
607 {
608 MESHX_LOGD(MODULE_ID_TXCM, "Failed to receive signal from Tx Control Signal Queue");
609 continue;
610 }
611 MESHX_LOGD(MODULE_ID_TXCM, "Processing sig: %d", request.request_type);
612
613 /* Process the signal based on the request type */
614 err = g_sig_proc_table[request.request_type](&request);
615 if(err)
616 {
617 MESHX_LOGE(MODULE_ID_TXCM, "Failed to process the request (%p): %p",(void*)request.request_type, (void *)err);
618 }
619 }
620}
621
637{
638 MESHX_LOGI(MODULE_ID_TXCM, "Initializing MeshX Tx Control Module");
639 if(g_txcm.init_magic == MESHX_TXCM_INIT_MAGIC)
640 {
641 return MESHX_SUCCESS;
642 }
644 g_txcm.init_magic = MESHX_TXCM_INIT_MAGIC;
645 g_txcm.txcm_task.arg = pdev;
646
647 /* Create Control Signal Queue */
648 err = meshx_msg_q_create(&g_txcm.txcm_sig_queue);
649 if(err)
650 {
651 MESHX_LOGE(MODULE_ID_TXCM, "Failed to create Tx Control Signal Queue: %p", (void *)err);
652 return err;
653 }
654
655 err = meshx_task_create(&g_txcm.txcm_task);
656 if(err)
657 {
658 MESHX_LOGE(MODULE_ID_TXCM, "Failed to create Tx Control task: %p", (void *)err);
659 return err;
660 }
661
662 return MESHX_SUCCESS;
663}
664
681 meshx_txcm_sig_t request_type,
682 uint16_t dest_addr,
683 meshx_cptr_t msg_param,
684 uint16_t msg_param_len,
686)
687{
689 static meshx_txcm_request_t new_req;
690 memset(&new_req, 0, sizeof(meshx_txcm_request_t));
691
692 /* Prepare request message */
693 new_req.dest_addr = dest_addr;
694 new_req.send_fn = send_fn;
695 new_req.request_type = request_type;
696 new_req.msg_param_len = msg_param_len;
697
698 if(msg_param_len != 0 && msg_param != NULL)
699 {
700 /* Retain message context */
701 err = meshx_rtos_malloc(&new_req.msg_param, msg_param_len);
702 if (err)
703 {
704 MESHX_LOGE(MODULE_ID_TXCM, "Malloc Failure: %p", (void *)err);
705 return err;
706 }
707 memcpy(new_req.msg_param, msg_param, msg_param_len);
708 }
709 else
710 {
711 new_req.msg_param = NULL;
712 }
713 err = meshx_msg_q_send(&g_txcm.txcm_sig_queue, &new_req, sizeof(meshx_txcm_request_t), 0);
714 if (err)
715 {
716 MESHX_LOGE(MODULE_ID_TXCM, "TXCM Signal failed: %p", (void *)err);
717 meshx_rtos_free(&new_req.msg_param);
718 return err;
719 }
720 return err;
721}
722
736{
740 event_cb);
741}
742#endif /* CONFIG_TXCM_ENABLE */
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.
#define MESHX_UNUSED(x)
Definition meshx_err.h:15
meshx_err_t
MeshX Error Codes.
Definition meshx_err.h:39
@ MESHX_SUCCESS
Definition meshx_err.h:40
@ MESHX_INVALID_ARG
Definition meshx_err.h:42
@ MESHX_INVALID_STATE
Definition meshx_err.h:45
@ MESHX_NOT_FOUND
Definition meshx_err.h:46
@ MESHX_NO_MEM
Definition meshx_err.h:44
@ MESHX_TIMEOUT
Definition meshx_err.h:48
#define MESHX_DO_NOTHING
Definition meshx_err.h:17
#define MESHX_LOGW(module_id, format,...)
Definition meshx_log.h:87
#define MESHX_LOGI(module_id, format,...)
Definition meshx_log.h:100
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:73
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:113
meshx_err_t meshx_msg_q_create(meshx_msg_q_t *msg_q_handle)
Create a MeshX Message Queue.
Definition meshx_msg_q.c:26
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.
Definition meshx_msg_q.c:80
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.
Definition meshx_utils.c:65
void(* meshx_task_cb_t)(void *arg)
MeshX Task Function.
Definition meshx_task.h:26
struct meshx_task meshx_task_t
MeshX Task Structure.
meshx_err_t meshx_task_create(meshx_task_t *task_handle)
Create a MeshX Task.
Definition meshx_task.c:28
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
Definition meshx_txcm.h:49
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.
Definition meshx_txcm.h:57
@ MESHX_TXCM_SIG_ENQ_SEND
Definition meshx_txcm.h:58
@ MESHX_TXCM_SIG_DIRECT_SEND
Definition meshx_txcm.h:59
@ MESHX_TXCM_SIG_ACK
Definition meshx_txcm.h:61
@ MESHX_TXCM_SIG_RESEND
Definition meshx_txcm.h:60
@ MESHX_TXCM_SIG_MAX
Definition meshx_txcm.h:62
#define MESHX_TXCM_TX_Q_LEN
Maximum number of transmission items in the Tx queue.
Definition meshx_txcm.h:41
#define MESHX_TXCM_MSG_PARAM_MAX_LEN
Maximum length of the message parameters in bytes.
Definition meshx_txcm.h:34
meshx_txcm_msg_state_t
Enumeration of message states for the Tx Control Module.
Definition meshx_txcm.h:72
@ MESHX_TXCM_MSG_STATE_SENDING
Definition meshx_txcm.h:75
@ MESHX_TXCM_MSG_STATE_NACK
Definition meshx_txcm.h:78
@ MESHX_TXCM_MSG_STATE_NEW
Definition meshx_txcm.h:74
@ MESHX_TXCM_MSG_STATE_ACK
Definition meshx_txcm.h:77
@ MESHX_TXCM_MSG_STATE_WAITING_ACK
Definition meshx_txcm.h:76
@ MESHX_TXCM_MSG_STATE_MAX
Definition meshx_txcm.h:79
#define MESHX_TXCM_MSG_RETRY_MAX
Maximum number of retries for a message.
Definition meshx_txcm.h:27
meshx_txcm_msg_type_t
Definition meshx_txcm.h:83
@ MESHX_TXCM_MSG_TYPE_UNACKED
Definition meshx_txcm.h:85
@ MESHX_TXCM_MSG_TYPE_MAX
Definition meshx_txcm.h:86
@ MESHX_TXCM_MSG_TYPE_ACKED
Definition meshx_txcm.h:84
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...
Definition meshx_txcm.h:94
meshx_err_t meshx_txcm_event_cb_reg(meshx_txcm_cb_t event_cb)
Registers a callback function for handling Tx Control module events.
@ MODULE_ID_TXCM
Definition module_id.h:33
meshx_ptr_t msg_param
Definition meshx_txcm.h:106
meshx_txcm_sig_t request_type
Definition meshx_txcm.h:107
meshx_txcm_fn_model_send_t send_fn
Definition meshx_txcm.h:108
uint16_t msg_param_len
Definition meshx_txcm.h:105