Skip to content

Instantly share code, notes, and snippets.

@asbkar
Created June 23, 2010 07:16
Show Gist options
  • Save asbkar/449598 to your computer and use it in GitHub Desktop.
Save asbkar/449598 to your computer and use it in GitHub Desktop.
Erlang program to control my Onkyo receiver
-module(iscp).
-author('Karl Erik Asbjørnsen <karl@asbjornsen.org>').
-define(IP, "10.0.0.222").
-define(PORT, 60128).
-define(ISCP_PREFIX, ["ISCP",0,0,0,16,0,0,0]).
-define(ISCP_MIDDLE, [1,0,0,0,"!1"]).
-define(END, 13).
-export([recv/1, start/0, m2/0]).
start() ->
register(iscpm, spawn(iscp, m2, [])),
register(iscphandler, spawn(iscpreceiver, start, [])),
iscpm ! {iscp, "PWRQSTN"},
iscpm ! {iscp, "MVLQSTN"}.
m2() ->
{ok,Sock} = gen_tcp:connect(?IP, ?PORT, [{active,true}, binary, {packet,raw}]),
recv(Sock).
recv(Sock) ->
receive
{iscp, Payload} ->
send(Sock, Payload),
iscp:recv(Sock);
{tcp, Sock, Response} ->
iscphandler ! {iscp, Response},
iscp:recv(Sock);
up ->
send(Sock, "MVLUP"),
recv(Sock);
down ->
send(Sock, "MVLDOWN"),
recv(Sock);
stopp ->
gen_tcp:close(Sock),
io:format("Baibai!~n");
{tcp_error, Sock, Reason} ->
io:format("Socket failed: ~w~n", Reason);
{tcp_closed, Sock} ->
io:format("Socket ~w closed [~w]~n",[Sock,self()]);
Other ->
io:format("Fikk ukjent melding: ~w~n", [Other]),
recv(Sock)
end.
send(Sock, Payload) ->
Length = length(Payload) + 3,
gen_tcp:send(Sock, [?ISCP_PREFIX,Length,?ISCP_MIDDLE, Payload, ?END]).
-module(iscpreceiver).
-author('Karl Erik Asbjørnsen <karl@asbjornsen.org>').
-export([start/0]).
-export([receiver/1]).
start() ->
iscpreceiver:receiver([]).
receiver(Receivers) ->
receive
{iscp, IscpMessage} ->
Payload = decode(IscpMessage),
{{Year,Month,Day},{Hour,Minute,Second}} = erlang:localtime(),
io:format("~p.~p.~p ~p:~p:~p ~p~n", [Day, Month, Year, Hour, Minute, Second, Payload]),
lists:foreach(fun(Pid) -> Pid ! {iscp, Payload} end, Receivers),
iscpreceiver:receiver(Receivers);
{register, From} ->
io:format("Registrert ny mottaker ~w~n", [From]),
link(From),
iscpreceiver:receiver([From|Receivers]);
Other -> io:format("iscpreceiver fikk ukjent melding: ~p~n", [Other])
end.
decode(Message) ->
IscpMessage = binary_to_list(Message),
Payload = lists:sublist(IscpMessage, 19, sizeof(IscpMessage)-5),
{Type, Value} = lists:split(3, Payload),
if
Type == "MVL" ->
Volum = httpd_util:hexlist_to_integer(Value),
{Type, Volum};
true ->
{Type, Value}
end.
sizeof(IscpMessage) ->
lists:nth(12, IscpMessage).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment