ir-cock-grenade/usb ir toy/decode.rb

93 lines
2.0 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# encoding: UTF-8
# tested with ruby 1.9.1 and 1.9.3
# decode milestag II message recorded by ir.rb
UNIT = 21.3333 # ir burst unit, in µs
# verify command parameters
raise "provide a IR record file to parse" if ARGV.size!=1
# read file
file = File.open(ARGV[0],"r")
# parse ticks in IR packets
ir_packets = []
packet = []
while data = file.read(2) do
# one IR packet
burst = data.unpack('n')[0]
if burst==0xffff then
# create next packet
packet << 1 # trailing space
ir_packets << packet
packet = []
else
# decode tick
burst *= UNIT
# the number of ticks (a tick = 600µs)
tick = (burst/600.0).round
packet << tick
end
end
puts "got #{ir_packets.size} IR packets"
puts ir_packets*" "
# decode ticks in bits
bit_packets = []
ir_packets.each do |ir_packet|
bit_packet = []
header = false
space = false
ir_packet.each do |ir|
# wait for header
if ir==4 then
if bit_packet.size>0 then
bit_packets << bit_packet
bit_packet = []
end
header = true
space = true
else
next unless header
if space then
space = false
next
else
if ir==1 or ir==2 then
bit_packet<<(ir-1)
space = true
else
puts "broken burst"
header = false
end
end
end
end
bit_packets << bit_packet
end
puts "got #{bit_packets.size} bit packets"
puts bit_packets*" "
# parse bit packet
bit_packets.each do |bit_packet|
if bit_packet[0]==0 then
# shot packet
if bit_packet.size!=14 then
puts "broken shot packet"
else
player = (bit_packet[1,7]*"").to_i(2)
team = (bit_packet[8,2]*"").to_i(2)
damage = (bit_packet[10,4]*"").to_i(2)
puts "shot: player=#{player}, team=#{team}, damage=#{damage}"
end
else
# control packet
if bit_packet.size%8!=0 then
puts "broken control packet"
else
data = (bit_packet*"").to_i(2).to_s(16).rjust(bit_packet.size/4,"0")
puts "control packet: 0x#{data}"
end
end
end