diff --git a/src/tools/generate_gifs.sh b/src/tools/generate_gifs.sh index 1d52815..93614d8 100755 --- a/src/tools/generate_gifs.sh +++ b/src/tools/generate_gifs.sh @@ -1,7 +1,7 @@ #!/bin/bash IP="$1" -EFFECTS=`egrep "case" ../effects.cpp | tr -s "\t" " " | cut -d" " -f 7 | sort` +EFFECTS=`./list_effects.rb $IP | sort` mkdir effects diff --git a/src/tools/list_effects.rb b/src/tools/list_effects.rb new file mode 100755 index 0000000..479f028 --- /dev/null +++ b/src/tools/list_effects.rb @@ -0,0 +1,26 @@ +#!/usr/bin/env ruby +require 'websocket-eventmachine-client' +require 'json' + +IP = ARGV[0] or raise "No IP given" +uri = "ws://#{IP}:80/ws" + +EM.run do + ws = WebSocket::EventMachine::Client.connect(uri: uri) + + ws.onopen do + ws.send "effects?" + end + + ws.onmessage do |msg, type| + if type==:text + j = JSON.parse(msg) + if j["effects"] + j["effects"].each do |effect| + puts effect + end + exit + end + end + end +end diff --git a/src/tools/monitor.rb b/src/tools/monitor.rb old mode 100644 new mode 100755 index d5a77ac..ae33182 --- a/src/tools/monitor.rb +++ b/src/tools/monitor.rb @@ -13,6 +13,7 @@ def rgb2ansi(r, g, b) end IP = ARGV[0] +EFFECT = ARGV[1] uri = "ws://#{IP}:80/ws" puts "Connecting to #{uri}..." @@ -21,31 +22,36 @@ EM.run do ws.onopen do puts "\033[2J\033[H\n Connected." - ws.send "E:blur2d" + ws.send "effect:#{EFFECT}" if EFFECT + ws.send "monitor:1" end ws.onmessage do |msg, type| - raise "Unexpected message type #{type.inspect}" if type!=:binary - data = msg.unpack("C*") - width = data.shift - height = data.shift - splitter = data.shift - raise "Unexpected value #{splitter} at index 2" unless splitter==0xFF - expected_length = width * height * 3 + 4 - raise "Unexpected message length. Expected: #{expected_length}, was: #{data.count + 3}" unless data.count + 3==expected_length - - str = "\033[H+#{"-"*width}+\n" - (0...height).each do |y| - str += "|" - (0...width).each do |x| - r, g, b = *data.shift(3) - color_code = rgb2ansi(r, g, b) - str += "\033[48;5;#{color_code}m " + if type==:binary + data = msg.unpack("C*") + width = data.shift + height = data.shift + splitter = data.shift + raise "Unexpected value #{splitter} at index 2" unless splitter==0xFF + expected_length = width * height * 3 + 4 + raise "Unexpected message length. Expected: #{expected_length}, was: #{data.count + 3}" unless data.count + 3==expected_length + + str = "\033[H+#{"-"*width}+\n" + (0...height).each do |y| + str += "|" + (0...width).each do |x| + r, g, b = *data.shift(3) + color_code = rgb2ansi(r, g, b) + str += "\033[48;5;#{color_code}m " + end + str += "\033[0m|\n" end - str += "\033[0m|\n" + str += "+#{"-"*width}+\n" + puts str + else + puts msg + exit end - str += "+#{"-"*width}+\n" - puts str end ws.onclose do |msg, reason| diff --git a/src/tools/recorder.rb b/src/tools/recorder.rb index 8a3c248..e3944b7 100755 --- a/src/tools/recorder.rb +++ b/src/tools/recorder.rb @@ -1,39 +1,19 @@ #!/usr/bin/env ruby -require 'socket' +require 'websocket-eventmachine-client' 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 +uri = "ws://#{IP}:80/ws" +puts "Connecting to #{uri}..." gif = ImageList.new last_id = 255 @@ -41,42 +21,66 @@ 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 +EM.run do + ws = WebSocket::EventMachine::Client.connect(uri: uri) + + ws.onopen do + puts "Connected." + puts "Waiting for delay..." if delay>0 + ws.send "effect:#{EFFECT}" if EFFECT + ws.send "monitor:1" 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)) + ws.onmessage do |msg, type| + if type==:binary + if delay > 0 + delay -= 1 + next + end + data = msg.unpack("C*") + width = data.shift + height = data.shift + splitter = data.shift + raise "Unexpected value #{splitter} at index 2" unless splitter==0xFF + expected_length = width * height * 3 + 4 + raise "Unexpected message length. Expected: #{expected_length}, was: #{data.count + 3}" unless data.count + 3==expected_length + + img = Image.new(width, height) + gc = Draw.new + + print "." + print "#{gif.length}" if gif.length%50==0 + (0...height).each do |y| + (0...width).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 + + if gif.length >= FRAMES + ws.close + end + else + puts "-->#{msg}" + exit end end - gc.draw(img) - img.sample!(FACTOR) - gif << img + + ws.onerror do |error| + puts "Error: #{error}" + end + + ws.onclose do |msg, reason| + puts "Disconnected." + EventMachine.stop_event_loop + end end -s.close + puts puts "Generating gif..." gif.ticks_per_second = 100