#pragma once #include #include #include "sdk/os/zos.hpp" #include "sdk\components\zprotocols\errorcode\errorcode.hpp" namespace iflytop { using namespace std; class CmdScheduler { public: class Context { public: int argc; char** argv; int getInt(int index, int defaultvalue = 0) { if (index >= argc) { return defaultvalue; } return atoi(argv[index]); } bool getBool(int index, bool defaultvalue = false) { if (index >= argc) { return defaultvalue; } return atoi(argv[index]) != 0; } float getFloat(int index, float defaultvalue = 0) { if (index >= argc) { return defaultvalue; } return atof(argv[index]); } const char* getString(int index, const char* defaultvalue = "") { if (index >= argc) { return defaultvalue; } return argv[index]; } }; typedef function call_cmd_t; class CMD { public: call_cmd_t call_cmd; string help_info; int npara; }; private: map m_cmdMap; ZUART* m_uart; char* rxbuf; int32_t m_rxsize = 0; uint32_t m_rxbufsize; bool m_dataisready = false; char cmdcache[1024] = {0}; public: void initialize(UART_HandleTypeDef* huart, uint32_t rxbufsize); void registerCmd(std::string cmd, const char* helpinfo, int npara, call_cmd_t call_cmd); void tx(const char* data, int len); void schedule(); private: void regbasiccmd(); int32_t callcmd(const char* cmd); void prase_cmd(char* input, int inputlen, int& argc, char* argv[]); void remove_note(char* input, int inputlen); }; #define DO_CMD(cond) \ { \ int32_t ret = cond; \ if (ret != 0) { \ return ret; \ } \ } #define IMPL_CMD(cmd, ...) \ DO_CMD(findmodule(con->getInt(1), &module)); \ DO_CMD(module->cmd(__VA_ARGS__)); \ return (int32_t)0; #define IMPL_READ_STATE(cmd, ...) \ DO_CMD(findmodule(con->getInt(1), &module)); \ DO_CMD(module->cmd(__VA_ARGS__)); \ cmd_dump_ack(ack); \ return (int32_t)0; #define REG_CMD___NO_ACK(prefix, cmd, para, npara, ...) /**/ \ m_cmdScheduler->registerCmd(prefix #cmd, para, npara, [this](CmdScheduler::Context* con) { /**/ \ IMPL_CMD(cmd, __VA_ARGS__); /**/ \ }); #define REG_CMD_WITH_ACK(prefix, cmd, para, npara, acktype, ...) /**/ \ m_cmdScheduler->registerCmd(prefix #cmd, para, npara, [this](CmdScheduler::Context* con) { /**/ \ acktype ack; /**/ \ IMPL_READ_STATE(cmd, __VA_ARGS__); /**/ \ }); } // namespace iflytop