From 0893f314edda7b63ff62e5bc5f5bcd12ac438b87 Mon Sep 17 00:00:00 2001
From: Jochen Vothknecht <jochen3120@gmail.com>
Date: Sat, 18 Jun 2022 21:19:45 +0200
Subject: [PATCH] Adding a few services

---
 .../SiliconTorch/Service/CyanStripe.cpp       | 42 +++++++++++++++
 .../SiliconTorch/Service/CyanStripe.hpp       | 35 ++++++++++++-
 CLC-qthing/SiliconTorch/Service/FxPublish.cpp | 37 +++++++++++++
 CLC-qthing/SiliconTorch/Service/FxPublish.hpp | 35 ++++++++++++-
 CLC-qthing/SiliconTorch/Service/Service.cpp   |  8 +--
 CLC-qthing/SiliconTorch/Service/Service.hpp   |  8 +--
 .../SiliconTorch/Service/ServiceManager.cpp   | 52 ++++++++++++++++---
 .../SiliconTorch/Service/ServiceManager.hpp   |  8 ++-
 .../SiliconTorch/Service/__services__.cpp     | 22 ++------
 9 files changed, 213 insertions(+), 34 deletions(-)

diff --git a/CLC-qthing/SiliconTorch/Service/CyanStripe.cpp b/CLC-qthing/SiliconTorch/Service/CyanStripe.cpp
index faa482e..05077d0 100644
--- a/CLC-qthing/SiliconTorch/Service/CyanStripe.cpp
+++ b/CLC-qthing/SiliconTorch/Service/CyanStripe.cpp
@@ -1,5 +1,20 @@
 #include "CyanStripe.hpp"
 
+// C++ system level
+// #include <cstring>     // memset, strncmp
+// #include <cstdlib>     // TODO: is this for memcpy?
+// #include <functional>
+
+// ESP32 specific
+#include "esp_log.h"
+
+// project specific
+#include <Types.hpp>
+#include "SiliconTorch/NVSExplorer.hpp"
+
+// qthing stuff
+// #include <qthing>
+
 
 
 
@@ -25,3 +40,30 @@
 
 
 
+
+
+
+
+namespace SiliconTorch {
+
+  namespace Service {
+
+    void CyanStripe::init() {
+      setName("CyanStripe");
+      setNameSpace("CyanStripe");  // TODO: "FxCyanF"
+    }
+
+    void CyanStripe::start() {
+      ESP_LOGW(getName().c_str(), "Starting service[ %s ] with order[ %d ]  *WHOOP* *WHOOP*", getName().c_str(), getStartOrder());
+    }
+
+    void CyanStripe::stop() {
+      ESP_LOGW(getName().c_str(), "Stopping service[ %s ]  *sad service noises*", getName().c_str());
+    }
+
+
+
+  }
+}
+
+
diff --git a/CLC-qthing/SiliconTorch/Service/CyanStripe.hpp b/CLC-qthing/SiliconTorch/Service/CyanStripe.hpp
index 1437ddc..b2969ac 100644
--- a/CLC-qthing/SiliconTorch/Service/CyanStripe.hpp
+++ b/CLC-qthing/SiliconTorch/Service/CyanStripe.hpp
@@ -1,9 +1,42 @@
 #pragma once
 
+// C++ system level
+// #include <cstring>     // memset, strncmp
+// #include <cstdlib>     // TODO: is this for memcpy?
+// #include <functional>
 
+// ESP32 specific
+#include "esp_log.h"
 
-// TODO: implement!
+// project specific
+#include <Types.hpp>
+#include "Service.hpp"
 
+// qthing stuff
+// #include <qthing>
 
 
+namespace SiliconTorch {
 
+  namespace Service {
+
+    class CyanStripe : public ServiceManager::Service {
+
+      public:
+
+
+        void init();
+
+        void start();
+        void stop();
+
+
+
+
+      private:
+
+
+    };
+
+  }
+}
diff --git a/CLC-qthing/SiliconTorch/Service/FxPublish.cpp b/CLC-qthing/SiliconTorch/Service/FxPublish.cpp
index dfcf126..1cb1107 100644
--- a/CLC-qthing/SiliconTorch/Service/FxPublish.cpp
+++ b/CLC-qthing/SiliconTorch/Service/FxPublish.cpp
@@ -1,5 +1,20 @@
 #include "FxPublish.hpp"
 
