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

123
main.py
View File

@ -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__":