summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: b69bf52)
raw | patch | inline | side by side (parent: b69bf52)
author | Jason Hobbs <jason.hobbs@calxeda.com> | |
Tue, 23 Aug 2011 11:06:50 +0000 (11:06 +0000) | ||
committer | Wolfgang Denk <wd@denx.de> | |
Mon, 17 Oct 2011 20:25:33 +0000 (22:25 +0200) |
Signed-off-by: Jason Hobbs <jason.hobbs@calxeda.com>
common/main.c | patch | blob | history | |
common/menu.c | patch | blob | history | |
doc/README.menu | patch | blob | history | |
include/common.h | patch | blob | history | |
include/menu.h | patch | blob | history |
diff --git a/common/main.c b/common/main.c
index 3324d9d6e433a9b91efee84eea73e4f5f2d49cc6..b97d89e5899ce93e32a63a0a9bb546f5b9a08dc2 100644 (file)
--- a/common/main.c
+++ b/common/main.c
*/
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
# if defined(CONFIG_AUTOBOOT_KEYED)
-static inline int abortboot(int bootdelay)
+#ifndef CONFIG_MENU
+static inline
+#endif
+int abortboot(int bootdelay)
{
int abort = 0;
uint64_t etime = endtick(bootdelay);
static int menukey = 0;
#endif
-static inline int abortboot(int bootdelay)
+#ifndef CONFIG_MENU
+static inline
+#endif
+int abortboot(int bootdelay)
{
int abort = 0;
diff --git a/common/menu.c b/common/menu.c
index 56439374f7464734440e040ba44214b917f1de87..f0048233633da58649d45c96130e89eb0f76b6ff 100644 (file)
--- a/common/menu.c
+++ b/common/menu.c
*/
struct menu {
struct menu_item *default_item;
+ int timeout;
char *title;
int prompt;
void (*item_data_print)(void *);
return menu_items_iter(m, menu_item_key_match, item_key);
}
+/*
+ * Wait for the user to hit a key according to the timeout set for the menu.
+ * Returns 1 if the user hit a key, or 0 if the timeout expired.
+ */
+static inline int menu_interrupted(struct menu *m)
+{
+ if (!m->timeout)
+ return 0;
+
+ if (abortboot(m->timeout/10))
+ return 1;
+
+ return 0;
+}
+
/*
* Checks whether or not the default menu item should be used without
- * prompting for a user choice. If the menu is set to always prompt, return
- * 0. Otherwise, return 1 to indicate we should use the default menu item.
+ * prompting for a user choice. If the menu is set to always prompt, or the
+ * user hits a key during the timeout period, return 0. Otherwise, return 1 to
+ * indicate we should use the default menu item.
*/
static inline int menu_use_default(struct menu *m)
{
- return !m->prompt;
+ return !m->prompt && !menu_interrupted(m);
}
/*
/*
* menu_get_choice() - Returns the user's selected menu entry, or the default
- * if the menu is set to not prompt. This is safe to call more than once.
+ * if the menu is set to not prompt or the timeout expires. This is safe to
+ * call more than once.
*
* m - Points to a menu created by menu_create().
*
* written at the location it points to.
*
* Returns 1 if successful, -EINVAL if m or choice is NULL, -ENOENT if no
- * default has been set and the menu is set to not prompt, or -EINTR if the
- * user exits the menu via ^c.
+ * default has been set and the menu is set to not prompt or the timeout
+ * expires, or -EINTR if the user exits the menu via ^c.
*/
int menu_get_choice(struct menu *m, void **choice)
{
* list of menu items. It will be copied to internal storage, and is safe to
* discard after passing to menu_create().
*
- * prompt - If 0, don't ask for user input.
+ * timeout - A delay in seconds to wait for user input. If 0, timeout is
+ * disabled, and the default choice will be returned unless prompt is 1.
+ *
+ * prompt - If 0, don't ask for user input unless there is an interrupted
+ * timeout. If 1, the user will be prompted for input regardless of the value
+ * of timeout.
*
* item_data_print - If not NULL, will be called for each item when the menu
* is displayed, with the pointer to the item's data passed as the argument.
* Returns a pointer to the menu if successful, or NULL if there is
* insufficient memory available to create the menu.
*/
-struct menu *menu_create(char *title, int prompt,
+struct menu *menu_create(char *title, int timeout, int prompt,
void (*item_data_print)(void *))
{
struct menu *m;
m->default_item = NULL;
m->prompt = prompt;
+ m->timeout = timeout;
m->item_data_print = item_data_print;
if (title) {
diff --git a/doc/README.menu b/doc/README.menu
index f55eb801b9a6862dc68fe28066cb7bb976eb531c..1259c6ad578f4289d750aca2837f68d2991eba28 100644 (file)
--- a/doc/README.menu
+++ b/doc/README.menu
/*
* menu_create() - Creates a menu handle with default settings
*/
-struct menu *menu_create(char *title, int prompt,
+struct menu *menu_create(char *title, int timeout, int prompt,
void (*item_data_print)(void *));
/*
/*
* menu_get_choice() - Returns the user's selected menu entry, or the
- * default if the menu is set to not prompt.
+ * default if the menu is set to not prompt or the timeout expires.
*/
int menu_get_choice(struct menu *m, void **choice);
int i;
char *tool = NULL;
- m = menu_create("Tools", 1, NULL);
+ m = menu_create("Tools", 0, 1, NULL);
for(i = 0; tools[i]; i++) {
if (menu_item_add(m, tools[i], tools[i]) != 1) {
diff --git a/include/common.h b/include/common.h
index a55600b1823d88d9818ef127cab00e8c8e9de47c..f9fea08115fe5167c44c24f4a5599e065d456e5c 100644 (file)
--- a/include/common.h
+++ b/include/common.h
int parse_line (char *, char *[]);
void init_cmd_timeout(void);
void reset_cmd_timeout(void);
+#ifdef CONFIG_MENU
+int abortboot(int bootdelay);
+#endif
/* arch/$(ARCH)/lib/board.c */
void board_init_f (ulong) __attribute__ ((noreturn));
diff --git a/include/menu.h b/include/menu.h
index d47e1a029c5bc9077210fe75243c9d410fbf9563..cf14a9cca356c4279f40854d4c25a311e562edb2 100644 (file)
--- a/include/menu.h
+++ b/include/menu.h
struct menu;
-struct menu *menu_create(char *title, int prompt,
+struct menu *menu_create(char *title, int timeout, int prompt,
void (*item_data_print)(void *));
int menu_default_set(struct menu *m, char *item_key);
int menu_get_choice(struct menu *m, void **choice);