例子

一个带有密码锁的门可以被看作一个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}.

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