diff options
Diffstat (limited to 'board/MAI/menu')
-rw-r--r-- | board/MAI/menu/cmd_menu.c | 9 | ||||
-rw-r--r-- | board/MAI/menu/menu.c | 66 | ||||
-rw-r--r-- | board/MAI/menu/menu.h | 174 |
3 files changed, 249 insertions, 0 deletions
diff --git a/board/MAI/menu/cmd_menu.c b/board/MAI/menu/cmd_menu.c new file mode 100644 index 0000000..a24ab49 --- /dev/null +++ b/board/MAI/menu/cmd_menu.c @@ -0,0 +1,9 @@ +#include <common.h> +#include <command.h> +#include <cmd_menu.h> + +int do_menu( cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[] ) +{ +// printf("<NOT YET IMPLEMENTED>\n"); + return 0; +} diff --git a/board/MAI/menu/menu.c b/board/MAI/menu/menu.c new file mode 100644 index 0000000..3130142 --- /dev/null +++ b/board/MAI/menu/menu.c @@ -0,0 +1,66 @@ +#include "menu.h" + +#define SINGLE_BOX 0 +#define DOUBLE_BOX 1 + +void video_draw_box(int style, int attr, char *title, int separate, int x, int y, int w, int h); +void video_draw_text(int x, int y, int attr, char *text); +void video_save_rect(int x, int y, int w, int h, void *save_area, int clearchar, int clearattr); +void video_restore_rect(int x, int y, int w, int h, void *save_area); +int video_rows(void); +int video_cols(void); + +#define MAX_MENU_OPTIONS 200 + +typedef struct +{ + int used; /* flag if this entry is used */ + int entry_x; /* Character column of the menu entry */ + int entry_y; /* Character line of the entry */ + int option_x; /* Character colum of the option (entry is same) */ +} option_data_t; + +option_data_t odata[MAX_MENU_OPTIONS]; + +int normal_attr = 0x0F; +int select_attr = 0x2F; +int disabled_attr = 0x07; + +menu_t *root_menu; + +int menu_init (menu_t *root) +{ + char *s; + int i; + + s = getenv("menu_normal"); + if (s) normal_attr = atoi(s); + + s = getenv("menu_select"); + if (s) select_attr = atoi(s); + + s = getenv("menu_disabled"); + if (s) disabled_attr = atoi(s); + + for (i=0; i<MAX_MENU_OPTIONS; i++) odata[i].used = 0; + + root_menu = root; +} + +option_data_t *menu_alloc_odata(void) +{ + int i; + for (int i=0; i<MAX_MENU_OPTIONS; i++) + { + if (odata[i].used == 0) return &odata[i]; + } + return NULL; +} + +void menu_free_odata(option_data_t *odata) +{ + odata->used = 0; +} + +void menu_layout (menu_t *menu) +{ diff --git a/board/MAI/menu/menu.h b/board/MAI/menu/menu.h new file mode 100644 index 0000000..e5886b8 --- /dev/null +++ b/board/MAI/menu/menu.h @@ -0,0 +1,174 @@ +#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 |