1
0
forked from me/IronOS

Make intel_hex_line a generator instead of passing in filehandle

This commit is contained in:
Paul Jimenez
2019-02-23 01:55:02 -05:00
parent 609354b857
commit 576f7a91f2

View File

@@ -8,7 +8,7 @@ import sys
try: try:
from PIL import Image, ImageOps from PIL import Image, ImageOps
except ImportError as error: except ImportError as error:
raise ImportError("{}: {} requres Python Imaging Library (PIL). " raise ImportError("{}: {} requres Python Imaging Library (PIL). "
"Install with `pip` or OS-specific package " "Install with `pip` or OS-specific package "
"management tool." "management tool."
.format(error, sys.argv[0])) .format(error, sys.argv[0]))
@@ -32,29 +32,32 @@ def split16(word):
return (word >> 8) & 0xff, word & 0xff return (word >> 8) & 0xff, word & 0xff
def intel_hex_line(file, record_type, offset, data): def intel_hex_line(record_type, offset, data):
"""write a line of data in Intel hex format""" """generate a line of data in Intel hex format"""
# length, address offset, record type # length, address offset, record type
record_length = len(data) record_length = len(data)
file.write(':{:02X}{:04X}{:02X}'.format(record_length, offset, record_type)) yield ':{:02X}{:04X}{:02X}'.format(record_length, offset, record_type)
# data # data
map(lambda byte: file.write("{:02X}".format(byte)), data) for byte in data:
yield "{:02X}".format(byte)
# compute and write checksum (with DOS line ending for compatibility/safety) # compute and write checksum (with DOS line ending for compatibility/safety)
file.write("{:02X}\r\n" yield "{:02X}\r\n".format((((sum(data, # sum data ...
.format((((sum(data, # sum data ... record_length # ... and other ...
record_length # ... and other ... + sum(split16(offset)) # ... fields ...
+ sum(split16(offset)) # ... fields ... + record_type) # ... on line
+ record_type) # ... on line & 0xff) # low 8 bits
& 0xff) # low 8 bits ^ 0xff) # two's ...
^ 0xff) # two's ... + 1) # ... complement
+ 1) # ... complement & 0xff) # low 8 bits
& 0xff)) # low 8 bits
def intel_hex(file, bytes_, start_address=0x0): def intel_hex(file, bytes_, start_address=0x0):
"""write block of data in Intel hex format""" """write block of data in Intel hex format"""
def write(generator):
file.write(''.join(generator))
if len(bytes_) % INTELHEX_BYTES_PER_LINE != 0: if len(bytes_) % INTELHEX_BYTES_PER_LINE != 0:
raise ValueError("Program error: Size of LCD data is not evenly divisible by {}" raise ValueError("Program error: Size of LCD data is not evenly divisible by {}"
.format(INTELHEX_BYTES_PER_LINE)) .format(INTELHEX_BYTES_PER_LINE))
@@ -62,25 +65,21 @@ def intel_hex(file, bytes_, start_address=0x0):
address_lo = start_address & 0xffff address_lo = start_address & 0xffff
address_hi = (start_address >> 16) & 0xffff address_hi = (start_address >> 16) & 0xffff
intel_hex_line(file, write(intel_hex_line(INTELHEX_EXTENDED_LINEAR_ADDRESS_RECORD, 0,
INTELHEX_EXTENDED_LINEAR_ADDRESS_RECORD, split16(address_hi)))
0,
split16(address_hi))
size_written = 0 size_written = 0
while size_written < INTELHEX_MINIMUM_SIZE: while size_written < INTELHEX_MINIMUM_SIZE:
offset = address_lo offset = address_lo
for line_start in range(0, len(bytes_), INTELHEX_BYTES_PER_LINE): for line_start in range(0, len(bytes_), INTELHEX_BYTES_PER_LINE):
intel_hex_line(file, write(intel_hex_line(INTELHEX_DATA_RECORD, offset,
INTELHEX_DATA_RECORD, bytes_[line_start:line_start + INTELHEX_BYTES_PER_LINE]))
offset,
bytes_[line_start:line_start + INTELHEX_BYTES_PER_LINE])
size_written += INTELHEX_BYTES_PER_LINE size_written += INTELHEX_BYTES_PER_LINE
if size_written >= INTELHEX_MINIMUM_SIZE: if size_written >= INTELHEX_MINIMUM_SIZE:
break break
offset += INTELHEX_BYTES_PER_LINE offset += INTELHEX_BYTES_PER_LINE
intel_hex_line(file, INTELHEX_END_OF_FILE_RECORD, 0, ()) write(intel_hex_line(INTELHEX_END_OF_FILE_RECORD, 0, ()))
def img2hex(input_filename, def img2hex(input_filename,