Interface layer for the mbed boards ready for the JAVA library

Dependencies:   C12832 LM75B MMA7660 mbed FXOS8700Q

Fork of frdm_serial by Michael Berry

Revision:
3:990f8380da21
Parent:
2:2dcdbb85cae0
Child:
4:39e949908fc5
--- a/main.cpp	Fri Nov 20 22:10:58 2015 +0000
+++ b/main.cpp	Tue Nov 24 20:30:53 2015 +0000
@@ -6,7 +6,8 @@
 
 //OUTPUTS
 
-PwmOut lr(LED_RED), lg(LED_GREEN), lb(LED_BLUE), xr(D5), xg(D9), xb(PTC12);
+DigitalOut lr(PTB22), lg(PTE26), lb(PTB21);
+PwmOut xr(D5), xg(D9), xb(D8);
 C12832 lcd(D11, D13, D12, D7, D10);
 
 //INPUTS
@@ -15,12 +16,12 @@
 MMA7660 accel(D14, D15);
 FXOS8700CQ magAccel(D14, D15, FXOS8700CQ_SLAVE_ADDR1);
 
-InterruptIn sw2_int(PTC6), sw3_int(PTA4), up_int(A2), down_int(A3), left_int(A4), right_int(A5), fire_int(D5);
-DigitalIn sw2(PTC6), sw3(PTA4), up(A2), down(A3), left(A4), right(A5), fire(D5);
+InterruptIn sw2_int(SW2), sw3_int(SW3), up_int(A2), down_int(A3), left_int(A4), right_int(A5), fire_int(D4);
+DigitalIn   sw2(SW2),     sw3(SW3),     up(A2),     down(A3),     left(A4),     right(A5),     fire(D4);
 
 AnalogIn pot1(A0), pot2(A1);
 
-//FLAGS
+//INTERRUPT FLAGS
 
 uint16_t flags;
 #define SW2_DOWN   0x0001
@@ -96,11 +97,61 @@
     pc.printf("%6.4f;",val);
 }
 
