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