usb_cable: add script to generate derivative cable definitions
This commit is contained in:
parent
33458c8a13
commit
f31fd6052d
|
@ -0,0 +1,64 @@
|
|||
#!/usr/bin/env ruby
|
||||
# encoding: utf-8
|
||||
# ruby 2.6.5
|
||||
=begin
|
||||
generates USB cables definitions
|
||||
|
||||
in usb_cables.c define USB cable template as follows:
|
||||
static const uint8_t usb__a_host__b__abpower_pins[][2] = {
|
||||
{usb_a_host_pins[1], usb_b_device_pins[1]}, // VBUS
|
||||
{usb_a_host_pins[4], usb_b_device_pins[4]}, // GND
|
||||
};
|
||||
|
||||
any following variable declarations like
|
||||
static const uint8_t usb__a_device__b__abpower_pins[][2]
|
||||
will copy the array content from the first declaration and replace a_host with a_device and b with b
|
||||
|
||||
this modified C file will be written to the path provided as argument
|
||||
=end
|
||||
|
||||
class String
|
||||
# This method will return an array of MatchData's rather than the
|
||||
# array of strings returned by the vanilla `scan`.
|
||||
def match_all(regex)
|
||||
match_str = self
|
||||
match_datas = []
|
||||
while match_str.length > 0 do
|
||||
md = match_str.match(regex)
|
||||
break unless md
|
||||
match_datas << md
|
||||
match_str = md.post_match
|
||||
end
|
||||
return match_datas
|
||||
end
|
||||
end
|
||||
|
||||
# variable to process regexp
|
||||
cable_regex = /static const uint8_t (?<variable>usb__(?<connector1>\w+)__(?<connector2>\w+)__(?<name>\w+)_pins)\[\]\[2\] = (?<array>\{[^;]+\});/m
|
||||
# read C definitions file
|
||||
usb_cables_text = IO.read("usb_cables.c")
|
||||
output_text = usb_cables_text.dup
|
||||
# get all variables to process
|
||||
cables = usb_cables_text.match_all(cable_regex)
|
||||
# go through variables
|
||||
cables.each_index do |i|
|
||||
next if 0 == i
|
||||
cable = cables[i]
|
||||
# find if there was a previously matching definition
|
||||
template = cables[0, (i-1)].filter {|c| c[:name] == cable[:name]}.first
|
||||
next unless template
|
||||
puts "generate #{cable[:variable]} usng #{template[:variable]}"
|
||||
array = template[:array]
|
||||
array.gsub!(template[:connector1], cable[:connector1])
|
||||
array.gsub!(template[:connector2], cable[:connector2])
|
||||
generated = cable[0]
|
||||
generated.gsub!(cable[:array], array)
|
||||
puts generated
|
||||
puts
|
||||
output_text.gsub!(cable[0], generated)
|
||||
end
|
||||
|
||||
if ARGV[0] then
|
||||
puts "saving to #{ARGV[0]}"
|
||||
File.open(ARGV[0], "w") {|f| f.write output_text}
|
||||
end
|
Loading…
Reference in New Issue