fixed import error in band management
This commit is contained in:
parent
99a275f443
commit
18fc4cb0bd
117
vitallink/link-start.sh
Executable file
117
vitallink/link-start.sh
Executable file
@ -0,0 +1,117 @@
|
||||
#!/bin/bash
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo -e "${BLUE}"
|
||||
cat <<"EOF"
|
||||
╔══════════════════════════════════════════════════════════════════════════╗
|
||||
║ ║
|
||||
║ ██╗ ██╗██╗████████╗ █████╗ ██╗ ██╗ ██╗███╗ ██╗██╗ ██╗ ║
|
||||
║ ██║ ██║██║╚══██╔══╝██╔══██╗██║ ██║ ██║████╗ ██║██║ ██╔╝ ║
|
||||
║ ██║ ██║██║ ██║ ███████║██║ ██║ ██║██╔██╗ ██║█████╔╝ ║
|
||||
║ ╚██╗ ██╔╝██║ ██║ ██╔══██║██║ ██║ ██║██║╚██╗██║██╔═██╗ ║
|
||||
║ ╚████╔╝ ██║ ██║ ██║ ██║███████╗███████╗██║██║ ╚████║██║ ██╗ ║
|
||||
║ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ║
|
||||
║ ║
|
||||
║ Complete System Startup ║
|
||||
║ ║
|
||||
╚══════════════════════════════════════════════════════════════════════════╝
|
||||
EOF
|
||||
echo -e "${NC}"
|
||||
|
||||
echo -e "${YELLOW}Starting VitalLink Complete System...${NC}\n"
|
||||
|
||||
# Create logs directory
|
||||
mkdir -p logs
|
||||
|
||||
# Activate Python virtual environment
|
||||
echo -e "${BLUE}[1/5]${NC} Activating Python environment..."
|
||||
source .venv/bin/activate
|
||||
|
||||
# Start Backend
|
||||
echo -e "${BLUE}[2/5]${NC} Starting Backend API..."
|
||||
python backend/server.py >logs/backend.log 2>&1 &
|
||||
BACKEND_PID=$!
|
||||
echo $BACKEND_PID >logs/backend.pid
|
||||
echo -e " ${GREEN}✓${NC} Backend started (PID: $BACKEND_PID)"
|
||||
sleep 3
|
||||
|
||||
# Start Wristband System
|
||||
echo -e "${BLUE}[3/5]${NC} Starting Wristband Management System..."
|
||||
python simulator/main_runner.py >logs/wristbands.log 2>&1 &
|
||||
WRISTBAND_PID=$!
|
||||
echo $WRISTBAND_PID >logs/wristbands.pid
|
||||
echo -e " ${GREEN}✓${NC} Wristband system started (PID: $WRISTBAND_PID)"
|
||||
sleep 2
|
||||
|
||||
# Start Dashboard Frontend
|
||||
echo -e "${BLUE}[4/5]${NC} Starting Staff Dashboard..."
|
||||
cd frontend/dashboard
|
||||
npm run dev >../../logs/dashboard.log 2>&1 &
|
||||
DASHBOARD_PID=$!
|
||||
echo $DASHBOARD_PID >../../logs/dashboard.pid
|
||||
cd ../..
|
||||
echo -e " ${GREEN}✓${NC} Dashboard started (PID: $DASHBOARD_PID)"
|
||||
sleep 2
|
||||
|
||||
# Start Kiosk Frontend
|
||||
echo -e "${BLUE}[5/5]${NC} Starting Check-in Kiosk..."
|
||||
cd frontend/kiosk
|
||||
npm run dev >../../logs/kiosk.log 2>&1 &
|
||||
KIOSK_PID=$!
|
||||
echo $KIOSK_PID >../../logs/kiosk.pid
|
||||
cd ../..
|
||||
echo -e " ${GREEN}✓${NC} Kiosk started (PID: $KIOSK_PID)"
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}═══════════════════════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${GREEN} ✅ VitalLink System Running! ${NC}"
|
||||
echo -e "${GREEN}═══════════════════════════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}📊 Access Points:${NC}"
|
||||
echo -e " ${BLUE}•${NC} Backend API: http://localhost:8000"
|
||||
echo -e " ${BLUE}•${NC} API Documentation: http://localhost:8000/docs"
|
||||
echo -e " ${BLUE}•${NC} Staff Dashboard: http://localhost:5173"
|
||||
echo -e " ${BLUE}•${NC} Check-in Kiosk: http://localhost:5174"
|
||||
echo ""
|
||||
echo -e "${YELLOW}📝 View Logs:${NC}"
|
||||
echo -e " ${BLUE}•${NC} Backend: tail -f logs/backend.log"
|
||||
echo -e " ${BLUE}•${NC} Wristbands: tail -f logs/wristbands.log"
|
||||
echo -e " ${BLUE}•${NC} Dashboard: tail -f logs/dashboard.log"
|
||||
echo -e " ${BLUE}•${NC} Kiosk: tail -f logs/kiosk.log"
|
||||
echo ""
|
||||
echo -e "${YELLOW}🔧 System Features:${NC}"
|
||||
echo -e " ${GREEN}✓${NC} Auto-assigns wristbands when patients check in"
|
||||
echo -e " ${GREEN}✓${NC} Prefers real wristbands over simulated"
|
||||
echo -e " ${GREEN}✓${NC} Creates emergency simulated bands if needed"
|
||||
echo -e " ${GREEN}✓${NC} Real-time monitoring and updates"
|
||||
echo ""
|
||||
echo -e "${YELLOW}🛑 Stop System:${NC}"
|
||||
echo -e " ${BLUE}•${NC} Run: ./stop_everything.sh"
|
||||
echo -e " ${BLUE}•${NC} Or press Ctrl+C (will stop all services)"
|
||||
echo ""
|
||||
echo -e "${GREEN}═══════════════════════════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
|
||||
# Save all PIDs for easy cleanup
|
||||
cat >logs/all_pids.txt <<PIDSEOF
|
||||
$BACKEND_PID
|
||||
$WRISTBAND_PID
|
||||
$DASHBOARD_PID
|
||||
$KIOSK_PID
|
||||
PIDSEOF
|
||||
|
||||
echo -e "${BLUE}Tip:${NC} Open http://localhost:5174 to check in a patient and watch it appear on http://localhost:5173"
|
||||
echo ""
|
||||
|
||||
# Optional: Wait for user interrupt
|
||||
# read -p "Press Enter to stop all services..."
|
||||
# ./stop_everything.sh
|
||||
4
vitallink/logs/all_pids.txt
Normal file
4
vitallink/logs/all_pids.txt
Normal file
@ -0,0 +1,4 @@
|
||||
103455
|
||||
103468
|
||||
103478
|
||||
103512
|
||||
@ -1,7 +1,291 @@
|
||||
/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:369: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("startup")
|
||||
INFO: Started server process [103455]
|
||||
INFO: Waiting for application startup.
|
||||
INFO: Application startup complete.
|
||||
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
|
||||
================================================================================
|
||||
VitalLink Backend API Started
|
||||
================================================================================
|
||||
API Documentation: http://localhost:8000/docs
|
||||
WebSocket Endpoint: ws://localhost:8000/ws
|
||||
================================================================================
|
||||
INFO: 127.0.0.1:33998 - "GET / HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:57478 - "OPTIONS /api/checkin HTTP/1.1" 200 OK
|
||||
/home/mai/documents/school/capstone/vitallink-BS/vitallink/backend/server.py:216: PydanticDeprecatedSince20: The `dict` method is deprecated; use `model_dump` instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.12/migration/
|
||||
await broadcast_update({"type": "patient_added", "patient": patient.dict()})
|
||||
INFO: 127.0.0.1:57478 - "POST /api/checkin HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:46400 - "GET /api/queue HTTP/1.1" 200 OK
|
||||
INFO: 127.0.0.1:56702 - "GET /api/stats HTTP/1.1" 200 OK
|
||||
|
||||
@ -1 +1 @@
|
||||
33109
|
||||
103455
|
||||
|
||||
9
vitallink/logs/dashboard.log
Normal file
9
vitallink/logs/dashboard.log
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
> dashboard@0.0.0 dev
|
||||
> vite
|
||||
|
||||
|
||||
VITE v7.1.10 ready in 100 ms
|
||||
|
||||
➜ Local: http://localhost:5173/
|
||||
➜ Network: use --host to expose
|
||||
1
vitallink/logs/dashboard.pid
Normal file
1
vitallink/logs/dashboard.pid
Normal file
@ -0,0 +1 @@
|
||||
103478
|
||||
10
vitallink/logs/kiosk.log
Normal file
10
vitallink/logs/kiosk.log
Normal file
@ -0,0 +1,10 @@
|
||||
|
||||
> kiosk@0.0.0 dev
|
||||
> vite
|
||||
|
||||
Port 5173 is in use, trying another one...
|
||||
|
||||
VITE v7.1.10 ready in 103 ms
|
||||
|
||||
➜ Local: http://localhost:5174/
|
||||
➜ Network: use --host to expose
|
||||
1
vitallink/logs/kiosk.pid
Normal file
1
vitallink/logs/kiosk.pid
Normal file
@ -0,0 +1 @@
|
||||
103512
|
||||
25
vitallink/logs/wristbands.log
Normal file
25
vitallink/logs/wristbands.log
Normal file
@ -0,0 +1,25 @@
|
||||
⚠️ Bleak not installed. Real wristbands disabled. Install with: pip install bleak
|
||||
Creating default config at wristband_config.yaml
|
||||
✓ Loaded configuration from wristband_config.yaml
|
||||
|
||||
================================================================================
|
||||
VitalLink System Initialization
|
||||
================================================================================
|
||||
|
||||
✓ Backend is running at http://localhost:8000
|
||||
Traceback (most recent call last):
|
||||
File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/simulator/main_runner.py", line 282, in <module>
|
||||
asyncio.run(system.run())
|
||||
File "/home/mai/.local/share/uv/python/cpython-3.9.20-linux-x86_64-gnu/lib/python3.9/asyncio/runners.py", line 44, in run
|
||||
return loop.run_until_complete(main)
|
||||
File "/home/mai/.local/share/uv/python/cpython-3.9.20-linux-x86_64-gnu/lib/python3.9/asyncio/base_events.py", line 647, in run_until_complete
|
||||
return future.result()
|
||||
File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/simulator/main_runner.py", line 153, in run
|
||||
await self.initialize()
|
||||
File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/simulator/main_runner.py", line 52, in initialize
|
||||
self.manager.add_simulated_band(
|
||||
File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/simulator/wristband_manager.py", line 324, in add_simulated_band
|
||||
band = SimulatedWristband(band_id, profile)
|
||||
File "/home/mai/documents/school/capstone/vitallink-BS/vitallink/simulator/wristband_manager.py", line 243, in __init__
|
||||
from simulator.wristband_simulator import PATIENT_PROFILES, WristbandSimulator
|
||||
ModuleNotFoundError: No module named 'simulator'
|
||||
1
vitallink/logs/wristbands.pid
Normal file
1
vitallink/logs/wristbands.pid
Normal file
@ -0,0 +1 @@
|
||||
103468
|
||||
BIN
vitallink/simulator/__pycache__/config_system.cpython-39.pyc
Normal file
BIN
vitallink/simulator/__pycache__/config_system.cpython-39.pyc
Normal file
Binary file not shown.
BIN
vitallink/simulator/__pycache__/wristband_manager.cpython-39.pyc
Normal file
BIN
vitallink/simulator/__pycache__/wristband_manager.cpython-39.pyc
Normal file
Binary file not shown.
@ -167,7 +167,7 @@ def cli_inventory():
|
||||
print("=" * 80)
|
||||
|
||||
print("\nSimulated Wristbands:")
|
||||
simulated = config.get_simulated_bands()
|
||||
simulated = config.get_simulated_bands() or [] # Add "or []"
|
||||
if simulated:
|
||||
for band in simulated:
|
||||
print(f" 🟢 {band['band_id']:20} | Profile: {band['profile']}")
|
||||
@ -175,7 +175,7 @@ def cli_inventory():
|
||||
print(" (none configured)")
|
||||
|
||||
print("\nReal Wristbands (Hardware):")
|
||||
real = config.get_real_bands()
|
||||
real = config.get_real_bands() or [] # Add "or []"
|
||||
if real:
|
||||
for band in real:
|
||||
print(f" 🔵 {band['band_id']:20} | BLE: {band['ble_address']}")
|
||||
|
||||
@ -1,12 +1,14 @@
|
||||
"""
|
||||
VitalLink Main System Runner
|
||||
Runs the complete system with real and/or simulated wristbands
|
||||
Automatically assigns bands when patients check in via kiosk
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import aiohttp
|
||||
from wristband_manager import WristbandManager
|
||||
from config_system import WristbandConfig
|
||||
import sys
|
||||
|
||||
# ============================================================================
|
||||
# MAIN SYSTEM
|
||||
@ -21,6 +23,7 @@ class VitalLinkSystem:
|
||||
self.config = WristbandConfig()
|
||||
self.backend_url = self.config.get("backend_url", "http://localhost:8000")
|
||||
self.running = False
|
||||
self.monitoring_task = None
|
||||
|
||||
async def initialize(self):
|
||||
"""Initialize the system"""
|
||||
@ -29,7 +32,9 @@ class VitalLinkSystem:
|
||||
print("=" * 80 + "\n")
|
||||
|
||||
# Check backend availability
|
||||
await self.check_backend()
|
||||
backend_ok = await self.check_backend()
|
||||
if not backend_ok:
|
||||
print("\n⚠️ Warning: Backend not running. System will wait for backend...")
|
||||
|
||||
# Scan for real wristbands if configured
|
||||
if self.config.get("auto_scan_ble", False):
|
||||
@ -37,13 +42,13 @@ class VitalLinkSystem:
|
||||
await self.manager.scan_for_real_bands(timeout)
|
||||
|
||||
# Load configured real wristbands
|
||||
for band_config in self.config.get_real_bands():
|
||||
for band_config in self.config.get_real_bands() or []:
|
||||
self.manager.add_real_band(
|
||||
band_config["band_id"], band_config["ble_address"]
|
||||
)
|
||||
|
||||
# Load configured simulated wristbands
|
||||
for band_config in self.config.get_simulated_bands():
|
||||
for band_config in self.config.get_simulated_bands() or []:
|
||||
self.manager.add_simulated_band(
|
||||
band_config["band_id"], band_config.get("profile", "stable")
|
||||
)
|
||||
@ -55,89 +60,112 @@ class VitalLinkSystem:
|
||||
"""Check if backend is running"""
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"{self.backend_url}/") as resp:
|
||||
async with session.get(
|
||||
f"{self.backend_url}/", timeout=aiohttp.ClientTimeout(total=3)
|
||||
) as resp:
|
||||
if resp.status == 200:
|
||||
print(f"✓ Backend is running at {self.backend_url}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"❌ Backend not reachable at {self.backend_url}")
|
||||
print(f" Error: {e}")
|
||||
print("\n⚠️ Start backend with: python backend/server.py")
|
||||
return False
|
||||
|
||||
async def auto_checkin_and_assign(self):
|
||||
"""Automatically check in patients and assign available bands"""
|
||||
return False
|
||||
|
||||
# Mock patients for demo
|
||||
demo_patients = [
|
||||
{
|
||||
"firstName": "John",
|
||||
"lastName": "Smith",
|
||||
"dob": "1985-03-15",
|
||||
"symptoms": ["Chest Pain"],
|
||||
"severity": "mild",
|
||||
},
|
||||
{
|
||||
"firstName": "Sarah",
|
||||
"lastName": "Johnson",
|
||||
"dob": "1990-07-22",
|
||||
"symptoms": ["Fever", "Difficulty Breathing"],
|
||||
"severity": "moderate",
|
||||
},
|
||||
{
|
||||
"firstName": "Michael",
|
||||
"lastName": "Chen",
|
||||
"dob": "1978-11-05",
|
||||
"symptoms": ["Severe Headache"],
|
||||
"severity": "severe",
|
||||
},
|
||||
]
|
||||
|
||||
print("\nAuto check-in patients...")
|
||||
async def monitor_new_patients(self):
|
||||
"""Monitor backend for new patient check-ins and auto-assign bands"""
|
||||
print("\n🔍 Monitoring for new patient check-ins...")
|
||||
|
||||
known_patients = set()
|
||||
prefer_real = self.config.get("prefer_real_bands", False)
|
||||
|
||||
for patient_data in demo_patients:
|
||||
while self.running:
|
||||
try:
|
||||
# Check in patient via API
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(
|
||||
f"{self.backend_url}/api/checkin", json=patient_data
|
||||
) as resp:
|
||||
async with session.get(f"{self.backend_url}/api/queue") as resp:
|
||||
if resp.status == 200:
|
||||
data = await resp.json()
|
||||
patient_id = data["patient_id"]
|
||||
assigned_band_id = data["band_id"]
|
||||
queue = await resp.json()
|
||||
|
||||
print(
|
||||
f"✓ {patient_data['firstName']} {patient_data['lastName']} → {patient_id}"
|
||||
)
|
||||
for patient in queue:
|
||||
patient_id = patient["patient_id"]
|
||||
|
||||
# Find and assign a physical/simulated band
|
||||
band = self.manager.assign_band(
|
||||
patient_id, prefer_real=prefer_real
|
||||
)
|
||||
# New patient detected
|
||||
if patient_id not in known_patients:
|
||||
known_patients.add(patient_id)
|
||||
|
||||
if band:
|
||||
# Start monitoring
|
||||
await self.manager.start_monitoring(band.band_id)
|
||||
# Check if already has a band assigned and monitoring
|
||||
has_active_band = any(
|
||||
b.patient_id == patient_id
|
||||
and b.band_id in self.manager.active_monitoring
|
||||
for b in self.manager.inventory.values()
|
||||
)
|
||||
|
||||
if not has_active_band:
|
||||
print(
|
||||
f"\n🆕 New patient detected: {patient_id} ({patient['name']})"
|
||||
)
|
||||
|
||||
# Try to assign a band
|
||||
band = self.manager.assign_band(
|
||||
patient_id, prefer_real=prefer_real
|
||||
)
|
||||
|
||||
if band:
|
||||
print(
|
||||
f" ✓ Assigned {band.band_id} ({band.type.value})"
|
||||
)
|
||||
|
||||
# Start monitoring
|
||||
await self.manager.start_monitoring(
|
||||
band.band_id
|
||||
)
|
||||
else:
|
||||
# No bands available - create a new simulated one on the fly
|
||||
print(
|
||||
f" ⚠️ No bands available, creating emergency simulated band..."
|
||||
)
|
||||
|
||||
emergency_band_id = f"VitalLink-EMRG{len(self.manager.inventory):02d}"
|
||||
band = self.manager.add_simulated_band(
|
||||
emergency_band_id, "stable"
|
||||
)
|
||||
band.assign_to_patient(patient_id)
|
||||
|
||||
print(
|
||||
f" ✓ Created and assigned {emergency_band_id}"
|
||||
)
|
||||
|
||||
await self.manager.start_monitoring(
|
||||
band.band_id
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Failed to check in {patient_data['firstName']}: {e}")
|
||||
# Silently continue if backend temporarily unavailable
|
||||
pass
|
||||
|
||||
print()
|
||||
# Check every 2 seconds
|
||||
await asyncio.sleep(2)
|
||||
|
||||
async def run(self):
|
||||
"""Run the main system"""
|
||||
self.running = True
|
||||
|
||||
await self.initialize()
|
||||
await self.auto_checkin_and_assign()
|
||||
|
||||
print("=" * 80)
|
||||
print("\n" + "=" * 80)
|
||||
print("VitalLink System Running")
|
||||
print("=" * 80)
|
||||
print("\nMonitoring patients... Press Ctrl+C to stop\n")
|
||||
print("\n✓ Monitoring for new patients from kiosk check-ins")
|
||||
print(
|
||||
"✓ Auto-assigning wristbands (prefer real: {})".format(
|
||||
self.config.get("prefer_real_bands", False)
|
||||
)
|
||||
)
|
||||
print("\nPress Ctrl+C to stop\n")
|
||||
print("=" * 80 + "\n")
|
||||
|
||||
# Start monitoring for new patients
|
||||
self.monitoring_task = asyncio.create_task(self.monitor_new_patients())
|
||||
|
||||
try:
|
||||
# Keep running until interrupted
|
||||
@ -146,20 +174,29 @@ class VitalLinkSystem:
|
||||
|
||||
# Periodic status update
|
||||
status = self.manager.get_status()
|
||||
available = status["status_breakdown"].get("available", 0)
|
||||
|
||||
print(
|
||||
f"[{asyncio.get_event_loop().time():.0f}s] Active: {status['active_monitoring']} | "
|
||||
f"Available: {status['status_breakdown']['available']}"
|
||||
f"[Status] Active: {status['active_monitoring']} monitoring | "
|
||||
f"Available: {available} bands | "
|
||||
f"Real: {status['real_bands']} | "
|
||||
f"Sim: {status['simulated_bands']}"
|
||||
)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("\n\nShutting down...")
|
||||
print("\n\n⚠️ Shutting down...")
|
||||
await self.shutdown()
|
||||
|
||||
async def shutdown(self):
|
||||
"""Clean shutdown"""
|
||||
self.running = False
|
||||
|
||||
# Cancel monitoring task
|
||||
if self.monitoring_task:
|
||||
self.monitoring_task.cancel()
|
||||
|
||||
# Stop all monitoring
|
||||
print("Stopping all wristband monitoring...")
|
||||
for band_id in list(self.manager.active_monitoring.keys()):
|
||||
await self.manager.stop_monitoring(band_id)
|
||||
|
||||
@ -185,7 +222,7 @@ async def interactive_mode():
|
||||
print("2. Scan for real wristbands")
|
||||
print("3. Assign band to patient")
|
||||
print("4. Release band")
|
||||
print("5. Start auto-demo")
|
||||
print("5. Start auto-monitoring mode")
|
||||
print("6. Exit")
|
||||
|
||||
choice = input("\nSelect option: ")
|
||||
@ -236,9 +273,13 @@ if __name__ == "__main__":
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.interactive:
|
||||
asyncio.run(interactive_mode())
|
||||
else:
|
||||
# Normal automatic mode
|
||||
system = VitalLinkSystem()
|
||||
asyncio.run(system.run())
|
||||
try:
|
||||
if args.interactive:
|
||||
asyncio.run(interactive_mode())
|
||||
else:
|
||||
# Normal automatic mode
|
||||
system = VitalLinkSystem()
|
||||
asyncio.run(system.run())
|
||||
except KeyboardInterrupt:
|
||||
print("\n\nExiting...")
|
||||
sys.exit(0)
|
||||
|
||||
@ -240,7 +240,7 @@ class SimulatedWristband(BaseWristband):
|
||||
self.running = False
|
||||
|
||||
# Import simulator profiles
|
||||
from simulator.wristband_simulator import PATIENT_PROFILES, WristbandSimulator
|
||||
from wristband_simulator import PATIENT_PROFILES, WristbandSimulator
|
||||
|
||||
self.simulator = WristbandSimulator(
|
||||
band_id, PATIENT_PROFILES.get(profile, PATIENT_PROFILES["stable"]), None
|
||||
|
||||
@ -1,47 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
# Activate venv (bash way)
|
||||
source venv/bin/activate 2>/dev/null || source .venv/bin/activate 2>/dev/null
|
||||
|
||||
echo "╔═══════════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Starting VitalLink System ║"
|
||||
echo "╚═══════════════════════════════════════════════════════════════════════╝"
|
||||
echo ""
|
||||
|
||||
mkdir -p logs
|
||||
|
||||
echo "Starting backend server..."
|
||||
python backend/server.py > logs/backend.log 2>&1 &
|
||||
echo $! > logs/backend.pid
|
||||
echo "✓ Backend started (PID: $(cat logs/backend.pid))"
|
||||
|
||||
sleep 3
|
||||
|
||||
echo "Starting wristband simulator..."
|
||||
python simulator/wristband_simulator.py > logs/simulator.log 2>&1 &
|
||||
echo $! > logs/simulator.pid
|
||||
echo "✓ Simulator started (PID: $(cat logs/simulator.pid))"
|
||||
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════════════"
|
||||
echo "✅ VitalLink System Running!"
|
||||
echo "═══════════════════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "📊 Access Points:"
|
||||
echo " • API Docs: http://localhost:8000/docs"
|
||||
echo " • API Stats: http://localhost:8000/api/stats"
|
||||
echo " • WebSocket: ws://localhost:8000/ws"
|
||||
echo " • Staff Dashboard: file://$PROJECT_ROOT/frontend/dashboard/index.html"
|
||||
echo " • Check-in Kiosk: file://$PROJECT_ROOT/frontend/kiosk/index.html"
|
||||
echo ""
|
||||
echo "📝 View Logs:"
|
||||
echo " • Backend: tail -f logs/backend.log"
|
||||
echo " • Simulator: tail -f logs/simulator.log"
|
||||
echo ""
|
||||
echo "🛑 Stop System:"
|
||||
echo " • Run: ./stop.sh"
|
||||
echo ""
|
||||
echo "═══════════════════════════════════════════════════════════════════════"
|
||||
@ -1,18 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
echo "Stopping VitalLink system..."
|
||||
|
||||
if [ -f logs/backend.pid ]; then
|
||||
kill $(cat logs/backend.pid) 2>/dev/null && echo "✓ Backend stopped" || echo "Backend not running"
|
||||
rm -f logs/backend.pid
|
||||
fi
|
||||
|
||||
if [ -f logs/simulator.pid ]; then
|
||||
kill $(cat logs/simulator.pid) 2>/dev/null && echo "✓ Simulator stopped" || echo "Simulator not running"
|
||||
rm -f logs/simulator.pid
|
||||
fi
|
||||
|
||||
echo "✓ VitalLink system stopped"
|
||||
36
vitallink/stop_everything.sh
Executable file
36
vitallink/stop_everything.sh
Executable file
@ -0,0 +1,36 @@
|
||||
#!/bin/bash
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
|
||||
echo "Stopping VitalLink Complete System..."
|
||||
echo ""
|
||||
|
||||
# Function to stop a service
|
||||
stop_service() {
|
||||
local name=$1
|
||||
local pidfile="logs/${name}.pid"
|
||||
|
||||
if [ -f "$pidfile" ]; then
|
||||
PID=$(cat "$pidfile")
|
||||
if kill -0 $PID 2>/dev/null; then
|
||||
kill $PID 2>/dev/null
|
||||
echo "✓ Stopped $name (PID: $PID)"
|
||||
else
|
||||
echo " $name already stopped"
|
||||
fi
|
||||
rm -f "$pidfile"
|
||||
fi
|
||||
}
|
||||
|
||||
# Stop all services
|
||||
stop_service "backend"
|
||||
stop_service "wristbands"
|
||||
stop_service "dashboard"
|
||||
stop_service "kiosk"
|
||||
|
||||
# Cleanup
|
||||
rm -f logs/all_pids.txt
|
||||
|
||||
echo ""
|
||||
echo "✓ VitalLink system stopped"
|
||||
@ -1,13 +0,0 @@
|
||||
cat >test.sh <<'TESTEOF'
|
||||
#!/bin/bash
|
||||
|
||||
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$PROJECT_ROOT"
|
||||
source venv/bin/activate 2>/dev/null || source .venv/bin/activate 2>/dev/null
|
||||
|
||||
echo "Running VitalLink Test Suite..."
|
||||
echo ""
|
||||
python tests/test_suite.py
|
||||
TESTEOF
|
||||
|
||||
chmod +x test.sh
|
||||
40
vitallink/wristband_config.yaml
Normal file
40
vitallink/wristband_config.yaml
Normal file
@ -0,0 +1,40 @@
|
||||
|
||||
# VitalLink Wristband Configuration
|
||||
# Edit this file to manage your wristband inventory
|
||||
|
||||
# Backend API URL
|
||||
backend_url: "http://localhost:8000"
|
||||
|
||||
# Auto-scan for real wristbands on startup
|
||||
auto_scan_ble: false
|
||||
scan_timeout: 10.0
|
||||
|
||||
# Simulated Wristbands
|
||||
# Add as many as you need for testing
|
||||
simulated_bands:
|
||||
- band_id: "VitalLink-SIM1"
|
||||
profile: "stable"
|
||||
|
||||
- band_id: "VitalLink-SIM2"
|
||||
profile: "mild_anxiety"
|
||||
|
||||
- band_id: "VitalLink-SIM3"
|
||||
profile: "deteriorating"
|
||||
|
||||
# Real Wristbands (Hardware)
|
||||
# Add BLE addresses of your physical wristbands
|
||||
# You can find these by running: python -m wristband_manager --scan
|
||||
real_bands:
|
||||
# Example (uncomment and edit when you have real hardware):
|
||||
# - band_id: "VitalLink-A3B2"
|
||||
# ble_address: "D7:91:3F:9A:12:34"
|
||||
#
|
||||
# - band_id: "VitalLink-7B42"
|
||||
# ble_address: "E1:84:7B:42:56:78"
|
||||
|
||||
# Default preference when assigning bands
|
||||
prefer_real_bands: false # Set to true to use real bands first
|
||||
|
||||
# Patient profiles for simulated bands
|
||||
# Options: stable, mild_anxiety, deteriorating, critical, sepsis
|
||||
default_profile: "stable"
|
||||
Loading…
x
Reference in New Issue
Block a user