You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.7 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "cmd_scheduler.hpp"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. using namespace iflytop;
  5. #define TAG "CmdScheduler"
  6. void CmdScheduler::registerCmd(std::string cmd, call_cmd_t call_cmd) { m_cmdMap[cmd] = call_cmd; }
  7. void CmdScheduler::initialize(UART_HandleTypeDef* huart, uint32_t rxbufsize) {
  8. m_rxbufsize = rxbufsize;
  9. m_uart = new ZUART();
  10. ZASSERT(m_uart != NULL);
  11. ZUART::cfg_t cfg;
  12. cfg.huart = huart;
  13. cfg.rxbuffersize = rxbufsize;
  14. cfg.rxovertime_ms = 3;
  15. cfg.name = "CmdSchedulerUart";
  16. rxbuf = new char[rxbufsize + 1];
  17. ZASSERT(rxbuf != NULL);
  18. m_uart->initialize(&cfg);
  19. ZASSERT(m_uart->startRxIt());
  20. m_uart->setrxcb([this](uint8_t* data, size_t len) {
  21. if (m_dataisready) {
  22. return;
  23. }
  24. memcpy(rxbuf, data, len);
  25. rxbuf[len] = '\0';
  26. m_rxsize = len;
  27. m_dataisready = true;
  28. // on data ,in irq context
  29. });
  30. }
  31. void CmdScheduler::schedule() {
  32. if (!m_dataisready) {
  33. return;
  34. }
  35. for (size_t i = 0; i < m_rxsize; i++) {
  36. if (rxbuf[i] == '\r' || rxbuf[i] == '\n') {
  37. rxbuf[i] = '\0';
  38. }
  39. }
  40. // ZLOGI(TAG, "cmdstr2: %s %d %d", cmdstr, strlen(cmdstr),m_rxsize);
  41. for (int i = 0; i < m_rxsize; i++) {
  42. if (rxbuf[i] != '\0') {
  43. ZLOGI(TAG, "docmd: %s", &rxbuf[i]);
  44. int inext = strlen(&rxbuf[i]) + i;
  45. CmdProcessContext context;
  46. callcmd(&rxbuf[i], context);
  47. i = inext;
  48. if (context.breakflag) {
  49. ZLOGE(TAG, "do break");
  50. break;
  51. }
  52. }
  53. }
  54. ZLOGI(TAG, "process_rx_cmd:end");
  55. m_dataisready = false;
  56. }
  57. void CmdScheduler::callcmd(const char* cmd, CmdProcessContext& context) {
  58. int argc = 0;
  59. char* argv[10] = {0};
  60. memset(cmdcache, 0, sizeof(cmdcache));
  61. argc = 0;
  62. memset(argv, 0, sizeof(argv));
  63. strcpy(cmdcache, cmd);
  64. prase_cmd(cmdcache, strlen(cmdcache), argc, argv);
  65. if(argc == 0){
  66. return;
  67. }
  68. // printf("argc:%d\n", argc);
  69. // for (size_t i = 0; i < argc; i++) {
  70. // printf("argv[%d]:%s\n", i, argv[i]);
  71. // }
  72. #if 1
  73. /**
  74. * @brief ָ
  75. */
  76. if (m_cmdMap.find(string(argv[0])) != m_cmdMap.end()) {
  77. context.breakflag = false;
  78. m_cmdMap.find(string(argv[0]))->second(argc, argv, &context);
  79. }
  80. #endif
  81. }
  82. void CmdScheduler::prase_cmd(char* input, int inputlen, int& argc, char* argv[]) {
  83. for (size_t i = 0; input[i] == 0 || i < inputlen; i++) {
  84. if (input[i] == ' ' || input[i] == '\r' || input[i] == '\n') {
  85. input[i] = 0;
  86. }
  87. }
  88. int j = 0;
  89. for (int i = 0; input[i] == 0 || i < inputlen; i++) {
  90. if (input[i] != 0 && j == 0) {
  91. argv[argc++] = &input[i];
  92. j = 1;
  93. continue;
  94. }
  95. if (input[i] == 0 && j == 1) {
  96. j = 0;
  97. continue;
  98. }
  99. }
  100. }