Buzz Access

Dependencies:   4DGL-uLCD-SE KeyPad PinDetect HID_Wiegand mbed-rtos mbed

Revision:
2:ec211fc4bdc2
Parent:
1:c41a71a200d6
--- a/main.cpp	Thu Apr 30 01:37:26 2015 +0000
+++ b/main.cpp	Thu Apr 30 06:24:40 2015 +0000
@@ -15,6 +15,7 @@
 void keypad_thread(void const *args);
 void knock_thread(void const *args);
 void rfid_thread(void const *args);
+void beep_thread(void const *args);
 void changeCode();
 void changeSecretKnock();
 void captureKnock();
@@ -27,6 +28,7 @@
 void menuShiftUp();
 void menuShiftDown();
 void display();
+void display2();
 void menuSelect();
 
 Serial pc(USBTX, USBRX);
@@ -41,8 +43,10 @@
 std::vector<string> menuOptions(arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));
 DigitalOut led2(LED2);
 DigitalOut led1(LED1);
-uLCD_4DGL lcd(p9, p10, p8); 
-PinDetect menuUp(p13);
+DigitalOut beeper(p28,1);
+uLCD_4DGL lcd(p9, p10, p8);
+uLCD_4DGL lcd2(p13, p14, p12); 
+PinDetect menuUp(p5);
 PinDetect select(p6);
 PinDetect menuDown(p7);
 Timer timer;
@@ -54,12 +58,20 @@
 LocalFileSystem fileSystem("local");
 int selected = 0;
 int oldSelected = -1;
+bool access = false;
+bool denied = false;
+bool addCard = false;
+bool removeCard = false;
+bool changeKnockBool = false;
 
 int main() {
+    pc.printf("Start...\n");
+    beeper = 1;
     timer.start();
-    Thread keypadThread(keypad_thread); 
-    //Thread knockThread(knock_thread); 
+    //Thread keypadThread(keypad_thread); 
+    Thread knockThread(knock_thread); 
     //Thread rfidThread(rfid_thread);
+    Thread beepThread(beep_thread);
     lcd.baudrate(500000);
     menuUp.mode(PullUp);
     menuDown.mode(PullUp);
@@ -79,12 +91,64 @@
             led1 = !led1;
         }
         display();
+        display2();
         Thread::wait(1);
         count++;
     }
     
 }
 
