Alif Ahmed
/
TSI_part1
TSI and control of leds
main.cpp@7:850764512ca0, 2020-03-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |