1 #include <boost/statechart/state_machine.hpp>
3 #include <boost/statechart/event_base.hpp>
4 #include <boost/statechart/state.hpp>
9 namespace sc = boost::statechart;
10 namespace mpl = boost::mpl;
12 template< class MostDerived,
14 class Inner = boost::mpl::list<> >
15 struct TimedState : boost::statechart::state<MostDerived, Context, Inner>
18 typedef TimedState base_state;
19 typedef typename boost::statechart::state<MostDerived, Context, Inner> base_type;
20 #define global_timer_list base_type::outermost_context().my_handle()->timer_list_.timeouts
22 std::list<Timer *> active_timers;
23 TimedState(typename base_type::my_context ctx ) : base_type( ctx ) {
24 // std::cout<<typeid(MostDerived).name()<<" global"<<std::endl;
27 if(global_timer_list.size()>0 && active_timers.size()>0)
29 std::list<Timer *>::iterator it;
30 for(it = active_timers.begin(); it!= active_timers.end(); it++)
32 global_timer_list.remove(*it);
34 //std::cout<<"delka "<<global_timer_list.size()<<std::endl;
37 void runTimer(Timer &t, long int milisec, const boost::intrusive_ptr< boost::statechart::event_base > &e)
39 base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e);
40 active_timers.push_back(&t);
42 void stopTimer(Timer &t) {
43 active_timers.remove(&t);
44 std::cout<<"pred "<<global_timer_list.size()<<std::endl;
45 global_timer_list.remove(&t);
46 std::cout<<"po "<<global_timer_list.size()<<std::endl;
50 template< class MostDerived,
52 class Inner = boost::mpl::list<> >
53 struct TimedSimpleState : boost::statechart::simple_state<MostDerived, Context, Inner>
56 typedef TimedSimpleState base_state;
57 typedef typename boost::statechart::simple_state<MostDerived, Context, Inner> base_type;
58 #define global_timer_list base_type::outermost_context().my_handle()->timer_list_.timeouts
60 std::list<Timer *> active_timers;
62 // std::cout<<typeid(MostDerived).name()<<" global"<<std::endl;
65 if(global_timer_list.size()>0 && active_timers.size()>0)
67 std::list<Timer *>::iterator it;
68 for(it = active_timers.begin(); it!= active_timers.end(); it++)
70 global_timer_list.remove(*it);
72 //std::cout<<"delka "<<global_timer_list.size()<<std::endl;
75 void runTimer(Timer &t, long int milisec, const boost::intrusive_ptr< boost::statechart::event_base > &e)
77 base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e);
78 active_timers.push_back(&t);
80 void stopTimer(Timer &t) {
81 active_timers.remove(&t);
82 std::cout<<"pred "<<global_timer_list.size()<<std::endl;
83 global_timer_list.remove(&t);
84 std::cout<<"po "<<global_timer_list.size()<<std::endl;