Haozun Sun
/
Accelerometer2_hzsun
I got the structure of the code but did not get every details right
Diff: main.cpp
- Revision:
- 6:d58d982c647a
- Parent:
- 4:72b8fb7423dd
- Child:
- 7:884fb008cee8
--- a/main.cpp Thu Feb 27 10:07:17 2020 +0000 +++ b/main.cpp Thu Mar 05 21:13:16 2020 +0000 @@ -3,29 +3,264 @@ 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); - PwmOut rled(LED1); - PwmOut gled(LED2); - PwmOut bled(LED3); - Serial pc(USBTX, USBRX); // tx, rx + 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(); - y = acc.getAccY(); - z = acc.getAccZ(); - rled = 1.0f - abs(x); - gled = 1.0f - abs(y); - bled = 1.0f - abs(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); - pc.printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x, y, z); + + 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; + } + } }