UniSet  2.8.0
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 // -----------------------------------------------------------------------------------------
40 namespace uniset
41 {
42 
52  class UInterface
53  {
54  public:
55 
56  UInterface( const uniset::ObjectId backid, CORBA::ORB_var orb = NULL, const std::shared_ptr<uniset::ObjectIndex> oind = nullptr );
57  UInterface( const std::shared_ptr<uniset::Configuration>& uconf = uniset::uniset_conf() );
58  ~UInterface();
59 
60  // ---------------------------------------------------------------
61  // Работа с датчиками
62 
64  long getValue (const uniset::ObjectId id, const uniset::ObjectId node) const;
65  long getValue ( const uniset::ObjectId id ) const;
66  long getRawValue( const IOController_i::SensorInfo& si );
67 
69  void setValue ( const uniset::ObjectId id, long value, const uniset::ObjectId node, uniset::ObjectId sup_id = uniset::DefaultObjectId ) const;
70  void setValue ( const uniset::ObjectId id, long value ) const;
71  void setValue ( const IOController_i::SensorInfo& si, long value, const uniset::ObjectId supplier ) const;
72 
73  // fast - это удалённый вызов "без подтверждения", он быстрее, но менее надёжен
74  // т.к. вызывающий никогда не узнает об ошибке, если она была (датчик такой не найден и т.п.)
75  void fastSetValue( const IOController_i::SensorInfo& si, long value, uniset::ObjectId supplier ) const;
76 
78  IOController_i::SensorInfoSeq_var getSensorSeq( const uniset::IDList& lst );
79 
82  uniset::IDSeq_var setOutputSeq( const IOController_i::OutSeq& lst, uniset::ObjectId sup_id );
83 
84  // ---------------------------------------------------------------
85  // Заказ датчиков
86 
88  void askSensor( const uniset::ObjectId id, UniversalIO::UIOCommand cmd,
90 
91  void askRemoteSensor( const uniset::ObjectId id, UniversalIO::UIOCommand cmd, const uniset::ObjectId node,
93 
95  uniset::IDSeq_var askSensorsSeq( const uniset::IDList& lst, UniversalIO::UIOCommand cmd,
97  // ------------------------------------------------------
98 
99  // установка неопределённого состояния
100  void setUndefinedState( const IOController_i::SensorInfo& si, bool undefined, uniset::ObjectId supplier );
101 
102  // ---------------------------------------------------------------
103  // Калибровка... пороги...
104 
106  void calibrate(const IOController_i::SensorInfo& si,
109 
110  IOController_i::CalibrateInfo getCalibrateInfo( const IOController_i::SensorInfo& si );
111 
113  void askThreshold( const uniset::ObjectId sensorId, const uniset::ThresholdId tid,
114  UniversalIO::UIOCommand cmd,
115  long lowLimit, long hiLimit, bool invert = false,
116  uniset::ObjectId backid = uniset::DefaultObjectId ) const;
117 
118  void askRemoteThreshold( const uniset::ObjectId sensorId, const uniset::ObjectId node,
119  const uniset::ThresholdId thresholdId, UniversalIO::UIOCommand cmd,
120  long lowLimit, long hiLimit, bool invert = false,
121  uniset::ObjectId backid = uniset::DefaultObjectId ) const;
122 
123  IONotifyController_i::ThresholdInfo getThresholdInfo( const IOController_i::SensorInfo& si, const uniset::ThresholdId tid ) const;
124  IONotifyController_i::ThresholdInfo getThresholdInfo( const uniset::ObjectId sid, const uniset::ThresholdId tid ) const;
125 
126  // ---------------------------------------------------------------
127  // Вспомогательные функции
128 
129  UniversalIO::IOType getIOType(const uniset::ObjectId id, uniset::ObjectId node) const;
130  UniversalIO::IOType getIOType(const uniset::ObjectId id) const;
131 
132  // read from xml (only for xml!) т.е. без удалённого запроса
133  UniversalIO::IOType getConfIOType( const uniset::ObjectId id ) const noexcept;
134 
135  // Получение типа объекта..
136  uniset::ObjectType getType(const uniset::ObjectId id, const uniset::ObjectId node) const;
138 
141 
143  std::string getObjectInfo( const uniset::ObjectId id, const std::string& params, const uniset::ObjectId node ) const;
144  std::string apiRequest( const uniset::ObjectId id, const std::string& query, const uniset::ObjectId node ) const;
145 
147  IOController_i::ShortMapSeq* getSensors( const uniset::ObjectId id,
148  const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() );
149 
150  IOController_i::SensorInfoSeq* getSensorsMap( const uniset::ObjectId id,
151  const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() );
152 
153  IONotifyController_i::ThresholdsListSeq* getThresholdsList( const uniset::ObjectId id,
154  const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() );
155  // ---------------------------------------------------------------
156  // Работа с репозиторием
157 
161  void registered(const uniset::ObjectId id, const uniset::ObjectPtr oRef, bool force = false) const;
162 
163  // throw(uniset::ORepFailed)
164  void unregister(const uniset::ObjectId id);
165 
167  inline uniset::ObjectPtr resolve( const std::string& name ) const
168  {
169  return rep.resolve(name);
170  }
171 
172  inline uniset::ObjectPtr resolve( const uniset::ObjectId id ) const
173  {
174  return rep.resolve( oind->getNameById(id) );
175  }
176 
177  // throw(uniset::ResolveNameError, uniset::TimeOut);
178  uniset::ObjectPtr resolve(const uniset::ObjectId id, const uniset::ObjectId nodeName) const;
179 
180  // Проверка доступности объекта или датчика
181  bool isExist( const uniset::ObjectId id ) const noexcept;
182  bool isExist( const uniset::ObjectId id, const uniset::ObjectId node ) const noexcept;
183 
185  bool waitReady( const uniset::ObjectId id, int msec, int pause = 5000,
186  const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() ) noexcept;
187 
189  bool waitWorking( const uniset::ObjectId id, int msec, int pause = 3000,
190  const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() ) noexcept;
191 
192  bool waitReadyWithCancellation( const uniset::ObjectId id, int msec, std::atomic_bool& cancelFlag, int pause = 5000,
193  const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode() ) noexcept;
194 
195  // ---------------------------------------------------------------
196  // Работа с ID, Name
197 
199  inline uniset::ObjectId getIdByName( const std::string& name ) const noexcept
200  {
201  return oind->getIdByName(name);
202  }
203 
205  inline std::string getNameById( const uniset::ObjectId id ) const noexcept
206  {
207  return oind->getNameById(id);
208  }
209 
210  inline uniset::ObjectId getNodeId( const std::string& fullname ) const noexcept
211  {
212  return oind->getNodeId(fullname);
213  }
214 
215  inline std::string getTextName( const uniset::ObjectId id ) const noexcept
216  {
217  return oind->getTextName(id);
218  }
219 
220  // ---------------------------------------------------------------
221  // Получение указателей на вспомогательные классы.
222  inline const std::shared_ptr<uniset::ObjectIndex> getObjectIndex() noexcept
223  {
224  return oind;
225  }
226  inline const std::shared_ptr<uniset::Configuration> getConf() noexcept
227  {
228  return uconf;
229  }
230  // ---------------------------------------------------------------
231  // Посылка сообщений
232 
234  void send( const uniset::ObjectId name, const uniset::TransportMessage& msg, uniset::ObjectId node );
235  void send( const uniset::ObjectId name, const uniset::TransportMessage& msg);
236  void sendText(const uniset::ObjectId name, const std::string& text, int mtype, const uniset::ObjectId node = uniset::DefaultObjectId );
237  void sendText(const uniset::ObjectId name, const uniset::TextMessage& msg, const uniset::ObjectId node = uniset::DefaultObjectId );
238 
239  // ---------------------------------------------------------------
240  // Вспомогательный класс для кэширования ссылок на удалённые объекты
241 
242  inline void setCacheMaxSize( size_t newsize ) noexcept
243  {
244  rcache.setMaxSize(newsize);
245  }
246 
249  {
250  public:
251  CacheOfResolve( size_t maxsize, size_t cleancount = 20 ):
252  MaxSize(maxsize), minCallCount(cleancount) {};
253  ~CacheOfResolve() {};
254 
255  // throw(uniset::NameNotFound, uniset::SystemError)
256  uniset::ObjectPtr resolve( const uniset::ObjectId id, const uniset::ObjectId node ) const;
257 
258  void cache(const uniset::ObjectId id, const uniset::ObjectId node, uniset::ObjectVar& ptr ) const;
259  void erase( const uniset::ObjectId id, const uniset::ObjectId node ) const noexcept;
260 
261  inline void setMaxSize( size_t ms ) noexcept
262  {
263  MaxSize = ms;
264  };
265 
266  protected:
267  CacheOfResolve() {};
268 
269  private:
270 
271  bool clean() noexcept;
272  inline void clear() noexcept
273  {
275  mcache.clear();
276  };
277 
278  struct Item
279  {
280  Item( const uniset::ObjectVar& ptr ): ptr(ptr), ncall(0) {}
281  Item(): ptr(NULL), ncall(0) {}
282 
283  uniset::ObjectVar ptr;
284  size_t ncall; // счётчик обращений
285 
286  bool operator<( const CacheOfResolve::Item& rhs ) const
287  {
288  return this->ncall > rhs.ncall;
289  }
290  };
291 
292  typedef std::unordered_map<uniset::KeyType, Item> CacheMap;
293  mutable CacheMap mcache;
294  mutable uniset::uniset_rwmutex cmutex;
295  size_t MaxSize = { 20 };
296  size_t minCallCount = { 20 };
297  };
298 
299  void initBackId( uniset::ObjectId backid );
300 
301  protected:
302  std::string set_err(const std::string& pre, const uniset::ObjectId id, const uniset::ObjectId node) const;
303 
304  private:
305  void init();
306 
307  ObjectRepository rep;
308  uniset::ObjectId myid;
309  mutable CosNaming::NamingContext_var localctx;
310  mutable CORBA::ORB_var orb;
311  CacheOfResolve rcache;
312  std::shared_ptr<uniset::ObjectIndex> oind;
313  std::shared_ptr<uniset::Configuration> uconf;
314  };
315  // -------------------------------------------------------------------------
316 } // end of uniset namespace
317 // --------------------------------------------------------------------------
318 #endif
319 // --------------------------------------------------------------------------
void setValue(const uniset::ObjectId id, long value, const uniset::ObjectId node, uniset::ObjectId sup_id=uniset::DefaultObjectId) const
Выставление состояния датчика
Definition: UInterface.cc:286
Definition: CommonEventLoop.h:14
void registered(const uniset::ObjectId id, const uniset::ObjectPtr oRef, bool force=false) const
Definition: UInterface.cc:759
std::string getObjectInfo(const uniset::ObjectId id, const std::string &params, const uniset::ObjectId node) const
Информация об объекте
Definition: UInterface.cc:1251
uniset::ObjectType getType(const uniset::ObjectId id, const uniset::ObjectId node) const
Definition: UInterface.cc:671
Definition: IOController_i.idl:204
long ThresholdId
Definition: UniSetTypes_i.idl:31
IOController_i::SensorInfoSeq_var getSensorSeq(const uniset::IDList &lst)
Получение состояния для списка указанных датчиков
Definition: UInterface.cc:2022
void calibrate(const IOController_i::SensorInfo &si, const IOController_i::CalibrateInfo &ci, uniset::ObjectId adminId=uniset::DefaultObjectId)
калибровка
Definition: UInterface.cc:1851
Definition: UInterface.h:52
std::shared_ptr< Configuration > uniset_conf() noexcept
Definition: Configuration.cc:91
const ObjectId DefaultObjectId
Definition: UniSetTypes.h:69
uniset::ObjectPtr resolve(const std::string &name) const
Definition: UInterface.h:167
CORBA::Object_ptr ObjectPtr
Definition: UniSetTypes.h:87
Definition: Mutex.h:72
Definition: IOController_i.idl:138
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:2521
Definition: UniSetTypes_i.idl:44
Definition: MessageType.h:279
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:2515
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:1575
Definition: UniSetTypes.h:109
Definition: Mutex.h:31
IOController_i::ShortMapSeq * getSensors(const uniset::ObjectId id, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode())
Получить список датчиков
Definition: UInterface.cc:2274
Definition: IOController_i.idl:79
UniversalIO::IOType getIOType(const uniset::ObjectId id, uniset::ObjectId node) const
Definition: UInterface.cc:581
CORBA::Object_var ObjectVar
Definition: UniSetTypes.h:88
void send(const uniset::ObjectId name, const uniset::TransportMessage &msg, uniset::ObjectId node)
Definition: UInterface.cc:947
uniset::IDSeq_var askSensorsSeq(const uniset::IDList &lst, UniversalIO::UIOCommand cmd, uniset::ObjectId backid=uniset::DefaultObjectId)
Заказ по списку
Definition: UInterface.cc:2182
Definition: IOController_i.idl:57
uniset::IDSeq_var setOutputSeq(const IOController_i::OutSeq &lst, uniset::ObjectId sup_id)
Definition: UInterface.cc:2104
string< SizeOfObjectType > ObjectType
Definition: UniSetTypes_i.idl:33
Definition: UInterface.h:248
void askRemoteSensor(const uniset::ObjectId id, UniversalIO::UIOCommand cmd, const uniset::ObjectId node, uniset::ObjectId backid=uniset::DefaultObjectId) const
Definition: UInterface.cc:477
void askSensor(const uniset::ObjectId id, UniversalIO::UIOCommand cmd, uniset::ObjectId backid=uniset::DefaultObjectId) const
Универсальный заказ информации об изменении датчика
Definition: UInterface.cc:571
long getValue(const uniset::ObjectId id, const uniset::ObjectId node) const
Получение состояния датчика
Definition: UInterface.cc:117
IOController_i::ShortIOInfo getTimeChange(const uniset::ObjectId id, const uniset::ObjectId node) const
Время последнего изменения датчика
Definition: UInterface.cc:1170
long ObjectId
Definition: UniSetTypes_i.idl:30
Definition: ObjectRepository.h:45
uniset::ObjectPtr resolve(const std::string &name, const std::string &NSName="NameService") const
Definition: ObjectRepository.cc:250
std::string getNameById(const uniset::ObjectId id) const noexcept
Definition: UInterface.h:205
uniset::ObjectId getIdByName(const std::string &name) const noexcept
Definition: UInterface.h:199