36,7 → 36,7 |
*/ |
|
/** @addtogroup tetris |
* @{ |
* @{ |
*/ |
/** @file |
*/ |
57,9 → 57,9 |
#include "tetris.h" |
|
#include <async.h> |
#include <vfs/vfs.h> |
#include <io/console.h> |
#include <ipc/console.h> |
#include <console.h> |
#include <kbd/kbd.h> |
|
/* return true iff the given timeval is positive */ |
#define TV_POS(tv) \ |
92,14 → 92,12 |
* Return 0 => no input, 1 => can read() from stdin |
* |
*/ |
int |
rwait(struct timeval *tvp) |
int rwait(struct timeval *tvp) |
{ |
struct timeval starttv, endtv, *s; |
static ipc_call_t charcall; |
ipcarg_t rc; |
int cons_phone; |
|
|
/* |
* Someday, select() will do this for us. |
* Just in case that day is now, and no one has |
111,15 → 109,15 |
s = &endtv; |
} else |
s = NULL; |
|
|
if (!lastchar) { |
again: |
if (!getchar_inprog) { |
cons_phone = console_open(true); |
getchar_inprog = async_send_2(cons_phone, |
CONSOLE_GETKEY, 0, 0, &charcall); |
getchar_inprog = async_send_0(fphone(stdin), |
CONSOLE_GET_EVENT, &charcall); |
} |
if (!s) |
|
if (!s) |
async_wait_for(getchar_inprog, &rc); |
else if (async_wait_timeout(getchar_inprog, &rc, s->tv_usec) == ETIMEOUT) { |
tvp->tv_sec = 0; |
126,22 → 124,25 |
tvp->tv_usec = 0; |
return (0); |
} |
|
getchar_inprog = 0; |
if (rc) { |
if (rc) |
stop("end of file, help"); |
} |
if (IPC_GET_ARG1(charcall) == KE_RELEASE) |
|
if (IPC_GET_ARG1(charcall) == KEY_RELEASE) |
goto again; |
|
|
lastchar = IPC_GET_ARG4(charcall); |
} |
|
if (tvp) { |
/* since there is input, we may not have timed out */ |
(void) gettimeofday(&endtv, NULL); |
TV_SUB(&endtv, &starttv); |
TV_SUB(tvp, &endtv); /* adjust *tvp by elapsed time */ |
TV_SUB(tvp, &endtv); /* adjust *tvp by elapsed time */ |
} |
return (1); |
|
return 1; |
} |
|
/* |
148,11 → 149,10 |
* `sleep' for the current turn time (using select). |
* Eat any input that might be available. |
*/ |
void |
tsleep(void) |
void tsleep(void) |
{ |
struct timeval tv; |
|
|
tv.tv_sec = 0; |
tv.tv_usec = fallrate; |
while (TV_POS(&tv)) |
165,12 → 165,11 |
/* |
* getchar with timeout. |
*/ |
int |
tgetchar(void) |
int tgetchar(void) |
{ |
static struct timeval timeleft; |
char c; |
|
|
/* |
* Reset timeleft to fallrate whenever it is not positive. |
* In any case, wait to see if there is any input. If so, |
181,17 → 180,18 |
* Most of the hard work is done by rwait(). |
*/ |
if (!TV_POS(&timeleft)) { |
faster(); /* go faster */ |
faster(); /* go faster */ |
timeleft.tv_sec = 0; |
timeleft.tv_usec = fallrate; |
} |
|
if (!rwait(&timeleft)) |
return (-1); |
return -1; |
|
c = lastchar; |
lastchar = '\0'; |
return ((int)(unsigned char)c); |
return ((int) (unsigned char) c); |
} |
|
/** @} |
*/ |
|