-int main() {
+//BLOCK LEVEL READ & WRITE
+
+void sendData(void* data, int len) {
+    for(char* c = (char*)data;len--;)
+        pc.putc(*(c++));
+}
+
+void readData(void* data, int len) {
+    char* c = (char*)data;
+    while(len>0) {
+        *c = pc.getc();
+        c++;
+        len--;
+    }
+}
+
+//PRETTY WAITING LEDS (Modified from Fred Barnes)
+
+Ticker waitTicker;
+int ctr;
+
+uint8_t brilvl(int offset) {
+    if(offset>311) offset-=312;
+    if (offset < 52) return (uint8_t)(offset * 5);
+    if (offset < 156) return 255;
+    if (offset < 208) return (uint8_t)((207 - offset) * 5);
+    return 0;
+}
+
+void waitTick() {
+    ctr++;//
+//    if (ctr > 311) {
+//        ctr -= 312;
+//    }
+//    xr = brilvl(  ctr  )/255.0;
+//    xg = brilvl(ctr+104)/255.0;
+//    xb = brilvl(ctr+208)/255.0;
+    xr = 1;
+    xg = 1;
+    xb = 0;
+}
+
+void cleanup() {
+    lr = lg = lb = 1;
+    xr = xg = xb = 1;
+    temp.read();
+    lcd.cls();
+    pc.putc('+');
+}
+
+int main() {  
     //SETUP
+    pc.baud(9600);
     
-    xr = xg = xb = 0;
-    lr = lg = lb = 0;
+    lr = lg = lb = 1;
     
     sw2_int.mode (PullUp);
     sw2_int.fall(&sw2Down);
@@ -131,118 +182,174 @@
     fire_int.fall(&fireDown);
     fire_int.rise(&fireUp);
     
-    pc.baud(115200);
+    //Pretty wait
+    ctr=0;
+    lcd.locate(0,0);
+    lcd.printf("Awaiting connection...");
+    waitTicker.attach(&waitTick,0.02);
+    while(pc.getc()!='-');
+    waitTicker.detach();
+    cleanup();
+    
+    union {
+        float f;
+        int i;
+        char c[4];
+    } val;
     
     for(;;) {
         //Check if any interrupts fired
         if(flags&SW2_UP) {
-            pc.printf("!2u;"); flags&=!SW2_UP;
+            flags&=!SW2_UP;
+            pc.printf("!2u");
         }
         if(flags&SW2_DOWN) {
-            pc.printf("!2d;"); flags&=!SW2_DOWN;
+            flags&=!SW2_DOWN;
+            pc.printf("!2d");
         }
         if(flags&SW3_UP) {
-            pc.printf("!3u;"); flags&=!SW3_UP;
+            flags&=!SW3_UP;
+            pc.printf("!3u");
         }
         if(flags&SW3_DOWN) {
-            pc.printf("!3d;"); flags&=!SW3_DOWN;
+            flags&=!SW3_DOWN;
+            pc.printf("!3d");
         }
         if(flags&UP_UP) {
-            pc.printf("!uu;"); flags&=!UP_UP;
+            flags&=!UP_UP;
+            pc.printf("!uu");
         }
         if(flags&UP_DOWN) {
-            pc.printf("!ud;"); flags&=!UP_DOWN;
+            flags&=!UP_DOWN;
+            pc.printf("!ud");
         }
         if(flags&DOWN_UP) {
-            pc.printf("!du;"); flags&=!DOWN_UP;
+            flags&=!DOWN_UP;
+            pc.printf("!du");
         }
         if(flags&DOWN_DOWN) {
-            pc.printf("!dd;"); flags&=!DOWN_DOWN;
+            flags&=!DOWN_DOWN;
+            pc.printf("!dd");
         }
         if(flags&LEFT_UP) {
-            pc.printf("!lu;"); flags&=!LEFT_UP;
+            flags&=!LEFT_UP;
+            pc.printf("!lu");
         }
         if(flags&LEFT_DOWN) {
-            pc.printf("!ld;"); flags&=!LEFT_DOWN;
+            flags&=!LEFT_DOWN;
+            pc.printf("!ld");
         }
         if(flags&RIGHT_UP) {
-            pc.printf("!ru;"); flags&=!RIGHT_UP;
+            flags&=!RIGHT_UP;
+            pc.printf("!ru");
         }
         if(flags&RIGHT_DOWN) {
-            pc.printf("!rd;"); flags&=!RIGHT_DOWN;
+            flags&=!RIGHT_DOWN;
+            pc.printf("!rd");
         }
         if(flags&FIRE_UP) {
-            pc.printf("!fu;"); flags&=!FIRE_UP;
+            flags&=!FIRE_UP;
+            pc.printf("!fu");
         }
         if(flags&FIRE_DOWN) {
-            pc.printf("!fd;"); flags&=!FIRE_DOWN;
+            flags&=!FIRE_DOWN;
+            pc.printf("!fd");
         }
         
         //Check for host requests
         if(pc.readable()) {
-            switch(pc.getc()) {
+            char cmd = pc.getc();
+            switch(cmd) {
                 case 'R': { //read digital input
                     readDigitalIn();
                     break;
                 }
                 case 'p': {
                     readPot();
+                    break;
                 }
                 case 't': { //read temp
-                    pc.printf("%.4f;",temp.read());
+                    float t = temp.read();
+                    sendData(&t,4);
                     break;
                 }
                 case 'a': {//read shield accel
-                    pc.printf("%.4f;%.4f;%.4f;",accel.x(),accel.y(),accel.z());
+                    float x, y, z;
+                    x = accel.x();
+                    y = accel.y();
+                    z = accel.z();
+                    sendData(&x,4);
+                    sendData(&y,4);
+                    sendData(&z,4);
                     break;
                 }
                 case 'l': { //shield led
                     float r, g, b;
-                    pc.scanf("%f;%f;%f", &r, &g, &b);
-                    xr = r; xg = g; xb = b;
+                    readData(&r,4);
+                    readData(&g,4);
+                    readData(&b,4);
+                    xr = 1.0f-r; xg = 1.0f-g; xb = 1.0f-b;
                     break;
                 }
                 case 'L': { // board led
-                    float r, g, b;
-                    pc.scanf("%f;%f;%f", &r, &g, &b);
+                    char raw = pc.getc();
+                    char r = ((raw>>2)&1)?0:1;
+                    char g = ((raw>>1)&1)?0:1;
+                    char b = (raw&1)?0:1;
                     lr = r; lg = g; lb = b;
                     break;
                 }
                 case 'M': { //read board magno
                     SRAWDATA m, a;
                     magAccel.get_data(&a,&m);
-                    pc.printf("%d;%d;%d;",m.x,m.y,m.z);
+                    sendData(&m.x,2);
+                    sendData(&m.y,2);
+                    sendData(&m.z,2);
                     break;
                 }
                 case 'A': { //read board accel
                     SRAWDATA m, a;
                     magAccel.get_data(&a,&m);
-                    pc.printf("%d;%d;%d;",a.x,a.y,a.z);
+                    sendData(&a.x,2);
+                    sendData(&a.y,2);
+                    sendData(&a.z,2);
                     break;
                 }
                 case 'P': { //set lcd position
-                    int x, y;
-                    pc.scanf("%d;%d", &x, &y);
+                    unsigned char x, y;
+                    x = pc.getc();
+                    y = pc.getc();
                     lcd.locate(x,y);
+                    break;
                 }
                 case 'S': { //print lcd text
-                    char c = pc.getc();
-                    while(c!='"') {
-                        if(c=='\\') lcd.putc(pc.getc());
-                        else lcd.putc(c);
+                    char buff[256];
+                    unsigned char len = pc.getc();
+                    char * j= buff;
+                    while(len>0) {
+                        *j++=pc.getc();
+                        len--;
                     }
+                    *j=0;
+                    lcd.printf(buff);
+                    break;
                 }
-                case 'D': { //print lcd text
-                    int x, y, c;
-                    pc.scanf("%d;%d;%d", &x, &y, &c);
+                case 'D': { //set lcd pixel
+                    char x = pc.getc();
+                    char y = pc.getc();
+                    char c = pc.getc();
                     lcd.pixel(x,y,c);
+                    break;
                 }
                 case 'C': { //clear lcd
                     lcd.cls();
+                    break;
+                }
+                case '-': { //reconnection
+                    cleanup(); break;
                 }
                 default: break;
             }
         }
     }
 }
-