hw3

Dependencies:   LSM303DLHC-a PinDetect USBDevice mbed

Revision:
0:d3a803c3a1c5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/acchello.cpp	Mon Sep 29 08:51:48 2014 +0000
@@ -0,0 +1,213 @@
+#include "mbed.h"
+#include "vector.h"
+#include "LSM303DLHC.h"
+#include "USBKeyboard.h"
+ 
+Serial pc(USBTX, USBRX); // tx, rx
+USBKeyboard keyboard;
+ // top face
+LSM303DLHC lsm(PTE0,PTE1);
+AnalogIn pU1(A0); // up
+AnalogIn pD1(A1); //down
+AnalogIn pR1(A2); //right
+AnalogIn pL1(A3); //left
+
+// bottom face
+AnalogIn pU(PTE20);     //up
+AnalogIn pD(PTE21);     //down
+AnalogIn pR(PTE22);   //right
+AnalogIn pL(PTE23);   //left
+
+//switches
+DigitalIn s1(D6);
+DigitalIn s2(D7);
+
+// Integers
+int counter = 0;
+
+// Levels for photocells
+float covered = 0.5; // maximum value to be considered covered
+float opened = 0.8; // minimum value to be considered open (ambient)
+
+// boolean variables for different wait states
+bool waitingUP = false;
+bool waitingDOWN = false;
+bool waitingRIGHT = false;
+bool waitingLEFT = false;
+
+class Orientation {
+    vector a, m;
+    bool rightSideUp, movingDown, movingUp, movedDown, movedUp;
+    float top_threshold, bottom_threshold;
+    public: Orientation() {
+        top_threshold = -0.3;
+        bottom_threshold = 0.3;
+        rightSideUp = true;
+        movingDown = false;
+        movingUp = false;
+        movedDown = false;
+        movedUp = true;
+    }
+    bool isRightSideUp() {
+        
+        bool check = lsm.read(&a.x,&a.y,&a.z,&m.x,&m.y,&m.z);
+        //pc.printf("x %f y %f z %f",a.z,a.y,a.z);
+        pc.printf("{ \"x\": %f, \"y\": %f, \"z\": %f}\r\n",a.x,a.y,a.z);
+        if (check) {
+            if (a.x > top_threshold) {
+                movingDown = true;
+                movingUp = false;
+            } else if (a.x < bottom_threshold) {
+                movingUp = true;
+                movingDown = false;
+            }
+            if (movingDown && a.x > bottom_threshold) {
+                movingDown = false;
+                movedUp = false;
+                movedDown = true;
+            } else if (movingUp && a.x < top_threshold) {
+                movingUp = false;
+                movedDown = false;
+                movedUp = true;
+            }
+            if (!rightSideUp && movedUp) {
+                rightSideUp = true;
+            } else if (rightSideUp && movedDown) {
+                rightSideUp = false;
+            }
+        }
+        return rightSideUp;
+    }
+};
+
+bool isCovered(AnalogIn p) {
+    return p < covered;
+}
+
+bool isOpen(AnalogIn p) {
+    return p > opened;
+}
+
+bool photoCellUp(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) {
+   // pc.printf("covered only up\r\n");
+    return isCovered(pUp) && isOpen(pDown) && isOpen(pRight) && isOpen(pLeft);
+}
+
+bool photoCellDown(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) {
+    //pc.printf("covered only down\r\n");
+    return isOpen(pUp) && isCovered(pDown) && isOpen(pRight) && isOpen(pLeft);
+}
+
+bool photoCellLeft(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) {
+    //pc.printf("covered only right\r\n");
+    return isOpen(pUp) && isOpen(pDown) && isOpen(pRight) && isCovered(pLeft);
+}
+
+bool photoCellRight(AnalogIn pUp,AnalogIn pDown,AnalogIn pRight,AnalogIn pLeft) {
+    //pc.printf("covered only left\r\n");
+    return isOpen(pUp) && isOpen(pDown) && isCovered(pRight) && isOpen(pLeft);
+}
+
+
+int main() {
+    pc.printf("hello\r\n");
+    Orientation up;
+    bool lastRightSideUp = true;
+
+    while (1) {
+            bool rightSideUp = up.isRightSideUp();
+            if (rightSideUp != lastRightSideUp) {
+               pc.printf("flipped\r\n");
+               //keyboard.printf("f\r");
+            }
+            if (rightSideUp) {
+                pc.printf("RIGHT SIDE UP\r\n");
+            } else {
+                pc.printf("UP SIDE DOWN\r\n");
+            }
+            lastRightSideUp = rightSideUp;
+                // LISTENING FOR UP & DOWN SWIPES
+    if ((rightSideUp && photoCellUp(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellUp(pU,pD,pR,pL)))
+    {   
+        if (waitingUP)
+        {
+            pc.printf("Swiped UP \r\n");
+            //keyboard.printf("w\r");
+            counter = 0;
+            waitingUP = false;
+            wait(0.2);
+        }
+            else
+            {
+                waitingDOWN = true;
+               // pc.printf("Waiting to Swipe Down \r\n");
+               // keyboard.printf("Waiting to Swipe Down\r");
+            }
+        }
+
+        else if ((rightSideUp && photoCellDown(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellDown(pU,pD,pR,pL)))
+        {
+            if (waitingDOWN)
+            {
+                pc.printf("Swiped DOWN \r\n");
+                //keyboard.printf("s\r");
+                counter = 0;
+                waitingDOWN = false;
+                wait(0.2);
+            }
+                else
+                {
+                    waitingUP = true;
+                    //pc.printf("Waiting to Swipe Up \r\n");
+                    //keyboard.printf("Waiting to Swipe Up\r");
+                }
+        }
+        else if ((rightSideUp && photoCellRight(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellRight(pU,pD,pR,pL))) {
+            if (waitingRIGHT)
+            {
+            pc.printf("Swiped RIGHT \r\n");
+            //keyboard.printf("e\r");
+            counter = 0;
+            waitingRIGHT = false;
+            wait(0.2);
+            }
+            else
+            {
+                waitingLEFT = true;
+                //pc.printf("Waiting to Swipe LEFT \r\n");
+                //keyboard.printf("Waiting to Swipe Left\r");
+            }
+        } else if ((rightSideUp && photoCellLeft(pU1,pD1,pR1,pL1)) || (!rightSideUp && photoCellLeft(pU,pD,pR,pL))) {
+            if (waitingLEFT)
+            {
+                pc.printf("Swiped LEFT \r\n");
+                //keyboard.printf("w\r");
+                counter = 0;
+                waitingLEFT = false;
+                wait(0.2);
+            }
+            else
+            {
+                waitingRIGHT = true;
+                //pc.printf("Waiting to Swipe RIGHT \r\n");
+                //keyboard.printf("Waiting to Swipe Right\r");
+            }
+        } else if ((rightSideUp && s1 == 0) || (!rightSideUp && s2 == 0)) {
+            pc.printf("Pressed button!\r\n");
+            // keyboard.printf("m\r");
+        }
+
+    if (counter > 40)
+    {
+        waitingUP = false;
+        waitingDOWN = false;
+        waitingRIGHT = false;
+        waitingDOWN = false;
+        counter = 0;
+        //printf("Counter Reset \r\n");
+    }
+        wait(0.1); 
+    }
+    
+    
+}
\ No newline at end of file