TSI and control of leds

Dependencies:   TSI

Files at this revision

API Documentation at this revision

Comitter:
alifsohen
Date:
Fri Mar 20 04:05:11 2020 +0000
Parent:
6:71ef35e456ab
Commit message:
TSI and control of leds

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Thu Feb 20 11:28:36 2020 +0000
+++ b/main.cpp	Fri Mar 20 04:05:11 2020 +0000
@@ -10,53 +10,154 @@
 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 ; 
 
 # define REDFLAG 0x01   
 # define GREENFLAG 0x02
+
+# define BLUEFLAG 0x04
+# define EXFLAG 0x08
+
 EventFlags signals;  // event flags for signalling; 2 used
  
 void red_thread() {  // method to run in thread
+enum redState{ON, OFF};
+    redLED = true ; // off
+    redState state = OFF ;
     while (true) {
-        signals.wait_any(REDFLAG);
-        redLED = false ; // turn on
-        ThisThread::sleep_for(5000) ; // wait(5.0);
-        redLED = true ; // turn off 
-        signals.clear(REDFLAG) ;
+        switch (state) {
+            case OFF: 
+                signals.wait_any(REDFLAG);
+                redLED = false ; // turn on 
+                state = ON ;
+                break ;
+            case ON: 
+                signals.wait_any(REDFLAG);
+                redLED = true; // turn off
+                state = OFF ;
+                break ;
+        }
+        //signals.clear(REDFLAG) ;
           // Signal are automatically cleared by wait_any but
           // the signal might have been set again while LED on 
     }
 }
 
 void green_thread() {  // method to run in thread
+enum greenState{ON, OFF};
+    greenLED = true ; // off
+    greenState state = OFF ;
     while (true) {
-        signals.wait_any(GREENFLAG);
-        greenLED = false ; // turn on 
-        ThisThread::sleep_for(5000) ; // wait(5.0);
-        greenLED = true ; // turn off 
-        signals.clear(GREENFLAG) ;
+        switch (state) {
+            case OFF: 
+                signals.wait_any(GREENFLAG);
+                greenLED = false ; // turn on 
+                state = ON ;
+                break ;
+            case ON: 
+                signals.wait_any(GREENFLAG);
+                greenLED = true; // turn off
+                state = OFF ;
+                break ;
+        }
+
+        //signals.clear(GREENFLAG) ;
+          // Signal are automatically cleared by wait_any but
+          // the signal might have been set again while LED on 
+    }
+}
+
+void blue_thread() {  // method to run in thread
+enum blueState{ON, OFF};
+    blueLED = true ; // off
+    blueState state = OFF ;
+    while (true) {
+        switch (state) {
+            case OFF: 
+                signals.wait_any(BLUEFLAG);
+                blueLED = false ; // turn on 
+                state = ON ;
+                break ;
+            case ON: 
+                signals.wait_any(BLUEFLAG);
+                blueLED = true; // turn off
+                state = OFF ;
+                break ;
+        }
+        //signals.clear(BLUEFLAG) ;
           // Signal are automatically cleared by wait_any but
           // the signal might have been set again while LED on 
     }
 }
 
+
 int main(void) {
-    redLED = true ; // turn off 
-    greenLED = true ; // turn off 
+    //redLED = true ; // turn off 
+    //greenLED = true ; // turn off 
+    //blueLED = true ; // turn off 
     redThread.start(red_thread) ; // start the red thread
     greenThread.start(green_thread) ; // start the green thread
+    blueThread.start(blue_thread) ; // start the blue thread
+  
+    enum ledState{none, leftout, leftin, rightout, rightin};
+    ledState pos = none;
     
     while (true) {
         uint8_t d = tsi.readDistance() ;  // Distance is between 0 and 39
                                           // When no touch --> 0
-                                          // Left --> low value  Right --> high value
-        pc.printf("%d", d) ;  
+                                          // Left --> low value  Right --> high value                      
+        switch (pos) {
+            case none:
+                if (d > 3 && d < 9) {
+                    signals.set(REDFLAG);
+                    pos = leftout;
+                }
+                if (d > 13 && d < 19) {
+                    signals.set(GREENFLAG);
+                    pos = leftin;
+                }
+                if (d > 23 && d < 29) {
+                    signals.set(BLUEFLAG);
+                    pos = rightin;
+                }
+                if (d > 33) {
+                    signals.set(EXFLAG);
+                    pos = rightout;
+                }
+                break ;
+                
+            case leftout:
+                if (d < 3 || d > 9) {
+                    pos = none;
+                }
+                break ;
+                
+            case leftin:
+                if (d < 13 || d > 19) {
+                    pos = none;
+                }
+                break ;
+                
+            case rightin:
+                if (d < 23 || d > 29) {
+                    pos = none;
+                }
+                break ;
+                
+            case rightout:
+                if (d < 33) {
+                    pos = none;
+                }
+                break ;                
+        }
+        
+        pc.printf("%d", d) ;
         pc.putc(' ') ;
-        if (d == 10) signals.set(REDFLAG) ;
-        if (d == 20) signals.set(GREENFLAG) ;
         ThisThread::sleep_for(500) ; // This polling rate is too slow - increase it
                     // The slower rate maks it easier to output on the terminal
     }
--- a/mbed_app.json	Thu Feb 20 11:28:36 2020 +0000
+++ b/mbed_app.json	Fri Mar 20 04:05:11 2020 +0000
@@ -2,6 +2,9 @@
     "config": {
         "main-stack-size": {
             "value": 2000
+        },
+        "thread-stack-size": {
+            "value": 1000
         }
     }
 }
\ No newline at end of file