UniSet  2.24.2
MessageType.h
1 /*
2  * Copyright (c) 2015 Pavel Vainerman.
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as
6  * published by the Free Software Foundation, version 2.1.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * Lesser General Lesser Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 // --------------------------------------------------------------------------
21 // --------------------------------------------------------------------------
22 #ifndef MessageType_H_
23 #define MessageType_H_
24 // --------------------------------------------------------------------------
25 #include <time.h> // for timespec
26 #include <cstring>
27 #include <memory>
28 #include <string>
29 #include <ostream>
30 #include "UniSetTypes.h"
31 #include "IOController_i.hh"
32 // --------------------------------------------------------------------------
33 namespace uniset
34 {
35  class Message
36  {
37  public:
38  enum TypeOfMessage
39  {
40  Unused, // Сообщение не содержит информации
41  SensorInfo,
42  SysCommand, // Сообщение содержит системную команду
43  Confirm, // Сообщение содержит подтверждение
44  Timer, // Сообщения о срабатывании таймера
45  TextMessage, // текстовое сообщение
46  TheLastFieldOfTypeOfMessage // Обязательно оставьте последним
47  };
48 
49  int type = { Unused }; // Содержание сообщения (тип)
50 
51  enum Priority
52  {
53  Low,
54  Medium,
55  High
56  };
57 
58  Priority priority = { Medium };
59  ObjectId node = { uniset::DefaultObjectId }; // откуда
60  ObjectId supplier = { uniset::DefaultObjectId }; // от кого
61  ObjectId consumer = { uniset::DefaultObjectId }; // кому
62  struct timespec tm = { 0, 0 };
63 
64  Message( Message&& ) noexcept = default;
65  Message& operator=(Message&& ) noexcept = default;
66  Message( const Message& ) noexcept = default;
67  Message& operator=(const Message& ) noexcept = default;
68 
69  Message() noexcept;
70 
71  // для оптимизации, делаем конструктор, который не будет инициализировать свойства класса
72  // это необходимо для VoidMessage, который конструируется при помощи memcpy
73  explicit Message( int dummy_init ) noexcept {}
74 
75  template<class In>
76  static const TransportMessage transport(const In& msg) noexcept
77  {
78  TransportMessage tmsg;
79  assert(sizeof(uniset::RawDataOfTransportMessage) >= sizeof(msg));
80  std::memcpy(&tmsg.data, &msg, sizeof(msg));
81  tmsg.consumer = msg.consumer;
82  return tmsg;
83  }
84  };
85 
86  std::string strTypeOfMessage( int type );
87  std::ostream& operator<<( std::ostream& os, const Message::TypeOfMessage& t );
88 
89  // ------------------------------------------------------------------------
90  class VoidMessage : public Message
91  {
92  public:
93 
94  VoidMessage( VoidMessage&& ) noexcept = default;
95  VoidMessage& operator=(VoidMessage&& ) noexcept = default;
96  VoidMessage( const VoidMessage& ) noexcept = default;
97  VoidMessage& operator=( const VoidMessage& ) noexcept = default;
98 
99  // для оптимизации, делаем конструктор, который не будет инициализировать свойства класса
100  // это необходимо для VoidMessage, который конструируется при помощи memcpy
101  VoidMessage( int dummy ) noexcept : Message(dummy) {} // -V730
102 
103  VoidMessage( const TransportMessage& tm ) noexcept;
104  VoidMessage() noexcept;
105  inline bool operator < ( const VoidMessage& msg ) const
106  {
107  if( priority != msg.priority )
108  return priority < msg.priority;
109 
110  if( tm.tv_sec != msg.tm.tv_sec )
111  return tm.tv_sec >= msg.tm.tv_sec;
112 
113  return tm.tv_nsec >= msg.tm.tv_nsec;
114  }
115 
116  inline TransportMessage transport_msg() const noexcept
117  {
118  return transport(*this);
119  }
120 
122  };
123 
124  // ------------------------------------------------------------------------
126  class SensorMessage : public Message
127  {
128  public:
129 
131  long value = { 0 };
132  bool undefined = { false };
133 
134  // время изменения состояния датчика
135  struct timespec sm_tv = { 0, 0 };
136 
137  UniversalIO::IOType sensor_type = { UniversalIO::DI };
139 
140  // для пороговых датчиков
141  bool threshold = { false };
143 
144  SensorMessage( SensorMessage&& m) noexcept = default;
145  SensorMessage& operator=(SensorMessage&& m) noexcept = default;
146  SensorMessage( const SensorMessage& ) noexcept = default;
147  SensorMessage& operator=( const SensorMessage& ) noexcept = default;
148 
149  SensorMessage() noexcept;
150  SensorMessage(ObjectId id, long value, const IOController_i::CalibrateInfo& ci = IOController_i::CalibrateInfo(),
151  Priority priority = Message::Medium,
152  UniversalIO::IOType st = UniversalIO::AI,
153  ObjectId consumer = uniset::DefaultObjectId) noexcept;
154 
155  // специальный конструктор, для оптимизации
156  // он не инициализирует поля по умолчанию
157  // и за инициализацию значений отвечает "пользователь"
158  // например см. IONotifyController::localSetValue()
159  explicit SensorMessage( int dummy ) noexcept;
160 
161  SensorMessage(const VoidMessage* msg) noexcept;
162  inline TransportMessage transport_msg() const noexcept
163  {
164  return transport(*this);
165  }
166  };
167 
168  // ------------------------------------------------------------------------
170  class SystemMessage : public Message
171  {
172  public:
173  enum Command
174  {
175  Unknown,
176  StartUp,
188  };
189 
190  SystemMessage( SystemMessage&& ) noexcept = default;
191  SystemMessage& operator=(SystemMessage&& ) noexcept = default;
192  SystemMessage( const SystemMessage& ) noexcept = default;
193  SystemMessage& operator=( const SystemMessage& ) noexcept = default;
194 
195  SystemMessage() noexcept;
196  SystemMessage(Command command, Priority priority = Message::High,
197  ObjectId consumer = uniset::DefaultObjectId) noexcept;
198  SystemMessage(const VoidMessage* msg) noexcept;
199 
200  inline TransportMessage transport_msg() const noexcept
201  {
202  return transport(*this);
203  }
204 
205  int command = { 0 };
206  long data[2];
207  };
208  std::ostream& operator<<( std::ostream& os, const SystemMessage::Command& c );
209 
210  // ------------------------------------------------------------------------
211 
213  class TimerMessage : public Message
214  {
215  public:
216  TimerMessage( TimerMessage&& ) noexcept = default;
217  TimerMessage& operator=(TimerMessage&& ) noexcept = default;
218  TimerMessage( const TimerMessage& ) noexcept = default;
219  TimerMessage& operator=( const TimerMessage& ) noexcept = default;
220 
221  TimerMessage();
222  TimerMessage(uniset::TimerId id, Priority prior = Message::High,
224  TimerMessage(const VoidMessage* msg) noexcept ;
225  inline TransportMessage transport_msg() const noexcept
226  {
227  return transport(*this);
228  }
229 
231  };
232 
233  // ------------------------------------------------------------------------
234 
236  class ConfirmMessage: public Message
237  {
238  public:
239 
240  inline TransportMessage transport_msg() const noexcept
241  {
242  return transport(*this);
243  }
244 
245  ConfirmMessage( const VoidMessage* msg ) noexcept;
246 
247  ConfirmMessage(ObjectId in_sensor_id,
248  const double& in_sensor_value,
249  const timespec& in_sensor_time,
250  const timespec& in_confirm_time,
251  Priority in_priority = Message::Medium) noexcept;
252 
253  ConfirmMessage( ConfirmMessage&& ) noexcept = default;
254  ConfirmMessage& operator=(ConfirmMessage&& ) noexcept = default;
255  ConfirmMessage( const ConfirmMessage& ) noexcept = default;
256  ConfirmMessage& operator=( const ConfirmMessage& ) noexcept = default;
257 
258  ObjectId sensor_id = { uniset::DefaultObjectId }; /* ID датчика (события) */
259  double sensor_value = { 0.0 }; /* значение датчика (события) */
260  struct timespec sensor_time = { 0, 0 }; /* время срабатывания датчика (события), который квитируем */
261  struct timespec confirm_time = { 0, 0 }; /* * время прошедшее до момента квитирования */
262 
263  bool broadcast = { false };
264 
270  bool forward = { false };
271 
272  protected:
273  ConfirmMessage() noexcept;
274  };
275 
276  // ------------------------------------------------------------------------
277 
279  class TextMessage : public VoidMessage
280  {
281  public:
282  TextMessage( TextMessage&& ) noexcept = default;
283  TextMessage& operator=(TextMessage&& ) = default;
284  TextMessage( const TextMessage& ) = default;
285  TextMessage& operator=( const TextMessage& ) = default;
286 
287  TextMessage() noexcept;
288  TextMessage( const VoidMessage* msg ) noexcept;
289  TextMessage( const char* msg,
290  int mtype,
291  const ::uniset::Timespec& tm,
292  const ::uniset::ProducerInfo& pi,
293  Priority prior = Message::Medium,
294  ObjectId cons = uniset::DefaultObjectId ) noexcept;
295 
296  std::shared_ptr<VoidMessage> toLocalVoidMessage() const;
297 
298  std::string txt;
299  int mtype;
300  };
301 
302 }
303 // --------------------------------------------------------------------------
304 #endif // MessageType_H_
Definition: MessageType.h:237
bool forward
Definition: MessageType.h:270
Definition: MessageType.h:36
Definition: MessageType.h:127
bool threshold
Definition: MessageType.h:141
Definition: MessageType.h:171
Command
Definition: MessageType.h:174
@ ReConfiguration
Definition: MessageType.h:180
@ FoldUp
Definition: MessageType.h:177
@ Finish
Definition: MessageType.h:178
@ NetworkInfo
Definition: MessageType.h:181
@ LogRotate
Definition: MessageType.h:186
@ TheLastFieldOfCommand
Definition: MessageType.h:187
@ WatchDog
Definition: MessageType.h:179
Definition: MessageType.h:280
Definition: MessageType.h:214
uniset::TimerId id
Definition: MessageType.h:230
Definition: MessageType.h:91
Базовый интерфейс для создания координаторов ввода/вывода
Definition: IOController_i.idl:34
Definition: CommonEventLoop.h:15
ByteOfMessage RawDataOfTransportMessage[SizeOfTransportMessage]
Definition: UniSetTypes_i.idl:36
long ThresholdId
Definition: UniSetTypes_i.idl:31
const ThresholdId DefaultThresholdId
Definition: UniSetTypes.h:71
const ObjectId DefaultObjectId
Definition: UniSetTypes.h:70
long ObjectId
Definition: UniSetTypes_i.idl:30
octet ByteOfMessage
Definition: UniSetTypes_i.idl:35
long TimerId
Definition: UniSetTypes_i.idl:32
Definition: IOController_i.idl:83
Definition: UniSetTypes_i.idl:45