summaryrefslogtreecommitdiff
path: root/bsp/imx6sx/iMX6_Platform_SDK/sdk/utility/menu.h
blob: dca0bedc331c382fca8a284b65bf45ef03665b90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
/*
 * Copyright (c) 2011-2012, Freescale Semiconductor, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * o Redistributions of source code must retain the above copyright notice, this list
 *   of conditions and the following disclaimer.
 *
 * o Redistributions in binary form must reproduce the above copyright notice, this
 *   list of conditions and the following disclaimer in the documentation and/or
 *   other materials provided with the distribution.
 *
 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
 *   contributors may be used to endorse or promote products derived from this
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*!
 * @file menu.h
 * @brief  Defines related to the Menu Framework and used by menu.c
 * @ingroup diag_utility
 */

#ifndef __MENU_H__
#define __MENU_H__

//! @addtogroup menu
//! @{

////////////////////////////////////////////////////////////////////////////////
// Definitions
////////////////////////////////////////////////////////////////////////////////

//! @name Menu Framework configuration values
//@{
#define MENU_INDENT 4         //!< Default number of spaces for each level of indent.
#define MENU_INDENT_MAX 120   //!< The maximum number of allowed for indent. Used for allocation purposes.
#define MENU_KEY_MAX 8        //!< The maximum number of characters allowed for a menu key. Used for allocation purposes.
//@}

//////////////////////////////////////////////////////////////////////////////////////////
// Types
//////////////////////////////////////////////////////////////////////////////////////////

// Forward type declarations.
typedef struct _menu_context menu_context_t;
typedef struct _menuitem menuitem_t;
typedef struct _menu menu_t;

//! @brief Available Menu Actions.
typedef enum _menu_actions
{
    MenuAction_Show,           //!< Print the menu header, all of the menuitems, and the menu footer.
    MenuAction_Exit,           //!< Exit all levels of the menu.
    MenuAction_Continue,       //!< Continue processing the menu loop. Default.
    MenuAction_ContinuePrint,  //!< Print the menu then continue processing the menu loop.
    MenuAction_Back            //!< Exit current menu level and print the parent menu.
} menu_action_t;

/*!
 * @brief Menu Execution function definition. Called in response to a menuitem being selected by the user.
 *
 * @return  How to proceed with menu processing.
 */
typedef menu_action_t (*menu_function_t) (void* param);

//! @brief Available MenuItem Types.
typedef enum _menuitem_types
{
    MenuItem_Group,    //!< Describes a menu group and inserts a blank line in the menu before the optional description.
    MenuItem_Submenu,  //!< Describes a selectable (by key) submenu with description.
    MenuItem_Function, //!< Describes a "regular" selectable (by key) menuitem with description and executable function.
    MenuItem_Null      //!< Describes an end marker of a menu list.

} menuitem_type_t;

//! @brief MenuItem container to hold data needed to process each menu item.
struct _menuitem
{
    //! @brief The type of the menuitem;  #MENUITEM_GROUP, #MENUITEM_SUBMENU, #MENUITEM_FUNCTION, ...
    menuitem_type_t type;

    //! @brief The key typed in by the user to select a menuitem for execution.
    const char* key;

    //! @brief The text associated with the menuitem describing the function. Can be NULL.
    const char* description;

    //! @brief A pointer to the submenu's menuitems. Valid for #MENUITEM_SUBMENU menuitems. Ignored otherwise.
    const menu_t* submenu;

    //! @brief A pointer to the menu execution function. Valid for #MENUITEM_FUNCTION menuitems. Ignored otherwise.
    menu_function_t func_ptr;

    void* func_param;
};

//! @brief Menu container to hold data needed to describe a menu or submenu.
struct _menu
{
    //! @brief Text introducing the menu and its purpose.
    const char* header;

    //! @brief A pointer to the list of menu items.
    const menuitem_t* menuitems;

    //! @brief Instructional text to help user execute the menu.
    const char* footer;
};

//////////////////////////////////////////////////////////////////////////////////////////
// Private Variables
//////////////////////////////////////////////////////////////////////////////////////////
static char MenuIndent[];

////////////////////////////////////////////////////////////////////////////////
// API
////////////////////////////////////////////////////////////////////////////////

#if defined(__cplusplus)
extern "C" {
#endif

//! @name Menu presentation
//@{
/*!
 * @brief Presents the menu UI and processes the user input.
 *
 * The menu description (header) is printed, followed by each of the menuitem key and
 * menuitem description. Instructions for the user (footer) are printed last. The
 * function then waits form user input. After each key press, the menu items keys are
 * compared to the input string. If the input string uniquely identifies a menuitem,
 * the function associated with that menitem is executed. If the input string does not
 * uniquely identify a menuitem, the function waits for more input or the Enter key.
 *
 * @param[in] menu A pointer to the menu structure to be presented and processed.
 * @return  How to proceed with menu processing.
 * @retval #MenuAction_Show Print the menu header, all of the menuitems, and the menu footer.
 * @retval #MenuAction_Exit Exit all levels of the menu.
 * @retval #MenuAction_Continue Continue processing the menu loop. Default.
 * @retval #MenuAction_ContinuePrint Print the menu then continue processing the menu loop.
 * @retval #MenuAction_Back Exit current menu level and print the parent menu.
 */
menu_action_t menu_present(const menu_t* menu);

/*!
 * @brief Return a string used to align text for the current menu level.
 *
 * @param   context Menu context that allows function to discern indent level among other things.
 * @return  String of space characters used to align output text for the current menu level.
 */
const char* menu_get_indent();
//@}

//@}

/*!
 * @brief Default "Show Menu" handler.
 *
 * @return  MENU_SHOW.
 */
menu_action_t menuitem_cmd_showmenu(void* param);

/*!
 * @brief Default "Exit Menu" handler.
 *
 * @return  MENU_EXIT.
 */
menu_action_t menuitem_cmd_exitmenu(void* param);


//! @name Menu construction
//!
//! These functions allow the caller to easily construct a menu at runtime.
//@{
/*!
 * @brief Appends source_menuitems list to target_menuitems.
 *
 * @param[in,out] target_menuitems Menuitem array pointer for the target menuitems.
 * @param[in] target_size Maximum number of menuitems the target_menuitems can hold.
 * @param[in] source_menuitems Menuitem array pointer for the source menuitems.
 *
 * @return new size of the target menuitem array.
 */
int menu_append_menuitems(menuitem_t* target_menuitems, int target_size, const menuitem_t* source_menuitems);
/*!
 * @brief Initializes the passed in menu stuct with the menu elements.
 *
 * @param[in,out] menu Menu struct container for menu elements.
 * @param[in] header Description of the menu presented to the user before the list of menu items.
 * @param[in] menuitems Array of menu items representing grouping and selections of the menu.
 * @param[in] footer Instructions for the user presented after the list of menu items.
 */
//void menu_make_menu(menu_t* menu, const char* header, const menuitem_t* menuitems, const char* footer);

/*!
 * @brief Initializes the passed in menuitem stuct with the menuitem elements.
 *
 * @param[in,out] menuitem Menuitem struct to be initialized.
 * @param[in] key String used to select the menuitem. Key is limited to #KEY_MAX characters.
 * @param[in] description String used to describe the action executed if selected.
 * @param[in] funct Function pointer that is executed if the menuitem is selected.
 * @param[in] param Object pointer that is passed to the executed function. Generally used to
 *                       pass the return the results of the function.
 */
//void menu_make_menuitem(menuitem_t* menuitem, const char* key, const char* description, menu_function_t func, void* func_param);
#define MENU_MAKE_MENUITEM(k,d,f,p) { MenuItem_Function, k, d, NULL, f, p }

/*!
 * @brief Initializes the passed in menuitem stuct to represent a "Show menu" menu item.
 *
 * This function creates a menuitem with key of "m" and a description of "Display menu."
 * When selected, the invoked function returns #MENU_SHOW.
 *
 * @param[in,out] menuitem Menuitem struct to be initialized.
 */
//void menu_make_menuitem_showmenu(menuitem_t* menuitem);
#define MENU_MAKE_MENUITEM_SHOW() { MenuItem_Function, "m", "Display menu.", NULL, menuitem_cmd_showmenu, NULL }

/*!
 * @brief Initializes the passed in menuitem stuct to represent a "Exit menu" menu item.
 *
 * This function creates a menuitem with key of "q" and a description of "Exit menu."
 * When selected, the invoked function returns #MENU_EXIT.
 *
 * @param[in,out] menuitem Menuitem struct to be initialized.
 */
//void menu_make_menuitem_exitmenu(menuitem_t* menuitem);
#define MENU_MAKE_MENUITEM_EXIT() { MenuItem_Function, "q", "Exit menu.", NULL, menuitem_cmd_exitmenu, NULL }

/*!
 * @brief Initializes the passed in menuitem stuct to represent a selectable submenu.
 *
 * This function creates a menuitem denoted by the key and description parameters.
 * When selected, the menu parameter will be presented by a recursive call to menu_present().
 *
 * @param[in,out] menuitem Menuitem struct to be initialized.
 * @param[in] key String used to select the submenu. Key is limited to #KEY_MAX characters.
 * @param[in] description String used to describe the submenu.
 * @param[in,out] menu Menu to be presented as a submenu when selected.
 */
//void menu_make_menuitem_submenu(menuitem_t* menuitem, const char* key, const char* description, const menu_t* menu);

/*!
 * @brief Initializes the passed in menuitem stuct to represent a menu group.
 *
 * This function creates a menuitem that will add a blank line in the menuitem listing.
 * If a group description is provided, the text will be presented after the blank line.
 * The group menuitem is not selectable. It is provided as a means to graphically arrange menu items.
 *
 * @param[in,out] menuitem Menuitem struct to be initialized.
 * @param[in] description String used to describe the following group of menu items. Can be NULL.
 */
//void menu_make_menuitem_group(menuitem_t* menuitem, const char* description);
#define MENU_MAKE_MENUITEM_GROUP(d) { MenuItem_Group, NULL, d, NULL, NULL, NULL }

/*!
 * @brief Initializes the passed in menuitem stuct to represent the terminating element of a menu.
 *
 * The menu_present() function requires that a menuitem list of the menu be terminated with a
 * #MENUITEM_NULL element.
 *
 * @param[in,out] menuitem Menuitem struct representing the terminating element of a menu.
 */
//void menu_make_menuitem_end(menuitem_t* menuitem);
#define MENU_MAKE_MENUITEM_END() { MenuItem_Null, NULL, NULL, NULL, NULL, NULL }

void menu_print_menuitem(menuitem_t* menuitem);
//@}

//! @}

#endif //__MENU_H__
////////////////////////////////////////////////////////////////////////////////
// EOF
////////////////////////////////////////////////////////////////////////////////