Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Tue Jul 12 2022 20:23:41 by
1.7.2