From 3b3202e0c25051e12bf5c5b918b56a312c3be382 Mon Sep 17 00:00:00 2001
From: Armin Co <armin.co@hs-bochum.de>
Date: Sun, 4 Oct 2020 17:51:04 +0200
Subject: [PATCH] Adding ObserverPattern

---
 CMakeLists.txt                     |  1 +
 src/observ/ObserverPattern.hpp     | 35 ++++++++++++++++++++++++++
 src/smart_grid/ModelState.cpp      |  1 -
 src/smart_grid/ModelState.hpp      |  5 +++-
 src/smart_grid/SmgStateMachine.hpp | 40 ++++++++++++++++++++++++++++++
 src/smart_grid/StateLogger.hpp     | 15 +++++++++++
 6 files changed, 95 insertions(+), 2 deletions(-)
 create mode 100644 src/observ/ObserverPattern.hpp
 create mode 100644 src/smart_grid/SmgStateMachine.hpp
 create mode 100644 src/smart_grid/StateLogger.hpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 098a1c2..96c755b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,6 +8,7 @@ add_subdirectory(libs/spdlog)
 
 include_directories(src)
 include_directories(libs/spdlog/include)
+include_directories(src/observ)
 
 include_directories(src/com)
 add_library(soc_com
diff --git a/src/observ/ObserverPattern.hpp b/src/observ/ObserverPattern.hpp
new file mode 100644
index 0000000..fe79426
--- /dev/null
+++ b/src/observ/ObserverPattern.hpp
@@ -0,0 +1,35 @@
+/// Subject of oberver pattern
+
+#ifndef OBSERVER_PATTERN_HPP
+#define OBSERVER_PATTERN_HPP
+
+#include <vector>
+#include <memory>
+
+/// Type sub has to be an observable subject.
+template<typename T>
+class IObserver
+{
+public:
+    virtual void update(const T &subject) = 0;
+};
+
+template<typename T>
+class Subject
+{
+public:
+    virtual ~Subject() = default;
+    void attach(std::shared_ptr<IObserver<T>> observer){
+        m_observers.push_back(observer);
+    }
+
+    void notify() const{
+        for (auto &observer : m_observers){
+            observer.update(this);
+        }
+    }
+private:
+    std::vector<std::shared_ptr<IObserver<T>>> m_observers;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/smart_grid/ModelState.cpp b/src/smart_grid/ModelState.cpp
index 241b3cc..6e5bf82 100644
--- a/src/smart_grid/ModelState.cpp
+++ b/src/smart_grid/ModelState.cpp
@@ -114,5 +114,4 @@ void ModelState::next_hour()
     update_power_production();
     update_modell();
     print_states();
-    notify();
 }
\ No newline at end of file
diff --git a/src/smart_grid/ModelState.hpp b/src/smart_grid/ModelState.hpp
index 86c9012..7026932 100644
--- a/src/smart_grid/ModelState.hpp
+++ b/src/smart_grid/ModelState.hpp
@@ -10,6 +10,7 @@
 #include "spdlog/spdlog.h"
 #include "SmartGridModell.hpp"
 
+#include "ObserverPattern.hpp"
 struct MaxPower
 {
     static constexpr double village = 600;
@@ -56,7 +57,8 @@ struct PowerUsage
     double sum() { return village + industry; }
 };
 
-class ModelState
+
+class ModelState : Subject<ModelState>
 {
 public:
     ModelState(SmartGridModell &modell);
@@ -72,6 +74,7 @@ private:
     void update_modell();
     void print_states();
 
+
     static constexpr double solar_size{10};
     static constexpr double windpark_size{1.0};
     static constexpr double village_size{10};
diff --git a/src/smart_grid/SmgStateMachine.hpp b/src/smart_grid/SmgStateMachine.hpp
new file mode 100644
index 0000000..6dcb770
--- /dev/null
+++ b/src/smart_grid/SmgStateMachine.hpp
@@ -0,0 +1,40 @@
+///
+
+#ifndef SMG_STATE_MACHINE_HPP
+#define SMG_STATE_MACHINE_HPP
+
+#include "ModelState.hpp"
+#include "SmartGridModell.hpp"
+
+enum class MainState
+{
+    Simulation,
+    ManualControl
+};
+
+enum class SimSate
+{
+    Entry,
+    Do,
+    Exit
+};
+
+enum class ManualSate
+{
+    Entry,
+    Do,
+    Exit
+};
+
+
+class SmgStateMachine
+{
+public:
+    void run();
+    
+private:
+    SmartGridModell m_modell;
+    ModelState m_state;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/smart_grid/StateLogger.hpp b/src/smart_grid/StateLogger.hpp
new file mode 100644
index 0000000..2ab362f
--- /dev/null
+++ b/src/smart_grid/StateLogger.hpp
@@ -0,0 +1,15 @@
+///
+
+#ifndef STATE_LOGGER_HPP
+#define STATE_LOGGER_HPP
+
+#include "ModelState.hpp"
+#include "ObserverPattern.hpp"
+
+class StateLogger : IObserver<ModelState>
+{
+public:
+    virtual void update(const ModelState &state) override;
+};
+
+#endif
\ No newline at end of file
-- 
GitLab