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:
parent
4eb5089821
commit
672d0ae156
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue