Akhil Nair
/
lab5p1
lab5p1 final version
Diff: main.cpp
- Revision:
- 6:007c89b67d67
- Parent:
- 5:2a9a3d74a1d8
diff -r 2a9a3d74a1d8 -r 007c89b67d67 main.cpp --- a/main.cpp Tue Feb 19 09:38:31 2019 +0000 +++ b/main.cpp Thu Feb 28 17:04:08 2019 +0000 @@ -10,44 +10,109 @@ Serial pc(USBTX, USBRX); // tx, rx DigitalOut redLED(LED_RED); DigitalOut greenLED(LED_GREEN); +DigitalOut blueLED(LED_BLUE); TSISensor tsi; Thread redThread ; // thread for red LED Thread greenThread ; // thread for green LED +Thread blueThread; +Thread whiteThread; # define REDFLAG 0x01 # define GREENFLAG 0x02 +# define BLUEFLAG 0x04 +# define WHITEFLAG 0x08 EventFlags signals; // event flags for signalling; 2 used - + +enum redLEDState {REDOn,REDOff}; void red_thread() { // method to run in thread + redLEDState redstate = REDOff; + while (true) { + switch(redstate){ + case REDOff: + signals.wait_any(REDFLAG); + redLED = false; + wait(0.5); + redstate = REDOn; + break; + case REDOn: + redLED = true ; // turn on + signals.clear(REDFLAG); + redstate = REDOff; + } + } +} +enum greenLEDState {GREENOn,GREENOff}; +void green_thread() { // method to run in thread + greenLEDState greenstate = GREENOff; while (true) { - signals.wait_any(REDFLAG); - redLED = false ; // turn on - wait(5.0); - redLED = true ; // turn off - signals.clear(REDFLAG) ; - // Signal are automatically cleared by wait_any but - // the signal might have been set again while LED on + switch(greenstate){ + case GREENOff: + signals.wait_any(GREENFLAG); + greenLED = false ; + wait(0.5); + greenstate = GREENOn; + break; + case GREENOn: + greenLED = true ; // turn on + signals.clear(GREENFLAG); + greenstate = GREENOff; + } + } +} +enum blueLEDState {BLUEOn,BLUEOff}; +void blue_thread() { // method to run in thread + blueLEDState bluestate = BLUEOff; + while (true) { + switch(bluestate){ + case BLUEOff: + signals.wait_any(BLUEFLAG); + blueLED = false ; + wait(0.5); + bluestate = BLUEOn; + break; + case BLUEOn: + blueLED = true ; // turn on + signals.clear(BLUEFLAG); + bluestate = BLUEOff; + } + } +} +enum whiteLEDState {WHITEOn,WHITEOff}; +void white_thread() { // method to run in thread + whiteLEDState whitestate = WHITEOff; + while (true) { + switch(whitestate){ + case WHITEOff: + signals.wait_any(WHITEFLAG); + blueLED = false ; // turn on + redLED = false ; + greenLED = false ; + wait(0.5); + whitestate = WHITEOn; + break; + case WHITEOn: + blueLED = true ; // turn off + redLED = true ; + greenLED = true ; + signals.clear(WHITEFLAG); + whitestate = WHITEOff; + } } } -void green_thread() { // method to run in thread - while (true) { - signals.wait_any(GREENFLAG); - greenLED = false ; // turn on - wait(5.0); - greenLED = true ; // turn off - signals.clear(GREENFLAG) ; - // Signal are automatically cleared by wait_any but - // the signal might have been set again while LED on - } -} +enum states {LeftIn,LeftOut,RightIn,RightOut,None}; int main(void) { redLED = true ; // turn off greenLED = true ; // turn off + blueLED = true ; redThread.start(red_thread) ; // start the red thread greenThread.start(green_thread) ; // start the green thread + blueThread.start(blue_thread); + whiteThread.start(white_thread); + + states State = None; while (true) { uint8_t d = tsi.readDistance() ; // Distance is between 0 and 39 @@ -55,9 +120,22 @@ // Left --> low value Right --> high value pc.printf("%d", d) ; pc.putc(' ') ; - if (d == 10) signals.set(REDFLAG) ; - if (d == 20) signals.set(GREENFLAG) ; - wait(0.5); // This polling rate is too slow - increase it - // The slower rate maks it easier to output on the terminal + wait(0.1); + switch(State){ + case None: + if (d > 3 && d < 9) {signals.set(REDFLAG);State = LeftOut;} + else if (d > 13 && d < 19) {signals.set(GREENFLAG) ;State = LeftIn; } + else if (d > 23 && d < 29) {signals.set(BLUEFLAG) ;State = RightIn;} + else if (d > 33) {signals.set(WHITEFLAG) ;State = RightOut;} + break; + case LeftOut: + if (d < 3 || d >9) State = None;break; + case LeftIn: + if (d < 13 || d >19) State = None;break; + case RightIn: + if (d < 23 || d >29) State = None;break; + case RightOut: + if (d < 33) State = None;break; + } } } \ No newline at end of file