orca-robotics


INTRODUCTION
Overview
Download and Install
Quick Start
Documentation
Publications

REPOSITORY
Interfaces
Components
Libraries
Utilities
Software Map

DEVELOPER
Tutorials
Examples
Dev Guide
Dashboard
Wiki
login/pass: orca/orca

PEOPLE
Contributors
Users

SourceForge.net Logo
Project
Download
Mailing lists

 

         

replayconductor.h

00001 #ifndef LOGPLAYER_REPLAYCONDUCTOR_H
00002 #define LOGPLAYER_REPLAYCONDUCTOR_H
00003 
00004 #include <orcaice/subsystemthread.h>
00005 #include <orcaice/context.h>
00006 #include <orcalog/orcalog.h>
00007 #include <IceUtil/IceUtil.h>
00008 #include "replayclock.h"
00009 #include <queue>
00010 
00011 namespace logplayer {
00012 
00013 //
00014 // @brief Orchestrates replaying of the log.
00015 //        This thing is a thread, so it can play continuously.
00016 //        It's thread-safe so that replay-rate etc can be adjusted during operation.
00017 //
00018 // @author Alex Brooks
00019 //
00020 class ReplayConductor : public orcaice::SubsystemThread
00021 {
00022 
00023 public: 
00024 
00025     // beginTime is relative to the start of the log (not absolute)
00026     ReplayConductor( orcalog::MasterFileReader       &masterFileReader,
00027                      std::vector<orcalog::Replayer*> &replayers,
00028                      const IceUtil::Time             &beginTime,
00029                      double                           replayRate,
00030                      const orcaice::Context          &context );
00031 
00032     // 'rate' is a multiple of real-time (ie >1.0 means faster-than-real-time)
00033     void setReplayRate( double rate );
00034 
00035     // Commence continuous playing (at the specified rate)
00036     // Equivalent to 'unpause'.
00037     void startPlaying();
00038     
00039     // Stop playing and remember current position
00040     void pausePlaying();
00041 
00042     // false if paused, not yet started, or at end of log
00043     // the 'aboutToStart' case is if we've received a Play event
00044     // but haven't processed it yet.
00045     bool isPlayingOrAboutToStart();
00046 
00047     // Step forward by one.  Only valid when not playing.
00048     void stepForward();
00049 
00050     // Step backward by one.  Only valid when not playing.
00051     void stepBackward();
00052 
00053     // Go forwards by the prescribed (relative) amount
00054     void fastForward( const IceUtil::Time &time );
00055 
00056     // go to the end of the log
00057     void fastForwardToEnd();
00058 
00059     // Go backwards by the prescribed (relative) amount
00060     void rewind( const IceUtil::Time &time );
00061 
00062     // Rewind to the start of the log and don't start playing again yet.
00063     void rewindToStartAndStop();
00064 
00065     // gets the time of the item we're about to play.
00066     // returns 'cursorValid' (is invalid at end of log)
00067     bool getCursorTime( int &sec, int &usec );
00068 
00069     void timeOfFirstItem( int &sec, int &usec ) const
00070         { sec = firstItemSec_; usec = firstItemUsec_; }
00071 
00072 private:
00073 
00074     // This is the main thread function.
00075     virtual void work();
00076 
00078 
00079     enum EventType {
00080         SetReplayRate,
00081         Start,
00082         Pause,
00083         StepForward,
00084         StepBackward,
00085         FastForward,
00086         FastForwardToEnd,
00087         Rewind,
00088         RewindToStartAndStop
00089     };
00090     // Helper class to represent events that are waiting to be
00091     // processed.  The member variables are only valid for certain
00092     // event types.
00093     class Event {
00094     public:
00095         Event( EventType eventType )
00096             : type_(eventType)
00097             {}
00098         Event( EventType eventType, double replayRate )
00099             : type_(eventType),
00100               replayRate_(replayRate)
00101             {}
00102         Event( EventType eventType, const IceUtil::Time &t )
00103             : type_(eventType),
00104               time_(t)
00105             {}
00106         EventType type() const { return type_; }
00107         double replayRate() const
00108             {
00109                 assert( type_ == SetReplayRate );
00110                 return replayRate_; 
00111             }
00112         const IceUtil::Time &time() const
00113             {
00114                 assert( type_ == FastForward || type_ == Rewind );
00115                 return time_;
00116             }
00117     private:
00118         const EventType type_;
00119         double          replayRate_;
00120         IceUtil::Time   time_;
00121     };
00122 
00124 
00125     // Convenience function which pushes the event and prints a message.
00126     void addEvent( const Event &e );
00127 
00128     void handleEvents();
00129     // Returns: 
00130     //   0:  got time OK
00131     //   -1: couldn't get time (eg because at end of file)
00132     int getTimeOfNextItem( IceUtil::Time &timeNextItem );
00133 
00134     void handleSetReplayRate( double rate );
00135     void handleStart();
00136     void handlePause();
00137     void handleRewindToStartAndStop();
00138     void handleFastForwardToEnd();
00139     void handleRewind( const IceUtil::Time &deltaT );
00140     void handleFastForward( const IceUtil::Time &deltaT );
00141     void handleStepForward();
00142     void handleStepBackward();
00143 
00144     // Catches its own exceptions.
00145     void replayData( int id, int index );
00146 
00147     bool isPlaying();
00148 
00149     std::string toString( EventType e );
00150     std::string toString( const Event &e );
00151     std::string toString( const IceUtil::Time &t );
00152 
00153     // Handles high-level commands
00154     std::queue<Event> eventQueue_;
00155 
00156     IceUtil::Mutex   mutex_;
00157 
00158     // This is if we actually are playing
00159     bool isPlaying_;
00160 
00161     // This is for outsiders: if we're either playing or have received
00162     // a Play event that's not processed yet.
00163     bool isPlayingOrAboutToStart_;
00164 
00165     // The time of the first item
00166     int firstItemSec_, firstItemUsec_;
00167 
00168     // The clock by which replay occurs (might not run in real-time).
00169     ReplayClock clock_;
00170 
00171     orcalog::MasterFileReader       &masterFileReader_;
00172     std::vector<orcalog::Replayer*> &replayers_;
00173     orcaice::Context                 context_;
00174 };
00175 
00176 }
00177 
00178 #endif
 

Webmaster: Tobias Kaupp (tobasco at users.sourceforge.net)


Generated for Orca Robotics by  doxygen 1.4.5