summaryrefslogtreecommitdiffstats
path: root/ui/ncurses
diff options
context:
space:
mode:
authorGeoff Levand <geoffrey.levand@am.sony.com>2009-07-09 10:40:44 -0700
committerGeoff Levand <geoffrey.levand@am.sony.com>2009-07-09 10:40:44 -0700
commite3663cb096badf3d493df25030333affe506669b (patch)
tree0df9009462e32cad697f30192a26e5acded7efbb /ui/ncurses
parent66a74150f8723faf997fc6d4c58bd9bb23c3c2e6 (diff)
downloadtalos-petitboot-e3663cb096badf3d493df25030333affe506669b.tar.gz
talos-petitboot-e3663cb096badf3d493df25030333affe506669b.zip
Add CUI countdown timer
Add support for a petitboot CUI countdown timer. Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com>
Diffstat (limited to 'ui/ncurses')
-rw-r--r--ui/ncurses/nc-cui.c45
-rw-r--r--ui/ncurses/nc-cui.h14
2 files changed, 51 insertions, 8 deletions
diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c
index 2b059eb..47c09e2 100644
--- a/ui/ncurses/nc-cui.c
+++ b/ui/ncurses/nc-cui.c
@@ -30,7 +30,6 @@
#include "ui/common/discover-client.h"
#include "nc-cui.h"
-
static struct cui_opt_data *cod_from_item(struct pmenu_item *item)
{
return item->data;
@@ -205,7 +204,10 @@ static int cui_process_key(void *arg)
struct cui *cui = cui_from_arg(arg);
assert(cui->current);
+
+ ui_timer_disable(&cui->timer);
cui->current->process_key(cui->current);
+
return 0;
}
@@ -222,6 +224,24 @@ static int cui_client_process_socket(void *arg)
}
/**
+ * cui_handle_timeout - Handle the timeout.
+ */
+
+static void cui_handle_timeout(struct ui_timer *timer)
+{
+ struct cui *cui = cui_from_timer(timer);
+ struct pmenu_item *i = pmenu_find_selected(cui->main);
+
+#if defined(DEBUG)
+ {
+ struct cui_opt_data *cod = cod_from_item(i);
+ assert(cod && (cod->opt_hash == cui->default_item));
+ }
+#endif
+ i->on_execute(i);
+}
+
+/**
* cui_handle_resize - Handle the term resize.
*/
@@ -320,15 +340,17 @@ static int cui_device_add(struct device *dev, void *arg)
insert_pt++;
- /* If this is the default_item select it. */
-
- if (cod->opt_hash == cui->default_item)
- selected = i->nci;
-
pb_log("%s: adding opt '%s'\n", __func__, cod->opt->name);
pb_log(" image '%s'\n", cod->kd->image);
pb_log(" initrd '%s'\n", cod->kd->initrd);
pb_log(" args '%s'\n", cod->kd->args);
+
+ /* If this is the default_item select it and start timer. */
+
+ if (cod->opt_hash == cui->default_item) {
+ selected = i->nci;
+ ui_timer_kick(&cui->timer);
+ }
}
/* Re-attach the items array. */
@@ -379,9 +401,15 @@ static void cui_device_remove(struct device *dev, void *arg)
list_for_each_entry(&dev->boot_options, opt, list) {
struct pmenu_item *i = pmenu_item_from_arg(opt->ui_info);
+ struct cui_opt_data *cod = cod_from_item(i);
- assert(pb_protocol_device_cmp(dev, cod_from_item(i)->dev));
+ assert(pb_protocol_device_cmp(dev, cod->dev));
pmenu_remove(cui->main, i);
+
+ /* If this is the default_item disable timer. */
+
+ if (cod->opt_hash == cui->default_item)
+ ui_timer_disable(&cui->timer);
}
/* Re-attach the items array. */
@@ -434,6 +462,7 @@ struct cui *cui_init(void* platform_info,
cui->c_sig = pb_cui_sig;
cui->platform_info = platform_info;
cui->on_kexec = on_kexec;
+ cui->timer.handle_timeout = cui_handle_timeout;
/* Loop here for scripts that just started the server. */
@@ -501,6 +530,8 @@ int cui_run(struct cui *cui, struct pmenu *main, unsigned int default_item)
if (cui->abort)
break;
+ ui_timer_process_sig(&cui->timer);
+
while (cui->resize) {
cui->resize = 0;
cui_handle_resize(cui);
diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h
index 668776e..79c41a4 100644
--- a/ui/ncurses/nc-cui.h
+++ b/ui/ncurses/nc-cui.h
@@ -21,10 +21,10 @@
#include <signal.h>
+#include "ui/common/timer.h"
#include "nc-menu.h"
#include "nc-ked.h"
-
struct cui_opt_data {
const struct device *dev;
const struct boot_option *opt;
@@ -49,6 +49,7 @@ struct cui {
sig_atomic_t resize;
struct nc_scr *current;
struct pmenu *main;
+ struct ui_timer timer;
void *platform_info;
unsigned int default_item;
int (*on_kexec)(struct cui *cui, struct cui_opt_data *cod);
@@ -85,4 +86,15 @@ static inline struct cui *cui_from_item(struct pmenu_item *item)
return cui_from_pmenu(item->pmenu);
}
+static inline struct cui *cui_from_timer(struct ui_timer *timer)
+{
+ struct cui *cui;
+
+ cui = (struct cui *)((char *)timer
+ - (size_t)&((struct cui *)0)->timer);
+ assert(cui->c_sig == pb_cui_sig);
+
+ return cui;
+}
+
#endif
OpenPOWER on IntegriCloud