Andrew Mkpanam / Mbed OS TSI_Code

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 
00017 Thread redThread ; // thread for red LED
00018 Thread greenThread ; // thread for green LED
00019 Thread blueThread;
00020 Thread whiteThread;
00021 
00022 
00023 
00024 # define FLAG1 0x01   
00025 # define FLAG2 0x02
00026 # define FLAG3 0x04   
00027 # define FLAG4 0x08
00028 EventFlags signals;  // event flags for signalling; 4 used
00029  
00030 void red_thread()    // method to run in thread
00031 {
00032 redLED = true ; // turn off 
00033 greenLED = true ; // turn off 
00034 blueLED = true;
00035     enum state {ON, OFF} lev ;
00036     lev = OFF;
00037     while (true) {
00038         switch (lev) {
00039             case ON:
00040                 signals.wait_any(FLAG1);
00041                 redLED = true ; // turn off
00042                 //signals.clear(FLAG1) ;
00043                 lev= OFF;
00044                 break ;
00045             case OFF:
00046                 signals.wait_any(FLAG1);
00047                 redLED = false ; // turn off
00048                 lev = ON;
00049                 break ;
00050                 //signals.clear(FLAG1) ;
00051                 // Signal are automatically cleared by wait_any but
00052         }   // the signal might have been set again while LED on
00053     }
00054 }
00055 
00056 void green_thread()    // method to run in thread
00057 {
00058     redLED = true ; // turn off
00059     greenLED = true ; // turn off
00060     blueLED = true;
00061     enum state {ON, OFF} lev ;
00062     lev = OFF;
00063     while (true) {
00064         switch (lev) {
00065             case ON:
00066                 signals.wait_any(FLAG2);
00067                 greenLED = true ; // turn off
00068                 lev = OFF;
00069                 break ;
00070             //signals.clear(FLAG2) ;
00071             case OFF:
00072                 signals.wait_any(FLAG2);
00073                 greenLED = false ; // turn off
00074                 lev = ON;
00075                 break ;
00076                 
00077                 //signals.clear(FLAG2) ;
00078                 // Signal are automatically cleared by wait_any but
00079                 // the signal might have been set again while LED on
00080         }
00081     }
00082 }
00083 void blue_thread()    // method to run in thread
00084 {
00085 redLED = true ; // turn off 
00086 greenLED = true ; // turn off 
00087 blueLED = true;
00088     enum state {ON, OFF} lev ;
00089     lev = OFF;
00090     while (true) {
00091         switch (lev) {
00092             case ON:
00093                 signals.wait_any(FLAG3);
00094                 blueLED = true ; // turn off
00095                 lev = OFF ;
00096                 break ;
00097             //signals.clear(FLAG3) ;
00098             case OFF:
00099                 signals.wait_any(FLAG3);
00100                 blueLED = false ; // turn off
00101                 lev = ON ;
00102                 break ;
00103                 //signals.clear(FLAG3) ;
00104                 // Signal are automatically cleared by wait_any but
00105                 // the signal might have been set again while LED on
00106         }
00107     }
00108 }
00109 void white_thread() {  // method to run in thread
00110 redLED = true ; // turn off 
00111 greenLED = true ; // turn off 
00112 blueLED = true;
00113 enum state {ON, OFF} lev ;
00114     lev = OFF;
00115     while (true) {
00116       switch (lev){
00117       case ON:
00118         signals.wait_any(FLAG4);
00119                 break ;
00120                 lev = OFF;
00121       case OFF:
00122         signals.wait_any(FLAG4);
00123                 break ;
00124                 lev = ON;
00125         //signals.clear(FLAG4) ;
00126           // Signal are automatically cleared by wait_any but
00127           // the signal might have been set again while LED on 
00128         }
00129     }
00130 }
00131 
00132 int main(void) {
00133     //redLED = true ; // turn off 
00134     //greenLED = true ; // turn off 
00135     //blueLED = true;
00136     
00137     redThread.start(red_thread) ; // start the red thread
00138     greenThread.start(green_thread) ; // start the green thread
00139     blueThread.start(blue_thread) ; // start the red thread
00140     whiteThread.start(white_thread) ; // start the green thread
00141     
00142     enum position { none, leftout, leftin, rightin, rightout,} pos;
00143     pos = none;
00144     
00145     while (true) {
00146         uint8_t d = tsi.readDistance() ;  // Distance is between 0 and 39
00147                                           // When no touch --> 0
00148                                           // Left --> low value  Right --> high value
00149         pc.printf("%d", d) ;  
00150         pc.putc(' ') ;
00151         switch (pos) {
00152 
00153             case none:
00154                 if ((d > 3)&& (d<9))  {
00155                     pos = leftout;
00156                     signals.set(FLAG1);
00157                     pc.printf("Case Leftout \n\r", d);
00158                 }
00159                 if ((d > 13)&&(d<19))  {
00160                     pos = leftin;
00161                     signals.set(FLAG2);
00162                     pc.printf("Case Leftin \n\r", d);
00163                 }
00164                 if ((d > 23)&&(d <29))  {
00165                     pos = rightin;
00166                     signals.set(FLAG3);
00167                     pc.printf("Case Rightin \n\r", d);
00168                 }
00169                 if (d > 33) {
00170                     pos = rightout;
00171                     signals.set(FLAG4);
00172                     pc.printf("Case Rightiout \n\r", d);
00173                 }
00174                 break;
00175 
00176             case leftout:
00177                 if ((d < 3)||(d>9))  {
00178                     pos = none;
00179                     pc.printf("Case None \n\r", d);
00180                 }
00181                 break;
00182 
00183             case leftin:
00184                 if ((d < 13)||(d>19))  {
00185                     pos = none;
00186                     pc.printf("Case None \n\r", d);
00187                 }
00188                 break;
00189 
00190             case rightin:
00191                 if ((d < 23)||(d>29))  {
00192                     pos = none;
00193                     pc.printf("Case None \n\r", d);
00194                 }
00195                 break;
00196             case rightout:
00197                 if (d < 33)  {
00198                     pos = none;
00199                     pc.printf("Case None \n\r", d);
00200                 }
00201                 break;
00202         }
00203 
00204         //if (d == 10) signals.set(REDFLAG) ;
00205         //if (d == 20) signals.set(GREENFLAG) ;
00206         ThisThread::sleep_for(500) ; // This polling rate is too slow - increase it
00207         // The slower rate maks it easier to output on the terminal
00208     }
00209 }