| #ifndef MENU_H |
| #define MENU_H |
| |
| /* A single menu */ |
| typedef void (*menu_finish_callback)(struct menu_s *menu); |
| |
| typedef struct menu_s { |
| char *name; /* Menu name */ |
| int num_options; /* Number of options in this menu */ |
| int flags; /* Various flags - see below */ |
| int option_align; /* Aligns options to a field width of this much characters if != 0 */ |
| |
| struct menu_option_s **options; /* Pointer to this menu's options */ |
| menu_finish_callback callback; /* Called when the menu closes */ |
| } menu_t; |
| |
| /* |
| * type: Type of the option (see below) |
| * name: Name to display for this option |
| * help: Optional help string |
| * id : optional id number |
| * sys : pointer for system-specific data, init to NULL and don't touch |
| */ |
| |
| #define OPTION_PREAMBLE \ |
| int type; \ |
| char *name; \ |
| char *help; \ |
| int id; \ |
| void *sys; |
| |
| /* |
| * Menu option types. |
| * There are a number of different layouts for menu options depending |
| * on their types. Currently there are the following possibilities: |
| * |
| * Submenu: |
| * This entry links to a new menu. |
| * |
| * Boolean: |
| * A simple on/off toggle entry. Booleans can be either yes/no, 0/1 or on/off. |
| * Optionally, this entry can enable/disable a set of other options. An example would |
| * be to enable/disable on-board USB, and if enabled give access to further options like |
| * irq settings, base address etc. |
| * |
| * Text: |
| * A single line/limited number of characters text entry box. Text can be restricted |
| * to a certain charset (digits/hex digits/all/custom). Result is also available as an |
| * int if numeric. |
| * |
| * Selection: |
| * One-of-many type of selection entry. User may choose on of a set of strings, which |
| * maps to a specific value for the variable. |
| * |
| * Routine: |
| * Selecting this calls an entry-specific routine. This can be used for saving contents etc. |
| * |
| * Custom: |
| * Display and behaviour of this entry is defined by a set of callbacks. |
| */ |
| |
| #define MENU_SUBMENU_TYPE 0 |
| typedef struct menu_submenu_s |
| { |
| OPTION_PREAMBLE |
| |
| menu_t * submenu; /* Pointer to the submenu */ |
| } menu_submenu_t; |
| |
| #define MENU_BOOLEAN_TYPE 1 |
| typedef struct menu_boolean_s |
| { |
| OPTION_PREAMBLE |
| |
| char *variable; /* Name of the variable to getenv()/setenv() */ |
| int subtype; /* Subtype (on/off, 0/1, yes/no, enable/disable), see below */ |
| int mutex; /* Bit mask of options to enable/disable. Bit 0 is the option |
| immediately following this one, bit 1 is the next one etc. |
| bit 7 = 0 means to disable when this option is off, |
| bit 7 = 1 means to disable when this option is on. |
| An option is disabled when the type field's upper bit is set */ |
| } menu_boolean_t; |
| |
| /* BOOLEAN Menu flags */ |
| #define MENU_BOOLEAN_ONOFF 0x01 |
| #define MENU_BOOLEAN_01 0x02 |
| #define MENU_BOOLEAN_YESNO 0x03 |
| #define MENU_BOOLEAN_ENDIS 0x04 |
| #define MENU_BOOLEAN_TYPE_MASK 0x07 |
| |
| |
| #define MENU_TEXT_TYPE 2 |
| typedef struct menu_text_s |
| { |
| OPTION_PREAMBLE |
| |
| char *variable; /* Name of the variable to getenv()/setenv() */ |
| int maxchars; /* Max number of characters */ |
| char *charset; /* Optional charset to use */ |
| int flags; /* Flags - see below */ |
| } menu_text_t; |
| |
| /* TEXT entry menu flags */ |
| #define MENU_TEXT_NUMERIC 0x01 |
| #define MENU_TEXT_HEXADECIMAL 0x02 |
| #define MENU_TEXT_FREE 0x03 |
| #define MENU_TEXT_TYPE_MASK 0x07 |
| |
| |
| #define MENU_SELECTION_TYPE 3 |
| typedef struct menu_select_option_s { |
| char *map_from; /* Map this variable contents ... */ |
| char *map_to; /* ... to this menu text and vice versa */ |
| } menu_select_option_t; |
| |
| typedef struct menu_select_s { |
| OPTION_PREAMBLE int num_options; /* Number of mappings */ |
| menu_select_option_t **options; |
| /* Option list array */ |
| } menu_select_t; |
| |
| |
| #define MENU_ROUTINE_TYPE 4 |
| typedef void (*menu_routine_callback) (struct menu_routine_s *); |
| |
| typedef struct menu_routine_s { |
| OPTION_PREAMBLE menu_routine_callback callback; |
| /* routine to be called */ |
| void *user_data; /* User data, don't care for system */ |
| } menu_routine_t; |
| |
| |
| #define MENU_CUSTOM_TYPE 5 |
| typedef void (*menu_custom_draw) (struct menu_custom_s *); |
| typedef void (*menu_custom_key) (struct menu_custom_s *, int); |
| |
| typedef struct menu_custom_s { |
| OPTION_PREAMBLE menu_custom_draw drawfunc; |
| menu_custom_key keyfunc; |
| void *user_data; |
| } menu_custom_t; |
| |
| /* |
| * The menu option superstructure |
| */ |
| typedef struct menu_option_s { |
| union { |
| menu_submenu_t m_sub_menu; |
| menu_boolean_t m_boolean; |
| menu_text_t m_text; |
| menu_select_t m_select; |
| menu_routine_t m_routine; |
| }; |
| } menu_option_t; |
| |
| /* Init the menu system. Returns <0 on error */ |
| int menu_init(menu_t *root); |
| |
| /* Execute a single menu. Returns <0 on error */ |
| int menu_do(menu_t *menu); |
| |
| #endif |