From d27a42c7e8d3a15d6c58f52f2847a4a943771655 Mon Sep 17 00:00:00 2001 From: Jean Jacques Avril Date: Tue, 15 Mar 2022 18:00:35 +0100 Subject: [PATCH] improved rfid scan api->timeout --- data/wifi | 1 + src/WebConsole.cpp | 50 ++++++++++++++++++++++++++-------------------- src/WebConsole.h | 7 +++++-- src/main.cpp | 17 ++++++++-------- 4 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 data/wifi diff --git a/data/wifi b/data/wifi new file mode 100644 index 0000000..4a60e06 --- /dev/null +++ b/data/wifi @@ -0,0 +1 @@ +1 DoorLock geheim123 10.1.4.22 diff --git a/src/WebConsole.cpp b/src/WebConsole.cpp index 8320356..0fd7e2e 100644 --- a/src/WebConsole.cpp +++ b/src/WebConsole.cpp @@ -21,7 +21,7 @@ bool WebConsole::init(userdb::UserDb *userdb) _server->on("/api/auth", HTTPMethod::HTTP_POST, std::bind(&WebConsole::_auth, this)); _server->on("/api/userdb", HTTPMethod::HTTP_DELETE, std::bind(&WebConsole::_dropUserDb, this)); _server->on("/api/userdb", HTTPMethod::HTTP_GET, std::bind(&WebConsole::_getUserDb, this)); - _server->on("/api/rfid", std::bind(&WebConsole::_catchRFID, this)); + _server->on("/api/rfid", HTTPMethod::HTTP_GET, std::bind(&WebConsole::_catchRFID, this)); _server->on("/api/debug/printfile", std::bind(&WebConsole::_print_db_raw, this)); _server->on(UriBraces("/api/user/{}"), HTTPMethod::HTTP_DELETE, std::bind(&WebConsole::_deleteUser, this)); _server->on(UriBraces("/api/user/{}"), HTTPMethod::HTTP_GET, std::bind(&WebConsole::_getUser, this)); @@ -39,16 +39,26 @@ void WebConsole::attachRfid(Rfid *rfid) } void WebConsole::serve() { - if (catch_rfid && rfid != nullptr && rfid->available()) + if (catch_rfid) { - rfid_buffer = rfid->getID(); - catch_rfid_updated = true; - catch_rfid = false; + if (millis() - catch_rfid_millis > 2000){ + catch_rfid = 0; + } + else if (catch_rfid > 1 && rfid != nullptr && rfid->available()) + { + rfid_buffer = rfid->getID(); + catch_rfid = 1; + } } _server->handleClient(); } -bool WebConsole::isInterceptingRfid() +uint8_t WebConsole::isInterceptingRfid() { + if(catch_rfid==3){ + catch_rfid=2; + return 3; + } + return catch_rfid; } bool WebConsole::_isAuth() @@ -78,7 +88,7 @@ void WebConsole::_auth() { char *token = auth.login(_server->arg("username"), _server->arg("password")); if (token == nullptr) - _server->send(401, "text/plain", "failed!"); + _server->send(401, "text/plain", "login_failed"); else _server->send(200, "text/plain", token); } @@ -90,11 +100,10 @@ void WebConsole::_auth() } else if (action.equals("update")) { - //if (!_isAuth()) - // return; + // if (!_isAuth()) + // return; bool res = auth.setAuth(_server->arg("username"), _server->arg("password")); _server->send(200, "text/plain", res ? "success" : "failed"); - } else _server->send(404, "text/plain", "unknown action"); @@ -228,7 +237,7 @@ void WebConsole::_updateUser() updated.user_pin = doc["user_pin"].as(); if (doc.containsKey("enabled")) updated.enabled = doc["enabled"].as(); - bool res = userdb->update_user(&updated); + userdb->update_user(&updated); _server->send(200, "text/json", updated.toJSONString().c_str()); } void WebConsole::_createUser() @@ -285,23 +294,20 @@ void WebConsole::_catchRFID() return; if (rfid == nullptr) { - _server->send(500, "text/json", "{\"error\":\"RFID not attached.\"}"); + _server->send(500, "text/json", "{\"error\":\"RFID not attached.\",\"state\":\"" + String(catch_rfid) + "\"}"); return; } - if (catch_rfid_updated) + if (catch_rfid == 1) { - String response = "{\"rfid_uid\":\"" + rfid_buffer + "\"}"; - _server->send(500, "text/json", response); - catch_rfid_updated = false; - } - else if (catch_rfid) - { - _server->send(500, "text/json", "{\"ok\":\"already activated\"}"); + String response = "{\"rfid_uid\":\"" + rfid_buffer + "\",\"state\":\"" + String(catch_rfid) + "\"}"; + _server->send(200, "text/json", response); + catch_rfid = 0; } else { - catch_rfid = true; - _server->send(500, "text/json", "{\"ok\":\"now activated\"}"); + catch_rfid = 3; // 3 - Start listening + catch_rfid_millis = millis(); + _server->send(200, "text/json", "{\"ok\":\"listening\",\"state\":\"" + String(catch_rfid) + "\"}"); } } void WebConsole::_updateAdmin() diff --git a/src/WebConsole.h b/src/WebConsole.h index 9ef1d74..89f5ab1 100644 --- a/src/WebConsole.h +++ b/src/WebConsole.h @@ -8,6 +8,7 @@ #include "UserDb.h" #include "Rfid.h" #include "AdminAuth.h" +#include "Interface.h" namespace webconsole { static const char path_prefix[] PROGMEM = "/s"; @@ -21,7 +22,7 @@ namespace webconsole bool init(userdb::UserDb *userdb); void attachRfid(Rfid *rfid); void serve(); - bool isInterceptingRfid(); + uint8_t isInterceptingRfid(); private: void _sendCORS(); @@ -48,10 +49,12 @@ namespace webconsole } ESP8266WebServer *_server; userdb::UserDb *userdb = nullptr; - bool catch_rfid = false; + unsigned long catch_rfid_millis = 0; + uint8_t catch_rfid = 0; bool catch_rfid_updated = false; String rfid_buffer; Rfid *rfid = nullptr; + Interface *iface = nullptr; AdminAuth auth; }; diff --git a/src/main.cpp b/src/main.cpp index e5f0f0e..9048314 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,7 +27,7 @@ Interface iface; IPAddress local_IP(192, 168, 4, 22); IPAddress gateway(0, 0, 0, 0); IPAddress subnet(255, 255, 255, 0); -IPAddress dns(192, 168, 178, 1); +IPAddress dns(192, 168, 178, 1); DNSServer dnsServer; void setup() { @@ -37,9 +37,9 @@ void setup() Serial.print("\t1. Network config ->"); WiFi.mode(WIFI_AP); Serial.println(WiFi.softAPConfig(local_IP, local_IP, subnet) ? "Ready" : "Failed!"); - Serial.print("\t2 AP setup " + String(config.SSID)+ " -> "); + Serial.print("\t2 AP setup " + String(config.SSID) + " -> "); if (strlen(config.PASS) > 0) - Serial.println(WiFi.softAP(config.SSID, config.PASS) ? "Ready" : "Failed!"); + Serial.println(WiFi.softAP(config.SSID, config.PASS) ? "Ready" : "Failed!"); else Serial.println(WiFi.softAP(config.SSID) ? "Ready" : "Failed!"); WiFi.hostname("Doorlock"); @@ -62,10 +62,11 @@ void loop() web.serve(); keyboard.scanAsync(); userdb::User login_user; - if(web.isInterceptingRfid()&&iface.getState()==0){ - iface.showMessage("WebUI connected", "Awaiting RFID", 3000); - } - else if (iface.pinAvailable()&&iface.getState()!=Interface::GREET) + if (web.isInterceptingRfid() ==3) + iface.showMessage("WebUI connected", "Awaiting RFID", 2000); + else if (web.isInterceptingRfid() == 1) + iface.showMessage("WebUI connected", "RFID Found", 1000); + else if (iface.pinAvailable() && iface.getState() != Interface::GREET) { unsigned long delta = millis(); login_user = userdatabase.user_by_pin(iface.getPin()); @@ -76,7 +77,7 @@ void loop() return; } } - else if (rfid.available()&&iface.getState()!=Interface::GREET) + else if (rfid.available() && iface.getState() != Interface::GREET) { unsigned long delta = millis(); login_user = userdatabase.user_by_rfid(rfid.getID());