UniSet @VERSION@
UInterface.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 UInterface_H_
23#define UInterface_H_
24// ---------------------------------------------------------------------------
25#include <memory>
26#include <string>
27#include <atomic>
28#include <sstream>
29#include <unordered_map>
30#include <functional>
31#include <omniORB4/CORBA.h>
32#include "Exceptions.h"
33#include "UniSetTypes.h"
34#include "ObjectIndex.h"
35#include "ObjectRepository.h"
36#include "IOController_i.hh"
37#include "MessageType.h"
38#include "Configuration.h"
39#ifndef DISABLE_REST_API
40#include "UHttpClient.h"
41#endif
42// -----------------------------------------------------------------------------------------
43namespace uniset
44{
55 {
56 public:
57
58 UInterface( const uniset::ObjectId backid, CORBA::ORB_var orb = NULL, const std::shared_ptr<uniset::ObjectIndex> oind = nullptr );
59 UInterface( const std::shared_ptr<uniset::Configuration>& uconf = uniset::uniset_conf() );
61
62 // ---------------------------------------------------------------
63 // Работа с датчиками
64
66 long getValue (const uniset::ObjectId id, const uniset::ObjectId node) const;
67 long getValue ( const uniset::ObjectId id ) const;
68 long getRawValue( const IOController_i::SensorInfo& si );
69
71 void setValue ( const uniset::ObjectId id, long value, const uniset::ObjectId node, uniset::ObjectId sup_id = uniset::DefaultObjectId ) const;
72 void setValue ( const uniset::ObjectId id, long value ) const;
73 void setValue ( const IOController_i::SensorInfo& si, long value, const uniset::ObjectId supplier ) const;
74
75 // fast - это удалённый вызов "без подтверждения", он быстрее, но менее надёжен
76 // т.к. вызывающий никогда не узнает об ошибке, если она была (датчик такой не найден и т.п.)
77 void fastSetValue( const IOController_i::SensorInfo& si, long value, uniset::ObjectId supplier ) const;
78
80 IOController_i::SensorInfoSeq_var getSensorSeq( const uniset::IDList& lst );
81
84
87 uniset::IDSeq_var setOutputSeq( const IOController_i::OutSeq& lst, uniset::ObjectId sup_id );
88
89 // ---------------------------------------------------------------
90 // Заказ датчиков
91
93 void askSensor( const uniset::ObjectId id, UniversalIO::UIOCommand cmd,
95
96 void askRemoteSensor( const uniset::ObjectId id, UniversalIO::UIOCommand cmd, const uniset::ObjectId node,
98
100 uniset::IDSeq_var askSensorsSeq( const uniset::IDList& lst, UniversalIO::UIOCommand cmd,
102 // ------------------------------------------------------
103
104 // установка неопределённого состояния
105 void setUndefinedState( const IOController_i::SensorInfo& si, bool undefined, uniset::ObjectId supplier );
106
107 // заморозка значения (выставить указанный value и не менять)
108 void freezeValue( const IOController_i::SensorInfo& si, bool set, long value, uniset::ObjectId supplier = uniset::DefaultObjectId );
109 // ---------------------------------------------------------------
110 // Калибровка... пороги...
111
116
117 IOController_i::CalibrateInfo getCalibrateInfo( const IOController_i::SensorInfo& si );
118
120 void askThreshold( const uniset::ObjectId sensorId, const uniset::ThresholdId tid,
121 UniversalIO::UIOCommand cmd,
122 long lowLimit, long hiLimit, bool invert = false,
124
125 void askRemoteThreshold( const uniset::ObjectId sensorId, const uniset::ObjectId node,
126 const uniset::ThresholdId thresholdId, UniversalIO::UIOCommand cmd,
127 long lowLimit, long hiLimit, bool invert = false,
129
130 IONotifyController_i::ThresholdInfo getThresholdInfo( const IOController_i::SensorInfo& si, const uniset::ThresholdId tid ) const;
131 IONotifyController_i::ThresholdInfo getThresholdInfo( const uniset::ObjectId sid, const uniset::ThresholdId tid ) const;
132
133 // ---------------------------------------------------------------
134 // Вспомогательные функции
135
136 UniversalIO::IOType getIOType(const uniset::ObjectId id, uniset::ObjectId node) const;
137 UniversalIO::IOType getIOType(const uniset::ObjectId id) const;
138
139 // read from xml (only for xml!) т.е. без удалённого запроса
140 UniversalIO::IOType getConfIOType( const uniset::ObjectId id ) const noexcept;
141
142 // Получение типа объекта..
145
148
150 std::string getObjectInfo( const uniset::ObjectId id, const std::string& params, const uniset::ObjectId node ) const;
151 std::string apiRequest( const uniset::ObjectId id, const std::string& query, const uniset::ObjectId node ) const;
152
154 IOController_i::ShortMapSeq* getSensors( const uniset::ObjectId id,
155 const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() );
156
157 IOController_i::SensorInfoSeq* getSensorsMap( const uniset::ObjectId id,
158 const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() );
159
160 IONotifyController_i::ThresholdsListSeq* getThresholdsList( const uniset::ObjectId id,
161 const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() );
162 // ---------------------------------------------------------------
163 // Работа с репозиторием
164
168 void registered(const uniset::ObjectId id, const uniset::ObjectPtr oRef, bool force = false) const;
169
170 // throw(uniset::ORepFailed)
171 void unregister(const uniset::ObjectId id);
172
173 uniset::ObjectPtr resolve( const std::string& name ) const;
174 uniset::ObjectPtr resolve( const uniset::ObjectId id ) const;
175
176 // throw(uniset::ResolveNameError, uniset::TimeOut);
177 uniset::ObjectPtr resolve(const uniset::ObjectId id, const uniset::ObjectId nodeName) const;
178
179 // Проверка доступности объекта или датчика
180 bool isExist( const uniset::ObjectId id ) const noexcept;
181 bool isExist( const uniset::ObjectId id, const uniset::ObjectId node ) const noexcept;
182
184 bool waitReady( const uniset::ObjectId id, int msec, int pause = 5000,
185 const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() ) noexcept;
186
188 bool waitWorking( const uniset::ObjectId id, int msec, int pause = 3000,
189 const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() ) noexcept;
190
191 bool waitReadyWithCancellation( const uniset::ObjectId id, int msec, std::atomic_bool& cancelFlag, int pause = 5000,
192 const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() ) noexcept;
193
194 // ---------------------------------------------------------------
195 // Работа с ID, Name
196
198 inline uniset::ObjectId getIdByName( const std::string& name ) const noexcept
199 {
200 return oind->getIdByName(name);
201 }
202
204 inline std::string getNameById( const uniset::ObjectId id ) const noexcept
205 {
206 return oind->getNameById(id);
207 }
208
209 inline uniset::ObjectId getNodeId( const std::string& fullname ) const noexcept
210 {
211 return oind->getNodeId(fullname);
212 }
213
214 inline std::string getTextName( const uniset::ObjectId id ) const noexcept
215 {
216 return oind->getTextName(id);
217 }
218
219 // ---------------------------------------------------------------
220 // Получение указателей на вспомогательные классы.
221 inline const std::shared_ptr<uniset::ObjectIndex> getObjectIndex() noexcept
222 {
223 return oind;
224 }
225 inline const std::shared_ptr<uniset::Configuration> getConf() noexcept
226 {
227 return uconf;
228 }
229 inline uniset::ObjectId getId() const noexcept
230 {
231 return myid;
232 }
233 inline void setId( uniset::ObjectId id )
234 {
235 myid = id;
236 }
237 // ---------------------------------------------------------------
238 // Посылка сообщений
239
241 void send( const uniset::ObjectId name, const uniset::TransportMessage& msg, uniset::ObjectId node );
242 void send( const uniset::ObjectId name, const uniset::TransportMessage& msg);
243 void sendText(const uniset::ObjectId name, const std::string& text, int mtype, const uniset::ObjectId node = uniset::DefaultObjectId );
244 void sendText(const uniset::ObjectId name, const uniset::TextMessage& msg, const uniset::ObjectId node = uniset::DefaultObjectId );
245
246 // ---------------------------------------------------------------
247 // Вспомогательный класс для кэширования ссылок на удалённые объекты
248
249 inline void setCacheMaxSize( size_t newsize ) noexcept
250 {
251 rcache.setMaxSize(newsize);
252 }
253
256 {
257 public:
258 CacheOfResolve( size_t maxsize, size_t cleancount = 20 ):
259 MaxSize(maxsize), minCallCount(cleancount) {};
260 ~CacheOfResolve() {};
261
262 // throw(uniset::NameNotFound, uniset::SystemError)
263 uniset::ObjectPtr resolve( const uniset::ObjectId id, const uniset::ObjectId node ) const;
264
265 void cache(const uniset::ObjectId id, const uniset::ObjectId node, uniset::ObjectVar& ptr ) const;
266 void erase( const uniset::ObjectId id, const uniset::ObjectId node ) const noexcept;
267
268 inline void setMaxSize( size_t ms ) noexcept
269 {
270 MaxSize = ms;
271 };
272
273 protected:
274 CacheOfResolve() {};
275
276 private:
277
278 bool clean() noexcept;
279 inline void clear() noexcept
280 {
282 mcache.clear();
283 };
284
285 struct Item
286 {
287 Item( const uniset::ObjectVar& ptr ): ptr(ptr), ncall(0) {}
288 Item(): ptr(NULL), ncall(0) {}
289
291 size_t ncall; // счётчик обращений
292
293 bool operator<( const CacheOfResolve::Item& rhs ) const
294 {
295 return this->ncall > rhs.ncall;
296 }
297 };
298
299 typedef std::unordered_map<uniset::KeyType, Item> CacheMap;
300 mutable CacheMap mcache;
301 mutable uniset::uniset_rwmutex cmutex;
302 size_t MaxSize = { 20 };
303 size_t minCallCount = { 20 };
304 };
305
306 void initBackId( uniset::ObjectId backid );
307
308 protected:
309 std::string set_err(const std::string& pre, const uniset::ObjectId id, const uniset::ObjectId node) const;
310 std::string httpResolve( const uniset::ObjectId id, const uniset::ObjectId node ) const;
311
312 private:
313 void init();
314
316 uniset::ObjectId myid;
317 mutable CosNaming::NamingContext_var localctx;
318 mutable CORBA::ORB_var orb;
319 CacheOfResolve rcache;
320 std::shared_ptr<uniset::ObjectIndex> oind;
321 std::shared_ptr<uniset::Configuration> uconf;
322#ifndef DISABLE_REST_API
323 mutable UHttp::UHttpClient resolver;
324#endif
325 };
326 // -------------------------------------------------------------------------
327} // end of uniset namespace
328// --------------------------------------------------------------------------
329#endif
330// --------------------------------------------------------------------------
Definition UniSetTypes.h:117
Definition ObjectRepository.h:46
Definition MessageType.h:283
Definition UHttpClient.h:32
Definition UInterface.h:256
Definition UInterface.h:55
void setValue(const uniset::ObjectId id, long value, const uniset::ObjectId node, uniset::ObjectId sup_id=uniset::DefaultObjectId) const
Выставление состояния датчика
Definition UInterface.cc:376
UniversalIO::IOType getIOType(const uniset::ObjectId id, uniset::ObjectId node) const
Definition UInterface.cc:686
IOController_i::ShortIOInfo getTimeChange(const uniset::ObjectId id, const uniset::ObjectId node) const
Время последнего изменения датчика
Definition UInterface.cc:1318
std::string getObjectInfo(const uniset::ObjectId id, const std::string &params, const uniset::ObjectId node) const
Информация об объекте
Definition UInterface.cc:1404
std::string getNameById(const uniset::ObjectId id) const noexcept
Definition UInterface.h:204
void registered(const uniset::ObjectId id, const uniset::ObjectPtr oRef, bool force=false) const
Definition UInterface.cc:874
void askRemoteSensor(const uniset::ObjectId id, UniversalIO::UIOCommand cmd, const uniset::ObjectId node, uniset::ObjectId backid=uniset::DefaultObjectId) const
Definition UInterface.cc:577
bool waitWorking(const uniset::ObjectId id, int msec, int pause=3000, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode()) noexcept
used for check 'getValue'
Definition UInterface.cc:2849
uniset::ObjectId getIdByName(const std::string &name) const noexcept
Definition UInterface.h:198
void askThreshold(const uniset::ObjectId sensorId, const uniset::ThresholdId tid, UniversalIO::UIOCommand cmd, long lowLimit, long hiLimit, bool invert=false, uniset::ObjectId backid=uniset::DefaultObjectId) const
Заказ информации об изменении порога
Definition UInterface.cc:1767
void askSensor(const uniset::ObjectId id, UniversalIO::UIOCommand cmd, uniset::ObjectId backid=uniset::DefaultObjectId) const
Универсальный заказ информации об изменении датчика
Definition UInterface.cc:676
uniset::IDSeq_var askSensorsSeq(const uniset::IDList &lst, UniversalIO::UIOCommand cmd, uniset::ObjectId backid=uniset::DefaultObjectId)
Заказ по списку
Definition UInterface.cc:2490
void send(const uniset::ObjectId name, const uniset::TransportMessage &msg, uniset::ObjectId node)
Definition UInterface.cc:1095
uniset::IDSeq_var setOutputSeq(const IOController_i::OutSeq &lst, uniset::ObjectId sup_id)
Definition UInterface.cc:2407
IOController_i::SensorInfoSeq_var getSensorSeq(const uniset::IDList &lst)
Получение состояния для списка указанных датчиков
Definition UInterface.cc:2239
long getValue(const uniset::ObjectId id, const uniset::ObjectId node) const
Получение состояния датчика
Definition UInterface.cc:117
bool waitReady(const uniset::ObjectId id, int msec, int pause=5000, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode()) noexcept
used for check 'isExist'
Definition UInterface.cc:2843
uniset::ObjectType getType(const uniset::ObjectId id, const uniset::ObjectId node) const
Definition UInterface.cc:781
void calibrate(const IOController_i::SensorInfo &si, const IOController_i::CalibrateInfo &ci, uniset::ObjectId adminId=uniset::DefaultObjectId)
калибровка
Definition UInterface.cc:2058
IOController_i::ShortMapSeq * getSensors(const uniset::ObjectId id, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode())
Получить список датчиков
Definition UInterface.cc:2587
IOController_i::SensorIOInfo getSensorIOInfo(const IOController_i::SensorInfo &si)
Получение состояния информации о датчике
Definition UInterface.cc:2326
Definition Mutex.h:73
Definition Mutex.h:32
Definition AccessConfig.h:30
CORBA::Object_ptr ObjectPtr
Definition UniSetTypes.h:94
CORBA::Object_var ObjectVar
Definition UniSetTypes.h:95
string< SizeOfObjectType > ObjectType
Definition UniSetTypes_i.idl:33
long ThresholdId
Definition UniSetTypes_i.idl:31
const ObjectId DefaultObjectId
Definition UniSetTypes.h:71
std::shared_ptr< Configuration > uniset_conf() noexcept
Definition Configuration.cc:106
long ObjectId
Definition UniSetTypes_i.idl:30
Definition IOController_i.idl:89
Definition IOController_i.idl:103
Definition IOController_i.idl:64
Definition IOController_i.idl:150
Definition IOController_i.idl:216
Definition UniSetTypes_i.idl:45