feat: implement Contec patient monitor discovery tool and server framework
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
import asyncio
|
||||
import logging
|
||||
from database import SessionLocal
|
||||
from models import VitalReading, TransmissionLog
|
||||
from schemas import NormalizedVitals
|
||||
from api_client import forward_vitals_to_api
|
||||
from config import settings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
async def retry_failed_transmissions():
|
||||
"""
|
||||
Background task that periodically checks for untransmitted vital readings
|
||||
and attempts to forward them to the API.
|
||||
"""
|
||||
logger.info("Starting background task for retrying failed transmissions...")
|
||||
|
||||
while True:
|
||||
try:
|
||||
db = SessionLocal()
|
||||
try:
|
||||
# Get readings that haven't been transmitted
|
||||
failed_readings = db.query(VitalReading).filter(VitalReading.transmitted == False).limit(50).all()
|
||||
|
||||
for reading in failed_readings:
|
||||
vitals = NormalizedVitals(
|
||||
device_id=reading.device_id,
|
||||
patient_id=reading.patient_id,
|
||||
timestamp=reading.timestamp,
|
||||
heart_rate=reading.heart_rate,
|
||||
spo2=reading.spo2,
|
||||
systolic_bp=reading.systolic_bp,
|
||||
diastolic_bp=reading.diastolic_bp,
|
||||
map_bp=reading.map_bp,
|
||||
respiratory_rate=reading.respiratory_rate,
|
||||
temperature=reading.temperature
|
||||
)
|
||||
|
||||
success = await forward_vitals_to_api(vitals)
|
||||
|
||||
if success:
|
||||
reading.transmitted = True
|
||||
log_entry = TransmissionLog(
|
||||
reading_id=reading.id,
|
||||
status="success",
|
||||
response_code=200
|
||||
)
|
||||
db.add(log_entry)
|
||||
logger.info(f"Successfully re-transmitted reading {reading.id}")
|
||||
else:
|
||||
# Log the failure but don't mark as transmitted
|
||||
log_entry = TransmissionLog(
|
||||
reading_id=reading.id,
|
||||
status="failed",
|
||||
error_message="Retry failed"
|
||||
)
|
||||
db.add(log_entry)
|
||||
|
||||
if failed_readings:
|
||||
db.commit()
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error in retry background task: {e}")
|
||||
|
||||
await asyncio.sleep(settings.retry_interval_seconds)
|
||||
Reference in New Issue
Block a user