|
UniSet
2.0.0
|
00001 /* This file is part of the UniSet project 00002 * Copyright (c) 2002 Free Software Foundation, Inc. 00003 * Copyright (c) 2002 Pavel Vainerman 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License as published by 00007 * the Free Software Foundation; either version 2 of the License, or 00008 * (at your option) any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program; if not, write to the Free Software 00017 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00018 */ 00019 // -------------------------------------------------------------------------- 00024 // -------------------------------------------------------------------------- 00025 #ifndef IOController_H_ 00026 #define IOController_H_ 00027 //--------------------------------------------------------------------------- 00028 #include <map> 00029 #include <list> 00030 #include <sigc++/sigc++.h> 00031 #include "IOController_i.hh" 00032 #include "UniSetTypes.h" 00033 #include "UniSetManager.h" 00034 #include "Configuration.h" 00035 #include "Mutex.h" 00036 //--------------------------------------------------------------------------- 00038 class IOController: 00039 public UniSetManager, 00040 public POA_IOController_i 00041 { 00042 public: 00043 00044 IOController( const std::string& name, const std::string& section ); 00045 IOController( const UniSetTypes::ObjectId id ); 00046 ~IOController(); 00047 00048 virtual UniSetTypes::ObjectType getType() override { return UniSetTypes::ObjectType("IOController"); } 00049 00050 virtual CORBA::Long getValue( UniSetTypes::ObjectId sid ) override; 00051 00052 // -------------------- !!!!!!!!! --------------------------------- 00053 // Реализуются конкретным i/o контроллером 00054 // Не забывайте писать реализацию этих функций 00055 virtual void setValue( UniSetTypes::ObjectId sid, CORBA::Long value, 00056 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ) override; 00057 00058 virtual void fastSetValue( UniSetTypes::ObjectId sid, CORBA::Long value, 00059 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ) override; 00060 00061 // ---------------------------------------------------------------- 00062 virtual void setUndefinedState( UniSetTypes::ObjectId sid, 00063 CORBA::Boolean undefined, 00064 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ) override; 00065 00066 00067 virtual IOController_i::SensorInfoSeq* getSensorSeq( const UniSetTypes::IDSeq& lst ) override; 00068 virtual UniSetTypes::IDSeq* setOutputSeq( const IOController_i::OutSeq& lst, UniSetTypes::ObjectId sup_id ) override; 00069 00070 // ---------------------------------------------------------------- 00071 virtual UniversalIO::IOType getIOType( UniSetTypes::ObjectId sid ) override; 00072 00073 virtual IOController_i::SensorInfoSeq* getSensorsMap() override; 00074 virtual IOController_i::SensorIOInfo getSensorIOInfo( UniSetTypes::ObjectId sid ) override; 00075 00076 virtual CORBA::Long getRawValue( UniSetTypes::ObjectId sid ) override; 00077 virtual void calibrate( UniSetTypes::ObjectId sid, 00078 const IOController_i::CalibrateInfo& ci, 00079 UniSetTypes::ObjectId adminId ) override; 00080 00081 IOController_i::CalibrateInfo getCalibrateInfo( UniSetTypes::ObjectId sid ) override; 00082 00083 inline IOController_i::SensorInfo SensorInfo( const UniSetTypes::ObjectId sid, 00084 const UniSetTypes::ObjectId node=UniSetTypes::uniset_conf()->getLocalNode()) 00085 { 00086 IOController_i::SensorInfo si; 00087 si.id = sid; 00088 si.node = node; 00089 return si; 00090 }; 00091 00092 UniSetTypes::Message::Priority getPriority( const UniSetTypes::ObjectId id ); 00093 00094 virtual IOController_i::ShortIOInfo getChangedTime( const UniSetTypes::ObjectId id ) override; 00095 00096 virtual IOController_i::ShortMapSeq* getSensors() override; 00097 00098 public: 00099 00100 // предварительное объявление, чтобы в структуре объявить итератор.. 00101 struct USensorInfo; 00102 typedef std::map<UniSetTypes::ObjectId, USensorInfo> IOStateList; 00103 00104 // ================== Достпуные сигналы ================= 00110 typedef sigc::signal<void, IOStateList::iterator&, IOController*> ChangeSignal; 00111 typedef sigc::signal<void, IOStateList::iterator&, IOController*> ChangeUndefinedStateSignal; 00112 00113 // signal по изменению определённого датчика 00114 ChangeSignal signal_change_value( UniSetTypes::ObjectId sid ); 00115 00116 // signal по изменению любого датчика 00117 ChangeSignal signal_change_value(); 00118 00119 // сигналы по изменению флага "неопределённое состояние" (обрыв датчика например) 00120 ChangeUndefinedStateSignal signal_change_undefined_state( UniSetTypes::ObjectId sid ); 00121 ChangeUndefinedStateSignal signal_change_undefined_state(); 00122 // ----------------------------------------------------------------------------------------- 00123 00124 struct USensorInfo: 00125 public IOController_i::SensorIOInfo 00126 { 00127 USensorInfo( const USensorInfo& ) = delete; 00128 const USensorInfo& operator=(const USensorInfo& ) = delete; 00129 USensorInfo( USensorInfo&& ) = default; 00130 USensorInfo& operator=(USensorInfo&& ) = default; 00131 00132 USensorInfo():any(0),d_value(0),d_off_value(0) 00133 { 00134 d_si.id = UniSetTypes::DefaultObjectId; 00135 d_si.node = UniSetTypes::DefaultObjectId; 00136 value = default_val; 00137 real_value = default_val; 00138 dbignore = false; 00139 undefined = false; 00140 blocked = false; 00141 } 00142 00143 virtual ~USensorInfo(){} 00144 00145 USensorInfo(IOController_i::SensorIOInfo& r); 00146 USensorInfo(IOController_i::SensorIOInfo* r); 00147 USensorInfo(const IOController_i::SensorIOInfo& r); 00148 00149 USensorInfo& operator=(IOController_i::SensorIOInfo& r); 00150 const USensorInfo& operator=(const IOController_i::SensorIOInfo& r); 00151 USensorInfo& operator=(IOController_i::SensorIOInfo* r); 00152 00153 // Дополнительные (вспомогательные поля) 00154 UniSetTypes::uniset_rwmutex val_lock; 00156 IOStateList::iterator it; 00157 00158 void* any; 00160 // сигнал для реализации механизма зависимостией.. 00161 // (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals) 00162 UniSetTypes::uniset_rwmutex changeMutex; 00163 ChangeSignal sigChange; 00164 00165 UniSetTypes::uniset_rwmutex undefMutex; 00166 ChangeUndefinedStateSignal sigUndefChange; 00167 00168 IOController_i::SensorInfo d_si; 00169 long d_value; 00170 long d_off_value; 00172 // функция обработки информации об изменении состояния датчика, от которого зависит данный 00173 void checkDepend( IOStateList::iterator& it, IOController* ); 00174 }; 00175 00176 inline IOStateList::iterator ioBegin(){ return ioList.begin(); } 00177 inline IOStateList::iterator ioEnd(){ return ioList.end(); } 00178 inline IOStateList::iterator find(UniSetTypes::KeyType k){ return ioList.find(k); } 00179 inline int ioCount(){ return ioList.size(); } 00180 00181 // доступ к элементам через итератор 00182 virtual void localSetValue( IOStateList::iterator& it, const UniSetTypes::ObjectId sid, 00183 CORBA::Long value, UniSetTypes::ObjectId sup_id ); 00184 00185 virtual long localGetValue( IOStateList::iterator& it, const UniSetTypes::ObjectId sid ); 00186 00187 00192 virtual void localSetUndefinedState( IOStateList::iterator& it, bool undefined, 00193 const UniSetTypes::ObjectId sid ); 00194 00195 protected: 00196 // переопределяем для добавления вызова регистрации датчиков 00197 virtual bool deactivateObject() override; 00198 virtual bool activateObject() override; 00199 00201 virtual void activateInit(); 00202 00204 virtual void sensorsRegistration(){}; 00206 virtual void sensorsUnregistration(); 00207 00208 typedef sigc::signal<void, IOStateList::iterator&, IOController*> InitSignal; 00209 // signal по изменению определённого датчика 00210 inline InitSignal signal_init(){ return sigInit; } 00211 00215 void ioRegistration( USensorInfo&&, bool force=false ); 00216 00218 void ioUnRegistration( const UniSetTypes::ObjectId sid ); 00219 00220 // ------------------------------ 00221 inline IOController_i::SensorIOInfo 00222 SensorIOInfo(long v, UniversalIO::IOType t, const IOController_i::SensorInfo& si, 00223 UniSetTypes::Message::Priority p = UniSetTypes::Message::Medium, 00224 long defval=0, IOController_i::CalibrateInfo* ci=0 ) 00225 { 00226 IOController_i::SensorIOInfo ai; 00227 ai.si = si; 00228 ai.type = t; 00229 ai.value = v; 00230 ai.priority = p; 00231 ai.default_val = defval; 00232 ai.real_value = v; 00233 ai.blocked = false; 00234 if( ci!=0 ) 00235 ai.ci = *ci; 00236 else 00237 { 00238 ai.ci.minRaw = 0; 00239 ai.ci.maxRaw = 0; 00240 ai.ci.minCal = 0; 00241 ai.ci.maxCal = 0; 00242 ai.ci.precision = 0; 00243 } 00244 return ai; 00245 }; 00246 00248 virtual void logging( UniSetTypes::SensorMessage& sm ); 00249 00251 virtual void dumpToDB(); 00252 00253 IOController(); 00254 00255 // доступ к списку c изменением только для своих 00256 IOStateList::iterator myioBegin(); 00257 IOStateList::iterator myioEnd(); 00258 IOStateList::iterator myiofind( UniSetTypes::ObjectId id ); 00259 // -------------------------- 00260 // ФИЛЬТРОВАНИЕ 00261 // 00262 typedef sigc::slot<bool,const USensorInfo&, CORBA::Long, UniSetTypes::ObjectId> IOFilterSlot; 00263 typedef std::list<IOFilterSlot> IOFilterSlotList; 00264 00265 /* 00266 Фильтрующая функция должна возвращать: 00267 TRUE - если значение 'нормальное' 00268 FALSE - если значение не подходит (отбрасывается) 00269 00270 Пример использования: 00271 addIOFilter( sigc::mem_fun(my,&MyClass::my_filter) ); 00272 */ 00273 IOFilterSlotList::iterator addIOFilter( IOFilterSlot sl, bool push_front=false ); 00274 void eraseIOFilter(IOFilterSlotList::iterator& it); 00275 00276 // функии проверки текущего значения 00277 bool checkIOFilters( const USensorInfo& ai, CORBA::Long& newvalue, UniSetTypes::ObjectId sup_id ); 00278 00279 inline bool iofiltersEmpty(){ return iofilters.empty(); } 00280 inline int iodiltersSize(){ return iofilters.size(); } 00281 00282 private: 00283 friend class NCRestorer; 00284 00285 UniSetTypes::uniset_mutex siganyMutex; 00286 ChangeSignal sigAnyChange; 00287 00288 UniSetTypes::uniset_mutex siganyundefMutex; 00289 ChangeSignal sigAnyUndefChange; 00290 InitSignal sigInit; 00291 00292 IOStateList ioList; 00293 UniSetTypes::uniset_rwmutex ioMutex; 00295 bool isPingDBServer; // флаг связи с DBServer-ом 00296 00297 IOFilterSlotList iofilters; 00299 UniSetTypes::uniset_rwmutex loggingMutex; 00300 }; 00301 // -------------------------------------------------------------------------- 00302 #endif 00303 // --------------------------------------------------------------------------
1.7.6.1