The London Hackspace bandwidth meter

Dependencies:   LPD8806 MODSERIAL mbed picojson

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }