-module(tda). -export([start/0, client/1, stop/0, decode/1]). -export([send/1, ext/0, co/0, snapshot/1]). -include("config.hrl"). -include("opcodes.hrl"). start() -> register(tdaPid, spawn(?MODULE, client, [{dial, ?HOST, ?PORT}])). stop() -> counter:stop(), tdaPid ! acse:release(). ext() -> tdaPid ! rose:invoke(?ESCAPE, escape:lines(ext)). co() -> tdaPid ! rose:invoke(?ESCAPE, escape:lines(co)). send(Reply) -> tdaPid ! Reply. snapshot(Device) -> tdaPid ! rose:invoke(?SNAPSHOT, snapshot:encode(Device)). 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", []), 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]), 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). 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]), case acse:dispatch(Acse) of error -> stop(); _ -> ok end 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.