00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00024
00025 #ifndef UniversalInterface_H_
00026 #define UniversalInterface_H_
00027
00028 #include <string>
00029 #include <sstream>
00030 #include <map>
00031 #include <functional>
00032 #include <omniORB4/CORBA.h>
00033 #include "Exceptions.h"
00034 #include "UniSetTypes.h"
00035 #include "ObjectIndex.h"
00036 #include "ObjectRepository.h"
00037 #include "IOController_i.hh"
00038 #include "MessageType.h"
00039 #include "Configuration.h"
00040
00041
00045 namespace UniversalIO
00046 {
00048 const unsigned int defaultTimeOut=3;
00049 }
00050
00051
00052
00053
00054
00055 #define IO_THROW_EXCEPTIONS UniSetTypes::TimeOut,UniSetTypes::IOBadParam,UniSetTypes::ORepFailed
00056
00057
00065 class UniversalInterface
00066 {
00067 public:
00068
00069 UniversalInterface( UniSetTypes::ObjectId backid, CORBA::ORB_var orb=NULL, UniSetTypes::ObjectIndex* oind=NULL );
00070 UniversalInterface( UniSetTypes::Configuration* uconf=UniSetTypes::conf );
00071 ~UniversalInterface();
00072
00073 inline UniSetTypes::ObjectIndex* getObjectIndex() { return oind; }
00074 inline UniSetTypes::Configuration* getConf() { return uconf; }
00075
00076
00077
00078
00079
00081 IOController_i::ASensorInfoSeq_var getSensorSeq( UniSetTypes::IDList& lst );
00082
00083
00084
00085 UniSetTypes::IDSeq_var setOutputSeq( const IOController_i::OutSeq& lst, UniSetTypes::ObjectId sup_id );
00086
00088 UniSetTypes::IDSeq_var askSensorsSeq( UniSetTypes::IDList& lst, UniversalIO::UIOCommand cmd,
00089 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
00090
00091
00092
00093
00094
00096 bool getState ( UniSetTypes::ObjectId id, UniSetTypes::ObjectId node ) throw(IO_THROW_EXCEPTIONS);
00097 bool getState ( UniSetTypes::ObjectId id );
00098
00100 long getValue ( UniSetTypes::ObjectId id, UniSetTypes::ObjectId node )throw(IO_THROW_EXCEPTIONS);
00101 long getValue ( UniSetTypes::ObjectId id );
00102
00104 void setState ( UniSetTypes::ObjectId id, bool state, UniSetTypes::ObjectId node ) throw(IO_THROW_EXCEPTIONS);
00105 void setState ( UniSetTypes::ObjectId id, bool state );
00106 void setState ( IOController_i::SensorInfo& si, bool state, UniSetTypes::ObjectId supplier );
00107
00109 void setValue ( UniSetTypes::ObjectId id, long value, UniSetTypes::ObjectId node ) throw(IO_THROW_EXCEPTIONS);
00110 void setValue ( UniSetTypes::ObjectId id, long value);
00111 void setValue ( IOController_i::SensorInfo& si, long value, UniSetTypes::ObjectId supplier );
00112
00114 bool saveState ( UniSetTypes::ObjectId id, bool state, UniversalIO::IOTypes type, UniSetTypes::ObjectId node ) throw(IO_THROW_EXCEPTIONS);
00115 bool saveState ( UniSetTypes::ObjectId id, bool state, UniversalIO::IOTypes type );
00116 bool saveState ( IOController_i::SensorInfo& si, bool state, UniversalIO::IOTypes type, UniSetTypes::ObjectId supplier );
00117
00119 bool saveValue ( UniSetTypes::ObjectId id, long value, UniversalIO::IOTypes type, UniSetTypes::ObjectId node ) throw(IO_THROW_EXCEPTIONS);
00120 bool saveValue ( UniSetTypes::ObjectId id, long value, UniversalIO::IOTypes type );
00121 bool saveValue ( IOController_i::SensorInfo& si, long value, UniversalIO::IOTypes type, UniSetTypes::ObjectId supplier );
00122
00123
00124 void fastSaveValue( IOController_i::SensorInfo& si, long value, UniversalIO::IOTypes type, UniSetTypes::ObjectId supplier );
00125 void fastSaveState( IOController_i::SensorInfo& si, bool state, UniversalIO::IOTypes type, UniSetTypes::ObjectId supplier );
00126 void fastSetState( IOController_i::SensorInfo& si, bool state, UniSetTypes::ObjectId supplier );
00127 void fastSetValue( IOController_i::SensorInfo& si, long value, UniSetTypes::ObjectId supplier );
00128
00129
00130 void setUndefinedState( IOController_i::SensorInfo& si, bool undefined, UniSetTypes::ObjectId supplier );
00131
00132
00133 CORBA::Long getRawValue( const IOController_i::SensorInfo& si );
00134
00136 void calibrate(const IOController_i::SensorInfo& si,
00137 const IOController_i::CalibrateInfo& ci,
00138 UniSetTypes::ObjectId adminId = UniSetTypes::DefaultObjectId );
00139
00140 IOController_i::CalibrateInfo getCalibrateInfo( const IOController_i::SensorInfo& si );
00141
00142
00144 void askRemoteState( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node,
00145 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId )throw(IO_THROW_EXCEPTIONS);
00146
00147 void askState( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd,
00148 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
00149
00151 void askRemoteValue ( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node,
00152 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId ) throw(IO_THROW_EXCEPTIONS);
00153 void askValue ( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd,
00154 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
00155
00156 void askThreshold ( UniSetTypes::ObjectId sensorId, UniSetTypes::ThresholdId tid,
00157 UniversalIO::UIOCommand cmd,
00158 CORBA::Long lowLimit=0, CORBA::Long hiLimit=0, CORBA::Long sensibility=0,
00159 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
00160
00161 void askRemoteThreshold( UniSetTypes::ObjectId sensorId, UniSetTypes::ObjectId node,
00162 UniSetTypes::ThresholdId thresholdId, UniversalIO::UIOCommand cmd,
00163 CORBA::Long lowLimit=0, CORBA::Long hiLimit=0, CORBA::Long sensibility=0,
00164 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
00165
00167 void askSensor( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd,
00168 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
00169
00170 void askRemoteSensor( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node,
00171 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId )throw(IO_THROW_EXCEPTIONS);
00172
00173
00174 void askOutput( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd,
00175 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId );
00176
00177 void askRemoteOutput( UniSetTypes::ObjectId id, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node,
00178 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId )throw(IO_THROW_EXCEPTIONS);
00179
00181 void askTimer( UniSetTypes::TimerId timerid, CORBA::Long timeMS, CORBA::Short ticks=-1,
00182 UniSetTypes::Message::Priority piority=UniSetTypes::Message::High,
00183 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId) throw(IO_THROW_EXCEPTIONS);
00184
00186 void askMessage( UniSetTypes::MessageCode mid, UniversalIO::UIOCommand cmd, bool ack = true,
00187 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId ) throw(IO_THROW_EXCEPTIONS);
00188 void askMessageRange( UniSetTypes::MessageCode from, UniSetTypes::MessageCode to,
00189 UniversalIO::UIOCommand cmd, bool ack = true,
00190 UniSetTypes::ObjectId backid = UniSetTypes::DefaultObjectId ) throw(IO_THROW_EXCEPTIONS);
00191
00192
00193 UniversalIO::IOTypes getIOType(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node) throw(IO_THROW_EXCEPTIONS);
00194 UniversalIO::IOTypes getIOType(UniSetTypes::ObjectId id);
00195 UniSetTypes::ObjectType getType(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node) throw(IO_THROW_EXCEPTIONS);
00196 UniSetTypes::ObjectType getType(UniSetTypes::ObjectId id);
00197
00198
00199 UniversalIO::IOTypes getConfIOType( UniSetTypes::ObjectId id );
00200
00201 IOController_i::ShortIOInfo getChangedTime( UniSetTypes::ObjectId id, UniSetTypes::ObjectId node );
00202 IOController_i::ShortMapSeq* getSensors( UniSetTypes::ObjectId id,
00203 UniSetTypes::ObjectId node=UniSetTypes::conf->getLocalNode() );
00204
00205
00206 void registered(UniSetTypes::ObjectId id, const UniSetTypes::ObjectPtr oRef, bool force=false)throw(UniSetTypes::ORepFailed);
00207 void registered(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node, const UniSetTypes::ObjectPtr oRef, bool force=false)throw(UniSetTypes::ORepFailed);
00208
00209
00210 void unregister(UniSetTypes::ObjectId id)throw(UniSetTypes::ORepFailed);
00211 void unregister(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node)throw(UniSetTypes::ORepFailed);
00212
00214 inline UniSetTypes::ObjectPtr resolve(const char* name)
00215 {
00216 return rep.resolve(name);
00217 }
00218
00219 inline UniSetTypes::ObjectPtr resolve( UniSetTypes::ObjectId id )
00220 {
00221 std::string nm = oind->getNameById(id);
00222 return rep.resolve(nm);
00223 }
00224
00225 UniSetTypes::ObjectPtr resolve( UniSetTypes::ObjectId id, UniSetTypes::ObjectId nodeName, int timeoutMS=UniversalIO::defaultTimeOut)
00226 throw(UniSetTypes::ResolveNameError, UniSetTypes::TimeOut);
00227
00228
00229 bool isExist( UniSetTypes::ObjectId id );
00230 bool isExist( UniSetTypes::ObjectId id, UniSetTypes::ObjectId node );
00231
00233 inline UniSetTypes::ObjectId getIdByName(const char* name)
00234 {
00235 return oind->getIdByName(name);
00236 }
00237 inline UniSetTypes::ObjectId getIdByName(const string name)
00238 {
00239 return getIdByName(name.c_str());
00240 }
00241
00243 inline std::string getNameById( UniSetTypes::ObjectId id )
00244 {
00245 return oind->getNameById(id);
00246 }
00247
00248 inline std::string getNameById( UniSetTypes::ObjectId id, UniSetTypes::ObjectId node )
00249 {
00250 return oind->getNameById(id, node);
00251 }
00252
00253 inline UniSetTypes::ObjectId getNodeId(const std::string& fullname)
00254 {
00255 return oind->getNodeId(fullname);
00256 }
00257
00258 inline std::string getName(const std::string& fullname)
00259 {
00260 return oind->getName(fullname);
00261 }
00262
00263 inline std::string getTextName( UniSetTypes::ObjectId id )
00264 {
00265 return oind->getTextName(id);
00266 }
00267
00268 static std::string timeToString(time_t tm=time(0), const std::string brk=":");
00269 static std::string dateToString(time_t tm=time(0), const std::string brk="/");
00272 void send( UniSetTypes::ObjectId name, UniSetTypes::TransportMessage& msg, UniSetTypes::ObjectId node) throw(IO_THROW_EXCEPTIONS);
00273 void send( UniSetTypes::ObjectId name, UniSetTypes::TransportMessage& msg);
00274
00275 bool info( std::string msg, UniSetTypes::ObjectId messenger,
00276 UniSetTypes::ObjectId fromNode = UniSetTypes::conf->getLocalNode(),
00277 UniSetTypes::InfoMessage::Character ch=UniSetTypes::InfoMessage::Normal,
00278 UniSetTypes::ObjectId from=UniSetTypes::DefaultObjectId );
00279
00280 bool alarm( std::string msg, UniSetTypes::ObjectId messenger,
00281 UniSetTypes::ObjectId fromNode = UniSetTypes::conf->getLocalNode(),
00282 UniSetTypes::AlarmMessage::Character ch=UniSetTypes::AlarmMessage::Alarm,
00283 UniSetTypes::ObjectId from=UniSetTypes::DefaultObjectId );
00284
00285 bool info( UniSetTypes::InfoMessage& msg, UniSetTypes::ObjectId messenger);
00286 bool alarm( UniSetTypes::AlarmMessage& msg, UniSetTypes::ObjectId messenger);
00287
00288 bool waitReady( UniSetTypes::ObjectId id, int msec, int pause=5000,
00289 UniSetTypes::ObjectId node = UniSetTypes::conf->getLocalNode() );
00290
00291 bool waitWorking( UniSetTypes::ObjectId id, int msec, int pause=3000,
00292 UniSetTypes::ObjectId node = UniSetTypes::conf->getLocalNode() );
00293
00294 inline void setCacheMaxSize( unsigned int newsize)
00295 {
00296 rcache.setMaxSize(newsize);
00297 }
00298
00302 class CacheOfResolve
00303 {
00304 public:
00305 CacheOfResolve(unsigned int maxsize, int cleantime):
00306 MaxSize(maxsize), CleanTime(cleantime){};
00307 ~CacheOfResolve(){};
00308
00309 UniSetTypes::ObjectPtr resolve( UniSetTypes::ObjectId id, UniSetTypes::ObjectId node )throw(UniSetTypes::NameNotFound);
00310 void cache(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node, UniSetTypes::ObjectVar ptr);
00311 void erase(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node);
00312
00313 inline void setMaxSize( unsigned int ms)
00314 {
00315 MaxSize = ms;
00316 };
00317
00318
00319
00320 protected:
00321 CacheOfResolve(){};
00322 private:
00323
00324 bool clean();
00325 inline void clear()
00326 {
00327 UniSetTypes::uniset_mutex_lock l(cmutex,200);
00328 mcache.clear();
00329 };
00330
00334 struct Info
00335 {
00336 Info( UniSetTypes::ObjectVar ptr, time_t tm=0):
00337 ptr(ptr)
00338 {
00339 if(!tm)
00340 timestamp = time(NULL);
00341 }
00342
00343 Info():
00344 ptr(NULL), timestamp(0){};
00345
00346 UniSetTypes::ObjectVar ptr;
00347 time_t timestamp;
00348
00349 bool operator<( const CacheOfResolve::Info& rhs ) const
00350 {
00351 return this->timestamp < rhs.timestamp;
00352 }
00353
00354 };
00355
00356 typedef std::map<int, Info> CacheMap;
00357 CacheMap mcache;
00358 UniSetTypes::uniset_mutex cmutex;
00359 unsigned int MaxSize;
00360 unsigned int CleanTime;
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377 };
00378
00379 void initBackId( UniSetTypes::ObjectId backid );
00380 protected:
00381 std::string set_err(const std::string& pre, UniSetTypes::ObjectId id, UniSetTypes::ObjectId node);
00382 private:
00383 void init();
00384
00385 ObjectRepository rep;
00386 UniSetTypes::ObjectId myid;
00387 CosNaming::NamingContext_var localctx;
00388 CORBA::ORB_var orb;
00389 CacheOfResolve rcache;
00390 UniSetTypes::ObjectIndex* oind;
00391 UniSetTypes::Configuration* uconf;
00392 };
00393
00394 #endif
00395