Files
esp-protocols/components/esp_modem/examples/modem_console/main/console_helper.hpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

134 lines
3.9 KiB
C++
Raw Normal View History

2021-04-15 17:23:37 +02:00
/*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
*
2021-04-15 17:23:37 +02:00
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
2021-04-15 17:23:37 +02:00
/*
2021-04-15 17:23:37 +02:00
* Modem console example
*/
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>
#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 {
/**
* @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-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
/**
* @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);
}
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[];
};