2017-06-22 188 views
0

我想知道它是否会做我以后的事情。具有无状态的分层状态

我想为家庭自动化的statemachine用类似这样的一些逻辑:

var stateMachine = new StateMachine<State, Trigger>(State.UnOccupied); 
     stateMachine.Configure(State.UnOccupied) 
      .Permit(Trigger.SensorActivity, State.Occupied) 
      .Ignore(Trigger.AlarmFullSet); 

     stateMachine.Configure(State.Occupied) 
      .Permit(Trigger.AlarmFullSet, State.UnOccupied) 
      .Permit(Trigger.AlarmPartSet, State.Asleep) 
      .PermitReentry(Trigger.SensorActivity); 

     stateMachine.Configure(State.Asleep) 
      .SubstateOf(State.Occupied) 
      .Permit(Trigger.AlarmUnset, State.Occupied); 

不过,我想表示一个房屋内的房间的状态,也是房子的整体状态..

IE

Home 

    House Object 
         Upstairs 
             Bedroom 1 
             Bedroom 2 
         Downstairs 
             Kitchen 
             Living Room 

    Garden 
         Front 
         Back 
         Side      

所以,如果客厅被占用那么所以是楼下的房子和家庭..

道歉事先我的C#不是最好的,我正在投入自己的最后!

也有可能做定时离开状态..所以传感器可以触发一个房间被占用,然后更多的活动触发'重入?'(重新启动一个计数器/定时器/调整时间表)占用状态进入 - 然后在没有更多进入/活动事件15分钟后,该区域的占用清除,并且该状态转变为空闲状态。

回答

0

是的,我认为这是可能的无国籍归档。 我会将每个房间建模为一个Room对象,它具有一组触发器和状态。 Room对象可以有一个或多个定时器来处理定时触发器,这会在定时器到期时触发触发器。有些房间可能很特别,所以可以将这些房间建模为从Room类继承的专用类。如果有意义的话,甚至可以创建Floor和House对象。然后你可以做house.SetVacationMode()。

Stateless有一个StateChanged事件,您可以使用它来让每个房间知道其他房间的状态。我怀疑你需要一个与UI交互的管理器对象,以及一个UI/Control对象。这些也可以有一个状态机。