事件通知

通知密码锁一个按钮被按下的事件是使用 gen_fsm:send_event/2 来实现的:

  1. button(Digit) ->
  2. 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的状态数据的新的值。

  1. locked({button, Digit}, {SoFar, Code}) ->
  2. case [Digit|SoFar] of
  3. Code ->
  4. do_unlock(),
  5. {next_state, open, {[], Code}, 30000};
  6. Incomplete when length(Incomplete)<length(Code) ->
  7. {next_state, locked, {Incomplete, Code}};
  8. _Wrong ->
  9. {next_state, locked, {[], Code}};
  10. end.
  11.  
  12. open(timeout, State) ->
  13. do_lock(),
  14. {next_state, locked, State}.

如果门是锁着的,且按下了按钮,那么,到目前位置所有的按钮序列就会与密码锁正确的密码进行比较,然后根据比较的结果,要么门是解锁了gen_fsm进入打开的状态 open ,或者是仍然是处于锁着的状态 locked 。