Charles.Forsyth20060303a828770d19 years agoHistory
118 lines · 2.1 KB · Brainfuck
RawDownload
# Driver for Mind Path IR50. implement Ir; include "sys.m";FD, Dir: import Sys;include "ir.m"; sys: Sys; init(keys, pid: chan of int): int{	sys = load Sys Sys->PATH; 	cfd := sys->open("#t/eia1ctl", sys->OWRITE);	if(cfd == nil)		return -1;	sys->fprint(cfd, "b1200");	# baud rate	sys->fprint(cfd, "d1");		# DTR on	sys->fprint(cfd, "r1");		# RTS on 	dfd := sys->open("#t/eia1", sys->OREAD);	if(dfd == nil)		return -1;	cfd = nil; 	spawn reader(keys, pid, dfd);	return 0;} reader(keys, pid: chan of int, dfd: ref FD){	n: int;	dir: Dir;	button: int; 	pid <-= sys->pctl(0,nil);	(n, dir) = sys->fstat(dfd);	if(n >= 0 && dir.length > 0) {		while(dir.length) {			n = sys->read(dfd, array[dir.length] of byte, dir.length);			if(n < 0)				break;			dir.length -= n;		}	}	 	for(;;) {		# Look for 2 consecutive characters that are the same.		if((button=getconsec(dfd,2)) < 0)			break;		case button {			'-' => n = Ir->Enter;			'+' => n = Ir->Rcl;			'1' => n = Ir->One;			'2' => n = Ir->Two;			'3' => n = Ir->Three;			'4' => n = Ir->ChanUP;	# page up			'5' => n = Ir->ChanDN;	# page down			'U' => continue;			'R' =>				if((button=getconsec(dfd,2)) < 0)					break;				case button {					'a' or 'e' or 'i' or 'p' =>						n = Ir->Up;					'b' or 'f' or 'j' or 'k' =>						n = Ir->FF;	# right					'c' or 'g' or 'l' or 'm' =>						n = Ir->Dn;					'd' or 'h' or 'n' or 'o' =>						n = Ir->Rew;	# left					'Z' => n = Ir->Select;					* =>	;				}			* =>	;		}		keys <-= n;	# Send translated key over channel		# Read through to trailer before looking for another key press		while((button=getconsec(dfd,2)) != 'U') {			if(button <= 0)				break;		}	}	keys <-= Ir->Error;} translate(c: int): int{	return c;} # Gets 'count' consecutive occurrences of a byte.getconsec(dfd: ref FD, count: int): int{	b1:= array[1] of byte;	b2:= array[1] of byte; 	n := sys->read(dfd, b1, 1);	if(n <= 0) {		if(n==0)			n = -1;		return n;	}	for(sofar:=1; sofar < count; sofar++) {		n = sys->read(dfd, b2, 1);		if(n <= 0) {			if(n==0)				n = -1;			return n;		}		if(b1[0]!=b2[0]) {			sofar = 1;			b1[0] = b2[0];		}	}	return int b1[0];}