|
|
|
@ -20,6 +20,11 @@ public:
@@ -20,6 +20,11 @@ public:
|
|
|
|
|
/// menu command function
|
|
|
|
|
///
|
|
|
|
|
typedef int (*func)(uint8_t argc, const struct arg *argv); |
|
|
|
|
|
|
|
|
|
/// menu pre-prompt function
|
|
|
|
|
///
|
|
|
|
|
/// If this function returns false, the menu exits.
|
|
|
|
|
typedef bool (*preprompt)(void); |
|
|
|
|
|
|
|
|
|
/// menu command description
|
|
|
|
|
///
|
|
|
|
@ -28,8 +33,6 @@ public:
@@ -28,8 +33,6 @@ public:
|
|
|
|
|
struct command { |
|
|
|
|
/// Name of the command, as typed or received.
|
|
|
|
|
/// Command names are limited in size to keep this structure compact.
|
|
|
|
|
/// If the first command in the menu is named '*', it will be called
|
|
|
|
|
/// each time before printing the prompt.
|
|
|
|
|
const char command[MENU_COMMAND_MAX]; |
|
|
|
|
|
|
|
|
|
/// The function to call when the command is received.
|
|
|
|
@ -37,6 +40,8 @@ public:
@@ -37,6 +40,8 @@ public:
|
|
|
|
|
/// MENU_ARGS_MAX. The argv array will be populated with
|
|
|
|
|
/// arguments typed/received up to MENU_ARGS_MAX. The command
|
|
|
|
|
/// name will always be in argv[0].
|
|
|
|
|
/// Commands may return -2 to cause the menu itself to exit.
|
|
|
|
|
/// The "?", "help" and "exit" commands are always defined.
|
|
|
|
|
int (*func)(uint8_t argc, const struct arg *argv); ///< callback function
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -46,7 +51,7 @@ public:
@@ -46,7 +51,7 @@ public:
|
|
|
|
|
/// @param commands An array of ::command structures.
|
|
|
|
|
/// @param entries The number of entries in the menu.
|
|
|
|
|
///
|
|
|
|
|
Menu(const char *prompt, const struct command *commands, uint8_t entries); |
|
|
|
|
Menu(const char *prompt, const struct command *commands, uint8_t entries, preprompt ppfunc = 0); |
|
|
|
|
|
|
|
|
|
/// menu runner
|
|
|
|
|
void run(void); |
|
|
|
@ -62,19 +67,27 @@ private:
@@ -62,19 +67,27 @@ private:
|
|
|
|
|
/// @param argc Number of arguments prepared for the menu item
|
|
|
|
|
///
|
|
|
|
|
int _call(uint8_t n, uint8_t argc); |
|
|
|
|
|
|
|
|
|
const char *_prompt; ///< prompt to display
|
|
|
|
|
const command *_commands; ///< array of commands
|
|
|
|
|
const uint8_t _entries; ///< size of the menu
|
|
|
|
|
const preprompt _ppfunc; ///< optional pre-prompt action
|
|
|
|
|
|
|
|
|
|
static char _inbuf[MENU_COMMANDLINE_MAX]; ///< input buffer
|
|
|
|
|
static arg _argv[MENU_ARGS_MAX + 1]; ///< arguments
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/// Macro used to define a menu.
|
|
|
|
|
/// Macros used to define a menu.
|
|
|
|
|
///
|
|
|
|
|
/// Use name.run() to run the menu.
|
|
|
|
|
///
|
|
|
|
|
/// The MENU2 macro supports the optional pre-prompt printing function.
|
|
|
|
|
///
|
|
|
|
|
#define MENU(name, prompt, commands) \ |
|
|
|
|
static const char __menu_name__ ##name[] PROGMEM = prompt; \
|
|
|
|
|
static Menu name(__menu_name__ ##name, commands, sizeof(commands) / sizeof(commands[0])) |
|
|
|
|
|
|
|
|
|
#define MENU2(name, prompt, commands, preprompt) \ |
|
|
|
|
static const char __menu_name__ ##name[] PROGMEM = prompt; \
|
|
|
|
|
static Menu name(__menu_name__ ##name, commands, sizeof(commands) / sizeof(commands[0]), preprompt) |
|
|
|
|
|
|
|
|
|