Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@makevoid
Created August 19, 2016 12:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save makevoid/d68a4e95ba518cc84ed584afe2445f1d to your computer and use it in GitHub Desktop.
Save makevoid/d68a4e95ba518cc84ed584afe2445f1d to your computer and use it in GitHub Desktop.
JSON time series to GIF with Image magick
#! /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')
{"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