ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /appl/lib/irsim.b/
implement Ir;
include "sys.m";
sys: Sys;
FD: import sys;
include "ir.m";
rawon: ref FD;
init(keys, pid: chan of int): int
{
dfd: ref FD;
sys = load Sys Sys->PATH;
dfd = sys->open("/dev/keyboard", sys->OREAD);
if(dfd == nil)
return -1;
spawn reader(keys, pid, dfd);
return 0;
}
reader(keys, pid: chan of int, dfd: ref FD)
{
n: int;
nb := 0;
b:= array[1] of byte;
buf := array[10] of byte;
pid <-= sys->pctl(0,nil);
for(;;) {
n = sys->read(dfd, b, 1);
if(n != 1)
break;
if(nb>= len buf){
sys->print("irsim: confused by input\n");
break;
}
buf[nb++] = b[0];
nutf := sys->utfbytes(buf, nb);
if(nutf > 0){
s := string buf[0:nutf];
keys <-= s[0];
nb = 0;
}
}
keys <-= Ir->EOF;
}
translate(key: int): int
{
n := Ir->Error;
case key {
'0' => n = Ir->Zero;
'1' => n = Ir->One;
'2' => n = Ir->Two;
'3' => n = Ir->Three;
'4' => n = Ir->Four;
'5' => n = Ir->Five;
'6' => n = Ir->Six;
'7' => n = Ir->Seven;
'8' => n = Ir->Eight;
'9' => n = Ir->Nine;
'r' => n = Ir->ChanUP;
'c' => n = Ir->ChanDN;
't' => n = Ir->VolUP;
'v' => n = Ir->VolDN;
'k' => n = Ir->FF;
'j' => n = Ir->Rew;
'i' => n = Ir->Up;
'm' => n = Ir->Dn;
'x' => n = Ir->Rcl;
'\n' => n = Ir->Select;
' ' => n = Ir->Enter;
16r7f => n = Ir->Power;
}
return n;
}