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