88 lines
2.1 KiB
Erlang
88 lines
2.1 KiB
Erlang
|
|
%%----------------------------------------------------
|
||
|
|
%% {{desc}}
|
||
|
|
%%
|
||
|
|
%% @author {{author}}
|
||
|
|
%%----------------------------------------------------
|
||
|
|
-module({{mod}}).
|
||
|
|
-behaviour(gen_fsm).
|
||
|
|
-export(
|
||
|
|
[
|
||
|
|
info/2
|
||
|
|
,cast/2
|
||
|
|
,call/2
|
||
|
|
,start_link/1
|
||
|
|
]
|
||
|
|
).
|
||
|
|
-export([init/1, handle_event/3, handle_sync_event/4, handle_info/3, terminate/3, code_change/4]).
|
||
|
|
-export([idle/2]).
|
||
|
|
-record(state, {
|
||
|
|
ts = 0
|
||
|
|
,timeout = 0
|
||
|
|
,switch = open
|
||
|
|
}).
|
||
|
|
-include("common.hrl").
|
||
|
|
-include("role.hrl").
|
||
|
|
|
||
|
|
%% @doc INFO信息请求
|
||
|
|
info(Pid, Info) ->
|
||
|
|
Pid ! Info.
|
||
|
|
|
||
|
|
%% @doc cast异步请求
|
||
|
|
cast(Pid, Event) ->
|
||
|
|
gen_fsm:send_all_state_event(Pid, Event).
|
||
|
|
|
||
|
|
%% @doc call同步请求
|
||
|
|
call(Pid, Event) ->
|
||
|
|
?GFCALL(Pid, Event).
|
||
|
|
|
||
|
|
start_link(D)->
|
||
|
|
gen_fsm:start_link(?MODULE, [D], []).
|
||
|
|
|
||
|
|
init([D])->
|
||
|
|
?INFO("开始启动"),
|
||
|
|
process_flag(trap_exit, true),
|
||
|
|
IdelTimeout = 86400000,
|
||
|
|
State = #state{ts = date:now(), timeout = IdelTimeout},
|
||
|
|
?INFO("启动完成"),
|
||
|
|
{ok, idle, State, IdelTimeout}.
|
||
|
|
|
||
|
|
handle_event(_Event, StateName, State) ->
|
||
|
|
continue(StateName, State).
|
||
|
|
|
||
|
|
handle_sync_event(_Event, _From, StateName, State) ->
|
||
|
|
Reply = ok,
|
||
|
|
continue(StateName, Reply, State).
|
||
|
|
|
||
|
|
%% 开始控制
|
||
|
|
handle_info({switch, S}, StateName, State) when S =:= open orelse S =:= close ->
|
||
|
|
continue(StateName, State#state{switch = S});
|
||
|
|
|
||
|
|
handle_info(_Info, StateName, State) ->
|
||
|
|
continue(StateName, State).
|
||
|
|
|
||
|
|
terminate(_Reason, _StateName, _State) ->
|
||
|
|
?INFO("开始关闭"),
|
||
|
|
?INFO("关闭完成"),
|
||
|
|
ok.
|
||
|
|
|
||
|
|
code_change(_OldVsn, StateName, State, _Extra) ->
|
||
|
|
{ok, StateName, State}.
|
||
|
|
%%--------------------------------------------
|
||
|
|
%% 状态变化
|
||
|
|
%%--------------------------------------------
|
||
|
|
|
||
|
|
%% 继续下一个状态
|
||
|
|
continue(StateName, State = #state{ts = Ts, timeout = Timeout}) ->
|
||
|
|
{next_state, StateName, State, date:time_left(Timeout, Ts)}.
|
||
|
|
|
||
|
|
continue(StateName, Reply, State = #state{ts = Ts, timeout = Timeout}) ->
|
||
|
|
{reply, Reply, StateName, State, date:time_left(Timeout, Ts)}.
|
||
|
|
|
||
|
|
%% 空闲
|
||
|
|
idle(timeout, State) ->
|
||
|
|
continue(idle, State#state{ts = date:now()});
|
||
|
|
idle(_Any, State) ->
|
||
|
|
continue(idle, State).
|
||
|
|
|
||
|
|
|