console.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /**
  2. * @file
  3. * @author chipsea
  4. * @brief
  5. * @version 0.1
  6. * @date 2020-11-30
  7. * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
  8. * @note
  9. */
  10. #include "console.h"
  11. #include "uart.h"
  12. #include "error.h"
  13. #include "OSAL.h"
  14. #include "string.h"
  15. #include "pwrmgr.h"
  16. #include "log.h"
  17. typedef enum{
  18. CONS_ST_IDLE,
  19. CONS_ST_RX,
  20. CONS_ST_CMD
  21. }cons_state_t;
  22. typedef struct{
  23. cons_state_t state;
  24. uint16_t rx_cnt;
  25. uint8_t rx_buf[CONS_CMD_RXBUF_MAX];
  26. const cons_cmd_t* cmd_list;
  27. cons_callback_t callback;
  28. }cons_ctx_t;
  29. cons_ctx_t s_cons_ctx;
  30. void console_parse_cmd(void)
  31. {
  32. uint16_t i,j;
  33. uint16_t cmd_id = 0;
  34. char* param_table[CONS_PARAM_NUM_MAX];
  35. cons_ctx_t* pctx = &s_cons_ctx;
  36. const cons_cmd_t* cmd_list = pctx->cmd_list;
  37. uint8_t* prx = s_cons_ctx.rx_buf;
  38. char* pcmd = NULL;
  39. char* pparam = NULL;
  40. uint8_t param_num = 0;
  41. //LOG("\n");
  42. //for(i = 0; i< pctx->rx_cnt; i++)
  43. // LOG("%x ",prx[i]);
  44. // LOG("\n");
  45. //parse "at"
  46. for(i = 1; i< pctx->rx_cnt; i++){
  47. if(prx[i-1] == 'a' && prx[i] == 't'){
  48. i++;
  49. break;
  50. }
  51. }
  52. if(i == pctx->rx_cnt){
  53. LOG("Parse filed, did not found \"at\"\n");
  54. return;
  55. }
  56. //parse cmd
  57. {
  58. pcmd = (char*)prx+i;
  59. for(; i< pctx->rx_cnt; i++){
  60. if(prx[i] == ' ' || prx[i] == '\0' ){
  61. prx[i] = '\0';
  62. break;
  63. }
  64. if(prx[i] < 0x20 || prx[i] > 0x7d){
  65. LOG("Parse failed, cmd has illegal character\n");
  66. return;
  67. }
  68. }
  69. if(osal_strlen(pcmd) == 0){
  70. LOG("Parse failed, cmd is empty\n");
  71. return;
  72. }
  73. for(j = 0; j<CONS_CMD_NUM_MAX; j++){
  74. if(cmd_list[j].cmd_id == 0 || cmd_list[j].cmd_name == NULL ){
  75. LOG("Parse failed, cmd is not match cmdlist\n");
  76. return;
  77. }
  78. if(strcmp(pcmd, cmd_list[j].cmd_name) == 0){
  79. //match
  80. cmd_id = cmd_list[j].cmd_id;
  81. break;
  82. }
  83. }
  84. if(cmd_id == 0){
  85. LOG("Parse failed, cmd is not match cmdlist_1\n");
  86. return;
  87. }
  88. }
  89. i++;
  90. //parse parameter
  91. pparam = (char*)prx+i;
  92. for(; i< pctx->rx_cnt; i++){
  93. if(prx[i] == ' '){
  94. prx[i] = '\0';
  95. if(osal_strlen(pparam) == 0){
  96. break;
  97. }
  98. param_table[param_num] = pparam;
  99. param_num++;
  100. if(param_num >= CONS_PARAM_NUM_MAX)
  101. break;
  102. pparam = (char*)prx+i+1;
  103. continue;
  104. }
  105. if(prx[i] == '\0'){
  106. if(osal_strlen(pparam) == 0){
  107. break;
  108. }
  109. param_table[param_num] = pparam;
  110. param_num++;
  111. break;
  112. }
  113. if(prx[i] < 0x20 || prx[i] > 0x7d){
  114. LOG("Parse failed, parameter has illegal character\n");
  115. return;
  116. }
  117. }
  118. pctx->callback(cmd_id, param_num, param_table);
  119. }
  120. void console_sleep_handler(void)
  121. {
  122. HalGpioFmuxEnable(P10, Bit_DISABLE); //enable fullmux fuction; enable or disable
  123. HalGpioWkupConfig(P10, NEGEDGE);
  124. }
  125. void console_wakeup_handler(void)
  126. {
  127. int i;
  128. HalGpioSet(P14, 0);
  129. HalGpioSet(P14, 1);
  130. HalGpioSet(P14, 0);
  131. for(i = 0; i< 20; i++){
  132. if(HalGpioGet(P10)==0)
  133. {
  134. hal_pwrmgr_lock(MOD_CONSOLE);
  135. break;
  136. }
  137. }
  138. HalGpioSet(P14, 0);
  139. HalGpioSet(P14, 1);
  140. HalGpioSet(P14, 0);
  141. s_cons_ctx.state = CONS_ST_IDLE;
  142. }
  143. void console_rx_handler(uart_Evt_t* pev)
  144. {
  145. cons_ctx_t* pctx = &s_cons_ctx;
  146. uint8_t* prx = s_cons_ctx.rx_buf;
  147. switch(pev->type){
  148. case UART_EVT_TYPE_RX_DATA:
  149. case UART_EVT_TYPE_RX_DATA_TO:
  150. {
  151. uint8_t i;
  152. uint8_t* prx_msg = pev->data;
  153. //for(i = 0; i< pev->len; i++)
  154. // LOG("%x ",pev->data[i]);
  155. //LOG("\n");
  156. if(pctx->state == CONS_ST_IDLE){
  157. hal_pwrmgr_lock(MOD_CONSOLE);
  158. pctx->state = CONS_ST_RX;
  159. }
  160. if(pctx->state == CONS_ST_RX){
  161. for(i = 0; i< pev->len; i++){
  162. if(prx_msg[i] == '\r' ||prx_msg[i] == '\n'){
  163. prx[pctx->rx_cnt] = 0;
  164. pctx->rx_cnt++;
  165. pctx->state = CONS_ST_CMD;
  166. console_parse_cmd();
  167. pctx->state = CONS_ST_IDLE;
  168. pctx->rx_cnt = 0;
  169. hal_pwrmgr_unlock(MOD_CONSOLE);
  170. break;
  171. }
  172. prx[pctx->rx_cnt] = prx_msg[i];
  173. pctx->rx_cnt++;
  174. }
  175. }
  176. else
  177. {
  178. hal_pwrmgr_unlock(MOD_CONSOLE);
  179. }
  180. break;
  181. }
  182. default:
  183. break;
  184. }
  185. }
  186. int console_init(const cons_cmd_t* cmdlist, cons_callback_t callback)
  187. {
  188. uart_Cfg_t cfg = {
  189. .tx_pin = P9,
  190. .rx_pin = P10,
  191. .rts_pin = GPIO_DUMMY,
  192. .cts_pin = GPIO_DUMMY,
  193. .baudrate = 115200,
  194. .use_fifo = TRUE,
  195. .hw_fwctrl = FALSE,
  196. .use_tx_buf = FALSE,
  197. .parity = FALSE,
  198. .evt_handler = console_rx_handler,
  199. };
  200. if(callback == NULL)
  201. return ERR_INVALID_PARAM;
  202. hal_pwrmgr_register(MOD_CONSOLE, console_sleep_handler, console_wakeup_handler);
  203. HalUartInit(cfg,UART0);//uart init
  204. s_cons_ctx.cmd_list = cmdlist;
  205. s_cons_ctx.state = CONS_ST_IDLE;
  206. s_cons_ctx.rx_cnt = 0;
  207. s_cons_ctx.callback = callback;
  208. return SUCCESS;
  209. }