The London Hackspace Bandwidth meter, now works over ethernet.

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

Committer:
Jasper
Date:
Fri May 30 09:45:45 2014 +0000
Revision:
4:d522cfa6e410
Parent:
0:0e7057b49904
commiting for some reason?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jasper 0:0e7057b49904 1 /*
Jasper 0:0e7057b49904 2 * The VFD code
Jasper 0:0e7057b49904 3 *
Jasper 0:0e7057b49904 4 * for a futuba M204LD01AA
Jasper 0:0e7057b49904 5 *
Jasper 0:0e7057b49904 6 *
Jasper 0:0e7057b49904 7 * p27 -> input, busy
Jasper 0:0e7057b49904 8 * p28 -> serial data in
Jasper 0:0e7057b49904 9 * p29 -> clock
Jasper 0:0e7057b49904 10 * p30 -> latch
Jasper 0:0e7057b49904 11 *
Jasper 0:0e7057b49904 12 *
Jasper 0:0e7057b49904 13 */
Jasper 0:0e7057b49904 14
Jasper 0:0e7057b49904 15 #include "mbed.h"
Jasper 0:0e7057b49904 16 #include "vfd.h"
Jasper 0:0e7057b49904 17 //#include "Stream.h"
Jasper 0:0e7057b49904 18 //#include "FunctionPointer.h"
Jasper 0:0e7057b49904 19
Jasper 0:0e7057b49904 20 // InturruptIn busy_intr(p27)
Jasper 0:0e7057b49904 21
Jasper 0:0e7057b49904 22 DigitalIn vfd_p_busy(p27);
Jasper 0:0e7057b49904 23 DigitalOut vfd_p_data(p28);
Jasper 0:0e7057b49904 24 DigitalOut vfd_p_clock(p29);
Jasper 0:0e7057b49904 25 DigitalOut vfd_p_latch(p30);
Jasper 0:0e7057b49904 26
Jasper 0:0e7057b49904 27 /* current state */
Jasper 0:0e7057b49904 28 int c_data;
Jasper 0:0e7057b49904 29 bool c_a0;
Jasper 0:0e7057b49904 30 bool c_blank;
Jasper 0:0e7057b49904 31
Jasper 0:0e7057b49904 32 bool vfd_dead = 0;
Jasper 0:0e7057b49904 33
Jasper 0:0e7057b49904 34 void vfd_shift_clock(void) {
Jasper 0:0e7057b49904 35 vfd_p_clock = 0;
Jasper 0:0e7057b49904 36 wait_us(10);
Jasper 0:0e7057b49904 37 vfd_p_clock = 1;
Jasper 0:0e7057b49904 38 wait_us(10);
Jasper 0:0e7057b49904 39 }
Jasper 0:0e7057b49904 40
Jasper 0:0e7057b49904 41 void vfd_doit(int data, int mode, int wr, int ss, int reset) {
Jasper 0:0e7057b49904 42 int i, bit;
Jasper 0:0e7057b49904 43
Jasper 0:0e7057b49904 44 vfd_p_data = 0; // nc
Jasper 0:0e7057b49904 45 vfd_shift_clock();
Jasper 0:0e7057b49904 46 vfd_p_data = 0; // nc
Jasper 0:0e7057b49904 47 vfd_shift_clock();
Jasper 0:0e7057b49904 48
Jasper 0:0e7057b49904 49 vfd_p_data = reset; // reset, 0 = in reset
Jasper 0:0e7057b49904 50 vfd_shift_clock();
Jasper 0:0e7057b49904 51
Jasper 0:0e7057b49904 52 vfd_p_data = c_blank; // Blank, 0 = blanked
Jasper 0:0e7057b49904 53 vfd_shift_clock();
Jasper 0:0e7057b49904 54
Jasper 0:0e7057b49904 55 vfd_p_data = ss; // SS, clockish
Jasper 0:0e7057b49904 56 vfd_shift_clock();
Jasper 0:0e7057b49904 57
Jasper 0:0e7057b49904 58 vfd_p_data = 1; // rd
Jasper 0:0e7057b49904 59 vfd_shift_clock();
Jasper 0:0e7057b49904 60
Jasper 0:0e7057b49904 61 vfd_p_data = mode; // A0, data/command
Jasper 0:0e7057b49904 62 vfd_shift_clock();
Jasper 0:0e7057b49904 63
Jasper 0:0e7057b49904 64 vfd_p_data = wr; // WR
Jasper 0:0e7057b49904 65 vfd_shift_clock();
Jasper 0:0e7057b49904 66
Jasper 0:0e7057b49904 67 for (i = 0 ; i < 8; i++) {
Jasper 0:0e7057b49904 68 bit = (data & (1 << i)) >> i;
Jasper 0:0e7057b49904 69 vfd_p_data = bit;
Jasper 0:0e7057b49904 70 vfd_shift_clock();
Jasper 0:0e7057b49904 71 }
Jasper 0:0e7057b49904 72
Jasper 0:0e7057b49904 73 vfd_p_latch = 0;
Jasper 0:0e7057b49904 74 wait_us(10);
Jasper 0:0e7057b49904 75 vfd_p_latch = 1;
Jasper 0:0e7057b49904 76 wait_us(10);
Jasper 0:0e7057b49904 77 }
Jasper 0:0e7057b49904 78
Jasper 0:0e7057b49904 79 /* mode == 1 if command */
Jasper 0:0e7057b49904 80 void vfd_send(int data, int mode, int force)
Jasper 0:0e7057b49904 81 {
Jasper 0:0e7057b49904 82 data = data & 0xff;
Jasper 0:0e7057b49904 83 c_data = data;
Jasper 0:0e7057b49904 84 c_blank = 1;
Jasper 0:0e7057b49904 85
Jasper 0:0e7057b49904 86 // if (mode == 0)
Jasper 0:0e7057b49904 87 // printf("%02x ", data);
Jasper 0:0e7057b49904 88
Jasper 0:0e7057b49904 89 if (vfd_dead && ! force) {
Jasper 0:0e7057b49904 90 printf("vfd dead (?), not sending.\r\n");
Jasper 0:0e7057b49904 91 return;
Jasper 0:0e7057b49904 92 }
Jasper 0:0e7057b49904 93 if (force)
Jasper 0:0e7057b49904 94 printf("forcing vfd for 0x%02x %d\r\n", data, mode);
Jasper 0:0e7057b49904 95
Jasper 0:0e7057b49904 96 if (vfd_p_busy) {
Jasper 0:0e7057b49904 97 printf("pre, busy: %d\r\n", vfd_p_busy.read());
Jasper 0:0e7057b49904 98 }
Jasper 0:0e7057b49904 99
Jasper 0:0e7057b49904 100 if (vfd_p_busy)
Jasper 0:0e7057b49904 101 {
Jasper 0:0e7057b49904 102 wait_ms(4); // should loop, 3.1 ms is max according to the data sheet.
Jasper 0:0e7057b49904 103 if (vfd_p_busy)
Jasper 0:0e7057b49904 104 {
Jasper 0:0e7057b49904 105 printf("still busy :(\r\n");
Jasper 0:0e7057b49904 106 printf("resetting\r\n");
Jasper 0:0e7057b49904 107 if (!force)
Jasper 0:0e7057b49904 108 vfd_reset();
Jasper 0:0e7057b49904 109 if (vfd_p_busy) {
Jasper 0:0e7057b49904 110 printf("still busy after reset!\r\n");
Jasper 0:0e7057b49904 111 if (!force)
Jasper 0:0e7057b49904 112 return;
Jasper 0:0e7057b49904 113 }
Jasper 0:0e7057b49904 114 if (!force)
Jasper 0:0e7057b49904 115 return;
Jasper 0:0e7057b49904 116 }
Jasper 0:0e7057b49904 117 }
Jasper 0:0e7057b49904 118
Jasper 0:0e7057b49904 119 /* wr,ss */
Jasper 0:0e7057b49904 120 vfd_doit(data, mode, 0, 0, 1);
Jasper 0:0e7057b49904 121 wait_us(1);
Jasper 0:0e7057b49904 122 vfd_doit(data, mode, 1, 0, 1);
Jasper 0:0e7057b49904 123 wait_us(1);
Jasper 0:0e7057b49904 124 vfd_doit(data, mode, 1, 1, 1);
Jasper 0:0e7057b49904 125 wait_us(1);
Jasper 0:0e7057b49904 126
Jasper 0:0e7057b49904 127 if (vfd_p_busy)
Jasper 0:0e7057b49904 128 printf("post1, busy: %d\r\n", vfd_p_busy.read());
Jasper 0:0e7057b49904 129
Jasper 0:0e7057b49904 130 vfd_doit(data, mode, 0, 0, 1);
Jasper 0:0e7057b49904 131
Jasper 0:0e7057b49904 132 if (vfd_p_busy)
Jasper 0:0e7057b49904 133 printf("post2, busy: %d\r\n", vfd_p_busy.read());
Jasper 0:0e7057b49904 134
Jasper 0:0e7057b49904 135 // loop and wait for not busy
Jasper 0:0e7057b49904 136 while (vfd_p_busy) {
Jasper 0:0e7057b49904 137 wait_us(250);
Jasper 0:0e7057b49904 138 printf("post-while, busy: %d\r\n", vfd_p_busy.read());
Jasper 0:0e7057b49904 139 }
Jasper 0:0e7057b49904 140 }
Jasper 0:0e7057b49904 141
Jasper 0:0e7057b49904 142 void vfd_command(int data, int force) {
Jasper 0:0e7057b49904 143 vfd_send(data, 1, force);
Jasper 0:0e7057b49904 144 }
Jasper 0:0e7057b49904 145
Jasper 0:0e7057b49904 146 void vfd_data(int data) {
Jasper 0:0e7057b49904 147 if ((data & 0xff) == 0x7f) {
Jasper 0:0e7057b49904 148 data = 0x20;
Jasper 0:0e7057b49904 149 printf("changed data to %02x\r\n", data);
Jasper 0:0e7057b49904 150 }
Jasper 0:0e7057b49904 151 vfd_send(data, 0, 0);
Jasper 0:0e7057b49904 152 }
Jasper 0:0e7057b49904 153
Jasper 0:0e7057b49904 154 void vfd_init(void) {
Jasper 0:0e7057b49904 155 vfd_data(0x11); // normal mode
Jasper 0:0e7057b49904 156 vfd_data(0x0c); // clear
Jasper 0:0e7057b49904 157 vfd_data(0x1b); // esc
Jasper 0:0e7057b49904 158 vfd_data(0); // v pos
Jasper 0:0e7057b49904 159 vfd_data(0); // h pos
Jasper 0:0e7057b49904 160 }
Jasper 0:0e7057b49904 161
Jasper 0:0e7057b49904 162 void vfd_blank(void) {
Jasper 0:0e7057b49904 163 /* blank */
Jasper 0:0e7057b49904 164 }
Jasper 0:0e7057b49904 165
Jasper 0:0e7057b49904 166 void vfd_show(void) {
Jasper 0:0e7057b49904 167 /* unblank */
Jasper 0:0e7057b49904 168 }
Jasper 0:0e7057b49904 169
Jasper 0:0e7057b49904 170 void vfd_pos(int h, int v) {
Jasper 0:0e7057b49904 171 if (v > 3 || v < 0)
Jasper 0:0e7057b49904 172 return;
Jasper 0:0e7057b49904 173 if (h > 19 || h < 0)
Jasper 0:0e7057b49904 174 return;
Jasper 0:0e7057b49904 175 vfd_data(0x1b);
Jasper 0:0e7057b49904 176 vfd_data(v);
Jasper 0:0e7057b49904 177 vfd_data(h);
Jasper 0:0e7057b49904 178 }
Jasper 0:0e7057b49904 179
Jasper 0:0e7057b49904 180 void vfd_reset(void) {
Jasper 0:0e7057b49904 181 int i, data, mode;
Jasper 0:0e7057b49904 182
Jasper 0:0e7057b49904 183 data = 0; mode = 1;
Jasper 0:0e7057b49904 184
Jasper 0:0e7057b49904 185 printf("reset sent, busy: %d\r\n", vfd_p_busy.read());
Jasper 0:0e7057b49904 186
Jasper 0:0e7057b49904 187 /* everything low, includeing reset */
Jasper 0:0e7057b49904 188 for (i = 0 ; i < 16; i++) {
Jasper 0:0e7057b49904 189 vfd_p_data = 0;
Jasper 0:0e7057b49904 190 vfd_shift_clock();
Jasper 0:0e7057b49904 191 }
Jasper 0:0e7057b49904 192 vfd_p_latch = 0;
Jasper 0:0e7057b49904 193 wait_us(10);
Jasper 0:0e7057b49904 194 vfd_p_latch = 1;
Jasper 0:0e7057b49904 195
Jasper 0:0e7057b49904 196 vfd_doit(data, mode, 0, 0, 1);
Jasper 0:0e7057b49904 197 wait_us(1);
Jasper 0:0e7057b49904 198 vfd_doit(data, mode, 1, 0, 1);
Jasper 0:0e7057b49904 199 wait_us(1);
Jasper 0:0e7057b49904 200 vfd_doit(data, mode, 1, 1, 1);
Jasper 0:0e7057b49904 201 wait_us(1);
Jasper 0:0e7057b49904 202
Jasper 0:0e7057b49904 203 if (vfd_p_busy)
Jasper 0:0e7057b49904 204 printf("post1, busy: %d\r\n", vfd_p_busy.read());
Jasper 0:0e7057b49904 205
Jasper 0:0e7057b49904 206 vfd_doit(data, mode, 0, 0, 1);
Jasper 0:0e7057b49904 207 wait_ms(4); // loop and wait for not busy
Jasper 0:0e7057b49904 208
Jasper 0:0e7057b49904 209 printf("reset sent, busy: %d\r\n", vfd_p_busy.read());
Jasper 0:0e7057b49904 210 wait_ms(10);
Jasper 0:0e7057b49904 211 if (vfd_p_busy) {
Jasper 0:0e7057b49904 212 printf("still busy, not calling vfd_init()\r\n");
Jasper 0:0e7057b49904 213 vfd_reset_cmd();
Jasper 0:0e7057b49904 214 printf("post reset_cmd\r\n");
Jasper 0:0e7057b49904 215 if (vfd_p_busy) {
Jasper 0:0e7057b49904 216 printf("Also still busy, marking as dead\r\n");
Jasper 0:0e7057b49904 217 vfd_dead = 1;
Jasper 0:0e7057b49904 218 } else {
Jasper 0:0e7057b49904 219 vfd_init();
Jasper 0:0e7057b49904 220 }
Jasper 0:0e7057b49904 221 wait_ms(10);
Jasper 0:0e7057b49904 222 } else {
Jasper 0:0e7057b49904 223 if (!vfd_dead)
Jasper 0:0e7057b49904 224 vfd_init();
Jasper 0:0e7057b49904 225 }
Jasper 0:0e7057b49904 226 }
Jasper 0:0e7057b49904 227
Jasper 0:0e7057b49904 228 void vfd_reset_cmd(void) {
Jasper 0:0e7057b49904 229 vfd_command(0xff, 1);
Jasper 0:0e7057b49904 230 }
Jasper 0:0e7057b49904 231
Jasper 0:0e7057b49904 232 void send_text(const char *s) {
Jasper 0:0e7057b49904 233 int i; char c;
Jasper 0:0e7057b49904 234
Jasper 0:0e7057b49904 235 for (i = 0, c=s[i]; c != 0; i++, c=s[i])
Jasper 0:0e7057b49904 236 vfd_data(c);
Jasper 0:0e7057b49904 237 }
Jasper 0:0e7057b49904 238
Jasper 0:0e7057b49904 239 void text_centered(const char *s, int hpos) {
Jasper 0:0e7057b49904 240
Jasper 0:0e7057b49904 241 vfd_pos((20 / 2) - (strlen(s)) / 2, hpos);
Jasper 0:0e7057b49904 242 send_text(s);
Jasper 0:0e7057b49904 243 }
Jasper 0:0e7057b49904 244
Jasper 0:0e7057b49904 245 void logo(void) {
Jasper 0:0e7057b49904 246 const char line0[] = "Welcome to";
Jasper 0:0e7057b49904 247 const char line2[] = "London Hackspace";
Jasper 0:0e7057b49904 248
Jasper 0:0e7057b49904 249 text_centered(line0, 0);
Jasper 0:0e7057b49904 250 text_centered(line2, 2);
Jasper 0:0e7057b49904 251 }
Jasper 0:0e7057b49904 252
Jasper 0:0e7057b49904 253 /*
Jasper 0:0e7057b49904 254 class Vfd : Public Stream {
Jasper 0:0e7057b49904 255 public:
Jasper 0:0e7057b49904 256
Jasper 0:0e7057b49904 257
Jasper 0:0e7057b49904 258 }
Jasper 0:0e7057b49904 259 */
Jasper 0:0e7057b49904 260
Jasper 0:0e7057b49904 261