libpayload: Add a timeout function for getchar and getch

Implement a timeout option for getchar() to return after so many
milliseconds.  Also implement the same thing for curses using
the halfdelay() function.

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3223 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Jordan Crouse 2008-04-08 23:21:33 +00:00 committed by Uwe Hermann
parent 4eb5089821
commit 672d0ae156
4 changed files with 48 additions and 4 deletions

View File

@ -39,6 +39,8 @@
#include "local.h" #include "local.h"
static int _halfdelay = 0;
/* ============== Serial ==================== */ /* ============== Serial ==================== */
/* FIXME: Cook the serial correctly */ /* FIXME: Cook the serial correctly */
@ -241,8 +243,13 @@ static int curses_getchar(int delay)
return cook_serial(c); return cook_serial(c);
} }
if (!delay) if (delay == 0)
break; break;
if (delay > 0) {
mdelay(100);
delay--;
}
} }
c = inb(0x60); c = inb(0x60);
@ -262,12 +269,33 @@ static int curses_getchar(int delay)
int wgetch(WINDOW *win) int wgetch(WINDOW *win)
{ {
return curses_getchar(win->_delay); int delay = -1;
if (_halfdelay || win->_delay)
delay = win->_delay ? 0 : _halfdelay;
return curses_getchar(delay);
} }
int nodelay(WINDOW *win, NCURSES_BOOL flag) int nodelay(WINDOW *win, NCURSES_BOOL flag)
{ {
win->_delay = flag ? 0 : -1; win->_delay = flag ? 1 : 0;
return 0;
}
int halfdelay(int tenths)
{
if (tenths > 255)
return ERR;
_halfdelay = tenths;
return 0;
}
int nocbreak(void)
{
/* Remove half delay timeout. */
_halfdelay = 0;
return 0; return 0;
} }

View File

@ -318,7 +318,6 @@ WINDOW *newwin(int num_lines, int num_columns, int begy, int begx)
return win; return win;
} }
/* D */ int nl(void) { SP->_nl = TRUE; return OK; } /* D */ int nl(void) { SP->_nl = TRUE; return OK; }
int nocbreak(void) { /* TODO */ return(*(int *)0); }
/* D */ int noecho(void) { SP->_echo = FALSE; return OK; } /* D */ int noecho(void) { SP->_echo = FALSE; return OK; }
/* D */ int nonl(void) { SP->_nl = FALSE; return OK; } /* D */ int nonl(void) { SP->_nl = FALSE; return OK; }
// void noqiflush (void) {} // void noqiflush (void) {}

View File

@ -94,6 +94,7 @@ int putchar(int c);
int puts(const char *s); int puts(const char *s);
int havekey(void); int havekey(void);
int getchar(void); int getchar(void);
int getchar_timeout(int *ms);
extern int last_putchar; extern int last_putchar;

View File

@ -101,3 +101,19 @@ int getchar(void)
#endif #endif
} }
} }
int getchar_timeout(int *ms)
{
while (*ms > 0) {
if (havekey())
return getchar();
mdelay(100);
*ms -= 100;
}
if (*ms < 0)
*ms = 0;
return 0;
}