diff --git a/main.py b/main.py index 257dc7a..99d87b1 100644 --- a/main.py +++ b/main.py @@ -270,11 +270,11 @@ def main(): else: selected_devices = [] - placeholder = st.empty() - - while True: - # Process UDP messages (treat as device_id = 0) - try: + # Process available messages (no infinite loop) + # Process UDP messages (treat as device_id = 0) + message_processed = False + try: + while True: # Process all available UDP messages message = state["message_queue"].receive_nowait() hr_value = parse_ble_hr_measurement(message) if hr_value is not None: @@ -288,10 +288,13 @@ def main(): dev_hist["hr_data"].append(float(hr_value)) logger.debug("UDP Device: HR={}", hr_value) - except anyio.WouldBlock: - pass + message_processed = True + except anyio.WouldBlock: + pass - try: + # Process MQTT messages + try: + while True: # Process all available MQTT messages mqtt_message = state["mqtt_message_queue"].receive_nowait() if mqtt_message.payload: try: @@ -330,61 +333,71 @@ def main(): dev_hist["hr_data"].append(float(hr_value)) logger.debug("Device {}: HR={}", device_id, hr_value) + message_processed = True except Exception as e: logger.error("Failed to parse MQTT protobuf message: {}", e) - except anyio.WouldBlock: - pass + except anyio.WouldBlock: + pass - # Update visualization - HR Graphs - with placeholder.container(): - if device_histories: - st.subheader("Heart Rate Data") + # Auto-refresh the page if new data was processed + if message_processed: + sleep(0.1) # Small delay to batch multiple messages + st.rerun() - # Create plots for selected devices - traces = [] - colors = [ - "red", - "green", - "blue", - "orange", - "purple", - "brown", - "pink", - "gray", - "olive", - "cyan", - ] + # Update visualization - HR Graphs + if device_histories: + st.subheader("Heart Rate Data") - for i, device_id in enumerate(selected_devices): - if device_id in device_histories: - dev_hist = device_histories[device_id] - if dev_hist["hr_data"] and dev_hist["timescape"]: - color = colors[i % len(colors)] - traces.append( - go.Scatter( - x=list(dev_hist["timescape"]), - y=list(dev_hist["hr_data"]), - mode="lines+markers", - name=get_device_name(device_id), - line=dict(color=color), - marker=dict(size=4), - ) - ) + # Create plots for selected devices + traces = [] + colors = [ + "red", + "green", + "blue", + "orange", + "purple", + "brown", + "pink", + "gray", + "olive", + "cyan", + ] - if traces: - fig = go.Figure(data=traces) - fig.update_layout( - title="Heart Rate Monitor", - xaxis_title="Time", - yaxis_title="Heart Rate (BPM)", - hovermode="x unified", - showlegend=True, - height=500, + for i, device_id in enumerate(selected_devices): + if device_id in device_histories: + dev_hist = device_histories[device_id] + if dev_hist["hr_data"] and dev_hist["timescape"]: + color = colors[i % len(colors)] + traces.append( + go.Scatter( + x=list(dev_hist["timescape"]), + y=list(dev_hist["hr_data"]), + mode="lines+markers", + name=get_device_name(device_id), + line=dict(color=color), + marker=dict(size=4), + ) ) - st.plotly_chart(fig, use_container_width=True) - else: - st.info("No heart rate data available for selected devices") + + if traces: + fig = go.Figure(data=traces) + fig.update_layout( + title="Heart Rate Monitor", + xaxis_title="Time", + yaxis_title="Heart Rate (BPM)", + hovermode="x unified", + showlegend=True, + height=500, + ) + st.plotly_chart(fig, use_container_width=True) + else: + 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__":