private void ConfigureStateMachine()
{
_fsm = new StateMachine<State, Trigger>(State.Unmonitored);
_fsm.OnTransitioned(OnStateMachineTransitioned);
_fsm.Configure(State.Unmonitored)
.Permit(Trigger.Watch, State.Connecting)
.OnEntry(OnUnmonitoredState);
_fsm.Configure(State.Monitored)
.Permit(Trigger.Unwatch, State.Unmonitored)
.OnEntry(OnMonitoredState);
_fsm.Configure(State.Disconnected)
.SubstateOf(State.Monitored)
.PermitReentry(Trigger.Disconnect)
.Permit(Trigger.Connect, State.Connecting)
.OnEntry(OnDisconnectedState);
_fsm.Configure(State.Connecting)
.SubstateOf(State.Disconnected)
.Permit(Trigger.Connected, State.Connected)
.OnEntry(OnConnectingState);
_fsm.Configure(State.Restarting)
.SubstateOf(State.Disconnected)
.Permit(Trigger.Connected, State.Connected);
_fsm.Configure(State.Upgrading)
.SubstateOf(State.Disconnected)
.Permit(Trigger.Connected, State.Connected);
_fsm.Configure(State.Connected)
.SubstateOf(State.Monitored)
.Permit(Trigger.Restart, State.Restarting)
.Permit(Trigger.Upgrade, State.Upgrading)
.Permit(Trigger.Disconnect, State.Disconnected)
.Permit(Trigger.Disconnected, State.Disconnected)
.OnEntry(OnConnectedState)
.OnExit(OnConnectedStateExit);
}