The London Hackspace Bandwidth meter, now works over ethernet.

Dependencies:   EthernetInterface LPD8806 Tiny-HTTPD mbed-rtos mbed BonjourLib

Committer:
Jasper
Date:
Fri May 30 03:56:10 2014 +0000
Revision:
0:0e7057b49904
Child:
2:49025fae1e1f
works now.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jasper 0:0e7057b49904 1 #include "mbed.h"
Jasper 0:0e7057b49904 2 #include "EthernetInterface.h"
Jasper 0:0e7057b49904 3 #include "rtos.h"
Jasper 0:0e7057b49904 4 #include "vfd.h"
Jasper 0:0e7057b49904 5 #include "LPD8806.h"
Jasper 0:0e7057b49904 6 #include "HTTPD.h"
Jasper 0:0e7057b49904 7
Jasper 0:0e7057b49904 8 DigitalOut myled(LED1);
Jasper 0:0e7057b49904 9 DigitalOut led2(LED2);
Jasper 0:0e7057b49904 10 DigitalOut led3(LED3);
Jasper 0:0e7057b49904 11
Jasper 0:0e7057b49904 12 LPD8806 strip = LPD8806(32);
Jasper 0:0e7057b49904 13 EthernetInterface eth;
Jasper 0:0e7057b49904 14 HTTPD *httpd;
Jasper 0:0e7057b49904 15
Jasper 0:0e7057b49904 16 //LocalFileSystem local("local");
Jasper 0:0e7057b49904 17
Jasper 0:0e7057b49904 18 void strip_clear() {
Jasper 0:0e7057b49904 19 int i;
Jasper 0:0e7057b49904 20
Jasper 0:0e7057b49904 21 for (i = 0 ; i < strip.numPixels() ; i++) {
Jasper 0:0e7057b49904 22 // clear the strip
Jasper 0:0e7057b49904 23 strip.setPixelColor(i, strip.Color(0, 0, 0));
Jasper 0:0e7057b49904 24 }
Jasper 0:0e7057b49904 25 }
Jasper 0:0e7057b49904 26
Jasper 0:0e7057b49904 27 void setPixelsTop(int start, int end, int colour) {
Jasper 0:0e7057b49904 28 int i;
Jasper 0:0e7057b49904 29
Jasper 0:0e7057b49904 30 for (i = start; i < end + 1 ; i++) {
Jasper 0:0e7057b49904 31 strip.setPixelColor(i, colour);
Jasper 0:0e7057b49904 32 }
Jasper 0:0e7057b49904 33 }
Jasper 0:0e7057b49904 34
Jasper 0:0e7057b49904 35 void setPixelsBottom(int start, int end, int colour) {
Jasper 0:0e7057b49904 36 int i;
Jasper 0:0e7057b49904 37
Jasper 0:0e7057b49904 38 for (i = start; i < end + 1 ; i++) {
Jasper 0:0e7057b49904 39 strip.setPixelColor(16 + i, colour);
Jasper 0:0e7057b49904 40 }
Jasper 0:0e7057b49904 41 }
Jasper 0:0e7057b49904 42
Jasper 0:0e7057b49904 43 /* 0 - 16 */
Jasper 0:0e7057b49904 44 void top_strip(int quantity) {
Jasper 0:0e7057b49904 45 if (quantity < 16) {
Jasper 0:0e7057b49904 46 // blank unused bits.
Jasper 0:0e7057b49904 47 setPixelsTop(quantity, 15, 0);
Jasper 0:0e7057b49904 48 }
Jasper 0:0e7057b49904 49
Jasper 0:0e7057b49904 50 if (quantity == 0) return;
Jasper 0:0e7057b49904 51
Jasper 0:0e7057b49904 52 quantity --;
Jasper 0:0e7057b49904 53
Jasper 0:0e7057b49904 54 setPixelsTop(0, quantity < 12 ? quantity : 11, strip.Color(0, 127, 0));
Jasper 0:0e7057b49904 55
Jasper 0:0e7057b49904 56 if (quantity > 11)
Jasper 0:0e7057b49904 57 setPixelsTop(12, quantity < 14 ? quantity : 14, strip.Color(127, 127, 0));
Jasper 0:0e7057b49904 58
Jasper 0:0e7057b49904 59 if (quantity > 13)
Jasper 0:0e7057b49904 60 setPixelsTop(14, quantity < 16 ? quantity : 16, strip.Color(127, 0, 0));
Jasper 0:0e7057b49904 61 }
Jasper 0:0e7057b49904 62
Jasper 0:0e7057b49904 63 void bottom_strip(int quantity) {
Jasper 0:0e7057b49904 64 if (quantity < 16) {
Jasper 0:0e7057b49904 65 // blank unused bits.
Jasper 0:0e7057b49904 66 setPixelsBottom(quantity, 15, 0);
Jasper 0:0e7057b49904 67 }
Jasper 0:0e7057b49904 68
Jasper 0:0e7057b49904 69 if (quantity == 0) return;
Jasper 0:0e7057b49904 70 quantity --;
Jasper 0:0e7057b49904 71
Jasper 0:0e7057b49904 72 setPixelsBottom(0, quantity < 12 ? quantity : 11, strip.Color(0, 127, 0));
Jasper 0:0e7057b49904 73
Jasper 0:0e7057b49904 74 if (quantity > 11)
Jasper 0:0e7057b49904 75 setPixelsBottom(12, quantity < 14 ? quantity : 14, strip.Color(127, 127, 0));
Jasper 0:0e7057b49904 76
Jasper 0:0e7057b49904 77 if (quantity > 13)
Jasper 0:0e7057b49904 78 setPixelsBottom(14, quantity < 16 ? quantity : 16, strip.Color(127, 0, 0));
Jasper 0:0e7057b49904 79 }
Jasper 0:0e7057b49904 80
Jasper 0:0e7057b49904 81 void emf_blue() {
Jasper 0:0e7057b49904 82 setPixelsBottom(0, 15, strip.Color(0, 161, 228));
Jasper 0:0e7057b49904 83 setPixelsTop(0, 15, strip.Color(0, 161, 228));
Jasper 0:0e7057b49904 84 }
Jasper 0:0e7057b49904 85
Jasper 0:0e7057b49904 86 const static char *ok = "Ok";
Jasper 0:0e7057b49904 87 const static char *fail = "Fail";
Jasper 0:0e7057b49904 88
Jasper 0:0e7057b49904 89 const char* const index_page =
Jasper 0:0e7057b49904 90 "<html><title>LHS Bandwidth Meter</title>"
Jasper 0:0e7057b49904 91 "<body>"
Jasper 0:0e7057b49904 92 "<h1>Bandwidth Meter</h1>"
Jasper 0:0e7057b49904 93 "<h1>Commands:</h1>"
Jasper 0:0e7057b49904 94
Jasper 0:0e7057b49904 95 "<h2>Led Strips:</h2>"
Jasper 0:0e7057b49904 96 "<ul>"
Jasper 0:0e7057b49904 97 "<li>/s/clear - clear the led strips</li>"
Jasper 0:0e7057b49904 98 "<li>/s/t?<i>amount</i> - set the top strip to <i>amount</i> (0-16).</li>"
Jasper 0:0e7057b49904 99 "<li>/s/b?<i>amount</i> - set the bottom strip to <i>amount</i> (0-16).</li>"
Jasper 0:0e7057b49904 100 "<li>/s/set?&lt;t,b&gt;hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh - set the LEDs in the top ('t') or bottom ('b') strip to hhh to colours.</li>"
Jasper 0:0e7057b49904 101 "</ul>"
Jasper 0:0e7057b49904 102 "<p><a href=\"/s/clear\">clear</a></p>"
Jasper 0:0e7057b49904 103
Jasper 0:0e7057b49904 104 "<h2>VFD</h2>"
Jasper 0:0e7057b49904 105 "<ul>"
Jasper 0:0e7057b49904 106 "<li>/v/r - reset the vfd.</li>"
Jasper 0:0e7057b49904 107 "<li>/v/c - clear the vfd.</li>"
Jasper 0:0e7057b49904 108 "<li>/v/p?<i>x,y</i> - set the cursor position to <i>x,y</i>. 0,0 is top left.</li>"
Jasper 0:0e7057b49904 109 "<li>/v/w?<i>text</i> - write <i>text</i> at the current cursor position</li>"
Jasper 0:0e7057b49904 110 "</ul>"
Jasper 0:0e7057b49904 111
Jasper 0:0e7057b49904 112 "</body>"
Jasper 0:0e7057b49904 113 "</html>";
Jasper 0:0e7057b49904 114
Jasper 0:0e7057b49904 115 const char* const text_plain = "Content-Type: text/plain\r\n";
Jasper 0:0e7057b49904 116
Jasper 0:0e7057b49904 117 void callback_static (int id) {
Jasper 0:0e7057b49904 118 char buf[256];
Jasper 0:0e7057b49904 119
Jasper 0:0e7057b49904 120 strcpy(buf, httpd->getFilename(id));
Jasper 0:0e7057b49904 121 printf("static %d %s\r\n", id, buf);
Jasper 0:0e7057b49904 122
Jasper 0:0e7057b49904 123 if (strcmp(buf, "") == 0 || strcmp(buf, "index.html") == 0) {
Jasper 0:0e7057b49904 124 httpd->send(id, index_page, strlen(index_page), "Content-Type: text/html\r\n");
Jasper 0:0e7057b49904 125 } else {
Jasper 0:0e7057b49904 126 httpd->httpdError(id, 404);
Jasper 0:0e7057b49904 127 }
Jasper 0:0e7057b49904 128 }
Jasper 0:0e7057b49904 129
Jasper 0:0e7057b49904 130 void s_clear(int id) {
Jasper 0:0e7057b49904 131 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 132 strip_clear();
Jasper 0:0e7057b49904 133 strip.show();
Jasper 0:0e7057b49904 134 }
Jasper 0:0e7057b49904 135
Jasper 0:0e7057b49904 136 void s_top(int id) {
Jasper 0:0e7057b49904 137 int q;
Jasper 0:0e7057b49904 138
Jasper 0:0e7057b49904 139 q = atoi(httpd->getQueryString(id));
Jasper 0:0e7057b49904 140 if (q < 0 || q > 16) {
Jasper 0:0e7057b49904 141 httpd->send(id, fail, strlen(fail), text_plain);
Jasper 0:0e7057b49904 142 return;
Jasper 0:0e7057b49904 143 }
Jasper 0:0e7057b49904 144
Jasper 0:0e7057b49904 145 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 146 top_strip(q);
Jasper 0:0e7057b49904 147 strip.show();
Jasper 0:0e7057b49904 148 }
Jasper 0:0e7057b49904 149
Jasper 0:0e7057b49904 150 void s_bottom(int id) {
Jasper 0:0e7057b49904 151 int q;
Jasper 0:0e7057b49904 152
Jasper 0:0e7057b49904 153 q = atoi(httpd->getQueryString(id));
Jasper 0:0e7057b49904 154 if (q < 0 || q > 16) {
Jasper 0:0e7057b49904 155 httpd->send(id, fail, strlen(fail), text_plain);
Jasper 0:0e7057b49904 156 return;
Jasper 0:0e7057b49904 157 }
Jasper 0:0e7057b49904 158
Jasper 0:0e7057b49904 159 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 160 bottom_strip(q);
Jasper 0:0e7057b49904 161 strip.show();
Jasper 0:0e7057b49904 162 }
Jasper 0:0e7057b49904 163
Jasper 0:0e7057b49904 164 int hex_char_to_int(char h) {
Jasper 0:0e7057b49904 165 int ret;
Jasper 0:0e7057b49904 166 if (h >= '0' || h <= '9') {
Jasper 0:0e7057b49904 167 ret = h - 48;
Jasper 0:0e7057b49904 168 } else if (h >= 'A' || h <= 'F') {
Jasper 0:0e7057b49904 169 ret = (h - 'A') + 10;
Jasper 0:0e7057b49904 170 } else if (h >= 'a' || h <= 'f') {
Jasper 0:0e7057b49904 171 ret = (h - 'a') + 10;
Jasper 0:0e7057b49904 172 }
Jasper 0:0e7057b49904 173 return ret;
Jasper 0:0e7057b49904 174 }
Jasper 0:0e7057b49904 175
Jasper 0:0e7057b49904 176 void s_set(int id) {
Jasper 0:0e7057b49904 177 int p, r, g, b, poff=0;
Jasper 0:0e7057b49904 178 const char* buf;
Jasper 0:0e7057b49904 179
Jasper 0:0e7057b49904 180 buf = httpd->getQueryString(id);
Jasper 0:0e7057b49904 181
Jasper 0:0e7057b49904 182 if (strlen(buf) != 49) {
Jasper 0:0e7057b49904 183 httpd->send(id, fail, strlen(fail), text_plain);
Jasper 0:0e7057b49904 184 }
Jasper 0:0e7057b49904 185
Jasper 0:0e7057b49904 186 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 187
Jasper 0:0e7057b49904 188 if (buf[0] == 'b') {
Jasper 0:0e7057b49904 189 poff = 16;
Jasper 0:0e7057b49904 190 }
Jasper 0:0e7057b49904 191
Jasper 0:0e7057b49904 192 for (p = 0; p < 16 ; p ++) {
Jasper 0:0e7057b49904 193 r = hex_char_to_int(buf[(p * 3) + 1]);
Jasper 0:0e7057b49904 194 g = hex_char_to_int(buf[(p * 3) + 2]);
Jasper 0:0e7057b49904 195 b = hex_char_to_int(buf[(p * 3) + 3]);
Jasper 0:0e7057b49904 196 strip.setPixelColor(p + poff , strip.Color(r,g,b));
Jasper 0:0e7057b49904 197 }
Jasper 0:0e7057b49904 198
Jasper 0:0e7057b49904 199 strip.show();
Jasper 0:0e7057b49904 200 }
Jasper 0:0e7057b49904 201
Jasper 0:0e7057b49904 202 void s_emf(int id) {
Jasper 0:0e7057b49904 203 emf_blue();
Jasper 0:0e7057b49904 204 strip.show();
Jasper 0:0e7057b49904 205 }
Jasper 0:0e7057b49904 206
Jasper 0:0e7057b49904 207 void v_reset(int id) {
Jasper 0:0e7057b49904 208 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 209 vfd_reset();
Jasper 0:0e7057b49904 210 }
Jasper 0:0e7057b49904 211
Jasper 0:0e7057b49904 212 void v_clear(int id) {
Jasper 0:0e7057b49904 213 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 214 vfd_init();
Jasper 0:0e7057b49904 215 }
Jasper 0:0e7057b49904 216
Jasper 0:0e7057b49904 217 void v_write(int id) {
Jasper 0:0e7057b49904 218 char buf[128];
Jasper 0:0e7057b49904 219
Jasper 0:0e7057b49904 220 if (strlen(httpd->getQueryString(id)) > 127) {
Jasper 0:0e7057b49904 221 httpd->send(id, fail, strlen(fail), text_plain);
Jasper 0:0e7057b49904 222 return;
Jasper 0:0e7057b49904 223 }
Jasper 0:0e7057b49904 224
Jasper 0:0e7057b49904 225 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 226 httpd->urldecode(httpd->getQueryString(id), buf, 128);
Jasper 0:0e7057b49904 227 send_text(buf);
Jasper 0:0e7057b49904 228 }
Jasper 0:0e7057b49904 229
Jasper 0:0e7057b49904 230 void v_position(int id) {
Jasper 0:0e7057b49904 231 unsigned int v,h;
Jasper 0:0e7057b49904 232
Jasper 0:0e7057b49904 233 httpd->send(id, ok, strlen(ok), text_plain);
Jasper 0:0e7057b49904 234
Jasper 0:0e7057b49904 235 sscanf(httpd->getQueryString(id), "%d,%d", &h,&v);
Jasper 0:0e7057b49904 236 if (v > 3) v = 0;
Jasper 0:0e7057b49904 237 if (h > 19) h = 0;
Jasper 0:0e7057b49904 238 vfd_pos(h, v);
Jasper 0:0e7057b49904 239 }
Jasper 0:0e7057b49904 240
Jasper 0:0e7057b49904 241 void v_logo(int id) {
Jasper 0:0e7057b49904 242 vfd_init();
Jasper 0:0e7057b49904 243 logo();
Jasper 0:0e7057b49904 244 }
Jasper 0:0e7057b49904 245
Jasper 0:0e7057b49904 246 int main() {
Jasper 0:0e7057b49904 247
Jasper 0:0e7057b49904 248 led3 = 1;
Jasper 0:0e7057b49904 249
Jasper 0:0e7057b49904 250 printf("Hello World\n\r");
Jasper 0:0e7057b49904 251
Jasper 0:0e7057b49904 252 wait_ms(10);
Jasper 0:0e7057b49904 253 vfd_reset();
Jasper 0:0e7057b49904 254 wait_ms(10);
Jasper 0:0e7057b49904 255 vfd_init();
Jasper 0:0e7057b49904 256 wait_ms(10);
Jasper 0:0e7057b49904 257 logo();
Jasper 0:0e7057b49904 258
Jasper 0:0e7057b49904 259 strip.begin();
Jasper 0:0e7057b49904 260 strip_clear();
Jasper 0:0e7057b49904 261 strip.show();
Jasper 0:0e7057b49904 262
Jasper 0:0e7057b49904 263 eth.init(); //Use DHCP
Jasper 0:0e7057b49904 264 printf("Mac address is %s\n\r", eth.getMACAddress());
Jasper 0:0e7057b49904 265 eth.connect();
Jasper 0:0e7057b49904 266 printf("IP Address is %s\n\r", eth.getIPAddress());
Jasper 0:0e7057b49904 267
Jasper 0:0e7057b49904 268 httpd = new HTTPD;
Jasper 0:0e7057b49904 269
Jasper 0:0e7057b49904 270 led2 = 1;
Jasper 0:0e7057b49904 271
Jasper 0:0e7057b49904 272 // LED strips
Jasper 0:0e7057b49904 273 httpd->attach("/s/t", &s_top);
Jasper 0:0e7057b49904 274 httpd->attach("/s/b", &s_bottom);
Jasper 0:0e7057b49904 275 httpd->attach("/s/clear", &s_clear);
Jasper 0:0e7057b49904 276 httpd->attach("/s/s", &s_set);
Jasper 0:0e7057b49904 277 httpd->attach("/s/e", &s_emf);
Jasper 0:0e7057b49904 278
Jasper 0:0e7057b49904 279 // VFD
Jasper 0:0e7057b49904 280 httpd->attach("/v/r", &v_reset);
Jasper 0:0e7057b49904 281 httpd->attach("/v/c", &v_clear);
Jasper 0:0e7057b49904 282 httpd->attach("/v/w", &v_write);
Jasper 0:0e7057b49904 283 httpd->attach("/v/p", &v_position);
Jasper 0:0e7057b49904 284 httpd->attach("/v/l", &v_logo);
Jasper 0:0e7057b49904 285
Jasper 0:0e7057b49904 286 // httpd->attach("/local/", "/local/");
Jasper 0:0e7057b49904 287
Jasper 0:0e7057b49904 288 httpd->attach("/", &callback_static);
Jasper 0:0e7057b49904 289 httpd->start(80);
Jasper 0:0e7057b49904 290 printf("httpd ready\r\n");
Jasper 0:0e7057b49904 291
Jasper 0:0e7057b49904 292 for (;;) {
Jasper 0:0e7057b49904 293 httpd->poll();
Jasper 0:0e7057b49904 294 if (myled == 0) {
Jasper 0:0e7057b49904 295 myled = 1;
Jasper 0:0e7057b49904 296 } else {
Jasper 0:0e7057b49904 297 myled = 0;
Jasper 0:0e7057b49904 298 }
Jasper 0:0e7057b49904 299 }
Jasper 0:0e7057b49904 300 }