Soheil Novinfard / Mbed OS TSI_STEP2

Dependencies:   TSI

Fork of TSI_sample by William Marsh

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 
00012 DigitalOut redLED(LED_RED);
00013 DigitalOut greenLED(LED_GREEN);
00014 DigitalOut blueLED(LED_BLUE);
00015 DigitalOut whiteLED(PTC9);     // External LED
00016 
00017 TSISensor tsi;
00018 
00019 Thread leftOutThread (osPriorityNormal, 1000);
00020 Thread leftInThread (osPriorityNormal, 1000);
00021 Thread rightInThread (osPriorityNormal, 1000);
00022 Thread rightOutThread (osPriorityNormal, 1000);
00023 
00024 enum states { LeftOut, LeftIn, RightIn, RightOut, None};
00025 volatile states state = None;
00026 
00027 
00028 
00029 //void green_thread() {  // method to run in thread
00030 //    while (true) {
00031 //        Thread::signal_wait(0x1);
00032 //        greenLED = !greenLED ; // turn on
00033 //      
00034 //        greenThread.signal_clr(0x1) ;
00035 //          // Signal are automatically cleared by wait_signal but
00036 //          // the signal might have been set again while LED on
00037 //    }
00038 //}
00039 
00040 //void TurnOnLed(int ledNumber)
00041 //{
00042 //    switch (ledNumber) {
00043 //        case 1:
00044 //            redLED = false;
00045 //            greenLED = true;
00046 //            blueLED = true;
00047 //
00048 //            whiteLED = 0;
00049 //            break;
00050 //
00051 //        case 2:
00052 //            redLED = true;
00053 //            greenLED = false;
00054 //            blueLED = true;
00055 //
00056 //            whiteLED = 0;
00057 //            break;
00058 //
00059 //        case 3:
00060 //            redLED = true;
00061 //            greenLED = true;
00062 //            blueLED = false;
00063 //
00064 //            whiteLED = 0;
00065 //            break;
00066 //
00067 //        case 4:
00068 //            redLED = true;
00069 //            greenLED = true;
00070 //            blueLED = true;
00071 //
00072 //            whiteLED = 1;
00073 //            break;
00074 //    }
00075 //}
00076 
00077 void TurnOffLed()
00078 {
00079     redLED = true;
00080     greenLED = true;
00081     blueLED = true;
00082     whiteLED = 0;
00083 
00084 }
00085 
00086 
00087 void leftOut_thread()    // method to run in thread
00088 {
00089     while (true) {
00090         Thread::signal_wait(0x1); // signal for enter
00091         redLED = false;
00092 
00093         Thread::signal_wait(0x1); // signal for exit
00094         redLED = true;
00095 
00096         leftOutThread.signal_clr(0x1);
00097         leftOutThread.signal_clr(0x2);
00098         // Signal are automatically cleared by wait_signal but
00099         // the signal might have been set again
00100     }
00101 }
00102 
00103 void leftIn_thread()    // method to run in thread
00104 {
00105     while (true) {
00106         Thread::signal_wait(0x1); // signal for enter
00107         greenLED = false;
00108 
00109         Thread::signal_wait(0x1); // signal for exit
00110         greenLED = true;
00111 
00112         leftInThread.signal_clr(0x1);
00113         leftInThread.signal_clr(0x2);
00114         // Signal are automatically cleared by wait_signal but
00115         // the signal might have been set again
00116     }
00117 }
00118 
00119 
00120 void rightIn_thread()    // method to run in thread
00121 {
00122     while (true) {
00123         Thread::signal_wait(0x1); // signal for enter
00124         blueLED = !blueLED;
00125 
00126         Thread::signal_wait(0x1); // signal for exit
00127         blueLED = !blueLED;
00128 
00129         rightInThread.signal_clr(0x1);
00130         rightInThread.signal_clr(0x2);
00131         // Signal are automatically cleared by wait_signal but
00132         // the signal might have been set again
00133     }
00134 }
00135 
00136 
00137 void rightOut_thread()    // method to run in thread
00138 {
00139     while (true) {
00140         Thread::signal_wait(0x1); // signal for enter
00141         whiteLED = 1;
00142 
00143         Thread::signal_wait(0x1); // signal for exit
00144         whiteLED = 0;
00145 
00146         rightOutThread.signal_clr(0x1);
00147         rightOutThread.signal_clr(0x2);
00148         // Signal are automatically cleared by wait_signal but
00149         // the signal might have been set again
00150     }
00151 }
00152 
00153 
00154 
00155 
00156 int main(void)
00157 {
00158     TurnOffLed(); // initial turning off LED
00159 
00160     leftOutThread.start(&leftOut_thread) ; // start the leftOut thread
00161     leftInThread.start(&leftIn_thread) ; // start the leftIn thread
00162     rightInThread.start(&rightIn_thread) ; // start the rightIn thread
00163     rightOutThread.start(&rightOut_thread) ; // start the rightOut thread
00164 
00165     while (true) {
00166         uint8_t pos = tsi.readDistance() ;  // Distance is between 0 and 39
00167 
00168         pc.printf("%d", pos) ;
00169         pc.putc(' ') ;
00170 
00171 //        // start states
00172 //        if (pos>3 && pos<9) {
00173 //            leftOutThread.signal_set(0x1);
00174 //        } else if(pos>13 && pos<19) {
00175 //            leftInThread.signal_set(0x1);
00176 //        } else if(pos>23 && pos<29) {
00177 //            rightInThread.signal_set(0x1);
00178 //        } else if(pos>33) {
00179 //            rightOutThread.signal_set(0x1);
00180 //        }
00181 
00182         switch (state) {
00183             case LeftOut:
00184                 if(pos<3 || pos>9) {
00185                     state = None ;
00186                 }
00187                 break;
00188 
00189             case LeftIn:
00190                 if(pos<13 || pos>19) {
00191                     state = None ;
00192                 }
00193                 break;
00194 
00195             case RightIn:
00196                 if(pos<23 || pos>29) {
00197                     state = None ;
00198                 }
00199 
00200                 break;
00201 
00202             case RightOut:
00203                 if(pos<33) {
00204                     state = None ;
00205                 }
00206                 break;
00207 
00208             case None:
00209                 if(pos>3 && pos<9) {
00210                     state = LeftOut;
00211                     leftOutThread.signal_set(0x1);
00212                 } 
00213                 if(pos>13 && pos<19) {
00214                     state = LeftIn;
00215                     leftInThread.signal_set(0x1);
00216                 } 
00217                 if(pos>23 && pos<29) {
00218                     state = RightIn;
00219                     rightInThread.signal_set(0x1);
00220                 } 
00221                 if(pos>33) {
00222                     state = RightOut;
00223                     rightOutThread.signal_set(0x1);
00224                 } 
00225                 
00226                 break;
00227 
00228         }
00229 
00230 
00231         Thread::wait(100);  // This polling rate is too slow - increase it
00232         // The slower rate maks it easier to output on the terminal
00233     }
00234 }