2015-02-26 15:02:31 +00:00
|
|
|
/*
|
|
|
|
PURPOSE:
|
|
|
|
(Trick input processor.)
|
|
|
|
REFERENCE:
|
|
|
|
(((Bailey, R.W, and Paddock, E.J.) (Trick Simulation Environment)
|
|
|
|
(NASA:JSC #37943)
|
|
|
|
(JSC / Engineering Directorate / Automation and Robotics Division)
|
|
|
|
(June 1994) (--)))
|
|
|
|
ASSUMPTIONS AND LIMITATIONS:
|
|
|
|
()
|
|
|
|
PROGRAMMERS:
|
|
|
|
(((Robert W. Bailey) (LinCom) (4/92) (--) (Realtime))
|
|
|
|
((Robert W. Bailey) (LinCom) (6/1/91) (Trick-CR-00000) (Initial Release)))
|
|
|
|
*/
|
|
|
|
|
2015-03-23 21:03:14 +00:00
|
|
|
#ifndef EVENTPROCESSOR_HH
|
|
|
|
#define EVENTPROCESSOR_HH
|
2015-02-26 15:02:31 +00:00
|
|
|
|
|
|
|
#include <queue>
|
|
|
|
#include <set>
|
|
|
|
|
2015-06-01 15:28:29 +00:00
|
|
|
#include "trick/Event.hh"
|
|
|
|
#include "trick/JobData.hh"
|
2015-02-26 15:02:31 +00:00
|
|
|
|
|
|
|
namespace Trick {
|
|
|
|
|
|
|
|
/**
|
|
|
|
This class processes events on the thread the class was assigned. The process_event
|
|
|
|
job is an S_define level job that will be scheduled to run on an assigned thread.
|
|
|
|
Events are stored in this class and are processed as needed based on the next event's
|
|
|
|
execution time. Events may be added or removed from the event_set.
|
|
|
|
|
|
|
|
@author Alex Lin, Danny Strauss
|
|
|
|
*/
|
|
|
|
|
|
|
|
class EventProcessor {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
@brief Sets the process_event_job pointer.
|
|
|
|
*/
|
|
|
|
void set_process_event_job( Trick::JobData * in_job) { process_event_job = in_job ; } ;
|
|
|
|
|
|
|
|
/**
|
|
|
|
@brief Add a new event to the pending events list. Pending events are added to the
|
|
|
|
processing queue at the next top of frame when add_pending_events is run.
|
|
|
|
*/
|
|
|
|
void add_event(Trick::Event * in_event) ;
|
|
|
|
|
|
|
|
/**
|
|
|
|
@brief Remove an event from the queue.
|
|
|
|
*/
|
|
|
|
void remove_event(Trick::Event * in_event) ;
|
|
|
|
|
|
|
|
/**
|
|
|
|
@brief top_of_frame job that moves pending events to the process_event queue.
|
|
|
|
@return always 0
|
|
|
|
*/
|
|
|
|
void add_pending_events(long long curr_time, bool is_restart = false ) ;
|
|
|
|
|
|
|
|
/**
|
|
|
|
@brief Automatic job to process input file events.
|
|
|
|
@return always 0
|
|
|
|
*/
|
|
|
|
int process_event( long long curr_time ) ;
|
|
|
|
|
|
|
|
/**
|
|
|
|
@brief Clears the event set before a checkpoint is loaded
|
|
|
|
*/
|
|
|
|
void preload_checkpoint() ;
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
2016-04-11 13:01:54 +00:00
|
|
|
Trick::JobData * process_event_job ; // trick_io(**)
|
2015-02-26 15:02:31 +00:00
|
|
|
|
|
|
|
/** Use an ordered set to store the events. The events are sorted by their next execution
|
|
|
|
time. The set allows us to add/remove items at any time.\n */
|
2016-04-11 13:01:54 +00:00
|
|
|
std::multiset< Trick::Event *, CompareEventPtrs > event_set ; // trick_io(**)
|
2015-02-26 15:02:31 +00:00
|
|
|
|
|
|
|
/** Added events are put in the staging area called pending events. The add_pending_events
|
|
|
|
job moves pending events to the event_set.\n */
|
2016-04-11 13:01:54 +00:00
|
|
|
std::vector< Trick::Event * > pending_events ; // trick_io(**)
|
2015-02-26 15:02:31 +00:00
|
|
|
|
|
|
|
} ;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|