xref: /inferno-os/os/boot/puma/console.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #include "u.h"
2*74a4d8c2SCharles.Forsyth #include "lib.h"
3*74a4d8c2SCharles.Forsyth #include "mem.h"
4*74a4d8c2SCharles.Forsyth #include "dat.h"
5*74a4d8c2SCharles.Forsyth #include "fns.h"
6*74a4d8c2SCharles.Forsyth #include "io.h"
7*74a4d8c2SCharles.Forsyth 
8*74a4d8c2SCharles.Forsyth static Queue*	consiq;
9*74a4d8c2SCharles.Forsyth static Queue*	consoq;
10*74a4d8c2SCharles.Forsyth 
11*74a4d8c2SCharles.Forsyth void
bothputs(char * s,int n)12*74a4d8c2SCharles.Forsyth bothputs(char *s, int n)
13*74a4d8c2SCharles.Forsyth {
14*74a4d8c2SCharles.Forsyth 	uartputs(s, n);
15*74a4d8c2SCharles.Forsyth //	cgascreenputs(s, n);
16*74a4d8c2SCharles.Forsyth }
17*74a4d8c2SCharles.Forsyth 
18*74a4d8c2SCharles.Forsyth static void (*consputs)(char*, int) =  0;
19*74a4d8c2SCharles.Forsyth 
20*74a4d8c2SCharles.Forsyth void
consinit(void)21*74a4d8c2SCharles.Forsyth consinit(void)
22*74a4d8c2SCharles.Forsyth {
23*74a4d8c2SCharles.Forsyth 	char *p;
24*74a4d8c2SCharles.Forsyth 	int baud, port;
25*74a4d8c2SCharles.Forsyth 	static int cgadone;
26*74a4d8c2SCharles.Forsyth 
27*74a4d8c2SCharles.Forsyth 	if((p = getconf("console")) == 0 || strcmp(p, "lcd") == 0 || strcmp(p, "screen") == 0){
28*74a4d8c2SCharles.Forsyth 		consiq = qopen(4*1024, 0, 0, 0);
29*74a4d8c2SCharles.Forsyth 		consoq = qopen(8*1024, 0, 0, 0);
30*74a4d8c2SCharles.Forsyth 		consputs = uartputs;
31*74a4d8c2SCharles.Forsyth 		if(!cgadone) {
32*74a4d8c2SCharles.Forsyth 			cgadone = 1;
33*74a4d8c2SCharles.Forsyth 			//screeninit();
34*74a4d8c2SCharles.Forsyth 			//kbdinit();
35*74a4d8c2SCharles.Forsyth 		port = 1;
36*74a4d8c2SCharles.Forsyth 		baud = 9600;
37*74a4d8c2SCharles.Forsyth 		uartspecial(port, baud, &consiq, &consoq, kbdchar);
38*74a4d8c2SCharles.Forsyth 		}
39*74a4d8c2SCharles.Forsyth 		return;
40*74a4d8c2SCharles.Forsyth 	}
41*74a4d8c2SCharles.Forsyth 	if(0 || strstr(p, "lcd") == 0)
42*74a4d8c2SCharles.Forsyth 		consputs = bothputs;
43*74a4d8c2SCharles.Forsyth 	else
44*74a4d8c2SCharles.Forsyth 		consputs = uartputs;
45*74a4d8c2SCharles.Forsyth 
46*74a4d8c2SCharles.Forsyth 	port = strtoul(p, 0, 0);
47*74a4d8c2SCharles.Forsyth 	baud = 0;
48*74a4d8c2SCharles.Forsyth 	if(p = getconf("baud"))
49*74a4d8c2SCharles.Forsyth 		baud = strtoul(p, 0, 0);
50*74a4d8c2SCharles.Forsyth 	if(baud == 0)
51*74a4d8c2SCharles.Forsyth 		baud = 9600;
52*74a4d8c2SCharles.Forsyth 	uartspecial(port, baud, &consiq, &consoq, kbdchar);
53*74a4d8c2SCharles.Forsyth }
54*74a4d8c2SCharles.Forsyth 
55*74a4d8c2SCharles.Forsyth void
kbdchar(Queue * q,int c)56*74a4d8c2SCharles.Forsyth kbdchar(Queue *q, int c)
57*74a4d8c2SCharles.Forsyth {
58*74a4d8c2SCharles.Forsyth 	c &= 0x7F;
59*74a4d8c2SCharles.Forsyth 	if(c == 0x10)
60*74a4d8c2SCharles.Forsyth 		panic("^p");
61*74a4d8c2SCharles.Forsyth 	if(q == 0) {
62*74a4d8c2SCharles.Forsyth 		if(consiq != 0)
63*74a4d8c2SCharles.Forsyth 			qbputc(consiq, c);
64*74a4d8c2SCharles.Forsyth 	} else
65*74a4d8c2SCharles.Forsyth 		qbputc(q, c);
66*74a4d8c2SCharles.Forsyth }
67*74a4d8c2SCharles.Forsyth 
68*74a4d8c2SCharles.Forsyth static int
getline(char * buf,int size,int dotimeout)69*74a4d8c2SCharles.Forsyth getline(char *buf, int size, int dotimeout)
70*74a4d8c2SCharles.Forsyth {
71*74a4d8c2SCharles.Forsyth 	int c, i=0;
72*74a4d8c2SCharles.Forsyth 	ulong start;
73*74a4d8c2SCharles.Forsyth 	char echo;
74*74a4d8c2SCharles.Forsyth 
75*74a4d8c2SCharles.Forsyth 	for (;;) {
76*74a4d8c2SCharles.Forsyth 		start = m->ticks;
77*74a4d8c2SCharles.Forsyth 		do{
78*74a4d8c2SCharles.Forsyth 			if(dotimeout && ((m->ticks - start) > 5*HZ))
79*74a4d8c2SCharles.Forsyth 				return -2;
80*74a4d8c2SCharles.Forsyth 			c = qbgetc(consiq);
81*74a4d8c2SCharles.Forsyth 		}while(c == -1);
82*74a4d8c2SCharles.Forsyth 		if(c == '\r')
83*74a4d8c2SCharles.Forsyth 			c = '\n'; 		/* turn carriage return into newline */
84*74a4d8c2SCharles.Forsyth 		if(c == '\177')
85*74a4d8c2SCharles.Forsyth 			c = '\010';		/* turn delete into backspace */
86*74a4d8c2SCharles.Forsyth 		if(c == '\025')
87*74a4d8c2SCharles.Forsyth 			echo = '\n';		/* echo ^U as a newline */
88*74a4d8c2SCharles.Forsyth 		else
89*74a4d8c2SCharles.Forsyth 			echo = c;
90*74a4d8c2SCharles.Forsyth 		(*consputs)(&echo, 1);
91*74a4d8c2SCharles.Forsyth 
92*74a4d8c2SCharles.Forsyth 		if(c == '\010'){
93*74a4d8c2SCharles.Forsyth 			if(i > 0)
94*74a4d8c2SCharles.Forsyth 				i--; /* bs deletes last character */
95*74a4d8c2SCharles.Forsyth 			continue;
96*74a4d8c2SCharles.Forsyth 		}
97*74a4d8c2SCharles.Forsyth 		/* a newline ends a line */
98*74a4d8c2SCharles.Forsyth 		if (c == '\n')
99*74a4d8c2SCharles.Forsyth 			break;
100*74a4d8c2SCharles.Forsyth 		/* ^U wipes out the line */
101*74a4d8c2SCharles.Forsyth 		if (c =='\025')
102*74a4d8c2SCharles.Forsyth 			return -1;
103*74a4d8c2SCharles.Forsyth 		if(i == size)
104*74a4d8c2SCharles.Forsyth 			return size;
105*74a4d8c2SCharles.Forsyth 		buf[i++] = c;
106*74a4d8c2SCharles.Forsyth 	}
107*74a4d8c2SCharles.Forsyth 	buf[i] = 0;
108*74a4d8c2SCharles.Forsyth 	return i;
109*74a4d8c2SCharles.Forsyth }
110*74a4d8c2SCharles.Forsyth 
111*74a4d8c2SCharles.Forsyth int
getstr(char * prompt,char * buf,int size,char * def)112*74a4d8c2SCharles.Forsyth getstr(char *prompt, char *buf, int size, char *def)
113*74a4d8c2SCharles.Forsyth {
114*74a4d8c2SCharles.Forsyth 	int len, isdefault;
115*74a4d8c2SCharles.Forsyth 
116*74a4d8c2SCharles.Forsyth 	buf[0] = 0;
117*74a4d8c2SCharles.Forsyth 	isdefault = (def && *def);
118*74a4d8c2SCharles.Forsyth 	for (;;) {
119*74a4d8c2SCharles.Forsyth 		if(isdefault)
120*74a4d8c2SCharles.Forsyth 			print("%s[default==%s]: ", prompt, def);
121*74a4d8c2SCharles.Forsyth 		else
122*74a4d8c2SCharles.Forsyth 			print("%s: ", prompt);
123*74a4d8c2SCharles.Forsyth 		len = getline(buf, size, isdefault);
124*74a4d8c2SCharles.Forsyth 		switch(len){
125*74a4d8c2SCharles.Forsyth 		case -1:
126*74a4d8c2SCharles.Forsyth 			/* ^U typed */
127*74a4d8c2SCharles.Forsyth 			continue;
128*74a4d8c2SCharles.Forsyth 		case -2:
129*74a4d8c2SCharles.Forsyth 			/* timeout, use default */
130*74a4d8c2SCharles.Forsyth 			(*consputs)("\n", 1);
131*74a4d8c2SCharles.Forsyth 			len = 0;
132*74a4d8c2SCharles.Forsyth 			break;
133*74a4d8c2SCharles.Forsyth 		default:
134*74a4d8c2SCharles.Forsyth 			break;
135*74a4d8c2SCharles.Forsyth 		}
136*74a4d8c2SCharles.Forsyth 		if(len >= size){
137*74a4d8c2SCharles.Forsyth 			print("line too long\n");
138*74a4d8c2SCharles.Forsyth 			continue;
139*74a4d8c2SCharles.Forsyth 		}
140*74a4d8c2SCharles.Forsyth 		break;
141*74a4d8c2SCharles.Forsyth 	}
142*74a4d8c2SCharles.Forsyth 	if(len == 0 && isdefault)
143*74a4d8c2SCharles.Forsyth 		strcpy(buf, def);
144*74a4d8c2SCharles.Forsyth 	return 0;
145*74a4d8c2SCharles.Forsyth }
146*74a4d8c2SCharles.Forsyth 
147*74a4d8c2SCharles.Forsyth int
sprint(char * s,char * fmt,...)148*74a4d8c2SCharles.Forsyth sprint(char *s, char *fmt, ...)
149*74a4d8c2SCharles.Forsyth {
150*74a4d8c2SCharles.Forsyth 	return donprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s;
151*74a4d8c2SCharles.Forsyth }
152*74a4d8c2SCharles.Forsyth 
153*74a4d8c2SCharles.Forsyth int
print(char * fmt,...)154*74a4d8c2SCharles.Forsyth print(char *fmt, ...)
155*74a4d8c2SCharles.Forsyth {
156*74a4d8c2SCharles.Forsyth 	char buf[PRINTSIZE];
157*74a4d8c2SCharles.Forsyth 	int n;
158*74a4d8c2SCharles.Forsyth 
159*74a4d8c2SCharles.Forsyth 	if(consputs == 0)
160*74a4d8c2SCharles.Forsyth 		return 0;
161*74a4d8c2SCharles.Forsyth 	n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
162*74a4d8c2SCharles.Forsyth 	(*consputs)(buf, n);
163*74a4d8c2SCharles.Forsyth 	return n;
164*74a4d8c2SCharles.Forsyth }
165*74a4d8c2SCharles.Forsyth 
166*74a4d8c2SCharles.Forsyth void
panic(char * fmt,...)167*74a4d8c2SCharles.Forsyth panic(char *fmt, ...)
168*74a4d8c2SCharles.Forsyth {
169*74a4d8c2SCharles.Forsyth 	char buf[PRINTSIZE];
170*74a4d8c2SCharles.Forsyth 	int n;
171*74a4d8c2SCharles.Forsyth 
172*74a4d8c2SCharles.Forsyth 	if(consputs){
173*74a4d8c2SCharles.Forsyth 		(*consputs)("panic: ", 7);
174*74a4d8c2SCharles.Forsyth 		n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf;
175*74a4d8c2SCharles.Forsyth 		(*consputs)(buf, n);
176*74a4d8c2SCharles.Forsyth 		(*consputs)("\n", 1);
177*74a4d8c2SCharles.Forsyth 	}
178*74a4d8c2SCharles.Forsyth 	spllo();
179*74a4d8c2SCharles.Forsyth 	for(;;)
180*74a4d8c2SCharles.Forsyth 		idle();
181*74a4d8c2SCharles.Forsyth }
182