123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- /*
- * 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
- ////////////////////////////////////////////////////////////////////////////////
|