TSI and control of leds

Dependencies:   TSI

Committer:
alifsohen
Date:
Fri Mar 20 04:05:11 2020 +0000
Revision:
7:850764512ca0
Parent:
6:71ef35e456ab
TSI and control of leds

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WilliamMarshQMUL 0:4374caa1ef17 1 #include "mbed.h"
WilliamMarshQMUL 0:4374caa1ef17 2 #include "TSISensor.h"
WilliamMarshQMUL 0:4374caa1ef17 3
WilliamMarshQMUL 0:4374caa1ef17 4 // Example program for lab 5
WilliamMarshQMUL 0:4374caa1ef17 5 // -------------------------
WilliamMarshQMUL 0:4374caa1ef17 6 // A value is read from the touch sensor and use
WilliamMarshQMUL 0:4374caa1ef17 7 // to control two LEDs
WilliamMarshQMUL 0:4374caa1ef17 8 // The value is also output to the serial interface
WilliamMarshQMUL 0:4374caa1ef17 9
WilliamMarshQMUL 0:4374caa1ef17 10 Serial pc(USBTX, USBRX); // tx, rx
WilliamMarshQMUL 0:4374caa1ef17 11 DigitalOut redLED(LED_RED);
WilliamMarshQMUL 0:4374caa1ef17 12 DigitalOut greenLED(LED_GREEN);
alifsohen 7:850764512ca0 13 DigitalOut blueLED(LED_BLUE);
WilliamMarshQMUL 0:4374caa1ef17 14 TSISensor tsi;
WilliamMarshQMUL 0:4374caa1ef17 15
WilliamMarshQMUL 0:4374caa1ef17 16 Thread redThread ; // thread for red LED
WilliamMarshQMUL 0:4374caa1ef17 17 Thread greenThread ; // thread for green LED
alifsohen 7:850764512ca0 18 Thread blueThread ;
WilliamMarshQMUL 5:2a9a3d74a1d8 19
WilliamMarshQMUL 5:2a9a3d74a1d8 20 # define REDFLAG 0x01
WilliamMarshQMUL 5:2a9a3d74a1d8 21 # define GREENFLAG 0x02
alifsohen 7:850764512ca0 22
alifsohen 7:850764512ca0 23 # define BLUEFLAG 0x04
alifsohen 7:850764512ca0 24 # define EXFLAG 0x08
alifsohen 7:850764512ca0 25
WilliamMarshQMUL 5:2a9a3d74a1d8 26 EventFlags signals; // event flags for signalling; 2 used
WilliamMarshQMUL 0:4374caa1ef17 27
WilliamMarshQMUL 0:4374caa1ef17 28 void red_thread() { // method to run in thread
alifsohen 7:850764512ca0 29 enum redState{ON, OFF};
alifsohen 7:850764512ca0 30 redLED = true ; // off
alifsohen 7:850764512ca0 31 redState state = OFF ;
WilliamMarshQMUL 0:4374caa1ef17 32 while (true) {
alifsohen 7:850764512ca0 33 switch (state) {
alifsohen 7:850764512ca0 34 case OFF:
alifsohen 7:850764512ca0 35 signals.wait_any(REDFLAG);
alifsohen 7:850764512ca0 36 redLED = false ; // turn on
alifsohen 7:850764512ca0 37 state = ON ;
alifsohen 7:850764512ca0 38 break ;
alifsohen 7:850764512ca0 39 case ON:
alifsohen 7:850764512ca0 40 signals.wait_any(REDFLAG);
alifsohen 7:850764512ca0 41 redLED = true; // turn off
alifsohen 7:850764512ca0 42 state = OFF ;
alifsohen 7:850764512ca0 43 break ;
alifsohen 7:850764512ca0 44 }
alifsohen 7:850764512ca0 45 //signals.clear(REDFLAG) ;
WilliamMarshQMUL 5:2a9a3d74a1d8 46 // Signal are automatically cleared by wait_any but
WilliamMarshQMUL 0:4374caa1ef17 47 // the signal might have been set again while LED on
WilliamMarshQMUL 0:4374caa1ef17 48 }
WilliamMarshQMUL 0:4374caa1ef17 49 }
WilliamMarshQMUL 0:4374caa1ef17 50
WilliamMarshQMUL 0:4374caa1ef17 51 void green_thread() { // method to run in thread
alifsohen 7:850764512ca0 52 enum greenState{ON, OFF};
alifsohen 7:850764512ca0 53 greenLED = true ; // off
alifsohen 7:850764512ca0 54 greenState state = OFF ;
WilliamMarshQMUL 0:4374caa1ef17 55 while (true) {
alifsohen 7:850764512ca0 56 switch (state) {
alifsohen 7:850764512ca0 57 case OFF:
alifsohen 7:850764512ca0 58 signals.wait_any(GREENFLAG);
alifsohen 7:850764512ca0 59 greenLED = false ; // turn on
alifsohen 7:850764512ca0 60 state = ON ;
alifsohen 7:850764512ca0 61 break ;
alifsohen 7:850764512ca0 62 case ON:
alifsohen 7:850764512ca0 63 signals.wait_any(GREENFLAG);
alifsohen 7:850764512ca0 64 greenLED = true; // turn off
alifsohen 7:850764512ca0 65 state = OFF ;
alifsohen 7:850764512ca0 66 break ;
alifsohen 7:850764512ca0 67 }
alifsohen 7:850764512ca0 68
alifsohen 7:850764512ca0 69 //signals.clear(GREENFLAG) ;
alifsohen 7:850764512ca0 70 // Signal are automatically cleared by wait_any but
alifsohen 7:850764512ca0 71 // the signal might have been set again while LED on
alifsohen 7:850764512ca0 72 }
alifsohen 7:850764512ca0 73 }
alifsohen 7:850764512ca0 74
alifsohen 7:850764512ca0 75 void blue_thread() { // method to run in thread
alifsohen 7:850764512ca0 76 enum blueState{ON, OFF};
alifsohen 7:850764512ca0 77 blueLED = true ; // off
alifsohen 7:850764512ca0 78 blueState state = OFF ;
alifsohen 7:850764512ca0 79 while (true) {
alifsohen 7:850764512ca0 80 switch (state) {
alifsohen 7:850764512ca0 81 case OFF:
alifsohen 7:850764512ca0 82 signals.wait_any(BLUEFLAG);
alifsohen 7:850764512ca0 83 blueLED = false ; // turn on
alifsohen 7:850764512ca0 84 state = ON ;
alifsohen 7:850764512ca0 85 break ;
alifsohen 7:850764512ca0 86 case ON:
alifsohen 7:850764512ca0 87 signals.wait_any(BLUEFLAG);
alifsohen 7:850764512ca0 88 blueLED = true; // turn off
alifsohen 7:850764512ca0 89 state = OFF ;
alifsohen 7:850764512ca0 90 break ;
alifsohen 7:850764512ca0 91 }
alifsohen 7:850764512ca0 92 //signals.clear(BLUEFLAG) ;
WilliamMarshQMUL 5:2a9a3d74a1d8 93 // Signal are automatically cleared by wait_any but
WilliamMarshQMUL 0:4374caa1ef17 94 // the signal might have been set again while LED on
WilliamMarshQMUL 0:4374caa1ef17 95 }
WilliamMarshQMUL 0:4374caa1ef17 96 }
WilliamMarshQMUL 0:4374caa1ef17 97
alifsohen 7:850764512ca0 98
WilliamMarshQMUL 0:4374caa1ef17 99 int main(void) {
alifsohen 7:850764512ca0 100 //redLED = true ; // turn off
alifsohen 7:850764512ca0 101 //greenLED = true ; // turn off
alifsohen 7:850764512ca0 102 //blueLED = true ; // turn off
WilliamMarshQMUL 5:2a9a3d74a1d8 103 redThread.start(red_thread) ; // start the red thread
WilliamMarshQMUL 5:2a9a3d74a1d8 104 greenThread.start(green_thread) ; // start the green thread
alifsohen 7:850764512ca0 105 blueThread.start(blue_thread) ; // start the blue thread
alifsohen 7:850764512ca0 106
alifsohen 7:850764512ca0 107 enum ledState{none, leftout, leftin, rightout, rightin};
alifsohen 7:850764512ca0 108 ledState pos = none;
WilliamMarshQMUL 0:4374caa1ef17 109
WilliamMarshQMUL 0:4374caa1ef17 110 while (true) {
WilliamMarshQMUL 0:4374caa1ef17 111 uint8_t d = tsi.readDistance() ; // Distance is between 0 and 39
WilliamMarshQMUL 0:4374caa1ef17 112 // When no touch --> 0
alifsohen 7:850764512ca0 113 // Left --> low value Right --> high value
alifsohen 7:850764512ca0 114 switch (pos) {
alifsohen 7:850764512ca0 115 case none:
alifsohen 7:850764512ca0 116 if (d > 3 && d < 9) {
alifsohen 7:850764512ca0 117 signals.set(REDFLAG);
alifsohen 7:850764512ca0 118 pos = leftout;
alifsohen 7:850764512ca0 119 }
alifsohen 7:850764512ca0 120 if (d > 13 && d < 19) {
alifsohen 7:850764512ca0 121 signals.set(GREENFLAG);
alifsohen 7:850764512ca0 122 pos = leftin;
alifsohen 7:850764512ca0 123 }
alifsohen 7:850764512ca0 124 if (d > 23 && d < 29) {
alifsohen 7:850764512ca0 125 signals.set(BLUEFLAG);
alifsohen 7:850764512ca0 126 pos = rightin;
alifsohen 7:850764512ca0 127 }
alifsohen 7:850764512ca0 128 if (d > 33) {
alifsohen 7:850764512ca0 129 signals.set(EXFLAG);
alifsohen 7:850764512ca0 130 pos = rightout;
alifsohen 7:850764512ca0 131 }
alifsohen 7:850764512ca0 132 break ;
alifsohen 7:850764512ca0 133
alifsohen 7:850764512ca0 134 case leftout:
alifsohen 7:850764512ca0 135 if (d < 3 || d > 9) {
alifsohen 7:850764512ca0 136 pos = none;
alifsohen 7:850764512ca0 137 }
alifsohen 7:850764512ca0 138 break ;
alifsohen 7:850764512ca0 139
alifsohen 7:850764512ca0 140 case leftin:
alifsohen 7:850764512ca0 141 if (d < 13 || d > 19) {
alifsohen 7:850764512ca0 142 pos = none;
alifsohen 7:850764512ca0 143 }
alifsohen 7:850764512ca0 144 break ;
alifsohen 7:850764512ca0 145
alifsohen 7:850764512ca0 146 case rightin:
alifsohen 7:850764512ca0 147 if (d < 23 || d > 29) {
alifsohen 7:850764512ca0 148 pos = none;
alifsohen 7:850764512ca0 149 }
alifsohen 7:850764512ca0 150 break ;
alifsohen 7:850764512ca0 151
alifsohen 7:850764512ca0 152 case rightout:
alifsohen 7:850764512ca0 153 if (d < 33) {
alifsohen 7:850764512ca0 154 pos = none;
alifsohen 7:850764512ca0 155 }
alifsohen 7:850764512ca0 156 break ;
alifsohen 7:850764512ca0 157 }
alifsohen 7:850764512ca0 158
alifsohen 7:850764512ca0 159 pc.printf("%d", d) ;
WilliamMarshQMUL 1:e6ffa08ad8bf 160 pc.putc(' ') ;
WilliamMarshQMUL 6:71ef35e456ab 161 ThisThread::sleep_for(500) ; // This polling rate is too slow - increase it
WilliamMarshQMUL 5:2a9a3d74a1d8 162 // The slower rate maks it easier to output on the terminal
WilliamMarshQMUL 0:4374caa1ef17 163 }
WilliamMarshQMUL 0:4374caa1ef17 164 }