class GdbFlasher::IHex

Attributes

segments[RW]

Public Class Methods

load(stream) click to toggle source
# File lib/gdbflasher/ihex.rb, line 117
def self.load(stream)
  high_address = 0
  lines = {}

  stream.each_line do |line|
    line.rstrip!

    record = Record.parse line

    case record.type
    when :eof
      break

    when :extended_address
      high_address, = record.data.unpack "n"

    when :data
      lines[(high_address << 16) | record.address] = record.data
    end
  end

  segment = nil
  ihex = self.new

  lines.sort_by { |k1,v1,k2,b2| k1 <=> k2 }.each do |address, data|
    if segment.nil? || segment.base + segment.size != address
      segment = Segment.new
      segment.base = address
      segment.data = data

      ihex.segments << segment
    else
      segment.data += data
    end
  end

  ihex
end
new() click to toggle source
# File lib/gdbflasher/ihex.rb, line 113
def initialize
  @segments = []
end

Public Instance Methods

pad_segments!(size, fill_byte = 0x00) click to toggle source
# File lib/gdbflasher/ihex.rb, line 181
def pad_segments!(size, fill_byte = 0x00)
  @segments.each do |segment|
    segment.pad_segment! size, fill_byte
  end

  self
end
split_segments!(size, fill_byte = 0x00) click to toggle source
# File lib/gdbflasher/ihex.rb, line 156
def split_segments!(size, fill_byte = 0x00)
  pad_segments! size, fill_byte

  i = 0

  while i < @segments.length
    segment = @segments[i]
    parts = segment.size / size

    for j in 1...parts do
      new_segment = Segment.new
      new_segment.base = segment.base + size * j
      new_segment.data = segment.data[j * size...(j + 1) * size]

      @segments.insert i + j, new_segment
    end

    segment.data = segment.data[0...size]

    i += parts
  end

  self
end