Dependencies:   4DGL mbed

Files at this revision

API Documentation at this revision

Comitter:
kagelump
Date:
Fri Apr 22 00:44:46 2011 +0000
Commit message:

Changed in this revision

4DGL.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r dbe4ead20087 4DGL.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/4DGL.lib	Fri Apr 22 00:44:46 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Kerpower/code/4DGL/#2978d0ac4b79
diff -r 000000000000 -r dbe4ead20087 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Apr 22 00:44:46 2011 +0000
@@ -0,0 +1,273 @@
+#include "mbed.h"
+#include "TFT_4DGL.h"
+
+TFT_4DGL ecran(p13,p14,p15); // serial tx, serial rx, reset pin;
+CAN can(p30, p29);
+DigitalOut led(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+DigitalIn switch_left(p16);
+DigitalIn switch_right(p17);
+Ticker tiktok;
+Ticker can_tok;
+Timer timer;
+int last_seen[10];
+int last_state[2];
+enum boards {
+    CUTOFF,
+    TELEMETRY,
+    MAIN_OUTPUT,
+    MAIN_INPUT,
+    BPS,
+    DATA_LOGGER,
+    TRITIUM
+};
+enum modes {
+    HEARTBEAT,
+    DEMO,
+    FULL_CAN
+};
+char mode = DEMO;
+int speed = 0;
+int percent = 0;
+char s[40][50];
+char needs_update[40];
+int current = 0;
+int j = 0;
+
+void display_can();
+
+int next() {
+    int old = current;
+    current = (current + 1) % 40;
+    return old;
+}
+void demo_update() {
+    char buffer[20];
+    
+    // Speed
+    sprintf(buffer, "%02d", speed);
+    speed = (speed + 1) % 100;
+    ecran.text_mode(1);
+    ecran.graphic_string(buffer, 80, 0, FONT_8X8, WHITE, 5, 5);
+    ecran.graphic_string("Kph", 160, 0, FONT_8X8, WHITE, 2, 2);
+    
+    // Mode
+    if (speed < 25)
+        ecran.graphic_string("P", 0, 0, FONT_8X8, 0xFF0000, 5, 5);
+    else if (speed < 50)
+        ecran.graphic_string("N", 0, 0, FONT_8X8, 0x0000FF, 5, 5);
+    else if (speed < 75)
+        ecran.graphic_string("D", 0, 0, FONT_8X8, 0x00FF00, 5, 5);
+    else
+        ecran.graphic_string("R", 0, 0, FONT_8X8, 0xFF00FF, 5, 5);
+    
+    // Battery
+    percent = (percent + 2) % 100;
+    ecran.pen_size(0);
+    ecran.rectangle(11, 61, (int)(percent * 2.2)+11, 79, 0xFF0000);
+    ecran.rectangle((int)(percent * 2.2)+11, 61, 229, 79, 0x000000);
+    ecran.graphic_string("Battery:", 10, 90, FONT_8X8, WHITE, 2, 2) ;
+    sprintf(buffer, "%02d%%", percent);
+    ecran.graphic_string(buffer, 140, 90, FONT_8X8, WHITE, 2, 2) ;
+    
+    // Logo
+    ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
+    
+    // LED
+    led = !led;
+}
+
+void update() {
+    
+    // Packets
+    ecran.text_mode(1);
+    for(int i = 0; i < 40; i++) {
+        if (needs_update[i]) {
+            needs_update[i] = 0;
+            ecran.text_string(s[i], 0, i, FONT_8X8, WHITE);
+        }
+    }
+    // LED
+    led = !led;
+}
+void heartbeat_update() {
+    ecran.text_mode(1);
+    int t = timer.read_ms();
+    char buffer[255];
+    // Title
+    sprintf(buffer, "Board:      Last Seen (ms)");
+    ecran.text_string(buffer, 0, 0, FONT_8X8, WHITE);
+    // Cutoff
+    sprintf(buffer, "Cutoff:     %d", t - last_seen[CUTOFF]);
+    if (t - last_seen[CUTOFF] > 1000)
+        ecran.text_string(buffer, 0, 2, FONT_8X8, RED);
+    else
+        ecran.text_string(buffer, 0, 2, FONT_8X8, GREEN);
+    // Telemetry
+    sprintf(buffer, "Telemetry   %d", t - last_seen[TELEMETRY]);
+    if (t - last_seen[TELEMETRY] > 1000)
+        ecran.text_string(buffer, 0, 4, FONT_8X8, RED);
+    else
+        ecran.text_string(buffer, 0, 4, FONT_8X8, GREEN);
+    // Main Output
+    sprintf(buffer, "MainOutput  %d", t - last_seen[MAIN_OUTPUT]);
+    if (t - last_seen[MAIN_OUTPUT] > 1000)
+        ecran.text_string(buffer, 0, 6, FONT_8X8, RED);
+    else
+        ecran.text_string(buffer, 0, 6, FONT_8X8, GREEN);
+    // Main Input
+    sprintf(buffer, "MainInput   %d", t - last_seen[MAIN_INPUT]);
+    if (t - last_seen[MAIN_INPUT] > 1000)
+        ecran.text_string(buffer, 0, 8, FONT_8X8, RED);
+    else
+        ecran.text_string(buffer, 0, 8, FONT_8X8, GREEN);
+    // BPS
+    sprintf(buffer, "BPS:        %d", t - last_seen[BPS]);
+    if (t - last_seen[BPS] > 1000)
+        ecran.text_string(buffer, 0, 10, FONT_8X8, RED);
+    else
+        ecran.text_string(buffer, 0, 10, FONT_8X8, GREEN);
+    // Data Logger
+    sprintf(buffer, "DataLogger: %d", t - last_seen[DATA_LOGGER]);
+    if (t - last_seen[DATA_LOGGER] > 1000)
+        ecran.text_string(buffer, 0, 12, FONT_8X8, RED);
+    else
+        ecran.text_string(buffer, 0, 12, FONT_8X8, GREEN);
+    // Tritium
+    sprintf(buffer, "Tritium     %d", t - last_seen[TRITIUM]);
+    if (t - last_seen[TRITIUM] > 1000)
+        ecran.text_string(buffer, 0, 14, FONT_8X8, RED);
+    else
+        ecran.text_string(buffer, 0, 14, FONT_8X8, GREEN);             
+    // LED
+    led = !led;
+}
+
+void display_heartbeats();
+void set_demo() {
+    ecran.cls();
+    ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
+    // Top bar
+    ecran.pen_size(SOLID);
+    ecran.rectangle(0, 40, 240, 42, 0xEEEEEE);
+    
+    // Battery bar
+    ecran.pen_size(1);
+    ecran.rectangle(10, 60, 230, 80, 0xFF0000);
+    tiktok.detach();
+    tiktok.attach(&demo_update, 0.5);
+    mode = DEMO;
+}
+void set_full() {
+    tiktok.detach();
+    tiktok.attach(&update, 0.5);
+    mode = FULL_CAN;
+    ecran.cls();
+    ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
+}
+void set_heartbeat() {
+    tiktok.detach();
+    tiktok.attach(&heartbeat_update, 0.5);
+    mode = HEARTBEAT;
+    ecran.cls();
+    ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
+}
+
+int main() {
+    can.frequency(1000000);
+    switch_left.mode(PullUp);
+    switch_right.mode(PullUp);
+    for (int i = 0; i < 40; i++) {
+        needs_update[i] = 0;
+        s[i][0] = '\0';
+    }
+    ecran.baudrate(115200);
+    timer.start();
+    
+    // Logo
+    ecran.graphic_string("CalSol GFX 2011", 110, 310, FONT_8X8, WHITE, 1, 1);
+    sprintf(s[next()], "Initializing...");
+    
+    tiktok.attach(&update, 0.5);
+    CANMessage msg;    
+    while(1) {
+        int left = switch_left;
+        int right = switch_right;
+        led4 = left;
+        led3 = right;
+        if (last_state[0] != left) {
+            if (left)
+                set_demo();
+            else
+                set_heartbeat();
+            last_state[0] = left;
+        }
+        if (last_state[1] != right) {
+            if (right) 
+                set_demo();
+            else
+                set_full();
+            last_state[1] = right;
+        }
+        if (mode == FULL_CAN)
+            display_can();
+        else if (mode == HEARTBEAT)
+            display_heartbeats();
+    }
+}
+
+void display_heartbeats() {
+    CANMessage msg;
+    int t = timer.read_ms();
+    if (can.read(msg)) {
+        switch(msg.id) {
+            case 0x41:
+                last_seen[BPS] = t;
+                break;
+            case 0x42:
+                last_seen[CUTOFF] = t;
+                break;
+            case 0x43:
+                last_seen[MAIN_OUTPUT] = t;
+                break;
+            case 0x44:
+                last_seen[MAIN_INPUT] = t;
+                break;
+            case 0x45:
+                last_seen[TELEMETRY] = t;
+                break;
+            case 0x46:
+                last_seen[DATA_LOGGER] = t;
+                break;
+            case 0x400:
+                last_seen[TRITIUM] = t;
+                break;
+        }
+        led2 = !led2;
+    }
+}
+
+void display_can() {
+    CANMessage msg;
+    if (can.read(msg)) {
+        int current_index = next();
+        char *current_line = s[current_index];
+        needs_update[current_index] = 1;
+        if (((msg.id & 0x7FF) >= 0x100) && ((msg.id & 0x7FF) <= 0x12F)) {
+            int pack_num = (msg.id & 0x30) >> 4;
+            if ((msg.id & 0xF) <= 0xB) {
+                sprintf(current_line, "Volt %d/%d: %f", pack_num, (msg.id & 0xF), *((float*)msg.data));
+            } else {
+                sprintf(current_line, "Temp %d/%d: %f", pack_num, (msg.id & 0xF) - 0xB, *((float*)msg.data));
+            }
+        } else {
+            sprintf(current_line, "%X(%d):", msg.id & 0x7FF, msg.len);
+            for (int i = 0; i < msg.len; i++) {
+                sprintf(current_line + strlen(current_line), "%2X ", msg.data[i]);
+            }
+        }
+        led2 = !led2;
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r dbe4ead20087 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Apr 22 00:44:46 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e