gen_fsm

 

gen_fsm module                    Callback module
--------------                    ---------------
gen_fsm:start_link                -----> Module:init/1
gen_fsm:send_event                -----> Module:StateName/2
gen_fsm:send_all_state_event      -----> Module:handle_event/3
gen_fsm:sync_send_event           -----> Module:StateName/3
gen_fsm:sync_send_all_state_event -----> Module:handle_sync_event/4
-                                 -----> Module:handle_info/3
-                                 -----> Module:terminate/3
-                                 -----> Module:code_change/4
上面这东西太重要了,刚才没有看,直接进入代码。所以误以为 sync_send_event 会条用handle_event 导致错误百出



-module(code_lock).
-behaviour(gen_fsm).
-export([start_link/1]).
-export([button/1,sync_button/1]).
-export([init/1, locked/3, locked/2, open/2,stop/0,terminate/2,handle_event/3,handle_sync_event/4]).
start_link(Code) ->
    io:format("In ~p,on ~p line start....~n",[?MODULE,?LINE]),
    gen_fsm:start_link({local, code_lock}, ?MODULE, Code, []).
stop()->
    gen_fsm:send_all_state_event(code_lock, stop).
handle_event(code,stop,StateData)->
    ok.
button(Digit) ->
    io:format("In ~p,on ~p line button....~n",[?MODULE,?LINE]),
    gen_fsm:send_event(code_lock, {button, Digit}).
sync_button(Digit) ->
    io:format("In ~p,on ~p line button....~n",[?MODULE,?LINE]),
    gen_fsm:sync_send_event(code_lock, {button, Digit}).
    %gen_fsm:sync_send_all_state_event(code_lock, {button1, Digit}).

init(Code) ->
    io:format("In ~p,on ~p line init....~n",[?MODULE,?LINE]),
    {ok, locked, {[], Code}}.
    %{ok, handle_sync_event, {[], Code}}.
handle_sync_event({button,Digit}, From, StateName, State) ->
    io:format("In ~p,on ~p line locked.StateName=~p,State=~p,~n",[?MODULE,?LINE,StateName,State]),
    {reply,reply,StateName,State}.
locked({button, Digit}, From, State) ->
    io:format("In ~p,on ~p line locked....,SoFar=~p,Code=~p,~n",[?MODULE,?LINE,From, State]),
    gen_fsm:reply(From, rrrrrrrrr),
    {next_state,locked,State}.
locked({button, Digit}, {SoFar, Code}) ->
    io:format("In ~p,on ~p line locked....,SoFar=~p,Code=~p,~n",[?MODULE,?LINE,SoFar,Code]),

%%    case [Digit|SoFar] of
%        Incomplete when length(Incomplete)<length(Code) ->
%            {next_state, locked, {Incomplete, Code}};
%        Code ->
            do_unlock(),
%            {next_state, open, {[], Code}, 3000};
%        _Wrong ->
%            {next_state, locked, {[], Code}}
            {next_state, open, {[], Code}, 3000}.
    %%end.
open(timeout, State) ->
    do_lock(),
    {next_state, locked, State}.
do_unlock()->
    io:format("do_unlock~n").
do_lock()->
    io:format("do_lock~n").
terminate(Rease,State)->
    io:format("terminate Rase=~p,State =~p ~n",[Rease,State]).
 运行结果 16> code_lock:start_link(12). In code_lock,on 7 line start.... {error,{already_started,<0.68.0>}} 17> code_lock:sync_button(12). In code_lock,on 17 line button.... In code_lock,on 29 line locked....,SoFar={<0.61.0>,#Ref<0.0.0.490>},Code={[], 12}, rrrrrrrrr 18> 正确返回了rrrrrrrr

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值