summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-11-03 12:28:13 +0100
committerDimitri Sokolyuk <demon@dim13.org>2015-11-03 12:28:13 +0100
commitf8e537573beadf071dd2698590be05b53120f51a (patch)
treeec65af5af979aeb04342622d429d2f276c859f47
parent4de202651fdd7a62eb76716f00cfc6e85a2400a9 (diff)
Switch to gen_server
-rw-r--r--src/counter.erl41
-rw-r--r--src/tapi.erl127
2 files changed, 59 insertions, 109 deletions
diff --git a/src/counter.erl b/src/counter.erl
index 4f4b3f1..2444ce0 100644
--- a/src/counter.erl
+++ b/src/counter.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, counter/0, next/0, set/1, stop/0]).
+-export([next/0, get/0, set/1]).
-define(MAXCOUNT, 32767).
@@ -23,7 +23,7 @@ handle_call(next, _From, N) ->
handle_call(get, _From, N) ->
{reply, N, N};
handle_call({set, N}, _From, _N) ->
- {reply, N, N}.
+ {reply, ok, N}.
handle_cast(_Msg, State) ->
{noreply, State}.
@@ -39,38 +39,13 @@ code_change(_OldVsn, State, _Extra) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-start() ->
- register(?MODULE, spawn_link(?MODULE, counter, [])).
-
-counter() ->
- process_flag(trap_exit, true),
- count(0).
-
-count(N) when N > ?MAXCOUNT ->
- count(0);
-
-count(N) ->
- receive
- {next, FromPID} ->
- FromPID ! {next, N},
- count(N+1);
- {set, New} ->
- count(New);
- {'EXIT', Pid, Reason} ->
- io:format("~p: ~p~n", [Pid, Reason]),
- exit(normal);
- {stop} ->
- exit(normal)
- end.
-
set({present, N}) ->
- ?MODULE ! {set, N+1}.
+ gen_server:call(?SERVER, {set, N}).
next() ->
- ?MODULE ! {next, self()},
- receive
- {next, N} -> {present, N}
- end.
+ N = gen_server:call(?SERVER, next),
+ {present, N}.
-stop() ->
- ?MODULE ! {stop}.
+get() ->
+ N = gen_server:call(?SERVER, gete),
+ {present, N}.
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(<<Head:8,_/binary>>) ->
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).