- 事件通知
事件通知
通知密码锁一个按钮被按下的事件是使用 gen_fsm:send_event/2 来实现的:
- button(Digit) ->
- gen_fsm:send_event(code_lock, {button, Digit}).
code_lock 是gen_fsm的名字并且必须与启动时候所使用的名字一致。{button,Digit}是实际的事件。
事件被做为消息发送给gen_fsm。当gen_fsm收到这个事件的时候,就会调用StateName( Event, StateData ),该函数需要返回一个元组{ next_state, StateName1, StateData1}. StateName是当前状态的名字,而StateName1是要转到的下一个状态的名字。StateData1是gen_fsm的状态数据的新的值。
- locked({button, Digit}, {SoFar, Code}) ->
- case [Digit|SoFar] of
- Code ->
- do_unlock(),
- {next_state, open, {[], Code}, 30000};
- 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}.
如果门是锁着的,且按下了按钮,那么,到目前位置所有的按钮序列就会与密码锁正确的密码进行比较,然后根据比较的结果,要么门是解锁了gen_fsm进入打开的状态 open ,或者是仍然是处于锁着的状态 locked 。