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:
1:38f32fc3db2c
Parent:
0:6891aea05ef2
Child:
2:2dcdbb85cae0
--- a/main.cpp	Mon Nov 02 17:29:26 2015 +0000
+++ b/main.cpp	Fri Nov 20 15:50:38 2015 +0000
@@ -1,146 +1,242 @@
+#include "mbed.h"
 #include "C12832.h"
 #include "LM75B.h"
-#include <string> 
-#include "mbed.h"
+#include "MMA7660.h"
+#include "FXOS8700CQ.h"
+
+//OUTPUTS
+
+PwmOut lr(LED_RED), lg(LED_GREEN), lb(LED_BLUE), xr(D5), xg(D9), xb(PTC12);
+C12832 lcd(D11, D13, D12, D7, D10);
 
-DigitalOut led_red (LED_RED);
-DigitalOut led_green (LED_GREEN);
-DigitalOut led_blue (LED_BLUE);
+//INPUTS
+
+LM75B temp(D14, D15);
+MMA7660 accel(SDA,SCL);
+FXOS8700CQ magAccel(SDA,SCL,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(A2A3, left(A4), right(A5), fire(D5);
+
+AnalogIn pot1(A0), pot2(A1);
 
-DigitalOut xr_led (D5);
-DigitalOut xg_led (D9);
-DigitalOut xb_led (PTC12);
-
-Ticker tempSender;
+//FLAGS
 
-int sw2_down, sw2_up, sw3_down, sw3_up, temp_flag;
+uint16_t flags;
+#define SW2_DOWN   0x0001
+#define SW2_UP     0x0002
+#define SW3_UP     0x0004
+#define SW3_DOWN   0x0008
+#define UP_UP      0x0010
+#define UP_DOWN    0x0020
+#define DOWN_UP    0x0040
+#define DOWN_DOWN  0x0080
+#define LEFT_UP    0x0100
+#define LEFT_DOWN  0x0200
+#define RIGHT_UP   0x0400
+#define RIGHT_DOWN 0x0800
+#define FIRE_UP    0x1000
+#define FIRE_DOWN  0x2000
 
-C12832 lcd(D11, D13, D12, D7, D10);
-LM75B lm_temp (D14, D15);
-InterruptIn sw2_int (PTC6);             /* interrupts for the two on-board switches */
-InterruptIn sw3_int (PTA4);
+//COMMS
 
 Serial pc(USBTX, USBRX);
 
-void parse(string buf) {
-    if (buf.find("ldg")==0) {
-        led_green = 1-strtod(buf.substr(3).c_str(), NULL);
-    }
-    else if (buf.find("ldb")==0) {
-        led_blue = 1-strtod(buf.substr(3).c_str(), NULL);
-    }
-    else if (buf.find("ldr")==0) {
-        led_red = 1-strtod(buf.substr(3).c_str(), NULL);
-    }
-    if (buf.find("xdg")==0) {
-        xg_led = 1-strtod(buf.substr(3).c_str(), NULL);
-    }
-    else if (buf.find("xdb")==0) {
-        xb_led = 1-strtod(buf.substr(3).c_str(), NULL);
+void sw2Down(){ flags |= SW2_DOWN; }
+void sw2Up()  { flags |= SW2_UP; }
+
+void sw3Down(){ flags |= SW3_DOWN; }
+void sw3Up()  { flags |= SW3_UP; }
+
+void upDown(){ flags |= UP_DOWN; }
+void upUp()  { flags |= UP_UP; }
+
+void downDown(){ flags |= DOWN_DOWN; }
+void downUp()  { flags |= DOWN_UP; }
+
+void leftDown(){ flags |= LEFT_DOWN; }
+void leftUp()  { flags |= LEFT_UP; }
+
+void rightDown(){ flags |= RIGHT_DOWN; }
+void rightUp()  { flags |= RIGHT_UP; }
+
+void fireDown(){ flags |= FIRE_DOWN; }
+void fireUp()  { flags |= FIRE_UP; }
+
+void readDigitalIn() {
+    bool val;
+    switch(pc.getc()) {
+        case '2': val=sw2; break;
+        case '3': val=sw3 break;
+        case 'u': val=up; break;
+        case 'd': val=down; break;
+        case 'l': val=left; break;
+        case 'r': val=right; break;
+        case 'f': val=fire; break;
+        default: return;
     }
-    else if (buf.find("xdr")==0) {
-        xr_led = 1-strtod(buf.substr(3).c_str(), NULL);
-    }
-    else if (buf.find("lcdclr")==0) {
-        lcd.cls();
-    }
-    else if (buf.find("lcdloc")==0) {
-        string coord = buf.substr(6);
-        string x = buf.substr(0,buf.find(","));
-        string y = buf.substr(buf.find(","));
-        lcd.locate(atoi(x.c_str()),atoi(y.c_str()));    
-    }
-    else if(buf.find("lcdprn")==0) {
-        lcd.printf(buf.substr(6).c_str());
-    }
-    else if(buf.find("temp")==0) {
-        pc.printf("%f", lm_temp.read());
-        pc.printf(";");
-    }
+    pc.printf(val?"t;":"f;");
 }
 
-void sendTemp(void)
-{
-    temp_flag = 1;
-}
-
-void sw2Down (void)
-{
-    sw2_down = 1;
-}
- 
- 
-void sw2Up (void)
-{
-    sw2_up = 1;
-}
-
-void sw3Down (void)
-{
-    sw3_down = 1;
-}
- 
- 
-void sw3Up (void)
-{
-    sw3_up = 1;
+void readPot() {
+    float val;
+    switch(pc.getc()) {
+        case '1': val=pot1; break;
+        case '2': val=pot2; break;
+        default: return;
+    }
+    pc.printf("%6.4f;",val);
 }
 
 int main() {
-    xb_led = 0;
-    xr_led = 0;
-    xg_led = 0;
-    led_red=0;
-    led_green=0;
-    led_blue=0;
+    //SETUP
+    
+    xr = xg = xb = 0;
+    lr = lg = lb = 0;
     
     sw2_int.mode (PullUp);
-    
     sw2_int.fall(&sw2Down);
     sw2_int.rise(&sw2Up);
     
     sw3_int.mode (PullUp);
-    
     sw3_int.fall(&sw3Down);
     sw3_int.rise(&sw3Up);
     
+    up_int.mode (PullUp);
+    up_int.fall(&upDown);
+    up_int.rise(&upUp);
+    up_int.disable_irq();
+    
+    down_int.mode (PullUp);
+    down_int.fall(&downDown);
+    down_int.rise(&downUp);
+    
+    left_int.mode (PullUp);
+    left_int.fall(&leftDown);
+    left_int.rise(&leftUp);
+    
+    right_int.mode (PullUp);
+    right_int.fall(&rightDown);
+    right_int.rise(&rightUp);
+    
+    fire_int.mode (PullUp);
+    fire_int.fall(&fireDown);
+    fire_int.rise(&fireUp);
+   
     tempSender.attach(&sendTemp, 2.0);
     
     pc.baud(115200);
-    pc.printf("%f", lm_temp.read());
-    pc.printf(";");
-    string buf;
-    while (true) {
-        if(sw2_down) {
-            pc.printf("2d;");
-            sw2_down = 0;
+    
+    for(;;) {
+        //Check for interrupts
+        if(flags&SW2_UP) {
+            pc.printf("!2u;"); flags&=!SW2_UP;
+        }
+        if(flags&SW2_DOWN) {
+            pc.printf("!2d;"); flags&=!SW2_DOWN;
+        }
+        if(flags&SW3_UP) {
+            pc.printf("!3u;"); flags&=!SW3_UP;
+        }
+        if(flags&SW3_DOWN) {
+            pc.printf("!3d;"); flags&=!SW3_DOWN;
+        }
+        if(flags&UP_UP) {
+            pc.printf("!uu;"); flags&=!UP_UP;
+        }
+        if(flags&UP_DOWN) {
+            pc.printf("!ud;"); flags&=!UP_DOWN;
         }
-        if(sw2_up) {
-            pc.printf("2u;");
-            sw2_up = 0;
+        if(flags&DOWN_UP) {
+            pc.printf("!du;"); flags&=!DOWN_UP;
+        }
+        if(flags&DOWN_DOWN) {
+            pc.printf("!dd;"); flags&=!DOWN_DOWN;
+        }
+        if(flags&LEFT_UP) {
+            pc.printf("!lu;"); flags&=!LEFT_UP;
+        }
+        if(flags&LEFT_DOWN) {
+            pc.printf("!ld;"); flags&=!LEFT_DOWN;
         }
-        if(sw3_down) {
-            pc.printf("3d;");
-            sw3_down = 0;
+        if(flags&RIGHT_UP) {
+            pc.printf("!ru;"); flags&=!RIGHT_UP;
+        }
+        if(flags&RIGHT_DOWN) {
+            pc.printf("!rd;"); flags&=!RIGHT_DOWN;
+        }
+        if(flags&FIRE_UP) {
+            pc.printf("!fu;"); flags&=!FIRE_UP;
+        }
+        if(flags&FIRE_DOWN) {
+            pc.printf("!fd;"); flags&=!FIRE_DOWN;
         }
-        if(sw3_up) {
-            pc.printf("3u;");
-            sw3_up = 0;
-        }
+        
+        //Check for host requests
         if(pc.readable()) {
-            char x = pc.getc();
-            if(x==';') {
-                parse(buf);
-                buf = "";
+            switch(pc.getc()) {
+                case 'R': { //read digital input
+                    readDigitalIn();
+                    break;
+                }
+                case 'p': {
+                    readPot();
+                }
+                case 't': { //read temp
+                    pc.printf("%.4f;",temp.temp());
+                    break;
+                }
+                case 'a': {//read shield accel
+                    pc.printf("%.4f;%.4f;%.4f;",accel.x(),accel.y(),accel.z());
+                    break;
+                }
+                case 'l': { //shield led
+                    float r, g, b;
+                    pc.scanf("%f;%f;%f", &r, &g, &b);
+                    xr = r; xg = g; xb = b;
+                    break;
+                }
+                case 'L': { // board led
+                    float r, g, b;
+                    pc.scanf("%f;%f;%f", &r, &g, &b);
+                    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);
+                    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);
+                    break;
+                }
+                case 'P': { //set lcd position
+                    int x, y;
+                    pc.scanf("%d;%d", &x, &y);
+                    lcd.locate(x,y);
+                }
+                case 'S': { //print lcd text
+                    int x, y;
+                    char c = pc.getc();
+                    while(c!='"') {
+                        if(c=='\\') lcd.putc(pc.getc());
+                        else lcd.putc(c);
+                    }
+                }
+                case 'D': { //print lcd text
+                    int x, y, c;
+                    pc.scanf("%d;%d;%d", &x, &y, &c);
+                    lcd.pixel(x,y,c);
+                }
+                case 'C': { //clear lcd
+                    lcd.cls();
+                }
+                default: break;
             }
-            else {
-                buf += x;
-            }
-        }
-        if(temp_flag) {
-            temp_flag=0;
-            pc.printf("%f", lm_temp.read());
-            pc.printf(";");
         }
     }
 }