Alif Ahmed / Mbed OS TSI_part1

Dependencies:   TSI

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "TSISensor.h"
00003 
00004 // Example program for lab 5
00005 // -------------------------
00006 //  A value is read from the touch sensor and use
00007 //    to control two LEDs
00008 //  The value is also output to the serial interface
00009 
00010 Serial pc(USBTX, USBRX); // tx, rx
00011 DigitalOut redLED(LED_RED);
00012 DigitalOut greenLED(LED_GREEN);
00013 DigitalOut blueLED(LED_BLUE);
00014 TSISensor tsi;
00015 
00016 Thread redThread ; // thread for red LED
00017 Thread greenThread ; // thread for green LED
00018 Thread blueThread ; 
00019 
00020 # define REDFLAG 0x01   
00021 # define GREENFLAG 0x02
00022 
00023 # define BLUEFLAG 0x04
00024 # define EXFLAG 0x08
00025 
00026 EventFlags signals;  // event flags for signalling; 2 used
00027  
00028 void red_thread() {  // method to run in thread
00029 enum redState{ON, OFF};
00030     redLED = true ; // off
00031     redState state = OFF ;
00032     while (true) {
00033         switch (state) {
00034             case OFF: 
00035                 signals.wait_any(REDFLAG);
00036                 redLED = false ; // turn on 
00037                 state = ON ;
00038                 break ;
00039             case ON: 
00040                 signals.wait_any(REDFLAG);
00041                 redLED = true; // turn off
00042                 state = OFF ;
00043                 break ;
00044         }
00045         //signals.clear(REDFLAG) ;
00046           // Signal are automatically cleared by wait_any but
00047           // the signal might have been set again while LED on 
00048     }
00049 }
00050 
00051 void green_thread() {  // method to run in thread
00052 enum greenState{ON, OFF};
00053     greenLED = true ; // off
00054     greenState state = OFF ;
00055     while (true) {
00056         switch (state) {
00057             case OFF: 
00058                 signals.wait_any(GREENFLAG);
00059                 greenLED = false ; // turn on 
00060                 state = ON ;
00061                 break ;
00062             case ON: 
00063                 signals.wait_any(GREENFLAG);
00064                 greenLED = true; // turn off
00065                 state = OFF ;
00066                 break ;
00067         }
00068 
00069         //signals.clear(GREENFLAG) ;
00070           // Signal are automatically cleared by wait_any but
00071           // the signal might have been set again while LED on 
00072     }
00073 }
00074 
00075 void blue_thread() {  // method to run in thread
00076 enum blueState{ON, OFF};
00077     blueLED = true ; // off
00078     blueState state = OFF ;
00079     while (true) {
00080         switch (state) {
00081             case OFF: 
00082                 signals.wait_any(BLUEFLAG);
00083                 blueLED = false ; // turn on 
00084                 state = ON ;
00085                 break ;
00086             case ON: 
00087                 signals.wait_any(BLUEFLAG);
00088                 blueLED = true; // turn off
00089                 state = OFF ;
00090                 break ;
00091         }
00092         //signals.clear(BLUEFLAG) ;
00093           // Signal are automatically cleared by wait_any but
00094           // the signal might have been set again while LED on 
00095     }
00096 }
00097 
00098 
00099 int main(void) {
00100     //redLED = true ; // turn off 
00101     //greenLED = true ; // turn off 
00102     //blueLED = true ; // turn off 
00103     redThread.start(red_thread) ; // start the red thread
00104     greenThread.start(green_thread) ; // start the green thread
00105     blueThread.start(blue_thread) ; // start the blue thread
00106   
00107     enum ledState{none, leftout, leftin, rightout, rightin};
00108     ledState pos = none;
00109     
00110     while (true) {
00111         uint8_t d = tsi.readDistance() ;  // Distance is between 0 and 39
00112                                           // When no touch --> 0
00113                                           // Left --> low value  Right --> high value                      
00114         switch (pos) {
00115             case none:
00116                 if (d > 3 && d < 9) {
00117                     signals.set(REDFLAG);
00118                     pos = leftout;
00119                 }
00120                 if (d > 13 && d < 19) {
00121                     signals.set(GREENFLAG);
00122                     pos = leftin;
00123                 }
00124                 if (d > 23 && d < 29) {
00125                     signals.set(BLUEFLAG);
00126                     pos = rightin;
00127                 }
00128                 if (d > 33) {
00129                     signals.set(EXFLAG);
00130                     pos = rightout;
00131                 }
00132                 break ;
00133                 
00134             case leftout:
00135                 if (d < 3 || d > 9) {
00136                     pos = none;
00137                 }
00138                 break ;
00139                 
00140             case leftin:
00141                 if (d < 13 || d > 19) {
00142                     pos = none;
00143                 }
00144                 break ;
00145                 
00146             case rightin:
00147                 if (d < 23 || d > 29) {
00148                     pos = none;
00149                 }
00150                 break ;
00151                 
00152             case rightout:
00153                 if (d < 33) {
00154                     pos = none;
00155                 }
00156                 break ;                
00157         }
00158         
00159         pc.printf("%d", d) ;
00160         pc.putc(' ') ;
00161         ThisThread::sleep_for(500) ; // This polling rate is too slow - increase it
00162                     // The slower rate maks it easier to output on the terminal
00163     }
00164 }