file persistence, load users from json, js packages updated
This commit is contained in:
+1
-1
@@ -31,7 +31,7 @@ public:
|
||||
GREET,
|
||||
MSG
|
||||
|
||||
};;
|
||||
};
|
||||
Interface(/* args */);
|
||||
~Interface();
|
||||
void begin(Keyboard* Keyboard);
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
#include "Persistence.h"
|
||||
|
||||
Persistence::Persistence()
|
||||
{
|
||||
if (!LittleFS.begin())
|
||||
{
|
||||
Serial.println("An Error has occurred while mounting LittleFS");
|
||||
return;
|
||||
}
|
||||
}
|
||||
String Persistence::TestRead()
|
||||
{
|
||||
File file = LittleFS.open("/users.json", "r");
|
||||
String result = "";
|
||||
if (!file)
|
||||
{
|
||||
Serial.println("Failed to open file for reading");
|
||||
return result;
|
||||
}
|
||||
Serial.println("File Content:");
|
||||
while (file.available())
|
||||
{
|
||||
result += (char)file.read();
|
||||
}
|
||||
file.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
Persistence::Configuration Persistence::loadConfig()
|
||||
{
|
||||
StaticJsonDocument<1024> doc;
|
||||
File config_file = LittleFS.open("/config.json","r");
|
||||
deserializeJson(doc, config_file);
|
||||
Configuration res;
|
||||
res.SSID=doc["SSID"].as<const char*>();
|
||||
res.PASS=doc["PASS"].as<const char*>();
|
||||
return res;
|
||||
}
|
||||
DynamicJsonDocument Persistence::readUsers(){
|
||||
File user_file = LittleFS.open("/users.json","r");
|
||||
size_t buffersize = user_file.size()+512;
|
||||
Serial.printf("Reserved %i for reading UserDB File", buffersize);
|
||||
DynamicJsonDocument doc(user_file.size()+512);
|
||||
deserializeJson(doc, user_file);
|
||||
user_file.close();
|
||||
return doc;
|
||||
}
|
||||
bool Persistence::saveUsers(DynamicJsonDocument &doc){
|
||||
File user_file = LittleFS.open("/users.json","w");
|
||||
serializeJson(doc, user_file);
|
||||
user_file.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
#include "LittleFS.h"
|
||||
#include "ArduinoJson.h"
|
||||
class Persistence
|
||||
{
|
||||
public:
|
||||
Persistence();
|
||||
String TestRead();
|
||||
typedef struct Configuration{
|
||||
const char* SSID;
|
||||
const char* PASS;
|
||||
int THEME;
|
||||
} config;
|
||||
Configuration loadConfig();
|
||||
DynamicJsonDocument readUsers();
|
||||
bool saveUsers(DynamicJsonDocument &doc);
|
||||
};
|
||||
+60
-7
@@ -1,30 +1,74 @@
|
||||
#include "Users.h"
|
||||
|
||||
Users::Users(/* args */)
|
||||
{
|
||||
this->_userdb.insert(user_account{.uid = 1, .first_name = "John", .last_name = "Doe", .rfid_uid = "8C 75 6C 17", .user_pin = "2424"});
|
||||
this->_userdb.insert(user_account{.uid = 2, .first_name = "Max", .last_name = "Mustermann and Sons", .rfid_uid = "D3 4E 03 0B", .user_pin = "1212"});
|
||||
}
|
||||
|
||||
Users::Users(Persistence &p): persistence(p){
|
||||
}
|
||||
Users::~Users()
|
||||
{
|
||||
}
|
||||
bool Users::ImportFromPersistence(){
|
||||
Serial.println("Importing Users from Persistence");
|
||||
DynamicJsonDocument user_persistence = persistence.readUsers();
|
||||
JsonArray array = user_persistence.as<JsonArray>();
|
||||
for(JsonObject userdata : array){
|
||||
User *imported = new User();
|
||||
imported->uid= userdata["ID"].as<unsigned long>();
|
||||
if(_userdb.count(*imported))
|
||||
continue;
|
||||
imported->first_name = userdata["FIRST_NAME"].as<String>();
|
||||
imported->last_name = userdata["LAST_NAME"].as<String>();
|
||||
imported->rfid_uid = userdata["RFID_UID"].as<String>();
|
||||
imported->user_pin = userdata["USER_PIN"].as<String>();
|
||||
imported->enabled = userdata["ENABLED"].as<bool>();
|
||||
this->_userdb.insert(*imported);
|
||||
}
|
||||
Serial.println("User import is done!");
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Users::ExportToPersistence(){
|
||||
Serial.println("Exporting Users to Persistence");
|
||||
size_t user_amount = _userdb.size()+2;
|
||||
Serial.print( " User Amount: " );
|
||||
Serial.print(user_amount);
|
||||
size_t capacity = JSON_ARRAY_SIZE(user_amount) + user_amount*JSON_OBJECT_SIZE(6);
|
||||
Serial.print(" JSON Capacity");
|
||||
Serial.print(capacity);
|
||||
Serial.print(" Free Heap: ");
|
||||
Serial.print(ESP.getFreeHeap());
|
||||
//DynamicJsonDocument<CAPACITY> doc;
|
||||
DynamicJsonDocument doc(capacity);
|
||||
|
||||
for(Users::User u : _userdb){
|
||||
JsonObject exported_user = doc.createNestedObject();
|
||||
exported_user["ID"] = u.uid;
|
||||
exported_user["FIRST_NAME"] = u.first_name;
|
||||
exported_user["LAST_NAME"] = u.last_name;
|
||||
exported_user["RFID_UID"] = u.rfid_uid;
|
||||
exported_user["USER_PIN"] = u.user_pin;
|
||||
exported_user["ENABLED"] = u.enabled;
|
||||
}
|
||||
persistence.saveUsers(doc);
|
||||
Serial.println("User export is done!");
|
||||
return true;
|
||||
}
|
||||
bool Users::checkPin(String pin_code, std::vector<Users::User> *logon_users)
|
||||
{
|
||||
std::copy_if(this->_userdb.begin(), this->_userdb.end(), inserter(*logon_users, logon_users->end()), [=](user_account user)
|
||||
{ return pin_code == user.user_pin; });
|
||||
{ return pin_code == user.user_pin&&user.enabled==true; });
|
||||
return (logon_users->size() > 0);
|
||||
}
|
||||
|
||||
bool Users::checkRfid(String rfid_code, std::vector<Users::User> *logon_users)
|
||||
{
|
||||
std::copy_if(this->_userdb.begin(), this->_userdb.end(), inserter(*logon_users, logon_users->end()), [=](user_account user)
|
||||
{ return rfid_code == user.rfid_uid; });
|
||||
{ return rfid_code == user.rfid_uid&&user.enabled==true; });
|
||||
return (logon_users->size() > 0);
|
||||
}
|
||||
|
||||
unsigned long Users::addUser(String first_name, String last_name, String rifd_uid, String user_pin)
|
||||
{
|
||||
Serial.println("Adding User:" + first_name);
|
||||
unsigned long new_id = this->_userdb.rbegin()->uid + 1;
|
||||
this->_userdb.insert(user_account{.uid = new_id, .first_name = first_name, .last_name = last_name, .rfid_uid = rifd_uid, .user_pin = user_pin});
|
||||
return new_id;
|
||||
@@ -59,7 +103,16 @@ bool Users::updateUser(unsigned long id, ATTRIBUTES attr, String value)
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t Users::countUsers(){
|
||||
return _userdb.size();
|
||||
}
|
||||
String Users::toString(User *user)
|
||||
{
|
||||
return "UID: " + String(user->uid) + " Name: " + user->first_name + " " + user->last_name;
|
||||
}
|
||||
void Users::PrintAllToSerial(){
|
||||
Serial.println("#All Users:");
|
||||
for(Users::User u : _userdb){
|
||||
Serial.println(toString(&u));
|
||||
}
|
||||
}
|
||||
+8
-2
@@ -2,6 +2,7 @@
|
||||
#include <Arduino.h>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include "Persistence.h"
|
||||
class Users
|
||||
{
|
||||
public:
|
||||
@@ -19,6 +20,7 @@ public:
|
||||
mutable String last_name;
|
||||
mutable String rfid_uid;
|
||||
mutable String user_pin;
|
||||
mutable bool enabled = true;
|
||||
bool operator < (const User &o) const { return uid <o.uid; }
|
||||
bool operator == (const User &o) const { return uid ==o.uid; }
|
||||
|
||||
@@ -26,10 +28,10 @@ public:
|
||||
|
||||
private:
|
||||
std::set<User> _userdb;
|
||||
|
||||
Persistence &persistence;
|
||||
/* data */
|
||||
public:
|
||||
Users(/* args */);
|
||||
Users(Persistence &persistence);
|
||||
~Users();
|
||||
bool checkRfid(String rfid_code, std::vector<Users::User> *logon_users);
|
||||
bool checkPin(String pin_code, std::vector<Users::User> *logon_users);
|
||||
@@ -37,4 +39,8 @@ public:
|
||||
bool delUser(unsigned long id);
|
||||
bool updateUser(unsigned long id, ATTRIBUTES attr, String value);
|
||||
String toString(User *user);
|
||||
bool ImportFromPersistence();
|
||||
bool ExportToPersistence();
|
||||
void PrintAllToSerial();
|
||||
size_t countUsers();
|
||||
};
|
||||
+17
-3
@@ -7,6 +7,9 @@
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <vector>
|
||||
#include "Users.h"
|
||||
#include "Persistence.h"
|
||||
// File persistence
|
||||
Persistence persistence;
|
||||
// Rfid
|
||||
Rfid rfid;
|
||||
// i2C Bus
|
||||
@@ -14,6 +17,7 @@ Rfid rfid;
|
||||
#define PIN_WIRE_SCL D4
|
||||
|
||||
Keyboard keyboard(200);
|
||||
|
||||
Interface iface;
|
||||
// Wifi control
|
||||
IPAddress local_IP(192, 168, 4, 22);
|
||||
@@ -21,19 +25,29 @@ IPAddress gateway(192, 168, 4, 9);
|
||||
IPAddress subnet(255, 255, 255, 0);
|
||||
|
||||
// User DB
|
||||
Users users;
|
||||
Users users(persistence);
|
||||
|
||||
void setup()
|
||||
{
|
||||
Persistence::Configuration config = persistence.loadConfig();
|
||||
users.ImportFromPersistence();
|
||||
Serial.begin(9600);
|
||||
Serial.print("Starting");
|
||||
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
|
||||
Serial.println(WiFi.softAP("Doorlock") ? "Ready" : "Failed!");
|
||||
Serial.println(WiFi.softAP(config.SSID) ? "Ready" : "Failed!");
|
||||
//delay(500);
|
||||
keyboard.begin(&Wire);
|
||||
rfid.begin();
|
||||
iface.begin(&keyboard);
|
||||
users.addUser("Harry","Potter","","1234");
|
||||
while(users.countUsers()<100){
|
||||
users.addUser("Harry","Potter","","1234");
|
||||
}
|
||||
|
||||
users.PrintAllToSerial();
|
||||
//Serial.println(persistence.TestRead());
|
||||
users.ExportToPersistence();
|
||||
//Serial.println(persistence.TestRead());
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
|
||||
Reference in New Issue
Block a user