# 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)