I did some more research and here's the solution I've come up with:
I use "state" and "mode" interchangeably
Context Class:
class ModeContext
{
private int rotationCount;
private string direction;
private State state;
public RotaryEncoder rotaryEncoderInstance;
public ModeContext( RotaryEncoder re)
{
this.State = new RPMMode(this);
rotaryEncoderInstance = re;
re.RotationEventHandler += OnRotationEvent;//attach to Context's Handler
rotationCount = 0;
}
public State State
{
get { return state; }
set { state = value; }//debug state change
}
//Event Handler
public void OnRotationEvent(uint data1, uint data2, DateTime time)
{
rotationCount++;
if (data1 == 1)
{
direction = "Clockwise";
state.OnCWRotationEvent(this);
}
else
{
direction = "Counter-Clockwise";
state.OnCCWRotationEvent(this);
}
Debug.Print(rotationCount.ToString() + ": " + direction + " Context Mode Rotation Event Fired!");
}
Concrete State Class that Inherits The State Base class:
class Mode2 : State
{
public override void Handle(ModeContext mode)
{
mode.State = new Mode2();//(mode);
}
public Mode2()
{
//do something;
}
#region event handlers
public override void OnCWRotationEvent(ModeContext mode)
{
mode.State = new Mode3(mode);
}
public override void OnCCWRotationEvent(ModeContext mode)
{
mode.State = new Mode1(mode);
}
#endregion
}
Now that I can change state and give each state specific control behavior, where does the actual heavy lifting go?