Examples: Cleanup the modem console

This commit is contained in:
David Cermak
2021-04-18 20:19:53 +02:00
parent 77db911a48
commit 26bde89834
8 changed files with 130 additions and 180 deletions

View File

@ -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