mirror of https://github.com/ipxe/ipxe.git
[console] Add a timeout parameter to getkey()
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/1/head
parent
2969a8567f
commit
9d633bdc71
|
@ -35,13 +35,13 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
/**
|
/**
|
||||||
* Read character from console if available within timeout period
|
* Read character from console if available within timeout period
|
||||||
*
|
*
|
||||||
* @v timeout Timeout period, in ticks
|
* @v timeout Timeout period, in ticks (0=indefinite)
|
||||||
* @ret character Character read from console
|
* @ret character Character read from console
|
||||||
*/
|
*/
|
||||||
int getchar_timeout ( unsigned long timeout ) {
|
static int getchar_timeout ( unsigned long timeout ) {
|
||||||
unsigned long start = currticks();
|
unsigned long start = currticks();
|
||||||
|
|
||||||
while ( ( currticks() - start ) < timeout ) {
|
while ( ( timeout == 0 ) || ( ( currticks() - start ) < timeout ) ) {
|
||||||
step();
|
step();
|
||||||
if ( iskey() )
|
if ( iskey() )
|
||||||
return getchar();
|
return getchar();
|
||||||
|
@ -53,6 +53,7 @@ int getchar_timeout ( unsigned long timeout ) {
|
||||||
/**
|
/**
|
||||||
* Get single keypress
|
* Get single keypress
|
||||||
*
|
*
|
||||||
|
* @v timeout Timeout period, in ticks (0=indefinite)
|
||||||
* @ret key Key pressed
|
* @ret key Key pressed
|
||||||
*
|
*
|
||||||
* The returned key will be an ASCII value or a KEY_XXX special
|
* The returned key will be an ASCII value or a KEY_XXX special
|
||||||
|
@ -60,11 +61,11 @@ int getchar_timeout ( unsigned long timeout ) {
|
||||||
* will return "special" keys (e.g. cursor keys) as a series of
|
* will return "special" keys (e.g. cursor keys) as a series of
|
||||||
* characters forming an ANSI escape sequence.
|
* characters forming an ANSI escape sequence.
|
||||||
*/
|
*/
|
||||||
int getkey ( void ) {
|
int getkey ( unsigned long timeout ) {
|
||||||
int character;
|
int character;
|
||||||
unsigned int n = 0;
|
unsigned int n = 0;
|
||||||
|
|
||||||
character = getchar();
|
character = getchar_timeout ( timeout );
|
||||||
if ( character != ESC )
|
if ( character != ESC )
|
||||||
return character;
|
return character;
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ char * readline ( const char *prompt ) {
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
|
||||||
while ( 1 ) {
|
while ( 1 ) {
|
||||||
key = edit_string ( &string, getkey() );
|
key = edit_string ( &string, getkey ( 0 ) );
|
||||||
sync_console ( &string );
|
sync_console ( &string );
|
||||||
switch ( key ) {
|
switch ( key ) {
|
||||||
case CR:
|
case CR:
|
||||||
|
|
|
@ -47,7 +47,7 @@ int shell_banner ( void ) {
|
||||||
printf ( "\nPress Ctrl-B for the iPXE command line..." );
|
printf ( "\nPress Ctrl-B for the iPXE command line..." );
|
||||||
|
|
||||||
/* Wait for key */
|
/* Wait for key */
|
||||||
key = getchar_timeout ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 );
|
key = getkey ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 );
|
||||||
|
|
||||||
/* Clear the "Press Ctrl-B" line */
|
/* Clear the "Press Ctrl-B" line */
|
||||||
printf ( "\r \r" );
|
printf ( "\r \r" );
|
||||||
|
|
|
@ -88,7 +88,7 @@ int login_ui ( void ) {
|
||||||
|
|
||||||
draw_editbox ( current_box );
|
draw_editbox ( current_box );
|
||||||
|
|
||||||
key = getkey();
|
key = getkey ( 0 );
|
||||||
switch ( key ) {
|
switch ( key ) {
|
||||||
case KEY_DOWN:
|
case KEY_DOWN:
|
||||||
current_box = &password_box;
|
current_box = &password_box;
|
||||||
|
|
|
@ -401,7 +401,7 @@ static int main_loop ( struct settings *settings ) {
|
||||||
draw_setting ( &widget );
|
draw_setting ( &widget );
|
||||||
color_set ( CPAIR_NORMAL, NULL );
|
color_set ( CPAIR_NORMAL, NULL );
|
||||||
|
|
||||||
key = getkey();
|
key = getkey ( 0 );
|
||||||
if ( widget.editing ) {
|
if ( widget.editing ) {
|
||||||
key = edit_setting ( &widget, key );
|
key = edit_setting ( &widget, key );
|
||||||
switch ( key ) {
|
switch ( key ) {
|
||||||
|
|
|
@ -102,8 +102,7 @@ struct console_driver {
|
||||||
|
|
||||||
extern void putchar ( int character );
|
extern void putchar ( int character );
|
||||||
extern int getchar ( void );
|
extern int getchar ( void );
|
||||||
extern int getchar_timeout ( unsigned long timeout );
|
|
||||||
extern int iskey ( void );
|
extern int iskey ( void );
|
||||||
extern int getkey ( void );
|
extern int getkey ( unsigned long timeout );
|
||||||
|
|
||||||
#endif /* CONSOLE_H */
|
#endif /* CONSOLE_H */
|
||||||
|
|
|
@ -30,7 +30,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
#include <ipxe/dhcp.h>
|
#include <ipxe/dhcp.h>
|
||||||
#include <ipxe/keys.h>
|
#include <ipxe/keys.h>
|
||||||
#include <ipxe/timer.h>
|
#include <ipxe/timer.h>
|
||||||
#include <ipxe/process.h>
|
|
||||||
#include <ipxe/uri.h>
|
#include <ipxe/uri.h>
|
||||||
#include <usr/dhcpmgmt.h>
|
#include <usr/dhcpmgmt.h>
|
||||||
#include <usr/autoboot.h>
|
#include <usr/autoboot.h>
|
||||||
|
@ -239,9 +238,7 @@ static int pxe_menu_select ( struct pxe_menu *menu ) {
|
||||||
pxe_menu_draw_item ( menu, menu->selection, 1 );
|
pxe_menu_draw_item ( menu, menu->selection, 1 );
|
||||||
|
|
||||||
/* Wait for keyboard input */
|
/* Wait for keyboard input */
|
||||||
while ( ! iskey() )
|
key = getkey ( 0 );
|
||||||
step();
|
|
||||||
key = getkey();
|
|
||||||
|
|
||||||
/* Unhighlight currently selected item */
|
/* Unhighlight currently selected item */
|
||||||
pxe_menu_draw_item ( menu, menu->selection, 0 );
|
pxe_menu_draw_item ( menu, menu->selection, 0 );
|
||||||
|
@ -304,7 +301,7 @@ static int pxe_menu_prompt_and_select ( struct pxe_menu *menu ) {
|
||||||
if ( ! len )
|
if ( ! len )
|
||||||
len = printf ( " (%d)", menu->timeout );
|
len = printf ( " (%d)", menu->timeout );
|
||||||
if ( iskey() ) {
|
if ( iskey() ) {
|
||||||
key = getkey();
|
key = getkey ( 0 );
|
||||||
if ( key == KEY_F8 ) {
|
if ( key == KEY_F8 ) {
|
||||||
/* Display menu */
|
/* Display menu */
|
||||||
printf ( "\n" );
|
printf ( "\n" );
|
||||||
|
|
Loading…
Reference in New Issue