00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 #include "OSDLProgrammedActiveObject.h"
00028 
00029 
00030 #include "OSDLScheduler.h"        
00031 
00032 
00033 
00034 using std::string ;
00035 using std::list ;
00036 
00037 
00038 
00039 #include "Ceylan.h"               
00040 using namespace Ceylan::Log ;
00041 
00042 
00043 using namespace OSDL::Engine ;
00044 using namespace OSDL::Events ;
00045 
00046 
00047 
00048 
00049 ProgrammedActiveObject::ProgrammedActiveObject( 
00050         const SimulationTickList & activationTicks,
00051         bool absolutelyDefined, 
00052         bool autoRegister,
00053         ObjectSchedulingPolicy policy, 
00054         Weight weight ) : 
00055     ActiveObject( policy, weight ),
00056     _absoluteTicks( true )
00057 {
00058 
00059     _programmedTicks = activationTicks ;
00060     
00061     _programmedTicks.sort() ;
00062 
00063     if ( autoRegister )
00064         registerToScheduler() ; 
00065     
00066 }
00067 
00068 
00069 
00070 ProgrammedActiveObject::ProgrammedActiveObject( 
00071         Events::SimulationTick activationTick, 
00072         bool absolutelyDefined, 
00073         bool autoRegister,
00074         ObjectSchedulingPolicy policy, 
00075         Weight weight ) : 
00076     ActiveObject( policy, weight ),
00077     _absoluteTicks( true )
00078 {
00079 
00080     _programmedTicks.push_back( activationTick ) ;
00081     
00082     if ( autoRegister )
00083         registerToScheduler() ; 
00084 
00085 }   
00086 
00087 
00088 
00089 
00090 ProgrammedActiveObject::~ProgrammedActiveObject() throw()
00091 {
00092 
00093     if ( _registered )
00094     {
00095     
00096         try
00097         {
00098     
00099             unregisterFromScheduler() ;
00100             
00101         }
00102         catch( const SchedulingException & e )
00103         {
00104     
00105             LogPlug::error( "ProgrammedActiveObject destructor failed: "
00106                 + e.toString() ) ;
00107     
00108         }
00109         
00110     }
00111         
00112 }
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 void ProgrammedActiveObject::registerToScheduler()
00122 {
00123     
00124     if ( _registered )
00125         throw SchedulingException( 
00126             "ProgrammedActiveObject::registerToScheduler failed: "
00127             "already registered." ) ;
00128             
00129     Scheduler & scheduler = Scheduler::GetExistingScheduler() ;
00130     
00131     
00132     scheduler.registerProgrammedObject( *this ) ;
00133     
00134     
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 }
00143     
00144                 
00145 
00146 void ProgrammedActiveObject::unregisterFromScheduler() 
00147 {
00148 
00149     
00150     
00151     if ( ! _registered )
00152         throw SchedulingException( 
00153             "ProgrammedActiveObject::unregisterFromScheduler failed: "
00154             "not already registered." ) ;
00155             
00156     Scheduler & scheduler = Scheduler::GetExistingScheduler() ;
00157     
00158     scheduler.unregisterProgrammedObject( *this ) ;
00159     
00160     _registered = false ;
00161 
00162 }
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 bool ProgrammedActiveObject::areProgrammedActivationsAbsolute() const
00173 {
00174 
00175     return _absoluteTicks ;
00176     
00177 }
00178 
00179 
00180 
00181 void ProgrammedActiveObject::absoluteProgrammedActivationsWanted( bool on )
00182 {
00183 
00184     if ( _registered )
00185         throw SchedulingException(
00186              "ProgrammedActiveObject::absoluteProgrammedActivationsWanted: "
00187              "cannot be called once already registered." ) ;
00188 
00189     _absoluteTicks = on ;
00190     
00191 }
00192 
00193 
00194 
00195 const SimulationTickList & ProgrammedActiveObject::getProgrammedActivations()
00196     const
00197 {
00198             
00199     return _programmedTicks ;
00200     
00201 }
00202 
00203 
00204 
00205 void ProgrammedActiveObject::setProgrammedActivations( 
00206     const SimulationTickList & newActivationsList ) 
00207 {
00208 
00209     if ( _registered ) 
00210         throw SchedulingException( 
00211             "ProgrammedActiveObject::setProgrammedActivations failed: "
00212             "already registered to scheduler." ) ;
00213             
00214     _programmedTicks = newActivationsList ;
00215     
00216 }
00217 
00218 
00219 
00220 void ProgrammedActiveObject::addProgrammedActivations( 
00221     const SimulationTickList & additionalActivationsList ) 
00222 {
00223 
00224     if ( _registered ) 
00225         throw SchedulingException( 
00226             "ProgrammedActiveObject::addProgrammedActivations failed: "
00227             "already registered to scheduler." ) ;
00228     
00229     
00230 
00231 
00232 
00233 
00234 
00235     _programmedTicks.merge( * const_cast<SimulationTickList *> ( 
00236         & additionalActivationsList ) ) ;
00237     
00238     
00239     _programmedTicks.unique() ;
00240     
00241 }
00242 
00243 
00244 
00245 void ProgrammedActiveObject::onRegistering()
00246 {
00247 
00248     _registered = true ;
00249     
00250 }
00251 
00252 
00253 
00254 const string ProgrammedActiveObject::toString( Ceylan::VerbosityLevels level )
00255     const
00256 {   
00257 
00258     return "Programmed " + ActiveObject::toString( level) 
00259         + ", whose programmed ticks, which are "
00260         + string( _absoluteTicks ? "absolutely" : "relatively" ) 
00261         + " defined, are: " + Ceylan::toString( _programmedTicks ) ;
00262         
00263 }
00264