refactor: Streamline message processing and visualization updates in heart rate monitoring

This commit is contained in:
2025-06-10 18:15:33 +08:00
parent 65cb8c201d
commit 3a15bd655e

21
main.py
View File

@ -270,11 +270,11 @@ def main():
else: else:
selected_devices = [] selected_devices = []
placeholder = st.empty() # Process available messages (no infinite loop)
while True:
# Process UDP messages (treat as device_id = 0) # Process UDP messages (treat as device_id = 0)
message_processed = False
try: try:
while True: # Process all available UDP messages
message = state["message_queue"].receive_nowait() message = state["message_queue"].receive_nowait()
hr_value = parse_ble_hr_measurement(message) hr_value = parse_ble_hr_measurement(message)
if hr_value is not None: if hr_value is not None:
@ -288,10 +288,13 @@ def main():
dev_hist["hr_data"].append(float(hr_value)) dev_hist["hr_data"].append(float(hr_value))
logger.debug("UDP Device: HR={}", hr_value) logger.debug("UDP Device: HR={}", hr_value)
message_processed = True
except anyio.WouldBlock: except anyio.WouldBlock:
pass pass
# Process MQTT messages
try: try:
while True: # Process all available MQTT messages
mqtt_message = state["mqtt_message_queue"].receive_nowait() mqtt_message = state["mqtt_message_queue"].receive_nowait()
if mqtt_message.payload: if mqtt_message.payload:
try: try:
@ -330,14 +333,19 @@ def main():
dev_hist["hr_data"].append(float(hr_value)) dev_hist["hr_data"].append(float(hr_value))
logger.debug("Device {}: HR={}", device_id, hr_value) logger.debug("Device {}: HR={}", device_id, hr_value)
message_processed = True
except Exception as e: except Exception as e:
logger.error("Failed to parse MQTT protobuf message: {}", e) logger.error("Failed to parse MQTT protobuf message: {}", e)
except anyio.WouldBlock: except anyio.WouldBlock:
pass pass
# Auto-refresh the page if new data was processed
if message_processed:
sleep(0.1) # Small delay to batch multiple messages
st.rerun()
# Update visualization - HR Graphs # Update visualization - HR Graphs
with placeholder.container():
if device_histories: if device_histories:
st.subheader("Heart Rate Data") st.subheader("Heart Rate Data")
@ -385,6 +393,11 @@ def main():
st.plotly_chart(fig, use_container_width=True) st.plotly_chart(fig, use_container_width=True)
else: else:
st.info("No heart rate data available for selected devices") st.info("No heart rate data available for selected devices")
else:
st.info("No devices connected yet. Waiting for data...")
sleep(1)
st.rerun()
if __name__ == "__main__": if __name__ == "__main__":