Part 1

Dependencies:   TSI

Committer:
sebbarpar
Date:
Mon Mar 16 12:05:45 2020 +0000
Revision:
7:002686a28225
Parent:
6:71ef35e456ab
Part 1 finished;

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
sebbarpar 7:002686a28225 4 //Lab 5 part 1
sebbarpar 7:002686a28225 5 //LED light up according to which button is pressed
WilliamMarshQMUL 0:4374caa1ef17 6
WilliamMarshQMUL 0:4374caa1ef17 7 Serial pc(USBTX, USBRX); // tx, rx
sebbarpar 7:002686a28225 8 DigitalOut led1(PTD3,0);
sebbarpar 7:002686a28225 9 DigitalOut led2(PTD5,0);
sebbarpar 7:002686a28225 10 DigitalOut led3(PTD0,0);
sebbarpar 7:002686a28225 11 DigitalOut led4(PTD2,0);
WilliamMarshQMUL 0:4374caa1ef17 12 TSISensor tsi;
WilliamMarshQMUL 0:4374caa1ef17 13
sebbarpar 7:002686a28225 14 Thread l_out ;
sebbarpar 7:002686a28225 15 Thread l_in ;
sebbarpar 7:002686a28225 16 Thread r_out ;
sebbarpar 7:002686a28225 17 Thread r_in ;
sebbarpar 7:002686a28225 18
sebbarpar 7:002686a28225 19 enum pos{neutral, lo, li, ri, ro};
sebbarpar 7:002686a28225 20 enum ledonoff{on, off};
sebbarpar 7:002686a28225 21
sebbarpar 7:002686a28225 22 # define lout 0x01
sebbarpar 7:002686a28225 23 # define lin 0x02
sebbarpar 7:002686a28225 24 # define rin 0x04
sebbarpar 7:002686a28225 25 # define rout 0x08
sebbarpar 7:002686a28225 26
sebbarpar 7:002686a28225 27 EventFlags signals;
WilliamMarshQMUL 5:2a9a3d74a1d8 28
sebbarpar 7:002686a28225 29 void leftout() {
sebbarpar 7:002686a28225 30 int l1=on;
WilliamMarshQMUL 0:4374caa1ef17 31 while (true) {
sebbarpar 7:002686a28225 32 switch (l1){
sebbarpar 7:002686a28225 33 case on:
sebbarpar 7:002686a28225 34 signals.wait_any(lout);//Wait until flag
sebbarpar 7:002686a28225 35 //pc.printf("lo ");
sebbarpar 7:002686a28225 36 led1=1;
sebbarpar 7:002686a28225 37 l1=off;//Turn LED on or off
sebbarpar 7:002686a28225 38 signals.clear(lout);
sebbarpar 7:002686a28225 39 break;
sebbarpar 7:002686a28225 40 case off:
sebbarpar 7:002686a28225 41 signals.wait_any(lout);
sebbarpar 7:002686a28225 42 //pc.printf("lo ");
sebbarpar 7:002686a28225 43 led1=0;
sebbarpar 7:002686a28225 44 l1=on;
sebbarpar 7:002686a28225 45 signals.clear(lout);
sebbarpar 7:002686a28225 46 break;
sebbarpar 7:002686a28225 47 }
WilliamMarshQMUL 0:4374caa1ef17 48 }
WilliamMarshQMUL 0:4374caa1ef17 49 }
sebbarpar 7:002686a28225 50 void leftin() {
sebbarpar 7:002686a28225 51 int l2=on;
sebbarpar 7:002686a28225 52 while (true) {
sebbarpar 7:002686a28225 53 switch (l2){
sebbarpar 7:002686a28225 54 case on:
sebbarpar 7:002686a28225 55 signals.wait_any(lin);
sebbarpar 7:002686a28225 56 //pc.printf("li ");
sebbarpar 7:002686a28225 57 led2=1;
sebbarpar 7:002686a28225 58 l2=off;
sebbarpar 7:002686a28225 59 signals.clear(lin);
sebbarpar 7:002686a28225 60 break;
sebbarpar 7:002686a28225 61 case off:
sebbarpar 7:002686a28225 62 signals.wait_any(lin);
sebbarpar 7:002686a28225 63 //pc.printf("li ");
sebbarpar 7:002686a28225 64 led2=0;
sebbarpar 7:002686a28225 65 l2=on;
sebbarpar 7:002686a28225 66 signals.clear(lin);
sebbarpar 7:002686a28225 67 break;
sebbarpar 7:002686a28225 68 }
sebbarpar 7:002686a28225 69 }
sebbarpar 7:002686a28225 70 }
sebbarpar 7:002686a28225 71 void rightin() {
sebbarpar 7:002686a28225 72 int l3=on;
WilliamMarshQMUL 0:4374caa1ef17 73 while (true) {
sebbarpar 7:002686a28225 74 switch (l3){
sebbarpar 7:002686a28225 75 case on:
sebbarpar 7:002686a28225 76 signals.wait_any(rin);
sebbarpar 7:002686a28225 77 //pc.printf("ri ");
sebbarpar 7:002686a28225 78 led3=1;
sebbarpar 7:002686a28225 79 l3=off;
sebbarpar 7:002686a28225 80 signals.clear(rin);
sebbarpar 7:002686a28225 81 break;
sebbarpar 7:002686a28225 82 case off:
sebbarpar 7:002686a28225 83 signals.wait_any(rin);
sebbarpar 7:002686a28225 84 //pc.printf("ri ");
sebbarpar 7:002686a28225 85 led3=0;
sebbarpar 7:002686a28225 86 l3=on;
sebbarpar 7:002686a28225 87 signals.clear(rin);
sebbarpar 7:002686a28225 88 break;
sebbarpar 7:002686a28225 89 }
sebbarpar 7:002686a28225 90 }
sebbarpar 7:002686a28225 91 }
sebbarpar 7:002686a28225 92 void rightout() {
sebbarpar 7:002686a28225 93 int l4=on;
sebbarpar 7:002686a28225 94 while (true) {
sebbarpar 7:002686a28225 95 switch (l4){
sebbarpar 7:002686a28225 96 case on:
sebbarpar 7:002686a28225 97 signals.wait_any(rout);
sebbarpar 7:002686a28225 98 //pc.printf("ro ");
sebbarpar 7:002686a28225 99 led4=1;
sebbarpar 7:002686a28225 100 l4=off;
sebbarpar 7:002686a28225 101 signals.clear(rout);
sebbarpar 7:002686a28225 102 break;
sebbarpar 7:002686a28225 103 case off:
sebbarpar 7:002686a28225 104 signals.wait_any(rout);
sebbarpar 7:002686a28225 105 //pc.printf("ro ");
sebbarpar 7:002686a28225 106 led4=0;
sebbarpar 7:002686a28225 107 l4=on;
sebbarpar 7:002686a28225 108 signals.clear(rout);
sebbarpar 7:002686a28225 109 break;
sebbarpar 7:002686a28225 110 }
WilliamMarshQMUL 0:4374caa1ef17 111 }
WilliamMarshQMUL 0:4374caa1ef17 112 }
WilliamMarshQMUL 0:4374caa1ef17 113
WilliamMarshQMUL 0:4374caa1ef17 114 int main(void) {
sebbarpar 7:002686a28225 115 int pos=neutral;
sebbarpar 7:002686a28225 116 uint8_t d;
sebbarpar 7:002686a28225 117 pc.printf("START");
sebbarpar 7:002686a28225 118 l_out.start(leftout) ;
sebbarpar 7:002686a28225 119 l_in.start(leftin) ;
sebbarpar 7:002686a28225 120 r_in.start(rightin);
sebbarpar 7:002686a28225 121 r_out.start(rightout);
WilliamMarshQMUL 0:4374caa1ef17 122
WilliamMarshQMUL 0:4374caa1ef17 123 while (true) {
sebbarpar 7:002686a28225 124 d = tsi.readDistance() ; // Distance is between 0 and 39
WilliamMarshQMUL 0:4374caa1ef17 125 // When no touch --> 0
WilliamMarshQMUL 0:4374caa1ef17 126 // Left --> low value Right --> high value
sebbarpar 7:002686a28225 127 switch (pos){
sebbarpar 7:002686a28225 128 case neutral:
sebbarpar 7:002686a28225 129 if (d>3 && d<9){pos=lo; signals.set(lout);} //Set flags and change states
sebbarpar 7:002686a28225 130 if (d>13 && d<19){pos=li; signals.set(lin);}
sebbarpar 7:002686a28225 131 if (d>23 && d<29){pos=ri; signals.set(rin);}
sebbarpar 7:002686a28225 132 if (d>33){pos=ro; signals.set(rout);}
sebbarpar 7:002686a28225 133 break;
sebbarpar 7:002686a28225 134 case lo:
sebbarpar 7:002686a28225 135 if (d<3 || d>9) pos=neutral;
sebbarpar 7:002686a28225 136 break;
sebbarpar 7:002686a28225 137 case li:
sebbarpar 7:002686a28225 138 if (d<13 || d>19) pos=neutral;
sebbarpar 7:002686a28225 139 break;
sebbarpar 7:002686a28225 140 case ri:
sebbarpar 7:002686a28225 141 if (d<23 || d>29) pos=neutral;
sebbarpar 7:002686a28225 142 break;
sebbarpar 7:002686a28225 143 case ro:
sebbarpar 7:002686a28225 144 if (d<33) pos=neutral;
sebbarpar 7:002686a28225 145 break;
sebbarpar 7:002686a28225 146 }
WilliamMarshQMUL 0:4374caa1ef17 147 pc.printf("%d", d) ;
WilliamMarshQMUL 1:e6ffa08ad8bf 148 pc.putc(' ') ;
sebbarpar 7:002686a28225 149 ThisThread::sleep_for(100) ;
sebbarpar 7:002686a28225 150 }
WilliamMarshQMUL 0:4374caa1ef17 151 }