The London Hackspace bandwidth meter
Dependencies: LPD8806 MODSERIAL mbed picojson
main.cpp
00001 #include "mbed.h" 00002 #include "ctype.h" 00003 00004 #include "MODSERIAL.h" 00005 #include "LPD8806.h" 00006 #include "vfd.h" 00007 00008 DigitalOut led1(LED1); 00009 DigitalOut led2(LED2); 00010 DigitalOut led3(LED3); 00011 DigitalOut led4(LED4); 00012 00013 /* talk to the world */ 00014 MODSERIAL pc(USBTX, USBRX); 00015 00016 LPD8806 strip = LPD8806(32); 00017 00018 void setPixelsTop(int start, int end, int colour) { 00019 int i; 00020 00021 for (i = start; i < end + 1 ; i++) { 00022 strip.setPixelColor(i, colour); 00023 } 00024 } 00025 00026 void setPixelsBottom(int start, int end, int colour) { 00027 int i; 00028 00029 for (i = start; i < end + 1 ; i++) { 00030 strip.setPixelColor(16 + i, colour); 00031 } 00032 } 00033 00034 /* 0 - 16 */ 00035 void top_strip(int quantity){ 00036 if (quantity < 16) { 00037 // blank unused bits. 00038 setPixelsTop(quantity, 15, 0); 00039 } 00040 00041 if (quantity == 0) return; 00042 00043 quantity --; 00044 00045 setPixelsTop(0, quantity < 12 ? quantity : 11, strip.Color(0, 127, 0)); 00046 00047 if (quantity > 11) 00048 setPixelsTop(12, quantity < 14 ? quantity : 14, strip.Color(127, 127, 0)); 00049 00050 if (quantity > 13) 00051 setPixelsTop(14, quantity < 16 ? quantity : 16, strip.Color(127, 0, 0)); 00052 } 00053 00054 void bottom_strip(int quantity){ 00055 if (quantity < 16) { 00056 // blank unused bits. 00057 setPixelsBottom(quantity, 15, 0); 00058 } 00059 00060 if (quantity == 0) return; 00061 quantity --; 00062 00063 setPixelsBottom(0, quantity < 12 ? quantity : 11, strip.Color(0, 127, 0)); 00064 00065 if (quantity > 11) 00066 setPixelsBottom(12, quantity < 14 ? quantity : 14, strip.Color(127, 127, 0)); 00067 00068 if (quantity > 13) 00069 setPixelsBottom(14, quantity < 16 ? quantity : 16, strip.Color(127, 0, 0)); 00070 } 00071 00072 void emf_blue() { 00073 setPixelsBottom(0, 15, strip.Color(0, 161, 228)); 00074 setPixelsTop(0, 15, strip.Color(0, 161, 228)); 00075 } 00076 00077 void strip_clear() { 00078 int i; 00079 00080 for (i = 0 ; i < strip.numPixels() ; i++) { 00081 // clear the strip 00082 strip.setPixelColor(i, 0); 00083 } 00084 } 00085 00086 #define s_looking 1 00087 #define s_top 2 00088 #define s_bottom 3 00089 00090 void send_text(const char *s) { 00091 int i; char c; 00092 00093 for (i = 0, c=s[i]; c != 0; i++, c=s[i]) 00094 vfd_data(c); 00095 } 00096 00097 void text_centered(const char *s, int hpos) { 00098 00099 vfd_pos((20 / 2) - (strlen(s)) / 2, hpos); 00100 send_text(s); 00101 } 00102 00103 void logo(void) { 00104 const char line0[] = "Welcome to"; 00105 const char line2[] = "London Hackspace"; 00106 00107 text_centered(line0, 0); 00108 text_centered(line2, 2); 00109 } 00110 00111 int hex_char_to_int(char h) { 00112 int ret; 00113 if (h >= '0' || h <= '9') { 00114 ret = h - 48; 00115 } else if (h >= 'A' || h <= 'F') { 00116 ret = (h - 'A') + 10; 00117 } else if (h >= 'a' || h <= 'f') { 00118 ret = (h - 'a') + 10; 00119 } 00120 return ret; 00121 } 00122 00123 int main() { 00124 00125 // setbuf(stdout, NULL); 00126 00127 pc.printf("Hello!\r\n"); 00128 00129 wait_ms(10); 00130 vfd_reset(); 00131 wait_ms(10); 00132 vfd_init(); 00133 wait_ms(10); 00134 logo(); 00135 wait_ms(10); 00136 00137 strip.begin(); 00138 pc.printf("post strip.begin\r\n"); 00139 strip_clear(); 00140 strip.show(); 00141 pc.printf("post strip.show\r\n"); 00142 00143 int tmp = 0; 00144 bool changed = false; 00145 char got; 00146 char buf[128]; 00147 int bufpos = 0; 00148 00149 enum state {Looking, Number, String, Cmd}; 00150 enum cmd {None, Top, Bottom, VfdWrite, VfdPos, Emf, VfdReset, VfdClear, SetStrip}; 00151 state state; 00152 cmd cmd; 00153 state = Looking; 00154 cmd = None; 00155 int num = 0; 00156 00157 while(1) { 00158 00159 if (pc.readable()) { 00160 got = pc.getc(); 00161 if (isprint(got)) { 00162 // pc.putc(got); // remote echo 00163 } else { 00164 pc.printf("%02x ", got); 00165 } 00166 changed = false; 00167 00168 if (state == Looking) { 00169 switch (got) { 00170 case 't': 00171 state = Number; 00172 num = 0; 00173 cmd = Top; 00174 break; 00175 case 'b': 00176 state = Number; 00177 num = 0; 00178 cmd = Bottom; 00179 break; 00180 case 'e': // emf blue... 00181 cmd = Emf; 00182 state = Cmd; 00183 break; 00184 case 'r': 00185 cmd = VfdReset; 00186 state = Cmd; 00187 break; 00188 case 'w': 00189 cmd = VfdWrite; 00190 state = String; 00191 bufpos = 0; 00192 break; 00193 case 'p': 00194 cmd = VfdPos; 00195 state = String; 00196 bufpos = 0; 00197 break; 00198 case 'c': 00199 cmd = VfdClear; 00200 state = Cmd; 00201 break; 00202 case 's': 00203 cmd = SetStrip; 00204 state = String; 00205 bufpos = 0; 00206 break; 00207 } 00208 } else { // not looking for a command 00209 // cr or lf terminates a command. 00210 if (got == '\n' || got == '\r') { 00211 switch (cmd) { 00212 case Top: 00213 if (num > 16) 00214 num = 16; 00215 top_strip(num); 00216 changed = true; 00217 break; 00218 case Bottom: 00219 if (num > 16) 00220 num = 16; 00221 bottom_strip(num); 00222 changed = true; 00223 break; 00224 case Emf: 00225 emf_blue(); 00226 changed = true; 00227 pc.printf("emf_blue\r\n"); 00228 break; 00229 case VfdReset: 00230 vfd_reset(); 00231 break; 00232 case VfdWrite: 00233 send_text(buf); 00234 bufpos = 0; 00235 break; 00236 case VfdPos: 00237 int v,h; 00238 sscanf(buf, "%d,%d", &h,&v); 00239 if (v > 3) v = 0; 00240 if (h > 19) h = 0; 00241 vfd_pos(h, v); 00242 bufpos = 0; 00243 break; 00244 case VfdClear: 00245 vfd_init(); 00246 break; 00247 case SetStrip: 00248 bufpos = 0; 00249 // buf[0] == t or b for strip 00250 // next 48 chars == HHH rgb * 16 00251 int p, r, g, b, poff=0; 00252 if (buf[0] == 'b') { 00253 poff = 16; 00254 } 00255 00256 for (p = 0;p < 16 ; p ++) { 00257 r = hex_char_to_int(buf[(p * 3) + 1]); 00258 g = hex_char_to_int(buf[(p * 3) + 2]); 00259 b = hex_char_to_int(buf[(p * 3) + 3]); 00260 strip.setPixelColor(p + poff , strip.Color(r,g,b)); 00261 } 00262 changed = true; 00263 00264 break; 00265 default: 00266 pc.printf("no command given\r\n"); 00267 } 00268 state = Looking; 00269 cmd = None; 00270 } 00271 if (state == Number) { 00272 if (got >= '0' || got <= '9') { 00273 tmp = (got - 48); 00274 num = (num * 10) + tmp; 00275 } else { 00276 pc.printf("expected a number, got %c\r\n", got); 00277 } 00278 } else if (state == String) { 00279 if (bufpos < 127) { 00280 buf[bufpos] = got; 00281 bufpos++; 00282 buf[bufpos] = '\0'; 00283 } else { 00284 pc.printf("buffer full\r\n!"); 00285 // XXX state == None here? 00286 } 00287 } 00288 } 00289 } 00290 if (changed) 00291 { 00292 pc.printf("changed\r\n"); 00293 led1 = led1 ? 0 : 1; 00294 strip.show(); 00295 changed = false; 00296 } 00297 } 00298 }
Generated on Thu Jul 14 2022 08:12:33 by 1.7.2