Interface layer for the mbed boards ready for the JAVA library
Dependencies: C12832 LM75B MMA7660 mbed FXOS8700Q
Fork of frdm_serial by
Diff: main.cpp
- 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(";"); } } }