+void beep_thread(void const *args){
+    while(1){
+        if(access){
+            beeper = 0;
+            Thread::wait(750);
+            beeper = 1;
+            Thread::wait(1000);
+        }else if(denied){
+            for(int i = 0;i<4;i++){
+                beeper = 0;
+                Thread::wait(100);
+                beeper = 1;
+                Thread::wait(50);
+            }
+            Thread::wait(1000);
+        }
+        Thread::wait(1);
+    }
+}
+
+void display2() {
+    if(access){
+        lcd2.background_color(GREEN);
+        lcd2.cls();
+        lcd2.locate(0,0);
+        lcd2.printf("Access Granted!");
+        Thread::wait(1000);
+        access = false;
+        oldSelected = -1;
+        lcd2.background_color(BLACK);
+        lcd2.cls();
+    }else if(denied){
+        lcd2.background_color(RED);
+        lcd2.cls();
+        lcd2.locate(0,0);
+        lcd2.printf("Access Denied");
+        Thread::wait(1000);
+        denied = false;
+        oldSelected = -1;
+        lcd2.background_color(BLACK);
+        lcd2.cls();
+    } else {
+        if(key.size()>0 && key.front()!=12){
+            lcd2.printf("%d ",key.front());
+            Thread::wait(150);
+        }else{
+            //pc.printf("%d %d\n\n",key.size(),key.front());
+        }
+    }
+}
+
 void display(){
     if(changeCodeBool){
         lcd.cls();
@@ -93,12 +157,34 @@
         lcd.locate(0,1);
         bool first = true;
         while(changeCodeBool){
-            if(key.size()>0 && (!first && key.front()==0)){
+            if(key.size()>0 && (!first || key.front()!=0) && key.front()!=12){
                 lcd.printf("%d ",key.front());
                 Thread::wait(150);
                 first = false; 
             }
         }
+        oldSelected = -1;
+    }else if(addCard){
+        lcd.cls();
+        lcd.locate(0,0);
+        lcd.printf("Tap New Card");
+        while(addCard){Thread::wait(10);}
+        oldSelected = -1;
+    }else if(removeCard){
+        lcd.cls();
+        lcd.locate(0,0);
+        lcd.printf("Tap The Card To Remove");
+        while(removeCard){Thread::wait(10);}
+        oldSelected = -1;
+    }else if(changeKnockBool){
+        lcd.cls();
+        lcd.locate(0,0);
+        lcd.printf("Listening For New Knock");
+        while(changeKnockBool){Thread::wait(10);}
+        lcd.cls();
+        lcd.printf("New Knock Recorded");
+        Thread::wait(500);
+        oldSelected = -1;
     }else if(oldSelected != selected){
         for(int i = 0;i<menuOptions.size();i++){
             lcd.locate(0,i);
@@ -110,7 +196,7 @@
             if(menuOptions[i].size()>17){
                 lcd.printf("%s",menuOptions[i].substr(0,18).c_str());
             }else{
-                lcd.printf("%s",menuOptions[i].c_str() + std::string(18-menuOptions[i].size(),' '));
+                lcd.printf("%s",(menuOptions[i] + std::string(18-menuOptions[i].size(),' ')).c_str());
             }
         }
         oldSelected = selected;
@@ -118,7 +204,15 @@
 }
 
 void menuSelect(){
-    changeCodeBool = true;
+    if(selected==2){
+        changeCodeBool = true;
+    }else if(selected == 3){
+        changeKnockBool = true;
+    }else if(selected == 4){
+        addCard = true;
+    }else if(selected == 5){
+        //removeCard = true; FIX LATER
+    }
 }
 
 void menuShiftUp(){
@@ -145,16 +239,24 @@
 }
 
 void onCardRead() {
-   /*pc.printf("%d\n",rfid.bitsRead());
-   uint64_t rawCardData = rfid.getBits(14,33);
-   pc.printf("%" PRIx64 "\n",rawCardData);
-   pc.printf("%" PRIx64 "\n",rfid.getBits(0,34));*/
-   uint64_t cardData = rfid.getBits(0,34);
-   ostringstream o;
-   string str;
-   o << cardData;
-   str += o.str();
-   storeCard(str.c_str());
+    /*pc.printf("%d\n",rfid.bitsRead());
+    uint64_t rawCardData = rfid.getBits(14,33);
+    pc.printf("%" PRIx64 "\n",rawCardData);
+    pc.printf("%" PRIx64 "\n",rfid.getBits(0,34));*/
+    uint64_t cardData = rfid.getBits(0,34);
+    ostringstream o;
+    string str;
+    o << cardData;
+    str += o.str();
+    if(addCard){
+        storeCard(str.c_str());
+    }else if(removeCard){
+        
+    }else if(isAllowed(str.c_str())) {
+       access = true;
+    }else{
+        denied = true;
+    }
 }
 
 bool isAllowed(const char *card){
@@ -183,6 +285,14 @@
         }
         allowedCount++;
     }
+    addCard = false;
+}
+
+//FIX LATER
+void removeCardFromFile(const char *card){
+    if(isAllowed(card)){
+        FILE *fp = fopen("/local/cards.txt", "r");
+    }
 }
 
 int readCardsFromFile(){
@@ -226,25 +336,29 @@
             Thread::wait(50);
             captureKnock();
             checkKnocks();
+        }else if(changeKnockBool){
+            changeSecretKnock();
         }
         Thread::wait(1);
     }  
 }
 
 void checkKnocks(){
-    if(knock.size() != userKnock.size()){
-        //DENIED
-    }else{
-        bool access = true;
-        for(int i = 0; i<knock.size(); i++){
-            if(!(abs(1-((float)knock[i])/((float)userKnock[i]))<0.15)){
-                access = false;    
+    if(userKnock.size()!=0){
+        if(knock.size() != userKnock.size()){
+            denied = true;
+        }else{
+            bool accessCheck = true;
+            for(int i = 0; i<knock.size(); i++){
+                if(!(abs(1-((float)knock[i])/((float)userKnock[i]))<0.15)){
+                    accessCheck = false;    
+                }
             }
-        }
-        if(access){
-            //GRANTED
-        }else{
-            //GRANTED   
+            if(accessCheck){
+                access = true;
+            }else{
+                denied = true;   
+            }
         }
     }
 }
@@ -260,6 +374,7 @@
             time = timer.read_ms();
             userKnock.push_back(time);
             Thread::wait(50);
+            pc.printf("%d\n",time);
             timer.reset();
         }
         Thread::wait(1);
@@ -267,11 +382,13 @@
 }
 
 void changeSecretKnock(){
+    pc.printf("Changing Secret Knock\n");
     float val;
     Timer t;
     while(true){
         val = ain.read(); 
         if(val > 0.508 && val < 0.538){
+            Thread::wait(50);
             break;
         }
         Thread::wait(1);   
@@ -284,10 +401,13 @@
             time = t.read_ms();
             knock.push_back(time);
             Thread::wait(50);
+            pc.printf("%d\n",time);
             t.reset();
         }
         Thread::wait(1);
     }
+    pc.printf("Size: %d\n",knock.size());
+    changeKnockBool = false;
 }
 
 bool checkCode(std::vector<int> master,std::vector<int> v1){
@@ -305,6 +425,7 @@
 
 void changeCode(){
     std::vector<int> tempMaster;
+    key.clear();
     key.push_back(0);
     while(key.front() != 12){
         key = keypad.getkey();
@@ -313,6 +434,8 @@
         }
         Thread::wait(100); 
     }
+    key.clear();
+    key.push_back(0);
     tempMaster.pop_back();
     if(tempMaster.size() >= 4){
         master.clear();
@@ -322,11 +445,10 @@
     }else{   
     }
     changeCodeBool = false;
-    oldSelected = -1;
 }
 
 void keypad_thread(void const *args){
-    std::vector<int> key;
+    key.clear();
     key.push_back(0);
     while(1) {
         while(key.front() != 12){
@@ -341,6 +463,11 @@
         }  
         keys.pop_back();
         bool result = checkCode(master,keys);
+        if(result){
+            access = true;
+        }else{
+            denied = true;
+        }
         int size = keys.size();
         for(int i = 0;i<size;i++){
             keys.erase(keys.begin());