Buzz Access
Dependencies: 4DGL-uLCD-SE KeyPad PinDetect HID_Wiegand mbed-rtos mbed
main.cpp
- Committer:
- otis22894
- Date:
- 2015-04-29
- Revision:
- 0:0d31da041b5c
- Child:
- 1:c41a71a200d6
File content as of revision 0:0d31da041b5c:
#include "mbed.h" #include "KeyPad.h" #include "rtos.h" #include "uLCD_4DGL.h" #include <iostream> #include "PinDetect.h" #include "Wiegand.h" #include <string> #include <sstream> #define __STDC_FORMAT_MACROS #include <inttypes.h> #define CARDSALLOWED 10 bool checkCode(std::vector<int>,std::vector<int>); void keypad_thread(void const *args); void knock_thread(void const *args); void rfid_thread(void const *args); void changeCode(); void changeSecretKnock(); void captureKnock(); void checkKnocks(); void onCardRead(); int readCardsFromFile(FILE *fp); int readCardsFromFile(); bool isAllowed(const char *card); void storeCard(const char *card); Serial pc(USBTX, USBRX); KeyPad2 keypad(p25, p27, p23, p26, p21, p22, p24); static const int arr[] = {1,2,3,4}; std::vector<int> master(arr, arr + sizeof(arr) / sizeof(arr[0]) ); std::vector<int> keys; std::vector<int> knock; std::vector<int> userKnock; DigitalOut led2(LED2); DigitalOut led1(LED1); uLCD_4DGL lcd(p9, p10, p8); PinDetect pb1(p13); Timer timer; AnalogIn ain(p15); Wiegand rfid(p30, p29, p28, &onCardRead); char **allowedCards; int allowedCount = 0; bool changeCodeBool = false; LocalFileSystem fileSystem("local"); int main() { timer.start(); pc.printf("Start\n"); lcd.printf("Start\n"); //Thread keypadThread(keypad_thread); //Thread knockThread(knock_thread); //Thread rfidThread(rfid_thread); led1 = 0; while(1){ led1 = !led1; Thread::wait(1000); } } void rfid_thread(void const *args){ allowedCards = new char*[CARDSALLOWED]; for (int i = 0; i < CARDSALLOWED; ++i){ allowedCards[i] = new char[11]; } readCardsFromFile(); while(1){ rfid.doEvents(); Thread::wait(100); } } 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(); pc.printf("%s\n",str.c_str()); pc.printf("%d\n",isAllowed(str.c_str())); storeCard(str.c_str()); pc.printf("%d\n",isAllowed(str.c_str())); } bool isAllowed(const char *card){ for(int i = 0;i<allowedCount;i++){ for(int j = 0;j<11;j++){ if(card[j]!=allowedCards[i][j]){ break; }else if(j==10){ return true; } } } return false; } void storeCard(const char *card){ if(allowedCount < 10 && !isAllowed(card)){ FILE *fp = fopen("/local/cards.txt", "a"); if(fp==NULL){ pc.printf("NULL"); } fprintf(fp, "%c%c%c%c%c%c%c%c%c%c%c\r\n",card[0],card[1],card[2],card[3],card[4],card[5],card[6],card[7],card[8],card[9],card[10]); fclose(fp); pc.printf("HERE2"); for(int transfer = 0;transfer<11;transfer++){ allowedCards[allowedCount][transfer] = card[transfer]; } allowedCount++; } } int readCardsFromFile(){ FILE *fp = fopen("/local/cards.txt", "r"); int ret = readCardsFromFile(fp); return ret; } int readCardsFromFile(FILE *fp){ int c,transfer = 0; if(fp!=NULL){ c = fgetc(fp); while(c!=EOF){ allowedCards[allowedCount][transfer] = c; transfer++; if(transfer==11){ allowedCount++; if(allowedCount==CARDSALLOWED){ break; } transfer = 0; fgetc(fp); fgetc(fp); } c = fgetc(fp); } fclose(fp); return 1; }else{ return 0; } } void knock_thread(void const *args){ pc.printf("Initializing knock sensor..."); Thread::wait(1000); pc.printf("Ready\n"); changeSecretKnock(); float newval; while(1){ newval = ain.read(); if(newval > 0.508 && newval < 0.538){ pc.printf("Capturing Knock\n"); Thread::wait(50); captureKnock(); checkKnocks(); } Thread::wait(1); } } void checkKnocks(){ if(knock.size() != userKnock.size()){ pc.printf("Access Denied\n"); }else{ bool access = true; for(int i = 0; i<knock.size(); i++){ if(!(abs(1-((float)knock[i])/((float)userKnock[i]))<0.15)){ pc.printf("%d\n",i); access = false; } //pc.printf("%d : %d : %d\n",knock[i],userKnock[i],abs(1-((float)knock[i])/((float)userKnock[i]))<0.15); } if(access){ pc.printf("Access Granted\n"); }else{ pc.printf("Access Denied\n"); } } } void captureKnock(){ float val; userKnock.clear(); timer.reset(); int time; while(timer.read() < 2){ val = ain.read(); if(val > 0.508 && val < 0.538){ time = timer.read_ms(); userKnock.push_back(time); pc.printf("%d\n",time); Thread::wait(50); timer.reset(); } Thread::wait(1); } pc.printf("User size: %d\n",userKnock.size()); } void changeSecretKnock(){ pc.printf("Start the secret knock\n"); float val; Timer t; while(true){ val = ain.read(); if(val > 0.508 && val < 0.538){ break; } Thread::wait(1); } pc.printf("exit val: %f\n",val); t.start(); int time; while(t.read() < 2){ val = ain.read(); if(val > 0.508 && val < 0.538){ time = t.read_ms(); knock.push_back(time); pc.printf("%d\n",time); Thread::wait(50); t.reset(); } Thread::wait(1); } pc.printf("Size: %d\n",knock.size()); } bool checkCode(std::vector<int> master,std::vector<int> v1){ if(v1.size() != master.size()){ return false; }else{ for(int i = 0;i<master.size();i++){ if(master[i] != v1[i]){ return false; } } return true; } } void changeCode(){ pc.printf("Changing Code...\n"); std::vector<int> tempMaster; std::vector<int> key; key.push_back(0); while(key.front() != 12){ key = keypad.getkey(); if(key.size()>0){ tempMaster.push_back(key.front()); pc.printf("Size: %d\n",tempMaster.size()); } Thread::wait(100); } tempMaster.pop_back(); if(tempMaster.size() >= 4){ master.clear(); pc.printf("New Code: "); for(int i = 0;i<tempMaster.size();i++){ pc.printf("%d ",tempMaster[i]); master.push_back(tempMaster[i]); } pc.printf("\n"); }else{ pc.printf("New Password Too Short\n"); } changeCodeBool = false; } void changeCodeInterrupt(){ changeCodeBool = true; } void keypad_thread(void const *args){ pb1.mode(PullUp); Thread::wait(500); pb1.attach_deasserted(&changeCodeInterrupt); pb1.setSampleFrequency(); pc.printf("Begin...\n"); std::vector<int> key; key.push_back(0); while(1) { while(key.front() != 12){ if(changeCodeBool){ changeCode(); } key = keypad.getkey(); if(key.size()>0){ keys.push_back(key.front()); pc.printf("Size: %d\n",keys.size()); } Thread::wait(100); } keys.pop_back(); bool result = checkCode(master,keys); pc.printf("Result %d\n",result); pc.printf("Keys: "); int size = keys.size(); for(int i = 0;i<size;i++){ pc.printf("%d ",keys.front()); keys.erase(keys.begin()); } pc.printf("\n"); keys.clear(); key.clear(); key.push_back(0); Thread::wait(100); } }