Dependencies:   4DGL mbed

Committer:
kagelump
Date:
Fri Apr 22 00:44:46 2011 +0000
Revision:
0:dbe4ead20087

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kagelump 0:dbe4ead20087 1 #include "mbed.h"
kagelump 0:dbe4ead20087 2 #include "TFT_4DGL.h"
kagelump 0:dbe4ead20087 3
kagelump 0:dbe4ead20087 4 TFT_4DGL ecran(p13,p14,p15); // serial tx, serial rx, reset pin;
kagelump 0:dbe4ead20087 5 CAN can(p30, p29);
kagelump 0:dbe4ead20087 6 DigitalOut led(LED1);
kagelump 0:dbe4ead20087 7 DigitalOut led2(LED2);
kagelump 0:dbe4ead20087 8 DigitalOut led3(LED3);
kagelump 0:dbe4ead20087 9 DigitalOut led4(LED4);
kagelump 0:dbe4ead20087 10 DigitalIn switch_left(p16);
kagelump 0:dbe4ead20087 11 DigitalIn switch_right(p17);
kagelump 0:dbe4ead20087 12 Ticker tiktok;
kagelump 0:dbe4ead20087 13 Ticker can_tok;
kagelump 0:dbe4ead20087 14 Timer timer;
kagelump 0:dbe4ead20087 15 int last_seen[10];
kagelump 0:dbe4ead20087 16 int last_state[2];
kagelump 0:dbe4ead20087 17 enum boards {
kagelump 0:dbe4ead20087 18 CUTOFF,
kagelump 0:dbe4ead20087 19 TELEMETRY,
kagelump 0:dbe4ead20087 20 MAIN_OUTPUT,
kagelump 0:dbe4ead20087 21 MAIN_INPUT,
kagelump 0:dbe4ead20087 22 BPS,
kagelump 0:dbe4ead20087 23 DATA_LOGGER,
kagelump 0:dbe4ead20087 24 TRITIUM
kagelump 0:dbe4ead20087 25 };
kagelump 0:dbe4ead20087 26 enum modes {
kagelump 0:dbe4ead20087 27 HEARTBEAT,
kagelump 0:dbe4ead20087 28 DEMO,
kagelump 0:dbe4ead20087 29 FULL_CAN
kagelump 0:dbe4ead20087 30 };
kagelump 0:dbe4ead20087 31 char mode = DEMO;
kagelump 0:dbe4ead20087 32 int speed = 0;
kagelump 0:dbe4ead20087 33 int percent = 0;
kagelump 0:dbe4ead20087 34 char s[40][50];
kagelump 0:dbe4ead20087 35 char needs_update[40];
kagelump 0:dbe4ead20087 36 int current = 0;
kagelump 0:dbe4ead20087 37 int j = 0;
kagelump 0:dbe4ead20087 38
kagelump 0:dbe4ead20087 39 void display_can();
kagelump 0:dbe4ead20087 40
kagelump 0:dbe4ead20087 41 int next() {
kagelump 0:dbe4ead20087 42 int old = current;
kagelump 0:dbe4ead20087 43 current = (current + 1) % 40;
kagelump 0:dbe4ead20087 44 return old;
kagelump 0:dbe4ead20087 45 }
kagelump 0:dbe4ead20087 46 void demo_update() {
kagelump 0:dbe4ead20087 47 char buffer[20];
kagelump 0:dbe4ead20087 48
kagelump 0:dbe4ead20087 49 // Speed
kagelump 0:dbe4ead20087 50 sprintf(buffer, "%02d", speed);
kagelump 0:dbe4ead20087 51 speed = (speed + 1) % 100;
kagelump 0:dbe4ead20087 52 ecran.text_mode(1);
kagelump 0:dbe4ead20087 53 ecran.graphic_string(buffer, 80, 0, FONT_8X8, WHITE, 5, 5);
kagelump 0:dbe4ead20087 54 ecran.graphic_string("Kph", 160, 0, FONT_8X8, WHITE, 2, 2);
kagelump 0:dbe4ead20087 55
kagelump 0:dbe4ead20087 56 // Mode
kagelump 0:dbe4ead20087 57 if (speed < 25)
kagelump 0:dbe4ead20087 58 ecran.graphic_string("P", 0, 0, FONT_8X8, 0xFF0000, 5, 5);
kagelump 0:dbe4ead20087 59 else if (speed < 50)
kagelump 0:dbe4ead20087 60 ecran.graphic_string("N", 0, 0, FONT_8X8, 0x0000FF, 5, 5);
kagelump 0:dbe4ead20087 61 else if (speed < 75)
kagelump 0:dbe4ead20087 62 ecran.graphic_string("D", 0, 0, FONT_8X8, 0x00FF00, 5, 5);
kagelump 0:dbe4ead20087 63 else
kagelump 0:dbe4ead20087 64 ecran.graphic_string("R", 0, 0, FONT_8X8, 0xFF00FF, 5, 5);
kagelump 0:dbe4ead20087 65
kagelump 0:dbe4ead20087 66 // Battery
kagelump 0:dbe4ead20087 67 percent = (percent + 2) % 100;
kagelump 0:dbe4ead20087 68 ecran.pen_size(0);
kagelump 0:dbe4ead20087 69 ecran.rectangle(11, 61, (int)(percent * 2.2)+11, 79, 0xFF0000);
kagelump 0:dbe4ead20087 70 ecran.rectangle((int)(percent * 2.2)+11, 61, 229, 79, 0x000000);
kagelump 0:dbe4ead20087 71 ecran.graphic_string("Battery:", 10, 90, FONT_8X8, WHITE, 2, 2) ;
kagelump 0:dbe4ead20087 72 sprintf(buffer, "%02d%%", percent);
kagelump 0:dbe4ead20087 73 ecran.graphic_string(buffer, 140, 90, FONT_8X8, WHITE, 2, 2) ;
kagelump 0:dbe4ead20087 74
kagelump 0:dbe4ead20087 75 // Logo
kagelump 0:dbe4ead20087 76 ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
kagelump 0:dbe4ead20087 77
kagelump 0:dbe4ead20087 78 // LED
kagelump 0:dbe4ead20087 79 led = !led;
kagelump 0:dbe4ead20087 80 }
kagelump 0:dbe4ead20087 81
kagelump 0:dbe4ead20087 82 void update() {
kagelump 0:dbe4ead20087 83
kagelump 0:dbe4ead20087 84 // Packets
kagelump 0:dbe4ead20087 85 ecran.text_mode(1);
kagelump 0:dbe4ead20087 86 for(int i = 0; i < 40; i++) {
kagelump 0:dbe4ead20087 87 if (needs_update[i]) {
kagelump 0:dbe4ead20087 88 needs_update[i] = 0;
kagelump 0:dbe4ead20087 89 ecran.text_string(s[i], 0, i, FONT_8X8, WHITE);
kagelump 0:dbe4ead20087 90 }
kagelump 0:dbe4ead20087 91 }
kagelump 0:dbe4ead20087 92 // LED
kagelump 0:dbe4ead20087 93 led = !led;
kagelump 0:dbe4ead20087 94 }
kagelump 0:dbe4ead20087 95 void heartbeat_update() {
kagelump 0:dbe4ead20087 96 ecran.text_mode(1);
kagelump 0:dbe4ead20087 97 int t = timer.read_ms();
kagelump 0:dbe4ead20087 98 char buffer[255];
kagelump 0:dbe4ead20087 99 // Title
kagelump 0:dbe4ead20087 100 sprintf(buffer, "Board: Last Seen (ms)");
kagelump 0:dbe4ead20087 101 ecran.text_string(buffer, 0, 0, FONT_8X8, WHITE);
kagelump 0:dbe4ead20087 102 // Cutoff
kagelump 0:dbe4ead20087 103 sprintf(buffer, "Cutoff: %d", t - last_seen[CUTOFF]);
kagelump 0:dbe4ead20087 104 if (t - last_seen[CUTOFF] > 1000)
kagelump 0:dbe4ead20087 105 ecran.text_string(buffer, 0, 2, FONT_8X8, RED);
kagelump 0:dbe4ead20087 106 else
kagelump 0:dbe4ead20087 107 ecran.text_string(buffer, 0, 2, FONT_8X8, GREEN);
kagelump 0:dbe4ead20087 108 // Telemetry
kagelump 0:dbe4ead20087 109 sprintf(buffer, "Telemetry %d", t - last_seen[TELEMETRY]);
kagelump 0:dbe4ead20087 110 if (t - last_seen[TELEMETRY] > 1000)
kagelump 0:dbe4ead20087 111 ecran.text_string(buffer, 0, 4, FONT_8X8, RED);
kagelump 0:dbe4ead20087 112 else
kagelump 0:dbe4ead20087 113 ecran.text_string(buffer, 0, 4, FONT_8X8, GREEN);
kagelump 0:dbe4ead20087 114 // Main Output
kagelump 0:dbe4ead20087 115 sprintf(buffer, "MainOutput %d", t - last_seen[MAIN_OUTPUT]);
kagelump 0:dbe4ead20087 116 if (t - last_seen[MAIN_OUTPUT] > 1000)
kagelump 0:dbe4ead20087 117 ecran.text_string(buffer, 0, 6, FONT_8X8, RED);
kagelump 0:dbe4ead20087 118 else
kagelump 0:dbe4ead20087 119 ecran.text_string(buffer, 0, 6, FONT_8X8, GREEN);
kagelump 0:dbe4ead20087 120 // Main Input
kagelump 0:dbe4ead20087 121 sprintf(buffer, "MainInput %d", t - last_seen[MAIN_INPUT]);
kagelump 0:dbe4ead20087 122 if (t - last_seen[MAIN_INPUT] > 1000)
kagelump 0:dbe4ead20087 123 ecran.text_string(buffer, 0, 8, FONT_8X8, RED);
kagelump 0:dbe4ead20087 124 else
kagelump 0:dbe4ead20087 125 ecran.text_string(buffer, 0, 8, FONT_8X8, GREEN);
kagelump 0:dbe4ead20087 126 // BPS
kagelump 0:dbe4ead20087 127 sprintf(buffer, "BPS: %d", t - last_seen[BPS]);
kagelump 0:dbe4ead20087 128 if (t - last_seen[BPS] > 1000)
kagelump 0:dbe4ead20087 129 ecran.text_string(buffer, 0, 10, FONT_8X8, RED);
kagelump 0:dbe4ead20087 130 else
kagelump 0:dbe4ead20087 131 ecran.text_string(buffer, 0, 10, FONT_8X8, GREEN);
kagelump 0:dbe4ead20087 132 // Data Logger
kagelump 0:dbe4ead20087 133 sprintf(buffer, "DataLogger: %d", t - last_seen[DATA_LOGGER]);
kagelump 0:dbe4ead20087 134 if (t - last_seen[DATA_LOGGER] > 1000)
kagelump 0:dbe4ead20087 135 ecran.text_string(buffer, 0, 12, FONT_8X8, RED);
kagelump 0:dbe4ead20087 136 else
kagelump 0:dbe4ead20087 137 ecran.text_string(buffer, 0, 12, FONT_8X8, GREEN);
kagelump 0:dbe4ead20087 138 // Tritium
kagelump 0:dbe4ead20087 139 sprintf(buffer, "Tritium %d", t - last_seen[TRITIUM]);
kagelump 0:dbe4ead20087 140 if (t - last_seen[TRITIUM] > 1000)
kagelump 0:dbe4ead20087 141 ecran.text_string(buffer, 0, 14, FONT_8X8, RED);
kagelump 0:dbe4ead20087 142 else
kagelump 0:dbe4ead20087 143 ecran.text_string(buffer, 0, 14, FONT_8X8, GREEN);
kagelump 0:dbe4ead20087 144 // LED
kagelump 0:dbe4ead20087 145 led = !led;
kagelump 0:dbe4ead20087 146 }
kagelump 0:dbe4ead20087 147
kagelump 0:dbe4ead20087 148 void display_heartbeats();
kagelump 0:dbe4ead20087 149 void set_demo() {
kagelump 0:dbe4ead20087 150 ecran.cls();
kagelump 0:dbe4ead20087 151 ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
kagelump 0:dbe4ead20087 152 // Top bar
kagelump 0:dbe4ead20087 153 ecran.pen_size(SOLID);
kagelump 0:dbe4ead20087 154 ecran.rectangle(0, 40, 240, 42, 0xEEEEEE);
kagelump 0:dbe4ead20087 155
kagelump 0:dbe4ead20087 156 // Battery bar
kagelump 0:dbe4ead20087 157 ecran.pen_size(1);
kagelump 0:dbe4ead20087 158 ecran.rectangle(10, 60, 230, 80, 0xFF0000);
kagelump 0:dbe4ead20087 159 tiktok.detach();
kagelump 0:dbe4ead20087 160 tiktok.attach(&demo_update, 0.5);
kagelump 0:dbe4ead20087 161 mode = DEMO;
kagelump 0:dbe4ead20087 162 }
kagelump 0:dbe4ead20087 163 void set_full() {
kagelump 0:dbe4ead20087 164 tiktok.detach();
kagelump 0:dbe4ead20087 165 tiktok.attach(&update, 0.5);
kagelump 0:dbe4ead20087 166 mode = FULL_CAN;
kagelump 0:dbe4ead20087 167 ecran.cls();
kagelump 0:dbe4ead20087 168 ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
kagelump 0:dbe4ead20087 169 }
kagelump 0:dbe4ead20087 170 void set_heartbeat() {
kagelump 0:dbe4ead20087 171 tiktok.detach();
kagelump 0:dbe4ead20087 172 tiktok.attach(&heartbeat_update, 0.5);
kagelump 0:dbe4ead20087 173 mode = HEARTBEAT;
kagelump 0:dbe4ead20087 174 ecran.cls();
kagelump 0:dbe4ead20087 175 ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
kagelump 0:dbe4ead20087 176 }
kagelump 0:dbe4ead20087 177
kagelump 0:dbe4ead20087 178 int main() {
kagelump 0:dbe4ead20087 179 can.frequency(1000000);
kagelump 0:dbe4ead20087 180 switch_left.mode(PullUp);
kagelump 0:dbe4ead20087 181 switch_right.mode(PullUp);
kagelump 0:dbe4ead20087 182 for (int i = 0; i < 40; i++) {
kagelump 0:dbe4ead20087 183 needs_update[i] = 0;
kagelump 0:dbe4ead20087 184 s[i][0] = '\0';
kagelump 0:dbe4ead20087 185 }
kagelump 0:dbe4ead20087 186 ecran.baudrate(115200);
kagelump 0:dbe4ead20087 187 timer.start();
kagelump 0:dbe4ead20087 188
kagelump 0:dbe4ead20087 189 // Logo
kagelump 0:dbe4ead20087 190 ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
kagelump 0:dbe4ead20087 191 sprintf(s[next()], "Initializing...");
kagelump 0:dbe4ead20087 192
kagelump 0:dbe4ead20087 193 tiktok.attach(&update, 0.5);
kagelump 0:dbe4ead20087 194 CANMessage msg;
kagelump 0:dbe4ead20087 195 while(1) {
kagelump 0:dbe4ead20087 196 int left = switch_left;
kagelump 0:dbe4ead20087 197 int right = switch_right;
kagelump 0:dbe4ead20087 198 led4 = left;
kagelump 0:dbe4ead20087 199 led3 = right;
kagelump 0:dbe4ead20087 200 if (last_state[0] != left) {
kagelump 0:dbe4ead20087 201 if (left)
kagelump 0:dbe4ead20087 202 set_demo();
kagelump 0:dbe4ead20087 203 else
kagelump 0:dbe4ead20087 204 set_heartbeat();
kagelump 0:dbe4ead20087 205 last_state[0] = left;
kagelump 0:dbe4ead20087 206 }
kagelump 0:dbe4ead20087 207 if (last_state[1] != right) {
kagelump 0:dbe4ead20087 208 if (right)
kagelump 0:dbe4ead20087 209 set_demo();
kagelump 0:dbe4ead20087 210 else
kagelump 0:dbe4ead20087 211 set_full();
kagelump 0:dbe4ead20087 212 last_state[1] = right;
kagelump 0:dbe4ead20087 213 }
kagelump 0:dbe4ead20087 214 if (mode == FULL_CAN)
kagelump 0:dbe4ead20087 215 display_can();
kagelump 0:dbe4ead20087 216 else if (mode == HEARTBEAT)
kagelump 0:dbe4ead20087 217 display_heartbeats();
kagelump 0:dbe4ead20087 218 }
kagelump 0:dbe4ead20087 219 }
kagelump 0:dbe4ead20087 220
kagelump 0:dbe4ead20087 221 void display_heartbeats() {
kagelump 0:dbe4ead20087 222 CANMessage msg;
kagelump 0:dbe4ead20087 223 int t = timer.read_ms();
kagelump 0:dbe4ead20087 224 if (can.read(msg)) {
kagelump 0:dbe4ead20087 225 switch(msg.id) {
kagelump 0:dbe4ead20087 226 case 0x41:
kagelump 0:dbe4ead20087 227 last_seen[BPS] = t;
kagelump 0:dbe4ead20087 228 break;
kagelump 0:dbe4ead20087 229 case 0x42:
kagelump 0:dbe4ead20087 230 last_seen[CUTOFF] = t;
kagelump 0:dbe4ead20087 231 break;
kagelump 0:dbe4ead20087 232 case 0x43:
kagelump 0:dbe4ead20087 233 last_seen[MAIN_OUTPUT] = t;
kagelump 0:dbe4ead20087 234 break;
kagelump 0:dbe4ead20087 235 case 0x44:
kagelump 0:dbe4ead20087 236 last_seen[MAIN_INPUT] = t;
kagelump 0:dbe4ead20087 237 break;
kagelump 0:dbe4ead20087 238 case 0x45:
kagelump 0:dbe4ead20087 239 last_seen[TELEMETRY] = t;
kagelump 0:dbe4ead20087 240 break;
kagelump 0:dbe4ead20087 241 case 0x46:
kagelump 0:dbe4ead20087 242 last_seen[DATA_LOGGER] = t;
kagelump 0:dbe4ead20087 243 break;
kagelump 0:dbe4ead20087 244 case 0x400:
kagelump 0:dbe4ead20087 245 last_seen[TRITIUM] = t;
kagelump 0:dbe4ead20087 246 break;
kagelump 0:dbe4ead20087 247 }
kagelump 0:dbe4ead20087 248 led2 = !led2;
kagelump 0:dbe4ead20087 249 }
kagelump 0:dbe4ead20087 250 }
kagelump 0:dbe4ead20087 251
kagelump 0:dbe4ead20087 252 void display_can() {
kagelump 0:dbe4ead20087 253 CANMessage msg;
kagelump 0:dbe4ead20087 254 if (can.read(msg)) {
kagelump 0:dbe4ead20087 255 int current_index = next();
kagelump 0:dbe4ead20087 256 char *current_line = s[current_index];
kagelump 0:dbe4ead20087 257 needs_update[current_index] = 1;
kagelump 0:dbe4ead20087 258 if (((msg.id & 0x7FF) >= 0x100) && ((msg.id & 0x7FF) <= 0x12F)) {
kagelump 0:dbe4ead20087 259 int pack_num = (msg.id & 0x30) >> 4;
kagelump 0:dbe4ead20087 260 if ((msg.id & 0xF) <= 0xB) {
kagelump 0:dbe4ead20087 261 sprintf(current_line, "Volt %d/%d: %f", pack_num, (msg.id & 0xF), *((float*)msg.data));
kagelump 0:dbe4ead20087 262 } else {
kagelump 0:dbe4ead20087 263 sprintf(current_line, "Temp %d/%d: %f", pack_num, (msg.id & 0xF) - 0xB, *((float*)msg.data));
kagelump 0:dbe4ead20087 264 }
kagelump 0:dbe4ead20087 265 } else {
kagelump 0:dbe4ead20087 266 sprintf(current_line, "%X(%d):", msg.id & 0x7FF, msg.len);
kagelump 0:dbe4ead20087 267 for (int i = 0; i < msg.len; i++) {
kagelump 0:dbe4ead20087 268 sprintf(current_line + strlen(current_line), "%2X ", msg.data[i]);
kagelump 0:dbe4ead20087 269 }
kagelump 0:dbe4ead20087 270 }
kagelump 0:dbe4ead20087 271 led2 = !led2;
kagelump 0:dbe4ead20087 272 }
kagelump 0:dbe4ead20087 273 }