/*! ========================================================================
** 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 <ETL/smach>
#include <cstdio>
/* === 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<MachineContext,EventKey> machine;
MachineContext():machine(this)
{
}
};
typedef smach<MachineContext,EventKey> 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<DefaultStateContext>
{
public:
DefaultState():Smach::state<DefaultStateContext>("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<State1Context>
{
public:
State1():Smach::state<State1Context>("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<State2Context>
{
public:
State2():Smach::state<State2Context>("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;
}