home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_08_12
/
8n12088a
< prev
next >
Wrap
Text File
|
1990-08-29
|
2KB
|
68 lines
/* kclient.c - Keyboard Client Task */
#include <synrtx.h>
#define REL (((word)0x0100) | ((word)'r'))
/* handler numbers */
#define GRANT 0
#define GETCHAR 1
static word character;
static handler Grant(msg_t *msg_p) { /* for synchronization only */
}
static handler GetChar(msg_t *msg_p) {
character = msg_p->value.w;
}
task KeyboardClient(void) {
register task_t self = task_self();
register task_t ksTid = task_idOf("KeyboardServer");
msg_t msg;
task_setHandler(2, Grant, GetChar);
loop {
/* interrupt KeyboardServer.Acquire, then wait on Grant */
msg.srcTid = self;
msg.dstTid = ksTid;
msg.dstHid = 0; /* Acquire = 0 */
msg.type = msg_type_SYNC;
task_interruptEnableWait(&msg, NO_TIMEOUT, 1, GRANT);
io_puts("\nKeyboardClient: Acquired\n");
character = 0;
loop {
/* interrupt if KeyboardServer.Hit and wait for GetChar */
msg.srcTid = self;
msg.dstTid = ksTid;
msg.dstHid = 2; /* Hit = 2 */
msg.type = msg_type_SYNC;
task_interruptEnableWait(&msg, NO_TIMEOUT, 1, GETCHAR);
/*
* a legal character is a word 0x01xx where "xx" (LSB) is the
* actual character. The character 0x0000 means no key hit.
*/
if (character) {
io_putc((char)character);
if (character == REL) break; /* then 'r'elease */
character = 0;
}
}
/* interrupt KeyboardServer.Release */
msg.srcTid = self;
msg.dstTid = ksTid;
msg.dstHid = 1; /* Release = 1 */
msg.type = msg_type_SYNC;
task_interrupt(&msg);
io_puts("\nKeyboardClient: Released and delayed for 10 secs ...\n");
/*
* 10 seconds of freedom for the keyboard. All the characters typed
* during that time will flushed at the time of next Acquirement.
*/
task_delay(500L);
}
}