SSM
|
00001 00009 #ifndef __SSM_HPP__ 00010 #define __SSM_HPP__ 00011 00012 #include <iostream> 00013 #include "ssm.h" 00014 00018 class SSMDummy 00019 { 00020 }; 00021 00022 00028 class SSMApiBase 00029 { 00030 protected: 00031 const char *streamName; 00032 int streamId; 00033 SSM_sid ssmId; 00034 bool isVerbose; 00035 bool isBlocking; 00036 void *mData; 00037 size_t mDataSize; 00038 void *mProperty; 00039 size_t mPropertySize; 00040 00044 void init( ) 00045 { 00046 streamName = NULL; 00047 streamId = 0; 00048 ssmId = 0; 00049 isVerbose = true; 00050 isBlocking = false; 00051 timeId = -1; 00052 mData = NULL; 00053 mDataSize = 0; 00054 mProperty = NULL; 00055 mPropertySize = 0; 00056 } 00060 void init( const char *streamName, int streamId = 0 ) 00061 { 00062 init( ); 00063 this->streamName = streamName; 00064 this->streamId = streamId; 00065 } 00066 00067 00073 void setStream( const char *streamName, int streamId = 0 ) 00074 { 00075 this->streamName = streamName; 00076 this->streamId = streamId; 00077 } 00078 00079 public: 00080 SSM_tid timeId; 00081 ssmTimeT time; 00082 00086 SSMApiBase( ) 00087 { 00088 init( ); 00089 } 00090 00096 SSMApiBase( const char *streamName, int streamId = 0 ) 00097 { 00098 init( ); 00099 setStream( streamName, streamId ); 00100 } 00101 00102 virtual ~SSMApiBase(){} 00103 00107 bool isOpen( ) const 00108 { 00109 return ( ssmId != 0 ? true : false ); 00110 } 00114 bool isUpdate( ) 00115 { 00116 if( !isOpen( ) ) 00117 { 00118 return false; 00119 } 00120 return ( getTID_top( ssmId ) > timeId ); 00121 } 00122 00126 void setVerbose( bool verbose ) 00127 { 00128 isVerbose = verbose; 00129 } 00130 00137 void setBlocking( bool isBlocking ) 00138 { 00139 this->isBlocking = isBlocking; 00140 } 00141 00145 const char *getStreamName() const 00146 { 00147 return streamName; 00148 } 00149 const char *getSensorName() const 00150 { 00151 std::cerr << "SSMBase::getSensorName is old function. so please use get SSMBase::getStreamName()" << std::endl; 00152 return streamName; 00153 } 00154 00158 int getStreamId() const 00159 { 00160 return streamId; 00161 } 00162 int getSensorId() const 00163 { 00164 std::cerr << "SSMBase::getSensorId is old function. so please use get SSMBase::getStreamId()" << std::endl; 00165 return streamId; 00166 } 00167 00171 SSM_sid getSSMId() const 00172 { 00173 return ssmId; 00174 } 00175 00176 void *data() 00177 { 00178 return mData; 00179 } 00180 00181 size_t dataSize() 00182 { 00183 return mDataSize; 00184 } 00185 00186 void *property() 00187 { 00188 return mProperty; 00189 } 00190 00191 size_t propertySize() 00192 { 00193 return mPropertySize; 00194 } 00195 00197 virtual size_t sharedSize( ) 00198 { 00199 return mDataSize; 00200 } 00201 00209 bool create( double saveTime, double cycle ) 00210 { 00211 if( !mDataSize ) 00212 { 00213 std::cerr << "SSM::create() : data buffer of ''" << streamName << "', id = " << streamId << " is not allocked." << std::endl; 00214 return false; 00215 } 00216 00217 ssmId = createSSM( streamName, streamId, sharedSize( ), saveTime, cycle ); 00218 if( ssmId == 0 ) 00219 { 00220 if( isVerbose ) 00221 { 00222 std::cerr << "SSM::create() : cannot create '" << streamName << "', id = " << streamId << std::endl; 00223 } 00224 return false; 00225 } 00226 return true; 00227 } 00228 00233 bool create( const char *streamName, int streamId, double saveTime, double cycle ) 00234 { 00235 setStream( streamName, streamId ); 00236 return create( saveTime, cycle ); 00237 } 00238 00243 bool release( ) 00244 { 00245 return releaseSSM( &ssmId ); 00246 } 00247 00252 bool open( SSM_open_mode openMode = SSM_READ ) 00253 { 00254 if( !mDataSize ) 00255 { 00256 std::cerr << "SSM::open() : data buffer of '" << streamName << "', id = " << streamId << " is not allocked." << std::endl; 00257 return false; 00258 } 00259 ssmId = openSSM( streamName, streamId, openMode ); 00260 if( ssmId == 0 ) 00261 { 00262 if( isVerbose ) 00263 { 00264 std::cerr << "SSM::open() : cannot open '" << streamName << "', id = " << streamId << std::endl; 00265 } 00266 return false; 00267 } 00268 return true; 00269 } 00270 00283 bool open( const char *streamName, int streamId = 0, SSM_open_mode openMode = SSM_READ ) 00284 { 00285 setStream( streamName, streamId ); 00286 return open( openMode ); 00287 } 00288 00295 bool openWait( ssmTimeT timeOut = 0.0, SSM_open_mode openMode = SSM_READ ) 00296 { 00297 if( !mDataSize ) 00298 return false; 00299 00300 bool ret, isVerbose; 00301 ssmTimeT start = gettimeSSM_real( ); 00302 00303 isVerbose = this->isVerbose; 00304 this->isVerbose = false; 00305 00306 ret = open( openMode ); 00307 if( isVerbose && ( !ret )) 00308 { 00309 std::cerr << "SSM::openWait() : wait for stream '" << streamName << "', id = " << streamId << std::endl; 00310 } 00311 00312 while( ( !ret ) && ( !sleepSSM( 1.0 ) ) && ( ( timeOut <= 0 ) || gettimeSSM_real( ) - start < timeOut ) ) 00313 { 00314 ret = open( ); 00315 } 00316 00317 this->isVerbose = isVerbose; 00318 if( !ret ) 00319 ret = open( openMode ); 00320 return ret; 00321 } 00322 00326 bool openWait( const char *streamName, int streamId = 0, ssmTimeT timeOut = 0.0, SSM_open_mode openMode = SSM_READ ) 00327 { 00328 setStream( streamName, streamId ); 00329 return openWait( timeOut, openMode ); 00330 } 00331 00336 bool close( ) 00337 { 00338 return closeSSM( &ssmId ); 00339 } 00340 00348 virtual bool write( ssmTimeT time = gettimeSSM( ) ) 00349 { 00350 if( !isOpen( ) ) 00351 { 00352 return false; 00353 } 00354 SSM_tid tid = writeSSM( ssmId, mData, time ); 00355 if( tid >= 0 ) 00356 { 00357 timeId = tid; 00358 this->time = time; 00359 return true; 00360 } 00361 return false; 00362 } 00369 virtual bool read( SSM_tid timeId = -1 ) 00370 { 00371 if( !isOpen( ) ) 00372 { 00373 return false; 00374 } 00375 SSM_tid tid = readSSM( ssmId, mData, &time, timeId ); 00376 if( tid >= 0 ) 00377 { 00378 this->timeId = tid; 00379 return true; 00380 } 00381 return false; 00382 } 00383 00393 bool readNext( int dt = 1 ) 00394 { 00395 SSM_tid tid = getTID_bottom( ssmId ), rtid; 00396 if( timeId < 0 ) 00397 { 00398 if( isBlocking ) 00399 waitTID( ssmId, 0 ); 00400 return read( -1 ); 00401 } 00402 rtid = timeId + dt; 00403 if( rtid >= tid) 00404 { 00405 if( isBlocking ) 00406 waitTID( ssmId, rtid ); 00407 return read( rtid ); 00408 } 00409 00410 if( isVerbose ) 00411 std::cerr << "SSM::readNext() : skipping read data '" << streamName << "', id = " << streamId 00412 << " TID: "<< rtid << " -> " << tid << std::endl; 00413 return read( tid ); 00414 } 00415 00423 bool readBack( int dt = 1 ) 00424 { 00425 return ( dt <= timeId ? read( timeId - dt ) : false ); 00426 } 00427 00434 bool readLast( ) 00435 { 00436 return read( -1 ); 00437 } 00438 00445 bool readNew( ) 00446 { 00447 if( isBlocking ) 00448 waitTID( ssmId, timeId + 1 ); 00449 return ( isUpdate( ) ? read( -1 ) : false ); 00450 } 00451 00458 bool readTime( ssmTimeT time ) 00459 { 00460 if( !isOpen( ) ) 00461 { 00462 return false; 00463 } 00464 SSM_tid tid = readSSM_time( ssmId, mData, time, &( this->time ) ); 00465 if( tid >= 0 ) 00466 { 00467 timeId = tid; 00468 return true; 00469 } 00470 return false; 00471 } 00472 00479 bool setProperty( ) 00480 { 00481 if( mPropertySize > 0 ) 00482 return static_cast < bool > ( set_propertySSM( streamName, streamId, mProperty, mPropertySize ) ); 00483 else 00484 return false; 00485 } 00486 00493 bool getProperty( ) 00494 { 00495 if( mPropertySize > 0 ) 00496 return static_cast < bool > ( get_propertySSM( streamName, streamId, mProperty ) ); 00497 else 00498 return false; 00499 } 00500 00506 void setBuffer(void *data, size_t dataSize, void *property, size_t propertySize ) 00507 { 00508 mData = data; 00509 mDataSize = dataSize; 00510 mProperty = property; 00511 mPropertySize = propertySize; 00512 } 00513 00514 }; 00515 00521 template < typename T, typename P = SSMDummy > class SSMApi:public SSMApiBase 00522 { 00523 void initApi() 00524 { 00525 SSMApiBase::setBuffer( &data, sizeof( T ), &property, sizeof( P ) ); 00526 } 00527 00528 protected: 00529 void setBuffer(void *data, size_t dataSize, void *property, size_t propertySize ); 00530 00531 public: 00532 T data; 00533 P property; 00534 00538 SSMApi( ) 00539 { 00540 initApi(); 00541 } 00542 00546 SSMApi( const char *streamName, int streamId = 0 ) : SSMApiBase( streamName, streamId ) 00547 { 00548 initApi(); 00549 } 00550 00554 ~SSMApi( ){} 00555 }; 00556 00557 #endif /* __SSM_HPP__ */