contiki/tools/stm32w/stm32w_flasher/py_files/file_utils.py

84 lines
2.1 KiB
Python
Raw Normal View History

# See comment in stm32w_flasher.py.
# Extraction and little adaptation performed by E.Duble (CNRS, LIG).
import struct
class Error(Exception):
"""Base class for exceptions in this module."""
args = None
message = None
class FileFormatError(Error):
"""
Exception raised for errors in the file format
Attributes:
filename -- filename with unknown format
message -- format error message
"""
args = None
message = None
def __init__(self, filename, message):
self.filename = filename
self.message = message
class fileFormatReader(object):
def __init__(self, filename, startAddress=None):
self.filename = filename
self.startAddress = startAddress
def getRawBinary(self):
fileContent = None
bytes = None
f = open(self.filename, 'rb')
if self.filename[-4:] == '.bin':
bytesRaw = f.read()
bytes = []
bytes.extend(struct.unpack(('B' * len(bytesRaw)), bytesRaw))
f.close()
else:
if self.filename[-4:] == '.s37':
fillChar = 255
fileContent = f.readlines()
f.close()
startAddress = None
currentAddress = None
bytes = []
for line in fileContent:
if line[:2] == 'S3':
count = int(line[2:4], 16)
if startAddress is None:
startAddress = int(line[4:12], 16)
currentAddress = startAddress
address = int(line[4:12], 16)
if currentAddress < address:
bytes = (bytes + ([fillChar] * (address - currentAddress)))
currentAddress = address
else:
if currentAddress > address:
raise FileFormatError(self.filename, 'S37, Non progressing addresses detected')
for i in range((count - 5)):
bytes = (bytes + [int(line[(12 + (i * 2)):((12 + (i * 2)) + 2)], 16)])
continue
currentAddress = (currentAddress + (count - 5))
continue
else:
if line[:2] == 'S0':
continue
else:
if line[:2] == 'S7':
break
else:
raise FileFormatError(self.filename, 'S37: unknown field type')
self.startAddress = startAddress
else:
raise FileFormatError(self.filename, 'Unknown extension')
return (self.startAddress, bytes)