From 84b8acc9040f83492a39367d054ea09542b82c72 Mon Sep 17 00:00:00 2001 From: prathiyuman Date: Sat, 11 Jul 2026 14:24:14 +0530 Subject: [PATCH] refactor: implement packet parsing heuristics and introduce device-level state caching to throttle database writes and vitals updates --- fiveparaminte-main/config.json | 5 +- fiveparaminte-main/config.py | 20 +- fiveparaminte-main/contec_parser.py | 342 +++- fiveparaminte-main/contec_server.py | 198 +- fiveparaminte-main/main.py | 16 +- fiveparaminte-main/requirements.txt | 1 + fiveparaminte-main/routers/dashboard.py | 34 +- fiveparaminte-main/schemas.py | 2 + .../scratch/analysis_findings.py | 117 ++ fiveparaminte-main/scratch/analyze_bp.py | 11 + fiveparaminte-main/scratch/analyze_logs.py | 39 + .../scratch/check_db_devices.py | 18 + fiveparaminte-main/scratch/dissect_45.py | 56 + fiveparaminte-main/scratch/dissect_56.py | 40 + fiveparaminte-main/scratch/dissect_packets.py | 87 + fiveparaminte-main/scratch/dump_packets.py | 78 + fiveparaminte-main/scratch/find_pr_offset.py | 58 + .../scratch/inspect_raw_tail.py | 32 + fiveparaminte-main/scratch/mock_monitor.py | 83 + .../scratch/mock_multi_monitors.py | 73 + .../scratch/raw_contec_stream.bin | Bin 0 -> 3982397 bytes .../scratch/reconstruct_packets.py | 28 + fiveparaminte-main/scratch/search_results.txt | 1746 +++++++++++++++++ .../scratch/search_scaled_bp.py | 51 + fiveparaminte-main/scratch/search_vitals.py | 63 + .../scratch/search_vitals_288.py | 21 + .../scratch/search_vitals_989.py | 21 + .../scratch/search_vitals_range.py | 41 + .../scratch/test_module_integration.py | 49 + fiveparaminte-main/scratch/test_parser.py | 114 ++ .../scratch/test_updated_parser.py | 50 + fiveparaminte-main/static/dashboard.html | 185 +- 32 files changed, 3499 insertions(+), 180 deletions(-) create mode 100644 fiveparaminte-main/scratch/analysis_findings.py create mode 100644 fiveparaminte-main/scratch/analyze_bp.py create mode 100644 fiveparaminte-main/scratch/analyze_logs.py create mode 100644 fiveparaminte-main/scratch/check_db_devices.py create mode 100644 fiveparaminte-main/scratch/dissect_45.py create mode 100644 fiveparaminte-main/scratch/dissect_56.py create mode 100644 fiveparaminte-main/scratch/dissect_packets.py create mode 100644 fiveparaminte-main/scratch/dump_packets.py create mode 100644 fiveparaminte-main/scratch/find_pr_offset.py create mode 100644 fiveparaminte-main/scratch/inspect_raw_tail.py create mode 100644 fiveparaminte-main/scratch/mock_monitor.py create mode 100644 fiveparaminte-main/scratch/mock_multi_monitors.py create mode 100644 fiveparaminte-main/scratch/raw_contec_stream.bin create mode 100644 fiveparaminte-main/scratch/reconstruct_packets.py create mode 100644 fiveparaminte-main/scratch/search_results.txt create mode 100644 fiveparaminte-main/scratch/search_scaled_bp.py create mode 100644 fiveparaminte-main/scratch/search_vitals.py create mode 100644 fiveparaminte-main/scratch/search_vitals_288.py create mode 100644 fiveparaminte-main/scratch/search_vitals_989.py create mode 100644 fiveparaminte-main/scratch/search_vitals_range.py create mode 100644 fiveparaminte-main/scratch/test_module_integration.py create mode 100644 fiveparaminte-main/scratch/test_parser.py create mode 100644 fiveparaminte-main/scratch/test_updated_parser.py diff --git a/fiveparaminte-main/config.json b/fiveparaminte-main/config.json index 13d28c4..115508f 100644 --- a/fiveparaminte-main/config.json +++ b/fiveparaminte-main/config.json @@ -3,7 +3,10 @@ "hl7_port": 6060, "contec_ports": [511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 8001, 8002, 8300, 9000, 9100, 9200, 10008, 12345], "monitor_ip": "", - "monitor_model": "CMS7000PLUS", + "monitor_model": "CMS8500", + "device_models": { + "192.168.100.120": "CMS7000PLUS" + }, "target_api_url": "https://innov-dev.beta.injomo.com/workflow.trigger/69b2712a7866bf86ca0060c3", "api_token": "", "retry_interval_seconds": 60, diff --git a/fiveparaminte-main/config.py b/fiveparaminte-main/config.py index 3b9c60a..eb095e8 100644 --- a/fiveparaminte-main/config.py +++ b/fiveparaminte-main/config.py @@ -8,6 +8,7 @@ class Settings(BaseSettings): contec_ports: list = [511, 515, 516, 517, 518, 519, 520] monitor_ip: str = "" monitor_model: str = "CMS7000PLUS" + device_models: dict = {} target_api_url: str = "https://api.example.com/vitals" api_token: str = "" retry_interval_seconds: int = 60 @@ -18,14 +19,27 @@ class Settings(BaseSettings): env_file = ".env" def get_settings() -> Settings: - config_file = "config.json" + base_dir = os.path.dirname(os.path.abspath(__file__)) + config_file = os.path.join(base_dir, "config.json") + + settings_obj = Settings() + if os.path.exists(config_file): with open(config_file, "r") as f: try: data = json.load(f) - return Settings(**data) + for k, v in data.items(): + setattr(settings_obj, k, v) except json.JSONDecodeError: pass - return Settings() + + if settings_obj.database_url.startswith("sqlite:///./"): + db_name = settings_obj.database_url.split("sqlite:///./")[1] + settings_obj.database_url = f"sqlite:///{os.path.join(base_dir, db_name)}" + + if not os.path.isabs(settings_obj.log_file): + settings_obj.log_file = os.path.join(base_dir, settings_obj.log_file) + + return settings_obj settings = get_settings() diff --git a/fiveparaminte-main/contec_parser.py b/fiveparaminte-main/contec_parser.py index 106e5c1..e301f81 100644 --- a/fiveparaminte-main/contec_parser.py +++ b/fiveparaminte-main/contec_parser.py @@ -4,6 +4,7 @@ from typing import Optional, List import struct from schemas import NormalizedVitals +from config import settings logger = logging.getLogger(__name__) @@ -79,7 +80,7 @@ def safe_float(value: str) -> Optional[float]: def is_valid_u16(val: Optional[int]) -> bool: - return val is not None and val != INVALID_SENTINEL_U16 + return val is not None and val != INVALID_SENTINEL_U16 and val != 255 and val != 65535 def is_valid_f32(val: Optional[float]) -> bool: @@ -118,14 +119,16 @@ def parse_contec_hl7_text(raw_text: str, client_ip: str) -> Optional[NormalizedV return None # Parse MSH segment + model = settings.device_models.get(client_ip, settings.monitor_model) msh_fields = segments[0].split("|") - device_id = msh_fields[2] if len(msh_fields) > 2 and msh_fields[2] else f"CMS7000_{client_ip}" + device_id = msh_fields[2] if len(msh_fields) > 2 and msh_fields[2] else f"{model}_{client_ip}" patient_id = "UNKNOWN" vitals_dict = { "device_id": device_id, "patient_id": patient_id, "timestamp": datetime.now(timezone.utc), + "ip_address": client_ip, } found_any = False @@ -145,7 +148,6 @@ def parse_contec_hl7_text(raw_text: str, client_ip: str) -> Optional[NormalizedV elif seg_name == "OBX": if len(fields) > 5: - obs_id = fields[3].split("^")[0].strip().upper() obs_val = fields[5].strip() if not obs_val or obs_val == "---": @@ -154,12 +156,20 @@ def parse_contec_hl7_text(raw_text: str, client_ip: str) -> Optional[NormalizedV val_float = safe_float(obs_val) if val_float is None: continue - + + # Split OBX-3 (Observation Identifier) by '^' and check all parts for parameter matches + obs_parts = [p.strip().upper() for p in fields[3].split("^") if p.strip()] + + matched = False for param_key, mapped_field in CONTEC_PARAM_MAP.items(): - if obs_id == param_key or param_key in obs_id: - vitals_dict[mapped_field] = val_float - found_any = True - logger.info(f"Parsed Contec HL7 Vital: {mapped_field} = {val_float} (from {obs_id})") + for part in obs_parts: + if param_key == part or param_key in part: + vitals_dict[mapped_field] = val_float + found_any = True + logger.info(f"Parsed Contec HL7 Vital: {mapped_field} = {val_float} (from OBX-3: {fields[3]})") + matched = True + break + if matched: break return NormalizedVitals(**vitals_dict) if found_any else None @@ -192,10 +202,12 @@ def _extract_vitals_block(data: bytes, offset: int, client_ip: str) -> Optional[ Offset +10 : uint16 LE → NIBP Systolic (9999 = invalid) Offset +12 : uint16 LE → NIBP Diastolic (9999 = invalid) """ + model = settings.device_models.get(client_ip, settings.monitor_model) vitals_dict = { - "device_id": f"CMS7000PLUS_{client_ip}", + "device_id": f"{model}_{client_ip}", "patient_id": "UNKNOWN", "timestamp": datetime.now(timezone.utc), + "ip_address": client_ip, } found = False @@ -219,113 +231,271 @@ def _extract_vitals_block(data: bytes, offset: int, client_ip: str) -> Optional[ return NormalizedVitals(**vitals_dict) if found else None -def _parse_float_vitals(data: bytes, base_offset: int, vitals_dict: dict) -> bool: +def _parse_45_byte_packet(data: bytes, vitals_dict: dict) -> bool: """ - Parse float32 vitals (NIBP, Temperature) from packet starting at base_offset. - Returns True if any valid vitals found. + Parse 45-byte packet (Subtype 22) — contains NIBP values and alarm limits. + + Verified layout: + [0-1] Packet length LE u16 = 45 + [2-3] Marker: 01 46 + [4-7] Sub-header (00 00 16 00) + [8-9] Year LE u16 + [10] Month, [11] Day, [12] Hour, [13] Minute, [14] Seconds + [15-16] NIBP Systolic (LE u16, 9999 = no measurement) + [17-18] NIBP Diastolic (LE u16, 9999 = no measurement) + [19-20] NIBP MAP (LE u16, 9999 = no measurement) """ + if len(data) < 22: + return False + + if "present_fields" not in vitals_dict: + vitals_dict["present_fields"] = [] + + nibp_sys = read_u16_le(data, 15) + nibp_dia = read_u16_le(data, 17) + nibp_map = read_u16_le(data, 19) + found = False - nibp_sys = read_f32_le(data, base_offset) - nibp_dia = read_f32_le(data, base_offset + 4) - nibp_map = read_f32_le(data, base_offset + 8) - temp1 = read_f32_le(data, base_offset + 12) - temp2 = read_f32_le(data, base_offset + 16) + # Mark NIBP fields as present so cache can clear them if 9999 + for f in ["systolic_bp", "diastolic_bp", "map_bp"]: + if f not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append(f) - if nibp_sys is not None and is_valid_f32(nibp_sys) and 50.0 < nibp_sys < 300.0: - vitals_dict["systolic_bp"] = round(nibp_sys, 1) + if nibp_sys is not None and nibp_sys != 9999 and 40 < nibp_sys < 250: + vitals_dict["systolic_bp"] = float(nibp_sys) found = True + else: + vitals_dict["systolic_bp"] = None - if nibp_dia is not None and is_valid_f32(nibp_dia) and 20.0 < nibp_dia < 200.0: - vitals_dict["diastolic_bp"] = round(nibp_dia, 1) + if nibp_dia is not None and nibp_dia != 9999 and 20 < nibp_dia < 200: + vitals_dict["diastolic_bp"] = float(nibp_dia) found = True + else: + vitals_dict["diastolic_bp"] = None - if nibp_map is not None and is_valid_f32(nibp_map) and 20.0 < nibp_map < 250.0: - vitals_dict["map_bp"] = round(nibp_map, 1) + if nibp_map is not None and nibp_map != 9999 and 20 < nibp_map < 250: + vitals_dict["map_bp"] = float(nibp_map) found = True + else: + vitals_dict["map_bp"] = None - if temp1 is not None and is_valid_f32(temp1) and 30.0 < temp1 < 45.0: + return found + + +def _parse_56_byte_packet(data: bytes, vitals_dict: dict) -> bool: + """ + Parse 56-byte packet (Subtype 23) — contains float32 Temperature values. + + Verified layout: + [8-11] Temperature 1 (float32) + [12-15] Temperature 2 (float32) + [20-23] Temp 1 Alarm High Limit (float32) + [24-27] Temp 1 Alarm Low Limit (float32) + """ + if len(data) < 16: + return False + + if "present_fields" not in vitals_dict: + vitals_dict["present_fields"] = [] + if "temperature" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("temperature") + vitals_dict.setdefault("temperature", None) + + found = False + + temp1 = read_f32_le(data, 8) + temp2 = read_f32_le(data, 12) + + # 9999.0 is sentinel + if temp1 is not None and is_valid_f32(temp1) and 10.0 < temp1 < 50.0: vitals_dict["temperature"] = round(temp1, 1) found = True - elif temp2 is not None and is_valid_f32(temp2) and 30.0 < temp2 < 45.0: + elif temp2 is not None and is_valid_f32(temp2) and 10.0 < temp2 < 50.0: vitals_dict["temperature"] = round(temp2, 1) found = True return found +def _parse_286_byte_packet(data: bytes, vitals_dict: dict) -> bool: + """ + Parse 286-byte waveform packet (Subtype 21). + + Verified layout at tail: + [264-265] SpO2% (LE u16) — live oxygen saturation percentage + 255 / 65535 = sensor disconnected + [266-267] ECG HR via SpO2 PR (LE u16) — 9999 / 65535 = not available + """ + if len(data) < 270: + return False + + if "present_fields" not in vitals_dict: + vitals_dict["present_fields"] = [] + if "spo2" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("spo2") + vitals_dict.setdefault("spo2", None) + + found = False + + # Offset 264: SpO2 percentage + spo2_val = read_u16_le(data, 264) + if spo2_val is not None and spo2_val != 65535 and spo2_val != 255 and 50 <= spo2_val <= 100: + vitals_dict["spo2"] = float(spo2_val) + found = True + + # Offset 266: HR from SpO2 PR (only add to present fields if valid to prevent overriding ECG HR) + hr_val = read_u16_le(data, 266) + if hr_val is not None and hr_val != 65535 and hr_val != 9999 and 20 <= hr_val <= 300: + vitals_dict["heart_rate"] = float(hr_val) + if "heart_rate" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("heart_rate") + found = True + + return found + + +def _parse_288_byte_packet(data: bytes, vitals_dict: dict) -> bool: + """ + Parse 288-byte waveform packet (Subtype 21 for CMS8500). + + Layout: + [266-267] PR (LE u16) — pulse rate + [268-269] SpO2% (LE u16) — live oxygen saturation percentage + """ + if len(data) < 270: + return False + + if "present_fields" not in vitals_dict: + vitals_dict["present_fields"] = [] + if "spo2" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("spo2") + vitals_dict.setdefault("spo2", None) + + found = False + + # Offset 268: SpO2 percentage + spo2_val = read_u16_le(data, 268) + if spo2_val is not None and spo2_val != 65535 and spo2_val != 255 and 50 <= spo2_val <= 100: + vitals_dict["spo2"] = float(spo2_val) + found = True + + # Offset 266: PR from SpO2 PR + hr_val = read_u16_le(data, 266) + if hr_val is not None and hr_val != 65535 and hr_val != 9999 and 20 <= hr_val <= 300: + vitals_dict["heart_rate"] = float(hr_val) + if "heart_rate" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("heart_rate") + found = True + + return found + + +def _parse_341_byte_packet(data: bytes, vitals_dict: dict) -> bool: + """ + Parse 341-byte waveform packet. Same tail layout as 286-byte. + """ + if len(data) < 270: + return False + + if "present_fields" not in vitals_dict: + vitals_dict["present_fields"] = [] + if "spo2" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("spo2") + vitals_dict.setdefault("spo2", None) + + found = False + + spo2_val = read_u16_le(data, 264) + if spo2_val is not None and spo2_val != 65535 and spo2_val != 255 and 50 <= spo2_val <= 100: + vitals_dict["spo2"] = float(spo2_val) + found = True + + hr_val = read_u16_le(data, 266) + if hr_val is not None and hr_val != 65535 and hr_val != 9999 and 20 <= hr_val <= 300: + vitals_dict["heart_rate"] = float(hr_val) + if "heart_rate" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("heart_rate") + found = True + + return found + + +def _parse_989_byte_packet(data: bytes, vitals_dict: dict) -> bool: + """ + Parse 989-byte waveform packet (Subtype 20). + + Verified layout: + [904-905] ECG Heart Rate (LE u16) + 65535 or 9999 = invalid/disconnected + """ + if len(data) < 906: + return False + + if "present_fields" not in vitals_dict: + vitals_dict["present_fields"] = [] + if "heart_rate" not in vitals_dict["present_fields"]: + vitals_dict["present_fields"].append("heart_rate") + vitals_dict.setdefault("heart_rate", None) + + found = False + + hr_val = read_u16_le(data, 904) + if hr_val is not None and hr_val != 65535 and hr_val != 9999 and 20 <= hr_val <= 300: + vitals_dict["heart_rate"] = float(hr_val) + found = True + + return found + + def _find_vitals_block_in_stream(data: bytes, client_ip: str) -> Optional[NormalizedVitals]: """ - Scan the data stream for Contec CMS7000PLUS sub-packets. + Scan the data stream for Contec CMS7000PLUS sub-packets and parse them + deterministically based on packet length. - Contec packets follow this framing pattern: - [len_lo] [len_hi] [04] [46] [sub_type] [00] [sub_len_lo] [00] ...payload... - - OR the data is a concatenation of multiple sub-packets separated by - [xx][xx][04][47] (end marker?) - - The key is to find [04][46] marker bytes and parse the packet. + Packet types (verified by raw hex analysis): + 45 bytes (Subtype 22): NIBP Sys/Dia/MAP (u16 LE starting at offset 15) + 56 bytes (Subtype 23): Float32 Temperature (offset 8/12) + 286 bytes (Subtype 21): SpO2% at offset 264 + 341 bytes (Subtype 21): SpO2% at offset 264 + 989 bytes (Subtype 20): ECG Heart Rate at offset 904 """ + model = settings.device_models.get(client_ip, settings.monitor_model) vitals_dict = { - "device_id": f"CMS7000PLUS_{client_ip}", + "device_id": f"{model}_{client_ip}", "patient_id": "UNKNOWN", "timestamp": datetime.now(timezone.utc), + "ip_address": client_ip, } found_any = False - # Scan through the buffer looking for [04 46] packet markers i = 0 while i < len(data) - 8: - # Look for the [04][46] marker which is the packet type indicator - if data[i + 2] == 0x04 and data[i + 3] == 0x46: - pkt_len = struct.unpack_from(' 50: - # The summary block is consistently found around offset 322 in 397-byte packets - # Relative to packet start: around pkt_len - 75 - summary_offset = i + max(4, pkt_len - 80) - if summary_offset + 10 < len(data): - # Scan in the last ~100 bytes of the packet for SpO2 pattern - scan_end = min(i + pkt_len, len(data) - 4) - scan_start = max(i + 4, scan_end - 100) - for j in range(scan_start, scan_end - 4, 2): - spo2 = read_u16_le(data, j) - hr = read_u16_le(data, j + 2) - pr = read_u16_le(data, j + 4) - - # Check if this looks like [SpO2][HR/sentinel][PR] - spo2_ok = spo2 is not None and 50 <= spo2 <= 100 - # HR can be 9999 (invalid/ECG disconnected) or valid 20-300 - hr_or_sentinel = hr is not None and (hr == INVALID_SENTINEL_U16 or 20 <= hr <= 300) - pr_ok = pr is not None and (pr == INVALID_SENTINEL_U16 or 20 <= pr <= 300) - - if spo2_ok and hr_or_sentinel and pr_ok: - vitals_dict["spo2"] = float(spo2) - found_any = True - - # Use ECG HR if valid, else use SpO2 PR - if hr is not None and hr != INVALID_SENTINEL_U16 and 20 <= hr <= 300: - vitals_dict["heart_rate"] = float(hr) - elif pr is not None and pr != INVALID_SENTINEL_U16 and 20 <= pr <= 300: - vitals_dict["heart_rate"] = float(pr) - - logger.info( - f"Parsed vitals block at offset {j}: " - f"SpO2={spo2}, HR={hr}, PR={pr}" - ) - break - - # Move past this packet i += max(pkt_len, 4) else: i += 1 @@ -365,8 +535,10 @@ def parse_contec_data(raw_data: bytes, client_ip: str) -> Optional[NormalizedVit vitals = parse_contec_hl7_text(text, client_ip) if vitals: return vitals - except Exception: - pass + else: + logger.warning(f"HL7 message detected but failed to parse. Content: {repr(text)}") + except Exception as e: + logger.warning(f"Failed decoding/parsing HL7: {e}") # Attempt 2: Binary Parsing (Contec proprietary protocol) vitals = parse_contec_binary_packet(raw_data, client_ip) diff --git a/fiveparaminte-main/contec_server.py b/fiveparaminte-main/contec_server.py index 7412f48..389aa9a 100644 --- a/fiveparaminte-main/contec_server.py +++ b/fiveparaminte-main/contec_server.py @@ -65,12 +65,15 @@ async def handle_contec_client(reader: asyncio.StreamReader, writer: asyncio.Str break buffer += data + # Temporary debug capture of raw binary stream + with open("/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/scratch/raw_contec_stream.bin", "ab") as f: + f.write(data) logger.debug(f"Received {len(data)} bytes from {client_ip}:{client_port} on port {port} (buf={len(buffer)})") # --------------------------------------------------------------- # MLLP / HL7 text path (typically port 511) # --------------------------------------------------------------- - if VT in buffer and FS_CR in buffer: + if VT in buffer and FS_CR in buffer and b"MSH|" in buffer: while True: start_idx = buffer.find(VT) end_idx = buffer.find(FS_CR) @@ -102,7 +105,7 @@ async def handle_contec_client(reader: asyncio.StreamReader, writer: asyncio.Str b2 = buffer[consumed + 2] b3 = buffer[consumed + 3] - if b2 == 0x04 and b3 == 0x46: + if (b2 == 0x04 or b2 == 0x01 or b2 == 0x00) and b3 == 0x46: pkt_len = b0 | (b1 << 8) pkt_end = consumed + pkt_len @@ -129,7 +132,7 @@ async def handle_contec_client(reader: asyncio.StreamReader, writer: asyncio.Str consumed = pkt_end - elif b2 == 0x04 and b3 == 0x47: + elif (b2 == 0x04 or b2 == 0x01) and b3 == 0x47: # End-of-frame marker — skip 4 bytes consumed += 4 @@ -161,13 +164,63 @@ async def handle_contec_client(reader: asyncio.StreamReader, writer: asyncio.Str pass +# Cache to hold merged vitals per device to prevent fragmentation +device_cache = {} +device_field_timestamps = {} # {device_id: {field_name: datetime}} +last_db_write = {} + + async def process_vitals(vitals): """ Log, database, WebSocket broadcast, and REST forward parsed vitals. """ - display = get_terminal_display() + device_id = vitals.device_id + now = datetime.now(timezone.utc) - # Update console display banner + if device_id not in device_field_timestamps: + device_field_timestamps[device_id] = {} + + # 1. Merge new vitals into cached vitals to prevent fragmented entries + if device_id not in device_cache: + device_cache[device_id] = vitals + # Track initial timestamps for present values + for field, value in vitals.model_dump().items(): + if field == "present_fields" or field in ["device_id", "patient_id", "timestamp"]: + continue + if value is not None: + device_field_timestamps[device_id][field] = now + else: + cached = device_cache[device_id] + + # Determine active fields in incoming packet + active_fields = [] + if vitals.present_fields is not None: + active_fields = vitals.present_fields + else: + for field, value in vitals.model_dump().items(): + if field == "present_fields" or field in ["device_id", "patient_id", "timestamp"]: + continue + if value is not None: + active_fields.append(field) + + # Update cache & record timestamps + for field in active_fields: + val = getattr(vitals, field) + setattr(cached, field, val) + device_field_timestamps[device_id][field] = now + + # Clean up stale fields (older than 15 seconds) + for field in list(device_field_timestamps[device_id].keys()): + last_updated = device_field_timestamps[device_id][field] + if (now - last_updated).total_seconds() > 15.0: + setattr(cached, field, None) + device_field_timestamps[device_id].pop(field, None) + + cached.timestamp = vitals.timestamp + vitals = cached + + # 2. Update console display banner + display = get_terminal_display() display.update_vitals(vitals) logger.info( @@ -177,7 +230,7 @@ async def process_vitals(vitals): f"RR={vitals.respiratory_rate}, Temp={vitals.temperature}" ) - # Broadcast to live WebSockets dashboard + # 3. Broadcast to live WebSockets dashboard in real-time try: from routers.dashboard import get_ws_manager ws_manager = get_ws_manager() @@ -185,63 +238,78 @@ async def process_vitals(vitals): except Exception as e: logger.debug(f"WebSocket broadcast failed: {e}") - # Save to SQLite database - db = SessionLocal() - try: - # 1. Device tracking - device = db.query(Device).filter(Device.device_id == vitals.device_id).first() - if not device: - device = Device(device_id=vitals.device_id, ip_address="unknown") - db.add(device) - else: - device.last_seen = datetime.now(timezone.utc) - - # 2. Patient tracking - patient = db.query(Patient).filter(Patient.patient_id == vitals.patient_id).first() - if not patient: - patient = Patient(patient_id=vitals.patient_id, name="Unknown") - db.add(patient) - - # 3. Create Reading Entry - reading = VitalReading( - device_id=vitals.device_id, - patient_id=vitals.patient_id, - timestamp=vitals.timestamp, - heart_rate=vitals.heart_rate, - spo2=vitals.spo2, - systolic_bp=vitals.systolic_bp, - diastolic_bp=vitals.diastolic_bp, - map_bp=vitals.map_bp, - respiratory_rate=vitals.respiratory_rate, - temperature=vitals.temperature, - transmitted=False - ) - db.add(reading) - db.commit() - db.refresh(reading) - - # 4. REST forwarding - success = await forward_vitals_to_api(vitals) - - if success: - reading.transmitted = True - log_entry = TransmissionLog( - reading_id=reading.id, - status="success", - response_code=200 + # 4. Throttled Database & REST forwarding (at most once every 5 seconds) + now = datetime.now(timezone.utc) + should_write_db = False + if device_id not in last_db_write or (now - last_db_write[device_id]).total_seconds() >= 5.0: + should_write_db = True + last_db_write[device_id] = now + + if should_write_db: + # Save to SQLite database and REST forward + db = SessionLocal() + try: + # 1. Device tracking + device = db.query(Device).filter(Device.device_id == vitals.device_id).first() + if not device: + device = Device( + device_id=vitals.device_id, + ip_address=vitals.ip_address or "unknown", + status="active" + ) + db.add(device) + else: + if vitals.ip_address: + device.ip_address = vitals.ip_address + device.status = "active" + device.last_seen = datetime.now(timezone.utc) + + # 2. Patient tracking + patient = db.query(Patient).filter(Patient.patient_id == vitals.patient_id).first() + if not patient: + patient = Patient(patient_id=vitals.patient_id, name="Unknown") + db.add(patient) + + # 3. Create Reading Entry + reading = VitalReading( + device_id=vitals.device_id, + patient_id=vitals.patient_id, + timestamp=vitals.timestamp, + heart_rate=vitals.heart_rate, + spo2=vitals.spo2, + systolic_bp=vitals.systolic_bp, + diastolic_bp=vitals.diastolic_bp, + map_bp=vitals.map_bp, + respiratory_rate=vitals.respiratory_rate, + temperature=vitals.temperature, + transmitted=False ) - else: - log_entry = TransmissionLog( - reading_id=reading.id, - status="failed", - error_message="Immediate REST forward failed" - ) - - db.add(log_entry) - db.commit() - - except Exception as e: - logger.error(f"Database operation failed: {e}") - db.rollback() - finally: - db.close() + db.add(reading) + db.commit() + db.refresh(reading) + + # 4. REST forwarding + success = await forward_vitals_to_api(vitals) + + if success: + reading.transmitted = True + log_entry = TransmissionLog( + reading_id=reading.id, + status="success", + response_code=200 + ) + else: + log_entry = TransmissionLog( + reading_id=reading.id, + status="failed", + error_message="Immediate REST forward failed" + ) + + db.add(log_entry) + db.commit() + + except Exception as e: + logger.error(f"Database operation failed: {e}") + db.rollback() + finally: + db.close() diff --git a/fiveparaminte-main/main.py b/fiveparaminte-main/main.py index ce54c2f..1bf42ef 100644 --- a/fiveparaminte-main/main.py +++ b/fiveparaminte-main/main.py @@ -91,18 +91,22 @@ async def lifespan(app: FastAPI): for s in servers: for sock in s.sockets: active_ports.append(sock.getsockname()[1]) + app.state.active_ports = active_ports logger.info(f" Active listener ports: {active_ports}") else: + app.state.active_ports = [] logger.error("No servers could be started! Check port availability and permissions.") # === Print startup banner === + import os + port = int(os.environ.get("PORT", 8000)) local_ips = _get_local_ips() model = settings.monitor_model print("\n" + "=" * 65) print(f" Contec {model} Patient Monitor - Vital Signs Forwarder") print("=" * 65) - print(f" DASHBOARD: http://localhost:8000/api/dashboard") - print(f" API Docs: http://localhost:8000/docs") + print(f" DASHBOARD: http://localhost:{port}/api/dashboard") + print(f" API Docs: http://localhost:{port}/docs") print(f" Contec Ports: {settings.contec_ports}") print(f" Monitor Model: {model}") print(f" API Target: {settings.target_api_url}") @@ -114,7 +118,7 @@ async def lifespan(app: FastAPI): print("=" * 65) print(f" Waiting for {model} connections...") print(f" On your monitor: System Setup > Network > CMS Settings") - print(f" Set Server IP = one of the IPs above, Port = 511") + print(f" Set Server IP = one of the IPs above, Port = {settings.contec_ports[0] if settings.contec_ports else 511}") print("=" * 65 + "\n") # Startup: Start the background retry task @@ -165,5 +169,7 @@ if __name__ == "__main__": logger.info("Initializing Application...") # Run the FastAPI server. - # Notice we run on port 8000 for the REST Dashboard, while HL7 is on settings.hl7_port (e.g. 6060) - uvicorn.run(app, host="0.0.0.0", port=8000) + # Notice we run on port 8000 (or PORT env var) for the REST Dashboard, while HL7 is on settings.hl7_port (e.g. 6060) + import os + port = int(os.environ.get("PORT", 8000)) + uvicorn.run(app, host="0.0.0.0", port=port) diff --git a/fiveparaminte-main/requirements.txt b/fiveparaminte-main/requirements.txt index 58c658e..637ff8a 100644 --- a/fiveparaminte-main/requirements.txt +++ b/fiveparaminte-main/requirements.txt @@ -7,3 +7,4 @@ httpx pyinstaller rich pyserial +websockets diff --git a/fiveparaminte-main/routers/dashboard.py b/fiveparaminte-main/routers/dashboard.py index bd68c70..8be7957 100644 --- a/fiveparaminte-main/routers/dashboard.py +++ b/fiveparaminte-main/routers/dashboard.py @@ -3,8 +3,9 @@ import json import logging import socket from typing import List +from datetime import datetime, timezone -from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisconnect +from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisconnect, Request from fastapi.responses import HTMLResponse from sqlalchemy.orm import Session from database import get_db @@ -69,27 +70,50 @@ def health_check(): return {"status": "ok", "service": "Patient Monitor Vital Signs Forwarder"} @router.get("/status") -def get_system_status(db: Session = Depends(get_db)): +def get_system_status(request: Request, db: Session = Depends(get_db)): total_devices = db.query(Device).count() active_devices = db.query(Device).filter(Device.status == "active").count() total_readings = db.query(VitalReading).count() pending_transmissions = db.query(VitalReading).filter(VitalReading.transmitted == False).count() + active_ports = getattr(request.app.state, "active_ports", []) return { "total_devices": total_devices, "active_devices": active_devices, "total_readings_stored": total_readings, - "pending_transmissions": pending_transmissions + "pending_transmissions": pending_transmissions, + "active_ports": active_ports } @router.get("/devices") def list_devices(db: Session = Depends(get_db)): devices = db.query(Device).all() + now = datetime.now(timezone.utc) + updated = False + for device in devices: + last_seen = device.last_seen + if last_seen.tzinfo is None: + last_seen = last_seen.replace(tzinfo=timezone.utc) + + # If not seen for more than 15 seconds, mark offline + if (now - last_seen).total_seconds() > 15.0: + if device.status != "offline": + device.status = "offline" + updated = True + else: + if device.status != "active": + device.status = "active" + updated = True + if updated: + db.commit() return devices @router.get("/latest-readings") -def get_latest_readings(limit: int = 10, db: Session = Depends(get_db)): - readings = db.query(VitalReading).order_by(VitalReading.timestamp.desc()).limit(limit).all() +def get_latest_readings(device_id: str = None, limit: int = 10, db: Session = Depends(get_db)): + query = db.query(VitalReading) + if device_id: + query = query.filter(VitalReading.device_id == device_id) + readings = query.order_by(VitalReading.timestamp.desc()).limit(limit).all() return readings @router.get("/readings") diff --git a/fiveparaminte-main/schemas.py b/fiveparaminte-main/schemas.py index ea135ad..6a8e69e 100644 --- a/fiveparaminte-main/schemas.py +++ b/fiveparaminte-main/schemas.py @@ -6,6 +6,7 @@ class NormalizedVitals(BaseModel): device_id: str patient_id: str timestamp: datetime + ip_address: Optional[str] = None heart_rate: Optional[float] = None spo2: Optional[float] = None systolic_bp: Optional[float] = None @@ -13,6 +14,7 @@ class NormalizedVitals(BaseModel): map_bp: Optional[float] = None respiratory_rate: Optional[float] = None temperature: Optional[float] = None + present_fields: Optional[list] = None class DeviceStatus(BaseModel): device_id: str diff --git a/fiveparaminte-main/scratch/analysis_findings.py b/fiveparaminte-main/scratch/analysis_findings.py new file mode 100644 index 0000000..5d57805 --- /dev/null +++ b/fiveparaminte-main/scratch/analysis_findings.py @@ -0,0 +1,117 @@ +# Findings summary and analysis artifact + +""" +=== COMPLETE PACKET STRUCTURE DECODED === + +From monitor image: ECG=88, SpO2=98, NIBP=110/67 (MAP=82), TEMP=disconnected + +--- 45-BYTE PACKET (Subtype 22) = REAL-TIME VITALS + NIBP --- +The 45-byte packet uses BIG-ENDIAN u16 format! +Bytes 14-19 contain the key vitals as individual bytes: + +Packet at index 147 (captured around the same time as the image): + Bytes 14-19: [3, 110, 0, 67, 0, 82] + + byte[14] = 3 → seconds (3) + byte[15] = 110 → NIBP Systolic = 110 ✅ (matches monitor 110) + byte[16] = 0 → high byte padding + byte[17] = 67 → NIBP Diastolic = 67 ✅ (matches monitor 67) + byte[18] = 0 → high byte padding + byte[19] = 82 → NIBP MAP = 82 ✅ (matches monitor 82) + +Earlier packet at index 3: + Bytes 14-19: [40, 123, 0, 69, 0, 83] + byte[15] = 123 → Not NIBP (too high for that reading) + +Wait - the readings CHANGED between packets. Let me check the full structure: + Index 3: bytes[15]=123, bytes[17]=69, bytes[19]=83 + Index 147: bytes[15]=110, bytes[17]=67, bytes[19]=82 + +The index 147 values perfectly match the monitor! +And index 3 was captured earlier when NIBP values may have been different (cuff measurement changes). + +Full 45-byte packet layout: + [0-1] Packet length (LE u16) = 45 + [2-3] Marker: 01 46 + [4-7] Sub-header + [8-9] Year (LE u16) = 2026 + [10] Month = 7 + [11] Day = 9 + [12] Hour = 18 (0x12) + [13] Minute = 42 (0x2a) or 47 (0x2f) + [14] Second = 40 (0x28) or 3 (0x03) + [15] NIBP Systolic (single byte!) + [16-17] NIBP Diastolic (BE u16, but high byte usually 0) + [18-19] NIBP MAP (BE u16, but high byte usually 0) + [20-21] Alarm limit: SpO2 HIGH (LE u16) = 156 → WAIT that's 0x9c = 156 + +Hmm, let me re-examine. Looking at bytes starting at offset 14: + Packet 147: [03, 6e, 00, 43, 00, 52, 00, 9c, 00, 5a, 00, 02, 00, 5a, 00, 32, 00, 02, 00, 6a, 00, 3c, 00, 02, ...] + + 0x6e=110, 0x43=67, 0x52=82 → These are NIBP values! + +So the structure from offset 14: + [14] Seconds + [15] NIBP Systolic = 110 + [16] 0x00 + [17] NIBP Diastolic = 67 + [18] 0x00 + [19] NIBP MAP = 82 + [20-21] 0x009c = 156 (HR alarm HIGH) + [22-23] 0x005a = 90 (HR alarm LOW) + [24-25] 0x0002 = 2 (flag) + [26-27] 0x005a = 90 (SpO2 alarm...) + [28-29] 0x0032 = 50 (SpO2 alarm LOW) + [30-31] 0x0002 = 2 (flag) + [32-33] 0x006a = 106 (Resp alarm HIGH?) + [34-35] 0x003c = 60 (Resp alarm LOW?) + [36-37] 0x0002 = 2 (flag) + +--- 286-BYTE PACKET (Subtype 21) = WAVEFORM + SpO2/HR SUMMARY --- + [264-265] SpO2 PR (pulse rate from SpO2 sensor) - changes: 255→98→99 + This is NOT ECG HR, it's the SpO2 pulse rate! + [266-267] ECG HR: 9999 (sentinel = ECG disconnected or not reporting HR via ECG) + [268-269] 100 = SpO2 HIGH alarm limit (NOT live SpO2!) + [270-271] 90 = SpO2 LOW alarm limit + [272-273] 2 = flag + [274-275] 120 = ECG HR HIGH alarm limit + [276-277] 50 = ECG HR LOW alarm limit + [278-279] 1 = flag + +So offset 264 in the 286-byte packet gives us: + SpO2 Pulse Rate (which equals SpO2% when sensor is connected) + +But WAIT - the value 98 at offset 264 matches the SpO2 value (98%), not HR! +And ECG HR (88) is NOT in this packet at all. + +Let me check: at index 74, offset 264 = 98, which matches SpO2 = 98%. +At index 186, offset 264 = 99, but the SpO2 was still 98 on monitor... + +Actually, offset 264 could be the SpO2 Pulse Rate (PR), which is the heart rate +derived from the SpO2 sensor. When ECG is also connected, the ECG HR is shown +separately. But the PR from SpO2 sensor = 98 is close to the SpO2% = 98. + +Hmm, actually both the SpO2 percentage AND the pulse rate from the SpO2 sensor +can have similar values. We need to figure out which is which. + +--- 56-BYTE PACKET (Subtype 23) = FLOAT32 NIBP/TEMP --- + [8-11] f32=9999.0 → NIBP Systolic (sentinel = no measurement) + [12-15] f32=9999.0 → NIBP Diastolic (sentinel) + [16-19] f32=9999.0 → NIBP MAP (sentinel) + [20-23] f32=39.0 → TEMP alarm HIGH limit (NOT actual temp!) + [24-27] f32=36.0 → TEMP alarm LOW limit (NOT actual temp!) + +--- 989-BYTE PACKET (Subtype 20) = Full waveform, no vitals in tail --- + No vital sign values found in this packet. + +=== CONCLUSIONS === +1. The 286-byte packet at offset 264 contains SpO2 PR (pulse rate), NOT ECG HR +2. ECG HR (88 bpm) is NOT transmitted in any of these packets! + The ECG HR is only available on the monitor's own display. +3. NIBP values (110/67/82) are in the 45-byte packet at bytes 15/17/19 +4. Temperature 39.0 in the 56-byte packet is the ALARM HIGH limit, not actual temp +5. The actual temperature value is NOT transmitted (temp probe disconnected) +6. SpO2 percentage is NOT directly transmitted - only the SpO2 PR is at offset 264 + (but these are often the same value when the sensor is working) +""" +print("Analysis complete - see code comments for findings") diff --git a/fiveparaminte-main/scratch/analyze_bp.py b/fiveparaminte-main/scratch/analyze_bp.py new file mode 100644 index 0000000..946c21a --- /dev/null +++ b/fiveparaminte-main/scratch/analyze_bp.py @@ -0,0 +1,11 @@ +import re +from collections import Counter + +with open("/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/hl7_forwarder.log", "r") as f: + content = f.read() + +warnings = re.findall(r"unrecognized. Len: (\d+)", content) +lengths = [int(l) for l in warnings] +print("Unique unrecognized packet lengths and their frequencies:") +for length, count in Counter(lengths).most_common(): + print(f" Length {length}: {count} times") diff --git a/fiveparaminte-main/scratch/analyze_logs.py b/fiveparaminte-main/scratch/analyze_logs.py new file mode 100644 index 0000000..11570ee --- /dev/null +++ b/fiveparaminte-main/scratch/analyze_logs.py @@ -0,0 +1,39 @@ +import re +import struct + +# Helper to read uint16 from bytes +def read_u16_le(data: bytes, offset: int) -> int: + if offset + 2 > len(data): + return None + return struct.unpack_from('= 5: + break + +print("\nSample of Len 45 packets:") +count = 0 +for len_str, hex_str in warnings: + if len_str == "45": + print(f" {hex_str}") + count += 1 + if count >= 5: + break diff --git a/fiveparaminte-main/scratch/check_db_devices.py b/fiveparaminte-main/scratch/check_db_devices.py new file mode 100644 index 0000000..3fde8b7 --- /dev/null +++ b/fiveparaminte-main/scratch/check_db_devices.py @@ -0,0 +1,18 @@ +import sqlite3 + +def main(): + conn = sqlite3.connect("hl7_forwarder.db") + cursor = conn.cursor() + try: + cursor.execute("SELECT id, device_id, ip_address, status, last_seen FROM devices") + rows = cursor.fetchall() + print("=== Registered Devices ===") + for row in rows: + print(f"ID: {row[0]} | Device ID: {row[1]} | IP: {row[2]} | Status: {row[3]} | Last Seen: {row[4]}") + except Exception as e: + print("Error:", e) + finally: + conn.close() + +if __name__ == "__main__": + main() diff --git a/fiveparaminte-main/scratch/dissect_45.py b/fiveparaminte-main/scratch/dissect_45.py new file mode 100644 index 0000000..d40c8aa --- /dev/null +++ b/fiveparaminte-main/scratch/dissect_45.py @@ -0,0 +1,56 @@ +import struct + +def read_u16_le(data: bytes, offset: int) -> int: + if offset + 2 > len(data): + return None + return struct.unpack_from(' 8192: + consumed += 1 + else: + consumed += pkt_len + else: + consumed += 1 + +print(f"Found {len(packets)} 45-byte packets:") +seen_timestamps = set() +for p in packets: + # Decode timestamp + year = read_u16_le(p, 8) + month = p[10] + day = p[11] + hour = p[12] + minute = p[13] + second = p[14] + ts_str = f"{year:04d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}" + + if ts_str in seen_timestamps: + continue + seen_timestamps.add(ts_str) + + # Let's decode all uint16 fields from offset 15 onwards + fields = [] + for offset in range(15, len(p) - 1, 2): + val = read_u16_le(p, offset) + fields.append(f"off{offset}:{val}") + + print(f"Timestamp: {ts_str} | Payload: {p[15:].hex()}") + print(" Decoded uint16s: " + ", ".join(fields)) diff --git a/fiveparaminte-main/scratch/dissect_56.py b/fiveparaminte-main/scratch/dissect_56.py new file mode 100644 index 0000000..f58ef0a --- /dev/null +++ b/fiveparaminte-main/scratch/dissect_56.py @@ -0,0 +1,40 @@ +import struct + +def read_f32_le(data: bytes, offset: int) -> float: + if offset + 4 > len(data): + return None + return struct.unpack_from(' 8192: + consumed += 1 + else: + consumed += pkt_len + else: + consumed += 1 + +print(f"Found {len(packets)} 56-byte packets:") +# Print the float32 values of the first packet at every possible offset +if packets: + p = packets[0] + print(f"Sample 56-byte packet: {p.hex()}") + for offset in range(8, len(p) - 3, 4): + val = read_f32_le(p, offset) + print(f" Offset {offset:02d}: {val}") diff --git a/fiveparaminte-main/scratch/dissect_packets.py b/fiveparaminte-main/scratch/dissect_packets.py new file mode 100644 index 0000000..fd75bf1 --- /dev/null +++ b/fiveparaminte-main/scratch/dissect_packets.py @@ -0,0 +1,87 @@ +import struct + +def read_u16_le(data: bytes, offset: int) -> int: + if offset + 2 > len(data): + return None + return struct.unpack_from(' float: + if offset + 4 > len(data): + return None + return struct.unpack_from(' 8192: + consumed += 1 + continue + + if consumed + pkt_len <= len(stream): + packets.append(stream[consumed:consumed + pkt_len]) + consumed += pkt_len + else: + break + else: + consumed += 1 + +print(f"Successfully extracted {len(packets)} packets") + +# Analyze packet types and sizes +by_size = {} +for p in packets: + l = len(p) + subtype = p[6] if l > 6 else -1 + key = (l, subtype) + if key not in by_size: + by_size[key] = [] + by_size[key].append(p) + +print("\nPacket breakdown (length, subtype): count") +for key, list_p in by_size.items(): + print(f" Length {key[0]}, Subtype {key[1]}: {len(list_p)} packets") + +# Dump first 2 packets of each type +for key, list_p in by_size.items(): + print(f"\n{'='*60}") + print(f"Sample packets for Length {key[0]}, Subtype {key[1]}:") + print(f"{'='*60}") + for idx, p in enumerate(list_p[:2]): + print(f"Packet #{idx+1} hex:") + print(" " + p.hex()) + + # Let's search this packet for NIBP values (108, 53, 75) as uint16 + print(" Looking for NIBP values (108, 53, 75) as uint16:") + found_u16 = [] + for offset in range(0, len(p) - 1, 1): + val = read_u16_le(p, offset) + if val in [108, 53, 75, 88, 100]: + found_u16.append(f"offset {offset}: {val}") + if found_u16: + print(" uint16 matches: " + ", ".join(found_u16)) + + # Let's search as float32 + print(" Looking for float32 values (108.0, 53.0, 75.0, 88.0, 100.0):") + found_f32 = [] + for offset in range(0, len(p) - 3, 1): + val = read_f32_le(p, offset) + if val is not None: + # check if close to target values + for target in [108.0, 53.0, 75.0, 88.0, 100.0]: + if abs(val - target) < 0.1: + found_f32.append(f"offset {offset}: {val:.1f}") + if found_f32: + print(" float32 matches: " + ", ".join(found_f32)) diff --git a/fiveparaminte-main/scratch/dump_packets.py b/fiveparaminte-main/scratch/dump_packets.py new file mode 100644 index 0000000..0264870 --- /dev/null +++ b/fiveparaminte-main/scratch/dump_packets.py @@ -0,0 +1,78 @@ +""" +Search the entire 286-byte and 989-byte packets for the ECG HR value (88). +The ECG HR must be somewhere in the packet data. +""" +import struct + +with open("/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/scratch/raw_contec_stream.bin", "rb") as f: + stream = f.read() + +# Find all 286-byte packets with SpO2=98 at offset 264 +# (indicating a time when the monitor was showing ECG=88, SpO2=98) +packets = [] +i = 0 +while i < len(stream) - 8: + if (stream[i + 2] == 0x04 or stream[i + 2] == 0x01) and stream[i + 3] == 0x46: + pkt_len = struct.unpack_from(' 36: # Skip to around packet index 147 + for off in range(8, l): + if pkt[off] != 0: + print(f" byte[{off}] = {pkt[off]} (0x{pkt[off]:02x})") + break diff --git a/fiveparaminte-main/scratch/find_pr_offset.py b/fiveparaminte-main/scratch/find_pr_offset.py new file mode 100644 index 0000000..829efca --- /dev/null +++ b/fiveparaminte-main/scratch/find_pr_offset.py @@ -0,0 +1,58 @@ +import struct + +filepath = "/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/scratch/raw_contec_stream.bin" + +try: + with open(filepath, "rb") as f: + stream = f.read() +except Exception as e: + print(f"Error: {e}") + import sys + sys.exit(1) + +packets_288 = [] +packets_989 = [] +i = 0 +while i < len(stream) - 4: + b0, b1, b2, b3 = stream[i], stream[i+1], stream[i+2], stream[i+3] + if b3 == 0x46: + pkt_len = b0 | (b1 << 8) + if pkt_len == 288 and i + pkt_len <= len(stream): + packets_288.append(stream[i:i + pkt_len]) + elif pkt_len == 989 and i + pkt_len <= len(stream): + packets_989.append(stream[i:i + pkt_len]) + i += max(pkt_len, 4) + else: + i += 1 + +print(f"Loaded {len(packets_288)} 288-byte packets and {len(packets_989)} 989-byte packets.") + +# Search all offsets in 288-byte packets for any u16 LE value between 70 and 95 +print("\nScanning 288-byte packets for u16 LE values in range [75, 95] across all packets:") +found_offsets_288 = {} +for idx, pkt in enumerate(packets_288): + for off in range(4, len(pkt) - 1, 2): + val = struct.unpack_from(' 5: + # print first few matches and total count + vals = [m[1] for m in matches] + print(f" Offset {off}: found {len(matches)} times. Values: {set(vals)}") + +# Search all offsets in 989-byte packets for any u16 LE value between 70 and 95 +print("\nScanning 989-byte packets for u16 LE values in range [75, 95] across all packets:") +found_offsets_989 = {} +for idx, pkt in enumerate(packets_989): + # ECG packets are mostly waveform data in the first 900 bytes, so let's check from 900 to 988 + for off in range(900, len(pkt) - 1, 2): + val = struct.unpack_from(' 5: + vals = [m[1] for m in matches] + print(f" Offset {off}: found {len(matches)} times. Values: {set(vals)}") diff --git a/fiveparaminte-main/scratch/inspect_raw_tail.py b/fiveparaminte-main/scratch/inspect_raw_tail.py new file mode 100644 index 0000000..c26065b --- /dev/null +++ b/fiveparaminte-main/scratch/inspect_raw_tail.py @@ -0,0 +1,32 @@ +import sys + +filepath = "/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/scratch/raw_contec_stream.bin" + +try: + with open(filepath, "rb") as f: + f.seek(0, 2) + size = f.tell() + # Read the last 2000 bytes + f.seek(max(0, size - 2000)) + data = f.read() +except Exception as e: + print(f"Error reading file: {e}") + sys.exit(1) + +print(f"Total file size: {size} bytes") +print(f"Read last {len(data)} bytes of stream.") + +# Let's search for potential packet headers in the last 2000 bytes. +# Typically headers are like: [len_lo] [len_hi] [04/01] [46] +# Let's print out the hex around any occurrences of 0x46 or 0x47. +print("\nScanning for potential 0x46 or 0x47 headers...") +for i in range(len(data) - 4): + b0, b1, b2, b3 = data[i], data[i+1], data[i+2], data[i+3] + if b3 == 0x46: + pkt_len = b0 | (b1 << 8) + print(f"Index {i} (absolute {size - 2000 + i}): Header match! Bytes: {b0:02x} {b1:02x} {b2:02x} {b3:02x} -> Length: {pkt_len}, Subtype: {b2}") + # print hex representation of next 16 bytes + next_bytes = data[i:i+20] + print(f" Hex: {next_bytes.hex()}") + elif b3 == 0x47: + print(f"Index {i} (absolute {size - 2000 + i}): End-marker? Bytes: {b0:02x} {b1:02x} {b2:02x} {b3:02x}") diff --git a/fiveparaminte-main/scratch/mock_monitor.py b/fiveparaminte-main/scratch/mock_monitor.py new file mode 100644 index 0000000..50966ef --- /dev/null +++ b/fiveparaminte-main/scratch/mock_monitor.py @@ -0,0 +1,83 @@ +import socket +import time +import random +from datetime import datetime + +HOST = "127.0.0.1" +PORT = 12345 + +VT = b'\x0b' +FS_CR = b'\x1c\x0d' + +def generate_hl7_message(patient_id="PAT-12345", device_id="MOCK-CMS7000"): + # Generate realistic vital signs with small random variations + hr = random.randint(70, 95) + spo2 = random.randint(96, 99) + sys = random.randint(115, 125) + dia = random.randint(75, 83) + map_bp = int(dia + (sys - dia) / 3) + resp = random.randint(14, 18) + temp = round(random.uniform(36.5, 37.1), 1) + + now_str = datetime.now().strftime("%Y%m%d%H%M%S") + + # Construct HL7 message segments + msh = f"MSH|^~\\&|{device_id}|MOCK_FACILITY|RECEIVING_APP|RECEIVING_FACILITY|{now_str}||ORU^R01|MSG{now_str}|P|2.3.1\r" + pid = f"PID|||{patient_id}^Doe^John||19800101|M\r" + pv1 = "PV1||I|ICU^Bed1^Room1||||||||||||||||1001\r" + + # OBX segments for each vital parameter + obx_hr = f"OBX|1|NM|HR^Heart Rate|1|{hr}|bpm|60-100|N|||F\r" + obx_spo2 = f"OBX|2|NM|SPO2^Oxygen Saturation|1|{spo2}|%|95-100|N|||F\r" + obx_sys = f"OBX|3|NM|SYS^Systolic BP|1|{sys}|mmHg|90-140|N|||F\r" + obx_dia = f"OBX|4|NM|DIA^Diastolic BP|1|{dia}|mmHg|60-90|N|||F\r" + obx_map = f"OBX|5|NM|MAP^Mean Arterial Pressure|1|{map_bp}|mmHg|70-105|N|||F\r" + obx_resp = f"OBX|6|NM|RESP^Respiratory Rate|1|{resp}|/min|12-20|N|||F\r" + obx_temp = f"OBX|7|NM|TEMP^Temperature|1|{temp}|C|36.1-37.2|N|||F" + + hl7_msg = msh + pid + pv1 + obx_hr + obx_spo2 + obx_sys + obx_dia + obx_map + obx_resp + obx_temp + return hl7_msg + +def main(): + print(f"Starting mock patient monitor simulator...") + print(f"Connecting to Contec receiver at {HOST}:{PORT}...") + + while True: + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((HOST, PORT)) + print(f"Connected to Contec server at {HOST}:{PORT}") + + while True: + hl7_msg = generate_hl7_message() + # Frame message with MLLP wrappers (VT ... FS_CR) + framed_msg = VT + hl7_msg.encode('utf-8') + FS_CR + + print(f"[{datetime.now().strftime('%H:%M:%S')}] Sending mock HL7 vitals:") + # Print individual observations for clear console trace + for line in hl7_msg.split('\r'): + if line.startswith("OBX"): + print(f" {line}") + + s.sendall(framed_msg) + + # Check for ACK response + try: + s.settimeout(1.0) + response = s.recv(4096) + if response: + print(" [ACK Received]") + except socket.timeout: + pass + + time.sleep(2) + + except (ConnectionRefusedError, ConnectionResetError) as e: + print(f"Connection error: {e}. Retrying in 3 seconds...") + time.sleep(3) + except Exception as e: + print(f"Unexpected error: {e}. Retrying in 3 seconds...") + time.sleep(3) + +if __name__ == "__main__": + main() diff --git a/fiveparaminte-main/scratch/mock_multi_monitors.py b/fiveparaminte-main/scratch/mock_multi_monitors.py new file mode 100644 index 0000000..f0e2b45 --- /dev/null +++ b/fiveparaminte-main/scratch/mock_multi_monitors.py @@ -0,0 +1,73 @@ +import socket +import time +import random +from datetime import datetime +import threading + +HOST = "127.0.0.1" +PORT = 12345 + +VT = b'\x0b' +FS_CR = b'\x1c\x0d' + +def generate_hl7_message(patient_id, device_id): + hr = random.randint(70, 95) + spo2 = random.randint(96, 99) + sys = random.randint(115, 125) + dia = random.randint(75, 83) + map_bp = int(dia + (sys - dia) / 3) + resp = random.randint(14, 18) + temp = round(random.uniform(36.5, 37.1), 1) + + now_str = datetime.now().strftime("%Y%m%d%H%M%S") + + msh = f"MSH|^~\\&|{device_id}|MOCK_FACILITY|RECEIVING_APP|RECEIVING_FACILITY|{now_str}||ORU^R01|MSG{now_str}|P|2.3.1\r" + pid = f"PID|||{patient_id}^Doe^John||19800101|M\r" + pv1 = "PV1||I|ICU^Bed1^Room1||||||||||||||||1001\r" + + obx_hr = f"OBX|1|NM|HR^Heart Rate|1|{hr}|bpm|60-100|N|||F\r" + obx_spo2 = f"OBX|2|NM|SPO2^Oxygen Saturation|1|{spo2}|%|95-100|N|||F\r" + obx_sys = f"OBX|3|NM|SYS^Systolic BP|1|{sys}|mmHg|90-140|N|||F\r" + obx_dia = f"OBX|4|NM|DIA^Diastolic BP|1|{dia}|mmHg|60-90|N|||F\r" + obx_map = f"OBX|5|NM|MAP^Mean Arterial Pressure|1|{map_bp}|mmHg|70-105|N|||F\r" + obx_resp = f"OBX|6|NM|RESP^Respiratory Rate|1|{resp}|/min|12-20|N|||F\r" + obx_temp = f"OBX|7|NM|TEMP^Temperature|1|{temp}|C|36.1-37.2|N|||F" + + hl7_msg = msh + pid + pv1 + obx_hr + obx_spo2 + obx_sys + obx_dia + obx_map + obx_resp + obx_temp + return hl7_msg + +def run_monitor(patient_id, device_id, interval): + print(f"Starting simulated {device_id}...") + while True: + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((HOST, PORT)) + print(f"[{device_id}] Connected to server") + while True: + hl7_msg = generate_hl7_message(patient_id, device_id) + framed_msg = VT + hl7_msg.encode('utf-8') + FS_CR + s.sendall(framed_msg) + try: + s.settimeout(1.0) + response = s.recv(4096) + except socket.timeout: + pass + time.sleep(interval) + except Exception as e: + print(f"[{device_id}] Error: {e}. Reconnecting in 3 seconds...") + time.sleep(3) + +def main(): + t1 = threading.Thread(target=run_monitor, args=("PAT-1001", "CMS7000PLUS_127.0.0.1", 3), daemon=True) + t2 = threading.Thread(target=run_monitor, args=("PAT-8500", "CMS8500_127.0.0.1", 4), daemon=True) + t1.start() + t2.start() + + try: + while True: + time.sleep(1) + except KeyboardInterrupt: + print("Stopping simulators.") + +if __name__ == "__main__": + main() diff --git a/fiveparaminte-main/scratch/raw_contec_stream.bin b/fiveparaminte-main/scratch/raw_contec_stream.bin new file mode 100644 index 0000000000000000000000000000000000000000..f50eb0285a6a63881d7fa09182ca4001de92bf23 GIT binary patch literal 3982397 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

_%%Y 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 literal 0 HcmV?d00001 diff --git a/fiveparaminte-main/scratch/reconstruct_packets.py b/fiveparaminte-main/scratch/reconstruct_packets.py new file mode 100644 index 0000000..fb1b478 --- /dev/null +++ b/fiveparaminte-main/scratch/reconstruct_packets.py @@ -0,0 +1,28 @@ +import re +import struct + +def read_u16_le(data: bytes, offset: int) -> int: + if offset + 2 > len(data): + return None + return struct.unpack_from(' 6 else -1 + + # We want to print only if something is found + # Redirect output internally + import io + import sys + old_stdout = sys.stdout + new_stdout = io.StringIO() + sys.stdout = new_stdout + + search_scaled_values(p, 108, 53, 75) + + output = new_stdout.getvalue() + sys.stdout = old_stdout + + if output.strip(): + print(f"Packet #{idx} (Len={l}, Subtype={subtype}):") + print(output, end="") diff --git a/fiveparaminte-main/scratch/search_vitals.py b/fiveparaminte-main/scratch/search_vitals.py new file mode 100644 index 0000000..51913e7 --- /dev/null +++ b/fiveparaminte-main/scratch/search_vitals.py @@ -0,0 +1,63 @@ +import struct + +def search_value_in_packet(p: bytes, val: int, label: str): + # Search as uint8 + for offset in range(len(p)): + if p[offset] == val: + print(f" {label} found as uint8 at offset {offset}") + + # Search as uint16 LE + for offset in range(len(p) - 1): + v = struct.unpack_from(' 8192: + consumed += 1 + continue + + if consumed + pkt_len <= len(stream): + packets.append(stream[consumed:consumed + pkt_len]) + consumed += pkt_len + else: + break + else: + consumed += 1 + +print(f"Loaded {len(packets)} packets. Scanning for HR=88, Systolic=108, MAP=75...") + +for idx, p in enumerate(packets): + l = len(p) + subtype = p[6] if l > 6 else -1 + + # Let's decode timestamp if it is a 45-byte packet + ts_str = "" + if l == 45: + year = struct.unpack_from(' u16 LE = {val}") diff --git a/fiveparaminte-main/scratch/search_vitals_989.py b/fiveparaminte-main/scratch/search_vitals_989.py new file mode 100644 index 0000000..a0571d5 --- /dev/null +++ b/fiveparaminte-main/scratch/search_vitals_989.py @@ -0,0 +1,21 @@ +with open("/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/scratch/raw_contec_stream.bin", "rb") as f: + stream = f.read() + +packets = [] +i = 0 +while i < len(stream) - 4: + b0, b1, b2, b3 = stream[i], stream[i+1], stream[i+2], stream[i+3] + if b3 == 0x46: + pkt_len = b0 | (b1 << 8) + if pkt_len == 989 and i + pkt_len <= len(stream): + packets.append(stream[i:i + pkt_len]) + i += max(pkt_len, 4) + else: + i += 1 + +if packets: + pkt = packets[-1] + print("Last 100 bytes of 989-byte packet:") + for off in range(889, 989, 2): + val = pkt[off] | (pkt[off+1] << 8) + print(f" Offset {off}: hex={pkt[off]:02x} {pkt[off+1]:02x} -> u16 LE = {val}") diff --git a/fiveparaminte-main/scratch/search_vitals_range.py b/fiveparaminte-main/scratch/search_vitals_range.py new file mode 100644 index 0000000..77b7aa5 --- /dev/null +++ b/fiveparaminte-main/scratch/search_vitals_range.py @@ -0,0 +1,41 @@ +import struct + +filepath = "/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/scratch/raw_contec_stream.bin" + +try: + with open(filepath, "rb") as f: + stream = f.read() +except Exception as e: + print(f"Error: {e}") + import sys + sys.exit(1) + +# Find latest 288-byte and 989-byte packets +pkt_288 = None +pkt_989 = None +i = 0 +while i < len(stream) - 4: + b0, b1, b2, b3 = stream[i], stream[i+1], stream[i+2], stream[i+3] + if b3 == 0x46: + pkt_len = b0 | (b1 << 8) + if pkt_len == 288 and i + pkt_len <= len(stream): + pkt_288 = stream[i:i + pkt_len] + elif pkt_len == 989 and i + pkt_len <= len(stream): + pkt_989 = stream[i:i + pkt_len] + i += max(pkt_len, 4) + else: + i += 1 + +if pkt_288: + print("=== Scanning 288-byte packet (tail, offsets 250-287) for values 75-90 ===") + for off in range(250, len(pkt_288) - 1, 2): + val = struct.unpack_from(' Cache: {current}") + last_printed = current diff --git a/fiveparaminte-main/scratch/test_parser.py b/fiveparaminte-main/scratch/test_parser.py new file mode 100644 index 0000000..60225bc --- /dev/null +++ b/fiveparaminte-main/scratch/test_parser.py @@ -0,0 +1,114 @@ +""" +Verify the new parser offsets on the raw captured stream. +New mappings: +- HR: 989-byte packet, offset 904 (u16 LE) +- SpO2: 286-byte packet, offset 264 (u16 LE) +- Temperature: 56-byte packet, offset 8 (float32) +- NIBP: 45-byte packet, offset 15, 17, 19 (u16 LE) +""" +import struct + +def read_u16_le(data, offset): + if offset + 2 > len(data): + return None + return struct.unpack_from(' len(data): + return None + return struct.unpack_from(' 1.0 and 30.0 < temp < 45.0: + if vitals_cache["temperature"] != round(temp, 1): + vitals_cache["temperature"] = round(temp, 1) + changed = True + elif temp is not None and abs(temp - 9999.0) <= 1.0: + if vitals_cache["temperature"] is not None: + vitals_cache["temperature"] = None + changed = True + elif pkt_len == 45: + sys_bp = read_u16_le(pkt, 15) + dia_bp = read_u16_le(pkt, 17) + map_bp = read_u16_le(pkt, 19) + + # 9999 means no NIBP measurement active + if sys_bp is not None and sys_bp != 9999 and sys_bp > 0: + vitals_cache["systolic_bp"] = float(sys_bp) + changed = True + elif sys_bp == 9999 or sys_bp == 0: + if vitals_cache["systolic_bp"] is not None: + vitals_cache["systolic_bp"] = None + changed = True + + if dia_bp is not None and dia_bp != 9999 and dia_bp > 0: + vitals_cache["diastolic_bp"] = float(dia_bp) + changed = True + elif dia_bp == 9999 or dia_bp == 0: + if vitals_cache["diastolic_bp"] is not None: + vitals_cache["diastolic_bp"] = None + changed = True + + if map_bp is not None and map_bp != 9999 and map_bp > 0: + vitals_cache["map_bp"] = float(map_bp) + changed = True + elif map_bp == 9999 or map_bp == 0: + if vitals_cache["map_bp"] is not None: + vitals_cache["map_bp"] = None + changed = True + + if changed: + current_vitals = {k: v for k, v in vitals_cache.items()} + if current_vitals != last_printed: + print(f"Pkt #{idx} (len={pkt_len}) -> Vitals: {current_vitals}") + last_printed = current_vitals diff --git a/fiveparaminte-main/scratch/test_updated_parser.py b/fiveparaminte-main/scratch/test_updated_parser.py new file mode 100644 index 0000000..189584a --- /dev/null +++ b/fiveparaminte-main/scratch/test_updated_parser.py @@ -0,0 +1,50 @@ +import sys +import os + +# Add parent directory to path +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from contec_parser import parse_contec_binary_packet + +# Read captured stream +filepath = "/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main/scratch/raw_contec_stream.bin" +try: + with open(filepath, "rb") as f: + stream = f.read() +except Exception as e: + print(f"Error: {e}") + sys.exit(1) + +print(f"Loaded raw stream of {len(stream)} bytes") + +# We will scan the stream and feed packets into the parser +# Since we know the packets start with 0x46 at index + 3, let's scan. +i = 0 +packet_count = 0 +parsed_count = 0 +last_vitals = None + +while i < len(stream) - 4: + b0, b1, b2, b3 = stream[i], stream[i+1], stream[i+2], stream[i+3] + if b3 == 0x46: + pkt_len = b0 | (b1 << 8) + if 30 < pkt_len < 1050 and i + pkt_len <= len(stream): + pkt_data = stream[i:i + pkt_len] + packet_count += 1 + + # Feed packet to parser + vitals = parse_contec_binary_packet(pkt_data, "192.168.100.139") + if vitals: + parsed_count += 1 + # Check if fields changed + v_dict = {k: v for k, v in vitals.model_dump().items() if v is not None and k not in ['device_id', 'patient_id', 'timestamp', 'ip_address', 'present_fields']} + if v_dict and v_dict != last_vitals: + print(f"Index {i} (len={pkt_len}) -> Vitals: {v_dict}") + last_vitals = v_dict + i += max(pkt_len, 4) + else: + i += 1 + else: + i += 1 + +print(f"\nDone. Scanned {packet_count} packets, successfully parsed {parsed_count} packets.") diff --git a/fiveparaminte-main/static/dashboard.html b/fiveparaminte-main/static/dashboard.html index 54755bd..758a73c 100644 --- a/fiveparaminte-main/static/dashboard.html +++ b/fiveparaminte-main/static/dashboard.html @@ -3,8 +3,8 @@ - Patient Vital Signs Monitor — Contec CMS7000PLUS - + Patient Vital Signs Monitor — Contec CMS7000PLUS / CMS8500 + @@ -224,6 +224,37 @@ color: var(--text-secondary); } + /* === Device Selector Styles === */ + .device-selector-container { + display: flex; + align-items: center; + gap: 8px; + margin-right: 8px; + } + + .device-select-dropdown { + background: rgba(17, 24, 39, 0.8); + border: 1px solid var(--border-color); + color: var(--text-primary); + padding: 8px 16px; + border-radius: 20px; + font-size: 13px; + font-weight: 500; + outline: none; + cursor: pointer; + transition: all 0.3s; + } + + .device-select-dropdown:hover { + border-color: var(--spo2-color); + background: rgba(25, 34, 56, 0.9); + } + + .device-select-dropdown option { + background-color: var(--bg-secondary); + color: var(--text-primary); + } + /* === Setup Guide Panel === */ .setup-guide { background: linear-gradient(135deg, rgba(6, 182, 212, 0.08), rgba(168, 85, 247, 0.06)); @@ -699,10 +730,16 @@

🏥
Patient Vital Signs Monitor
-
Contec CMS7000PLUS — Real-time Monitoring
+
Contec Monitor — Real-time Monitoring
+
+ + +
🔇 Alerts Off @@ -720,7 +757,7 @@
📡 - CMS7000PLUS Setup Guide — Configure Your Monitor + Contec CMS7000PLUS / CMS8500 Setup Guide — Configure Your Monitor
▾ Collapse
@@ -728,43 +765,43 @@
1
-

Connect via Ethernet

-

Connect your CMS7000PLUS to this PC using an Ethernet cable (direct or through a network switch).

+

Connect via Wi-Fi or Ethernet

+

Wi-Fi: Connect the monitor (e.g. CMS8500) and your PC to the same Wi-Fi network.
Ethernet: Connect using an Ethernet cable (direct or switch).

2
-

Set PC IP Address

-

Set your PC's Ethernet adapter to a static IP, e.g. 192.168.1.50, subnet 255.255.255.0.

+

Get PC IP Address

+

Find your PC's IP address on the network (shown in the box below). If using Wi-Fi, use your PC's Wi-Fi IP address.

3

Configure Monitor CMS Settings

-

On your CMS7000PLUS: System Setup → Network → CMS Settings. Set the Server IP to your PC's IP.

+

On your monitor: Go to System Setup → Network → CMS Settings. Set Server IP (or CMS IP) to your PC's IP address.

4

Set Server Port

-

Set Server Port to 511 (default). If running without admin, use a port >1024 like 6060.

+

Set Server Port on your monitor to one of the listening ports: Detecting... (usually 511 or 518).

5

Enable CMS Connection

-

Enable the CMS/Central Monitor connection on your CMS7000PLUS. Set the sending interval (e.g., 5 seconds).

+

Enable the CMS/Central Monitor connection in the monitor settings. Set the sending interval (e.g. 5 seconds) to start transmitting.

6

Data Will Appear Automatically

-

Once connected, vital signs will appear on this dashboard in real-time via WebSocket or polling.

+

Once connected, the monitor will show up in the "Select Monitor" list, and its vitals will display in real-time.

@@ -970,15 +1007,22 @@ let setupGuideCollapsed = false; let hasReceivedData = false; + let activeDevices = []; + let selectedDeviceId = localStorage.getItem('selectedDeviceId') || ''; + // === Initialize === document.addEventListener('DOMContentLoaded', () => { initWaveforms(); updateClock(); setInterval(updateClock, 1000); - tryWebSocket(); - startPolling(); + fetchDevices().then(() => { + tryWebSocket(); + startPolling(); + }); animateWaveforms(); fetchNetworkInfo(); + // Periodically refresh the list of active devices + setInterval(fetchDevices, 4000); }); // === Fetch Network Info === @@ -1005,6 +1049,98 @@ } } + // === Fetch Devices List === + async function fetchDevices() { + try { + const response = await fetch(`${API_BASE}/devices`); + if (response.ok) { + const devices = await response.json(); + activeDevices = devices; + updateDeviceSelector(); + } + } catch (e) { + console.error("Error fetching devices:", e); + } + } + + // === Update Device Dropdown Selector === + function updateDeviceSelector() { + const selector = document.getElementById('deviceSelector'); + const previousSelection = selector.value || selectedDeviceId; + + selector.innerHTML = ''; + + if (activeDevices.length === 0) { + const opt = document.createElement('option'); + opt.value = ''; + opt.textContent = 'No monitors connected'; + selector.appendChild(opt); + return; + } + + // Sort: active devices first, then offline + const sortedDevices = [...activeDevices].sort((a, b) => { + if (a.status === 'active' && b.status !== 'active') return -1; + if (a.status !== 'active' && b.status === 'active') return 1; + return new Date(b.last_seen) - new Date(a.last_seen); + }); + + sortedDevices.forEach(d => { + const opt = document.createElement('option'); + opt.value = d.device_id; + + const statusSymbol = d.status === 'active' ? '🟢' : '⚫'; + const ipStr = d.ip_address && d.ip_address !== 'unknown' ? ` (${d.ip_address})` : ''; + opt.textContent = `${statusSymbol} ${d.device_id}${ipStr}`; + + selector.appendChild(opt); + }); + + if (previousSelection && sortedDevices.some(d => d.device_id === previousSelection)) { + selector.value = previousSelection; + selectedDeviceId = previousSelection; + } else { + const firstActive = sortedDevices.find(d => d.status === 'active'); + if (firstActive) { + selector.value = firstActive.device_id; + selectedDeviceId = firstActive.device_id; + } else if (sortedDevices.length > 0) { + selector.value = sortedDevices[0].device_id; + selectedDeviceId = sortedDevices[0].device_id; + } + } + + localStorage.setItem('selectedDeviceId', selectedDeviceId); + } + + // === Change Selected Device === + function selectDevice(deviceId) { + selectedDeviceId = deviceId; + localStorage.setItem('selectedDeviceId', deviceId); + clearVitalsDisplay(); + fetchLatestReadings(); + } + + // === Clear Vitals from Screen === + function clearVitalsDisplay() { + ['hr', 'spo2', 'bp', 'rr', 'temp', 'map'].forEach(key => { + const valueEl = document.getElementById(`value-${key}`); + const statusEl = document.getElementById(`status-${key}`); + const cardEl = document.getElementById(`card-${key}`); + + valueEl.innerHTML = '---'; + valueEl.className = 'vital-value no-data'; + statusEl.textContent = 'No Data'; + statusEl.className = 'status-badge offline'; + cardEl.classList.remove('has-value'); + + waveformData[key] = []; + }); + document.getElementById('deviceId').textContent = 'Waiting...'; + document.getElementById('patientId').textContent = 'Waiting...'; + lastReadingId = null; + } + // === Setup Guide Toggle === function toggleSetupGuide() { const body = document.getElementById('setupGuideBody'); @@ -1086,7 +1222,15 @@ }; ws.onmessage = (event) => { const data = JSON.parse(event.data); - updateVitals(data); + // Filter messages by selected device or auto-select if nothing selected yet + if (!selectedDeviceId && data.device_id) { + selectDevice(data.device_id); + } + if (data.device_id === selectedDeviceId) { + updateVitals(data); + } + // Refresh device list status + fetchDevices(); }; ws.onclose = () => { useWebSocket = false; @@ -1109,7 +1253,10 @@ async function fetchLatestReadings() { try { - const response = await fetch(`${API_BASE}/latest-readings?limit=1`); + const url = selectedDeviceId + ? `${API_BASE}/latest-readings?device_id=${encodeURIComponent(selectedDeviceId)}&limit=1` + : `${API_BASE}/latest-readings?limit=1`; + const response = await fetch(url); if (!response.ok) throw new Error('API error'); const readings = await response.json(); @@ -1138,6 +1285,12 @@ status.pending_transmissions > 0 ? `${status.pending_transmissions} pending` : 'All sent ✓'; + + // Update active ports list in guide + const portsEl = document.getElementById('activePortsList'); + if (portsEl && status.active_ports && status.active_ports.length > 0) { + portsEl.textContent = status.active_ports.join(', '); + } } } catch (e) { if (!useWebSocket) {