2017-06-22 117 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對象。這些也可以有一個狀態機。