Skip to content

Commit 751754e

Browse files
committed
connections/PybricksHub: Wait for script.
1 parent 6e9dbdb commit 751754e

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

pybricksdev/cli/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ async def run(self, args: argparse.Namespace):
130130
elif args.conntype == 'ble':
131131
# It is a Pybricks Hub with BLE. Device name or address is given.
132132
hub = PybricksHub()
133-
hub.logger.setLevel(logging.INFO)
133+
hub.logger.setLevel(logging.WARNING)
134134
if validators.mac_address(args.device):
135135
device_or_address = args.device
136136
else:

pybricksdev/connections.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)