refactor: Streamline message processing and visualization updates in heart rate monitoring
This commit is contained in:
123
main.py
123
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__":
|
||||
|
||||
Reference in New Issue
Block a user