@@ -596,13 +596,15 @@ def __init__(self):
596596 self .logger .setLevel (logging .WARNING )
597597
598598 self .EOL = b"\r \n "
599- self .program_running = False
600599 self .stream_buf = bytearray ()
601600 self .output = []
602601 self .print_output = True
603602
604- self .checksum_ready = asyncio .Event ()
605603 self .expected_checksum = - 1
604+ self .checksum_ready = asyncio .Event ()
605+
606+ self .program_running = False
607+ self .program_state_changed = asyncio .Event ()
606608
607609 def line_handler (self , line ):
608610 self .output .append (line )
@@ -645,9 +647,18 @@ def nus_handler(self, sender, data):
645647
646648 def pybricks_service_handler (self , sender , data ):
647649 if data [0 ] == 0 :
650+
651+ # Get new state
648652 msg = data [1 ]
649- self .program_running = bool (msg & (1 << 6 ))
650- self .logger .info ("Program running: " + str (self .program_running ))
653+
654+ # Get new program state
655+ program_running_now = bool (msg & (1 << 6 ))
656+ self .logger .info ("Program running: " + str (program_running_now ))
657+
658+ # If program state changed, notifiy
659+ if self .program_running != program_running_now :
660+ self .program_state_changed .set ()
661+ self .program_running = program_running_now
651662
652663 def disconnected_handler (self , client : BleakClient ):
653664 self .logger .info ("Disconnected!" )
@@ -683,7 +694,7 @@ async def send_block(self, data):
683694 except asyncio .TimeoutError :
684695 self .logger .warning ("Error during program download." )
685696 return
686- self .expected_checksum = 0
697+ self .expected_checksum = - 1
687698
688699 async def run (self , py_path , wait = True , print_output = True ):
689700
@@ -703,10 +714,22 @@ async def run(self, py_path, wait=True, print_output=True):
703714 chunks = [mpy [i : i + n ] for i in range (0 , len (mpy ), n )]
704715
705716 # Send the data chunk by chunk
717+ print ("Downloading {0} bytes in {1} steps." .format (len (mpy ), len (chunks )))
706718 for i , chunk in enumerate (chunks ):
707- self . logger . info ( "Sending : {0}%" .format (
719+ print ( "Progress : {0}%" .format (
708720 round ((i + 1 ) / len (chunks ) * 100 ))
709721 )
710722 await self .send_block (chunk )
711723
712- # Wait for program to start and stop
724+ # Wait for program to start.
725+ try :
726+ await asyncio .wait_for (self .program_state_changed .wait (), timeout = 0.5 )
727+ self .program_state_changed .clear ()
728+ except asyncio .TimeoutError :
729+ self .logger .warning ("Unable to start program." )
730+ return
731+
732+ if wait :
733+ # Wait for program to stop
734+ await self .program_state_changed .wait ()
735+ self .program_state_changed .clear ()
0 commit comments