/*! ======================================================================== ** Extended Template and Library Test Suite ** Angle Class Test ** $Id$ ** ** Copyright (c) 2002 Robert B. Quattlebaum Jr. ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as ** published by the Free Software Foundation; either version 2 of ** the License, or (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. ** ** === N O T E S =========================================================== ** ** ========================================================================= */ /* === H E A D E R S ======================================================= */ #include #include /* === M A C R O S ========================================================= */ using namespace std; using namespace etl; /* === C L A S S E S ======================================================= */ enum EventKey { EVENT_1, EVENT_2, EVENT_3, EVENT_4 }; struct MachineContext { smach machine; MachineContext():machine(this) { } }; typedef smach Smach; class Event1 : public Smach::event { public: Event1():Smach::event(EVENT_1) { } }; class DefaultStateContext { MachineContext *context; public: DefaultStateContext(MachineContext *context):context(context) { printf("Entered Default State\n"); } ~DefaultStateContext() { printf("Left Default State\n"); } Smach::event_result event1_handler(const Smach::event& x __attribute__ ((unused))) { printf("DEFAULT STATE: Received Event 1\n"); return Smach::RESULT_ACCEPT; } }; class DefaultState : public Smach::state { public: DefaultState():Smach::state("DefaultState") { insert(event_def(EVENT_1,&DefaultStateContext::event1_handler)); } } default_state; class State1Context { MachineContext *context; public: State1Context(MachineContext *context):context(context) { printf("Entered State 1\n"); } ~State1Context() { printf("Left State 1\n"); } Smach::event_result event1_handler(const Smach::event& x __attribute__ ((unused))) { printf("STATE1: Received Event 1\n"); return Smach::RESULT_OK; } Smach::event_result event3_handler(const Smach::event& x); }; class State1 : public Smach::state { public: State1():Smach::state("State1") { insert(event_def(EVENT_1,&State1Context::event1_handler)); insert(event_def(EVENT_3,&State1Context::event3_handler)); } } state_1; class State2Context { MachineContext *context; public: State2Context(MachineContext *context):context(context) { printf("Entered State 2\n"); } ~State2Context() { printf("Left State 2\n"); } Smach::event_result event1_handler(const Smach::event& x __attribute__ ((unused))) { printf("STATE2: Received Event 1\n"); return Smach::RESULT_OK; } Smach::event_result event2_handler(const Smach::event& x __attribute__ ((unused))) { printf("STATE2: Received Event 2\n"); return Smach::RESULT_OK; } Smach::event_result event3_handler(const Smach::event& x __attribute__ ((unused))) { printf("STATE2: Received Event 3\n"); return Smach::RESULT_OK; } }; class State2 : public Smach::state { public: State2():Smach::state("State2") { insert(event_def(EVENT_1,&State2Context::event1_handler)); insert(event_def(EVENT_2,&State2Context::event2_handler)); insert(event_def(EVENT_3,&State2Context::event3_handler)); } } state_2; Smach::event_result State1Context::event3_handler(const Smach::event& x __attribute__ ((unused))) { printf("STATE1: Received Event 3, throwing state to change to...\n"); throw &state_2; // context->machine.enter(&state_2); // return Smach::RESULT_ACCEPT; } /* === G L O B A L S ======================================================= */ /* === E N T R Y P O I N T ================================================= */ int main() { int error=0; MachineContext context; try { Smach& state_machine(context.machine); state_machine.set_default_state(&default_state); state_machine.enter(&state_1); state_machine.process_event(Event1()); state_machine.process_event(EVENT_1); state_machine.process_event(EVENT_2); state_machine.process_event(EVENT_3); state_machine.process_event(Event1()); state_machine.process_event(EVENT_1); state_machine.process_event(EVENT_2); state_machine.process_event(EVENT_3); state_machine.process_event(Event1()); state_machine.process_event(EVENT_1); state_machine.process_event(EVENT_2); state_machine.process_event(EVENT_3); } catch(...) { printf("Uncaught exception\n"); error++; } return error; }