summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tda.erl63
1 files changed, 25 insertions, 38 deletions
diff --git a/tda.erl b/tda.erl
index c30c1e2..2260f36 100644
--- a/tda.erl
+++ b/tda.erl
@@ -3,7 +3,6 @@
-export([associate_request/0, associate_result/1]).
-export([release_request/0, release_result/1]).
-export([associate_abort/1]).
--export([system_status/0, system_status/1]).
-export([client/0, stop/1, loop/1, start_client/0]).
-include("acse.hrl").
@@ -60,30 +59,9 @@ associate_abort(Bin) ->
{ok, Pdu} = acse:decode('ABRT-apdu', Bin),
{ok, Pdu#'ABRT-apdu'.'abort-source'}.
+% ROSE status
% <<161,12,2,1,1,2,2,0,211,48,3,10,1,2>>
% <<162,11,2,1,1,48,6,2,2,0,211,5,0>>
-system_status(Bin) ->
- case rose:decode('ROS', Bin) of
- {ok, {invoke, Invoke}} ->
- {id(Invoke), opcode(Invoke), arg(Invoke)};
- {error, Reason} -> Reason
- end.
-
-opcode(#'Invoke'{opcode = {local, Opcode}}) -> Opcode;
-opcode(Any) -> {local, Any}.
-
-id(#'Invoke'{invokeId = {present, Id}}) -> Id;
-id(Any) -> {present, Any}.
-
-arg(#'Invoke'{argument = Arg}) -> Arg.
-
-system_status() ->
- RR = #'ReturnResult_result'{opcode = {local, 211}, result = <<5,0>>},
- R = #'ReturnResult'{invokeId = {present, 1}, result = RR},
- case rose:encode('ROS', {returnResult, R}) of
- {ok, Invoke} -> Invoke;
- {error, Reason} -> Reason
- end.
start_client() ->
register(cl, spawn(?MODULE, client, [])).
@@ -118,30 +96,25 @@ decode(Sock, Msg) ->
case dispatch(Msg) of
rose ->
{ok, Rose} = rose:decode('ROS', Msg),
- rose_handler(Sock, Rose),
- io:format("ROSE> ~p~n", [Rose]);
+ io:format("ROSE> ~p~n", [Rose]),
+ rose_handler(Sock, Rose);
acse ->
{ok, Acse} = acse:decode('ACSE-apdu', Msg),
- io:format("ACSE> ~p~n", [Acse])
+ io:format("ACSE> ~p~n", [Acse]),
+ acse_handler(Sock, Acse)
end.
rose_handler(Sock, {invoke, Rose}) ->
- gen_tcp:send(Sock, invoke_handler(Rose)).
+ gen_tcp:send(Sock, invoke_handler(Rose)),
+ ok.
-invoke_handler(#'Invoke'{invokeId = {present, Id}, opcode = {local, Op}}) ->
+invoke_handler(#'Invoke'{invokeId = Id, opcode = Op}) ->
case Op of
- 211 ->
- RR = #'ReturnResult_result'{opcode = {local, Op},
- result = <<5,0>>},
- R = #'ReturnResult'{invokeId = {present, Id}, result = RR},
- case rose:encode('ROS', {returnResult, R}) of
- {ok, Invoke} -> Invoke;
- {error, Reason} -> Reason
- end
+ {_, 211} -> system_status(Id, Op)
end.
-dispatch(<<H:8,_/binary>>) ->
- case H of
+dispatch(<<Head:8,_/binary>>) ->
+ case Head of
96 -> acse;
97 -> acse;
98 -> acse;
@@ -150,3 +123,17 @@ dispatch(<<H:8,_/binary>>) ->
161 -> rose;
162 -> rose
end.
+
+system_status(Id, Op) ->
+ RR = #'ReturnResult_result'{opcode = Op, result = <<5,0>>},
+ R = #'ReturnResult'{invokeId = Id, result = RR},
+ case rose:encode('ROS', {returnResult, R}) of
+ {ok, Invoke} -> Invoke;
+ {error, Reason} -> Reason
+ end.
+
+acse_handler(Sock, {aare, Apdu}) -> ok;
+acse_handler(Sock, {aarq, Apdu}) -> ok;
+acse_handler(Sock, {rlre, _}) -> gen_tcp:close(Sock);
+acse_handler(Sock, {rlrq, _}) -> gen_tcp:close(Sock);
+acse_handler(Sock, {abrt, _}) -> gen_tcp:close(Sock).