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.

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