wm_wl_task.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "wm_mem.h"
  2. #include "wm_wl_timers.h"
  3. #include "wm_wl_task.h"
  4. #include <string.h>
  5. static tls_mbox_t task_mbox[TLS_MBOX_ALL_COUNT];
  6. struct task_msg wl_msg[TLS_MSG_ALL_COUONT];
  7. //#define TLS_MSG_ID_TX_MGMT_CMPLT 0
  8. //#define TLS_MSG_ID_MLME_TASK 1
  9. static void
  10. task_thread(void *arg)
  11. {
  12. struct task_msg *msg;
  13. start_routine fun;
  14. void * argu;
  15. struct task_parameter *task_param = (struct task_parameter *)arg;
  16. while (1) { /* MAIN Loop */
  17. /* wait for a message, timeouts are processed while waiting */
  18. tls_timeouts_mbox_fetch_p(task_param->timeo_id, task_mbox[task_param->mbox_id], (void **)&msg);
  19. switch (msg->type) {
  20. case TASK_MSG_CALLBACK:
  21. msg->msg.cb.function(msg->msg.cb.ctx);
  22. tls_mem_free(msg);
  23. break;
  24. case TASK_MSG_CALLBACK_STATIC:
  25. fun = msg->msg.cbs.function;
  26. argu = msg->msg.cbs.ctx;
  27. msg->msg.cbs.cnt--;
  28. fun(argu);
  29. break;
  30. case TASK_MSG_TIMEOUT:
  31. tls_timeout_p(task_param->timeo_id, msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);
  32. tls_mem_free(msg);
  33. break;
  34. case TASK_MSG_UNTIMEOUT:
  35. tls_untimeout_p(task_param->timeo_id, msg->msg.tmo.h, msg->msg.tmo.arg);
  36. tls_mem_free(msg);
  37. break;
  38. default:
  39. break;
  40. }
  41. }
  42. }
  43. s8 tls_wl_task_run(struct task_parameter *task_param)
  44. {
  45. if(tls_mbox_new(&task_mbox[task_param->mbox_id], task_param->mbox_size) != TLS_OS_SUCCESS) {
  46. return -1;
  47. }
  48. tls_os_task_create(NULL, task_param->name,
  49. task_thread,
  50. (void *)task_param,
  51. (void *)(task_param->stk_start),
  52. task_param->stk_size * sizeof(u32),
  53. TLS_TASK_START_PRIO+task_param->task_id,
  54. 0);
  55. return 0;
  56. }
  57. s8
  58. tls_wl_task_callback_static(struct task_parameter *task_param, start_routine function, void *ctx, u8 block, u8 msg_id)
  59. {
  60. struct task_msg *msg = &wl_msg[msg_id];
  61. if (msg->msg.cbs.cnt > 0)
  62. return TLS_OS_ERROR;
  63. if (tls_mbox_valid(task_mbox[task_param->mbox_id])) {
  64. msg->type = TASK_MSG_CALLBACK_STATIC;
  65. msg->msg.cbs.function = function;
  66. msg->msg.cbs.ctx = ctx;
  67. if (block) {
  68. tls_mbox_post(task_mbox[task_param->mbox_id], (void *)msg);
  69. }
  70. else {
  71. if (tls_mbox_trypost(task_mbox[task_param->mbox_id], (void *)msg) != TLS_OS_SUCCESS)
  72. return TLS_OS_ERROR;
  73. }
  74. msg->msg.cbs.cnt++;
  75. return TLS_OS_SUCCESS;
  76. }
  77. return TLS_OS_ERROR;
  78. }
  79. s8
  80. tls_wl_task_callback(struct task_parameter *task_param, start_routine function, void *ctx, u8 block)
  81. {
  82. struct task_msg *msg;
  83. if (tls_mbox_valid(task_mbox[task_param->mbox_id])) {
  84. msg = (struct task_msg *)tls_mem_alloc(sizeof(struct task_msg));
  85. if (msg == NULL) {
  86. return TLS_OS_ERROR;
  87. }
  88. msg->type = TASK_MSG_CALLBACK;
  89. msg->msg.cb.function = function;
  90. msg->msg.cb.ctx = ctx;
  91. if (block) {
  92. tls_mbox_post(task_mbox[task_param->mbox_id], msg);
  93. } else {
  94. if (tls_mbox_trypost(task_mbox[task_param->mbox_id], msg) != TLS_OS_SUCCESS) {
  95. //printf("tls_mbox_trypost error.\n");
  96. tls_mem_free(msg);
  97. return TLS_OS_ERROR;
  98. }
  99. }
  100. return TLS_OS_SUCCESS;
  101. }
  102. return TLS_OS_ERROR;
  103. }
  104. s8
  105. tls_wl_task_add_timeout(struct task_parameter *task_param, u32 msecs, tls_timeout_handler h, void *arg)
  106. {
  107. struct task_msg *msg;
  108. if (tls_mbox_valid(task_mbox[task_param->mbox_id])) {
  109. msg = (struct task_msg *)tls_mem_alloc(sizeof(struct task_msg));
  110. if (msg == NULL) {
  111. return TLS_OS_ERROR;
  112. }
  113. msg->type = TASK_MSG_TIMEOUT;
  114. msg->msg.tmo.msecs = msecs;
  115. msg->msg.tmo.h = h;
  116. msg->msg.tmo.arg = arg;
  117. tls_mbox_post(task_mbox[task_param->mbox_id], msg);
  118. return TLS_OS_SUCCESS;
  119. }
  120. return TLS_OS_ERROR;
  121. }
  122. s8
  123. tls_wl_task_untimeout(struct task_parameter *task_param, tls_timeout_handler h, void *arg)
  124. {
  125. struct task_msg *msg;
  126. if (tls_mbox_valid(task_mbox[task_param->mbox_id])) {
  127. msg = (struct task_msg *)tls_mem_alloc(sizeof(struct task_msg));
  128. if (msg == NULL) {
  129. return TLS_OS_ERROR;
  130. }
  131. msg->type = TASK_MSG_UNTIMEOUT;
  132. msg->msg.tmo.h = h;
  133. msg->msg.tmo.arg = arg;
  134. tls_mbox_post(task_mbox[task_param->mbox_id], msg);
  135. return TLS_OS_SUCCESS;
  136. }
  137. return TLS_OS_ERROR;
  138. }
  139. s8
  140. tls_wl_task_init(void)
  141. {
  142. memset(wl_msg, 0, sizeof(struct task_msg));
  143. return 0;
  144. }