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:
- 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; } } } } -