file persistence, load users from json, js packages updated

This commit is contained in:
2022-02-13 20:13:09 +01:00
parent dc73b6d991
commit 1182a7add8
36 changed files with 84656 additions and 4593 deletions
+1 -1
View File
@@ -31,7 +31,7 @@ public:
GREET,
MSG
};;
};
Interface(/* args */);
~Interface();
void begin(Keyboard* Keyboard);
+54
View File
@@ -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;
}
+17
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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()