-module(code_lock).
-behaviour(gen_fsm).
-export([send_evt/2]).
-export([create/2]).
-export([init/1, state_open/2, state_close/2]).
-record
(
cmd_data,
{
cmd = send_evt,
digit = 0
}
).
-record
(
lock_data,
{
input_buf = [],
code_buf = []
}
).
%% 输入界面
send_evt(Obj, Digit) ->
gen_fsm:send_event( Obj, #cmd_data{digit=Digit} ).
%% 初始化锁
create(Obj, Code) ->
gen_fsm:start_link({local, Obj}, code_lock, #lock_data{code_buf=Code}, []).
init( LockData ) ->
{ok, state_close, LockData }.
%% 开状态
state_open( Cmd, LockData ) ->
case Cmd of
timeout ->
io:format("state_open ~p ~n", [LockData]),
{next_state, state_close, LockData};
Default ->
TimeOut = 10000,
io:format("state_close Default ~n"),
{next_state, state_close, LockData}
end.
% 关状态 %
state_close( Cmd, LockData ) ->
Buf = LockData#lock_data.input_buf,
Code = LockData#lock_data.code_buf,
case Cmd of
#cmd_data{ digit=CurDigit } ->
TimeOut = 10000,
case Buf ++ [CurDigit] of
Code ->
io:format("Current Input: ~p ~nSucced in Unlock. ~n", [Code]),
{next_state, state_open, #lock_data{code_buf=Code}, TimeOut};
CurNums when length(CurNums)<length(Code) ->
io:format("Current Input: ~p ~n", [CurNums]),
{next_state, state_close, #lock_data{input_buf = CurNums, code_buf=Code}, TimeOut};
Default ->
io:format("Failed in Unlock. ~nCurrent Input: ~p ~n", [Default]),
{next_state, state_close, #lock_data{code_buf=Code}, TimeOut}
end;
timeout ->
io:format("Input TimeOut. Clear! ~n"),
{next_state, state_close, #lock_data{code_buf=Code}};
Default ->
TimeOut = 10000,
io:format("state_close Default ~n"),
{next_state, state_close, #lock_data{code_buf=Code}, TimeOut}
end.
Eshell V5.10.4 (abort with ^G)
1> make:all().
Recompile: code_lock
code_lock.erl:2: Warning: undefined callback function code_change/4 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function handle_event/3 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function handle_info/3 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function handle_sync_event/4 (behaviour 'gen_fsm')
code_lock.erl:2: Warning: undefined callback function terminate/3 (behaviour 'gen_fsm')
code_lock.erl:41: Warning: variable 'Default' is unused
code_lock.erl:42: Warning: variable 'TimeOut' is unused
code_lock.erl:68: Warning: variable 'Default' is unused
up_to_date
2> code_lock:create( t1, [1,2,3] ).
{ok,<0.42.0>}
3> code_lock:send_evt( t1, 1 ).
Current Input: [1]
ok
4> Input TimeOut. Clear!
4> code_lock:send_evt( t1,2 ).
Current Input: [2]
ok
5> code_lock:send_evt( t1, 1 ).
Input TimeOut. Clear!
Current Input: [1]
ok
6> Input TimeOut. Clear!
6> code_lock:send_evt( t1, 1 ).
Current Input: [1]
ok
7> code_lock:send_evt( t1, 2).
Current Input: [1,2]
ok
8> code_lock:send_evt( t1, 3).
Current Input: [1,2,3]
Succed in Unlock.
ok
9>