AvrFirmwareUpdater.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # Copyright (c) 2018 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from UM.Logger import Logger
  4. from cura.CuraApplication import CuraApplication
  5. from cura.PrinterOutputDevice import PrinterOutputDevice
  6. from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater, FirmwareUpdateState
  7. from .avr_isp import stk500v2, intelHex
  8. from serial import SerialException
  9. from time import sleep
  10. class AvrFirmwareUpdater(FirmwareUpdater):
  11. def __init__(self, output_device: PrinterOutputDevice) -> None:
  12. super().__init__(output_device)
  13. def _updateFirmware(self) -> None:
  14. try:
  15. hex_file = intelHex.readHex(self._firmware_location)
  16. assert len(hex_file) > 0
  17. except (FileNotFoundError, AssertionError):
  18. Logger.log("e", "Unable to read provided hex file. Could not update firmware.")
  19. self._setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error)
  20. return
  21. programmer = stk500v2.Stk500v2()
  22. programmer.progress_callback = self._onFirmwareProgress
  23. # Ensure that other connections are closed.
  24. if self._output_device.isConnected():
  25. self._output_device.close()
  26. try:
  27. programmer.connect(self._output_device._serial_port)
  28. except:
  29. programmer.close()
  30. Logger.logException("e", "Failed to update firmware")
  31. self._setFirmwareUpdateState(FirmwareUpdateState.communication_error)
  32. return
  33. # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases.
  34. sleep(1)
  35. if not programmer.isConnected():
  36. Logger.log("e", "Unable to connect with serial. Could not update firmware")
  37. self._setFirmwareUpdateState(FirmwareUpdateState.communication_error)
  38. try:
  39. programmer.programChip(hex_file)
  40. except SerialException as e:
  41. Logger.log("e", "A serial port exception occured during firmware update: %s" % e)
  42. self._setFirmwareUpdateState(FirmwareUpdateState.io_error)
  43. return
  44. except Exception as e:
  45. Logger.log("e", "An unknown exception occured during firmware update: %s" % e)
  46. self._setFirmwareUpdateState(FirmwareUpdateState.unknown_error)
  47. return
  48. programmer.close()
  49. # Try to re-connect with the machine again, which must be done on the Qt thread, so we use call later.
  50. CuraApplication.getInstance().callLater(self._output_device.connect)
  51. self._cleanupAfterUpdate()