diff options
Diffstat (limited to 'appl/lib/irsim.b')
| -rw-r--r-- | appl/lib/irsim.b | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/appl/lib/irsim.b b/appl/lib/irsim.b new file mode 100644 index 00000000..674df571 --- /dev/null +++ b/appl/lib/irsim.b @@ -0,0 +1,83 @@ +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; +} |
