• 事件通知

    事件通知

    通知密码锁一个按钮被按下的事件是使用 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 。