From 37b596db3747628cc74066bfccca543fb8c7cfb2 Mon Sep 17 00:00:00 2001
From: Armin Co <armin.co@hs-bochum.de>
Date: Sun, 4 Oct 2020 18:40:00 +0200
Subject: [PATCH] Added observer log.

---
 CMakeLists.txt                 |  1 +
 src/observ/ObserverPattern.hpp | 13 +++++++------
 src/smart_grid/ModelState.cpp  |  1 +
 src/smart_grid/ModelState.hpp  |  7 ++++++-
 src/smart_grid/StateLogger.cpp |  8 ++++++++
 src/smart_grid/StateLogger.hpp |  1 +
 6 files changed, 24 insertions(+), 7 deletions(-)
 create mode 100644 src/smart_grid/StateLogger.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 96c755b..1987450 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,6 +34,7 @@ include_directories(src/smart_grid)
 add_executable(smart_grid.exe
     src/smg_server.cpp
     src/smart_grid/SmartGridModell.cpp
+    src/smart_grid/StateLogger.cpp
     src/i2c/Node.cpp
     src/com/Socket.cpp
     src/com/Protocol.cpp
diff --git a/src/observ/ObserverPattern.hpp b/src/observ/ObserverPattern.hpp
index fe79426..300d829 100644
--- a/src/observ/ObserverPattern.hpp
+++ b/src/observ/ObserverPattern.hpp
@@ -14,22 +14,23 @@ public:
     virtual void update(const T &subject) = 0;
 };
 
-template<typename T>
+template<typename Observer, typename Value>
 class Subject
 {
 public:
     virtual ~Subject() = default;
-    void attach(std::shared_ptr<IObserver<T>> observer){
+    void attach(std::shared_ptr<Observer> observer){
         m_observers.push_back(observer);
     }
 
-    void notify() const{
-        for (auto &observer : m_observers){
-            observer.update(this);
+protected:
+    void notify(const Value &value) const{
+        for (auto observer : m_observers){
+            observer->update(value);
         }
     }
 private:
-    std::vector<std::shared_ptr<IObserver<T>>> m_observers;
+    std::vector<std::shared_ptr<Observer>> m_observers;
 };
 
 #endif
\ No newline at end of file
diff --git a/src/smart_grid/ModelState.cpp b/src/smart_grid/ModelState.cpp
index 6e5bf82..3bcd87c 100644
--- a/src/smart_grid/ModelState.cpp
+++ b/src/smart_grid/ModelState.cpp
@@ -114,4 +114,5 @@ void ModelState::next_hour()
     update_power_production();
     update_modell();
     print_states();
+    notify(*this);
 }
\ No newline at end of file
diff --git a/src/smart_grid/ModelState.hpp b/src/smart_grid/ModelState.hpp
index 7026932..5e72dd0 100644
--- a/src/smart_grid/ModelState.hpp
+++ b/src/smart_grid/ModelState.hpp
@@ -11,6 +11,7 @@
 #include "SmartGridModell.hpp"
 
 #include "ObserverPattern.hpp"
+#include "StateLogger.hpp"
 struct MaxPower
 {
     static constexpr double village = 600;
@@ -58,13 +59,17 @@ struct PowerUsage
 };
 
 
-class ModelState : Subject<ModelState>
+class StateLogger;
+class ModelState : Subject<StateLogger, ModelState>
 {
 public:
     ModelState(SmartGridModell &modell);
     void next_hour();
     double excess_power();
 
+    PowerProduction getPowerProduction() const {return m_production;}
+    PowerUsage getPowerUsage() const {return m_usage;}
+
 private:
     void update_time();
     void update_sun();
diff --git a/src/smart_grid/StateLogger.cpp b/src/smart_grid/StateLogger.cpp
new file mode 100644
index 0000000..2aee2ea
--- /dev/null
+++ b/src/smart_grid/StateLogger.cpp
@@ -0,0 +1,8 @@
+///
+
+#include "StateLogger.hpp"
+
+void StateLogger::update(const ModelState &model)
+{
+    spdlog::debug("Clean solar power: {}", model.getPowerProduction().renewable.solar);
+}
\ No newline at end of file
diff --git a/src/smart_grid/StateLogger.hpp b/src/smart_grid/StateLogger.hpp
index 2ab362f..96ded40 100644
--- a/src/smart_grid/StateLogger.hpp
+++ b/src/smart_grid/StateLogger.hpp
@@ -6,6 +6,7 @@
 #include "ModelState.hpp"
 #include "ObserverPattern.hpp"
 
+class ModelState;
 class StateLogger : IObserver<ModelState>
 {
 public:
-- 
GitLab