87 lines
1.7 KiB
Ruby
Executable File
87 lines
1.7 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
require 'socket'
|
|
require 'pp'
|
|
require 'rmagick'
|
|
|
|
include Magick
|
|
|
|
IP = ARGV[0]
|
|
PORT = 2122
|
|
FILE = ARGV[1] or raise "No filename given"
|
|
EFFECT = ARGV[2]
|
|
FRAMES = 125
|
|
FACTOR = 2
|
|
delay = 50
|
|
|
|
puts "Connecting to #{IP}:#{PORT}..."
|
|
|
|
s = TCPSocket.new(IP, PORT)
|
|
|
|
puts "Connected."
|
|
init = s.recv(3).unpack("C*")
|
|
|
|
raise "Initial data packet wasn't usable!" if init[2] != 0xFF
|
|
puts "Got initial data packet."
|
|
|
|
dim_x, dim_y = *init
|
|
len = dim_x * dim_y * 3 + 3
|
|
|
|
puts "Size: #{dim_x}x#{dim_y}. Expecting packet length #{len}."
|
|
|
|
puts "Opening local UDP socket..."
|
|
udp = UDPSocket.new
|
|
udp.bind("10.10.2.1", 13330)
|
|
puts "Waiting for UDP packets on port 13330..."
|
|
s.sendmsg("P\x12\x34\x00")
|
|
s.sendmsg("E#{EFFECT}\x00") if EFFECT
|
|
|
|
gif = ImageList.new
|
|
last_id = 255
|
|
last_frame_time = nil
|
|
img = nil
|
|
last_diff = nil
|
|
|
|
while gif.length < FRAMES do
|
|
data = udp.recvfrom(1024)[0].unpack("C*")
|
|
if delay > 0
|
|
delay -= 1
|
|
next
|
|
end
|
|
#puts "Packet. ID: #{data[0]}, length: #{data.length}"
|
|
raise "Unexpected packet length" unless data.count == len
|
|
raise "Invalid data packet" unless data[len - 1]==0xFF
|
|
|
|
id = data.shift << 8 | data.shift
|
|
if last_id != id-1 && last_id != id-2
|
|
puts "Skipped from #{last_id} to #{id}."
|
|
gif = ImageList.new
|
|
end
|
|
last_id = id
|
|
|
|
img = Image.new(dim_x, dim_y)
|
|
gc = Draw.new
|
|
|
|
#next
|
|
print "."
|
|
print "#{gif.length}" if gif.length%50==0
|
|
(0...dim_y).each do |y|
|
|
(0...dim_x).each do |x|
|
|
r, g, b = *data.shift(3)
|
|
gc.fill("rgb(#{r}, #{g}, #{b})")
|
|
gc.point(x, y)
|
|
#img.pixel_color(x, y, Pixel.new(r, g, b, 255))
|
|
end
|
|
end
|
|
gc.draw(img)
|
|
img.sample!(FACTOR)
|
|
gif << img
|
|
end
|
|
s.close
|
|
puts
|
|
puts "Generating gif..."
|
|
gif.ticks_per_second = 100
|
|
gif.delay = 4
|
|
gif.write(FILE)
|
|
puts
|
|
puts
|