-module(tapi). -behaviour(gen_server). -define(SERVER, ?MODULE). -export([start_link/0]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). -export([login/0, logout/0]). -export([send/1, ext/0, co/0, snapshot/1, monitor/1, button/1, dial/2]). -include("config.hrl"). -include("opcodes.hrl"). start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [?HOST, ?PORT], []). init(Args) -> [Host, Port] = Args, gen_tcp:connect(Host, Port, [binary, {packet, 2}], ?TIMEOUT). handle_call(_Request, _From, State) -> {reply, ok, 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({tcp_closed, _}, Socket) -> {stop, closed, Socket}. terminate(_Reason, State) -> gen_tcp:close(State). code_change(_OldVsn, State, _Extra) -> {ok, State}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ext() -> gen_server:cast(?SERVER, rose:invoke(?ESCAPE, escape:lines(station))). co() -> gen_server:cast(?SERVER, rose:invoke(?ESCAPE, escape:lines(networkInterface))). send(Reply) -> gen_server:cast(?SERVER, Reply). snapshot(Device) -> gen_server:cast(?SERVER, rose:invoke(?SNAPSHOT, snapshot:encode({dialingNumber, Device}))). button(Device) -> gen_server:cast(?SERVER, rose:invoke(?BUTTON, button:encode({deviceNumber, Device}))). monitor(Device) -> gen_server:cast(?SERVER, rose:invoke(?MONITOR, monitor:encode({dialingNumber, Device}))). dial(From, To) -> gen_server:cast(?SERVER, rose:invoke(?MAKECALL, dial:encode({dialingNumber, From}, {dialingNumber, To}))). 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).