# -*- coding: utf-8 -*- # Thanks to Herbert Oppmann (herby) for all your work! from . import devices from .ansi import RESET, RED, GREEN from .chksum import ChkSum from struct import unpack # RGN structure might be: RGN > BIN or RGN > RGN > BIN # RGN = outside hull # BIN = firmware + hwid + checksum END_PATTERN = b"\xff\xff\x5a\xa5\xff\xff\xff\xff" class ParseException(Exception): pass class RgnBin: def __init__(self, filename: str=None): self.filename = filename self.hwid = None self.version = None self.payload = None if filename is not None: self.load() def load(self): if self.filename is None: return False with open(self.filename, "rb") as f: rawdata = f.read() f.close() self.load_from_bytes(rawdata) def find_metadata(self): try: end_loc = self.payload.rindex(END_PATTERN) #print("end_loc: {}".format(end_loc)) except ValueError: # No END_PATTERN found end_loc = None jmp = unpack(" hwid > swver > entry OR hwid > swver > end > entry) (x1, x2, x3, entry_addr) = unpack(" hwid > swver > lend > entry) # NOTE: This method doesn't seem to work with eTrex H firmware! (end_addr, hwid_addr, swver_addr, lend_addr, entry_addr) = unpack(" hwid > swver) (end_addr, hwid_addr, swver_addr) = unpack(" hwid > swver > ???) (end_addr, hwid_addr, swver_addr) = unpack(" len(self.payload)-2: print(RED + "HWID OFFSET {:04x} OUT OF BOUNDS {:04x}".format(hwid_addr, len(self.payload)) + RESET) else: self.hwid = unpack(" len(self.payload)-2: print(RED + "SWVER OFFSET {:04x} OUT OF BOUNDS {:04x}".format(swver_addr, len(self.payload)) + RESET) else: self.version = unpack("