Interface layer for the mbed boards ready for the JAVA library

Dependencies:   C12832 LM75B MMA7660 mbed FXOS8700Q

Fork of frdm_serial by Michael Berry

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "C12832.h"
00003 #include "LM75B.h"
00004 #include "MMA7660.h"
00005 #include "FXOS8700Q.h"
00006 #include "comms.h"
00007 #include "main.h"
00008 
00009 //OUTPUTS
00010 
00011 DigitalOut lr(PTB22), lg(PTE26), lb(PTB21), xr(D5), xg(D9), xb(PTC12);
00012 C12832 lcd(D11, D13, D12, D7, D10);
00013 PwmOut spkr(D6);
00014 
00015 //INPUTS
00016 
00017 LM75B temp(D14, D15);
00018 MMA7660 sAcc(D14, D15);
00019 
00020 I2C i2c(PTE25, PTE24);
00021 //FXOS8700Q fxos(i2c, FXOS8700CQ_SLAVE_ADDR1);
00022 FXOS8700QAccelerometer bAcc(i2c, FXOS8700CQ_SLAVE_ADDR1);    // Configured for the FRDM-K64F with onboard sensors
00023 FXOS8700QMagnetometer  bMag(i2c, FXOS8700CQ_SLAVE_ADDR1);
00024 
00025 //FXOS8700Q_acc bAcc( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board
00026 //FXOS8700Q_mag bMag( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board
00027 
00028 InterruptIn sw2_int(SW2), sw3_int(SW3), up_int(A2), down_int(A3), left_int(A4), right_int(A5), fire_int(D4);
00029 DigitalIn   sw2(SW2),     sw3(SW3),     up(A2),     down(A3),     left(A4),     right(A5),     fire(D4);
00030 
00031 AnalogIn pot1(A0), pot2(A1);
00032 
00033 //INTERRUPT FLAGS
00034 
00035 uint16_t flags;
00036 #define SW2_DOWN   0x0001
00037 #define SW2_UP     0x0002
00038 #define SW3_UP     0x0004
00039 #define SW3_DOWN   0x0008
00040 #define UP_UP      0x0010
00041 #define UP_DOWN    0x0020
00042 #define DOWN_UP    0x0040
00043 #define DOWN_DOWN  0x0080
00044 #define LEFT_UP    0x0100
00045 #define LEFT_DOWN  0x0200
00046 #define RIGHT_UP   0x0400
00047 #define RIGHT_DOWN 0x0800
00048 #define FIRE_UP    0x1000
00049 #define FIRE_DOWN  0x2000
00050 
00051 //COMMS
00052 
00053 DataSerial pc(USBTX, USBRX);
00054 
00055 //INTERRUPT HANDLERS
00056 
00057 void sw2Down(){ flags |= SW2_DOWN; }
00058 void sw2Up()  { flags |= SW2_UP; }
00059 
00060 void sw3Down(){ flags |= SW3_DOWN; }
00061 void sw3Up()  { flags |= SW3_UP; }
00062 
00063 void upDown(){ flags |= UP_DOWN; }
00064 void upUp()  { flags |= UP_UP; }
00065 
00066 void downDown(){ flags |= DOWN_DOWN; }
00067 void downUp()  { flags |= DOWN_UP; }
00068 
00069 void leftDown(){ flags |= LEFT_DOWN; }
00070 void leftUp()  { flags |= LEFT_UP; }
00071 
00072 void rightDown(){ flags |= RIGHT_DOWN; }
00073 void rightUp()  { flags |= RIGHT_UP; }
00074 
00075 void fireDown(){ flags |= FIRE_DOWN; }
00076 void fireUp()  { flags |= FIRE_UP; }
00077 
00078 //PRETTY WAITING LEDS
00079 
00080 Ticker waitTicker;
00081 int ctr;
00082 
00083 void waitTick() {
00084     switch(ctr) {
00085         case 0:
00086             xr=xg=0; xb=1; break;
00087         case 1:
00088             xr=0; xg=xb=1; break;
00089         case 2:
00090             xr=xb=0; xg=1; break;
00091         case 3:
00092             xb=0; xr=xg=1; break;
00093         case 4:
00094             xg=xb=0; xr=1; break;
00095         case 5:
00096             lr=xg=lb=0; xr=lg=xb=1;
00097             ctr=0; return;
00098     }
00099     lr=!xr; lg=!xg; lb=!xb;
00100     ctr++;
00101 }
00102 
00103 /*
00104 Return the state of a requested pin
00105 */
00106 void read_digital() {
00107     bool val;
00108     switch(pc.readChar()) {
00109         case '2': val=!sw2; break;
00110         case '3': val=!sw3; break;
00111         case 'u': val=up; break;
00112         case 'd': val=down; break;
00113         case 'l': val=left; break;
00114         case 'r': val=right; break;
00115         case 'f': val=fire; break;
00116         default: return;
00117     }
00118     pc.sendBool(val);
00119 }
00120 
00121 /*
00122 Return the state of a requested potentiometer
00123 */
00124 void read_pot() {
00125     float val;
00126     switch(pc.readChar()) {
00127         case '1': val=pot1; break;
00128         case '2': val=pot2; break;
00129         default: return;
00130     }
00131     pc.sendFloat(val);
00132 }
00133 void read_temp() { //read temp
00134     float t = temp.read();
00135     pc.sendFloat(t);
00136 }
00137 
00138 void read_shield_accel() {//read shield accel
00139     float x, y, z;
00140     x = sAcc.x();
00141     y = sAcc.y();
00142     z = sAcc.z();
00143     pc.sendFloat(x);
00144     pc.sendFloat(y);
00145     pc.sendFloat(z);
00146 }
00147 
00148 void set_shield_led() { //shield led
00149     char raw = pc.readChar();
00150     char r = ((raw>>2)&1)^1;
00151     char g = ((raw>>1)&1)^1;
00152     char b = (raw&1)^1;
00153     xr = r; xg = g; xb = b;
00154 }
00155 
00156 void get_orientation() { //read shield accel orientation
00157     MMA7660::Orientation o = sAcc.getOrientation();
00158     pc.sendChar((char)o);
00159 }
00160 
00161 void get_side() { //read shield accel orientation
00162     MMA7660::Orientation o = sAcc.getSide();
00163     pc.sendChar((char)o);
00164 }
00165 
00166 void get_heading() {
00167     motion_data_units_t mag;
00168     bMag.getAxis(mag);
00169     float heading = atan2(-(mag.x-20.0f),mag.y-5.0f)*180.0f/M_PI;
00170     if(heading<0) heading+=360.0f;
00171     pc.sendFloat(heading);
00172 }
00173 
00174 void set_board_led() { // board led
00175     char raw = pc.readChar();
00176     char r = ((raw>>2)&1)^1;
00177     char g = ((raw>>1)&1)^1;
00178     char b = (raw&1)^1;
00179     lr = r; lg = g; lb = b;
00180 }
00181 
00182 void set_piezo() { // set piezo buzzer
00183     float vol = pc.readFloat();
00184     float period = 1.0f/pc.readFloat();
00185     spkr=vol*0.5f; //convert volume to duty cycle
00186     spkr.period(period);
00187 }
00188 
00189 void read_board_magno() { //read board magno
00190     motion_data_units_t mag;
00191     bMag.getAxis(mag);
00192     pc.sendFloat(mag.x);
00193     pc.sendFloat(mag.y);
00194     pc.sendFloat(mag.z);
00195 }
00196 
00197 void read_board_accel() { //read board accel
00198     motion_data_units_t acc;
00199     bAcc.getAxis(acc);
00200     pc.sendFloat(acc.x);
00201     pc.sendFloat(acc.y);
00202     pc.sendFloat(acc.z);
00203 }
00204 
00205 void set_lcd_position() { //set lcd position
00206     unsigned char xy[2];
00207     pc.readData(xy,2);
00208     lcd.locate(xy[0],xy[1]);
00209 }
00210 
00211 void print_text() { //print lcd text
00212     char buff[256];
00213     char len = pc.readString(buff);
00214     buff[len]=0;
00215     lcd.printf(buff);
00216     lcd.copy_to_lcd();
00217     pc.sendBool(true);
00218 }
00219 
00220 void set_lcd_pixel() { //set lcd pixel
00221     char xyc[3];
00222     pc.readData(xyc, 3);
00223     lcd.pixel(xyc[0],xyc[1],xyc[2]);
00224     lcd.copy_to_lcd();
00225 }
00226 
00227 void draw_circle() {
00228     char xyrc[4];
00229     pc.readData(xyrc, 4);
00230     lcd.circle(xyrc[0],xyrc[1],xyrc[2],xyrc[3]);
00231     lcd.copy_to_lcd();
00232 }
00233 
00234 void fill_circle() {
00235     char xyrc[4];
00236     pc.readData(xyrc, 4);
00237     lcd.fillcircle(xyrc[0],xyrc[1],xyrc[2],xyrc[3]);
00238     lcd.copy_to_lcd();
00239 }
00240 
00241 void draw_line() {
00242     char xyxyc[5];
00243     pc.readData(xyxyc, 5);
00244     lcd.line(xyxyc[0],xyxyc[1],xyxyc[2],xyxyc[3],xyxyc[4]);
00245     lcd.copy_to_lcd();
00246 }
00247 
00248 void draw_rect() {
00249     char xyxyc[5];
00250     pc.readData(xyxyc, 5);
00251     lcd.rect(xyxyc[0],xyxyc[1],xyxyc[2],xyxyc[3],xyxyc[4]);
00252     lcd.copy_to_lcd();
00253 }
00254 
00255 void fill_rect() {
00256     char xyxyc[5];
00257     pc.readData(xyxyc, 5);
00258     lcd.fillrect(xyxyc[0],xyxyc[1],xyxyc[2],xyxyc[3],xyxyc[4]);
00259     lcd.copy_to_lcd();
00260 }
00261 
00262 void clear_lcd() { //clear lcd
00263     lcd.cls();
00264     pc.sendBool(true);
00265 }
00266 
00267 void cleanup() {
00268     lr = lg = lb = 1;
00269     xr = xg = xb = 1;
00270     lcd.cls();
00271     
00272     pc.sendChar(RECONNECT);
00273 }
00274 
00275 void reconnect() { //reconnection
00276     cleanup();
00277 }
00278 
00279 int main() {  
00280     //SETUP
00281     pc.baud(115200);
00282     
00283     lr = lg = lb = 1;
00284     xr = xg = xb = 1;
00285     
00286     bAcc.enable();
00287     bMag.enable();
00288     
00289     //Pretty wait
00290     ctr=0;
00291     lcd.locate(0,0);
00292     lcd.printf("Awaiting connection...");
00293     waitTicker.attach(&waitTick,0.5);
00294     while((!pc.readable()) && (pc.readChar()!=RECONNECT)) sleep();
00295     waitTicker.detach();
00296     cleanup();
00297     
00298     sw2_int.mode (PullUp);
00299     sw2_int.fall(&sw2Down);
00300     sw2_int.rise(&sw2Up);
00301     
00302     sw3_int.mode (PullUp);
00303     sw3_int.fall(&sw3Down);
00304     sw3_int.rise(&sw3Up);
00305     
00306     up_int.mode (PullUp);
00307     up_int.rise(&upDown);
00308     up_int.fall(&upUp);
00309     
00310     down_int.mode (PullUp);
00311     down_int.rise(&downDown);
00312     down_int.fall(&downUp);
00313     
00314     left_int.mode (PullUp);
00315     left_int.rise(&leftDown);
00316     left_int.fall(&leftUp);
00317     
00318     right_int.mode (PullUp);
00319     right_int.rise(&rightDown);
00320     right_int.fall(&rightUp);
00321     
00322     fire_int.mode (PullUp);
00323     fire_int.rise(&fireDown);
00324     fire_int.fall(&fireUp);
00325     
00326     for(;;) {
00327         //Check if any interrupts fired
00328         if(flags&SW2_UP) {
00329             flags&=!SW2_UP;
00330             pc.sendSpecialCommand('2','u');
00331         }
00332         if(flags&SW2_DOWN) {
00333             flags&=!SW2_DOWN;
00334             pc.sendSpecialCommand('2','d');
00335         }
00336         if(flags&SW3_UP) {
00337             flags&=!SW3_UP;
00338             pc.sendSpecialCommand('3','u');
00339         }
00340         if(flags&SW3_DOWN) {
00341             flags&=!SW3_DOWN;
00342             pc.sendSpecialCommand('3','d');
00343         }
00344         if(flags&UP_UP) {
00345             flags&=!UP_UP;
00346             pc.sendSpecialCommand('u','u');
00347         }
00348         if(flags&UP_DOWN) {
00349             flags&=!UP_DOWN;
00350             pc.sendSpecialCommand('u','d');
00351         }
00352         if(flags&DOWN_UP) {
00353             flags&=!DOWN_UP;
00354             pc.sendSpecialCommand('d','u');
00355         }
00356         if(flags&DOWN_DOWN) {
00357             flags&=!DOWN_DOWN;
00358             pc.sendSpecialCommand('d','d');
00359         }
00360         if(flags&LEFT_UP) {
00361             flags&=!LEFT_UP;
00362             pc.sendSpecialCommand('l','u');
00363         }
00364         if(flags&LEFT_DOWN) {
00365             flags&=!LEFT_DOWN;
00366             pc.sendSpecialCommand('l','d');
00367         }
00368         if(flags&RIGHT_UP) {
00369             flags&=!RIGHT_UP;
00370             pc.sendSpecialCommand('r','u');
00371         }
00372         if(flags&RIGHT_DOWN) {
00373             flags&=!RIGHT_DOWN;
00374             pc.sendSpecialCommand('r','d');
00375         }
00376         if(flags&FIRE_UP) {
00377             flags&=!FIRE_UP;
00378             pc.sendSpecialCommand('f','u');
00379         }
00380         if(flags&FIRE_DOWN) {
00381             flags&=!FIRE_DOWN;
00382             pc.sendSpecialCommand('f','d');
00383         }
00384         
00385         //Check for host requests
00386         if(pc.readable()) {
00387             unsigned char cmd = pc.readChar();
00388             if(cmd<COMMAND_LENGTH) {
00389                 commandFunctions[cmd]();
00390             }
00391         }
00392     }
00393 }