From c49073ece131fbad8f5d9a0b9452947554e98c6e Mon Sep 17 00:00:00 2001 From: Yohan Boujon Date: Sun, 26 Nov 2023 16:11:48 +0100 Subject: [PATCH] DataHandler and ServerHandler are now single instances following the Singleton pattern. --- embedded/lib/DataHandler/DataHandler.cpp | 2 ++ embedded/lib/DataHandler/DataHandler.hpp | 15 ++++++++++++--- embedded/lib/ServerHandler/ServerHandler.cpp | 7 +++++-- embedded/lib/ServerHandler/ServerHandler.hpp | 17 ++++++++++++++--- embedded/src/main.cpp | 7 ++++--- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/embedded/lib/DataHandler/DataHandler.cpp b/embedded/lib/DataHandler/DataHandler.cpp index 40c891b..8c6a5b2 100644 --- a/embedded/lib/DataHandler/DataHandler.cpp +++ b/embedded/lib/DataHandler/DataHandler.cpp @@ -2,6 +2,8 @@ DataHandler::DataHandler() {} +DataHandler::~DataHandler() {} + void DataHandler::updateTemperatureData(float temp) { temperature = temp; } diff --git a/embedded/lib/DataHandler/DataHandler.hpp b/embedded/lib/DataHandler/DataHandler.hpp index 1bb29c6..5335e3a 100644 --- a/embedded/lib/DataHandler/DataHandler.hpp +++ b/embedded/lib/DataHandler/DataHandler.hpp @@ -5,16 +5,25 @@ class DataHandler { public: - DataHandler(); + // Singleton + static DataHandler& GetInstance() + { + static DataHandler instance; + return instance; + } + // Public functions String getJsonData(); - void updateTemperatureData(float temperature); void updateHumidityData(float humidity); private: + // Singleton + DataHandler(); + ~DataHandler(); + DataHandler(const DataHandler&) = delete; + DataHandler& operator=(const DataHandler&) = delete; float temperature; float humidity; - String buildJson(); }; diff --git a/embedded/lib/ServerHandler/ServerHandler.cpp b/embedded/lib/ServerHandler/ServerHandler.cpp index b65eb5d..240ce39 100644 --- a/embedded/lib/ServerHandler/ServerHandler.cpp +++ b/embedded/lib/ServerHandler/ServerHandler.cpp @@ -1,8 +1,10 @@ #include "ServerHandler.hpp" -ServerHandler::ServerHandler(DataHandler * dataHandler) : server(80), dataHandler(dataHandler) { +ServerHandler::ServerHandler() : server(80) { } +ServerHandler::~ServerHandler() {} + void ServerHandler::setup(const char* ssid, const char* password) { // On utilise les scope resolution operator pour définir les méthodes la classe ServerHandle qui elle est dans hpp Serial.begin(9600); WiFi.begin(ssid, password); @@ -25,6 +27,7 @@ void ServerHandler::loop() { } void ServerHandler::handleRoot() { - String jsonFormattedData = dataHandler->getJsonData(); + auto& dataHandler = DataHandler::GetInstance(); + String jsonFormattedData = dataHandler.getJsonData(); server.send(200, "application/json", jsonFormattedData); } diff --git a/embedded/lib/ServerHandler/ServerHandler.hpp b/embedded/lib/ServerHandler/ServerHandler.hpp index ce6c9b0..3ea8757 100644 --- a/embedded/lib/ServerHandler/ServerHandler.hpp +++ b/embedded/lib/ServerHandler/ServerHandler.hpp @@ -8,14 +8,25 @@ class ServerHandler { public: - ServerHandler(DataHandler * dataHandler); + // Singleton + static ServerHandler& GetInstance() + { + static ServerHandler instance; + return instance; + } + // Public functions void setup(const char* ssid, const char* password); void loop(); private: - ESP8266WebServer server; + // Singleton + ServerHandler(); + ~ServerHandler(); + ServerHandler(const ServerHandler&) = delete; + ServerHandler& operator=(const ServerHandler&) = delete; + // Private variables/functions void handleRoot(); - DataHandler * dataHandler; // Pointeur vers dataHandler + ESP8266WebServer server; }; #endif diff --git a/embedded/src/main.cpp b/embedded/src/main.cpp index a1167ea..c70a98a 100644 --- a/embedded/src/main.cpp +++ b/embedded/src/main.cpp @@ -3,7 +3,6 @@ #include #include "ServerHandler.hpp" -#include "DataHandler.hpp" #include "Component.hpp" #include "Display.hpp" @@ -14,19 +13,21 @@ const char* pswd = PSWD_CLOVER; #endif -DataHandler dataHandler; -ServerHandler serverHandler(&dataHandler); // Référence à dataHandler Component humidity(ComponentType::Analog, PIN_A0); Display screen; void setup() { + auto& serverHandler = ServerHandler::GetInstance(); Serial.begin(9600); serverHandler.setup(ssid, pswd); } void loop() { + auto& serverHandler = ServerHandler::GetInstance(); + auto& dataHandler = DataHandler::GetInstance(); + screen.loop(); dataHandler.updateTemperatureData(random(1800, 2200) / 100.0); // 0 -> air(0), 0-300 -> dry(20), 300-700 -> humid (580), 700-950 -> water(940)