xref: /plan9/acme/bin/source/acd/main.c (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
19a747e4fSDavid du Colombier #include "acd.h"
29a747e4fSDavid du Colombier 
39a747e4fSDavid du Colombier int debug;
49a747e4fSDavid du Colombier 
59a747e4fSDavid du Colombier void
usage(void)69a747e4fSDavid du Colombier usage(void)
79a747e4fSDavid du Colombier {
8*3ff48bf5SDavid du Colombier 	fprint(2, "usage: acd dev\n");
99a747e4fSDavid du Colombier 	threadexitsall("usage");
109a747e4fSDavid du Colombier }
119a747e4fSDavid du Colombier 
129a747e4fSDavid du Colombier Alt
mkalt(Channel * c,void * v,int op)139a747e4fSDavid du Colombier mkalt(Channel *c, void *v, int op)
149a747e4fSDavid du Colombier {
159a747e4fSDavid du Colombier 	Alt a;
169a747e4fSDavid du Colombier 
179a747e4fSDavid du Colombier 	memset(&a, 0, sizeof(a));
189a747e4fSDavid du Colombier 	a.c = c;
199a747e4fSDavid du Colombier 	a.v = v;
209a747e4fSDavid du Colombier 	a.op = op;
219a747e4fSDavid du Colombier 	return a;
229a747e4fSDavid du Colombier }
239a747e4fSDavid du Colombier 
249a747e4fSDavid du Colombier void
freetoc(Toc * t)259a747e4fSDavid du Colombier freetoc(Toc *t)
269a747e4fSDavid du Colombier {
279a747e4fSDavid du Colombier 	int i;
289a747e4fSDavid du Colombier 
299a747e4fSDavid du Colombier 	free(t->title);
309a747e4fSDavid du Colombier 	for(i=0; i<t->ntrack; i++)
319a747e4fSDavid du Colombier 		free(t->track[i].title);
329a747e4fSDavid du Colombier }
339a747e4fSDavid du Colombier 
349a747e4fSDavid du Colombier void
eventwatcher(Drive * d)359a747e4fSDavid du Colombier eventwatcher(Drive *d)
369a747e4fSDavid du Colombier {
379a747e4fSDavid du Colombier 	enum { STATUS, WEVENT, TOCDISP, DBREQ, DBREPLY, NALT };
389a747e4fSDavid du Colombier 	Alt alts[NALT+1];
399a747e4fSDavid du Colombier 	Toc nt, tdb;
409a747e4fSDavid du Colombier 	Event *e;
419a747e4fSDavid du Colombier 	Window *w;
429a747e4fSDavid du Colombier 	Cdstatus s;
439a747e4fSDavid du Colombier 	char buf[40];
449a747e4fSDavid du Colombier 
459a747e4fSDavid du Colombier 	w = d->w;
469a747e4fSDavid du Colombier 
479a747e4fSDavid du Colombier 	alts[STATUS] = mkalt(d->cstatus, &s, CHANRCV);
489a747e4fSDavid du Colombier 	alts[WEVENT] = mkalt(w->cevent, &e, CHANRCV);
499a747e4fSDavid du Colombier 	alts[TOCDISP] = mkalt(d->ctocdisp, &nt, CHANRCV);
509a747e4fSDavid du Colombier 	alts[DBREQ] = mkalt(d->cdbreq, &tdb, CHANNOP);
519a747e4fSDavid du Colombier 	alts[DBREPLY] = mkalt(d->cdbreply, &nt, CHANRCV);
529a747e4fSDavid du Colombier 	alts[NALT] = mkalt(nil, nil, CHANEND);
539a747e4fSDavid du Colombier 	for(;;) {
549a747e4fSDavid du Colombier 		switch(alt(alts)) {
559a747e4fSDavid du Colombier 		case STATUS:
569a747e4fSDavid du Colombier 			//DPRINT(2, "s...");
579a747e4fSDavid du Colombier 			d->status = s;
589a747e4fSDavid du Colombier 			if(s.state == Scompleted) {
599a747e4fSDavid du Colombier 				s.state = Sunknown;
609a747e4fSDavid du Colombier 				advancetrack(d, w);
619a747e4fSDavid du Colombier 			}
629a747e4fSDavid du Colombier 			//DPRINT(2, "status %d %d %d %M %M\n", s.state, s.track, s.index, s.abs, s.rel);
639a747e4fSDavid du Colombier 			sprint(buf, "%d:%2.2d", s.rel.m, s.rel.s);
649a747e4fSDavid du Colombier 			setplaytime(w, buf);
659a747e4fSDavid du Colombier 			break;
669a747e4fSDavid du Colombier 		case WEVENT:
679a747e4fSDavid du Colombier 			//DPRINT(2, "w...");
689a747e4fSDavid du Colombier 			acmeevent(d, w, e);
699a747e4fSDavid du Colombier 			break;
709a747e4fSDavid du Colombier 		case TOCDISP:
719a747e4fSDavid du Colombier 			//DPRINT(2,"td...");
729a747e4fSDavid du Colombier 			freetoc(&d->toc);
739a747e4fSDavid du Colombier 			d->toc = nt;
749a747e4fSDavid du Colombier 			drawtoc(w, d, &d->toc);
759a747e4fSDavid du Colombier 			tdb = nt;
769a747e4fSDavid du Colombier 			alts[DBREQ].op = CHANSND;
779a747e4fSDavid du Colombier 			break;
789a747e4fSDavid du Colombier 		case DBREQ:	/* sent */
799a747e4fSDavid du Colombier 			//DPRINT(2,"dreq...");
809a747e4fSDavid du Colombier 			alts[DBREQ].op = CHANNOP;
819a747e4fSDavid du Colombier 			break;
829a747e4fSDavid du Colombier 		case DBREPLY:
839a747e4fSDavid du Colombier 			//DPRINT(2,"drep...");
849a747e4fSDavid du Colombier 			freetoc(&d->toc);
859a747e4fSDavid du Colombier 			d->toc = nt;
869a747e4fSDavid du Colombier 			redrawtoc(w, &d->toc);
879a747e4fSDavid du Colombier 			break;
889a747e4fSDavid du Colombier 		}
899a747e4fSDavid du Colombier 	}
909a747e4fSDavid du Colombier }
919a747e4fSDavid du Colombier 
929a747e4fSDavid du Colombier void
threadmain(int argc,char ** argv)939a747e4fSDavid du Colombier threadmain(int argc, char **argv)
949a747e4fSDavid du Colombier {
959a747e4fSDavid du Colombier 	Scsi *s;
969a747e4fSDavid du Colombier 	Drive *d;
979a747e4fSDavid du Colombier 	char buf[80];
989a747e4fSDavid du Colombier 
999a747e4fSDavid du Colombier 	ARGBEGIN{
1009a747e4fSDavid du Colombier 	case 'v':
1019a747e4fSDavid du Colombier 		debug++;
1029a747e4fSDavid du Colombier 		scsiverbose++;
1039a747e4fSDavid du Colombier 	}ARGEND
1049a747e4fSDavid du Colombier 
1059a747e4fSDavid du Colombier 	if(argc != 1)
1069a747e4fSDavid du Colombier 		usage();
1079a747e4fSDavid du Colombier 
1089a747e4fSDavid du Colombier 	fmtinstall('M', msfconv);
1099a747e4fSDavid du Colombier 
1109a747e4fSDavid du Colombier 	if((s = openscsi(argv[0])) == nil)
1119a747e4fSDavid du Colombier 		error("opening scsi: %r");
1129a747e4fSDavid du Colombier 
1139a747e4fSDavid du Colombier 	d = malloc(sizeof(*d));
1149a747e4fSDavid du Colombier 	if(d == nil)
1159a747e4fSDavid du Colombier 		error("out of memory");
1169a747e4fSDavid du Colombier 	memset(d, 0, sizeof d);
1179a747e4fSDavid du Colombier 
1189a747e4fSDavid du Colombier 	d->scsi = s;
1199a747e4fSDavid du Colombier 	d->w = newwindow();
1209a747e4fSDavid du Colombier 	d->ctocdisp = chancreate(sizeof(Toc), 0);
1219a747e4fSDavid du Colombier 	d->cdbreq = chancreate(sizeof(Toc), 0);
1229a747e4fSDavid du Colombier 	d->cdbreply = chancreate(sizeof(Toc), 0);
1239a747e4fSDavid du Colombier 	d->cstatus = chancreate(sizeof(Cdstatus), 0);
1249a747e4fSDavid du Colombier 
1259a747e4fSDavid du Colombier 	proccreate(wineventproc, d->w, STACK);
1269a747e4fSDavid du Colombier 	proccreate(cddbproc, d, STACK);
1279a747e4fSDavid du Colombier 	proccreate(cdstatusproc, d, STACK);
1289a747e4fSDavid du Colombier 
1299a747e4fSDavid du Colombier 	cleanname(argv[0]);
1309a747e4fSDavid du Colombier 	snprint(buf, sizeof(buf), "%s/", argv[0]);
1319a747e4fSDavid du Colombier 	winname(d->w, buf);
1329a747e4fSDavid du Colombier 
1339a747e4fSDavid du Colombier 	wintagwrite(d->w, "Stop Pause Resume Eject Ingest ", 5+6+7+6+7);
1349a747e4fSDavid du Colombier 	eventwatcher(d);
1359a747e4fSDavid du Colombier }
136