1 // Copyright 2010 Christophe Henry 2 // henry UNDERSCORE christophe AT hotmail DOT com 3 // This is an extended version of the state machine available in the boost::mpl library 4 // Distributed under the same license as the original. 5 // Copyright for the original version: 6 // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed 7 // under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at 9 // http://www.boost.org/LICENSE_1_0.txt) 10 11 #ifndef LOGGING_FUNCTORS 12 #define LOGGING_FUNCTORS 13 BOOST_MSM_EUML_ACTION(Empty_Entry)14 BOOST_MSM_EUML_ACTION(Empty_Entry) 15 { 16 template <class Event,class FSM,class STATE> 17 void operator()(Event const&,FSM&,STATE& ) 18 { 19 std::cout << "entering: Empty" << std::endl; 20 } 21 }; BOOST_MSM_EUML_ACTION(Empty_Exit)22 BOOST_MSM_EUML_ACTION(Empty_Exit) 23 { 24 template <class Event,class FSM,class STATE> 25 void operator()(Event const&,FSM&,STATE& ) 26 { 27 std::cout << "leaving: Empty" << std::endl; 28 } 29 }; 30 BOOST_MSM_EUML_ACTION(Open_Entry)31 BOOST_MSM_EUML_ACTION(Open_Entry) 32 { 33 template <class Event,class FSM,class STATE> 34 void operator()(Event const&,FSM&,STATE& ) 35 { 36 std::cout << "entering: Open" << std::endl; 37 } 38 }; BOOST_MSM_EUML_ACTION(Open_Exit)39 BOOST_MSM_EUML_ACTION(Open_Exit) 40 { 41 template <class Event,class FSM,class STATE> 42 void operator()(Event const&,FSM&,STATE& ) 43 { 44 std::cout << "leaving: Open" << std::endl; 45 } 46 }; 47 BOOST_MSM_EUML_ACTION(Stopped_Entry)48 BOOST_MSM_EUML_ACTION(Stopped_Entry) 49 { 50 template <class Event,class FSM,class STATE> 51 void operator()(Event const&,FSM&,STATE& ) 52 { 53 std::cout << "entering: Stopped" << std::endl; 54 } 55 }; BOOST_MSM_EUML_ACTION(Stopped_Exit)56 BOOST_MSM_EUML_ACTION(Stopped_Exit) 57 { 58 template <class Event,class FSM,class STATE> 59 void operator()(Event const&,FSM&,STATE& ) 60 { 61 std::cout << "leaving: Stopped" << std::endl; 62 } 63 }; 64 BOOST_MSM_EUML_ACTION(AllOk_Entry)65 BOOST_MSM_EUML_ACTION(AllOk_Entry) 66 { 67 template <class Event,class FSM,class STATE> 68 void operator()(Event const&,FSM&,STATE& ) 69 { 70 std::cout << "starting: AllOk" << std::endl; 71 } 72 }; BOOST_MSM_EUML_ACTION(AllOk_Exit)73 BOOST_MSM_EUML_ACTION(AllOk_Exit) 74 { 75 template <class Event,class FSM,class STATE> 76 void operator()(Event const&,FSM&,STATE& ) 77 { 78 std::cout << "finishing: AllOk" << std::endl; 79 } 80 }; 81 BOOST_MSM_EUML_ACTION(ErrorMode_Entry)82 BOOST_MSM_EUML_ACTION(ErrorMode_Entry) 83 { 84 template <class Event,class FSM,class STATE> 85 void operator()(Event const&,FSM&,STATE& ) 86 { 87 std::cout << "starting: ErrorMode" << std::endl; 88 } 89 }; BOOST_MSM_EUML_ACTION(ErrorMode_Exit)90 BOOST_MSM_EUML_ACTION(ErrorMode_Exit) 91 { 92 template <class Event,class FSM,class STATE> 93 void operator()(Event const&,FSM&,STATE& ) 94 { 95 std::cout << "finishing: ErrorMode" << std::endl; 96 } 97 }; 98 BOOST_MSM_EUML_ACTION(Playing_Entry)99 BOOST_MSM_EUML_ACTION(Playing_Entry) 100 { 101 template <class Event,class FSM,class STATE> 102 void operator()(Event const&,FSM&,STATE& ) 103 { 104 std::cout << "entering: Playing" << std::endl; 105 } 106 }; BOOST_MSM_EUML_ACTION(Playing_Exit)107 BOOST_MSM_EUML_ACTION(Playing_Exit) 108 { 109 template <class Event,class FSM,class STATE> 110 void operator()(Event const&,FSM&,STATE& ) 111 { 112 std::cout << "leaving: Playing" << std::endl; 113 } 114 }; 115 BOOST_MSM_EUML_ACTION(Song1_Entry)116 BOOST_MSM_EUML_ACTION(Song1_Entry) 117 { 118 template <class Event,class FSM,class STATE> 119 void operator()(Event const&,FSM&,STATE& ) 120 { 121 std::cout << "starting: First song" << std::endl; 122 } 123 }; BOOST_MSM_EUML_ACTION(Song1_Exit)124 BOOST_MSM_EUML_ACTION(Song1_Exit) 125 { 126 template <class Event,class FSM,class STATE> 127 void operator()(Event const&,FSM&,STATE& ) 128 { 129 std::cout << "finishing: First Song" << std::endl; 130 } 131 }; 132 BOOST_MSM_EUML_ACTION(Song2_Entry)133 BOOST_MSM_EUML_ACTION(Song2_Entry) 134 { 135 template <class Event,class FSM,class STATE> 136 void operator()(Event const&,FSM&,STATE& ) 137 { 138 std::cout << "starting: Second song" << std::endl; 139 } 140 }; BOOST_MSM_EUML_ACTION(Song2_Exit)141 BOOST_MSM_EUML_ACTION(Song2_Exit) 142 { 143 template <class Event,class FSM,class STATE> 144 void operator()(Event const&,FSM&,STATE& ) 145 { 146 std::cout << "finishing: Second Song" << std::endl; 147 } 148 }; 149 BOOST_MSM_EUML_ACTION(Song3_Entry)150 BOOST_MSM_EUML_ACTION(Song3_Entry) 151 { 152 template <class Event,class FSM,class STATE> 153 void operator()(Event const&,FSM&,STATE& ) 154 { 155 std::cout << "starting: Third song" << std::endl; 156 } 157 }; BOOST_MSM_EUML_ACTION(Song3_Exit)158 BOOST_MSM_EUML_ACTION(Song3_Exit) 159 { 160 template <class Event,class FSM,class STATE> 161 void operator()(Event const&,FSM&,STATE& ) 162 { 163 std::cout << "finishing: Third Song" << std::endl; 164 } 165 }; 166 BOOST_MSM_EUML_ACTION(Region2State1_Entry)167 BOOST_MSM_EUML_ACTION(Region2State1_Entry) 168 { 169 template <class Event,class FSM,class STATE> 170 void operator()(Event const&,FSM&,STATE& ) 171 { 172 std::cout << "starting: Region2State1" << std::endl; 173 } 174 }; BOOST_MSM_EUML_ACTION(Region2State1_Exit)175 BOOST_MSM_EUML_ACTION(Region2State1_Exit) 176 { 177 template <class Event,class FSM,class STATE> 178 void operator()(Event const&,FSM&,STATE& ) 179 { 180 std::cout << "finishing: Region2State1" << std::endl; 181 } 182 }; BOOST_MSM_EUML_ACTION(Region2State2_Entry)183 BOOST_MSM_EUML_ACTION(Region2State2_Entry) 184 { 185 template <class Event,class FSM,class STATE> 186 void operator()(Event const&,FSM&,STATE& ) 187 { 188 std::cout << "starting: Region2State2" << std::endl; 189 } 190 }; BOOST_MSM_EUML_ACTION(Region2State2_Exit)191 BOOST_MSM_EUML_ACTION(Region2State2_Exit) 192 { 193 template <class Event,class FSM,class STATE> 194 void operator()(Event const&,FSM&,STATE& ) 195 { 196 std::cout << "finishing: Region2State2" << std::endl; 197 } 198 }; 199 // transition actions for Playing BOOST_MSM_EUML_ACTION(start_next_song)200 BOOST_MSM_EUML_ACTION(start_next_song) 201 { 202 template <class FSM,class EVT,class SourceState,class TargetState> 203 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 204 { 205 std::cout << "Playing::start_next_song" << endl; 206 } 207 }; BOOST_MSM_EUML_ACTION(start_prev_song)208 BOOST_MSM_EUML_ACTION(start_prev_song) 209 { 210 template <class FSM,class EVT,class SourceState,class TargetState> 211 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 212 { 213 std::cout << "Playing::start_prev_song" << endl; 214 } 215 }; 216 217 // transition actions BOOST_MSM_EUML_ACTION(start_playback)218 BOOST_MSM_EUML_ACTION(start_playback) 219 { 220 template <class FSM,class EVT,class SourceState,class TargetState> 221 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 222 { 223 cout << "player::start_playback" << endl; 224 } 225 }; BOOST_MSM_EUML_ACTION(open_drawer)226 BOOST_MSM_EUML_ACTION(open_drawer) 227 { 228 template <class FSM,class EVT,class SourceState,class TargetState> 229 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 230 { 231 cout << "player::open_drawer" << endl; 232 } 233 }; BOOST_MSM_EUML_ACTION(close_drawer)234 BOOST_MSM_EUML_ACTION(close_drawer) 235 { 236 template <class FSM,class EVT,class SourceState,class TargetState> 237 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 238 { 239 cout << "player::close_drawer" << endl; 240 } 241 }; BOOST_MSM_EUML_ACTION(store_cd_info)242 BOOST_MSM_EUML_ACTION(store_cd_info) 243 { 244 template <class FSM,class EVT,class SourceState,class TargetState> 245 void operator()(EVT const&, FSM& ,SourceState& ,TargetState& ) 246 { 247 cout << "player::store_cd_info" << endl; 248 // it is now easy to use the message queue. 249 // alternatively to the proces_ in the transition table, we could write: 250 // fsm.process_event(play()); 251 } 252 }; BOOST_MSM_EUML_ACTION(stop_playback)253 BOOST_MSM_EUML_ACTION(stop_playback) 254 { 255 template <class FSM,class EVT,class SourceState,class TargetState> 256 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 257 { 258 cout << "player::stop_playback" << endl; 259 } 260 }; BOOST_MSM_EUML_ACTION(pause_playback)261 BOOST_MSM_EUML_ACTION(pause_playback) 262 { 263 template <class FSM,class EVT,class SourceState,class TargetState> 264 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 265 { 266 cout << "player::pause_playback" << endl; 267 } 268 }; BOOST_MSM_EUML_ACTION(resume_playback)269 BOOST_MSM_EUML_ACTION(resume_playback) 270 { 271 template <class FSM,class EVT,class SourceState,class TargetState> 272 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 273 { 274 cout << "player::resume_playback" << endl; 275 } 276 }; BOOST_MSM_EUML_ACTION(stop_and_open)277 BOOST_MSM_EUML_ACTION(stop_and_open) 278 { 279 template <class FSM,class EVT,class SourceState,class TargetState> 280 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 281 { 282 cout << "player::stop_and_open" << endl; 283 } 284 }; BOOST_MSM_EUML_ACTION(stopped_again)285 BOOST_MSM_EUML_ACTION(stopped_again) 286 { 287 template <class FSM,class EVT,class SourceState,class TargetState> 288 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 289 { 290 cout << "player::stopped_again" << endl; 291 } 292 }; 293 BOOST_MSM_EUML_ACTION(report_error)294 BOOST_MSM_EUML_ACTION(report_error) 295 { 296 template <class FSM,class EVT,class SourceState,class TargetState> 297 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 298 { 299 cout << "player::report_error" << endl; 300 } 301 }; 302 BOOST_MSM_EUML_ACTION(report_end_error)303 BOOST_MSM_EUML_ACTION(report_end_error) 304 { 305 template <class FSM,class EVT,class SourceState,class TargetState> 306 void operator()(EVT const& ,FSM&,SourceState& ,TargetState& ) 307 { 308 cout << "player::report_end_error" << endl; 309 } 310 }; BOOST_MSM_EUML_ACTION(internal_action1)311 BOOST_MSM_EUML_ACTION(internal_action1) 312 { 313 template <class FSM,class EVT,class SourceState,class TargetState> 314 void operator()(EVT const&, FSM& ,SourceState& ,TargetState& ) 315 { 316 cout << "Open::internal action1" << endl; 317 } 318 }; BOOST_MSM_EUML_ACTION(internal_action2)319 BOOST_MSM_EUML_ACTION(internal_action2) 320 { 321 template <class FSM,class EVT,class SourceState,class TargetState> 322 void operator()(EVT const&, FSM& ,SourceState& ,TargetState& ) 323 { 324 cout << "Open::internal action2" << endl; 325 } 326 }; BOOST_MSM_EUML_ACTION(internal_action)327 BOOST_MSM_EUML_ACTION(internal_action) 328 { 329 template <class FSM,class EVT,class SourceState,class TargetState> 330 void operator()(EVT const&, FSM& ,SourceState& ,TargetState& ) 331 { 332 cout << "Open::internal action" << endl; 333 } 334 }; 335 enum DiskTypeEnum 336 { 337 DISK_CD=0, 338 DISK_DVD=1 339 }; 340 341 // Handler called when no_transition detected BOOST_MSM_EUML_ACTION(Log_No_Transition)342 BOOST_MSM_EUML_ACTION(Log_No_Transition) 343 { 344 template <class FSM,class Event> 345 void operator()(Event const& e,FSM&,int state) 346 { 347 std::cout << "no transition from state " << state 348 << " on event " << typeid(e).name() << std::endl; 349 } 350 }; 351 BOOST_MSM_EUML_ACTION(internal_guard1)352 BOOST_MSM_EUML_ACTION(internal_guard1) 353 { 354 template <class FSM,class EVT,class SourceState,class TargetState> 355 bool operator()(EVT const&, FSM& ,SourceState& ,TargetState& ) 356 { 357 cout << "Open::internal guard1" << endl; 358 return false; 359 } 360 }; BOOST_MSM_EUML_ACTION(internal_guard2)361 BOOST_MSM_EUML_ACTION(internal_guard2) 362 { 363 template <class FSM,class EVT,class SourceState,class TargetState> 364 bool operator()(EVT const&, FSM& ,SourceState& ,TargetState& ) 365 { 366 cout << "Open::internal guard2" << endl; 367 return false; 368 } 369 }; 370 #endif // LOGGING_FUNCTORS 371