def __init__( self, core, args ): self.job_init( core ) self.cid = self.can_connect( args[0] ) if len(args[1])>2 and args[1][:2] == "0x": self.nodeid = int( args[1], 16 ) else: self.nodeid = int( args[1] ) self.mode = { \ "app": self.MODE_APP, \ "bios": self.MODE_BIOS, \ "start": self.MODE_START, \ "reset": self.MODE_RESET, \ }[args[2]] if self.mode == self.MODE_APP or self.mode == self.MODE_BIOS: self.hexfile = Hexfile( args[3] ) self.finished = False self.programming = True self.dosend_file() elif self.mode == self.MODE_RESET: self.finished = True canp = can.CanPacket( can.nmt_id( can.CAN_NMT_RESET, self.nodeid, self.mynodeid ), [] ) self.can_send( self.cid, canp ) elif self.mode == self.MODE_START: self.finished = True canp = can.CanPacket( can.nmt_id( can.CAN_NMT_START_APP, self.nodeid, self.mynodeid ), [] ) self.can_send( self.cid, canp ) self.close()
def can_recieve( self, cid, canp ): if canp.id == can.nmt_id( can.CAN_NMT_PGM_ACK, self.mynodeid, self.nodeid ): self.dosend_file() elif canp.id == can.nmt_id( can.CAN_NMT_PGM_NACK, self.mynodeid, self.nodeid ): self.core.term.write( "Error programming" ) elif canp.id == can.nmt_id( can.CAN_NMT_BIOS_START, self.mynodeid, self.nodeid ): self.core.term.write( "Node resetted, bios 0x%02x%02x, application: %d" % (canp.data[1], canp.data[0], canp.data[2]) ) if not self.finished: self.core.term.write( "WARNING: Programming not finished" ) self.close()
def dosend_file( self ): if self.programming: rec = self.hexfile.pop( 6 ) if rec[0] == Hexfile.TYPE_DATA: type, offset, data = rec self.cnt += 1 canp = can.CanPacket( can.nmt_id( can.CAN_NMT_PGM_DATA, self.nodeid, self.mynodeid ), [(offset) & 0xFF, (offset>>8) & 0xFF] + data ) self.can_send( self.cid, canp ) elif rec[0] == Hexfile.TYPE_OFFSET: type, offset = rec self.cnt += 1 canp = can.CanPacket( can.nmt_id( can.CAN_NMT_PGM_START, self.nodeid, self.mynodeid ), [ (offset>>24) & 0xFF, (offset>>16) & 0xFF, (offset>>8 ) & 0xFF, (offset ) & 0xFF ] ) self.can_send( self.cid, canp ) elif rec[0] == Hexfile.TYPE_EOF: self.finished = True canp = can.CanPacket( can.nmt_id( can.CAN_NMT_PGM_END, self.nodeid, self.mynodeid ), [] ) self.programming=False self.can_send( self.cid, canp ) else: canp = can.CanPacket( can.nmt_id( can.CAN_NMT_RESET, self.nodeid, self.mynodeid ), [] ) self.can_send( self.cid, canp )