SSM

include/ssm.hpp

Go to the documentation of this file.
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__ */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines