IQRF Gateway Daemon
DaemonController.h
Go to the documentation of this file.
1 
17 #pragma once
18 
19 #include "DpaHandler.h"
20 #include "ISerializer.h"
21 #include "IMessaging.h"
22 #include "IService.h"
23 #include "TaskQueue.h"
24 #include "IDaemon.h"
25 #include "JsonUtils.h"
26 #include "IqrfLogging.h"
27 #include <map>
28 #include <string>
29 #include <atomic>
30 #include <vector>
31 
32 class IChannel;
35 
41 public:
42 
48  ComponentDescriptor(const std::string& componentName, bool enabled)
49  : m_componentName(componentName)
50  , m_enabled(enabled)
51  {}
52 
57  void loadConfiguration(const std::string configurationDir);
58 
63  rapidjson::Value& getConfiguration() {
64  return m_doc;
65  }
66 
67  std::string m_componentName;
68  std::string m_interfaceName;
69  bool m_enabled = false;
70  rapidjson::Document m_doc;
71 };
72 
97 class DaemonController : public IDaemon
98 {
99 public:
105  enum class Mode {
106  Operational,
107  Service,
108  Forwarding
109  };
110 
111  DaemonController(const DaemonController &) = delete;
112 
113  static DaemonController& getController();
114 
116  void run(const std::string& cfgFileName);
117 
118  // IDaemon override methods
119  void executeDpaTransaction(DpaTransaction& dpaTransaction) override;
120  void registerAsyncMessageHandler(const std::string& serviceId, AsyncMessageHandlerFunc fun) override;
121  void unregisterAsyncMessageHandler(const std::string& serviceId) override;
122  IScheduler* getScheduler() override { return m_scheduler; }
123  std::string doCommand(const std::string& cmd) override;
124  const std::string& getModuleId() override { return m_moduleId; }
125  const std::string& getOsVersion() override { return m_osVersion; }
126  const std::string& getTrType() override { return m_trType; }
127  const std::string& getMcuType() override { return m_mcuType; }
128  const std::string& getOsBuild() override { return m_osBuild; }
129  const std::string& getDaemonVersion() override { return m_version; }
130  const std::string& getDaemonVersionBuild() override { return m_versionBuild; }
131 
133  void exit();
134 
142  void setMode(Mode mode);
143 
144 private:
145  std::mutex m_modeMtx;
146  Mode m_mode;
147 
148  std::map<std::string, AsyncMessageHandlerFunc> m_asyncMessageHandlers;
149  std::mutex m_asyncMessageHandlersMutex;
150  void asyncDpaMessageHandler(const DpaMessage& dpaMessage);
151 
153  virtual ~DaemonController();
154 
155  void startTrace();
156  void startIqrfIf();
157  void startDpa();
158  void startServices();
159  void startScheduler();
160 
161  void stopIqrfIf();
162  void stopDpa();
163  void stopServices();
164  void stopTrace();
165 
166  void start();
167  void stop();
168 
169  void * getFunction(const std::string& methodName, bool mandatory) const;
170  void * getCreateFunction(const std::string& componentName, bool mandatory) const;
171 
172  IChannel* m_iqrfInterface;
173  DpaHandler* m_dpaHandler;
174 
175  void executeDpaTransactionFunc(DpaTransaction* dpaTransaction);
176 
177  TaskQueue<DpaTransaction*> *m_dpaTransactionQueue;
178 
179  std::map<std::string, std::unique_ptr<ISerializer>> m_serializers;
180  std::map<std::string, std::unique_ptr<IService>> m_services;
181  std::map<std::string, std::unique_ptr<IMessaging>> m_messagings;
182 
183  IDpaMessageForwarding* m_dpaMessageForwarding = nullptr;
184  IDpaExclusiveAccess* m_dpaExclusiveAccess = nullptr;
185 
186  IScheduler* m_scheduler = nullptr;
187 
189  void watchDogPet();
190  bool m_running = false;
191  std::mutex m_stopConditionMutex;
192  std::condition_variable m_stopConditionVariable;
193  std::chrono::system_clock::time_point m_lastRefreshTime;
194  std::chrono::milliseconds m_timeout;
195 
197  void loadConfiguration(const std::string& cfgFileName);
198  rapidjson::Document m_configuration;
199  std::string m_cfgFileName;
200  const std::string m_cfgVersion = "v1.0";
201  std::string m_traceFileName;
202  int m_traceFileSize = 0;
203  iqrf::Level m_level;
204  std::string m_iqrfInterfaceName;
205  int m_dpaHandlerTimeout = 400;
206  IqrfRfCommunicationMode m_communicationMode = IqrfRfCommunicationMode::kStd;
207 
208  std::string m_configurationDir;
209  std::string m_modeStr;
210  int m_watchDogTimeoutMilis = 0;
211  std::map<std::string, ComponentDescriptor> m_componentMap;
212 
213  void loadSerializerComponent(const ComponentDescriptor& componentDescriptor);
214  void loadMessagingComponent(const ComponentDescriptor& componentDescriptor);
215  void loadServiceComponent(const ComponentDescriptor& componentDescriptor);
216 
218  std::string m_moduleId;
219  std::string m_osVersion;
220  std::string m_trType;
221  bool m_fcc = false;
222  std::string m_mcuType;
223  std::string m_osBuild;
224 
225  std::string m_version;
226  std::string m_versionBuild;
227 };
Create component instances.
Definition: DaemonController.h:97
Definition: UdpMessage.h:52
Mode
operational mode
Definition: DaemonController.h:105
std::string m_interfaceName
Definition: DaemonController.h:68
IDaemon interface.
Definition: IDaemon.h:31
IScheduler * getScheduler() override
Get IScheduler implementation.
Definition: DaemonController.h:122
rapidjson::Value & getConfiguration()
get JSON configuration
Definition: DaemonController.h:63
const std::string & getOsVersion() override
Get IQRF coordination OS version.
Definition: DaemonController.h:125
IScheduler interface.
Definition: IScheduler.h:28
IDpaExclusiveAccess interface.
Definition: IDpaExclusiveAccess.h:26
const std::string & getMcuType() override
Get IQRF coordination MCU type.
Definition: DaemonController.h:127
const std::string & getTrType() override
Get IQRF coordination TR type.
Definition: DaemonController.h:126
const std::string & getDaemonVersionBuild() override
Get iqrf-daemon build Timestamp.
Definition: DaemonController.h:130
const std::string & getModuleId() override
Get IQRF coordination identification.
Definition: DaemonController.h:124
const std::string & getOsBuild() override
Get IQRF coordination OS build.
Definition: DaemonController.h:128
Auxiliar class for component initialization.
Definition: DaemonController.h:40
rapidjson::Document m_doc
Definition: DaemonController.h:70
IDpaMessageForwarding interface.
Definition: IDpaMessageForwarding.h:28
std::string m_componentName
Definition: DaemonController.h:67
ComponentDescriptor(const std::string &componentName, bool enabled)
parametric constructor
Definition: DaemonController.h:48
std::function< void(const DpaMessage &dpaMessage)> AsyncMessageHandlerFunc
Asynchronous DPA message handler functional type.
Definition: IDaemon.h:24
const std::string & getDaemonVersion() override
Get iqrf-daemon Version.
Definition: DaemonController.h:129
Maintain queue of tasks and invoke sequential processing.
Definition: TaskQueue.h:32
bool m_enabled
Definition: DaemonController.h:69
void loadConfiguration(const std::string configurationDir)
load JSON configuration file
Definition: DaemonController.cpp:870