Interface layer for the mbed boards ready for the JAVA library

Dependencies:   C12832 LM75B MMA7660 mbed FXOS8700Q

Fork of frdm_serial by Michael Berry

main.cpp

Committer:
azazeal88
Date:
2015-11-20
Revision:
1:38f32fc3db2c
Parent:
0:6891aea05ef2
Child:
2:2dcdbb85cae0

File content as of revision 1:38f32fc3db2c:

#include "mbed.h"
#include "C12832.h"
#include "LM75B.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);

//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);

//FLAGS

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

//COMMS

Serial pc(USBTX, USBRX);

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;
    }
    pc.printf(val?"t;":"f;");
}

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() {
    //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);
    
    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(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(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;
        }
        
        //Check for host requests
        if(pc.readable()) {
            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;
            }
        }
    }
}