trilobot.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2008 Jakub Filak <xfilak01@stud.fit.vutbr.cz>
00003  *
00004  * This file is part of rob08
00005  *
00006  * rob08 is free software: you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation, either version 3 of the License, or
00009  * any later version.
00010  *
00011  * rob08 is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with rob08.  If not, see <http://www.gnu.org/licenses/>.
00018  */
00019 
00020 #ifndef __TRILOBOT_H__
00021 #define __TRILOBOT_H__
00022 
00023 #include "scanner.h"
00024 #include "DateTime.h"
00025 #include "physics.h"
00026 
00027 #include "simulator.h"
00028 
00029 #include <boost/shared_ptr.hpp>
00030 
00031 #ifndef BUILDING_DOX
00032 // system includes, alphabetically sorted
00033 # include <iostream>
00034 #endif
00035 
00037 class IWriter;
00038 
00040 class IExporter;
00041 
00043 class World;
00044 
00048 class IAnswer 
00049 {
00050   public: 
00051     void Write( IWriter& output ) {
00052       ImplWrite( output );
00053     }
00054 
00055     virtual ~IAnswer() {}
00056 
00057   protected:
00058     virtual void ImplWrite( IWriter& output ) =0;
00059 };
00060 
00061 typedef boost::shared_ptr<IAnswer> IAnswerPtr;
00062 
00064 class AckAnswer : public IAnswer
00065 {
00066   protected:
00067     virtual void ImplWrite( IWriter& output );
00068 };
00069 
00070 template<class DT> class Answer : public IAnswer
00071 {
00072   public: 
00073     Answer( const DT& value )
00074       : m_value( value )
00075     {}
00076 
00077     virtual ~Answer(){}
00078 
00079   protected:
00080     DT m_value;
00081 };
00082 
00086 class ICommand //: public ISerializable
00087 {
00088   public:
00089     typedef EToken CodeType;
00090 
00091     CodeType Code() {
00092       return ImplCode();
00093     }
00094     
00095     const Token::TArgVector& Data() const
00096       { return ImplData(); }
00097 
00098     bool Handled() {
00099       return ImplHandled();
00100     }
00101 
00102     ICommand& Handled( bool value ) {
00103       ImplHandled( value );
00104       return *this;
00105     }
00106 
00107     IAnswerPtr Answer() {
00108       return ImplAnswer();
00109     }
00110     
00111     ICommand& Answer( IAnswerPtr answer ) {
00112       ImplAnswer( answer );
00113       return *this;
00114     }
00115     
00116     const DateTime& Stamp() {
00117       return ImplStamp();
00118     }
00119 
00120     virtual ~ICommand() {}
00121 
00122   protected:
00123     virtual CodeType ImplCode() const =0;
00124     virtual const Token::TArgVector& ImplData() const =0;
00125     virtual bool ImplHandled() const =0;
00126     virtual void ImplHandled( bool ) =0;
00127     virtual IAnswerPtr ImplAnswer() const =0;
00128     virtual void ImplAnswer( IAnswerPtr ) =0;
00129     virtual const DateTime& ImplStamp() const =0;
00130 };
00131 
00132 typedef ICommand* ICommandPtr;
00133 
00134 class TokenCommand : public ICommand
00135 {
00136   public:
00137     TokenCommand( const Token& );
00138 
00139     virtual ~TokenCommand();
00140   protected:  
00141     virtual CodeType ImplCode() const;
00142     virtual const Token::TArgVector& ImplData() const;
00143     virtual bool ImplHandled() const;
00144     virtual void ImplHandled( bool value );
00145     virtual IAnswerPtr ImplAnswer() const;
00146     virtual void ImplAnswer( IAnswerPtr answer );
00147     virtual const DateTime& ImplStamp() const;
00148 
00149   private:
00150     TokenCommand( const TokenCommand& );
00151     TokenCommand& operator=( TokenCommand& );
00152 
00153     struct Members;
00154     Members* pimpl;
00155 };
00156 
00157 class Trilobot;
00158 typedef Trilobot* TrilobotPtr;
00159 
00163 class IComponent : public virtual IMovingObject
00164 {
00165   public:
00167     std::string Id() const {
00168       return ImplId();
00169     }
00170 
00178     IComponent& Handle( ICommand& command ) {
00179       ImplHandle( command );
00180       return *this;
00181     }
00182 
00183     virtual ~IComponent() {}
00184 
00185   protected:
00186     virtual std::string ImplId() const =0;
00187     virtual void ImplHandle( ICommand& command ) =0;
00188 };
00189 
00193 class BaseComponent : public virtual IComponent 
00194 {
00195   protected:  
00196     BaseComponent( const char* id, TrilobotPtr robot );
00197 
00198     virtual std::string ImplId() const;
00199 
00200     TrilobotPtr Robot() const;
00201 
00202     BaseComponent& SaveCurrentState( StatePtr );
00203     BaseComponent& SaveNextState( StatePtr );
00204     StatePtr GetCurrentState( const DateTime& now );
00205 
00206     virtual ~BaseComponent();
00207 
00208   protected:
00209     virtual void ImplSerialize( std::ostream& );  
00210     virtual void ImplDeserialize( std::istream& );
00211 
00212   private:
00213     struct Members;
00214     Members* pimpl;
00215 };
00216 
00220 class SimpleComponent : public BaseComponent, public BaseMovingObject
00221 {
00222   protected:
00223     SimpleComponent( const char* id, TrilobotPtr robot );
00224     virtual void ImplSerialize( std::ostream& );  
00225     virtual void ImplDeserialize( std::istream& );
00226 };
00227 
00231 class IDriveObserver
00232 {
00233   public:
00235     void DrivePropertyChange( const DateTime& stamp, double runTime )
00236     { ImplDrivePropertyChange( stamp, runTime ); }
00237 
00238     virtual ~IDriveObserver() {};
00239 
00240   protected:
00241     virtual void ImplDrivePropertyChange( const DateTime&, double runTime ) =0;
00242 };
00243 
00247 class IDrive
00248 {
00249   public:
00253     double Distance() { 
00254       DateTime now( DateTime::Now() );
00255       return ImplDistance( now ); 
00256     }
00257 
00261     double Distance( const DateTime& stamp )
00262     { return ImplDistance( stamp ); }
00263 
00267     IDrive& Halt() { 
00268       DateTime now( DateTime::Now());
00269       ImplHalt( now );
00270       return *this;
00271     }
00272 
00276     IDrive& Halt( const DateTime& at ) { 
00277       ImplHalt( at );
00278       return *this;
00279     }
00280 
00285     IDrive& AddObserver( IDriveObserver* observer ) { 
00286       ImplAddObserver( observer );
00287       return *this;
00288     }
00289     
00290     virtual ~IDrive() {}
00291     
00292   protected:
00293     virtual double ImplDistance( const DateTime& ) =0;
00294     virtual void ImplHalt( const DateTime& ) =0;
00295     virtual void ImplAddObserver( IDriveObserver* observer ) =0;
00296 };
00297 
00298 class Drive;
00299 
00301 class Compass : public IComponent
00302 {
00303   public:
00304     enum ECourse { NORTH=0, NORTH_EAST, EAST, SOUTH_EAST, SOUTH, SOUTH_WEST, WEST, NORTH_WEST };
00305 
00306     Compass( Trilobot* const robot );
00307     
00308     ECourse Course( DateTime at = DateTime::Now() );
00309     unsigned CourseAngle( DateTime at = DateTime::Now() );
00310 
00311     virtual ~Compass();
00312 
00313   protected:
00314     virtual std::string ImplId() const;
00315     virtual void ImplHandle( ICommand& command ); 
00316 
00317     virtual struct Position ImplPosition( const DateTime& );
00318     virtual double ImplSize(const DateTime&);
00319 
00320     // Returns from trilobot
00321     virtual double ImplSpeed(const DateTime&);
00322     // Returns from trilobot
00323     virtual double ImplRadius(const DateTime&);
00324 
00325     // Nothig to serialize 
00326     virtual void ImplSerialize( std::ostream& ) {}
00327     // and nothing to deserialize
00328     virtual void ImplDeserialize( std::istream& ) {}
00329 
00330   private:
00331     unsigned Angle( DateTime at = DateTime::Now() );
00332 
00333     struct Members;
00334     Members* pimpl;
00335 };
00336 
00338 class SoundSensor : public IComponent
00339 {
00340   public:
00341     SoundSensor( Trilobot* const robot );
00342     
00343     unsigned char SoundLevel( DateTime at = DateTime::Now() );
00344 
00345     virtual ~SoundSensor();
00346 
00347   protected:
00348     virtual std::string ImplId() const;
00349     virtual void ImplHandle( ICommand& command ); 
00350 
00351     virtual struct Position ImplPosition( const DateTime& );
00352     virtual double ImplSize(const DateTime&);
00353 
00354     // Returns from trilobot
00355     virtual double ImplSpeed(const DateTime&);
00356     // Returns from trilobot
00357     virtual double ImplRadius(const DateTime&);
00358 
00359     // Nothig to serialize 
00360     virtual void ImplSerialize( std::ostream& ) {}
00361     // and nothing to deserialize
00362     virtual void ImplDeserialize( std::istream& ) {}
00363 
00364   private:
00365     unsigned char ComputeSoundLevel( DateTime at );
00366 
00367     struct Members;
00368     Members* pimpl;
00369 };
00370 
00374 class Trilobot :  public BaseComponent, public IDriveObserver
00375 {
00376   public:
00377     Trilobot( World * const world, IExporter* const exporter );
00378 
00379     IDrive& Drive() const;
00380     World* GetWorld() const;
00381     IExporter* GetExporter();
00382 
00383     ~Trilobot();
00384     
00385   protected:
00386 
00387     void ImplHandle( ICommand& command );
00388     
00389     virtual struct Position ImplPosition( const DateTime& ) ;
00390     virtual double ImplSize(const DateTime&) ;
00391     virtual double ImplSpeed(const DateTime&) ;
00392     virtual double ImplRadius(const DateTime&) ;
00393 
00394     virtual void ImplSerialize( std::ostream& );
00395     virtual void ImplDeserialize( std::istream& );
00396 
00397     virtual void ImplDrivePropertyChange( const DateTime&, double runTime );
00398 
00399   private:
00400     StatePtr GetState( const DateTime& at );  
00401 
00402     typedef STD_VECTOR(IComponent*) ComponentContainer;
00403 
00404     struct Members;
00405     
00406     Members* pimpl;
00407 };
00408 
00409 #endif
00410 

Generated on Fri Jul 10 22:42:01 2009 for rob08 by  doxygen 1.5.4