00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
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
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
00347
00348
00349
00350
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
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;
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