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