Created
August 19, 2016 12:36
-
-
Save makevoid/d68a4e95ba518cc84ed584afe2445f1d to your computer and use it in GitHub Desktop.
JSON time series to GIF with Image magick
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/local/bin/ruby -w | |
# installation: | |
require 'rmagick' | |
require 'json' | |
# OJ | |
include Magick | |
IMG_W = 240 | |
IMG_H = 120 | |
log = File.open "./VESC_LOG.TXT" | |
gif = ImageList.new | |
gif.new_image IMG_W, IMG_H | |
last_data = {"t" => 0} | |
def decorate(text:) | |
# text.font_family = 'helvetica' | |
text.font_family = 'Liberation Mono' | |
text.pointsize = 14 | |
text.gravity = WestGravity | |
text.kerning = 0 | |
end | |
def draw(data:, gif:) | |
d = data | |
# cont = " motor current: #{d["avgMotorCurrent"]}A \n input current: #{d["avgInputCurrent"]}A \n duty cycle: #{d["dutyCycleNow"]}% \n RPM: #{d["rpm"]} \n input voltage: #{d["inpVoltage"]}V \n consumed: #{d["ampHours"]}Ah \n charged: #{d["ampHoursCharged"]}A" | |
# \n speed: #{d["tachometer"]} \n max speed: #{d["tachometerAbs"]}" | |
rows = [] | |
rows << ["motor current: ", "#{d["avgMotorCurrent"]}A"] | |
rows << ["input current: ", "#{d["avgInputCurrent"]}A"] | |
rows << ["duty cycle: ", "#{d["dutyCycleNow"]}%"] | |
rows << ["RPM: ", "#{d["rpm"]}"] | |
rows << ["input voltage: ", "#{d["inpVoltage"]}V"] | |
rows << ["consumed: ", "#{d["ampHours"]}Ah"] | |
rows << ["charged: ", "#{d["ampHoursCharged"]}A"] | |
# table.rows << ["speed:", "#{d["tachometer"]}"] | |
# table.rows << ["max speed:", "#{d["tachometerAbs"]}"] | |
cont = rows.map{ |r| r.join(" ") }.join("\n").to_s | |
frame = Image.new IMG_W, IMG_H | |
text = Draw.new | |
decorate text: text | |
text.annotate(frame, 0, 0, 3, 3, cont) { | |
self.fill = 'gray40' | |
} | |
gif << frame | |
end | |
t = 0 | |
while true | |
t += 100 | |
if t >= last_data["t"] | |
line = log.gets | |
break if line.nil? | |
data = JSON.parse line.strip | |
draw data: data, gif: gif | |
last_data = data | |
else | |
draw data: last_data, gif: gif | |
end | |
end | |
gif.write('vesc_log.gif') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"t":3726,"avgMotorCurrent":-0.04,"avgInputCurrent":0.00,"dutyCycleNow":0.00,"rpm":0,"inpVoltage":12.50,"ampHours":0.00,"ampHoursCharged":0.00,"tachometer":3,"tachometerAbs":3} | |
{"t":3861,"avgMotorCurrent":-0.04,"avgInputCurrent":0.00,"dutyCycleNow":0.00,"rpm":0,"inpVoltage":12.50,"ampHours":0.00,"ampHoursCharged":0.00,"tachometer":3,"tachometerAbs":3} | |
{"t":3996,"avgMotorCurrent":-0.04,"avgInputCurrent":0.00,"dutyCycleNow":0.00,"rpm":0,"inpVoltage":12.50,"ampHours":0.00,"ampHoursCharged":0.00,"tachometer":3,"tachometerAbs":3} | |
{"t":491,"avgMotorCurrent":9938107.00,"avgInputCurrent":-15658230.00,"dutyCycleNow":32.07,"rpm":476977714,"inpVoltage":2373.20,"ampHours":-9614.15,"ampHoursCharged":-138981.31,"tachometer":-2070895143,"tachometerAbs":-1095942087} | |
{"t":629,"avgMotorCurrent":5369364.50,"avgInputCurrent":47511.12,"dutyCycleNow":8.19,"rpm":268435612,"inpVoltage":103.10,"ampHours":53693.64,"ampHoursCharged":0.00,"tachometer":3489536,"tachometerAbs":1054215} | |
{"t":770,"avgMotorCurrent":5369364.50,"avgInputCurrent":47511.12,"dutyCycleNow":8.19,"rpm":19,"inpVoltage":0.00,"ampHours":3.28,"ampHoursCharged":107380.73,"tachometer":65536,"tachometerAbs":1054215} | |
{"t":908,"avgMotorCurrent":5369364.50,"avgInputCurrent":47511.12,"dutyCycleNow":8.19,"rpm":19,"inpVoltage":0.00,"ampHours":1.64,"ampHoursCharged":105.42,"tachometer":-2080768,"tachometerAbs":65536} | |
{"t":1046,"avgMotorCurrent":5369364.50,"avgInputCurrent":47511.12,"dutyCycleNow":8.19,"rpm":19,"inpVoltage":0.00,"ampHours":1.64,"ampHoursCharged":105.42,"tachometer":-2080768,"tachometerAbs":65536} | |
{"t":1188,"avgMotorCurrent":5369364.50,"avgInputCurrent":47511.12,"dutyCycleNow":8.19,"rpm":19,"inpVoltage":0.00,"ampHours":3.28,"ampHoursCharged":107380.73,"tachometer":65536,"tachometerAbs":16383999} | |
{"t":10501,"avgMotorCurrent":0.00,"avgInputCurrent":687570.00,"dutyCycleNow":0.00,"rpm":1,"inpVoltage":0.00,"ampHours":0.00,"ampHoursCharged":-213935.48,"tachometer":537067520,"tachometerAbs":16190472} | |
{"t":10639,"avgMotorCurrent":5369364.50,"avgInputCurrent":47511.12,"dutyCycleNow":8.19,"rpm":19,"inpVoltage":0.00,"ampHours":3.28,"ampHoursCharged":107380.73,"tachometer":65536,"tachometerAbs":16383999} | |
{"t":10776,"avgMotorCurrent":5369364.50,"avgInputCurrent":47511.12,"dutyCycleNow":8.19,"rpm":19,"inpVoltage":0.00,"ampHours":3.28,"ampHoursCharged":107380.73,"tachometer":553126151,"tachometerAbs":537925127} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment