• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Boost sapporomsm post event
 

Boost sapporomsm post event

on

  • 1,233 views

 

Statistics

Views

Total Views
1,233
Views on SlideShare
704
Embed Views
529

Actions

Likes
0
Downloads
8
Comments
0

3 Embeds 529

http://d.hatena.ne.jp 527
http://webcache.googleusercontent.com 1
http://translate.googleusercontent.com 1

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Boost sapporomsm post event Boost sapporomsm post event Presentation Transcript

    • 1/95Boost.Msmの使い方 Copyright 2011 Takatoshi Kondo All rights reserved
    • 2/95 自己紹介近藤 貴俊BLOG http://d.hatena.ne.jp/redboltz/twitter @redboltzC++標準化委員会メンバ技術士(情報工学部門)GCJJ Tシャツ圏内 Copyright 2011 Takatoshi Kondo All rights reserved
    • 特技:有名人にはすぐなつく 3/95 Copyright 2011 Takatoshi Kondo All rights reserved
    • 4/95 目次• StateMachineとは• Boost Meta State Machine Library• ATMを題材としたケーススタディ• StateMachineDiagram(UML2.x)への対応状況• ソースコードは以下で参照可能 https://github.com/redboltz/BoostSapporo Copyright 2011 Takatoshi Kondo All rights reserved
    • 5/95 StateMachineとは Event Driven Outputは、あったりなかったり Event [Output] EventA Outupt1 EventA Outupt2 State Machine同じEventでも Outputが変わったり 中身は、 と Copyright 2011 Takatoshi Kondo All rights reserved
    • 6/95StateMachineの構成要素 State1 entry / action do / action exit / action event [ guard ] / action event [ guard ] / action Copyright 2011 Takatoshi Kondo All rights reserved
    • 7/95 StateMachineの構成要素 State1 entry / action遷移 do / action exit / action 状態 event [ guard ] / action event [ guard ] / action Copyright 2011 Takatoshi Kondo All rights reserved
    • 8/95 StateMachineの構成要素 Output State1 entry / action do / action exit / action event [ guard ] / action event [ guard ] / actionEvent Copyright 2011 Takatoshi Kondo All rights reserved
    • 9/95 遷移 Transition State1 event [ guard ] / action State2遷移元状態(State1)において、eventが発生した際、guardが成立していれば、遷移先状態(State2)に遷移する。遷移の際、actionを実行する。event guard action は、いずれもoptional• event記述が無い場合の意味論は後述• guard記述がなければ、eventが発生した際、無条件に 遷移先状態に遷移する。• action記述がなければ、遷移の際、特に何も実行しない。 Copyright 2011 Takatoshi Kondo All rights reserved
    • 10/95 内部遷移 Internal Transition State1 event [ guard ] / action遷移先状態を指定しない遷移。状態遷移は発生しない。状態の内部に記述する(UMLの表記法)あるEvent発生時、guardに応じてactionを実行することを目的として記述される。 遷移しない遷移なんだから、actionを書かないと意味がない Copyright 2011 Takatoshi Kondo All rights reserved
    • 11/95 遷移 Transition State1 event [ guard ] / action State2 Guardが成立するまで待って、 event記述がなければ、 成立したら遷移ではないので注意 トリガとなったevent処理のなかで本遷移が評価される。Event1 State1 State2 Event1 State1 [G1] State2 E2/G1=true G1がfalseならState1まで遷移して待ち状態になる Event1の発生でState2まで遷移する その後、eventによらず、G1がtrueになっても遷移は発生しない E2が発生したらState2に遷移する eventなしの遷移をBoost.Msm documentの中では、 anonymous transitions と呼ぶ Copyright 2011 Takatoshi Kondo All rights reserved
    • 12/95 状態 State (普通の)状態 Composite State 状態名内部遷移(前述) entry/action1 この状態に遷移する際に実行されるentry action do/action2 exit/action3 この状態から遷移する際に実行されるexit action event[guard]/action4 include / 他の状態マシン その状態の間常に実行されるdo actionEvent Drivenなソフトウェアではあまり使わない サブマシン状態を持つという記号 内部に持つサブマシン名 Boost.Msmでもサポートしない Copyright 2011 Takatoshi Kondo All rights reserved
    • 13/95 その他の構成要素 初期疑似状態 Initial Pseudo State 本プレゼンでは ちょっと小さめに書きます 終了状態 Final State ジャンクション疑似状態 Junction Pseudo State 見た目が初期疑似状態と一緒って。。。 選択疑似状態 Choice Pseudo StateState entry point疑似状態 Entry Point Pseudo State exit point疑似状態 Exit Point Pseudo State State fork State join H shallow history H* deep history State Copyright 2011 Takatoshi Kondo All rights reserved
    • 14/95 参考文献 元々のStatechart UML2.xのStateMachineDiagramとして拡張 http://www.uml.org/ Current version: 2.4 (Beta) 絶版だが、以下のご本人サイトから PDFダウンロード可能http://www.wisdom.weizmann.ac.il/~dharel/reactive_systems.html Copyright 2011 Takatoshi Kondo All rights reserved
    • 15/95 Boost.Msmとは? 状態遷移を司るライブラリです State外部からのeventをキューイングしたり 内部のeventはキューイング されるけど スレッドでイベントループを実現したり しません Copyright 2011 Takatoshi Kondo All rights reserved
    • 16/95 Boost.Msmとは?• そういう外回り?のことは、 Boost.AsioやBoost.Threadなんかで やってください• 逆にいえば、Threadなしの周期モデル (組み込み開発などでよくある) でも使うことができます Copyright 2011 Takatoshi Kondo All rights reserved
    • 17/95 Boost.Msm#include <boost/msm/back/state_machine.hpp>#include <boost/msm/front/state_machine_def.hpp>#include <boost/msm/front/functor_row.hpp>namespace msm = boost::msm;namespace msmf = boost::msm::front;namespace mpl = boost::mpl; struct Event1 {}; eventはクラスで表現 struct Event2 { int param1; パラメタはメンバとして int param2; }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 18/95 Boost.Msm struct Sm_:msm::front::state_machine_def<Sm_> { StateMachineの定義 struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} 状態の定義 template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { }; guardの定義 struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; 初期状態の定義(必須) struct transition_table:mpl::vector< actionの定義遷移の定義 // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> eventに対応する遷移がないときの処理 void no_transition(Event const& e, Fsm& ,int state) {} }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 19/95 Boost.Msmstruct Sm_:msm::front::state_machine_def<Sm_> { StateMachineの定義 struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { }; struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {}}; Copyright 2011 Takatoshi Kondo All rights reserved
    • 20/95名前は予約されている Boost.Msm struct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> 状態の定義 void on_entry(Event const&, Fsm&) {} template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; State1 struct State2:msm::front::state<> { entry/on_entry }; exit/on_exit struct Guard1 { 名前は予約されている template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {} }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 21/95遷移トリガとなったeventの参照 Boost.Msm struct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; State1 struct State2:msm::front::state<> { entry/on_entry }; exit/on_exit struct Guard1 { 状態マシンSm_の参照 template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {} }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 22/95 Boost.Msm struct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {}guardの定義 template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { }; boolをreturn struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {} }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 23/95 Boost.Msm struct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {}guardの定義 template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { }; boolをreturn struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; event, 状態マシン, 遷移元state, 遷移先state struct transition_table:mpl::vector< にアクセス可能 // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {} }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 24/95 Boost.Msmstruct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { event, 状態マシン, 遷移元state, 遷移先state }; にアクセス可能 struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; struct transition_table:mpl::vector< actionの定義 // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {}}; Copyright 2011 Takatoshi Kondo All rights reserved
    • 25/95 Boost.Msmstruct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { }; struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} State1 }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; 初期状態の定義(必須) struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {}}; Copyright 2011 Takatoshi Kondo All rights reserved
    • 26/95 initial_stateの役割 リージョン0 State1 join E1 folk State1A State1B E1 State1C E2リージョンとは、状態を持つ単位 リージョン1この例では、State1AかつState1Bといった状態が存在する Copyright 2011 Takatoshi Kondo All rights reserved
    • 27/95 initial_stateの役割 リージョン0 State1 join E1 folk State1A State1B E1 State1C E2リージョンとは、状態を持つ単位 リージョン1この例では、State1AかつState1Bといった状態が存在する typedef mpl::vector<State1A, State1B> initial_state; この並びがリージョン番号 Boost.MSMでは、initial_stateのtypedefをリージョンの表現に(も)利用する1個の場合mpl::vectorじゃなくてもいい Copyright 2011 Takatoshi Kondo All rights reserved
    • 28/95 Boost.Msm struct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; State1 Event1 [ Guard1 ] / Action1 State2 struct State2:msm::front::state<> { }; struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; struct transition_table:mpl::vector<遷移の定義 // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> void no_transition(Event const& e, Fsm& ,int state) {} }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 29/95 state番号と評価順序 0 State番号の振られ方 遷移の評価順序struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 >, 1 msmf::Row < State2, Event2, State1, Action1, Guard1 >, msmf::Row < State2, Event2, State3, Action1, Guard1 >, 2 msmf::Row < State5, Event3, State6, Action1, Guard1 >, msmf::Row < State4, Event4, State2, Action1, Guard1 > > {}; 4 3 5 Copyright 2011 Takatoshi Kondo All rights reserved
    • 30/95 state番号と評価順序 State番号の振られ方 遷移の評価順序struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 >, msmf::Row < State2, Event2, State1, Action1, Guard1 >, msmf::Row < State2, Event2, State3, Action1, Guard1 >, msmf::Row < State5, Event3, State6, Action1, Guard1 >, msmf::Row < State4, Event4, State2, Action1, Guard1 > > {}; State2においてEvent2が発生した際 2つの遷移条件が成立するが、下の方が 評価順序の結果、優先される Copyright 2011 Takatoshi Kondo All rights reserved
    • 31/95 Boost.Msmstruct Sm_:msm::front::state_machine_def<Sm_> { struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { }; struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; 定義しないとassertion fail struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> eventに対応する遷移がないときの処理 void no_transition(Event const& e, Fsm& ,int state) {}}; State番号 Copyright 2011 Takatoshi Kondo All rights reserved
    • 32/95 Boost.Msm struct Sm_:msm::front::state_machine_def<Sm_> { StateMachineの定義 struct State1:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) {} 状態の定義 template <class Event,class Fsm> void on_exit(Event const&, Fsm&) {} }; struct State2:msm::front::state<> { }; guardの定義 struct Guard1 { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; struct Action1 { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState&, TargetState&) const {} }; typedef State1 initial_state; 初期状態の定義(必須) struct transition_table:mpl::vector< actionの定義遷移の定義 // Start Event Next Action Guard msmf::Row < State1, Event1, State2, Action1, Guard1 > > {}; template <class Fsm,class Event> eventに対応する遷移がないときの処理 void no_transition(Event const& e, Fsm& ,int state) {} }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 33/95ATMを題材としたケーススタディ Copyright 2011 Takatoshi Kondo All rights reserved
    • 34/95 ATMを題材としたケーススタディ• StateMachineの階層化• StateMachineのインターフェースと 実装の分離• 複数の entry point疑似状態の使い分け• サブStateMachineから親StateMachineへの Eventの伝搬• guardによるif/else分岐 Copyright 2011 Takatoshi Kondo All rights reserved
    • 35/95 4つのStateMachine1.全体 2.取引3.引き出し 4.(生体)認証 Copyright 2011 Takatoshi Kondo All rights reserved
    • 36/95 1.ATM(全体)全体 待機中 接客中 entry/画面消去 人物感知 include / 取引 人物離脱感知 Copyright 2011 Takatoshi Kondo All rights reserved
    • 37/95 1.ATM(全体)全体 サブStateMachine 待機中 接客中 entry/画面消去 人物感知 include / 取引 人物離脱感知 内部がサブStateMachineであることを示す記号 ちなみに、UML的にはサブマシン状態という Copyright 2011 Takatoshi Kondo All rights reserved
    • 38/95 1.ATM(全体)全体 待機中 接客中 entry/画面消去 人物感知 include / 取引 人物離脱感知 内部状態に手を加えずにキャンセル系処理を実現 この中がどんな状態でも脱出できるということ Copyright 2011 Takatoshi Kondo All rights reserved
    • 39/95 2.ATM(取引)取引 取引選択中 引き出し中entry/取引選択画面提示 include / 引き出し 引き出し選択 entry exit カード挿入 entry_by_card その他選択 省略 Copyright 2011 Takatoshi Kondo All rights reserved
    • 40/95 2.ATM(取引)取引 取引選択中 引き出し中entry/取引選択画面提示 include / 引き出し 引き出し選択 entry exit カード挿入 entry_by_card その他選択 省略 取引単位などで、階層化、モジュール化 Copyright 2011 Takatoshi Kondo All rights reserved
    • 41/95 2.ATM(取引)取引 取引選択中 引き出し中entry/取引選択画面提示 include / 引き出し 引き出し選択 entry exit カード挿入 entry_by_card その他選択 省略 複数のentry point Copyright 2011 Takatoshi Kondo All rights reserved
    • 42/95 3.ATM(引き出し)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 43/95 3.ATM(引き出し)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 カード挿入済みの場合 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 44/95 3.ATM(引き出し) 引き出し以外の取引でも 利用可能(振り込みとか)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 45/95 3.ATM(引き出し)引き出し 生体認証で実現entry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 認証というインターフェース 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 46/95 3.ATM(引き出し)引き出し 実現方法の差し替えentry 認証中 カード挿入待ち include / パスワード認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 47/95 3.ATM(引き出し)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 ジャンクション疑似状態による if / else 分岐 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 48/95 3.ATM(引き出し)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 内部遷移 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 49/95 entry 4.ATM(認証)生体認証 指待ち タイムアウト entry/指要求画面提示 exit_fail 指検出 認証失敗 認証中 entry/認証中画面提示, 認証開始 認証成功(アカウント情報) exit_success アカウント情報 Copyright 2011 Takatoshi Kondo All rights reserved
    • 50/95 entry 4.ATM(認証)生体認証 指待ち タイムアウト entry/指要求画面提示 exit_fail 指検出 合流にも使える ジャンクション疑似状態 認証失敗 認証中 entry/認証中画面提示, 認証開始 認証成功(アカウント情報) exit_success アカウント情報 Copyright 2011 Takatoshi Kondo All rights reserved
    • 51/95 entry 4.ATM(認証)生体認証 指待ち タイムアウト entry/指要求画面提示 exit_fail 指検出 認証失敗 認証中 entry/認証中画面提示, 認証開始 アカウント情報を 認証成功(アカウント情報) ステートマシン外部へ渡す exit_success アカウント情報 Copyright 2011 Takatoshi Kondo All rights reserved
    • 52/95 3.ATM(引き出し) 引き出し entry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_success entry_by_card アカウント情報 イベントは存在しないが、Boost.Msmでは伝搬用イベントを定義可能 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 53/95シナリオ Copyright 2011 Takatoshi Kondo All rights reserved
    • 54/95 1.ATM(全体)全体 待機中 接客中 entry/画面消去 人物感知 include / 取引 人物離脱感知 Copyright 2011 Takatoshi Kondo All rights reserved
    • 55/95 2.ATM(取引)取引 取引選択中 引き出し中entry/取引選択画面提示 include / 引き出し 引き出し選択 entry exit カード挿入 entry_by_card その他選択 省略 Copyright 2011 Takatoshi Kondo All rights reserved
    • 56/95 3.ATM(引き出し)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 57/95 entry 4.ATM(認証)生体認証 指待ち タイムアウト entry/指要求画面提示 exit_fail 指検出 認証失敗 認証中 entry/認証中画面提示, 認証開始 認証成功(アカウント情報) exit_success アカウント情報 Copyright 2011 Takatoshi Kondo All rights reserved
    • 58/95 3.ATM(引き出し)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 59/95 2.ATM(取引)取引 取引選択中 引き出し中entry/取引選択画面提示 include / 引き出し 引き出し選択 entry exit カード挿入 entry_by_card その他選択 省略 Copyright 2011 Takatoshi Kondo All rights reserved
    • 60/95実装 Copyright 2011 Takatoshi Kondo All rights reserved
    • 61/95 ATM(全体)全体 待機中 接客中 entry/画面消去 人物感知 include / 取引 人物離脱感知 Copyright 2011 Takatoshi Kondo All rights reserved
    • 62/95ATM(全体)#include "atm_trade.hpp"namespace Atm { struct HumanDetect {}; struct HumanAway {}; struct All_:msm::front::state_machine_def<All_> { struct Waiting:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Clear Screen" << std::endl; } }; struct InService:Trade {}; typedef Waiting initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Waiting, HumanDetect, InService, msmf::none, msmf::none >, msmf::Row < InService, HumanAway, Waiting, msmf::none, msmf::none > > {}; }; typedef msm::back::state_machine<All_> All;} Copyright 2011 Takatoshi Kondo All rights reserved
    • 63/95ATM(全体)#include "atm_trade.hpp"namespace Atm { struct HumanDetect {}; struct HumanAway {}; struct All_:msm::front::state_machine_def<All_> { struct Waiting:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Clear Screen" << std::endl; } }; サブStateMachineは継承 struct InService:Trade {}; typedef Waiting initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Waiting, HumanDetect, InService, msmf::none, msmf::none >, msmf::Row < InService, HumanAway, Waiting, msmf::none, msmf::none > > {}; }; typedef msm::back::state_machine<All_> All;} Copyright 2011 Takatoshi Kondo All rights reserved
    • 64/95ATM(全体)#include "atm_trade.hpp"namespace Atm { struct HumanDetect {}; struct HumanAway {}; struct All_:msm::front::state_machine_def<All_> { struct Waiting:msm::front::state<> { front_endとの対応付け template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Clear Screen" << std::endl; } }; struct InService:Trade {}; typedef Waiting initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Waiting, HumanDetect, InService, msmf::none, msmf::none >, msmf::Row < InService, HumanAway, Waiting, msmf::none, msmf::none > > {}; }; typedef msm::back::state_machine<All_> All;} back_endとの対応付け Copyright 2011 Takatoshi Kondo All rights reserved
    • 65/95ATM(全体) 認証の実装を差し替えるためにテンプレート化するnamespace Atm { struct HumanDetect {}; struct HumanAway {}; template <class AuthMethod> struct All_:msm::front::state_machine_def<All_<AuthMethod> > { // States struct All_:msm::front::state_machine_def<All_> struct Waiting:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Clear Screen" << std::endl; } }; struct InService:Trade<AuthMethod> {}; typedef Waiting initial_state; struct transition_table:mpl::vector< C++11なら // Start template <class Next Event AuthMethod>Action Guard msmf::Row < Waiting, using All = msm::back::state_machine<All_<AuthMethod>>; HumanDetect, InService, msmf::none, msmf::none >, msmf::Row < InService, HumanAway, Waiting, msmf::none, msmf::none > > {}; }; typedef msm::back::state_machine<All_> All; template <class AuthMethod> struct All:msm::back::state_machine<All_<AuthMethod> > {};} Copyright 2011 Takatoshi Kondo All rights reserved
    • 66/95 ATM(取引)取引 取引選択中 引き出し中entry/取引選択画面提示 include / 引き出し 引き出し選択 entry exit カード挿入 entry_by_card その他選択 省略 Copyright 2011 Takatoshi Kondo All rights reserved
    • 67/95 ATM(取引)#include "atm_withdraw.hpp"#include "atm_card_detect.hpp"namespace Atm { struct ChooseWithdraw {}; template <class AuthMethod> struct Trade_:msm::front::state_machine_def<Trade_<AuthMethod> > { struct Choosing:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "1.Withdraw, 2.N/A, 3.N/A ..." << std::endl; } }; struct Withdrawing:Withdraw<AuthMethod> {}; typedef Choosing initial_state; 続く Copyright 2011 Takatoshi Kondo All rights reserved
    • 68/95 ATM(取引)#include "atm_withdraw.hpp"#include "atm_card_detect.hpp"namespace Atm { struct ChooseWithdraw {}; template <class AuthMethod> struct Trade_:msm::front::state_machine_def<Trade_<AuthMethod> > { struct Choosing:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "1.Withdraw, 2.N/A, 3.N/A ..." << std::endl; } }; struct Withdrawing:Withdraw<AuthMethod> {}; typedef Choosing initial_state; 認証を実現するテンプレート引数を伝搬 続く Copyright 2011 Takatoshi Kondo All rights reserved
    • 69/95 ATM(取引) typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::Entry> WithdrawEntry; typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::EntryByCard> WithdrawEntryByCard; typedef typename Withdrawing::template exit_pt <typename Withdraw_<AuthMethod>::Exit> WithdrawExit; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Choosing, ChooseWithdraw, WithdrawEntry, msmf::none, msmf::none >, msmf::Row < Choosing, CardDetect, WithdrawEntryByCard, msmf::none, msmf::none >, msmf::Row < WithdrawExit, msmf::none, Choosing, msmf::none, msmf::none > > {}; }; template <class AuthMethod> struct Trade:msm::back::state_machine<Trade_<AuthMethod> > {};} Copyright 2011 Takatoshi Kondo All rights reserved
    • 70/95 ATM(取引) typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::Entry> WithdrawEntry; typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::EntryByCard> WithdrawEntryByCard; typedef typename Withdrawing::template exit_pt <typename Withdraw_<AuthMethod>::Exit> WithdrawExit; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Choosing, ChooseWithdraw, WithdrawEntry, msmf::none, msmf::none >, msmf::Row < Choosing, CardDetect, WithdrawEntryByCard, msmf::none, msmf::none >, msmf::Row < WithdrawExit, msmf::none, Choosing, msmf::none, msmf::none > > {}; }; 認証を実現するテンプレート引数を伝搬 template <class AuthMethod> struct Trade:msm::back::state_machine<Trade_<AuthMethod> > {};} Copyright 2011 Takatoshi Kondo All rights reserved
    • 71/95 ATM(取引) typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::Entry> WithdrawEntry; typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::EntryByCard> WithdrawEntryByCard; typedef typename Withdrawing::template exit_pt <typename Withdraw_<AuthMethod>::Exit> WithdrawExit; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Choosing, ChooseWithdraw, WithdrawEntry, msmf::none, msmf::none >, msmf::Row < Choosing, CardDetect, WithdrawEntryByCard, msmf::none, msmf::none >, msmf::Row < WithdrawExit, msmf::none, Choosing, msmf::none, msmf::none > > {}; }; template <class AuthMethod> struct Trade:msm::back::state_machine<Trade_<AuthMethod> > {};} Copyright 2011 Takatoshi Kondo All rights reserved
    • 72/95 ATM(取引) typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::Entry> WithdrawEntry; typedef typename Withdrawing::template entry_pt<typename Withdraw_<AuthMethod>::EntryByCard> WithdrawEntryByCard; typedef typename Withdrawing::template exit_pt <typename Withdraw_<AuthMethod>::Exit> WithdrawExit; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Choosing, ChooseWithdraw, WithdrawEntry, msmf::none, msmf::none >, msmf::Row < Choosing, CardDetect, WithdrawEntryByCard, msmf::none, msmf::none >, msmf::Row < WithdrawExit, msmf::none, Choosing, msmf::none, msmf::none > > {}; }; template <class AuthMethod> struct Trade:msm::back::state_machine<Trade_<AuthMethod> > {};} Copyright 2011 Takatoshi Kondo All rights reserved
    • 73/95 ATM(引き出し)引き出しentry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_successentry_by_card アカウント情報 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 74/95entry point 疑似状態の実装 カード未挿入の場合 ATM(引き出し) 引き出し struct Entry :msm::front::entry_pseudo_state<> {}; state struct EntryByCard:msm::front::entry_pseudo_state<> {}; entry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_success entry_by_card アカウント情報 カード挿入済みの場合 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 75/95entry point 疑似状態の実装 参考 entry point疑似状態と並行状態 省略したらinitial_stateからの struct EntryA:msm::front::entry_pseudo_state<> {}; 到達で判断 struct EntryB:msm::front::entry_pseudo_state<> {}; struct EntryC:msm::front::entry_pseudo_state<> {}; struct EntryD:msm::front::entry_pseudo_state<1> {}; typedef mpl::vector<State1, entryC> initial_state; リージョン番号 リージョン0 リージョン1 State0 entryA State1 State2 E1 entryB entryC State3initial_stateを entryにすることも可能 entryD State4 Copyright 2011 Takatoshi Kondo All rights reserved
    • 76/95entry point 疑似状態の実装 参考 entry point疑似状態と並行状態 省略したらinitial_stateからの struct EntryA:msm::front::entry_pseudo_state<> {}; 到達で判断 struct EntryB:msm::front::entry_pseudo_state<> {}; struct EntryC:msm::front::entry_pseudo_state<> {}; struct EntryD:msm::front::entry_pseudo_state<1> {}; typedef mpl::vector<State1, entryC> initial_state; リージョン番号 リージョン0 State0 entryA State1 State2 E1 entryB entryC State3 entryD State4 Copyright 2011 Takatoshi Kondo All rights reserved
    • 77/95entry point 疑似状態の実装 参考 entry point疑似状態と並行状態 省略したらinitial_stateからの struct EntryA:msm::front::entry_pseudo_state<> {}; 到達で判断 struct EntryB:msm::front::entry_pseudo_state<> {}; struct EntryC:msm::front::entry_pseudo_state<> {}; struct EntryD:msm::front::entry_pseudo_state<1> {}; typedef mpl::vector<State1, entryC> initial_state; リージョン番号 リージョン1 State0 entryA State1 State2 E1 entryB entryC State3 entryD State4 Copyright 2011 Takatoshi Kondo All rights reserved
    • 78/95entry point 疑似状態の実装 参考 entry point疑似状態と並行状態 省略したらinitial_stateからの struct EntryA:msm::front::entry_pseudo_state<> {}; 到達で判断 struct EntryB:msm::front::entry_pseudo_state<> {}; struct EntryC:msm::front::entry_pseudo_state<> {}; struct EntryD:msm::front::entry_pseudo_state<1> {}; typedef mpl::vector<State1, entryC> initial_state; リージョン番号 リージョン0 リージョン1 State0 entryA State1 State2 E1 entryB entryC State3 initial_stateから 到達不可の場合、 entryD リージョン番号の State4 指定が必須 Copyright 2011 Takatoshi Kondo All rights reserved
    • 79/95パラメータ化された実装の状態への反映 ATM(引き出し) 引き出し 最上階層から伝搬させてきた template parameter entry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_success entry_by_card アカウント情報 template <class AuthMethod> StateMachine struct Withdraw_:msm::front::state_machine_def<Withdraw_<AuthMethod> > 金額入力中 { キャンセルボタン押下 entry/ 金額入力画面表示, 金額初期化 struct WithdrawAuth:AuthMethod {}; state 数字ボタン押下/ 金額更新 exit int main() client 確認ボタン押下 { 確認ボタン押下 確認ボタン押下 Atm::All<Atm::BioAuth> t; [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 ここで認証方式を差し替えられる Copyright 2011 Takatoshi Kondo All rights reserved
    • 80/95exit point 疑似状態の実装 ATM(引き出し) 伝搬イベント無し 引き出し struct Exit :msm::front::exit_pseudo_state<msmf::none> {}; state entry 認証中 カード挿入待ち include / 生体認証 entry / カード要求画面提示 カード挿入 entry exit_fail exit_success entry_by_card アカウント情報 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 exit point疑似状態 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 Copyright 2011 Takatoshi Kondo All rights reserved
    • 81/95 struct EnteringAmount:msm::front::state<>サブStateMachineからの情報の伝搬 { state template <class Event,class Fsm> ATM(引き出し) void on_entry(Event const&, Fsm&) const { } std::cout << "Input amount of money" << std::endl; 引き出し EnteringAmount():amount(0), info(0) {} int amount; AccountInfo info; stateに口座情報を持たせる }; entry 認証中struct AccountInfo { カード挿入待ち event AccountInfo(int amount_):balance(amount_) {} include / 生体認証 entry / カード要求画面提示 カード挿入 int balance;}; entry exit_fail exit_success entry_by_card 伝搬する情報 アカウント情報 eventは無いが eventとして記述 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 struct transition_table:mpl::vector< 遷移 exit // Start Event Next Action Guard msmf::Row < AuthExitSuccess, AccountInfo, EnteringAmount, SetAccountInfo, msmf::none >, 確認ボタン押下 確認ボタン押下 struct SetAccountInfo { 確認ボタン押下 action template <class Event, class Fsm, class SourceState, class TargetState> [金額 <= アカウント情報.残高] void 残高不足提示中 operator()(Event const&[else]Fsm&, SourceState&, TargetState& t) const 残高提示中 e, / 支払い, 残高更新 { entry/ 残高不足画面表示 口座情報を設定する t.info = e; entry/ 残高画面表示 } サブStateMachineからexit_successする際に自動でイベントが発生する }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 82/95 struct EnteringAmount:msm::front::state<>内部遷移の実装 { state template <class Event,class Fsm> ATM(引き出し) void on_entry(Event const&, Fsm&) const { } std::cout << "Input amount of money" << std::endl; 引き出し EnteringAmount():amount(0), info(0) {} int amount; Nextをnoneに設定すれば内部遷移となる AccountInfo info; stateに引き出し金額情報を持たせる }; entry カード挿入待ち struct EnterAmount { 認証中 event include / 生体認証 EnterAmount(int amount_):amount(amount_) {} entry / カード要求画面提示 カード挿入 int amount; }; entry exit_failstruct transition_table:mpl::vector< exit_success 遷移 // entry_by_card Start Event Next Action Guard msmf::Row < EnteringAmount, EnterAmount, msmf::none, アカウント情報 SetAmount, msmf::none >, 金額入力中 内部遷移 キャンセルボタン押下 entry/ 金額入力画面表示, 金額初期化 数字ボタン押下/ 金額更新 exitstruct SetAmount { 確認ボタン押下 action template <class Event, class Fsm, class SourceState, class TargetState> 確認ボタン押下 確認ボタン押下 void operator()(Event const& e, Fsm&, SourceState&, TargetState& t) const { [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 t.amount = e.amount; entry/ 残高不足画面表示 entry/ 残高画面表示 }}; stateが持つ情報を更新 Copyright 2011 Takatoshi Kondo All rights reserved
    • 83/95if/else分岐の実装 ATM(引き出し) 引き出し struct CheckAmount { guard template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState& s, TargetState&) const entry { 認証中 カード挿入待ち return s.amount <= s.info.balance; } include / 生体認証 entry / カード要求画面提示 カード挿入残高が足りているかをチェック }; entry exit_failstruct transition_table:mpl::vector< exit_success 遷移評価順序が下から上であることを利用 遷移 //entry_by_card Start Event Next Action Guard msmf::Row < EnteringAmount, Ok, InsufficientFunds, msmf::none, アカウント情報 msmf::none >, /*else*/ msmf::Row < EnteringAmount, Ok, DisplayingBalance, Pay, CheckAmount >, msmf::Row < EnteringAmount, EnterAmount, msmf::none, SetAmount, msmf::none >, 金額入力中 entry/ 金額入力画面表示, 金額初期化 キャンセルボタン押下 数字ボタン押下/ 金額更新 exit 確認ボタン押下 確認ボタン押下 確認ボタン押下 [金額 <= アカウント情報.残高] 残高不足提示中 [else] 残高提示中 / 支払い, 残高更新 entry/ 残高不足画面表示 entry/ 残高画面表示 if/else分岐 Copyright 2011 Takatoshi Kondo All rights reserved
    • 84/95ATM(引き出し)#include "atm_account_info.hpp"#include "atm_card_detect.hpp"namespace Atm { struct Cancel {}; struct Ok {}; struct EnterAmount { EnterAmount(int amount_):amount(amount_) {} int amount; }; template <class AuthMethod> struct Withdraw_:msm::front::state_machine_def<Withdraw_<AuthMethod> > { struct Entry :msm::front::entry_pseudo_state<> {}; struct EntryByCard:msm::front::entry_pseudo_state<> {}; struct Exit :msm::front::exit_pseudo_state<msmf::none> {}; struct WaitingCard:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Please insert your card" << std::endl; } }; struct WithdrawAuth:AuthMethod {}; struct EnteringAmount:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Input amount of money" << std::endl; } EnteringAmount():amount(0), info(0) {} int amount; AccountInfo info; }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 85/95ATM(引き出し) struct InsufficientFunds:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Insufficient Funds" << std::endl; } }; struct DisplayingBalance:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Your balance:" << balance << std::endl; } void setBalance(int balance_) { balance = balance_; } int balance; }; struct CheckAmount { template <class Event, class Fsm, class SourceState, class TargetState> bool operator()(Event const&, Fsm&, SourceState& s, TargetState&) const { return s.amount <= s.info.balance; } }; struct SetAccountInfo { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const& e, Fsm&, SourceState&, TargetState& t) const { t.info = e; } }; Copyright 2011 Takatoshi Kondo All rights reserved
    • 86/95ATM(引き出し) struct SetAmount { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const& e, Fsm&, SourceState&, TargetState& t) const { t.amount = e.amount; } }; struct Pay { template <class Event, class Fsm, class SourceState, class TargetState> void operator()(Event const&, Fsm&, SourceState& s, TargetState& t) const { t.setBalance(s.info.balance - s.amount); } }; typedef Entry initial_state; typedef typename WithdrawAuth::template entry_pt<typename AuthMethod::Derived::Entry> AuthEntry; typedef typename WithdrawAuth::template exit_pt <typename AuthMethod::Derived::ExitFail> AuthExitFail; typedef typename WithdrawAuth::template exit_pt <typename AuthMethod::Derived::ExitSuccess> AuthExitSuccess; // Transition table struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < AuthExitSuccess, AccountInfo, EnteringAmount, SetAccountInfo, msmf::none >, msmf::Row < EnteringAmount, Ok, InsufficientFunds, msmf::none, msmf::none >, /*else*/ msmf::Row < EnteringAmount, Ok, DisplayingBalance, Pay, CheckAmount >, msmf::Row < EnteringAmount, EnterAmount, msmf::none, SetAmount, msmf::none >, msmf::Row < InsufficientFunds, Ok, EnteringAmount, msmf::none, msmf::none >, msmf::Row < DisplayingBalance, Ok, Exit, msmf::none, msmf::none > > {}; }; template <class AuthMethod> struct Withdraw:msm::back::state_machine<Withdraw_<AuthMethod> > {};} Copyright 2011 Takatoshi Kondo All rights reserved
    • 87/95 entry ATM(認証)生体認証 指待ち タイムアウト entry/指要求画面提示 exit_fail 指検出 認証失敗 認証中 entry/認証中画面提示, 認証開始 認証成功(アカウント情報) exit_success アカウント情報 Copyright 2011 Takatoshi Kondo All rights reserved
    • 88/95 struct AccountInfo { eventATM(認証) entry AccountInfo(int amount_):balance(amount_) {} int balance; }; 生体認証 event struct AuthSuccess:AccountInfo { AuthSuccess(AccountInfo const& info):AccountInfo(info) {} }; 指待ち タイムアウト entry/指要求画面提示struct transition_table:mpl::vector< 遷移 exit_fail // Start Event Next Action Guard msmf::Row < Checking, AuthSuccess, ExitSuccess, msmf::none, msmf::none >, 指検出 伝搬させたい情報struct ExitSuccess :msm::front::exit_pseudo_state<AccountInfo> {}; state 認証失敗 認証中 entry/認証中画面提示, 認証開始 AuthSuccessからAccountInfoへの変換が発生する 認証成功(アカウント情報) exit_success アカウント情報 Copyright 2011 Takatoshi Kondo All rights reserved
    • 89/95ATM #include "atm_account_info.hpp" namespace Atm {(認証) struct AuthSuccess; struct AuthSuccess:AccountInfo { AuthSuccess(AccountInfo const& info):AccountInfo(info) {} }; struct AuthFail {}; struct AuthTimeout {}; struct FingerDetect {}; struct BioAuth_:msm::front::state_machine_def<BioAuth_> { struct Entry :msm::front::entry_pseudo_state<> {}; struct ExitSuccess :msm::front::exit_pseudo_state<AccountInfo> {}; struct ExitFail :msm::front::exit_pseudo_state<msmf::none> {}; struct WaitingFinger:msm::front::state<> { template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Please place your finger on the sensor" << std::endl; } }; struct Checking:msm::front::state<> { // Entry action template <class Event,class Fsm> void on_entry(Event const&, Fsm&) const { std::cout << "Now checking" << std::endl; } }; typedef Entry initial_state; struct transition_table:mpl::vector< // Start Event Next Action Guard msmf::Row < Entry, msmf::none, WaitingFinger, msmf::none, msmf::none >, msmf::Row < WaitingFinger, FingerDetect, Checking, msmf::none, msmf::none >, msmf::Row < WaitingFinger, AuthTimeout, ExitFail, msmf::none, msmf::none >, msmf::Row < Checking, AuthSuccess, ExitSuccess, msmf::none, msmf::none >, msmf::Row < Checking, AuthFail, ExitFail, msmf::none, msmf::none > > {}; }; typedef msm::back::state_machine<BioAuth_> BioAuth; } Copyright 2011 Takatoshi Kondo All rights reserved
    • 90/95 Client – int main()#include "atm_all.hpp"#include "atm_bio_auth.hpp"int main(){ Atm::All<Atm::BioAuth> t; StateMachineのインスタンス宣言・定義 t.start(); t.process_event(Atm::HumanDetect()); StateMachineの開始 t.process_event(Atm::ChooseWithdraw()); t.process_event(Atm::CardDetect()); t.process_event(Atm::FingerDetect()); t.process_event(Atm::AuthSuccess(Atm::AccountInfo(100))); t.process_event(Atm::EnterAmount(50)); initial_stateのentry actionは t.process_event(Atm::Ok()); ここで実行される t.process_event(Atm::Ok());} eventの発行 Copyright 2011 Takatoshi Kondo All rights reserved
    • 91/95 依存関係 ~include関係 Client StateMachine 共通eventmain.cpp atm_all.hpp atm_trade.hpp atm_account_info.hpp atm_card_detect.hpp atm_withdraw.hpp withdrawのサブStateMachine atm_bio_auth.hpp としてbio_authを利用しているが includeは不要 Copyright 2011 Takatoshi Kondo All rights reserved
    • 92/95 依存関係 親StateMachineを意識しない Client StateMachine 共通event main.cpp atm_all.hpp atm_trade.hpp atm_account_info.hpp atm_card_detect.hpp atm_withdraw.hpp 暗黙の依存インターフェースを意識するが、 ファイルはincludeしない 親StateMachineを意識しない atm_bio_auth.hpp 状態マシンを部品としてライブラリ的に再利用可能 フレームワークとしての利用も可能 Copyright 2011 Takatoshi Kondo All rights reserved
    • 93/95 Boost.MSMのUML2.x要素対応 StateMachine図(UML2.x)要素 Boost.MSMでの対応 初期疑似状態 Initial Pseudo State initial_state の typedef 終了状態 Final State terminate_state または、 exit_pseudo_state ジャンクション疑似状態 Junction Pseudo State 手作業で等価変換することで対応 選択疑似状態 Choice Pseudo State (普通の)state と anonymous transition + guardで対応State entry point疑似状態 Entry Point Pseudo State entry_pseudo_state exit point疑似状態 Exit Point Pseudo State exit_pseudo_state (event伝搬拡張あり) H shallow history AlwaysHistoryで対応(event限定拡張あり) H* deep history 対応予定無し UMLでの並行状態における意味が曖昧 Sub Machine State state_machine_def で対応 Copyright 2011 Takatoshi Kondo All rights reserved
    • 94/95 Boost.MSMのUML2.x要素対応 StateMachine図(UML2.x)要素 Boost.MSMでの対応 State 並行状態 initial_state の typedef を mpl::vectorとすることで対応fork entry_pseudo_state にインデックスを指定することで対応 forkノード explicit_entryによっても対応可能 join 待ち合わせ状態を作り、StateMachineにカウンタなどを joinノード 持たせることで対応可能 eventのdefer (延期) activate_deferred_events typedefの 遷移アクション Deferで対応可能 fsm.proccess_event(event)を呼び出すことで対応 Actionでの自身へのeventを発行 ※キューイング処理され、再帰が連鎖することはない Copyright 2011 Takatoshi Kondo All rights reserved
    • 95/95Boost.Msmの使い方 Copyright 2011 Takatoshi Kondo All rights reserved