]> rtime.felk.cvut.cz Git - eurobot/public.git/blob - src/robofsm/timedFSM.h
15a8bdf289b17233dbf91bf18c43b101157844b1
[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 #include <scheduler.hpp>
8
9
10 namespace sc = boost::statechart;
11 namespace mpl = boost::mpl;
12
13 template< class MostDerived,
14           class Context,
15           class Inner = boost::mpl::list<> >
16 struct TimedState : boost::statechart::state<MostDerived, Context, Inner>
17
18     private:
19         std::list<Timer *> active_timers;
20         typedef typename boost::statechart::state<MostDerived, Context, Inner> base_type; 
21         Scheduler::processor_handle handle_;
22     protected:
23         typedef TimedState base_state;
24     public:
25         TimedState(typename base_type::my_context ctx ) : base_type( ctx ) {
26                 handle_ = base_type::outermost_context().my_handle();
27         }
28         ~TimedState() {
29                 if(handle_->timer_list_.timeouts.size()>0 && active_timers.size()>0)
30                 {
31                         std::list<Timer *>::iterator it;
32                         for(it = active_timers.begin(); it!= active_timers.end(); it++)
33                                 handle_->timer_list_.timeouts.remove(*it);
34                 }
35         }
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);
39         }
40         void stopTimer(Timer &t) {
41                 active_timers.remove(&t);
42                 handle_->timer_list_.timeouts.remove(&t);
43         }
44 };
45
46 template< class MostDerived,
47           class Context,
48           class Inner = boost::mpl::list<> >
49 struct TimedSimpleState : boost::statechart::simple_state<MostDerived, Context, Inner>
50 {
51     private:
52         std::list<Timer *> active_timers;
53         typedef typename boost::statechart::simple_state<MostDerived, Context, Inner> base_type; 
54         Scheduler::processor_handle handle_;
55     protected:
56         typedef TimedSimpleState base_state;
57     public:
58         TimedSimpleState() {
59                 handle_ = base_type::outermost_context().my_handle();
60         }
61         ~TimedSimpleState() {
62                 if(handle_->timer_list_.timeouts.size()>0 && active_timers.size()>0)
63                 {
64                         std::list<Timer *>::iterator it;
65                         for(it = active_timers.begin(); it!= active_timers.end(); it++)
66                                 handle_->timer_list_.timeouts.remove(*it);
67                 }
68         }
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);
72         }
73         void stopTimer(Timer &t) {
74                 active_timers.remove(&t);
75                 handle_->timer_list_.timeouts.remove(&t);
76         }
77 };