1*37da2899SCharles.Forsythimplement Ir; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsythsys: Sys; 5*37da2899SCharles.ForsythFD: import sys; 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsythinclude "ir.m"; 8*37da2899SCharles.Forsyth 9*37da2899SCharles.Forsythrawon: ref FD; 10*37da2899SCharles.Forsyth 11*37da2899SCharles.Forsythinit(keys, pid: chan of int): int 12*37da2899SCharles.Forsyth{ 13*37da2899SCharles.Forsyth dfd: ref FD; 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsyth dfd = sys->open("/dev/keyboard", sys->OREAD); 18*37da2899SCharles.Forsyth if(dfd == nil) 19*37da2899SCharles.Forsyth return -1; 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsyth spawn reader(keys, pid, dfd); 22*37da2899SCharles.Forsyth return 0; 23*37da2899SCharles.Forsyth} 24*37da2899SCharles.Forsyth 25*37da2899SCharles.Forsythreader(keys, pid: chan of int, dfd: ref FD) 26*37da2899SCharles.Forsyth{ 27*37da2899SCharles.Forsyth n: int; 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth nb := 0; 30*37da2899SCharles.Forsyth b:= array[1] of byte; 31*37da2899SCharles.Forsyth buf := array[10] of byte; 32*37da2899SCharles.Forsyth pid <-= sys->pctl(0,nil); 33*37da2899SCharles.Forsyth for(;;) { 34*37da2899SCharles.Forsyth n = sys->read(dfd, b, 1); 35*37da2899SCharles.Forsyth if(n != 1) 36*37da2899SCharles.Forsyth break; 37*37da2899SCharles.Forsyth if(nb>= len buf){ 38*37da2899SCharles.Forsyth sys->print("irsim: confused by input\n"); 39*37da2899SCharles.Forsyth break; 40*37da2899SCharles.Forsyth } 41*37da2899SCharles.Forsyth 42*37da2899SCharles.Forsyth buf[nb++] = b[0]; 43*37da2899SCharles.Forsyth nutf := sys->utfbytes(buf, nb); 44*37da2899SCharles.Forsyth if(nutf > 0){ 45*37da2899SCharles.Forsyth s := string buf[0:nutf]; 46*37da2899SCharles.Forsyth keys <-= s[0]; 47*37da2899SCharles.Forsyth nb = 0; 48*37da2899SCharles.Forsyth } 49*37da2899SCharles.Forsyth } 50*37da2899SCharles.Forsyth keys <-= Ir->EOF; 51*37da2899SCharles.Forsyth} 52*37da2899SCharles.Forsyth 53*37da2899SCharles.Forsythtranslate(key: int): int 54*37da2899SCharles.Forsyth{ 55*37da2899SCharles.Forsyth n := Ir->Error; 56*37da2899SCharles.Forsyth 57*37da2899SCharles.Forsyth case key { 58*37da2899SCharles.Forsyth '0' => n = Ir->Zero; 59*37da2899SCharles.Forsyth '1' => n = Ir->One; 60*37da2899SCharles.Forsyth '2' => n = Ir->Two; 61*37da2899SCharles.Forsyth '3' => n = Ir->Three; 62*37da2899SCharles.Forsyth '4' => n = Ir->Four; 63*37da2899SCharles.Forsyth '5' => n = Ir->Five; 64*37da2899SCharles.Forsyth '6' => n = Ir->Six; 65*37da2899SCharles.Forsyth '7' => n = Ir->Seven; 66*37da2899SCharles.Forsyth '8' => n = Ir->Eight; 67*37da2899SCharles.Forsyth '9' => n = Ir->Nine; 68*37da2899SCharles.Forsyth 'r' => n = Ir->ChanUP; 69*37da2899SCharles.Forsyth 'c' => n = Ir->ChanDN; 70*37da2899SCharles.Forsyth 't' => n = Ir->VolUP; 71*37da2899SCharles.Forsyth 'v' => n = Ir->VolDN; 72*37da2899SCharles.Forsyth 'k' => n = Ir->FF; 73*37da2899SCharles.Forsyth 'j' => n = Ir->Rew; 74*37da2899SCharles.Forsyth 'i' => n = Ir->Up; 75*37da2899SCharles.Forsyth 'm' => n = Ir->Dn; 76*37da2899SCharles.Forsyth 'x' => n = Ir->Rcl; 77*37da2899SCharles.Forsyth '\n' => n = Ir->Select; 78*37da2899SCharles.Forsyth ' ' => n = Ir->Enter; 79*37da2899SCharles.Forsyth 16r7f => n = Ir->Power; 80*37da2899SCharles.Forsyth } 81*37da2899SCharles.Forsyth 82*37da2899SCharles.Forsyth return n; 83*37da2899SCharles.Forsyth} 84