WIP making segments from file

This commit is contained in:
Sergey Shchelkanov 2023-05-11 12:40:29 +03:00
parent 292b90620e
commit 65faf0eb22
2 changed files with 31 additions and 10 deletions

View File

@ -40,11 +40,15 @@ def parse_hex_line(line: str) -> Record:
rectype = int(line[7:9], base=16) # Record type field rectype = int(line[7:9], base=16) # Record type field
data_bytes_line = line[9:datalen*2 + 9] # Data field data_bytes_line = line[9:datalen*2 + 9] # Data field
crc = int(line[datalen*2 + 9:datalen*2 + 11], base=16) crc = int(line[datalen*2 + 9:datalen*2 + 11], base=16)
splitted_by_bytes: List[str] = [] splitted_by_bytes: List[str] = []
for i in range(datalen): for i in range(datalen):
splitted_by_bytes.append(data_bytes_line[i*2:i*2+2]) splitted_by_bytes.append(data_bytes_line[i*2:i*2+2])
data_bytes = list(map(lambda x: int(x, base=16), splitted_by_bytes)) data_bytes = list(map(lambda x: int(x, base=16), splitted_by_bytes))
checksum = (datalen + int(line[3:5], base=16) + int(line[5:7], base=16) + rectype + sum(data_bytes)) % 256
if (checksum + crc) % 256 != 0:
raise Exception("Checksum mismatch in %s" % line)
record = Record(RecordType.UNKNOWN, 0, []) record = Record(RecordType.UNKNOWN, 0, [])
@ -175,11 +179,11 @@ def parse_hex(file: str) -> Dict:
def bytes2words(arr: List[int]) -> List[int]: def bytes2words(arr: List[int]) -> List[int]:
word = [] bytes = []
words = [] words = []
for byte in arr: for byte in arr:
word.append(byte) bytes.append(byte)
if word.__len__() == 4: if bytes.__len__() == 4:
words.append(word[0]+2**8*word[1]+2**16*word[2]+2**24*word[3]) words.append(bytes[0]+2**8*bytes[1]+2**16*bytes[2]+2**24*bytes[3])
word = [] bytes = []
return words return words

View File

@ -37,8 +37,13 @@ def test_connection():
raise Exception("ERROR: no regs found, check MCU connection") raise Exception("ERROR: no regs found, check MCU connection")
def read_file(filename: str) -> List[Record]: @dataclass
segments: List[Record] = [] class Segment:
offset: int
data: List[int]
def read_file(filename: str) -> List[Segment]:
segments: List[Segment] = []
lines: List[str] = [] lines: List[str] = []
file_name, file_extension = os.path.splitext(filename) file_name, file_extension = os.path.splitext(filename)
@ -52,13 +57,25 @@ def read_file(filename: str) -> List[Record]:
else: else:
raise Exception("Unsupported file format: %s" % (file_extension)) raise Exception("Unsupported file format: %s" % (file_extension))
lba: int = 0 # Linear Base Address
expect_address = 0 # Address of the next byte
for line in lines: for line in lines:
record: Record = parse_line(line, file_extension) record: Record = parse_line(line, file_extension)
print(record)
if record.type == RecordType.DATA: if record.type == RecordType.DATA:
pass drlo: int = record.address # Data Record Load Offset
if segments.__len__() == 0:
expect_address = lba+drlo
segments.append(Segment(offset=expect_address, data=[]))
if expect_address != lba+drlo:
expect_address = lba+drlo
segments.append(Segment(offset=expect_address, data=[]))
for byte in record.data:
segments[-1].data.append(byte)
expect_address += 1
elif record.type == RecordType.EXTADDR: elif record.type == RecordType.EXTADDR:
pass lba = record.address
elif record.type == RecordType.LINEARSTARTADDR: elif record.type == RecordType.LINEARSTARTADDR:
print("Start Linear Address:", record.address) print("Start Linear Address:", record.address)