tags:

views:

151

answers:

2

I'm fairly sure this is a template question, since I can't seem to solve it any other way - but non-template solutions are also welcome.

A Finite State Machine has a number of program States and each state can react to a number of Events.

So, I want to define classes for Event, State and FSM. FSM has a collection (probably vector, might be linked list if STL gives problems in an embedded system) of States, and State has a collection of Events.

Each state and event have a unique Id and a name string for debugging porpoises.

To be awkward, I don't want the Ids to be integers, but elements of an enum. Each FSM has different enums for its states & events.

How best to code this? Can you give an example with two simple FSMs, or one FSm with two states, each with two events?

For example, if I have

enum myEvents {a, b, c};
enum hisEvents {d, e, f, g};

I want to be able to declare an Event class which accpts constructors params

(myEvents a,char *"event_a")
and
(hisEvents g,char* "event_g")
Note that I don't want to just overload the constructor, since that is restrictive - what if new event enums are added?

And similarly with states, then have my FSMs each have a list of states.

Or am I just being anel, insisting on enums for eventId, when it would be much simpler to pass an int?

thanks.


Btw, I'd rather avoid Boost as it is itself undecided on how well it works in embedded systems. I prefer in-house developed, for complete control.

+2  A: 

I'm not shure if I'm understanding things correctly but I'll take a stab at it:

I'm assuming you want to define a state machine by defining the transitions; e.g. "when in state 'myEvents' and you see 'a' do 'event_a'"

class State {};
template<T> RealState : State
{
    static void Add(T event, char*) { /* save stuff */ }
};

class Event {};
template<T> RealEvent : Event    {
    RealEvent(T event, char* name) {RealState<T>(event, name); }
};

Some how you would need to tack in actions and whatnot and you will want to muck it up a bit to get more than one state machine, but I hope that gets you started.

BCS
Thanks, that looks like a good start. I'll play with it and get back to you.
Mawg
I would prefer the constructors to take two params, one enum and one char *and I would like to see an example which declares an event and then a state.
Mawg
+1  A: 

While i understand why you want to avoid code redundancies by implementing the state machine basics generically, i don't understand why you want to implement this yourself.

Take a look at existing implementations like Boost.Statechart or whatever suits your usage scenario best.

Georg Fritzsche
because, as stated above, boost itself equivocates when it comes to embedded systems
Mawg