summaryrefslogtreecommitdiff
path: root/src/tda.erl
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-10-29 14:00:41 +0100
committerDimitri Sokolyuk <demon@dim13.org>2015-10-29 14:00:41 +0100
commitfc86381ccac10fa30aefe76996a716ae1d677f5b (patch)
treec7a0c6c2ab9ab0c254bdb01088c2aad3119ff277 /src/tda.erl
parentb9697094228db7832e75a8699a2678338f7c7c22 (diff)
Prepare for rebar
Diffstat (limited to 'src/tda.erl')
-rw-r--r--src/tda.erl89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/tda.erl b/src/tda.erl
new file mode 100644
index 0000000..0798365
--- /dev/null
+++ b/src/tda.erl
@@ -0,0 +1,89 @@
+-module(tda).
+
+-export([start/0, client/1, stop/0]).
+-export([ext/0, co/0, snapshot/1]).
+
+-define(TIMEOUT, 300000).
+-define(CONNECT_TIMEOUT, 3000).
+-define(HOST, "192.168.240.20").
+-define(PORT, 33333).
+
+start() ->
+ register(tdaPid, spawn(?MODULE, client, [{dial, ?HOST, ?PORT}])).
+
+stop() ->
+ counter:stop(),
+ tdaPid ! acse:release().
+
+ext() ->
+ tdaPid ! rose:invoke({local, 51}, csta:lines(ext)).
+
+co() ->
+ tdaPid ! rose:invoke({local, 51}, csta:lines(co)).
+
+snapshot(Device) ->
+ tdaPid ! rose:invoke({local, 74}, csta:snapshot(Device)).
+
+client({dial, Host, Port}) ->
+ io:format("Dial ~p:~p~n", [Host, Port]),
+ Conn = gen_tcp:connect(Host, Port,
+ [binary, {active, once}, {packet, 2}],
+ ?CONNECT_TIMEOUT),
+ counter:start(),
+ client(Conn);
+
+client({ok, Sock}) ->
+ io:format("Connected~n", []),
+ tdaPid ! 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]),
+ gen_tcp:send(Sock, Reply);
+ {tcp, Sock, Data} ->
+ %io:format("Got ~p~n", [Data]),
+ case decode(Data) of
+ {ok, Reply} -> tdaPid ! {ok, Reply};
+ ok -> ok;
+ error -> exit(error)
+ end;
+ {tcp_closed, _} ->
+ io:format("Connection closed~n", []),
+ exit(closed)
+ after ?TIMEOUT ->
+ io:format("Connection timed out~n", []),
+ exit(timeout)
+ end,
+ loop(Sock).
+
+decode(Data) ->
+ case dispatch(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.
+
+dispatch(<<Head:8,_/binary>>) ->
+ case Head of
+ 96 -> acse; % aarq
+ 97 -> acse; % aare
+ 98 -> acse; % rlrq
+ 99 -> acse; % rlre
+ 100 -> acse; % abrt
+ 161 -> rose; % invoke
+ 162 -> rose; % returnResult
+ 163 -> rose; % returnError
+ 164 -> rose % reject
+ end.