00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
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
00321 virtual double ImplSpeed(const DateTime&);
00322
00323 virtual double ImplRadius(const DateTime&);
00324
00325
00326 virtual void ImplSerialize( std::ostream& ) {}
00327
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
00355 virtual double ImplSpeed(const DateTime&);
00356
00357 virtual double ImplRadius(const DateTime&);
00358
00359
00360 virtual void ImplSerialize( std::ostream& ) {}
00361
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