2021-04-15 17:23:37 +02:00
|
|
|
/* Modem console example
|
|
|
|
|
|
|
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, this
|
|
|
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
|
|
CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
*/
|
2021-03-16 21:36:13 +01:00
|
|
|
|
2021-05-26 15:57:25 +02:00
|
|
|
#pragma once
|
2021-03-16 21:36:13 +01:00
|
|
|
|
|
|
|
#include <vector>
|
2022-06-08 17:16:15 +02:00
|
|
|
#include <string>
|
2021-03-16 21:36:13 +01:00
|
|
|
#include <algorithm>
|
|
|
|
#include <functional>
|
|
|
|
#include <esp_console.h>
|
|
|
|
#include "argtable3/argtable3.h"
|
|
|
|
#include "repeat_helper.inc"
|
|
|
|
|
2021-04-18 20:19:53 +02:00
|
|
|
#define MAX_REPEAT_NR 20
|
2021-03-16 21:36:13 +01:00
|
|
|
|
2021-04-18 20:19:53 +02:00
|
|
|
/**
|
|
|
|
* @brief Argument types used for ConsoleCommand
|
|
|
|
*/
|
2021-03-16 21:36:13 +01:00
|
|
|
enum arg_type {
|
|
|
|
STR0,
|
|
|
|
STR1,
|
|
|
|
INT0,
|
|
|
|
INT1,
|
2021-03-24 21:06:27 +01:00
|
|
|
LIT0,
|
2021-03-16 21:36:13 +01:00
|
|
|
ARG_END,
|
|
|
|
};
|
|
|
|
|
2021-04-18 20:19:53 +02:00
|
|
|
/**
|
|
|
|
* Command argument struct definition for list of arguments of one command
|
|
|
|
*/
|
2021-03-16 21:36:13 +01:00
|
|
|
struct CommandArgs {
|
2021-06-01 10:21:51 +02:00
|
|
|
CommandArgs(arg_type t, const char *shopts, const char *lopts, const char *data, const char *glos):
|
2021-03-24 21:06:27 +01:00
|
|
|
type(t), shortopts(shopts), longopts(lopts), datatype(data), glossary(glos) {}
|
2021-06-01 10:21:51 +02:00
|
|
|
CommandArgs(arg_type t, const char *shopts, const char *lopts, const char *glos):
|
|
|
|
type(t), shortopts(shopts), longopts(lopts), datatype(nullptr), glossary(glos) {}
|
2021-03-24 21:06:27 +01:00
|
|
|
|
2021-03-16 21:36:13 +01:00
|
|
|
arg_type type;
|
|
|
|
const char *shortopts;
|
|
|
|
const char *longopts;
|
|
|
|
const char *datatype;
|
|
|
|
const char *glossary;
|
|
|
|
};
|
|
|
|
|
2021-04-18 20:19:53 +02:00
|
|
|
class StaticCommands;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief This class simplifies console command definition in more object wise fashion
|
|
|
|
*/
|
2021-03-16 21:36:13 +01:00
|
|
|
class ConsoleCommand {
|
2021-05-26 16:41:19 +08:00
|
|
|
/**
|
|
|
|
* @brief Common argument types to be stored internally for parsing later
|
|
|
|
*/
|
|
|
|
using arg_type =
|
2021-06-01 10:21:51 +02:00
|
|
|
union {
|
|
|
|
struct arg_int *intx;
|
|
|
|
struct arg_str *str;
|
|
|
|
struct arg_lit *lit;
|
|
|
|
struct arg_end *end;
|
|
|
|
void *__raw_ptr;
|
|
|
|
bool is_null() const {
|
|
|
|
return __raw_ptr;
|
|
|
|
}
|
|
|
|
};
|
2021-05-26 16:41:19 +08:00
|
|
|
|
2021-04-18 20:19:53 +02:00
|
|
|
friend class StaticCommands;
|
2021-03-16 21:36:13 +01:00
|
|
|
public:
|
2021-04-18 20:19:53 +02:00
|
|
|
/**
|
|
|
|
* @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
|
|
|
|
*/
|
2021-06-01 10:21:51 +02:00
|
|
|
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))
|
2021-03-16 21:36:13 +01:00
|
|
|
{
|
|
|
|
size_t args_plain_size = srg_struct_size / sizeof(CommandArgs);
|
|
|
|
auto first_arg = reinterpret_cast<const CommandArgs *>(arg_struct);
|
|
|
|
std::vector<CommandArgs> args(first_arg, first_arg + args_plain_size);
|
|
|
|
RegisterCommand(command, help, args);
|
|
|
|
}
|
|
|
|
|
2021-04-18 20:19:53 +02:00
|
|
|
/**
|
|
|
|
* @brief Another method of Console command definitions using vector arg struct
|
|
|
|
*/
|
2021-06-01 10:21:51 +02:00
|
|
|
explicit ConsoleCommand(const char *command, const char *help, const std::vector<CommandArgs> &args, std::function<bool(ConsoleCommand *)> f);
|
2021-04-18 20:19:53 +02:00
|
|
|
|
2022-09-09 11:08:44 +02:00
|
|
|
/**
|
|
|
|
* @brief Destructor of ConsoleCommand
|
|
|
|
*/
|
|
|
|
~ConsoleCommand();
|
|
|
|
|
2021-04-18 20:19:53 +02:00
|
|
|
/**
|
|
|
|
* @brief Utility getters of various params from the argument list
|
|
|
|
*/
|
2021-06-01 10:21:51 +02:00
|
|
|
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));
|
|
|
|
}
|
2021-03-16 21:36:13 +01:00
|
|
|
std::string get_string(int index);
|
2021-03-24 21:06:27 +01:00
|
|
|
int get_int(int index);
|
2021-03-16 21:36:13 +01:00
|
|
|
|
|
|
|
private:
|
2021-04-18 20:19:53 +02:00
|
|
|
int get_count(int index);
|
2021-06-01 10:21:51 +02:00
|
|
|
void RegisterCommand(const char *command, const char *help, const std::vector<CommandArgs> &args);
|
2021-03-16 21:36:13 +01:00
|
|
|
template<typename T> static constexpr size_t index_arg(CommandArgs T::*member)
|
2021-06-01 10:21:51 +02:00
|
|
|
{
|
|
|
|
return ((uint8_t *) & ((T *)nullptr->*member) - (uint8_t *)nullptr) / sizeof(CommandArgs);
|
|
|
|
}
|
2021-05-26 16:41:19 +08:00
|
|
|
std::vector<arg_type> arg_table;
|
2021-03-16 21:36:13 +01:00
|
|
|
int command_func(int argc, char **argv);
|
|
|
|
|
|
|
|
static int last_command;
|
2021-06-01 10:21:51 +02:00
|
|
|
static std::vector<ConsoleCommand *> console_commands;
|
2021-04-18 20:19:53 +02:00
|
|
|
std::function<bool(ConsoleCommand *)> func;
|
2021-03-16 21:36:13 +01:00
|
|
|
const static esp_console_cmd_func_t command_func_pts[];
|
|
|
|
};
|