The London Hackspace bandwidth meter

Dependencies:   LPD8806 MODSERIAL mbed picojson

See:

Committer:
Jasper
Date:
Sun Oct 21 09:49:41 2012 +0000
Revision:
7:68a26efc1d02
Parent:
6:7e7b4c5d0ba6
Child:
8:add24f73747b
fix setstrip

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jasper 0:0a6f193d5344 1 #include "mbed.h"
Jasper 3:7fca72f96711 2 #include "ctype.h"
Jasper 0:0a6f193d5344 3
Jasper 0:0a6f193d5344 4 #include "LPD8806.h"
Jasper 3:7fca72f96711 5 #include "vfd.h"
Jasper 0:0a6f193d5344 6
Jasper 0:0a6f193d5344 7 DigitalOut led1(LED1);
Jasper 0:0a6f193d5344 8 DigitalOut led2(LED2);
Jasper 0:0a6f193d5344 9 DigitalOut led3(LED3);
Jasper 0:0a6f193d5344 10 DigitalOut led4(LED4);
Jasper 0:0a6f193d5344 11
Jasper 1:e384e7146746 12 /* talk to the world */
Jasper 1:e384e7146746 13 Serial pc(USBTX, USBRX);
Jasper 0:0a6f193d5344 14
Jasper 1:e384e7146746 15 LPD8806 strip = LPD8806(32);
Jasper 0:0a6f193d5344 16
Jasper 0:0a6f193d5344 17 void setPixelsTop(int start, int end, int colour) {
Jasper 0:0a6f193d5344 18 int i;
Jasper 0:0a6f193d5344 19
Jasper 0:0a6f193d5344 20 for (i = start; i < end + 1 ; i++) {
Jasper 0:0a6f193d5344 21 strip.setPixelColor(i, colour);
Jasper 0:0a6f193d5344 22 }
Jasper 0:0a6f193d5344 23 }
Jasper 0:0a6f193d5344 24
Jasper 0:0a6f193d5344 25 void setPixelsBottom(int start, int end, int colour) {
Jasper 0:0a6f193d5344 26 int i;
Jasper 0:0a6f193d5344 27
Jasper 0:0a6f193d5344 28 for (i = start; i < end + 1 ; i++) {
Jasper 0:0a6f193d5344 29 strip.setPixelColor(16 + i, colour);
Jasper 0:0a6f193d5344 30 }
Jasper 0:0a6f193d5344 31 }
Jasper 0:0a6f193d5344 32
Jasper 1:e384e7146746 33 /* 0 - 16 */
Jasper 1:e384e7146746 34 void top_strip(int quantity){
Jasper 1:e384e7146746 35 if (quantity < 16) {
Jasper 1:e384e7146746 36 // blank unused bits.
Jasper 4:7087ea3d13c1 37 setPixelsTop(quantity, 15, 0);
Jasper 1:e384e7146746 38 }
Jasper 1:e384e7146746 39
Jasper 1:e384e7146746 40 if (quantity == 0) return;
Jasper 1:e384e7146746 41
Jasper 1:e384e7146746 42 quantity --;
Jasper 1:e384e7146746 43
Jasper 1:e384e7146746 44 setPixelsTop(0, quantity < 12 ? quantity : 11, strip.Color(0, 127, 0));
Jasper 1:e384e7146746 45
Jasper 1:e384e7146746 46 if (quantity > 11)
Jasper 1:e384e7146746 47 setPixelsTop(12, quantity < 14 ? quantity : 14, strip.Color(127, 127, 0));
Jasper 1:e384e7146746 48
Jasper 1:e384e7146746 49 if (quantity > 13)
Jasper 1:e384e7146746 50 setPixelsTop(14, quantity < 16 ? quantity : 16, strip.Color(127, 0, 0));
Jasper 1:e384e7146746 51 }
Jasper 1:e384e7146746 52
Jasper 1:e384e7146746 53 void bottom_strip(int quantity){
Jasper 1:e384e7146746 54 if (quantity < 16) {
Jasper 1:e384e7146746 55 // blank unused bits.
Jasper 4:7087ea3d13c1 56 setPixelsBottom(quantity, 15, 0);
Jasper 1:e384e7146746 57 }
Jasper 1:e384e7146746 58
Jasper 1:e384e7146746 59 if (quantity == 0) return;
Jasper 1:e384e7146746 60 quantity --;
Jasper 1:e384e7146746 61
Jasper 1:e384e7146746 62 setPixelsBottom(0, quantity < 12 ? quantity : 11, strip.Color(0, 127, 0));
Jasper 1:e384e7146746 63
Jasper 1:e384e7146746 64 if (quantity > 11)
Jasper 1:e384e7146746 65 setPixelsBottom(12, quantity < 14 ? quantity : 14, strip.Color(127, 127, 0));
Jasper 1:e384e7146746 66
Jasper 1:e384e7146746 67 if (quantity > 13)
Jasper 1:e384e7146746 68 setPixelsBottom(14, quantity < 16 ? quantity : 16, strip.Color(127, 0, 0));
Jasper 1:e384e7146746 69 }
Jasper 1:e384e7146746 70
Jasper 3:7fca72f96711 71 void emf_blue() {
Jasper 3:7fca72f96711 72 setPixelsBottom(0, 15, strip.Color(0, 161, 228));
Jasper 3:7fca72f96711 73 setPixelsTop(0, 15, strip.Color(0, 161, 228));
Jasper 3:7fca72f96711 74 }
Jasper 3:7fca72f96711 75
Jasper 4:7087ea3d13c1 76 void strip_clear() {
Jasper 4:7087ea3d13c1 77 int i;
Jasper 4:7087ea3d13c1 78
Jasper 4:7087ea3d13c1 79 for (i = 0 ; i < strip.numPixels() ; i++) {
Jasper 4:7087ea3d13c1 80 // clear the strip
Jasper 4:7087ea3d13c1 81 strip.setPixelColor(i, 0);
Jasper 4:7087ea3d13c1 82 }
Jasper 4:7087ea3d13c1 83 }
Jasper 4:7087ea3d13c1 84
Jasper 1:e384e7146746 85 #define s_looking 1
Jasper 1:e384e7146746 86 #define s_top 2
Jasper 1:e384e7146746 87 #define s_bottom 3
Jasper 1:e384e7146746 88
Jasper 4:7087ea3d13c1 89 void send_text(const char *s) {
Jasper 4:7087ea3d13c1 90 int i; char c;
Jasper 4:7087ea3d13c1 91
Jasper 4:7087ea3d13c1 92 for (i = 0, c=s[i]; c != 0; i++, c=s[i])
Jasper 4:7087ea3d13c1 93 vfd_data(c);
Jasper 4:7087ea3d13c1 94 }
Jasper 4:7087ea3d13c1 95
Jasper 4:7087ea3d13c1 96 void text_centered(const char *s, int hpos) {
Jasper 4:7087ea3d13c1 97
Jasper 4:7087ea3d13c1 98 vfd_pos((20 / 2) - (strlen(s)) / 2, hpos);
Jasper 4:7087ea3d13c1 99 send_text(s);
Jasper 4:7087ea3d13c1 100 }
Jasper 4:7087ea3d13c1 101
Jasper 5:24172484b8c5 102 void logo(void) {
Jasper 4:7087ea3d13c1 103 const char line0[] = "Welcome to";
Jasper 5:24172484b8c5 104 const char line2[] = "London Hackspace";
Jasper 4:7087ea3d13c1 105
Jasper 4:7087ea3d13c1 106 text_centered(line0, 0);
Jasper 4:7087ea3d13c1 107 text_centered(line2, 2);
Jasper 4:7087ea3d13c1 108 }
Jasper 4:7087ea3d13c1 109
Jasper 5:24172484b8c5 110 int hex_char_to_int(char h) {
Jasper 5:24172484b8c5 111 int ret;
Jasper 5:24172484b8c5 112 if (h >= '0' || h <= '9') {
Jasper 5:24172484b8c5 113 ret = h - 48;
Jasper 5:24172484b8c5 114 } else if (h >= 'A' || h <= 'F') {
Jasper 5:24172484b8c5 115 ret = (h - 'A') + 10;
Jasper 5:24172484b8c5 116 } else if (h >= 'a' || h <= 'f') {
Jasper 5:24172484b8c5 117 ret = (h - 'a') + 10;
Jasper 5:24172484b8c5 118 }
Jasper 5:24172484b8c5 119 return ret;
Jasper 5:24172484b8c5 120 }
Jasper 5:24172484b8c5 121
Jasper 0:0a6f193d5344 122 int main() {
Jasper 4:7087ea3d13c1 123
Jasper 4:7087ea3d13c1 124 setbuf(stdout, NULL);
Jasper 3:7fca72f96711 125
Jasper 3:7fca72f96711 126 pc.printf("Hello!\r\n");
Jasper 3:7fca72f96711 127
Jasper 4:7087ea3d13c1 128 wait_ms(10);
Jasper 4:7087ea3d13c1 129 vfd_reset();
Jasper 4:7087ea3d13c1 130 wait_ms(10);
Jasper 3:7fca72f96711 131 vfd_init();
Jasper 4:7087ea3d13c1 132 wait_ms(10);
Jasper 5:24172484b8c5 133 logo();
Jasper 4:7087ea3d13c1 134 wait_ms(10);
Jasper 0:0a6f193d5344 135
Jasper 0:0a6f193d5344 136 strip.begin();
Jasper 4:7087ea3d13c1 137 pc.printf("post strip.begin\r\n");
Jasper 4:7087ea3d13c1 138 strip_clear();
Jasper 4:7087ea3d13c1 139 strip.show();
Jasper 4:7087ea3d13c1 140 pc.printf("post strip.show\r\n");
Jasper 0:0a6f193d5344 141
Jasper 4:7087ea3d13c1 142 int tmp = 0;
Jasper 4:7087ea3d13c1 143 bool changed = false;
Jasper 4:7087ea3d13c1 144 char got;
Jasper 4:7087ea3d13c1 145 char buf[128];
Jasper 4:7087ea3d13c1 146 int bufpos = 0;
Jasper 4:7087ea3d13c1 147
Jasper 4:7087ea3d13c1 148 enum state {Looking, Number, String, Cmd};
Jasper 5:24172484b8c5 149 enum cmd {None, Top, Bottom, VfdWrite, VfdPos, Emf, VfdReset, VfdClear, SetStrip};
Jasper 4:7087ea3d13c1 150 state state;
Jasper 4:7087ea3d13c1 151 cmd cmd;
Jasper 4:7087ea3d13c1 152 state = Looking;
Jasper 4:7087ea3d13c1 153 cmd = None;
Jasper 4:7087ea3d13c1 154 int num = 0;
Jasper 0:0a6f193d5344 155
Jasper 0:0a6f193d5344 156 while(1) {
Jasper 0:0a6f193d5344 157
Jasper 1:e384e7146746 158 if (pc.readable()) {
Jasper 1:e384e7146746 159 got = pc.getc();
Jasper 5:24172484b8c5 160 if (isprint(got)) {
Jasper 5:24172484b8c5 161 // pc.putc(got); // remote echo
Jasper 5:24172484b8c5 162 } else {
Jasper 5:24172484b8c5 163 pc.printf("%02x ", got);
Jasper 5:24172484b8c5 164 }
Jasper 1:e384e7146746 165 changed = false;
Jasper 4:7087ea3d13c1 166
Jasper 4:7087ea3d13c1 167 if (state == Looking) {
Jasper 4:7087ea3d13c1 168 switch (got) {
Jasper 4:7087ea3d13c1 169 case 't':
Jasper 4:7087ea3d13c1 170 state = Number;
Jasper 4:7087ea3d13c1 171 num = 0;
Jasper 4:7087ea3d13c1 172 cmd = Top;
Jasper 4:7087ea3d13c1 173 break;
Jasper 4:7087ea3d13c1 174 case 'b':
Jasper 4:7087ea3d13c1 175 state = Number;
Jasper 4:7087ea3d13c1 176 num = 0;
Jasper 4:7087ea3d13c1 177 cmd = Bottom;
Jasper 4:7087ea3d13c1 178 break;
Jasper 5:24172484b8c5 179 case 'e': // emf blue...
Jasper 4:7087ea3d13c1 180 cmd = Emf;
Jasper 4:7087ea3d13c1 181 state = Cmd;
Jasper 4:7087ea3d13c1 182 break;
Jasper 4:7087ea3d13c1 183 case 'r':
Jasper 4:7087ea3d13c1 184 cmd = VfdReset;
Jasper 4:7087ea3d13c1 185 state = Cmd;
Jasper 4:7087ea3d13c1 186 break;
Jasper 4:7087ea3d13c1 187 case 'w':
Jasper 4:7087ea3d13c1 188 cmd = VfdWrite;
Jasper 4:7087ea3d13c1 189 state = String;
Jasper 4:7087ea3d13c1 190 bufpos = 0;
Jasper 4:7087ea3d13c1 191 break;
Jasper 4:7087ea3d13c1 192 case 'p':
Jasper 4:7087ea3d13c1 193 cmd = VfdPos;
Jasper 4:7087ea3d13c1 194 state = String;
Jasper 4:7087ea3d13c1 195 bufpos = 0;
Jasper 4:7087ea3d13c1 196 break;
Jasper 4:7087ea3d13c1 197 case 'c':
Jasper 4:7087ea3d13c1 198 cmd = VfdClear;
Jasper 4:7087ea3d13c1 199 state = Cmd;
Jasper 4:7087ea3d13c1 200 break;
Jasper 5:24172484b8c5 201 case 's':
Jasper 5:24172484b8c5 202 cmd = SetStrip;
Jasper 5:24172484b8c5 203 state = String;
Jasper 5:24172484b8c5 204 bufpos = 0;
Jasper 5:24172484b8c5 205 break;
Jasper 3:7fca72f96711 206 }
Jasper 4:7087ea3d13c1 207 } else { // not looking for a command
Jasper 4:7087ea3d13c1 208 // cr or lf terminates a command.
Jasper 4:7087ea3d13c1 209 if (got == '\n' || got == '\r') {
Jasper 4:7087ea3d13c1 210 switch (cmd) {
Jasper 4:7087ea3d13c1 211 case Top:
Jasper 4:7087ea3d13c1 212 if (num > 16)
Jasper 4:7087ea3d13c1 213 num = 16;
Jasper 4:7087ea3d13c1 214 top_strip(num);
Jasper 4:7087ea3d13c1 215 changed = true;
Jasper 4:7087ea3d13c1 216 break;
Jasper 4:7087ea3d13c1 217 case Bottom:
Jasper 4:7087ea3d13c1 218 if (num > 16)
Jasper 4:7087ea3d13c1 219 num = 16;
Jasper 4:7087ea3d13c1 220 bottom_strip(num);
Jasper 4:7087ea3d13c1 221 changed = true;
Jasper 4:7087ea3d13c1 222 break;
Jasper 4:7087ea3d13c1 223 case Emf:
Jasper 4:7087ea3d13c1 224 emf_blue();
Jasper 4:7087ea3d13c1 225 changed = true;
Jasper 4:7087ea3d13c1 226 printf("emf_blue\r\n");
Jasper 4:7087ea3d13c1 227 break;
Jasper 4:7087ea3d13c1 228 case VfdReset:
Jasper 4:7087ea3d13c1 229 vfd_reset();
Jasper 4:7087ea3d13c1 230 break;
Jasper 4:7087ea3d13c1 231 case VfdWrite:
Jasper 4:7087ea3d13c1 232 send_text(buf);
Jasper 4:7087ea3d13c1 233 bufpos = 0;
Jasper 4:7087ea3d13c1 234 break;
Jasper 4:7087ea3d13c1 235 case VfdPos:
Jasper 4:7087ea3d13c1 236 int v,h;
Jasper 4:7087ea3d13c1 237 sscanf(buf, "%d,%d", &h,&v);
Jasper 4:7087ea3d13c1 238 if (v > 3) v = 0;
Jasper 4:7087ea3d13c1 239 if (h > 19) h = 0;
Jasper 4:7087ea3d13c1 240 vfd_pos(h, v);
Jasper 4:7087ea3d13c1 241 bufpos = 0;
Jasper 4:7087ea3d13c1 242 break;
Jasper 4:7087ea3d13c1 243 case VfdClear:
Jasper 4:7087ea3d13c1 244 vfd_init();
Jasper 4:7087ea3d13c1 245 break;
Jasper 5:24172484b8c5 246 case SetStrip:
Jasper 5:24172484b8c5 247 bufpos = 0;
Jasper 5:24172484b8c5 248 printf("SetStrip: %s\r\n", buf);
Jasper 5:24172484b8c5 249 // buf[0] == t or b for strip
Jasper 5:24172484b8c5 250 // next 48 chars == HHH rgb * 16
Jasper 7:68a26efc1d02 251 int p, endp, r, g, b, poff=16;
Jasper 7:68a26efc1d02 252 p = 0; endp = p + 16;
Jasper 7:68a26efc1d02 253 if (buf[0] == 'b') {
Jasper 7:68a26efc1d02 254 poff = 16;
Jasper 5:24172484b8c5 255 }
Jasper 5:24172484b8c5 256
Jasper 5:24172484b8c5 257 for (;p < endp ; p ++) {
Jasper 5:24172484b8c5 258 r = hex_char_to_int(buf[(p * 3) + 1]);
Jasper 5:24172484b8c5 259 g = hex_char_to_int(buf[(p * 3) + 2]);
Jasper 5:24172484b8c5 260 b = hex_char_to_int(buf[(p * 3) + 3]);
Jasper 7:68a26efc1d02 261 strip.setPixelColor(p + poff , strip.Color(r,g,b));
Jasper 5:24172484b8c5 262 }
Jasper 5:24172484b8c5 263 changed = true;
Jasper 5:24172484b8c5 264
Jasper 5:24172484b8c5 265 break;
Jasper 4:7087ea3d13c1 266 default:
Jasper 4:7087ea3d13c1 267 printf("no command given\r\n");
Jasper 4:7087ea3d13c1 268 }
Jasper 4:7087ea3d13c1 269 state = Looking;
Jasper 4:7087ea3d13c1 270 cmd = None;
Jasper 4:7087ea3d13c1 271 }
Jasper 4:7087ea3d13c1 272 if (state == Number) {
Jasper 4:7087ea3d13c1 273 if (got >= '0' || got <= '9') {
Jasper 4:7087ea3d13c1 274 tmp = (got - 48);
Jasper 4:7087ea3d13c1 275 num = (num * 10) + tmp;
Jasper 4:7087ea3d13c1 276 } else {
Jasper 4:7087ea3d13c1 277 printf("expected a number, got %c\r\n", got);
Jasper 4:7087ea3d13c1 278 }
Jasper 4:7087ea3d13c1 279 } else if (state == String) {
Jasper 4:7087ea3d13c1 280 if (bufpos < 127) {
Jasper 4:7087ea3d13c1 281 buf[bufpos] = got;
Jasper 4:7087ea3d13c1 282 bufpos++;
Jasper 4:7087ea3d13c1 283 buf[bufpos] = '\0';
Jasper 4:7087ea3d13c1 284 } else {
Jasper 4:7087ea3d13c1 285 printf("buffer full\r\n!");
Jasper 5:24172484b8c5 286 // XXX state == None here?
Jasper 4:7087ea3d13c1 287 }
Jasper 4:7087ea3d13c1 288 }
Jasper 1:e384e7146746 289 }
Jasper 1:e384e7146746 290 }
Jasper 1:e384e7146746 291 if (changed)
Jasper 0:0a6f193d5344 292 {
Jasper 4:7087ea3d13c1 293 printf("changed\r\n");
Jasper 2:81155674a852 294 led1 = led1 ? 0 : 1;
Jasper 0:0a6f193d5344 295 strip.show();
Jasper 4:7087ea3d13c1 296 changed = false;
Jasper 0:0a6f193d5344 297 }
Jasper 0:0a6f193d5344 298 }
Jasper 0:0a6f193d5344 299 }