]> rtime.felk.cvut.cz Git - eurobot/public.git/blob - src/boostFSM/timedFSM.h
Transform to C++: Update TimedStates
[eurobot/public.git] / src / boostFSM / timedFSM.h
1 #include <boost/statechart/state_machine.hpp>
2 #include "timerlist.h"
3 #include <boost/statechart/event_base.hpp>
4 #include <boost/statechart/state.hpp>
5 #include <iostream>
6
7
8 namespace sc = boost::statechart;
9
10
11 template< class MostDerived,
12           class Context,
13           class Inner = boost::mpl::list<> >
14 struct TimedState : boost::statechart::state<MostDerived, Context, Inner>
15 {
16 protected:
17   typedef TimedState base_state;
18   typedef typename boost::statechart::state<MostDerived, Context, Inner> base_type; 
19   #define global_timer_list     base_type::outermost_context().my_handle()->timer_list_.timeouts
20 public:
21         std::list<Timer *> active_timers;
22         TimedState(typename base_type::my_context ctx ) : base_type( ctx ) {
23 //              std::cout<<typeid(MostDerived).name()<<" global"<<std::endl;
24         }
25         ~TimedState(){
26                 if(global_timer_list.size()>0 && active_timers.size()>0)
27                 {
28                         std::list<Timer *>::iterator it;
29                         for(it = active_timers.begin(); it!= active_timers.end(); it++)
30                         {
31                                 global_timer_list.remove(*it);
32                         }
33                         //std::cout<<"delka "<<global_timer_list.size()<<std::endl;
34                 }
35         }
36         void runTimer(Timer &t, long int milisec, const  boost::intrusive_ptr< boost::statechart::event_base > &e)
37         {
38                 base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e);
39                 active_timers.push_back(&t);
40         }
41 };
42
43 template< class MostDerived,
44           class Context,
45           class Inner = boost::mpl::list<> >
46 struct TimedSimpleState : boost::statechart::simple_state<MostDerived, Context, Inner>
47 {
48 protected:
49   typedef TimedSimpleState base_state;
50   typedef typename boost::statechart::simple_state<MostDerived, Context, Inner> base_type; 
51   #define global_timer_list     base_type::outermost_context().my_handle()->timer_list_.timeouts
52 public:
53         std::list<Timer *> active_timers;
54         TimedSimpleState() {
55 //              std::cout<<typeid(MostDerived).name()<<" global"<<std::endl;
56         }
57         ~TimedSimpleState(){
58                 if(global_timer_list.size()>0 && active_timers.size()>0)
59                 {
60                         std::list<Timer *>::iterator it;
61                         for(it = active_timers.begin(); it!= active_timers.end(); it++)
62                         {
63                                 global_timer_list.remove(*it);
64                         }
65                         //std::cout<<"delka "<<global_timer_list.size()<<std::endl;
66                 }
67         }
68         void runTimer(Timer &t, long int milisec, const  boost::intrusive_ptr< boost::statechart::event_base > &e)
69         {
70                 base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e);
71                 active_timers.push_back(&t);
72         }
73 };