UniSet  2.7.0
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 <string>
28 #include <ostream>
29 #include "UniSetTypes.h"
30 #include "IOController_i.hh"
31 // --------------------------------------------------------------------------
32 namespace uniset
33 {
34  class Message
35  {
36  public:
37  enum TypeOfMessage
38  {
39  Unused, // Сообщение не содержит информации
40  SensorInfo,
41  SysCommand, // Сообщение содержит системную команду
42  Confirm, // Сообщение содержит подтверждение
43  Timer, // Сообщения о срабатывании таймера
44  TheLastFieldOfTypeOfMessage // Обязательно оставьте последним
45  };
46 
47  int type = { Unused }; // Содержание сообщения (тип)
48 
49  enum Priority
50  {
51  Low,
52  Medium,
53  High
54  };
55 
56  Priority priority = { Medium };
57  ObjectId node = { uniset::DefaultObjectId }; // откуда
58  ObjectId supplier = { uniset::DefaultObjectId }; // от кого
59  ObjectId consumer = { uniset::DefaultObjectId }; // кому
60  struct timespec tm = { 0, 0 };
61 
62  Message( Message&& ) noexcept = default;
63  Message& operator=(Message&& ) noexcept = default;
64  Message( const Message& ) noexcept = default;
65  Message& operator=(const Message& ) noexcept = default;
66 
67  Message() noexcept;
68 
69  // для оптимизации, делаем конструктор который не будет инициализировать свойства класса
70  // это необходимо для VoidMessage, который конструируется при помощи memcpy
71  explicit Message( int dummy_init ) noexcept {}
72 
73  template<class In>
74  static const TransportMessage transport(const In& msg) noexcept
75  {
76  TransportMessage tmsg;
77  assert(sizeof(uniset::RawDataOfTransportMessage) >= sizeof(msg));
78  std::memcpy(&tmsg.data, &msg, sizeof(msg));
79  tmsg.consumer = msg.consumer;
80  return tmsg;
81  }
82  };
83 
84  std::string strTypeOfMessage( int type );
85  std::ostream& operator<<( std::ostream& os, const Message::TypeOfMessage& t );
86 
87  // ------------------------------------------------------------------------
88  class VoidMessage : public Message
89  {
90  public:
91 
92  VoidMessage( VoidMessage&& ) noexcept = default;
93  VoidMessage& operator=(VoidMessage&& ) noexcept = default;
94  VoidMessage( const VoidMessage& ) noexcept = default;
95  VoidMessage& operator=( const VoidMessage& ) noexcept = default;
96 
97  // для оптимизации, делаем конструктор который не будет инициализировать свойства класса
98  // это необходимо для VoidMessage, который конструируется при помощи memcpy
99  VoidMessage( int dummy ) noexcept : Message(dummy) {}
100 
101  VoidMessage( const TransportMessage& tm ) noexcept;
102  VoidMessage() noexcept;
103  inline bool operator < ( const VoidMessage& msg ) const
104  {
105  if( priority != msg.priority )
106  return priority < msg.priority;
107 
108  if( tm.tv_sec != msg.tm.tv_sec )
109  return tm.tv_sec >= msg.tm.tv_sec;
110 
111  return tm.tv_nsec >= msg.tm.tv_nsec;
112  }
113 
114  inline TransportMessage transport_msg() const noexcept
115  {
116  return transport(*this);
117  }
118 
120  };
121 
122  // ------------------------------------------------------------------------
124  class SensorMessage : public Message
125  {
126  public:
127 
129  long value = { 0 };
130  bool undefined = { false };
131 
132  // время изменения состояния датчика
133  struct timespec sm_tv = { 0, 0 };
134 
135  UniversalIO::IOType sensor_type = { UniversalIO::DI };
137 
138  // для пороговых датчиков
139  bool threshold = { false };
141 
142  SensorMessage( SensorMessage&& m) noexcept = default;
143  SensorMessage& operator=(SensorMessage&& m) noexcept = default;
144  SensorMessage( const SensorMessage& ) noexcept = default;
145  SensorMessage& operator=( const SensorMessage& ) noexcept = default;
146 
147  SensorMessage() noexcept;
149  Priority priority = Message::Medium,
150  UniversalIO::IOType st = UniversalIO::AI,
151  ObjectId consumer = uniset::DefaultObjectId) noexcept;
152 
153  // специальный конструктор, для оптимизации
154  // он не инициализирует поля по умолчанию
155  // и за инициализацию значений отвечает "пользователь"
156  // например см. IONotifyController::localSetValue()
157  explicit SensorMessage( int dummy ) noexcept;
158 
159  SensorMessage(const VoidMessage* msg) noexcept;
160  inline TransportMessage transport_msg() const noexcept
161  {
162  return transport(*this);
163  }
164  };
165 
166  // ------------------------------------------------------------------------
168  class SystemMessage : public Message
169  {
170  public:
171  enum Command
172  {
173  Unknown,
174  StartUp,
185  TheLastFieldOfCommand
186  };
187 
188  SystemMessage( SystemMessage&& ) noexcept = default;
189  SystemMessage& operator=(SystemMessage&& ) noexcept = default;
190  SystemMessage( const SystemMessage& ) noexcept = default;
191  SystemMessage& operator=( const SystemMessage& ) noexcept = default;
192 
193  SystemMessage() noexcept;
194  SystemMessage(Command command, Priority priority = Message::High,
195  ObjectId consumer = uniset::DefaultObjectId) noexcept;
196  SystemMessage(const VoidMessage* msg) noexcept;
197 
198  inline TransportMessage transport_msg() const noexcept
199  {
200  return transport(*this);
201  }
202 
203  int command = { 0 };
204  long data[2];
205  };
206  std::ostream& operator<<( std::ostream& os, const SystemMessage::Command& c );
207 
208  // ------------------------------------------------------------------------
209 
211  class TimerMessage : public Message
212  {
213  public:
214  TimerMessage( TimerMessage&& ) noexcept = default;
215  TimerMessage& operator=(TimerMessage&& ) noexcept = default;
216  TimerMessage( const TimerMessage& ) noexcept = default;
217  TimerMessage& operator=( const TimerMessage& ) noexcept = default;
218 
219  TimerMessage();
220  TimerMessage(uniset::TimerId id, Priority prior = Message::High,
222  TimerMessage(const VoidMessage* msg) noexcept ;
223  inline TransportMessage transport_msg() const noexcept
224  {
225  return transport(*this);
226  }
227 
229  };
230 
231  // ------------------------------------------------------------------------
232 
234  class ConfirmMessage: public Message
235  {
236  public:
237 
238  inline TransportMessage transport_msg() const noexcept
239  {
240  return transport(*this);
241  }
242 
243  ConfirmMessage( const VoidMessage* msg ) noexcept;
244 
245  ConfirmMessage(ObjectId in_sensor_id,
246  const double& in_sensor_value,
247  const timespec& in_sensor_time,
248  const timespec& in_confirm_time,
249  Priority in_priority = Message::Medium) noexcept;
250 
251  ConfirmMessage( ConfirmMessage&& ) noexcept = default;
252  ConfirmMessage& operator=(ConfirmMessage&& ) noexcept = default;
253  ConfirmMessage( const ConfirmMessage& ) noexcept = default;
254  ConfirmMessage& operator=( const ConfirmMessage& ) noexcept = default;
255 
256  ObjectId sensor_id = { uniset::DefaultObjectId }; /* ID датчика (события) */
257  double sensor_value = { 0.0 }; /* значение датчика (события) */
258  struct timespec sensor_time = { 0, 0 }; /* время срабатывания датчика(события), который квитируем */
259  struct timespec confirm_time = { 0, 0 }; /* * время прошедшее до момента квитирования */
260 
261  bool broadcast = { false };
262 
268  bool forward = { false };
269 
270  protected:
271  ConfirmMessage() noexcept;
272  };
273 
274 }
275 // --------------------------------------------------------------------------
276 #endif // MessageType_H_
Definition: MessageType.h:175
Definition: MessageType.h:178
Definition: CallbackTimer.h:29
long ThresholdId
Definition: UniSetTypes_i.idl:31
Definition: MessageType.h:168
Definition: MessageType.h:179
Definition: MessageType.h:234
Definition: MessageType.h:184
const ObjectId DefaultObjectId
Definition: UniSetTypes.h:69
Definition: MessageType.h:176
const ThresholdId DefaultThresholdId
Definition: UniSetTypes.h:70
long TimerId
Definition: UniSetTypes_i.idl:32
Definition: MessageType.h:124
Definition: UniSetTypes_i.idl:44
Definition: MessageType.h:88
uniset::TimerId id
Definition: MessageType.h:228
Definition: MessageType.h:177
Definition: IOController_i.idl:78
Command
Definition: MessageType.h:171
ByteOfMessage RawDataOfTransportMessage[SizeOfTransportMessage]
Definition: UniSetTypes_i.idl:36
Definition: MessageType.h:211
octet ByteOfMessage
Definition: UniSetTypes_i.idl:35
Definition: MessageType.h:34
long ObjectId
Definition: UniSetTypes_i.idl:30