• 例子

    例子

    一个带有密码锁的门可以被看作一个FSM。初始状态下,门是锁着的。一个人无论何时按下一个按钮都会产生一个事件。取决于之前哪些按钮被按下,当前序列可能是正确的、不完整、或者错误的。

    如果是正确的,那么门会打开30秒(30000ms)。如果是不完整的,那么等待按下另一个按钮。如果是错误的,那么我们重来,等待新的按钮序列。

    使用 gen_fsm 实现的密码锁可以得到以下回调模块:

    1. -module(code_lock).
    2. -behaviour(gen_fsm).
    3.  
    4. -export([start_link/1]).
    5. -export([button/1]).
    6. -export([init/1, locked/2, open/2]).
    7.  
    8. start_link(Code) ->
    9. gen_fsm:start_link({local, code_lock}, code_lock, Code, []).
    10.  
    11. button(Digit) ->
    12. gen_fsm:send_event(code_lock, {button, Digit}).
    13.  
    14. init(Code) ->
    15. {ok, locked, {[], Code}}.
    16.  
    17. locked({button, Digit}, {SoFar, Code}) ->
    18. case [Digit|SoFar] of
    19. Code ->
    20. do_unlock(),
    21. {next_state, open, {[], Code}, 3000};
    22. Incomplete when length(Incomplete)<length(Code) ->
    23. {next_state, locked, {Incomplete, Code}};
    24. _Wrong ->
    25. {next_state, locked, {[], Code}}
    26. end.
    27.  
    28. open(timeout, State) ->
    29. do_lock(),
    30. {next_state, locked, State}.

    该代码将会在下一节中进行解释。