Haozun Sun
/
Accelerometer2_hzsun
I got the structure of the code but did not get every details right
main.cpp
- Committer:
- 190299053
- Date:
- 2020-03-05
- Revision:
- 6:d58d982c647a
- Parent:
- 4:72b8fb7423dd
- Child:
- 7:884fb008cee8
File content as of revision 6:d58d982c647a:
#include "mbed.h" #include "MMA8451Q.h" PinName const SDA = PTE25; PinName const SCL = PTE24; EventQueue queue; Serial pc(USBTX, USBRX); // tx, rx Thread eventThread ; DigitalOut rled(LED1, 1); //red led DigitalOut gled(LED2,1); //green led DigitalOut bled(LED3,1); //blue led EventFlags event_flags; Timer x; #define MMA8451_I2C_ADDRESS (0x1d<<1) enum pos {up, down, left, right, flat, over, intermediate}; volatile int pos = intermediate; enum state {first, second, third, success, e}; volatile int state = first; volatile uint32_t flags_read = 1; void seqchecking(){ switch(state){ case first: flags_read = event_flags.wait_any(up|down|right|left|over|flat|intermediate,10000,true); pc.printf("flag_read:%d\r\n", flags_read); //if(flags_read == -2){rled = 1;} //else{ if(flags_read == 4){if(flags_read == -2){state = second; x.reset();pc.printf("turn right please");}} if(flags_read != 4 && x.read() < 10){state = e;} if((flags_read != 4 && flags_read != 6) && x.read() < 10){state = e;pc.printf("b");} //} break; case second: flags_read = event_flags.wait_any(up|down|right|left|over|flat|intermediate,6000,true); if(flags_read != 3 && x.read() < 2){state = e;} if(flags_read == 0 && x.read() >= 2){state = second; x.reset();pc.printf("turn upward please");} if((flags_read != 3 && flags_read != 0)){state = e;} break; case third: flags_read = event_flags.wait_any(up|down|right|left|over|flat|intermediate,8000,true); if(flags_read != 0 && x.read() < 4){state = e;} if(flags_read == 4 && x.read() >= 4){state = second; x.reset();} if((flags_read != 4 && flags_read != 0)){state = e;} break; case success: gled = 0; break; case e: rled = 0; event_flags.wait_any(flat, osWaitForever, true); state = first; x.reset(); break; } } int main(void) { MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); pc.printf("MMA8451 ID: %d\n", acc.getWhoAmI()); rled = 1; // turn off all leds when initialising gled = 1; bled = 1; x.start(); eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); queue.call_every(10, seqchecking) ; while (true) { float x, y, z; x = acc.getAccX(); // get x axis value y = acc.getAccY(); // get y axis value z = acc.getAccZ(); // get z axis value ThisThread::sleep_for(300); // wait(0.3); switch (pos){ case intermediate: if(x > 0.9){ //if the board is in position down pos = down; event_flags.set(down); pc.printf("down\n"); // print up on pc screen } if(x < -0.9){ //if the board is in position up pos = up; event_flags.set(up); pc.printf("Up\n");// print down on pc screen } if(y > 0.9){ //if the board is in position left pos = left; event_flags.set(left); pc.printf("left\n");// print left on pc screen } if(y < -0.9){ //if the board is in position right pos = right; event_flags.set(right); pc.printf("right\n");// print right on pc screen } if(z > 0.9){ //if the board is in position flat pos = flat; event_flags.set(flat); pc.printf("Flat\n");// print flat on pc screen } if(z < -0.9){ //if the board is in position over pos = over; event_flags.set(over); pc.printf("Over\n");// print over on pc screen } if(z<0.8 && z>-0.8 && x<0.8 && x>-0.8 && y<0.8 && y>-0.8){ pos = intermediate; event_flags.set(intermediate); } break; case up: if(x > 0.9){ //if the board is in position down pos = down; pc.printf("Down\n");// print down on pc screen } if(y > 0.9){ //if the board is in position left pos = left; pc.printf("left\n");// print left on pc screen } if(y < -0.9){ //if the board is in position right pos = right; pc.printf("right\n");// print right on pc screen } if(z > 0.9){ //if the board is in position flat pos = flat; pc.printf("Flat\n");// print flat on pc screen } if(z < -0.9){ //if the board is in position over pos = over; pc.printf("Over\n");// print over on pc screen } if(z<0.8 && z>-0.8 && x<0.8 && x>-0.8 && y<0.8 && y>-0.8){ pos = intermediate; } break; case down: if(x < -0.9){ //if the board is in position up pos = up; pc.printf("Up\n"); // print up on pc screen } if(y > 0.9){ //if the board is in position left pos = left; pc.printf("left\n");// print left on pc screen } if(y < -0.9){ //if the board is in position right pos = right; pc.printf("right\n");// print right on pc screen } if(z > 0.9){ //if the board is in position flat pos = flat; pc.printf("Flat\n");// print flat on pc screen } if(z < -0.9){ //if the board is in position over pos = over; pc.printf("Over\n");// print over on pc screen } if(z<0.8 && z>-0.8 && x<0.8 && x>-0.8 && y<0.8 && y>-0.8){ pos = intermediate; } break; case left: if(x > 0.9){ //if the board is in position down pos = down; pc.printf("Down\n"); // print up on pc screen } if(x < -0.9){ //if the board is in position up pos = up; pc.printf("Up\n");// print down on pc screen } if(y < -0.9){ //if the board is in position right pos = right; pc.printf("right\n");// print right on pc screen } if(z > 0.9){ //if the board is in position flat pos = flat; pc.printf("Flat\n");// print flat on pc screen } if(z < -0.9){ //if the board is in position over pos = over; pc.printf("Over\n");// print over on pc screen } if(z<0.8 && z>-0.8 && x<0.8 && x>-0.8 && y<0.8 && y>-0.8){ pos = intermediate; } break; case right: if(x > 0.9){ //if the board is in position down pos = down; pc.printf("Down\n"); // print up on pc screen } if(x < -0.9){ //if the board is in position up pos = up; pc.printf("Up\n");// print down on pc screen } if(y > 0.9){ //if the board is in position left pos = left; pc.printf("left\n");// print left on pc screen } if(z > 0.9){ //if the board is in position flat pos = flat; pc.printf("Flat\n");// print flat on pc screen } if(z < -0.9){ //if the board is in position over pos = over; pc.printf("Over\n");// print over on pc screen } if(z<0.8 && z>-0.8 && x<0.8 && x>-0.8 && y<0.8 && y>-0.8){ pos = intermediate; } break; case flat: if(x > 0.9){ //if the board is in position down pos = down; pc.printf("Down\n"); // print up on pc screen } if(x < -0.9){ //if the board is in position up pos = up; pc.printf("Up\n");// print down on pc screen } if(y > 0.9){ //if the board is in position left pos = left; pc.printf("left\n");// print left on pc screen } if(y < -0.9){ //if the board is in position right pos = right; pc.printf("right\n");// print right on pc screen } if(z < -0.9){ //if the board is in position over pos = over; pc.printf("Over\n");// print over on pc screen } if(z<0.8 && z>-0.8 && x<0.8 && x>-0.8 && y<0.8 && y>-0.8){ pos = intermediate; } break; case over: if(x > 0.9){ //if the board is in position down pos = down; pc.printf("Down\n"); // print up on pc screen } if(x < -0.9){ //if the board is in position up pos = up; pc.printf("Up\n");// print down on pc screen } if(y > 0.9){ //if the board is in position left pos = left; pc.printf("left\n");// print left on pc screen } if(y < -0.9){ //if the board is in position right pos = right; pc.printf("right\n");// print right on pc screen } if(z > 0.9){ //if the board is in position flat pos = flat; pc.printf("Flat\n");// print flat on pc screen } if(z<0.8 && z>-0.8 && x<0.8 && x>-0.8 && y<0.8 && y>-0.8){ pos = intermediate; } break; } } }