例子
一个带有密码锁的门可以被看作一个FSM。初始状态下,门是锁着的。一个人无论何时按下一个按钮都会产生一个事件。取决于之前哪些按钮被按下,当前序列可能是正确的、不完整、或者错误的。
如果是正确的,那么门会打开30秒(30000ms)。如果是不完整的,那么等待按下另一个按钮。如果是错误的,那么我们重来,等待新的按钮序列。
使用 gen_fsm 实现的密码锁可以得到以下回调模块:
- -module(code_lock).
- -behaviour(gen_fsm).
- -export([start_link/1]).
- -export([button/1]).
- -export([init/1, locked/2, open/2]).
- start_link(Code) ->
- gen_fsm:start_link({local, code_lock}, code_lock, Code, []).
- button(Digit) ->
- gen_fsm:send_event(code_lock, {button, Digit}).
- init(Code) ->
- {ok, locked, {[], Code}}.
- locked({button, Digit}, {SoFar, Code}) ->
- case [Digit|SoFar] of
- Code ->
- do_unlock(),
- {next_state, open, {[], Code}, 3000};
- Incomplete when length(Incomplete)<length(Code) ->
- {next_state, locked, {Incomplete, Code}};
- _Wrong ->
- {next_state, locked, {[], Code}}
- end.
- open(timeout, State) ->
- do_lock(),
- {next_state, locked, State}.
该代码将会在下一节中进行解释。
当前内容版权归 ShiningRay 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 ShiningRay .