UniSet 2.32.1
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// --------------------------------------------------------------------------
33namespace 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 {
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:
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(uniset::TimerId id, timeout_t interval_msec, Priority prior = Message::High,
226 TimerMessage(const VoidMessage* msg) noexcept ;
227 inline TransportMessage transport_msg() const noexcept
228 {
229 return transport(*this);
230 }
231
233 uniset::timeout_t interval_msec;
234 };
235
236 // ------------------------------------------------------------------------
237
240 {
241 public:
242
243 inline TransportMessage transport_msg() const noexcept
244 {
245 return transport(*this);
246 }
247
248 ConfirmMessage( const VoidMessage* msg ) noexcept;
249
250 ConfirmMessage(ObjectId in_sensor_id,
251 const double& in_sensor_value,
252 const timespec& in_sensor_time,
253 const timespec& in_confirm_time,
254 Priority in_priority = Message::Medium) noexcept;
255
256 ConfirmMessage( ConfirmMessage&& ) noexcept = default;
257 ConfirmMessage& operator=(ConfirmMessage&& ) noexcept = default;
258 ConfirmMessage( const ConfirmMessage& ) noexcept = default;
259 ConfirmMessage& operator=( const ConfirmMessage& ) noexcept = default;
260
261 ObjectId sensor_id = { uniset::DefaultObjectId }; /* ID датчика (события) */
262 double sensor_value = { 0.0 }; /* значение датчика (события) */
263 struct timespec sensor_time = { 0, 0 }; /* время срабатывания датчика (события), который квитируем */
264 struct timespec confirm_time = { 0, 0 }; /* * время прошедшее до момента квитирования */
265
266 bool broadcast = { false };
267
273 bool forward = { false };
274
275 protected:
276 ConfirmMessage() noexcept;
277 };
278
279 // ------------------------------------------------------------------------
280
283 {
284 public:
285 TextMessage( TextMessage&& ) noexcept = default;
286 TextMessage& operator=(TextMessage&& ) = default;
287 TextMessage( const TextMessage& ) = default;
288 TextMessage& operator=( const TextMessage& ) = default;
289
290 TextMessage() noexcept;
291 TextMessage( const VoidMessage* msg ) noexcept;
292 TextMessage( const char* msg,
293 int mtype,
294 const ::uniset::Timespec& tm,
295 const ::uniset::ProducerInfo& pi,
296 Priority prior = Message::Medium,
297 ObjectId cons = uniset::DefaultObjectId ) noexcept;
298
299 std::shared_ptr<VoidMessage> toLocalVoidMessage() const;
300
301 std::string txt;
302 int mtype;
303 };
304
305}
306// --------------------------------------------------------------------------
307#endif // MessageType_H_
Definition MessageType.h:240
bool forward
Definition MessageType.h:273
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:283
Definition MessageType.h:214
uniset::TimerId id
Definition MessageType.h:232
Definition MessageType.h:91
Базовый интерфейс для создания координаторов ввода/вывода
Definition IOController_i.idl:34
Definition Calibration.h:27
ByteOfMessage RawDataOfTransportMessage[SizeOfTransportMessage]
Definition UniSetTypes_i.idl:36
long ThresholdId
Definition UniSetTypes_i.idl:31
const ThresholdId DefaultThresholdId
Definition UniSetTypes.h:72
const ObjectId DefaultObjectId
Definition UniSetTypes.h:71
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