Divya Vadivel
/
Lab4_2-3-1
Lab 4 Part 2
Fork of Accelerometer_example by
main.cpp
- Committer:
- diviavad
- Date:
- 2018-02-22
- Revision:
- 2:8d75d6728722
- Parent:
- 0:a1caba5c4e48
File content as of revision 2:8d75d6728722:
#include "mbed.h" #include "rtos.h" #include "MMA8451Q.h" PinName const SDA = PTE25; PinName const SCL = PTE24; #define MMA8451_I2C_ADDRESS (0x1d<<1) Thread isTriggeredStatus ; enum states { FLAT, RIGHT, LEFT, DOWN, UP, OVER, INTERMEDIATE }; Serial pc(USBTX, USBRX); // tx, rx volatile states positionState = INTERMEDIATE; void ifTrigerred() { DigitalOut rled(LED1); DigitalOut gled(LED2); enum spaceStates { flatstart, flatEnd, rightstart, rightEnd, upstart, upEnd, flatTriggered, stateTimeError, stateSequenceError }; Timer timer; rled = 1; gled = 1; spaceStates state = flatstart; while (true) { if (positionState == INTERMEDIATE) { Thread::wait(100); continue; } switch (state) { case flatstart: if (positionState == FLAT) { pc.printf("flatstart \n\r"); timer.start(); pc.printf("%d", timer.read_ms()); if (timer.read() >= 10) { timer.stop(); timer.reset(); state = flatEnd; } } else { timer.stop(); timer.reset(); if (positionState == RIGHT) { state = stateTimeError; } else { state = stateSequenceError; } } break; case flatEnd: rled = 1; pc.printf("FlatEnd \n\r"); if (positionState == RIGHT) { state = rightstart; } else { if (positionState != FLAT) { state = stateSequenceError; } } break; case rightstart: if (positionState == RIGHT) { pc.printf("RightStart \n\r"); timer.start(); pc.printf("%d", timer.read_ms()); if (timer.read() >= 2) { state = rightEnd; } } else { timer.stop(); timer.reset(); if (positionState == UP) { state = stateTimeError; } else { state = stateSequenceError; } } break; case rightEnd: pc.printf("RightEnd \n\r"); pc.printf("%d", timer.read_ms()); if (timer.read() <= 6) { if (positionState == UP) { timer.stop(); timer.reset(); state = upstart; } else if (positionState != RIGHT) { timer.stop(); timer.reset(); state = stateSequenceError; } } else { timer.stop(); timer.reset(); state = stateTimeError; } break; case upstart: if (positionState == UP) { pc.printf("UpStart \n\r"); timer.start(); pc.printf("%d", timer.read_ms()); if (timer.read() >= 4) { state = upEnd; } } else { timer.stop(); timer.reset(); if (positionState == FLAT) { state = stateTimeError; } else { state = stateSequenceError; } } break; case upEnd: pc.printf("upEnd \n\r"); pc.printf("%d", timer.read_ms()); if (timer.read() <= 8) { if (positionState == FLAT) { timer.stop(); timer.reset(); state = flatTriggered; } else if (positionState != UP) { timer.stop(); timer.reset(); state = stateSequenceError; } } else { timer.stop(); timer.reset(); state = stateTimeError; } break; case flatTriggered: gled = 0; pc.printf("flatTriggered \n\r"); break; case stateSequenceError: rled = 0; pc.printf("State sequence error \n\r"); if (positionState == FLAT) { state = flatstart; } break; case stateTimeError: rled = 0; pc.printf("State time error \n\r"); if (positionState == FLAT) { state = flatstart; } break; } Thread::wait(100); } } int main(void) { MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); states state = INTERMEDIATE; states lastStableState = INTERMEDIATE; states pastState = INTERMEDIATE; int stateCounter = 0; int const stableState = 3; pc.printf("MMA8451 ID: %d\n\r", acc.getWhoAmI()); // is triggered or not isTriggeredStatus.start(callback(ifTrigerred)); while (true) { float x, y, z, ts; //threshold ts = 0.15; x = acc.getAccX(); y = acc.getAccY(); z = acc.getAccZ(); if (z > 1-ts && z < 1+ts) { state = FLAT; } else if (z > -1-ts && z < -1+ts) { state = OVER; } else if (y > -1-ts && y < -1+ts) { state = RIGHT; } else if (y > 1-ts && y < 1+ts) { state = LEFT; } else if (x > -1-ts && x < -1+ts) { state = UP; } else if (x > 1-ts && x < 1+ts) { state = DOWN; } else { state = INTERMEDIATE; } if (state != INTERMEDIATE) { if (state == pastState) { if (stateCounter < stableState) { stateCounter ++; } } else { pastState = state; stateCounter = 0; } } // state has changed and is stable if (stateCounter == stableState && lastStableState != state) { lastStableState = state; switch (state) { case FLAT: pc.printf("Flat state \n\r"); break; case LEFT: pc.printf("Left state \n\r"); break; case RIGHT: pc.printf("Right state \n\r"); break; case UP: pc.printf("Up state \n\r"); break; case DOWN: pc.printf("Down state \n\r"); break; case OVER: pc.printf("Over state \n\r"); break; } positionState = state; } Thread::wait(200); } }