except:
raise ispBase.IspError("Unexpected error while connecting to serial port:" + port + ":" + str(sys.exc_info()[0]))
self.seq = 1
-
+
#Reset the controller
- self.serial.setDTR(1)
- time.sleep(0.1)
- self.serial.setDTR(0)
+ for n in xrange(0, 2):
+ self.serial.setDTR(True)
+ time.sleep(0.1)
+ self.serial.setDTR(False)
+ time.sleep(0.1)
time.sleep(0.2)
self.serial.flushInput()
if self.sendMessage([0x10, 0xc8, 0x64, 0x19, 0x20, 0x00, 0x53, 0x03, 0xac, 0x53, 0x00, 0x00]) != [0x10, 0x00]:
self.close()
raise ispBase.IspError("Failed to enter programming mode")
+
+ self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
+ if self.sendMessage([0xEE])[1] == 0x00:
+ self._has_checksum = True
+ else:
+ self._has_checksum = False
self.serial.timeout = 5
def close(self):
def isConnected(self):
return self.serial is not None
-
+
+ def hasChecksumFunction(self):
+ return self._has_checksum
+
def sendISP(self, data):
recv = self.sendMessage([0x1D, 4, 4, 0, data[0], data[1], data[2], data[3]])
return recv[2:6]
loadCount = (len(flashData) + pageSize - 1) / pageSize
for i in xrange(0, loadCount):
recv = self.sendMessage([0x13, pageSize >> 8, pageSize & 0xFF, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flashData[(i * pageSize):(i * pageSize + pageSize)])
- if self.progressCallback != None:
- self.progressCallback(i + 1, loadCount*2)
+ if self.progressCallback is not None:
+ if self._has_checksum:
+ self.progressCallback(i + 1, loadCount)
+ else:
+ self.progressCallback(i + 1, loadCount*2)
def verifyFlash(self, flashData):
- #Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
- flashSize = self.chip['pageSize'] * 2 * self.chip['pageCount']
- if flashSize > 0xFFFF:
- self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
+ if self._has_checksum:
+ self.sendMessage([0x06, 0x00, (len(flashData) >> 17) & 0xFF, (len(flashData) >> 9) & 0xFF, (len(flashData) >> 1) & 0xFF])
+ res = self.sendMessage([0xEE])
+ checksum_recv = res[2] | (res[3] << 8)
+ checksum = 0
+ for d in flashData:
+ checksum += d
+ checksum &= 0xFFFF
+ if hex(checksum) != hex(checksum_recv):
+ raise ispBase.IspError('Verify checksum mismatch: 0x%x != 0x%x' % (checksum & 0xFFFF, checksum_recv))
else:
- self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
-
- loadCount = (len(flashData) + 0xFF) / 0x100
- for i in xrange(0, loadCount):
- recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]
- if self.progressCallback != None:
- self.progressCallback(loadCount + i + 1, loadCount*2)
- for j in xrange(0, 0x100):
- if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:
- raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j))
+ #Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
+ flashSize = self.chip['pageSize'] * 2 * self.chip['pageCount']
+ if flashSize > 0xFFFF:
+ self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00])
+ else:
+ self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00])
+
+ loadCount = (len(flashData) + 0xFF) / 0x100
+ for i in xrange(0, loadCount):
+ recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]
+ if self.progressCallback is not None:
+ self.progressCallback(loadCount + i + 1, loadCount*2)
+ for j in xrange(0, 0x100):
+ if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:
+ raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j))
def sendMessage(self, data):
message = struct.pack(">BBHB", 0x1B, self.seq, len(data), 0x0E)
wx.MessageBox(_("I am sorry, but Cura does not ship with a default firmware for your machine configuration."), _("Firmware update"), wx.OK | wx.ICON_ERROR)
self.Destroy()
return
- if profile.getMachineSetting('machine_type', machineIndex) == 'reprap':
+ self._machine_type = profile.getMachineSetting('machine_type', machineIndex)
+ if self._machine_type == 'reprap':
wx.MessageBox(_("Cura only supports firmware updates for ATMega2560 based hardware.\nSo updating your RepRap with Cura might or might not work."), _("Firmware update"), wx.OK | wx.ICON_INFORMATION)
sizer = wx.BoxSizer(wx.VERTICAL)
- self.progressLabel = wx.StaticText(self, -1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nX')
+ self.progressLabel = wx.StaticText(self, -1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nX\nX')
sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER|wx.ALL, border=5)
self.progressGauge = wx.Gauge(self, -1)
sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
wx.CallAfter(self.Close)
return
+ if self._machine_type == 'ultimaker':
+ if programmer.hasChecksumFunction():
+ wx.CallAfter(self.updateLabel, _("Failed to install firmware:\nThis firmware is not compatible with this machine.\nTrying to install UMO firmware on an UM2 or UMO+?"))
+ programmer.close()
+ wx.CallAfter(self.okButton.Enable)
+ return
+ if self._machine_type == 'ultimaker_plus' or self._machine_type == 'ultimaker2':
+ if not programmer.hasChecksumFunction():
+ wx.CallAfter(self.updateLabel, _("Failed to install firmware:\nThis firmware is not compatible with this machine.\nTrying to install UM2 or UMO+ firmware on an UMO?"))
+ programmer.close()
+ wx.CallAfter(self.okButton.Enable)
+ return
+
wx.CallAfter(self.updateLabel, _("Uploading firmware..."))
try:
programmer.programChip(hexFile)