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