Mercurial > lcfOS
diff python/hexfile.py @ 233:d3dccf12ca88
Added hexfile tests
author | Windel Bouwman |
---|---|
date | Sun, 14 Jul 2013 12:28:23 +0200 |
parents | ed230e947dc6 |
children | 6259856841a0 |
line wrap: on
line diff
--- a/python/hexfile.py Sun Jul 14 11:50:58 2013 +0200 +++ b/python/hexfile.py Sun Jul 14 12:28:23 2013 +0200 @@ -1,34 +1,31 @@ import os class HexFileException(Exception): - pass + pass def parseHexLine(line): - """ Parses a hexfile line into three parts """ - line = line[1:] # Remove ':' - nums = bytes.fromhex(line) - bytecount = nums[0] - if len(nums) != bytecount + 5: - raise HexFileException('byte count field incorrect') - crc = sum(nums) - if (crc & 0xFF) != 0: - raise HexFileException('crc incorrect') - address = nums[1] * 256 + nums[2] - typ = nums[3] - data = nums[4:-1] - return (address, typ, data) + """ Parses a hexfile line into three parts """ + line = line[1:] # Remove ':' + nums = bytes.fromhex(line) + bytecount = nums[0] + if len(nums) != bytecount + 5: + raise HexFileException('byte count field incorrect') + crc = sum(nums) + if (crc & 0xFF) != 0: + raise HexFileException('crc incorrect') + address = nums[1] * 256 + nums[2] + typ = nums[3] + data = nums[4:-1] + return (address, typ, data) + class HexFile: - """ Represents an intel hexfile """ - def __init__(self, filename=None): + """ Represents an intel hexfile """ + def __init__(self, filename=None): self.regions = [] self.startAddress = 0 - self.filename = None - if filename: - self.load(filename) - def load(self, filename): - with open(filename, 'r') as f: + def load(self, f): endOfFile = False offset = 0 startAddress = 0 @@ -66,21 +63,23 @@ # After all lines: if curData: self.regions.append(HexFileRegion(startAddress, bytes(curData))) - # Store the filename: - self.filename = filename - def __repr__(self): - i = [] - i.append(super().__repr__()) - i.append('Start address {0}'.format(hex(self.startAddress))) - i.append('Filename: {0}'.format(self.filename)) - for r in self.regions: - i.append(str(r)) - return os.linesep.join(i) - def save(self, filename): - with open(filename, 'w') as f: - for line in f: - pass - + + def __repr__(self): + i = [] + i.append(super().__repr__()) + i.append('Start address {0}'.format(hex(self.startAddress))) + for r in self.regions: + i.append(str(r)) + return os.linesep.join(i) + + def save(self, f): + for r in self.regions: + offset = 0 + while offset < len(r.data): + f.write('a') + offset += 16 + + class HexFileRegion: def __init__(self, address, data = bytes()): self.address = address @@ -88,10 +87,13 @@ def __repr__(self): return 'Region at 0x{0:X} of {1} bytes'.format(self.address, len(self.data)) + if __name__ == '__main__': h = HexFile() print(h) """ Test hexfile implementation with some hexfile """ - h1 = HexFile('audio.hex') + h1 = HexFile() + with open('audio.hex', 'r') as f: + h1.load(f) print(h1)