From fc86381ccac10fa30aefe76996a716ae1d677f5b Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 29 Oct 2015 14:00:41 +0100 Subject: Prepare for rebar --- src/tda.erl | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/tda.erl (limited to 'src/tda.erl') 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(<>) -> + 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. -- cgit v1.2.3