UniSet  2.6.0
IOController.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 IOController_H_
23 #define IOController_H_
24 //---------------------------------------------------------------------------
25 #include <unordered_map>
26 #include <list>
27 #include <sigc++/sigc++.h>
28 #include "IOController_i.hh"
29 #include "UniSetTypes.h"
30 #include "UniSetManager.h"
31 #include "Configuration.h"
32 #include "Mutex.h"
33 //---------------------------------------------------------------------------
34 namespace uniset
35 {
37  class IOController:
38  public UniSetManager,
39  public POA_IOController_i
40  {
41  public:
42 
43  IOController( const std::string& name, const std::string& section );
44  IOController( const uniset::ObjectId id );
45  virtual ~IOController();
46 
47  virtual uniset::ObjectType getType() override
48  {
49  return uniset::ObjectType("IOController");
50  }
51 
52  virtual uniset::SimpleInfo* getInfo( const char* userparam = "" ) override;
53 
54  virtual CORBA::Long getValue( uniset::ObjectId sid ) override;
55 
56  // -------------------- !!!!!!!!! ---------------------------------
57  // Реализуются конкретным i/o контроллером
58  // Не забывайте писать реализацию этих функций
59  virtual void setValue( uniset::ObjectId sid, CORBA::Long value,
60  uniset::ObjectId sup_id = uniset::DefaultObjectId ) override;
61 
62  // ----------------------------------------------------------------
63  virtual void setUndefinedState( uniset::ObjectId sid,
64  CORBA::Boolean undefined,
65  uniset::ObjectId sup_id = uniset::DefaultObjectId ) override;
66 
67 
68  virtual IOController_i::SensorInfoSeq* getSensorSeq( const uniset::IDSeq& lst ) override;
69  virtual uniset::IDSeq* setOutputSeq( const IOController_i::OutSeq& lst, uniset::ObjectId sup_id ) override;
70 
71  // ----------------------------------------------------------------
72  virtual UniversalIO::IOType getIOType( uniset::ObjectId sid ) override;
73 
74  virtual IOController_i::SensorInfoSeq* getSensorsMap() override;
75  virtual IOController_i::SensorIOInfo getSensorIOInfo( uniset::ObjectId sid ) override;
76 
77  virtual CORBA::Long getRawValue( uniset::ObjectId sid ) override;
78  virtual void calibrate( uniset::ObjectId sid,
80  uniset::ObjectId adminId ) override;
81 
82  IOController_i::CalibrateInfo getCalibrateInfo( uniset::ObjectId sid ) override;
83 
84  inline IOController_i::SensorInfo SensorInfo( const uniset::ObjectId sid,
85  const uniset::ObjectId node = uniset::uniset_conf()->getLocalNode())
86  {
88  si.id = sid;
89  si.node = node;
90  return si;
91  };
92 
93  uniset::Message::Priority getPriority( const uniset::ObjectId id );
94 
95  virtual IOController_i::ShortIOInfo getTimeChange( const uniset::ObjectId id ) override;
96 
97  virtual IOController_i::ShortMapSeq* getSensors() override;
98 
99 #ifndef DISABLE_REST_API
100  // http API
101  virtual Poco::JSON::Object::Ptr httpHelp( const Poco::URI::QueryParameters& p ) override;
102  virtual Poco::JSON::Object::Ptr httpRequest( const std::string& req, const Poco::URI::QueryParameters& p ) override;
103 #endif
104 
105  public:
106 
107  // предварительное объявление..
108  struct USensorInfo;
109  typedef std::unordered_map<uniset::ObjectId, std::shared_ptr<USensorInfo>> IOStateList;
110 
111  // ================== Достпуные сигналы =================
117  typedef sigc::signal<void, std::shared_ptr<USensorInfo>&, IOController*> ChangeSignal;
118  typedef sigc::signal<void, std::shared_ptr<USensorInfo>&, IOController*> ChangeUndefinedStateSignal;
119 
120  // signal по изменению определённого датчика
121  ChangeSignal signal_change_value( uniset::ObjectId sid );
122 
123  // signal по изменению любого датчика
124  ChangeSignal signal_change_value();
125 
126  // сигналы по изменению флага "неопределённое состояние" (обрыв датчика например)
127  ChangeUndefinedStateSignal signal_change_undefined_state( uniset::ObjectId sid );
128  ChangeUndefinedStateSignal signal_change_undefined_state();
129  // -----------------------------------------------------------------------------------------
130  // полнейшее нарушение икапсуляции
131  // но пока, это попытка оптимизировать работу с IOController через указатель.
132  // Т.е. работая с датчиками через итераторы..
133  inline IOStateList::iterator ioBegin()
134  {
135  return ioList.begin();
136  }
137  inline IOStateList::iterator ioEnd()
138  {
139  return ioList.end();
140  }
141  inline IOStateList::iterator find( uniset::ObjectId k )
142  {
143  return ioList.find(k);
144  }
145  inline int ioCount() const
146  {
147  return ioList.size();
148  }
149 
150  protected:
151 
152  // доступ к элементам через итератор
153  // return итоговое значение
154  virtual long localSetValueIt( IOStateList::iterator& it, const uniset::ObjectId sid,
155  CORBA::Long value, uniset::ObjectId sup_id );
156 
157  virtual long localGetValue( IOStateList::iterator& it, const uniset::ObjectId sid );
158 
163  virtual void localSetUndefinedState( IOStateList::iterator& it, bool undefined,
164  const uniset::ObjectId sid );
165 
166  // -- работа через указатель ---
167  virtual long localSetValue( std::shared_ptr<USensorInfo>& usi, CORBA::Long value, uniset::ObjectId sup_id );
168  long localGetValue( std::shared_ptr<USensorInfo>& usi) ;
169 
170 #ifndef DISABLE_REST_API
171  // http API
172  virtual Poco::JSON::Object::Ptr request_get( const std::string& req, const Poco::URI::QueryParameters& p );
173  virtual Poco::JSON::Object::Ptr request_sensors( const std::string& req, const Poco::URI::QueryParameters& p );
174  void getSensorInfo( Poco::JSON::Array::Ptr& jdata, std::shared_ptr<USensorInfo>& s , bool shortInfo = false );
175 #endif
176 
177  // переопределяем для добавления вызова регистрации датчиков
178  virtual bool deactivateObject() override;
179  virtual bool activateObject() override;
180 
182  virtual void activateInit();
183 
185  virtual void sensorsRegistration() {};
187  virtual void sensorsUnregistration();
188 
189  typedef sigc::signal<void, std::shared_ptr<USensorInfo>&, IOController*> InitSignal;
190 
191  // signal по изменению определённого датчика
192  InitSignal signal_init();
193 
197  void ioRegistration(std::shared_ptr<USensorInfo>& usi, bool force = false );
198 
200  void ioUnRegistration( const uniset::ObjectId sid );
201 
202  // ------------------------------
204  SensorIOInfo(long v, UniversalIO::IOType t, const IOController_i::SensorInfo& si,
205  uniset::Message::Priority p = uniset::Message::Medium,
206  long defval = 0, IOController_i::CalibrateInfo* ci = 0,
208  {
210  ai.si = si;
211  ai.type = t;
212  ai.value = v;
213  ai.priority = p;
214  ai.default_val = defval;
215  ai.real_value = v;
216  ai.blocked = false;
217  ai.supplier = sup_id;
218 
219  if( ci != 0 )
220  ai.ci = *ci;
221  else
222  {
223  ai.ci.minRaw = 0;
224  ai.ci.maxRaw = 0;
225  ai.ci.minCal = 0;
226  ai.ci.maxCal = 0;
227  ai.ci.precision = 0;
228  }
229 
230  return std::move(ai);
231  };
232 
234  virtual void logging( uniset::SensorMessage& sm );
235 
237  virtual void dumpToDB();
238 
239  IOController();
240 
241  // доступ к списку c изменением только для своих
242  IOStateList::iterator myioBegin();
243  IOStateList::iterator myioEnd();
244  IOStateList::iterator myiofind( uniset::ObjectId id );
245  size_t ioCount();
246  // --------------------------
247 
248  private:
249  friend class NCRestorer;
250  friend class SMInterface;
251 
252  std::mutex siganyMutex;
253  ChangeSignal sigAnyChange;
254 
255  std::mutex siganyundefMutex;
256  ChangeSignal sigAnyUndefChange;
257  InitSignal sigInit;
258 
259  IOStateList ioList;
260  uniset::uniset_rwmutex ioMutex;
262  bool isPingDBServer; // флаг связи с DBServer-ом
263 
264  std::mutex loggingMutex;
266  public:
267  struct USensorInfo:
269  {
270  USensorInfo( const USensorInfo& ) = delete;
271  const USensorInfo& operator=(const USensorInfo& ) = delete;
272  USensorInfo( USensorInfo&& ) = default;
273  USensorInfo& operator=(USensorInfo&& ) = default;
274 
276  {
279  default_val = 0;
280  value = default_val;
282  dbignore = false;
283  undefined = false;
284  blocked = false;
286  }
287 
288  virtual ~USensorInfo() {}
289 
293 
295  const USensorInfo& operator=(const IOController_i::SensorIOInfo& r);
297 
298  // Дополнительные (вспомогательные поля)
301  static const size_t MaxUserData = 4;
302  void* userdata[MaxUserData] = { nullptr, nullptr, nullptr, nullptr };
304  // сигнал для реализации механизма зависимостией..
305  // (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals)
306  uniset::uniset_rwmutex changeMutex;
307  ChangeSignal sigChange;
308 
309  uniset::uniset_rwmutex undefMutex;
310  ChangeUndefinedStateSignal sigUndefChange;
311 
313  long d_value = { 1 };
314  long d_off_value = { 0 };
315  std::shared_ptr<USensorInfo> d_usi; // shared_ptr на датчик от которого зависит этот.
316 
317  size_t nchanges = { 0 }; // количество изменений датчика
318 
319  // функция обработки информации об изменении состояния датчика, от которого зависит данный
320  void checkDepend( std::shared_ptr<USensorInfo>& d_usi, IOController* );
321 
322  void init( const IOController_i::SensorIOInfo& s );
323 
324  inline IOController_i::SensorIOInfo makeSensorIOInfo()
325  {
326  uniset::uniset_rwmutex_rlock lock(val_lock);
328  return std::move(s);
329  }
330 
331  inline uniset::SensorMessage makeSensorMessage()
332  {
334  sm.id = si.id;
335  sm.node = si.node; // uniset_conf()->getLocalNode()?
336  sm.sensor_type = type;
337  sm.priority = (uniset::Message::Priority)priority;
338 
339  // лочим только изменяемые поля
340  {
341  uniset::uniset_rwmutex_rlock lock(val_lock);
342  sm.value = value;
343  sm.sm_tv.tv_sec = tv_sec;
344  sm.sm_tv.tv_nsec = tv_nsec;
345  sm.ci = ci;
346  sm.supplier = supplier;
347  sm.undefined = undefined;
348  }
349 
350  return std::move(sm);
351  }
352  };
353  };
354  // -------------------------------------------------------------------------
355 } // end of uniset namespace
356 // --------------------------------------------------------------------------
357 #endif
358 // --------------------------------------------------------------------------
uniset::ObjectId supplier
Definition: IOController_i.idl:105
virtual void activateInit()
Definition: IOController.cc:99
Definition: CallbackTimer.h:29
IOController_i::SensorInfo d_si
Definition: IOController.h:312
Definition: IOController_i.idl:92
short precision
Definition: IOController_i.idl:84
long default_val
Definition: IOController_i.idl:101
long minCal
Definition: IOController_i.idl:82
virtual bool deactivateObject() override
Definition: IOController.cc:72
Definition: IOController.h:267
virtual void sensorsRegistration()
Definition: IOController.h:185
uniset::uniset_rwmutex val_lock
Definition: IOController.h:299
long maxRaw
Definition: IOController_i.idl:81
UniversalIO::IOType type
Definition: IOController_i.idl:98
virtual bool activateObject() override
Definition: IOController.cc:61
boolean undefined
Definition: IOController_i.idl:95
sequence< ObjectId > IDSeq
Definition: UniSetTypes_i.idl:82
std::shared_ptr< Configuration > uniset_conf() noexcept
Definition: Configuration.cc:89
const ObjectId DefaultObjectId
Definition: UniSetTypes.h:56
void * userdata[MaxUserData]
Definition: IOController.h:302
unsigned long tv_sec
Definition: IOController_i.idl:103
uniset::ObjectId node
Definition: IOController_i.idl:59
boolean dbignore
Definition: IOController_i.idl:106
Definition: IOController_i.idl:137
long minRaw
Definition: IOController_i.idl:80
Definition: MessageType.h:122
sigc::signal< void, std::shared_ptr< USensorInfo > &, IOController * > ChangeSignal
Definition: IOController.h:117
virtual void localSetUndefinedState(IOStateList::iterator &it, bool undefined, const uniset::ObjectId sid)
Definition: IOController.cc:178
long priority
Definition: IOController_i.idl:99
boolean blocked
Definition: IOController_i.idl:96
Definition: UniSetManager.h:57
Definition: Mutex.h:32
long maxCal
Definition: IOController_i.idl:83
virtual void logging(uniset::SensorMessage &sm)
сохранение информации об изменении состояния датчика
Definition: IOController.cc:438
long d_off_value
Definition: IOController.h:314
void ioRegistration(std::shared_ptr< USensorInfo > &usi, bool force=false)
Definition: IOController.cc:367
Definition: IOController_i.idl:78
long real_value
Definition: IOController_i.idl:97
void ioUnRegistration(const uniset::ObjectId sid)
Definition: IOController.cc:433
Definition: IOController_i.idl:56
Definition: IOController.h:37
virtual void sensorsUnregistration()
Definition: IOController.cc:78
virtual void dumpToDB()
сохранение состояния всех датчиков в БД
Definition: IOController.cc:468
string< SizeOfObjectType > ObjectType
Definition: UniSetTypes_i.idl:33
CalibrateInfo ci
Definition: IOController_i.idl:102
unsigned long tv_nsec
Definition: IOController_i.idl:104
Definition: UniSetTypes_i.idl:64
Definition: Mutex.h:84
long value
Definition: IOController_i.idl:94
long ObjectId
Definition: UniSetTypes_i.idl:30
long d_value
Definition: IOController.h:313
uniset::ObjectId id
Definition: IOController_i.idl:58