From f8e537573beadf071dd2698590be05b53120f51a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 3 Nov 2015 12:28:13 +0100 Subject: Switch to gen_server --- src/tapi.erl | 127 ++++++++++++++++++++++++----------------------------------- 1 file changed, 51 insertions(+), 76 deletions(-) (limited to 'src/tapi.erl') diff --git a/src/tapi.erl b/src/tapi.erl index 4faba65..517b7be 100644 --- a/src/tapi.erl +++ b/src/tapi.erl @@ -6,7 +6,7 @@ -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). --export([start/0, client/1, stop/0, decode/1]). +-export([login/0, logout/0]). -export([send/1, ext/0, co/0, snapshot/1, monitor/1, button/1, dial/2]). -include("config.hrl"). @@ -19,22 +19,28 @@ init(Args) -> [Host, Port] = Args, gen_tcp:connect(Host, Port, [binary, {packet, 2}], ?TIMEOUT). -handle_call({ok, Reply}, _From, Socket) -> - gen_tcp:send(Socket, Reply), - {noreply, ok, Socket}; -handle_call({tcp, Socket, Data}, _From, Socket) -> - decode(Data), - {noreply, ok, Socket}; -handle_call({tcp_closed, _}, _From, Socket) -> - {stop, closed, Socket}; handle_call(_Request, _From, State) -> {reply, ok, State}. -handle_cast(_Msg, State) -> - {noreply, State}. +handle_cast({ok, Reply}, Socket) -> + gen_tcp:send(Socket, Reply), + {noreply, Socket}. + +handle_info({tcp, _, Data}, Socket) -> + case kind(Data) of + rose -> + {ok, Rose} = rose:decode(Data), + io:format("ROSE> ~p~n", [Rose]), + rose:dispatch(Rose); + acse -> + {ok, Acse} = acse:decode(Data), + io:format("ACSE> ~p~n", [Acse]), + acse:dispatch(Acse) + end, + {noreply, Socket}; -handle_info(_Info, State) -> - {noreply, State}. +handle_info({tcp_closed, _}, Socket) -> + {stop, closed, Socket}. terminate(_Reason, State) -> gen_tcp:close(State). @@ -44,85 +50,54 @@ code_change(_OldVsn, State, _Extra) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -start() -> - register(?MODULE, spawn(?MODULE, client, [{dial, ?HOST, ?PORT}])). - -stop() -> - counter:stop(), - ?MODULE ! acse:release(). - ext() -> - ?MODULE ! rose:invoke(?ESCAPE, escape:lines(station)). + gen_server:cast(?SERVER, rose:invoke(?ESCAPE, escape:lines(station))). co() -> - ?MODULE ! rose:invoke(?ESCAPE, escape:lines(networkInterface)). + gen_server:cast(?SERVER, rose:invoke(?ESCAPE, escape:lines(networkInterface))). send(Reply) -> - ?MODULE ! Reply. + gen_server:cast(?SERVER, Reply). snapshot(Device) -> - ?MODULE ! rose:invoke(?SNAPSHOT, snapshot:encode({dialingNumber, Device})). + gen_server:cast(?SERVER, rose:invoke(?SNAPSHOT, snapshot:encode({dialingNumber, Device}))). button(Device) -> - ?MODULE ! rose:invoke(?BUTTON, button:encode({deviceNumber, Device})). + gen_server:cast(?SERVER, rose:invoke(?BUTTON, button:encode({deviceNumber, Device}))). monitor(Device) -> - ?MODULE ! rose:invoke(?MONITOR, monitor:encode({dialingNumber, Device})). + gen_server:cast(?SERVER, rose:invoke(?MONITOR, monitor:encode({dialingNumber, Device}))). dial(From, To) -> - ?MODULE ! rose:invoke(?MAKECALL, dial:encode({dialingNumber, From}, {dialingNumber, To})). - -client({dial, Host, Port}) -> - io:format("Dial ~p:~p~n", [Host, Port]), - Conn = gen_tcp:connect(Host, Port, [binary, {packet, 2}], ?TIMEOUT), - counter:start(), - client(Conn); - -client({ok, Sock}) -> - io:format("Connected~n", []), - ?MODULE ! acse:associate(), - loop(Sock); - -client({error, Reason}) -> - io:format("Error: ~p~n", [Reason]), - {error, Reason}. - -loop(Sock) -> - %inet:setopts(Sock, [{active, once}]), - receive - {ok, Reply} -> - io:format("Send ~p~n", [Reply]), - spawn(gen_tcp, send, [Sock, Reply]); - {tcp, Sock, Data} -> - io:format("Recv ~p~n", [Data]), - spawn(?MODULE, decode, [Data]); - {tcp_closed, _} -> - io:format("Connection closed~n", []), - exit(closed) - after ?TIMEOUT -> - io:format("Connection timed out~n", []), - exit(timeout) - end, - loop(Sock). + gen_server:cast(?SERVER, rose:invoke(?MAKECALL, dial:encode({dialingNumber, From}, {dialingNumber, To}))). -decode(Data) -> - case kind(Data) of - rose -> - {ok, Rose} = rose:decode(Data), - io:format("ROSE> ~p~n", [Rose]), - rose:dispatch(Rose); - acse -> - {ok, Acse} = acse:decode(Data), - io:format("ACSE> ~p~n", [Acse]), - case acse:dispatch(Acse) of - error -> - stop(); - _ -> - ok - end - end. +login() -> + gen_server:cast(?SERVER, acse:associate()). + +logout() -> + gen_server:cast(?SERVER, acse:release()). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kind(<>) -> proplists:get_value(Head, [{96, acse}, {97, acse}, {98, acse}, {99, acse}, {100, acse}, {161, rose}, {162, rose}, {163, rose}, {164, rose}]). + +%loop(Sock) -> +% %inet:setopts(Sock, [{active, once}]), +% receive +% {ok, Reply} -> +% io:format("Send ~p~n", [Reply]), +% spawn(gen_tcp, send, [Sock, Reply]); +% {tcp, Sock, Data} -> +% io:format("Recv ~p~n", [Data]), +% spawn(?MODULE, decode, [Data]); +% {tcp_closed, _} -> +% io:format("Connection closed~n", []), +% exit(closed) +% after ?TIMEOUT -> +% io:format("Connection timed out~n", []), +% exit(timeout) +% end, +% loop(Sock). -- cgit v1.2.3