+// C++ system level
+// #include <cstring>     // memset, strncmp
+// #include <cstdlib>     // TODO: is this for memcpy?
+// #include <functional>
+
+// ESP32 specific
+#include "esp_log.h"
+
+// project specific
+#include <Types.hpp>
+#include "SiliconTorch/NVSExplorer.hpp"
+
+// qthing stuff
+// #include <qthing>
+
 
 
 
@@ -15,3 +30,25 @@
 
 
 
+
+namespace SiliconTorch {
+
+  namespace Service {
+
+    void FxPublish::init() {
+      setName("FxPublish");
+      setNameSpace("FxPublish");
+    }
+
+    void FxPublish::start() {
+      ESP_LOGW(getName().c_str(), "Starting service[ %s ] with order[ %d ]  *WHOOP* *WHOOP*", getName().c_str(), getStartOrder());
+    }
+
+    void FxPublish::stop() {
+      ESP_LOGW(getName().c_str(), "Stopping service[ %s ]  *sad service noises*", getName().c_str());
+    }
+
+
+
+  }
+}
diff --git a/CLC-qthing/SiliconTorch/Service/FxPublish.hpp b/CLC-qthing/SiliconTorch/Service/FxPublish.hpp
index 1437ddc..d89286c 100644
--- a/CLC-qthing/SiliconTorch/Service/FxPublish.hpp
+++ b/CLC-qthing/SiliconTorch/Service/FxPublish.hpp
@@ -1,9 +1,42 @@
 #pragma once
 
+// C++ system level
+// #include <cstring>     // memset, strncmp
+// #include <cstdlib>     // TODO: is this for memcpy?
+// #include <functional>
 
+// ESP32 specific
+#include "esp_log.h"
 
-// TODO: implement!
+// project specific
+#include <Types.hpp>
+#include "Service.hpp"
 
+// qthing stuff
+// #include <qthing>
 
 
+namespace SiliconTorch {
 
+  namespace Service {
+
+    class FxPublish : public ServiceManager::Service {
+
+      public:
+
+
+        void init();
+
+        void start();
+        void stop();
+
+
+
+
+      private:
+
+
+    };
+
+  }
+}
diff --git a/CLC-qthing/SiliconTorch/Service/Service.cpp b/CLC-qthing/SiliconTorch/Service/Service.cpp
index 6cc519d..ea39bed 100644
--- a/CLC-qthing/SiliconTorch/Service/Service.cpp
+++ b/CLC-qthing/SiliconTorch/Service/Service.cpp
@@ -45,7 +45,7 @@ namespace SiliconTorch {
       nvsState = (NVSState)state;
     }
 
