#!/usr/bin/env python3
import argparse
import struct
import sys

from lib.dump import DUMP_MAGIC, DUMP_OFFSET, DUMP_SIZE


def error(msg):
    print(msg, file=sys.stderr)

def main():
    # parse the arguments
    ap = argparse.ArgumentParser(description="""
        Extract a crash dump from an external flash image and output
        the same format produced by the D21 g-code.
    """)
    ap.add_argument('image')
    args = ap.parse_args()

    # read the image
    off = DUMP_OFFSET
    with open(args.image, 'rb') as fd:
        fd.seek(off)
        data = fd.read(DUMP_SIZE)
    if len(data) != DUMP_SIZE:
        error('incorrect image size')
        return 1

    # check for magic header
    magic, = struct.unpack('<L', data[:4])
    if magic != DUMP_MAGIC:
        error('invalid dump magic or no dump')
        return 1

    # output D21 dump
    print('D21 - read crash dump', end='')
    for i in range(len(data)):
        if i % 16 == 0:
            print('\n{:06x} '.format(off + i), end='')
        print(' {:02x}'.format(data[i]), end='')
    print('\nok')


if __name__ == '__main__':
    exit(main())
