UniSet
1.4.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 "ObjectsManager.h" 00034 #include "Configuration.h" 00035 #include "Mutex.h" 00036 //--------------------------------------------------------------------------- 00038 class IOController: 00039 public ObjectsManager, 00040 public POA_IOController_i 00041 { 00042 public: 00043 00044 IOController(const std::string name, const std::string section); 00045 IOController(UniSetTypes::ObjectId id); 00046 ~IOController(); 00047 00048 virtual UniSetTypes::ObjectType getType(){ return UniSetTypes::getObjectType("IOController"); } 00049 00050 virtual CORBA::Boolean getState( const IOController_i::SensorInfo& si ); 00051 virtual CORBA::Long getValue( const IOController_i::SensorInfo& si ); 00052 00053 // -------------------- !!!!!!!!! --------------------------------- 00054 // Реализуются конкретным i/o контроллером 00055 // Не забывайте писать реализацию этих функций 00056 virtual void setState( const IOController_i::SensorInfo& si, CORBA::Boolean state, 00057 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00058 virtual void setValue( const IOController_i::SensorInfo& si, CORBA::Long value, 00059 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00060 00061 virtual void fastSetState( const IOController_i::SensorInfo& si, CORBA::Boolean state, 00062 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00063 virtual void fastSetValue( const IOController_i::SensorInfo& si, CORBA::Long value, 00064 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00065 00066 // ---------------------------------------------------------------- 00067 00069 virtual void saveState(const IOController_i::SensorInfo& si, CORBA::Boolean state, 00070 UniversalIO::IOTypes type = UniversalIO::DigitalInput, 00071 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00072 00073 virtual void fastSaveState(const IOController_i::SensorInfo& si, CORBA::Boolean state, 00074 UniversalIO::IOTypes type = UniversalIO::DigitalInput, 00075 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00076 00078 virtual void saveValue(const IOController_i::SensorInfo& si, CORBA::Long value, 00079 UniversalIO::IOTypes type = UniversalIO::AnalogInput, 00080 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00081 00082 virtual void fastSaveValue(const IOController_i::SensorInfo& si, CORBA::Long value, 00083 UniversalIO::IOTypes type = UniversalIO::AnalogInput, 00084 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00085 00086 virtual void setUndefinedState(const IOController_i::SensorInfo& si, 00087 CORBA::Boolean undefined, 00088 UniSetTypes::ObjectId sup_id = UniSetTypes::DefaultObjectId ); 00089 00090 00091 virtual IOController_i::ASensorInfoSeq* getSensorSeq(const UniSetTypes::IDSeq& lst); 00092 virtual UniSetTypes::IDSeq* setOutputSeq(const IOController_i::OutSeq& lst, UniSetTypes::ObjectId sup_id); 00093 00094 // ---------------------------------------------------------------- 00095 virtual UniversalIO::IOTypes getIOType(const IOController_i::SensorInfo& si); 00096 00097 virtual IOController_i::ASensorInfoSeq* getAnalogSensorsMap(); 00098 virtual IOController_i::DSensorInfoSeq* getDigitalSensorsMap(); 00099 00100 virtual IOController_i::DigitalIOInfo getDInfo(const IOController_i::SensorInfo& si); 00101 virtual IOController_i::AnalogIOInfo getAInfo(const IOController_i::SensorInfo& si); 00102 00103 00104 virtual CORBA::Long getRawValue(const IOController_i::SensorInfo& si); 00105 virtual void calibrate(const IOController_i::SensorInfo& si, 00106 const IOController_i::CalibrateInfo& ci, 00107 UniSetTypes::ObjectId adminId ); 00108 00109 IOController_i::CalibrateInfo getCalibrateInfo(const IOController_i::SensorInfo& si); 00110 00111 inline IOController_i::SensorInfo SensorInfo(UniSetTypes::ObjectId id, 00112 UniSetTypes::ObjectId node=UniSetTypes::conf->getLocalNode()) 00113 { 00114 IOController_i::SensorInfo si; 00115 si.id = id; 00116 si.node = node; 00117 return si; 00118 }; 00119 00120 UniSetTypes::Message::Priority getPriority(const IOController_i::SensorInfo& si, 00121 UniversalIO::IOTypes type); 00122 00123 virtual IOController_i::ShortIOInfo getChangedTime(const IOController_i::SensorInfo& si); 00124 00125 virtual IOController_i::ShortMapSeq* getSensors(); 00126 00127 public: 00128 00129 struct DependsInfo; 00130 typedef std::list<DependsInfo> DependsList; 00131 00136 typedef sigc::slot<void,DependsList::iterator,bool> DependsSlot; 00137 00141 void setDependsSlot( DependsSlot sl ); 00142 void setBlockDependsSlot( DependsSlot sl ); 00143 00144 // структуры для внутреннего хранения информации по датчикам 00145 struct UniDigitalIOInfo: 00146 public IOController_i::DigitalIOInfo 00147 { 00148 UniDigitalIOInfo():any(0),dlst_lock(false),block_state(false),db_ignore(false) 00149 { undefined = false; blocked=false; } 00150 virtual ~UniDigitalIOInfo(){} 00151 00152 UniDigitalIOInfo(IOController_i::DigitalIOInfo& r); 00153 UniDigitalIOInfo(const IOController_i::DigitalIOInfo& r); 00154 UniDigitalIOInfo(IOController_i::DigitalIOInfo* r); 00155 00156 UniDigitalIOInfo& operator=(IOController_i::DigitalIOInfo& r); 00157 UniDigitalIOInfo& operator=(IOController_i::DigitalIOInfo* r); 00158 const UniDigitalIOInfo& operator=(const IOController_i::DigitalIOInfo& r); 00159 00160 void* any; 00162 DependsList dlst; 00163 bool dlst_lock; 00164 bool block_state; 00165 bool db_ignore; 00167 UniSetTypes::uniset_spin_mutex val_lock; 00168 }; 00169 00170 struct UniAnalogIOInfo: 00171 public IOController_i::AnalogIOInfo 00172 { 00173 UniAnalogIOInfo():any(0),dlst_lock(false),block_value(0),db_ignore(false) 00174 { undefined = false; blocked=false; } 00175 virtual ~UniAnalogIOInfo(){} 00176 00177 UniAnalogIOInfo(IOController_i::AnalogIOInfo& r); 00178 UniAnalogIOInfo(IOController_i::AnalogIOInfo* r); 00179 UniAnalogIOInfo(const IOController_i::AnalogIOInfo& r); 00180 00181 UniAnalogIOInfo& operator=(IOController_i::AnalogIOInfo& r); 00182 const UniAnalogIOInfo& operator=(const IOController_i::AnalogIOInfo& r); 00183 UniAnalogIOInfo& operator=(IOController_i::AnalogIOInfo* r); 00184 00185 void* any; 00186 DependsList dlst; 00187 bool dlst_lock; 00188 long block_value; 00189 bool db_ignore; 00191 UniSetTypes::uniset_spin_mutex val_lock; 00192 }; 00193 00194 00195 // Функции работы со списками датчиков (без изменения 'const') 00196 typedef std::map<UniSetTypes::KeyType, UniDigitalIOInfo> DIOStateList; 00197 typedef std::map<UniSetTypes::KeyType, UniAnalogIOInfo> AIOStateList; 00198 00199 inline DIOStateList::iterator dioBegin(){ return dioList.begin(); } 00200 inline DIOStateList::iterator dioEnd(){ return dioList.end(); } 00201 inline DIOStateList::iterator dfind(UniSetTypes::KeyType k){ return dioList.find(k); } 00202 inline int dioCount(){ return dioList.size(); } 00203 00204 inline AIOStateList::iterator aioBegin(){ return aioList.begin(); } 00205 inline AIOStateList::iterator aioEnd(){ return aioList.end(); } 00206 inline AIOStateList::iterator afind(UniSetTypes::KeyType k){ return aioList.find(k); } 00207 inline int aioCount(){ return aioList.size(); } 00208 00209 struct DependsInfo 00210 { 00211 DependsInfo( bool init=false ); 00212 DependsInfo( IOController_i::SensorInfo& si, 00213 DIOStateList::iterator& dit, AIOStateList::iterator& ait ); 00214 00215 IOController_i::SensorInfo si; 00216 DIOStateList::iterator dit; 00217 AIOStateList::iterator ait; 00218 bool block_invert; 00219 bool init; 00220 }; 00221 00222 // доступ к элементам через итератор 00223 virtual void localSaveValue( AIOStateList::iterator& it, const IOController_i::SensorInfo& si, 00224 CORBA::Long newvalue, UniSetTypes::ObjectId sup_id ); 00225 virtual void localSaveState( DIOStateList::iterator& it, const IOController_i::SensorInfo& si, 00226 CORBA::Boolean newstate, UniSetTypes::ObjectId sup_id ); 00227 00228 virtual void localSetState( DIOStateList::iterator& it, const IOController_i::SensorInfo& si, 00229 CORBA::Boolean newstate, UniSetTypes::ObjectId sup_id ); 00230 00231 virtual void localSetValue( AIOStateList::iterator& it, const IOController_i::SensorInfo& si, 00232 CORBA::Long value, UniSetTypes::ObjectId sup_id ); 00233 00234 virtual bool localGetState( DIOStateList::iterator& it, const IOController_i::SensorInfo& si ); 00235 virtual long localGetValue( AIOStateList::iterator& it, const IOController_i::SensorInfo& si ); 00236 00237 00242 virtual void localSetUndefinedState( AIOStateList::iterator& it, bool undefined, 00243 const IOController_i::SensorInfo& si ); 00244 00245 00246 protected: 00247 // переопределяем для добавления вызова регистрации датчиков 00248 virtual bool disactivateObject(); 00249 virtual bool activateObject(); 00250 00252 virtual void sensorsRegistration(){}; 00254 virtual void sensorsUnregistration(); 00255 00259 void dsRegistration( const UniDigitalIOInfo&, bool force=false ); 00260 00261 00265 void asRegistration( const UniAnalogIOInfo&, bool force=false ); 00266 00267 00269 void sUnRegistration(const IOController_i::SensorInfo& si); 00270 00271 00272 UniSetTypes::Message::Priority getMessagePriority(UniSetTypes::KeyType k, UniversalIO::IOTypes type); 00273 00274 // ------------------------------ 00275 inline IOController_i::DigitalIOInfo 00276 DigitalIOInfo(bool s, UniversalIO::IOTypes t, const IOController_i::SensorInfo& si, 00277 UniSetTypes::Message::Priority p = UniSetTypes::Message::Medium, 00278 bool defval=false ) 00279 { 00280 IOController_i::DigitalIOInfo di; 00281 di.si = si; 00282 di.state = s; 00283 di.real_state = s; 00284 di.type = t; 00285 di.priority = p; 00286 di.default_val = defval; 00287 di.blocked = false; 00288 return di; 00289 }; 00290 00291 inline IOController_i::AnalogIOInfo 00292 AnalogIOInfo(long v, UniversalIO::IOTypes t, const IOController_i::SensorInfo& si, 00293 UniSetTypes::Message::Priority p = UniSetTypes::Message::Medium, 00294 long defval=0, IOController_i::CalibrateInfo* ci=0 ) 00295 { 00296 IOController_i::AnalogIOInfo ai; 00297 ai.si = si; 00298 ai.type = t; 00299 ai.value = v; 00300 ai.priority = p; 00301 ai.default_val = defval; 00302 ai.real_value = v; 00303 ai.blocked = false; 00304 if( ci!=0 ) 00305 ai.ci = *ci; 00306 else 00307 { 00308 ai.ci.minRaw = 0; 00309 ai.ci.maxRaw = 0; 00310 ai.ci.minCal = 0; 00311 ai.ci.maxCal = 0; 00312 ai.ci.sensibility = 0; 00313 ai.ci.precision = 0; 00314 } 00315 return ai; 00316 }; 00317 00318 00320 virtual void logging(UniSetTypes::SensorMessage& sm); 00321 00323 virtual void dumpToDB(); 00324 00325 00326 IOController(); 00327 00328 // доступ к списку c изменением только для своих 00329 DIOStateList::iterator mydioBegin(); 00330 DIOStateList::iterator mydioEnd(); 00331 AIOStateList::iterator myaioBegin(); 00332 AIOStateList::iterator myaioEnd(); 00333 AIOStateList::iterator myafind(UniSetTypes::KeyType k); 00334 DIOStateList::iterator mydfind(UniSetTypes::KeyType k); 00335 00336 // -------------------------- 00337 // ФИЛЬТРОВАНИЕ 00338 // 00339 typedef sigc::slot<bool,const UniAnalogIOInfo&, CORBA::Long, UniSetTypes::ObjectId> AFilterSlot; 00340 typedef sigc::slot<bool,const UniDigitalIOInfo&, CORBA::Boolean, UniSetTypes::ObjectId> DFilterSlot; 00341 typedef std::list<AFilterSlot> AFilterSlotList; 00342 typedef std::list<DFilterSlot> DFilterSlotList; 00343 00344 /* 00345 Фильтрующая функция должна возвращать: 00346 TRUE - если значение 'нормальное' 00347 FALSE - если значение не подходит (отбрасывается) 00348 00349 Пример использования: 00350 addAFilter( sigc::mem_fun(my,&MyClass::my_filter) ); 00351 */ 00352 AFilterSlotList::iterator addAFilter( AFilterSlot sl, bool push_front=false ); 00353 DFilterSlotList::iterator addDFilter( DFilterSlot sl, bool push_front=false ); 00354 void eraseAFilter(AFilterSlotList::iterator& it); 00355 void eraseDFilter(DFilterSlotList::iterator& it); 00356 00357 // функии проверки текущего значения 00358 bool checkDFilters( const UniDigitalIOInfo& ai, CORBA::Boolean newstate, UniSetTypes::ObjectId sup_id ); 00359 bool checkAFilters( const UniAnalogIOInfo& ai, CORBA::Long& newvalue, UniSetTypes::ObjectId sup_id ); 00360 00361 inline bool afiltersEmpty(){ return afilters.empty(); } 00362 inline bool dfiltersEmpty(){ return dfilters.empty(); } 00363 inline int afiltersSize(){ return afilters.size(); } 00364 inline int dfiltersSize(){ return dfilters.size(); } 00365 00366 // --------------------------- 00367 // note: функция вызывается рекурсивно!!! 00368 void updateDepends( IOController::DependsList& lst, bool undefined, bool& lock ); 00369 void updateBlockDepends( IOController::DependsList& lst, bool blk_state, bool& lock ); 00370 00371 void setCheckLockValuePause( int msec ); 00372 inline int getCheckLockValuePause(){ return checkLockValuePause; } 00373 00374 private: 00375 friend class AskDumper; 00376 00377 DIOStateList dioList; 00378 AIOStateList aioList; 00380 UniSetTypes::uniset_mutex dioMutex; 00381 UniSetTypes::uniset_mutex aioMutex; 00383 bool isPingDBServer; // флаг связи с DBServer-ом 00384 00385 AFilterSlotList afilters; 00386 DFilterSlotList dfilters; 00388 DependsSlot dslot; 00389 DependsSlot bslot; 00390 int checkLockValuePause; 00391 00392 UniSetTypes::uniset_mutex loggingMutex; 00393 }; 00394 00395 #endif