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