Skip to content

Instantly share code, notes, and snippets.

@careo
Created May 7, 2009 15:06
Show Gist options
  • Select an option

  • Save careo/108146 to your computer and use it in GitHub Desktop.

Select an option

Save careo/108146 to your computer and use it in GitHub Desktop.
-module(xplane).
-compile(export_all).
start() ->
{ok, Socket} = gen_udp:open(48000,[binary]),
%receive
% after 1000 ->
% control_throttle(Socket)
%end,
loop(Socket,1).
loop(Socket,Count) ->
io:format("~p~n",[Count]),
receive
{udp, Socket, IP, InPortNo, Packet} when Count > 0 ->
print_packet(Socket,IP,InPortNo,Packet),
control_throttle(Socket),
loop(Socket, Count -1)
after 1000 ->
gen_udp:close(Socket),
exit(done)
end.
print_packet(Socket,IP,InPortNo,Packet) ->
io:format("Socket: ~p~n",[Socket]),
io:format("IP: ~p~n",[IP]),
io:format("InPortNo: ~p~n",[InPortNo]),
io:format("Packet: ~p~n",[Packet]),
io:format(" ~p~n",[parse_packet(Packet)]).
parse_packet(<<"DATA",_:1/binary, DataSets/binary>>) ->
parse_datasets(DataSets).
parse_datasets(DataSets) ->
parse_datasets(DataSets,[]).
parse_datasets(<<DataSet:36/binary,Rest/binary>>,Acc) ->
parse_datasets(Rest,[parse_dataset(DataSet) | Acc]);
parse_datasets(<<>>,Acc) ->
lists:reverse(Acc).
parse_dataset(<<DataSet/integer,_:3/binary,ValuesBlock:32/binary>>) ->
{DataSet,parse_values(ValuesBlock)}.
parse_values(Values) ->
parse_values(Values,[]).
parse_values(<<Value:32/native-float,Rest/binary>>,Acc) ->
parse_values(Rest,[Value | Acc]);
parse_values(<<>>,Acc) ->
lists:reverse(Acc).
control_throttle(Socket) ->
gen_udp:send(Socket,"127.0.0.1",49000,override_packet()),
gen_udp:send(Socket,"127.0.0.1",49000,throttle_packet()).
override_packet() ->
DataRef = <<"sim/operation/override/override_throttles">>,
Value = 1.0,
Packet = <<"DREF",0,Value:32/native-float,DataRef/binary>>,
io:format("Sending: ~p~n",[Packet]),
Padding = 8 * (509 - size(Packet)),
<<Packet/binary,0:Padding>>.
throttle_packet() ->
DataRef = <<"sim/flightmodel/engine/ENGN_thro_override">>,
Value = 0.5,
Packet = <<"DREF",0,Value:32/native-float,DataRef/binary>>,
io:format("Sending: ~p~n",[Packet]),
Padding = 8 * (509 - size(Packet)),
<<Packet/binary,0:Padding>>.
require 'pp'
require 'rubygems'
require 'eventmachine'
module XplaneServer
def post_init
end
def data_struct
"l f8"
end
def pack_str
"a4 C #{data_struct} a*" # message internal-index data-index 8-floats other
end
def receive_data data
# unpacks the first element. further unpack(data_struct) calls will grab each additional
unpacked = data.unpack(pack_str) #.last.unpack("l f8")
p unpacked
# override throttle control
dataref = "sim/operation/override/override_throttles"
d = dataref.unpack("C*")
(500 - d.size).times do |i|
dataref << "\000"
end
datagram = ["DREF", 0,1.0,dataref.unpack("C*")].flatten.pack("a4 C f C*")
send_datagram datagram, '127.0.0.1', 49000
# set my own throttle override
dataref = "sim/flightmodel/engine/ENGN_thro_override"
d = dataref.unpack("C*")
(500 - d.size).times do |i|
dataref << "\000"
end
datagram = ["DREF", 0,0.5,dataref.unpack("C*")].flatten.pack("a4 C f C*")
send_datagram datagram, '127.0.0.1', 49000
# try to get a dump the throttle override
#dataref = "sim/network/dataout/data_to_internet"
#d = dataref.unpack("C*")
#(301 - d.size).times do |i|
# dataref << "\000"
#end
#c = "sim/flightmodel/engine/ENGN_thro_override"
#(200 - c.size).times do |i|
# c << "\000"
#end
#c.unpack("C*")
#datagram = ["DREF", 0,c.unpack("C*"),dataref.unpack("C*")].flatten.pack("a4 C200 f C*")
#send_datagram datagram, '127.0.0.1', 49000
end
end
EM.run {
EM.open_datagram_socket('127.0.0.1', 48000, XplaneServer)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment