UniSet  2.7.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 
237  // ---------------------------------------------------------------
238  // Вспомогательный класс для кэширования ссылок на удалённые объекты
239 
240  inline void setCacheMaxSize( size_t newsize ) noexcept
241  {
242  rcache.setMaxSize(newsize);
243  }
244 
247  {
248  public:
249  CacheOfResolve( size_t maxsize, size_t cleancount = 20 ):
250  MaxSize(maxsize), minCallCount(cleancount) {};
251  ~CacheOfResolve() {};
252 
253  // throw(uniset::NameNotFound, uniset::SystemError)
254  uniset::ObjectPtr resolve( const uniset::ObjectId id, const uniset::ObjectId node ) const;
255 
256  void cache(const uniset::ObjectId id, const uniset::ObjectId node, uniset::ObjectVar& ptr ) const;
257  void erase( const uniset::ObjectId id, const uniset::ObjectId node ) const noexcept;
258 
259  inline void setMaxSize( size_t ms ) noexcept
260  {
261  MaxSize = ms;
262  };
263 
264  protected:
265  CacheOfResolve() {};
266 
267  private:
268 
269  bool clean() noexcept;
270  inline void clear() noexcept
271  {
273  mcache.clear();
274  };
275 
276  struct Item
277  {
278  Item( const uniset::ObjectVar& ptr ): ptr(ptr), ncall(0) {}
279  Item(): ptr(NULL), ncall(0) {}
280 
281  uniset::ObjectVar ptr;
282  size_t ncall; // счётчик обращений
283 
284  bool operator<( const CacheOfResolve::Item& rhs ) const
285  {
286  return this->ncall > rhs.ncall;
287  }
288  };
289 
290  typedef std::unordered_map<uniset::KeyType, Item> CacheMap;
291  mutable CacheMap mcache;
292  mutable uniset::uniset_rwmutex cmutex;
293  size_t MaxSize = { 20 };
294  size_t minCallCount = { 20 };
295  };
296 
297  void initBackId( uniset::ObjectId backid );
298 
299  protected:
300  std::string set_err(const std::string& pre, const uniset::ObjectId id, const uniset::ObjectId node) const;
301 
302  private:
303  void init();
304 
305  ObjectRepository rep;
306  uniset::ObjectId myid;
307  mutable CosNaming::NamingContext_var localctx;
308  mutable CORBA::ORB_var orb;
309  CacheOfResolve rcache;
310  std::shared_ptr<uniset::ObjectIndex> oind;
311  std::shared_ptr<uniset::Configuration> uconf;
312  };
313  // -------------------------------------------------------------------------
314 } // end of uniset namespace
315 // --------------------------------------------------------------------------
316 #endif
317 // --------------------------------------------------------------------------
void setValue(const uniset::ObjectId id, long value, const uniset::ObjectId node, uniset::ObjectId sup_id=uniset::DefaultObjectId) const
Выставление состояния датчика
Definition: UInterface.cc:286
Definition: CallbackTimer.h:29
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:1105
uniset::ObjectType getType(const uniset::ObjectId id, const uniset::ObjectId node) const
Definition: UInterface.cc:671
Definition: IOController_i.idl:203
long ThresholdId
Definition: UniSetTypes_i.idl:31
IOController_i::SensorInfoSeq_var getSensorSeq(const uniset::IDList &lst)
Получение состояния для списка указанных датчиков
Definition: UInterface.cc:1876
void calibrate(const IOController_i::SensorInfo &si, const IOController_i::CalibrateInfo &ci, uniset::ObjectId adminId=uniset::DefaultObjectId)
калибровка
Definition: UInterface.cc:1705
Definition: UInterface.h:52
std::shared_ptr< Configuration > uniset_conf() noexcept
Definition: Configuration.cc:90
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:96
Definition: Mutex.h:72
Definition: IOController_i.idl:137
bool waitWorking(const uniset::ObjectId id, int msec, int pause=3000, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode()) noexcept
used for check &#39;getValue&#39;
Definition: UInterface.cc:2375
Definition: UniSetTypes_i.idl:44
bool waitReady(const uniset::ObjectId id, int msec, int pause=5000, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode()) noexcept
used for check &#39;isExist&#39;
Definition: UInterface.cc:2369
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:1429
Definition: UniSetTypes.h:118
Definition: Mutex.h:31
IOController_i::ShortMapSeq * getSensors(const uniset::ObjectId id, const uniset::ObjectId node=uniset::uniset_conf() ->getLocalNode())
Получить список датчиков
Definition: UInterface.cc:2128
Definition: IOController_i.idl:78
UniversalIO::IOType getIOType(const uniset::ObjectId id, uniset::ObjectId node) const
Definition: UInterface.cc:581
CORBA::Object_var ObjectVar
Definition: UniSetTypes.h:97
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:2036
Definition: IOController_i.idl:56
uniset::IDSeq_var setOutputSeq(const IOController_i::OutSeq &lst, uniset::ObjectId sup_id)
Definition: UInterface.cc:1958
string< SizeOfObjectType > ObjectType
Definition: UniSetTypes_i.idl:33
Definition: UInterface.h:246
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:1024
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