The London Hackspace bandwidth meter
Dependencies: LPD8806 MODSERIAL mbed picojson
See:
- https://github.com/londonhackspace/net-o-meter
- http://wiki.london.hackspace.org.uk/view/Projects/BandwidthMeter
Diff: main.cpp
- Revision:
- 4:7087ea3d13c1
- Parent:
- 3:7fca72f96711
- Child:
- 5:24172484b8c5
--- a/main.cpp Thu Aug 23 00:17:04 2012 +0000 +++ b/main.cpp Mon Aug 27 01:32:52 2012 +0000 @@ -4,13 +4,19 @@ #include "LPD8806.h" #include "vfd.h" +/* +#include "EthernetNetIf.h" +#include "HTTPServer.h" + +EthernetNetIf eth; +HTTPServer svr; +*/ + DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); -Ethernet eth; - /* talk to the world */ Serial pc(USBTX, USBRX); @@ -36,7 +42,7 @@ void top_strip(int quantity){ if (quantity < 16) { // blank unused bits. - setPixelsTop(quantity, 16, 0); + setPixelsTop(quantity, 15, 0); } if (quantity == 0) return; @@ -55,7 +61,7 @@ void bottom_strip(int quantity){ if (quantity < 16) { // blank unused bits. - setPixelsBottom(quantity, 16, 0); + setPixelsBottom(quantity, 15, 0); } if (quantity == 0) return; @@ -75,46 +81,140 @@ setPixelsTop(0, 15, strip.Color(0, 161, 228)); } +void strip_clear() { + int i; + + for (i = 0 ; i < strip.numPixels() ; i++) { + // clear the strip + strip.setPixelColor(i, 0); + } +} + #define s_looking 1 #define s_top 2 #define s_bottom 3 +void send_text(const char *s) { + int i; char c; + + for (i = 0, c=s[i]; c != 0; i++, c=s[i]) + vfd_data(c); +} + +void text_centered(const char *s, int hpos) { + + vfd_pos((20 / 2) - (strlen(s)) / 2, hpos); + send_text(s); +} + +void emf_logo(void) { + const char line0[] = "Welcome to"; + const char line2[] = "EMFCamp!"; + + text_centered(line0, 0); + text_centered(line2, 2); +} + int main() { - int t = 0, b = 0; - int i, state = s_looking, tmp = 0, col = 1; - bool changed = false; - char got; - char buf[0x600]; - char mad[6]; + + setbuf(stdout, NULL); pc.printf("Hello!\r\n"); + wait_ms(10); + vfd_reset(); + wait_ms(10); vfd_init(); - wait_ms(1); - - for (i = 'a'; i < 'a' + 25 ; i++){ - vfd_data(i); - } - for (i = 'a'; i < 'a' + 25 ; i++){ - vfd_data(i); - } - for (i = 'a'; i < 'a' + 25 ; i++){ - vfd_data(i); - } - -/* eth.init(); - eth.connect(); - printf("IP Address is %s\n", eth.getIPAddress()); - eth.disconnect();*/ + wait_ms(10); + emf_logo(); + wait_ms(10); strip.begin(); + pc.printf("post strip.begin\r\n"); + strip_clear(); + strip.show(); + pc.printf("post strip.show\r\n"); + + wait_ms(500); + emf_blue(); + strip.show(); + + wait_ms(500); + strip_clear(); + strip.show(); + + wait_ms(500); + emf_blue(); + strip.show(); + + wait_ms(500); + strip_clear(); + strip.show(); + + vfd_init(); + + /* print our mac address & ip (when/if we get it). */ + +/* + EthernetErr ethErr = eth.setup(); + + if(ethErr) + { + printf("Error %d in setup.\n", ethErr); + return -1; + } + printf("Setup OK\n"); +// printf("link: %d\r\n", eth.link()); +// if (eth.link()) { +// eth.address(mad); +// printf("mymac: %02X:%02X:%02X:%02X:%02X:%02X\r\n", +// mad[0], mad[1], mad[2], mad[3], mad[4], mad[5]); +// } + + svr.addHandler<SimpleHandler>("/"); //Default handler + svr.addHandler<SimpleHandler>("/hello"); + svr.bind(80); + + printf("Listening...\n"); - for (i = 0 ; i < strip.numPixels() ; i++) { - // clear the strip - strip.setPixelColor(i, 0); + Timer tm; + tm.start(); + //Listen indefinitely + while(true) + { + Net::poll(); + if(tm.read() > .5) + { +// vfd_data('.'); + tm.start(); } + } +*/ + +/* if (ret != 0) { + sprintf(buf, "unable to get ip address!"); + printf("%s\r\n", buf); + send_text(buf); + } else { + ret = sprintf(buf, "IP Address is %s", eth.getIPAddress()); + printf("%s : %d\r\n", buf, ret); + send_text(buf); + }*/ +// eth.disconnect(); - strip.show(); + int tmp = 0; + bool changed = false; + char got; + char buf[128]; + int bufpos = 0; + + enum state {Looking, Number, String, Cmd}; + enum cmd {None, Top, Bottom, VfdWrite, VfdPos, Emf, VfdReset, VfdClear}; + state state; + cmd cmd; + state = Looking; + cmd = None; + int num = 0; while(1) { @@ -122,48 +222,116 @@ got = pc.getc(); if (isprint(got)) pc.putc(got); // remote echo - vfd_data(got); +// vfd_data(got); changed = false; - - if (got == '\n' || got == '\r') { - if (state == s_top) - t = tmp; - if (state == s_bottom) - b = tmp; - state = s_looking; - tmp = 0; - col = 1; - if (t > 16) t = 16; - if (b > 16) b = 16; - printf("t: %d b: %d\r\n", t, b); - changed = true; - printf("link: %d\r\n", eth.link()); - if (eth.link()) { - eth.address(mad); - printf("mymac: %02X:%02X:%02X:%02X:%02X:%02X\r\n", - mad[0], mad[1], mad[2], mad[3], mad[4], mad[5]); + + if (state == Looking) { + switch (got) { + case 't': + state = Number; + num = 0; + cmd = Top; + break; + case 'b': + state = Number; + num = 0; + cmd = Bottom; + break; + case 'e': + cmd = Emf; + state = Cmd; + break; + case 'r': + cmd = VfdReset; + state = Cmd; + break; + case 'w': + cmd = VfdWrite; + state = String; + bufpos = 0; + break; + case 'p': + cmd = VfdPos; + state = String; + bufpos = 0; + break; + case 'c': + cmd = VfdClear; + state = Cmd; + break; } - } else if (got == 'b') { - state = s_bottom; - } else if (got == 't') { - state = s_top; - } else if (got == 'e') { - emf_blue(); - strip.show(); - } else if (got <= '9' and got >= '0') { - tmp += (got - '0') * col; - col = col * 10; + } else { // not looking for a command + // cr or lf terminates a command. + if (got == '\n' || got == '\r') { + switch (cmd) { + case Top: + if (num > 16) + num = 16; + top_strip(num); + changed = true; + break; + case Bottom: + if (num > 16) + num = 16; + bottom_strip(num); + changed = true; + break; + case Emf: + emf_blue(); + changed = true; + printf("emf_blue\r\n"); + break; + case VfdReset: + vfd_reset(); + break; + case VfdWrite: + send_text(buf); + bufpos = 0; + break; + case VfdPos: + int v,h; + sscanf(buf, "%d,%d", &h,&v); + if (v > 3) v = 0; + if (h > 19) h = 0; + vfd_pos(h, v); + bufpos = 0; + break; + case VfdClear: + vfd_init(); + break; + default: + printf("no command given\r\n"); + } + state = Looking; + cmd = None; + } + if (state == Number) { + if (got >= '0' || got <= '9') { + tmp = (got - 48); + num = (num * 10) + tmp; + } else { + printf("expected a number, got %c\r\n", got); + } + } else if (state == String) { + if (bufpos < 127) { + buf[bufpos] = got; + bufpos++; + buf[bufpos] = '\0'; + } else { + printf("buffer full\r\n!"); + } + } } } if (changed) { + printf("changed\r\n"); led1 = led1 ? 0 : 1; - top_strip(t); - bottom_strip(b); strip.show(); + changed = false; } - int size = eth.receive(); +// int size = eth.receive(); /* if(size > 0) { eth.read(buf, size); printf("Destination: %02X:%02X:%02X:%02X:%02X:%02X\r\n",