@@ -1,5 +1,6 @@ | |||
import ad2usb | |||
import time | |||
import traceback | |||
class NoDeviceError(Exception): | |||
pass | |||
@@ -11,6 +12,11 @@ class TimeoutError(Exception): | |||
pass | |||
class Firmware(object): | |||
STAGE_BOOT = 1 | |||
STAGE_LOAD = 2 | |||
STAGE_UPLOADING = 3 | |||
STAGE_DONE = 4 | |||
def __init__(self): | |||
pass | |||
@@ -18,17 +24,17 @@ class Firmware(object): | |||
pass | |||
@staticmethod | |||
def upload(dev, filename): | |||
def upload(dev, filename, progress_callback=None): | |||
def do_upload(): | |||
with open(filename) as f: | |||
print 'firmwaring this mofo!' | |||
for line in f: | |||
line = line.rstrip() | |||
if line[0] == ':': | |||
print "> {0}".format(line) | |||
dev.write(line + "\r") | |||
crap = dev.read_line() | |||
print "< {0}".format(crap) | |||
res = dev.read_line() | |||
if progress_callback is not None: | |||
progress_callback(Firmware.STAGE_UPLOADING) | |||
time.sleep(0.05) | |||
@@ -58,16 +64,23 @@ class Firmware(object): | |||
raise NoDeviceError('No device specified for firmware upload.') | |||
dev.close_reader() | |||
time.sleep(1) | |||
time.sleep(5) | |||
try: | |||
dev.write("=\r\n") | |||
if progress_callback is not None: | |||
progress_callback(Firmware.STAGE_BOOT) | |||
read_until('!boot', timeout=10.0) | |||
dev.write("=\r\n") | |||
if progress_callback is not None: | |||
progress_callback(Firmware.STAGE_LOAD) | |||
read_until('!load', timeout=10.0) | |||
do_upload() | |||
if progress_callback is not None: | |||
progress_callback(Firmware.STAGE_DONE) | |||
except TimeoutError, err: | |||
print traceback.print_exc(err) | |||
pass | |||
@@ -4,6 +4,7 @@ import pyad2usb.ad2usb | |||
import time | |||
import signal | |||
import traceback | |||
import sys | |||
running = True | |||
@@ -30,6 +31,24 @@ def handle_attached(sender, args): | |||
def handle_detached(sender, args): | |||
print 'detached', args | |||
def handle_firmware(stage): | |||
if stage == pyad2usb.ad2usb.util.Firmware.STAGE_BOOT: | |||
print 'Rebooting device..' | |||
handle_firmware.upload_tick = 0 | |||
elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_LOAD: | |||
print 'Waiting for boot loader..' | |||
elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_UPLOADING: | |||
if handle_firmware.upload_tick == 0: | |||
sys.stdout.write('Uploading firmware.') | |||
handle_firmware.upload_tick += 1 | |||
if handle_firmware.upload_tick % 30 == 0: | |||
sys.stdout.write('.') | |||
sys.stdout.flush() | |||
elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_DONE: | |||
print "\r\nDone!" | |||
signal.signal(signal.SIGINT, signal_handler) | |||
@@ -55,7 +74,7 @@ try: | |||
dev.on_open += handle_open | |||
dev.on_close += handle_close | |||
#dev.on_read += handle_read | |||
dev.on_write += handle_write | |||
#dev.on_write += handle_write | |||
#a2u.open() | |||
@@ -65,7 +84,7 @@ try: | |||
#dev.open(baudrate=19200, interface='/dev/ttyUSB0') | |||
dev.open() | |||
pyad2usb.ad2usb.util.Firmware.upload(dev, 'tmp/ademcoemu_V2_2a_6.hex') | |||
pyad2usb.ad2usb.util.Firmware.upload(dev, 'tmp/ademcoemu_V2_2a_6.hex', handle_firmware) | |||
while running: | |||
time.sleep(0.1) | |||