hw3
Dependencies: LSM303DLHC-a PinDetect USBDevice mbed
acchello.cpp@1:f1a403c1fa78, 2014-09-29 (annotated)
- Committer:
- jn80842
- Date:
- Mon Sep 29 08:52:31 2014 +0000
- Revision:
- 1:f1a403c1fa78
- Parent:
- 0:d3a803c3a1c5
quasi done
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jn80842 | 0:d3a803c3a1c5 | 1 | #include "mbed.h" |
jn80842 | 0:d3a803c3a1c5 | 2 | #include "vector.h" |
jn80842 | 0:d3a803c3a1c5 | 3 | #include "LSM303DLHC.h" |
jn80842 | 0:d3a803c3a1c5 | 4 | #include "USBKeyboard.h" |
jn80842 | 0:d3a803c3a1c5 | 5 | |
jn80842 | 0:d3a803c3a1c5 | 6 | Serial pc(USBTX, USBRX); // tx, rx |
jn80842 | 0:d3a803c3a1c5 | 7 | USBKeyboard keyboard; |
jn80842 | 0:d3a803c3a1c5 | 8 | // top face |
jn80842 | 0:d3a803c3a1c5 | 9 | LSM303DLHC lsm(PTE0,PTE1); |
jn80842 | 0:d3a803c3a1c5 | 10 | AnalogIn pU1(A0); // up |
jn80842 | 0:d3a803c3a1c5 | 11 | AnalogIn pD1(A1); //down |
jn80842 | 0:d3a803c3a1c5 | 12 | AnalogIn pR1(A2); //right |
jn80842 | 0:d3a803c3a1c5 | 13 | AnalogIn pL1(A3); //left |
jn80842 | 0:d3a803c3a1c5 | 14 | |
jn80842 | 0:d3a803c3a1c5 | 15 | // bottom face |
jn80842 | 0:d3a803c3a1c5 | 16 | AnalogIn pU(PTE20); //up |
jn80842 | 0:d3a803c3a1c5 | 17 | AnalogIn pD(PTE21); //down |
jn80842 | 0:d3a803c3a1c5 | 18 | AnalogIn pR(PTE22); //right |
jn80842 | 0:d3a803c3a1c5 | 19 | AnalogIn pL(PTE23); //left |
jn80842 | 0:d3a803c3a1c5 | 20 | |
jn80842 | 0:d3a803c3a1c5 | 21 | //switches |
jn80842 | 0:d3a803c3a1c5 | 22 | DigitalIn s1(D6); |
jn80842 | 0:d3a803c3a1c5 | 23 | DigitalIn s2(D7); |
jn80842 | 0:d3a803c3a1c5 | 24 | |
jn80842 | 0:d3a803c3a1c5 | 25 | // Integers |
jn80842 | 0:d3a803c3a1c5 | 26 | int counter = 0; |
jn80842 | 0:d3a803c3a1c5 | 27 | |
jn80842 | 0:d3a803c3a1c5 | 28 | // Levels for photocells |
jn80842 | 0:d3a803c3a1c5 | 29 | float covered = 0.5; // maximum value to be considered covered |
jn80842 | 0:d3a803c3a1c5 | 30 | float opened = 0.8; // minimum value to be considered open (ambient) |
jn80842 | 0:d3a803c3a1c5 | 31 | |
jn80842 | 0:d3a803c3a1c5 | 32 | // boolean variables for different wait states |
jn80842 | 0:d3a803c3a1c5 | 33 | bool waitingUP = false; |
jn80842 | 0:d3a803c3a1c5 | 34 | bool waitingDOWN = false; |
jn80842 | 0:d3a803c3a1c5 | 35 | bool waitingRIGHT = false; |
jn80842 | 0:d3a803c3a1c5 | 36 | bool waitingLEFT = false; |
jn80842 | 0:d3a803c3a1c5 | 37 | |
jn80842 | 0:d3a803c3a1c5 | 38 | class Orientation { |
jn80842 | 0:d3a803c3a1c5 | 39 | vector a, m; |
jn80842 | 0:d3a803c3a1c5 | 40 | bool rightSideUp, movingDown, movingUp, movedDown, movedUp; |
jn80842 | 0:d3a803c3a1c5 | 41 | float top_threshold, bottom_threshold; |
jn80842 | 0:d3a803c3a1c5 | 42 | public: Orientation() { |
jn80842 | 0:d3a803c3a1c5 | 43 | top_threshold = -0.3; |
jn80842 | 0:d3a803c3a1c5 | 44 | bottom_threshold = 0.3; |
jn80842 | 0:d3a803c3a1c5 | 45 | rightSideUp = true; |
jn80842 | 0:d3a803c3a1c5 | 46 | movingDown = false; |
jn80842 | 0:d3a803c3a1c5 | 47 | movingUp = false; |
jn80842 | 0:d3a803c3a1c5 | 48 | movedDown = false; |
jn80842 | 0:d3a803c3a1c5 | 49 | movedUp = true; |
jn80842 | 0:d3a803c3a1c5 | 50 | } |
jn80842 | 0:d3a803c3a1c5 | 51 | bool isRightSideUp() { |
jn80842 | 0:d3a803c3a1c5 | 52 | |
jn80842 | 0:d3a803c3a1c5 | 53 | bool check = lsm.read(&a.x,&a.y,&a.z,&m.x,&m.y,&m.z); |
jn80842 | 0:d3a803c3a1c5 | 54 | //pc.printf("x %f y %f z %f",a.z,a.y,a.z); |
jn80842 | 0:d3a803c3a1c5 | 55 | pc.printf("{ \"x\": %f, \"y\": %f, \"z\": %f}\r\n",a.x,a.y,a.z); |
jn80842 | 0:d3a803c3a1c5 | 56 | if (check) { |
jn80842 | 0:d3a803c3a1c5 | 57 | if (a.x > top_threshold) { |
jn80842 | 0:d3a803c3a1c5 | 58 | movingDown = true; |
jn80842 | 0:d3a803c3a1c5 | 59 | movingUp = false; |
jn80842 | 0:d3a803c3a1c5 | 60 | } else if (a.x < bottom_threshold) { |
jn80842 | 0:d3a803c3a1c5 | 61 | movingUp = true; |
jn80842 | 0:d3a803c3a1c5 | 62 | movingDown = false; |
jn80842 | 0:d3a803c3a1c5 | 63 | } |
jn80842 | 0:d3a803c3a1c5 | 64 | if (movingDown && a.x > bottom_threshold) { |
jn80842 | 0:d3a803c3a1c5 | 65 | movingDown = false; |
jn80842 | 0:d3a803c3a1c5 | 66 | movedUp = false; |
jn80842 | 0:d3a803c3a1c5 | 67 | movedDown = true; |
jn80842 | 0:d3a803c3a1c5 | 68 | } else if (movingUp && a.x < top_threshold) { |
jn80842 | 0:d3a803c3a1c5 | 69 | movingUp = false; |
jn80842 | 0:d3a803c3a1c5 | 70 | movedDown = false; |
jn80842 | 0:d3a803c3a1c5 | 71 | movedUp = true; |
jn80842 | 0:d3a803c3a1c5 | 72 | } |
jn80842 | 0:d3a803c3a1c5 | 73 | if (!rightSideUp && movedUp) { |
jn80842 | 0:d3a803c3a1c5 | 74 | rightSideUp = true; |
jn80842 | 0:d3a803c3a1c5 | 75 | } else if (rightSideUp && movedDown) { |
jn80842 | 0:d3a803c3a1c5 | 76 | rightSideUp = false; |
jn80842 | 0:d3a803c3a1c5 | 77 | } |
jn80842 | 0:d3a803c3a1c5 | 78 | } |
jn80842 | 0:d3a803c3a1c5 | 79 | return rightSideUp; |
jn80842 | 0:d3a803c3a1c5 | 80 | } |
jn80842 | 0:d3a803c3a1c5 | 81 | }; |
jn80842 | 0:d3a803c3a1c5 | 82 | |
jn80842 | 0:d3a803c3a1c5 | 83 | bool isCovered(AnalogIn p) { |
jn80842 | 0:d3a803c3a1c5 | 84 | return p < covered; |
jn80842 | 0:d3a803c3a1c5 | 85 | } |
jn80842 | 0:d3a803c3a1c5 | 86 | |
jn80842 | 0:d3a803c3a1c5 | 87 | bool isOpen(AnalogIn p) { |
jn80842 | 0:d3a803c3a1c5 | 88 | return p > opened; |
jn80842 | 0:d3a803c3a1c5 | 89 | } |
jn80842 | 0:d3a803c3a1c5 | 90 | |
jn80842 | 0:d3a803c3a1c5 | 91 | bool photoCellUp(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) { |
jn80842 | 0:d3a803c3a1c5 | 92 | // pc.printf("covered only up\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 93 | return isCovered(pUp) && isOpen(pDown) && isOpen(pRight) && isOpen(pLeft); |
jn80842 | 0:d3a803c3a1c5 | 94 | } |
jn80842 | 0:d3a803c3a1c5 | 95 | |
jn80842 | 0:d3a803c3a1c5 | 96 | bool photoCellDown(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) { |
jn80842 | 0:d3a803c3a1c5 | 97 | //pc.printf("covered only down\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 98 | return isOpen(pUp) && isCovered(pDown) && isOpen(pRight) && isOpen(pLeft); |
jn80842 | 0:d3a803c3a1c5 | 99 | } |
jn80842 | 0:d3a803c3a1c5 | 100 | |
jn80842 | 0:d3a803c3a1c5 | 101 | bool photoCellLeft(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) { |
jn80842 | 0:d3a803c3a1c5 | 102 | //pc.printf("covered only right\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 103 | return isOpen(pUp) && isOpen(pDown) && isOpen(pRight) && isCovered(pLeft); |
jn80842 | 0:d3a803c3a1c5 | 104 | } |
jn80842 | 0:d3a803c3a1c5 | 105 | |
jn80842 | 0:d3a803c3a1c5 | 106 | bool photoCellRight(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) { |
jn80842 | 0:d3a803c3a1c5 | 107 | //pc.printf("covered only left\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 108 | return isOpen(pUp) && isOpen(pDown) && isCovered(pRight) && isOpen(pLeft); |
jn80842 | 0:d3a803c3a1c5 | 109 | } |
jn80842 | 0:d3a803c3a1c5 | 110 | |
jn80842 | 0:d3a803c3a1c5 | 111 | |
jn80842 | 0:d3a803c3a1c5 | 112 | int main() { |
jn80842 | 0:d3a803c3a1c5 | 113 | pc.printf("hello\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 114 | Orientation up; |
jn80842 | 0:d3a803c3a1c5 | 115 | bool lastRightSideUp = true; |
jn80842 | 0:d3a803c3a1c5 | 116 | |
jn80842 | 0:d3a803c3a1c5 | 117 | while (1) { |
jn80842 | 0:d3a803c3a1c5 | 118 | bool rightSideUp = up.isRightSideUp(); |
jn80842 | 0:d3a803c3a1c5 | 119 | if (rightSideUp != lastRightSideUp) { |
jn80842 | 0:d3a803c3a1c5 | 120 | pc.printf("flipped\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 121 | //keyboard.printf("f\r"); |
jn80842 | 0:d3a803c3a1c5 | 122 | } |
jn80842 | 0:d3a803c3a1c5 | 123 | if (rightSideUp) { |
jn80842 | 0:d3a803c3a1c5 | 124 | pc.printf("RIGHT SIDE UP\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 125 | } else { |
jn80842 | 0:d3a803c3a1c5 | 126 | pc.printf("UP SIDE DOWN\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 127 | } |
jn80842 | 0:d3a803c3a1c5 | 128 | lastRightSideUp = rightSideUp; |
jn80842 | 0:d3a803c3a1c5 | 129 | // LISTENING FOR UP & DOWN SWIPES |
jn80842 | 0:d3a803c3a1c5 | 130 | if ((rightSideUp && photoCellUp(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellUp(pU,pD,pR,pL))) |
jn80842 | 0:d3a803c3a1c5 | 131 | { |
jn80842 | 0:d3a803c3a1c5 | 132 | if (waitingUP) |
jn80842 | 0:d3a803c3a1c5 | 133 | { |
jn80842 | 0:d3a803c3a1c5 | 134 | pc.printf("Swiped UP \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 135 | //keyboard.printf("w\r"); |
jn80842 | 0:d3a803c3a1c5 | 136 | counter = 0; |
jn80842 | 0:d3a803c3a1c5 | 137 | waitingUP = false; |
jn80842 | 0:d3a803c3a1c5 | 138 | wait(0.2); |
jn80842 | 0:d3a803c3a1c5 | 139 | } |
jn80842 | 0:d3a803c3a1c5 | 140 | else |
jn80842 | 0:d3a803c3a1c5 | 141 | { |
jn80842 | 0:d3a803c3a1c5 | 142 | waitingDOWN = true; |
jn80842 | 0:d3a803c3a1c5 | 143 | // pc.printf("Waiting to Swipe Down \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 144 | // keyboard.printf("Waiting to Swipe Down\r"); |
jn80842 | 0:d3a803c3a1c5 | 145 | } |
jn80842 | 0:d3a803c3a1c5 | 146 | } |
jn80842 | 0:d3a803c3a1c5 | 147 | |
jn80842 | 0:d3a803c3a1c5 | 148 | else if ((rightSideUp && photoCellDown(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellDown(pU,pD,pR,pL))) |
jn80842 | 0:d3a803c3a1c5 | 149 | { |
jn80842 | 0:d3a803c3a1c5 | 150 | if (waitingDOWN) |
jn80842 | 0:d3a803c3a1c5 | 151 | { |
jn80842 | 0:d3a803c3a1c5 | 152 | pc.printf("Swiped DOWN \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 153 | //keyboard.printf("s\r"); |
jn80842 | 0:d3a803c3a1c5 | 154 | counter = 0; |
jn80842 | 0:d3a803c3a1c5 | 155 | waitingDOWN = false; |
jn80842 | 0:d3a803c3a1c5 | 156 | wait(0.2); |
jn80842 | 0:d3a803c3a1c5 | 157 | } |
jn80842 | 0:d3a803c3a1c5 | 158 | else |
jn80842 | 0:d3a803c3a1c5 | 159 | { |
jn80842 | 0:d3a803c3a1c5 | 160 | waitingUP = true; |
jn80842 | 0:d3a803c3a1c5 | 161 | //pc.printf("Waiting to Swipe Up \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 162 | //keyboard.printf("Waiting to Swipe Up\r"); |
jn80842 | 0:d3a803c3a1c5 | 163 | } |
jn80842 | 0:d3a803c3a1c5 | 164 | } |
jn80842 | 0:d3a803c3a1c5 | 165 | else if ((rightSideUp && photoCellRight(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellRight(pU,pD,pR,pL))) { |
jn80842 | 0:d3a803c3a1c5 | 166 | if (waitingRIGHT) |
jn80842 | 0:d3a803c3a1c5 | 167 | { |
jn80842 | 0:d3a803c3a1c5 | 168 | pc.printf("Swiped RIGHT \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 169 | //keyboard.printf("e\r"); |
jn80842 | 0:d3a803c3a1c5 | 170 | counter = 0; |
jn80842 | 0:d3a803c3a1c5 | 171 | waitingRIGHT = false; |
jn80842 | 0:d3a803c3a1c5 | 172 | wait(0.2); |
jn80842 | 0:d3a803c3a1c5 | 173 | } |
jn80842 | 0:d3a803c3a1c5 | 174 | else |
jn80842 | 0:d3a803c3a1c5 | 175 | { |
jn80842 | 0:d3a803c3a1c5 | 176 | waitingLEFT = true; |
jn80842 | 0:d3a803c3a1c5 | 177 | //pc.printf("Waiting to Swipe LEFT \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 178 | //keyboard.printf("Waiting to Swipe Left\r"); |
jn80842 | 0:d3a803c3a1c5 | 179 | } |
jn80842 | 0:d3a803c3a1c5 | 180 | } else if ((rightSideUp && photoCellLeft(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellLeft(pU,pD,pR,pL))) { |
jn80842 | 0:d3a803c3a1c5 | 181 | if (waitingLEFT) |
jn80842 | 0:d3a803c3a1c5 | 182 | { |
jn80842 | 0:d3a803c3a1c5 | 183 | pc.printf("Swiped LEFT \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 184 | //keyboard.printf("w\r"); |
jn80842 | 0:d3a803c3a1c5 | 185 | counter = 0; |
jn80842 | 0:d3a803c3a1c5 | 186 | waitingLEFT = false; |
jn80842 | 0:d3a803c3a1c5 | 187 | wait(0.2); |
jn80842 | 0:d3a803c3a1c5 | 188 | } |
jn80842 | 0:d3a803c3a1c5 | 189 | else |
jn80842 | 0:d3a803c3a1c5 | 190 | { |
jn80842 | 0:d3a803c3a1c5 | 191 | waitingRIGHT = true; |
jn80842 | 0:d3a803c3a1c5 | 192 | //pc.printf("Waiting to Swipe RIGHT \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 193 | //keyboard.printf("Waiting to Swipe Right\r"); |
jn80842 | 0:d3a803c3a1c5 | 194 | } |
jn80842 | 0:d3a803c3a1c5 | 195 | } else if ((rightSideUp && s1 == 0) || (!rightSideUp && s2 == 0)) { |
jn80842 | 0:d3a803c3a1c5 | 196 | pc.printf("Pressed button!\r\n"); |
jn80842 | 0:d3a803c3a1c5 | 197 | // keyboard.printf("m\r"); |
jn80842 | 0:d3a803c3a1c5 | 198 | } |
jn80842 | 0:d3a803c3a1c5 | 199 | |
jn80842 | 0:d3a803c3a1c5 | 200 | if (counter > 40) |
jn80842 | 0:d3a803c3a1c5 | 201 | { |
jn80842 | 0:d3a803c3a1c5 | 202 | waitingUP = false; |
jn80842 | 0:d3a803c3a1c5 | 203 | waitingDOWN = false; |
jn80842 | 0:d3a803c3a1c5 | 204 | waitingRIGHT = false; |
jn80842 | 0:d3a803c3a1c5 | 205 | waitingDOWN = false; |
jn80842 | 0:d3a803c3a1c5 | 206 | counter = 0; |
jn80842 | 0:d3a803c3a1c5 | 207 | //printf("Counter Reset \r\n"); |
jn80842 | 0:d3a803c3a1c5 | 208 | } |
jn80842 | 0:d3a803c3a1c5 | 209 | wait(0.1); |
jn80842 | 0:d3a803c3a1c5 | 210 | } |
jn80842 | 0:d3a803c3a1c5 | 211 | |
jn80842 | 0:d3a803c3a1c5 | 212 | |
jn80842 | 0:d3a803c3a1c5 | 213 | } |