A clone of: https://github.com/nutechsoftware/alarmdecoder This is requires as they dropped support for older firmware releases w/o building in backward compatibility code, and they had previously hardcoded pyserial to a python2 only version.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.7 KiB

  1. #!/usr/bin/env python
  2. import os
  3. import sys, time
  4. import alarmdecoder
  5. def handle_firmware(stage, **kwargs):
  6. if stage == alarmdecoder.util.Firmware.STAGE_START:
  7. handle_firmware.wait_tick = 0
  8. handle_firmware.upload_tick = 0
  9. elif stage == alarmdecoder.util.Firmware.STAGE_WAITING:
  10. if handle_firmware.wait_tick == 0:
  11. sys.stdout.write('Waiting for device.')
  12. handle_firmware.wait_tick += 1
  13. sys.stdout.write('.')
  14. sys.stdout.flush()
  15. elif stage == alarmdecoder.util.Firmware.STAGE_BOOT:
  16. if handle_firmware.wait_tick > 0: print ""
  17. print "Rebooting device.."
  18. elif stage == alarmdecoder.util.Firmware.STAGE_LOAD:
  19. print 'Waiting for boot loader..'
  20. elif stage == alarmdecoder.util.Firmware.STAGE_UPLOADING:
  21. if handle_firmware.upload_tick == 0:
  22. sys.stdout.write('Uploading firmware.')
  23. handle_firmware.upload_tick += 1
  24. if handle_firmware.upload_tick % 30 == 0:
  25. sys.stdout.write('.')
  26. sys.stdout.flush()
  27. elif stage == alarmdecoder.util.Firmware.STAGE_DONE:
  28. print "\r\nDone!"
  29. elif stage == alarmdecoder.util.Firmware.STAGE_ERROR:
  30. print "\r\nError: {0}".format(kwargs.get("error", ""))
  31. elif stage == alarmdecoder.util.Firmware.STAGE_DEBUG:
  32. print "\r\nDBG: {0}".format(kwargs.get("data", ""))
  33. def main():
  34. device = '/dev/ttyUSB0'
  35. firmware = None
  36. baudrate = 115200
  37. if len(sys.argv) < 2:
  38. print "Syntax: {0} <firmware> [device path or hostname:port] [baudrate]".format(sys.argv[0])
  39. sys.exit(1)
  40. firmware = sys.argv[1]
  41. if len(sys.argv) > 2:
  42. device = sys.argv[2]
  43. if len(sys.argv) > 3:
  44. baudrate = sys.argv[3]
  45. debug = os.environ.get("ALARMDECODER_DEBUG") is not None
  46. print "Flashing device: {0} - {2} baud\r\nFirmware: {1}".format(device, firmware, baudrate)
  47. dev = None
  48. try:
  49. if ':' in device:
  50. hostname, port = device.split(':')
  51. dev = alarmdecoder.devices.SocketDevice(interface=(hostname, int(port)))
  52. dev.open(no_reader_thread=True)
  53. else:
  54. dev = alarmdecoder.devices.SerialDevice(interface=device)
  55. dev.open(baudrate=baudrate, no_reader_thread=True)
  56. time.sleep(3)
  57. alarmdecoder.util.Firmware.upload(dev, firmware, handle_firmware, debug=debug)
  58. except alarmdecoder.util.NoDeviceError, ex:
  59. print "Error: Could not find device: {0}".format(ex)
  60. except alarmdecoder.util.UploadError, ex:
  61. print "Error: Error uploading firmware: {0}".format(ex)
  62. except Exception, ex:
  63. print "Error: {0}".format(ex)
  64. finally:
  65. if dev is not None:
  66. dev.close()
  67. if __name__ == "__main__":
  68. main()