hw3

Dependencies:   LSM303DLHC-a PinDetect USBDevice mbed

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?

UserRevisionLine numberNew 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 }