2 changed files with 154 additions and 0 deletions
@ -0,0 +1,112 @@ |
|||||
|
|
||||
|
#include "cmd_scheduler.hpp"
|
||||
|
|
||||
|
#include <stdlib.h>
|
||||
|
#include <string.h>
|
||||
|
using namespace iflytop; |
||||
|
|
||||
|
#define TAG "CmdScheduler"
|
||||
|
|
||||
|
void CmdScheduler::registerCmd(std::string cmd, call_cmd_t call_cmd) { m_cmdMap[cmd] = call_cmd; } |
||||
|
void CmdScheduler::initialize(UART_HandleTypeDef* huart, uint32_t rxbufsize) { |
||||
|
m_rxbufsize = rxbufsize; |
||||
|
|
||||
|
m_uart = new ZUART(); |
||||
|
ZASSERT(m_uart != NULL); |
||||
|
|
||||
|
ZUART::cfg_t cfg; |
||||
|
cfg.huart = huart; |
||||
|
cfg.rxbuffersize = rxbufsize; |
||||
|
cfg.rxovertime_ms = 3; |
||||
|
cfg.name = "CmdSchedulerUart"; |
||||
|
|
||||
|
rxbuf = new char[rxbufsize]; |
||||
|
ZASSERT(rxbuf != NULL); |
||||
|
|
||||
|
m_uart->initialize(&cfg); |
||||
|
ZASSERT(m_uart->startRxIt()); |
||||
|
m_uart->setrxcb([this](uint8_t* data, size_t len) { |
||||
|
if (m_dataisready) { |
||||
|
return; |
||||
|
} |
||||
|
memcpy(rxbuf, data, len); |
||||
|
m_rxsize = len; |
||||
|
m_dataisready = true; |
||||
|
// on data ,in irq context
|
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
void CmdScheduler::schedule() { |
||||
|
if (!m_dataisready) { |
||||
|
return; |
||||
|
} |
||||
|
for (size_t i = 0; i < m_rxsize; i++) { |
||||
|
if (rxbuf[i] == '\r' || rxbuf[i] == '\n') { |
||||
|
rxbuf[i] = '\0'; |
||||
|
} |
||||
|
} |
||||
|
// ZLOGI(TAG, "cmdstr2: %s %d %d", cmdstr, strlen(cmdstr),m_rxsize);
|
||||
|
for (size_t i = 0; i < m_rxsize; i++) { |
||||
|
if (rxbuf[i] != '\0') { |
||||
|
ZLOGI(TAG, "docmd: %s", &rxbuf[i]); |
||||
|
int inext = strlen(&rxbuf[i]) + i; |
||||
|
CmdProcessContext context; |
||||
|
callcmd(&rxbuf[i], context); |
||||
|
i = inext; |
||||
|
if (context.breakflag) { |
||||
|
ZLOGE(TAG, "do break"); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
ZLOGI(TAG, "process_rx_cmd:end"); |
||||
|
m_dataisready = false; |
||||
|
} |
||||
|
|
||||
|
void CmdScheduler::callcmd(const char* cmd, CmdProcessContext& context) { |
||||
|
int argc = 0; |
||||
|
char* argv[10] = {0}; |
||||
|
{ |
||||
|
memset(cmdcache, 0, sizeof(cmdcache)); |
||||
|
argc = 0; |
||||
|
memset(argv, 0, sizeof(argv)); |
||||
|
} |
||||
|
strcpy(cmdcache, cmd); |
||||
|
prase_cmd(cmdcache, strlen(cmdcache), argc, argv); |
||||
|
|
||||
|
printf("argc:%d\n", argc); |
||||
|
for (size_t i = 0; i < argc; i++) { |
||||
|
printf("argv[%d]:%s\n", i, argv[i]); |
||||
|
} |
||||
|
#if 1
|
||||
|
/**
|
||||
|
* @brief ÔÚÕâÀï´¦ÀíÖ¸Áî |
||||
|
*/ |
||||
|
if (m_cmdMap.find(string(argv[0])) != m_cmdMap.end()) { |
||||
|
context.breakflag = false; |
||||
|
m_cmdMap.find(string(argv[0]))->second(argc, argv, &context); |
||||
|
} |
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
void CmdScheduler::prase_cmd(char* input, int inputlen, int& argc, char* argv[]) { |
||||
|
for (size_t i = 0; input[i] == 0 || i < inputlen; i++) { |
||||
|
if (input[i] == ' ' || input[i] == '\r' || input[i] == '\n') { |
||||
|
input[i] = 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
int j = 0; |
||||
|
for (size_t i = 0; input[i] == 0 || i < inputlen; i++) { |
||||
|
if (input[i] != 0 && j == 0) { |
||||
|
argv[argc++] = &input[i]; |
||||
|
j = 1; |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
if (input[i] == 0 && j == 1) { |
||||
|
j = 0; |
||||
|
continue; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,42 @@ |
|||||
|
#pragma once
|
||||
|
#include <map>
|
||||
|
#include <string>
|
||||
|
|
||||
|
#include "sdk/os/zos.hpp"
|
||||
|
namespace iflytop { |
||||
|
using namespace std; |
||||
|
|
||||
|
class CmdScheduler { |
||||
|
public: |
||||
|
class CmdProcessContext { |
||||
|
public: |
||||
|
bool breakflag = false; |
||||
|
}; |
||||
|
|
||||
|
typedef function<void(int, char**, CmdProcessContext*)> call_cmd_t; |
||||
|
|
||||
|
private: |
||||
|
map<string, call_cmd_t> m_cmdMap; |
||||
|
|
||||
|
ZUART* m_uart; |
||||
|
char* rxbuf; |
||||
|
int32_t m_rxsize = 0; |
||||
|
|
||||
|
uint32_t m_rxbufsize; |
||||
|
|
||||
|
bool m_dataisready = false; |
||||
|
|
||||
|
char cmdcache[100]; |
||||
|
|
||||
|
public: |
||||
|
void initialize(UART_HandleTypeDef* huart, uint32_t rxbufsize); |
||||
|
void registerCmd(std::string cmd, call_cmd_t call_cmd); |
||||
|
|
||||
|
void schedule(); |
||||
|
|
||||
|
private: |
||||
|
void callcmd(const char* cmd, CmdProcessContext& context); |
||||
|
void prase_cmd(char* input, int inputlen, int& argc, char* argv[]); |
||||
|
}; |
||||
|
|
||||
|
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue