LPCtarget/__init__.py
author Edouard Tisserant
Mon, 29 Apr 2013 17:31:24 +0900
changeset 45 786b12887e91
parent 1 4f6d393cb36e
child 54 eb068364ccfa
permissions -rwxr-xr-x
Moved serial transaction lock in order to encompass serial port teardown in case of error, to avoid deadlocks and multiple close in some cases
import os
from subprocess import Popen,PIPE
from toolchain_makefile import toolchain_makefile
import hashlib

class LPC_target(toolchain_makefile):
    #extension = ".ld"
    #DebugEnabled = False
    def __init__(self, CTRInstance):
        self.binmd5key = None
        toolchain_makefile.__init__(self, CTRInstance)

    def _GetBinMD5FileName(self):
        return os.path.join(self.buildpath, "lastbuildPLCbin.md5")

    def _get_md5_header(self):
        """Returns signature header"""
        size = int(Popen(
             ['arm-elf-size','-B',os.path.join(self.buildpath,"ArmPLC_rom.elf")],
             stdout=PIPE).communicate()[0].splitlines()[1].split()[0])
        res = "&" + hashlib.md5(open(os.path.join(self.buildpath, "ArmPLC_rom.bin"), "rb").read(size)).hexdigest() + '\n' +\
              "$" + str(size) + '\n'
        return res

    def GetBinaryCode(self):
        """Returns ready to send signed + sized intel formated hex program"""
        try:
            res = self._get_md5_header() +\
                   open(os.path.join(self.buildpath, "ArmPLC_rom.hex"), "r").read()
            return res
        except Exception, e:
            return None

    def _get_cached_md5_header(self):
        if self.binmd5key is not None:
            return self.binmd5key
        else:
            try:
                return open(self._GetBinMD5FileName(), "r").read()
            except IOError, e:
                return None

    def ResetBinaryCodeMD5(self, mode):
        if mode == "BOOTLOADER":
            self.binmd5key = None
            try:
                os.remove(self._GetBinMD5FileName())
            except Exception, e:
                pass
        else:
            return toolchain_makefile.ResetBinaryCodeMD5(self)

    def GetBinaryCodeMD5(self, mode):
        if mode == "BOOTLOADER":
            return self._get_cached_md5_header()
        else:
            return toolchain_makefile.GetBinaryCodeMD5(self)

    def build(self):
        res = toolchain_makefile.build(self)
        if res:
            self.binmd5key = self._get_md5_header()
            f = open(self._GetBinMD5FileName(), "w")
            f.write(self.binmd5key)
            f.close()
            try:
                self.CTRInstance.logger.write(
                    _("Binary is %s bytes long\n")%
                        str(os.path.getsize(
                            os.path.join(self.buildpath, "ArmPLC_rom.bin"))))
            except Exception, e:
                pass
        return res