IQRF Gateway Daemon
JsonSerializer.h
Go to the documentation of this file.
1 
17 #pragma once
18 
19 #include "ISerializer.h"
20 #include "ObjectFactory.h"
21 #include "DpaRaw.h"
22 #include "PrfFrc.h"
23 #include "PrfThermometer.h"
24 #include "PrfIo.h"
25 #include "PrfOs.h"
26 #include "PrfLeds.h"
27 #include "PlatformDep.h"
28 #include "rapidjson/rapidjson.h"
29 #include "rapidjson/document.h"
30 #include "rapidjson/istreamwrapper.h"
31 #include "rapidjson/stringbuffer.h"
32 #include "rapidjson/prettywriter.h"
33 #include <algorithm>
34 #include <memory>
35 #include <string>
36 
42 {
43 protected:
44 
45  PrfCommonJson();
46  PrfCommonJson(const PrfCommonJson& o);
47 
53  void parseRequestJson(const rapidjson::Value& val, DpaTask& dpaTask);
54 
59  void addResponseJsonPrio1Params(const DpaTask& dpaTask);
60 
65  void addResponseJsonPrio2Params(const DpaTask& dpaTask);
66 
72  std::string encodeResponseJsonFinal(const DpaTask& dpaTask);
73 
74 public:
75 
83  int parseBinary(uint8_t* to, const std::string& from, int maxlen);
84 
91  template<typename T>
92  void parseHexaNum(T& to, const std::string& from)
93  {
94  int val = 0;
95  std::istringstream istr(from);
96  if (istr >> std::hex >> val) {
97  to = (T)val;
98  }
99  else {
100  THROW_EX(std::logic_error, "Unexpected format: " << PAR(from));
101  }
102  }
103 
107  void encodeHexaNum(std::string& to, uint8_t from);
108 
112  void encodeHexaNum(std::string& to, uint16_t from);
113 
121  void encodeBinary(std::string& to, const uint8_t* from, int len);
122 
126  void encodeTimestamp(std::string& to, std::chrono::time_point<std::chrono::system_clock> from);
127 
129  bool m_has_ctype = false;
130  bool m_has_type = false;
131  bool m_has_nadr = false;
132  bool m_has_hwpid = false;
133  bool m_has_timeout = false;
134  bool m_has_msgid = false;
135  bool m_has_request = false;
136  bool m_has_request_ts = false;
137  bool m_has_response = false;
138  bool m_has_response_ts = false;
139  bool m_has_confirmation = false;
140  bool m_has_confirmation_ts = false;
141  bool m_has_cmd = false;
142  bool m_has_rcode = false;
143  bool m_has_rdata = false;
144  bool m_has_dpaval = false;
145 
147  std::string m_ctype;
148  std::string m_type;
149  std::string m_nadr = "0";
150  std::string m_hwpid = "0xffff";
151  int m_timeoutJ = 0;
152  std::string m_msgid;
153  std::string m_requestJ;
154  std::string m_request_ts;
155  std::string m_responseJ;
156  std::string m_response_ts;
157  std::string m_confirmationJ;
158  std::string m_confirmation_ts;
159  std::string m_cmdJ;
160  std::string m_statusJ;
161  std::string m_rcodeJ;
162  std::string m_rdataJ;
163  std::string m_dpavalJ;
164 
165  rapidjson::Document m_doc;
166 
167  bool m_dotNotation = true;
168 };
169 
175 class PrfRawJson : public DpaRaw, public PrfCommonJson
176 {
177 public:
180  explicit PrfRawJson(const rapidjson::Value& val);
181 
186  explicit PrfRawJson(const DpaMessage& dpaMessage);
187  virtual ~PrfRawJson() {}
188 
192  std::string encodeResponse(const std::string& errStr) override;
193 
197  std::string encodeAsyncRequest(const std::string& errStr);
198 private:
199 };
200 
206 class PrfRawHdpJson : public DpaRaw, public PrfCommonJson
207 {
208 public:
211  static const std::string PRF_NAME;
212 
215  explicit PrfRawHdpJson(const rapidjson::Value& val);
216  virtual ~PrfRawHdpJson() {}
217 
221  std::string encodeResponse(const std::string& errStr) override;
222 private:
224  std::string m_pnum;
225  std::string m_pcmd;
226  std::string m_data;
227 
228 };
229 
236 class PrfThermometerJson : public PrfThermometer, public PrfCommonJson
237 {
238 public:
241  explicit PrfThermometerJson(const rapidjson::Value& val);
242  virtual ~PrfThermometerJson() {}
243 
247  std::string encodeResponse(const std::string& errStr) override;
248 };
249 
256 class PrfFrcJson : public PrfFrc, public PrfCommonJson
257 {
258 public:
261  explicit PrfFrcJson(const rapidjson::Value& val);
262  virtual ~PrfFrcJson() {}
263 
267  std::string encodeResponse(const std::string& errStr) override;
268 private:
269  bool m_predefinedFrcCommand = false;
270  std::string m_userData;
271 };
272 
279 class PrfIoJson : public PrfIo, public PrfCommonJson
280 {
281 public:
284  explicit PrfIoJson(const rapidjson::Value& val);
285  virtual ~PrfIoJson() {}
286 
290  std::string encodeResponse(const std::string& errStr) override;
291 private:
292  Port m_port;
293  uint8_t m_bit;
294  bool m_val;
295 };
296 
303 class PrfOsJson : public PrfOs, public PrfCommonJson
304 {
305 public:
308  explicit PrfOsJson(const rapidjson::Value& val);
309  virtual ~PrfOsJson() {}
310 
314  std::string encodeResponse(const std::string& errStr) override;
315 };
316 
323 template <typename L>
324 class PrfLedJson : public L, public PrfCommonJson
325 {
326 public:
329  explicit PrfLedJson(const rapidjson::Value& val) {
330  parseRequestJson(val, *this);
331  }
332 
333  virtual ~PrfLedJson() {}
334 
335 
339  std::string encodeResponse(const std::string& errStr) override
340  {
341  rapidjson::Value v;
342 
345 
346  int ls = L::getLedState();
347  if (ls >= 0) {
348  v.SetString((ls ? "on" : "off"), m_doc.GetAllocator());
349  m_doc.AddMember("led_state", v, m_doc.GetAllocator());
350  }
351 
352  m_statusJ = errStr;
353  return encodeResponseJsonFinal(*this);
354  }
355 
356 };
357 
360 
363 
368 class JsonSerializer : public ObjectFactory<DpaTask, rapidjson::Value>, public ISerializer
369 {
370 public:
371  JsonSerializer();
372 
375  JsonSerializer(const std::string& name);
376  virtual ~JsonSerializer() {}
377 
379  const std::string& getName() const override { return m_name; }
380 
382  std::string parseCategory(const std::string& request) override;
383  std::unique_ptr<DpaTask> parseRequest(const std::string& request) override;
384  std::string parseConfig(const std::string& request) override;
385  std::string encodeConfig(const std::string& request, const std::string& response) override;
386  std::string getLastError() const override;
387  std::string encodeAsyncAsDpaRaw(const DpaMessage& dpaMessage) const override;
388 
389 private:
390  void init();
391  std::string m_lastError;
392  std::string m_name;
393 };
std::string m_msgid
Definition: JsonSerializer.h:152
Parse/encode JSON message holding DpaRaw.
Definition: JsonSerializer.h:175
void encodeTimestamp(std::string &to, std::chrono::time_point< std::chrono::system_clock > from)
Encode timestamp.
Definition: JsonSerializer.cpp:161
std::string m_response_ts
Definition: JsonSerializer.h:156
const std::string & getName() const override
returns instance name
Definition: JsonSerializer.h:379
virtual ~PrfRawJson()
Definition: JsonSerializer.h:187
bool m_has_timeout
Definition: JsonSerializer.h:133
PrfLedJson< PrfLedR > PrfLedRJson
Type for embedded Red LED.
Definition: JsonSerializer.h:362
void parseHexaNum(T &to, const std::string &from)
Parse templated ordinary type T encoded hexa.
Definition: JsonSerializer.h:92
virtual ~PrfOsJson()
Definition: JsonSerializer.h:309
Parse/encode JSON message holding PrfFrcJson.
Definition: JsonSerializer.h:256
bool m_has_confirmation
Definition: JsonSerializer.h:139
virtual ~PrfLedJson()
Definition: JsonSerializer.h:333
std::string m_rdataJ
Definition: JsonSerializer.h:162
bool m_has_ctype
various flags to store presence of members of DPA request to be used in DPA response ...
Definition: JsonSerializer.h:129
int parseBinary(uint8_t *to, const std::string &from, int maxlen)
Parse binary data encoded hexa.
Definition: JsonSerializer.cpp:100
bool m_has_response_ts
Definition: JsonSerializer.h:138
bool m_has_msgid
Definition: JsonSerializer.h:134
bool m_has_cmd
Definition: JsonSerializer.h:141
Parse/encode JSON message holding PrfThermometer.
Definition: JsonSerializer.h:236
bool m_has_confirmation_ts
Definition: JsonSerializer.h:140
bool m_dotNotation
Definition: JsonSerializer.h:167
bool m_has_dpaval
Definition: JsonSerializer.h:144
rapidjson::Document m_doc
Definition: JsonSerializer.h:165
ISerializer interface.
Definition: ISerializer.h:31
bool m_has_hwpid
Definition: JsonSerializer.h:132
bool m_has_response
Definition: JsonSerializer.h:137
virtual ~PrfFrcJson()
Definition: JsonSerializer.h:262
std::string m_confirmationJ
Definition: JsonSerializer.h:157
Implements common features of JsonDpaMessage.
Definition: JsonSerializer.h:41
Object factory to create DpaTask objects from incoming messages.
Definition: JsonSerializer.h:368
virtual ~PrfRawHdpJson()
Definition: JsonSerializer.h:216
Parse/encode JSON message holding PrfLed.
Definition: JsonSerializer.h:324
std::string m_dpavalJ
Definition: JsonSerializer.h:163
Parse/encode JSON message holding PrfIoJson.
Definition: JsonSerializer.h:279
std::string m_confirmation_ts
Definition: JsonSerializer.h:158
PrfLedJson(const rapidjson::Value &val)
parametric constructor
Definition: JsonSerializer.h:329
std::string m_nadr
Definition: JsonSerializer.h:149
static const std::string PRF_NAME
Definition: JsonSerializer.h:211
void addResponseJsonPrio1Params(const DpaTask &dpaTask)
Encode begining members of JSON.
Definition: JsonSerializer.cpp:222
std::string m_request_ts
Definition: JsonSerializer.h:154
bool m_has_request_ts
Definition: JsonSerializer.h:136
std::string m_rcodeJ
Definition: JsonSerializer.h:161
void encodeHexaNum(std::string &to, uint8_t from)
Encode uint_8 to hexa string.
Definition: JsonSerializer.cpp:123
Parse/encode JSON message holding PrfOsJson.
Definition: JsonSerializer.h:303
Definition: JsonSerializer.h:206
std::string m_type
Definition: JsonSerializer.h:148
virtual ~PrfIoJson()
Definition: JsonSerializer.h:285
void encodeBinary(std::string &to, const uint8_t *from, int len)
Encode binary data to hexa string.
Definition: JsonSerializer.cpp:139
bool m_has_rdata
Definition: JsonSerializer.h:143
PrfLedJson< PrfLedG > PrfLedGJson
Type for embedded Green LED.
Definition: JsonSerializer.h:359
std::string encodeResponseJsonFinal(const DpaTask &dpaTask)
Encode final members of JSON and return it.
Definition: JsonSerializer.cpp:278
Create object based on data representation.
Definition: ObjectFactory.h:33
std::string m_cmdJ
Definition: JsonSerializer.h:159
bool m_has_rcode
Definition: JsonSerializer.h:142
std::string m_ctype
various flags to store members of DPA request to be used in DPA response
Definition: JsonSerializer.h:147
virtual ~PrfThermometerJson()
Definition: JsonSerializer.h:242
std::string encodeResponse(const std::string &errStr) override
DpaTask overriden method.
Definition: JsonSerializer.h:339
std::string m_requestJ
Definition: JsonSerializer.h:153
bool m_has_type
Definition: JsonSerializer.h:130
std::string m_hwpid
Definition: JsonSerializer.h:150
int m_timeoutJ
Definition: JsonSerializer.h:151
virtual ~JsonSerializer()
Definition: JsonSerializer.h:376
void addResponseJsonPrio2Params(const DpaTask &dpaTask)
Encode middle members of JSON.
Definition: JsonSerializer.cpp:255
bool m_has_nadr
Definition: JsonSerializer.h:131
std::string m_statusJ
Definition: JsonSerializer.h:160
std::string m_responseJ
Definition: JsonSerializer.h:155
void parseRequestJson(const rapidjson::Value &val, DpaTask &dpaTask)
Parse common items.
Definition: JsonSerializer.cpp:184
bool m_has_request
Definition: JsonSerializer.h:135
PrfCommonJson()
Definition: JsonSerializer.cpp:57