]> rtime.felk.cvut.cz Git - eurobot/public.git/blob - src/robofsm/timedFSM.h
robofsm:TimedFSM Add function for stop Timer
[eurobot/public.git] / src / robofsm / 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 #include "events.h"
7
8
9 namespace sc = boost::statechart;
10 namespace mpl = boost::mpl;
11
12 template< class MostDerived,
13           class Context,
14           class Inner = boost::mpl::list<> >
15 struct TimedState : boost::statechart::state<MostDerived, Context, Inner>
16 {
17 protected:
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
21 public:
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;
25         }
26         ~TimedState(){
27                 if(global_timer_list.size()>0 && active_timers.size()>0)
28                 {
29                         std::list<Timer *>::iterator it;
30                         for(it = active_timers.begin(); it!= active_timers.end(); it++)
31                         {
32                                 global_timer_list.remove(*it);
33                         }
34                         //std::cout<<"delka "<<global_timer_list.size()<<std::endl;
35                 }
36         }
37         void runTimer(Timer &t, long int milisec, const  boost::intrusive_ptr< boost::statechart::event_base > &e)
38         {
39                 base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e);
40                 active_timers.push_back(&t);
41         }
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;
47         }
48 };
49
50 template< class MostDerived,
51           class Context,
52           class Inner = boost::mpl::list<> >
53 struct TimedSimpleState : boost::statechart::simple_state<MostDerived, Context, Inner>
54 {
55 protected:
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
59 public:
60         std::list<Timer *> active_timers;
61         TimedSimpleState() {
62 //              std::cout<<typeid(MostDerived).name()<<" global"<<std::endl;
63         }
64         ~TimedSimpleState(){
65                 if(global_timer_list.size()>0 && active_timers.size()>0)
66                 {
67                         std::list<Timer *>::iterator it;
68                         for(it = active_timers.begin(); it!= active_timers.end(); it++)
69                         {
70                                 global_timer_list.remove(*it);
71                         }
72                         //std::cout<<"delka "<<global_timer_list.size()<<std::endl;
73                 }
74         }
75         void runTimer(Timer &t, long int milisec, const  boost::intrusive_ptr< boost::statechart::event_base > &e)
76         {
77                 base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e);
78                 active_timers.push_back(&t);
79         }
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;
85         }
86 };