Ryan Tseng
/
4DGLtest_CalSol
main.cpp@0:dbe4ead20087, 2011-04-22 (annotated)
- Committer:
- kagelump
- Date:
- Fri Apr 22 00:44:46 2011 +0000
- Revision:
- 0:dbe4ead20087
Who changed what in which revision?
User | Revision | Line number | New 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 | } |