2017-06-22 14 views
0

私は後に何をするのだろうと思っています。ステートレスの階層的な状態

私はこれに似たいくつかのロジックとホームオートメーションのためのステートマシンを考えています:私は家とも家の全体的な状態の中に部屋の状態を表現したいしかし

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オブジェクトには、スケジュールされたトリガーを処理するための1つ以上のタイマーがあり、タイマーの期限が切れたときにトリガーを起動します。いくつかの部屋は特別なものかもしれないので、それらはRoomクラスから継承した特殊なクラスとしてモデル化することができます。たとえそれが理にかなっていれば、FloorオブジェクトとHouseオブジェクトを作成することさえできます。その後、house.SetVacationMode()を実行できます。

ステートレスにはStateChangedイベントがあり、これを使用して各ルームに他のルームの状態を知らせることができます。私はあなたがUIとインターフェイスするマネージャオブジェクトとUI /コントロールオブジェクトも必要とすると思います。これらには状態マシンもあります。

関連する問題