Buzz Access
Dependencies: 4DGL-uLCD-SE KeyPad PinDetect HID_Wiegand mbed-rtos mbed
Diff: main.cpp
- 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());