-    bool Service::isEnabled() {
+    bool Service::isEnabled() const {
       return nvsState == Enabled;
     }
 
@@ -99,15 +99,15 @@ namespace SiliconTorch {
     }
 
 
-    const str& Service::getName() {
+    const str& Service::getName() const {
       return name;
     }
 
-    const str& Service::getNameSpace() {
+    const str& Service::getNameSpace() const {
       return nameSpace;
     }
 
-    u16 Service::getStartOrder() {
+    u16 Service::getStartOrder() const {
       return startOrder;
     }
 
diff --git a/CLC-qthing/SiliconTorch/Service/Service.hpp b/CLC-qthing/SiliconTorch/Service/Service.hpp
index ac67758..668c194 100644
--- a/CLC-qthing/SiliconTorch/Service/Service.hpp
+++ b/CLC-qthing/SiliconTorch/Service/Service.hpp
@@ -41,18 +41,18 @@ namespace SiliconTorch {
         virtual void start()     = 0;
         virtual void stop()      = 0;
 
-        const str& getName();
-        const str& getNameSpace();
+        const str& getName() const;
+        const str& getNameSpace() const;
 
         // virtual str name()       = 0;
         // virtual str nameSpace()  = 0;
 
-        u16 getStartOrder();
+        u16 getStartOrder() const;
 
         // enabled services will be started in this order. higher = later
         // virtual u16 startOrder();  // defaults to 1337
 
-        bool isEnabled();
+        bool isEnabled() const;
         void setEnabled(bool enabled);
 
       protected:
diff --git a/CLC-qthing/SiliconTorch/Service/ServiceManager.cpp b/CLC-qthing/SiliconTorch/Service/ServiceManager.cpp
index a956ff2..dc47dc3 100644
--- a/CLC-qthing/SiliconTorch/Service/ServiceManager.cpp
+++ b/CLC-qthing/SiliconTorch/Service/ServiceManager.cpp
@@ -1,6 +1,8 @@
 #include "ServiceManager.hpp"
 
 // C++ system level
+#include <vector>
+#include <algorithm>
 // #include <cstring>     // memset, strncmp
 // #include <cstdlib>     // TODO: is this for memcpy?
 // #include <functional>
@@ -31,19 +33,57 @@ namespace SiliconTorch {
 
       registerSiliconTorchServices(this);
 
-      // TODO: implement!
+      registrationLocked = true;
+
 
     }
 
+    void ServiceManager::startEnabledServices() {
+      std::vector<Service*> services;
+
+      for (const auto& [key, value] : serviceMap)
+        services.push_back(value);
+
+      std::sort(services.begin(), services.end(), [](const Service* x, const Service* y) {
+        return x->getStartOrder() < y->getStartOrder();
+      });
+
+      for (const auto& service : services)
+        if (service->isEnabled()) service->start();
+    }
 
-    void ServiceManager::registerService(Service* s) {
-      s->init();
-      s->postInit();
 
-      services[s->getName()] = s;
+    void ServiceManager::setServiceEnabled(const str& name, bool enabled) {
+      if (serviceMap.count(name) > 0) {
+        serviceMap.at(name)->setEnabled(enabled);
+      } else {
+        // Service not found
+        // TODO: logging…?
+      }
+    }
+
+    bool ServiceManager::getServiceEnabled(const str& name) {
+      if (serviceMap.count(name) > 0) {
+        return serviceMap.at(name)->isEnabled();
+      } else {
+        // Service not found
+        // TODO: logging…?
+        return false;
+      }
+    }
+
+
+    void ServiceManager::registerService(Service* s) {
+      if (!registrationLocked) {
+        s->init();
+        s->postInit();
 
-      ESP_LOGI(TAG, "Registered service[ %s ]", s->getName().c_str());
+        serviceMap[s->getName()] = s;
 
+        ESP_LOGI(TAG, "Registered service[ %s ]", s->getName().c_str());
+      } else {
+        ESP_LOGW(TAG, "Service registration is locked");
+      }
     }
 
 
diff --git a/CLC-qthing/SiliconTorch/Service/ServiceManager.hpp b/CLC-qthing/SiliconTorch/Service/ServiceManager.hpp
index 7407949..54cdeeb 100644
--- a/CLC-qthing/SiliconTorch/Service/ServiceManager.hpp
+++ b/CLC-qthing/SiliconTorch/Service/ServiceManager.hpp
@@ -32,12 +32,18 @@ namespace SiliconTorch {
 
         ServiceManager();
 
+        void startEnabledServices();
+
+        void setServiceEnabled(const str& name, bool enabled);
+        bool getServiceEnabled(const str& name);
+
+
         void registerService(Service* s);
 
       private:
 
         bool registrationLocked = false;
-        ServiceMap services;
+        ServiceMap serviceMap;
 
     };
 
diff --git a/CLC-qthing/SiliconTorch/Service/__services__.cpp b/CLC-qthing/SiliconTorch/Service/__services__.cpp
index 3141a1f..f11bdcf 100644
--- a/CLC-qthing/SiliconTorch/Service/__services__.cpp
+++ b/CLC-qthing/SiliconTorch/Service/__services__.cpp
@@ -1,23 +1,9 @@
 #include "ServiceManager.hpp"
 
-// C++ system level
-// #include <cstring>     // memset, strncmp
-// #include <cstdlib>     // TODO: is this for memcpy?
-// #include <functional>
-
-// ESP32 specific
-// #include "esp_log.h"
-
-// project specific
+// our services
 #include "FxCyanF.hpp"
-// #include <Types.hpp>
-// #include "SiliconTorch/NVSExplorer.hpp"
-
-// qthing stuff
-// #include <qthing>
-
-
-// const char* TAG = "ServiceManager";
+#include "FxPublish.hpp"
+#include "CyanStripe.hpp"
 
 
 namespace SiliconTorch {
@@ -28,6 +14,8 @@ namespace SiliconTorch {
     void registerSiliconTorchServices(ServiceManager* mgr) {
 
       mgr->registerService(new SiliconTorch::Service::FxCyanF());
+      mgr->registerService(new SiliconTorch::Service::FxPublish());
+      mgr->registerService(new SiliconTorch::Service::CyanStripe());
 
     }
 
-- 
GitLab