Interface layer for the mbed boards ready for the JAVA library
Dependencies: C12832 LM75B MMA7660 mbed FXOS8700Q
Fork of frdm_serial by
main.cpp
- Committer:
- Condo2k4
- Date:
- 2015-11-24
- Revision:
- 3:990f8380da21
- Parent:
- 2:2dcdbb85cae0
- Child:
- 4:39e949908fc5
File content as of revision 3:990f8380da21:
#include "mbed.h" #include "C12832.h" #include "LM75B.h" #include "MMA7660.h" #include "FXOS8700CQ.h" //OUTPUTS DigitalOut lr(PTB22), lg(PTE26), lb(PTB21); PwmOut xr(D5), xg(D9), xb(D8); C12832 lcd(D11, D13, D12, D7, D10); //INPUTS LM75B temp(D14, D15); MMA7660 accel(D14, D15); FXOS8700CQ magAccel(D14, D15, FXOS8700CQ_SLAVE_ADDR1); 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); //INTERRUPT 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); //INTERRUPT HANDLERS 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; } /* Return the state of a requested pin */ 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;"); } /* Return the state of a requested potentiometer */ void readPot() { float val; switch(pc.getc()) { case '1': val=pot1; break; case '2': val=pot2; break; default: return; } pc.printf("%6.4f;",val); } //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); lr = lg = lb = 1; 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); //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) { flags&=!SW2_UP; pc.printf("!2u"); } if(flags&SW2_DOWN) { flags&=!SW2_DOWN; pc.printf("!2d"); } if(flags&SW3_UP) { flags&=!SW3_UP; pc.printf("!3u"); } if(flags&SW3_DOWN) { flags&=!SW3_DOWN; pc.printf("!3d"); } if(flags&UP_UP) { flags&=!UP_UP; pc.printf("!uu"); } if(flags&UP_DOWN) { flags&=!UP_DOWN; pc.printf("!ud"); } if(flags&DOWN_UP) { flags&=!DOWN_UP; pc.printf("!du"); } if(flags&DOWN_DOWN) { flags&=!DOWN_DOWN; pc.printf("!dd"); } if(flags&LEFT_UP) { flags&=!LEFT_UP; pc.printf("!lu"); } if(flags&LEFT_DOWN) { flags&=!LEFT_DOWN; pc.printf("!ld"); } if(flags&RIGHT_UP) { flags&=!RIGHT_UP; pc.printf("!ru"); } if(flags&RIGHT_DOWN) { flags&=!RIGHT_DOWN; pc.printf("!rd"); } if(flags&FIRE_UP) { flags&=!FIRE_UP; pc.printf("!fu"); } if(flags&FIRE_DOWN) { flags&=!FIRE_DOWN; pc.printf("!fd"); } //Check for host requests if(pc.readable()) { char cmd = pc.getc(); switch(cmd) { case 'R': { //read digital input readDigitalIn(); break; } case 'p': { readPot(); break; } case 't': { //read temp float t = temp.read(); sendData(&t,4); break; } case 'a': {//read shield accel 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; 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 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); 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); sendData(&a.x,2); sendData(&a.y,2); sendData(&a.z,2); break; } case 'P': { //set lcd position unsigned char x, y; x = pc.getc(); y = pc.getc(); lcd.locate(x,y); break; } case 'S': { //print lcd text 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': { //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; } } } }