1 #include <boost/statechart/state_machine.hpp>
3 #include <boost/statechart/event_base.hpp>
4 #include <boost/statechart/state.hpp>
7 #include <scheduler.hpp>
10 namespace sc = boost::statechart;
11 namespace mpl = boost::mpl;
13 template< class MostDerived,
15 class Inner = boost::mpl::list<> >
16 struct TimedState : boost::statechart::state<MostDerived, Context, Inner>
19 std::list<Timer *> active_timers;
20 typedef typename boost::statechart::state<MostDerived, Context, Inner> base_type;
21 Scheduler::processor_handle handle_;
23 typedef TimedState base_state;
25 TimedState(typename base_type::my_context ctx ) : base_type( ctx ) {
26 handle_ = base_type::outermost_context().my_handle();
29 if(handle_->timer_list_.timeouts.size()>0 && active_timers.size()>0)
31 std::list<Timer *>::iterator it;
32 for(it = active_timers.begin(); it!= active_timers.end(); it++)
33 handle_->timer_list_.timeouts.remove(*it);
36 void runTimer(Timer &t, long int milisec, const boost::intrusive_ptr< boost::statechart::event_base > &e) {
37 handle_->timer_list_.addTimer(t, milisec, e);
38 active_timers.push_back(&t);
40 void stopTimer(Timer &t) {
41 active_timers.remove(&t);
42 handle_->timer_list_.timeouts.remove(&t);
46 template< class MostDerived,
48 class Inner = boost::mpl::list<> >
49 struct TimedSimpleState : boost::statechart::simple_state<MostDerived, Context, Inner>
52 std::list<Timer *> active_timers;
53 typedef typename boost::statechart::simple_state<MostDerived, Context, Inner> base_type;
54 Scheduler::processor_handle handle_;
56 typedef TimedSimpleState base_state;
59 handle_ = base_type::outermost_context().my_handle();
62 if(handle_->timer_list_.timeouts.size()>0 && active_timers.size()>0)
64 std::list<Timer *>::iterator it;
65 for(it = active_timers.begin(); it!= active_timers.end(); it++)
66 handle_->timer_list_.timeouts.remove(*it);
69 void runTimer(Timer &t, long int milisec, const boost::intrusive_ptr< boost::statechart::event_base > &e) {
70 handle_->timer_list_.addTimer(t, milisec, e);
71 active_timers.push_back(&t);
73 void stopTimer(Timer &t) {
74 active_timers.remove(&t);
75 handle_->timer_list_.timeouts.remove(&t);