Interface layer for the mbed boards ready for the JAVA library
Dependencies: C12832 LM75B MMA7660 mbed FXOS8700Q
Fork of frdm_serial by
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 }
Generated on Sun Jul 17 2022 01:45:37 by 1.7.2