The London Hackspace bandwidth meter

Dependencies:   LPD8806 MODSERIAL mbed picojson

See:

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",