mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-29 10:17:30 +02:00
Examples: Cleanup the modem console
This commit is contained in:
@ -17,8 +17,11 @@
|
||||
#include "argtable3/argtable3.h"
|
||||
#include "repeat_helper.inc"
|
||||
|
||||
#define MAX_REPEAT_NR 10
|
||||
#define MAX_REPEAT_NR 20
|
||||
|
||||
/**
|
||||
* @brief Argument types used for ConsoleCommand
|
||||
*/
|
||||
enum arg_type {
|
||||
STR0,
|
||||
STR1,
|
||||
@ -28,6 +31,9 @@ enum arg_type {
|
||||
ARG_END,
|
||||
};
|
||||
|
||||
/**
|
||||
* Command argument struct definition for list of arguments of one command
|
||||
*/
|
||||
struct CommandArgs {
|
||||
CommandArgs(arg_type t, const char * shopts, const char * lopts, const char * data, const char * glos):
|
||||
type(t), shortopts(shopts), longopts(lopts), datatype(data), glossary(glos) {}
|
||||
@ -41,11 +47,24 @@ struct CommandArgs {
|
||||
const char *glossary;
|
||||
};
|
||||
|
||||
class StaticCommands;
|
||||
|
||||
/**
|
||||
* @brief This class simplifies console command definition in more object wise fashion
|
||||
*/
|
||||
class ConsoleCommand {
|
||||
friend class StaticCommands;
|
||||
public:
|
||||
template<typename T> explicit ConsoleCommand(const char* command, const char* help,
|
||||
const T *arg_struct, size_t srg_struct_size , std::function<bool(ConsoleCommand *)> f):
|
||||
func(std::move(f))
|
||||
/**
|
||||
* @brief This is how we define a generic Console command
|
||||
* @param command Textual console command
|
||||
* @param help Contextual help for the command
|
||||
* @param arg_struct List of argument struct
|
||||
* @param srg_struct_size Size of the argument struct
|
||||
* @param f Function callback for the command
|
||||
*/
|
||||
template<typename T> explicit ConsoleCommand(const char* command, const char* help, const T *arg_struct, size_t srg_struct_size,
|
||||
std::function<bool(ConsoleCommand *)> f): func(std::move(f))
|
||||
{
|
||||
size_t args_plain_size = srg_struct_size / sizeof(CommandArgs);
|
||||
auto first_arg = reinterpret_cast<const CommandArgs *>(arg_struct);
|
||||
@ -53,35 +72,32 @@ public:
|
||||
RegisterCommand(command, help, args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Another method of Console command definitions using vector arg struct
|
||||
*/
|
||||
explicit ConsoleCommand(const char* command, const char* help, const std::vector<CommandArgs>& args, std::function<bool(ConsoleCommand *)> f);
|
||||
int get_count(int index);
|
||||
|
||||
/**
|
||||
* @brief Utility getters of various params from the argument list
|
||||
*/
|
||||
template<typename T> int get_count_of(CommandArgs T::*member) { return get_count(index_arg(member)); }
|
||||
template<typename T> std::string get_string_of(CommandArgs T::*member) { return get_string(index_arg(member)); }
|
||||
template<typename T> int get_int_of(CommandArgs T::*member) { return get_int(index_arg(member)); }
|
||||
|
||||
std::string get_string(int index);
|
||||
int get_int(int index);
|
||||
|
||||
private:
|
||||
int get_count(int index);
|
||||
void RegisterCommand(const char* command, const char* help, const std::vector<CommandArgs>& args);
|
||||
template<typename T> static constexpr size_t index_arg(CommandArgs T::*member)
|
||||
{ return ((uint8_t *)&((T*)nullptr->*member) - (uint8_t *)nullptr)/sizeof(CommandArgs); }
|
||||
std::function<bool(ConsoleCommand *)> func;
|
||||
std::vector<void*> arg_table;
|
||||
|
||||
int command_func(int argc, char **argv);
|
||||
|
||||
#define TEMPLATE(index) \
|
||||
static inline int command_func_ ## index(int argc, char **argv) \
|
||||
{ return console_commands[index]->command_func(argc, argv); }
|
||||
|
||||
REPEAT_TEMPLATE_DEF(definition of command_func_XX() )
|
||||
#undef TEMPLATE
|
||||
|
||||
static std::vector<ConsoleCommand*> console_commands;
|
||||
static int last_command;
|
||||
static std::vector<ConsoleCommand*> console_commands;
|
||||
std::function<bool(ConsoleCommand *)> func;
|
||||
const static esp_console_cmd_func_t command_func_pts[];
|
||||
|
||||
};
|
||||
|
||||
#endif //MODEM_CONSOLE_CONSOLE_HELPER_H
|
||||
|
Reference in New Issue
Block a user