2002-04-05 20:03:49 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
#include <simgear/debug/logstream.hxx>
|
2002-04-11 16:25:12 +00:00
|
|
|
// #include <functional>
|
|
|
|
// #include <algorithm>
|
2002-04-05 20:03:49 +00:00
|
|
|
|
|
|
|
#include "FGEventMgr.hxx"
|
|
|
|
|
|
|
|
FGEventMgr::FGEvent::FGEvent()
|
2002-04-11 16:25:12 +00:00
|
|
|
: name_(""),
|
|
|
|
callback_(0),
|
|
|
|
status_(FG_EVENT_SUSP),
|
|
|
|
ms_(0),
|
|
|
|
ms_to_go_(0),
|
2002-04-05 20:03:49 +00:00
|
|
|
cum_time(0),
|
|
|
|
min_time(100000),
|
|
|
|
max_time(0),
|
|
|
|
count(0)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2002-04-11 16:25:12 +00:00
|
|
|
FGEventMgr::FGEvent::FGEvent( const char* name,
|
|
|
|
fgCallback* cb,
|
|
|
|
EventState status,
|
2002-04-05 20:03:49 +00:00
|
|
|
interval_type ms )
|
2002-04-11 16:25:12 +00:00
|
|
|
: name_(name),
|
|
|
|
callback_(cb),
|
|
|
|
status_(status),
|
|
|
|
ms_(ms),
|
|
|
|
ms_to_go_(ms),
|
2002-04-05 20:03:49 +00:00
|
|
|
cum_time(0),
|
|
|
|
min_time(100000),
|
|
|
|
max_time(0),
|
|
|
|
count(0)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FGEventMgr::FGEvent::~FGEvent()
|
|
|
|
{
|
2002-04-11 16:25:12 +00:00
|
|
|
//delete callback_;
|
2002-04-05 20:03:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FGEventMgr::FGEvent::run()
|
|
|
|
{
|
|
|
|
SGTimeStamp start_time;
|
|
|
|
SGTimeStamp finish_time;
|
|
|
|
|
|
|
|
start_time.stamp();
|
|
|
|
|
|
|
|
// run the event
|
2002-04-11 16:25:12 +00:00
|
|
|
callback_->call(0);
|
2002-04-05 20:03:49 +00:00
|
|
|
|
|
|
|
finish_time.stamp();
|
|
|
|
|
|
|
|
++count;
|
|
|
|
|
|
|
|
unsigned long duration = finish_time - start_time;
|
|
|
|
|
|
|
|
cum_time += duration;
|
|
|
|
|
|
|
|
if ( duration < min_time ) {
|
|
|
|
min_time = duration;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( duration > max_time ) {
|
|
|
|
max_time = duration;
|
|
|
|
}
|
|
|
|
|
|
|
|
reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FGEventMgr::FGEvent::print_stats() const
|
|
|
|
{
|
|
|
|
SG_LOG( SG_EVENT, SG_INFO,
|
2002-04-11 16:25:12 +00:00
|
|
|
" " << name_
|
|
|
|
<< " int=" << ms_ / 1000.0
|
2002-04-05 20:03:49 +00:00
|
|
|
<< " cum=" << cum_time
|
|
|
|
<< " min=" << min_time
|
|
|
|
<< " max=" << max_time
|
|
|
|
<< " count=" << count
|
|
|
|
<< " ave=" << cum_time / (double)count );
|
|
|
|
}
|
|
|
|
|
|
|
|
FGEventMgr::FGEventMgr()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
FGEventMgr::~FGEventMgr()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FGEventMgr::init()
|
|
|
|
{
|
|
|
|
SG_LOG( SG_EVENT, SG_INFO, "Initializing event manager" );
|
|
|
|
|
|
|
|
event_table.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FGEventMgr::bind()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FGEventMgr::unbind()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FGEventMgr::update( int dt )
|
|
|
|
{
|
|
|
|
// Scan all events. Execute any whose interval has expired.
|
|
|
|
event_container_type::iterator first = event_table.begin();
|
|
|
|
event_container_type::iterator last = event_table.end();
|
|
|
|
for(; first != last; ++first)
|
|
|
|
{
|
|
|
|
if (first->update( dt ))
|
|
|
|
{
|
|
|
|
first->run();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2002-04-11 16:25:12 +00:00
|
|
|
FGEventMgr::Register( const FGEvent& event )
|
2002-04-05 20:03:49 +00:00
|
|
|
{
|
2002-04-11 16:25:12 +00:00
|
|
|
// if (event.is_ready())
|
|
|
|
// event.run();
|
2002-04-05 20:03:49 +00:00
|
|
|
event_table.push_back( event );
|
|
|
|
|
2002-04-11 16:25:12 +00:00
|
|
|
SG_LOG( SG_EVENT, SG_INFO, "Registered event " << event.name()
|
|
|
|
<< " to run every " << event.interval() << "ms" );
|
2002-04-05 20:03:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
FGEventMgr::print_stats() const
|
|
|
|
{
|
|
|
|
SG_LOG( SG_EVENT, SG_INFO, "" );
|
|
|
|
SG_LOG( SG_EVENT, SG_INFO, "Event Stats" );
|
|
|
|
SG_LOG( SG_EVENT, SG_INFO, "-----------" );
|
|
|
|
|
2002-04-11 16:25:12 +00:00
|
|
|
#if 1
|
|
|
|
event_container_type::const_iterator first = event_table.begin();
|
|
|
|
event_container_type::const_iterator last = event_table.end();
|
|
|
|
for (; first != last; ++first)
|
|
|
|
{
|
|
|
|
first->print_stats();
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
// #@!$ MSVC can't handle const member functions.
|
2002-04-05 20:03:49 +00:00
|
|
|
std::for_each( event_table.begin(), event_table.end(),
|
2002-04-11 16:25:12 +00:00
|
|
|
std::mem_fun_ref( &FGEvent::print_stats ) );
|
|
|
|
#endif
|
2002-04-05 20:03:49 +00:00
|
|
|
SG_LOG( SG_EVENT, SG_INFO, "" );
|
|
|
|
}
|