reorganize application code into fiveparaminte-main directory structure
This commit is contained in:
+22
-31
@@ -165,6 +165,10 @@ def parse_contec_hl7_text(raw_text: str, client_ip: str) -> Optional[NormalizedV
|
||||
if len(fields) > 8 and fields[8]:
|
||||
vitals_dict["patient_gender"] = fields[8].strip().upper()
|
||||
|
||||
# PID-35: Patient Category (ADULT / PEDIATRIC / NEONATAL)
|
||||
if len(fields) > 35 and fields[35]:
|
||||
vitals_dict["patient_type"] = fields[35].strip()
|
||||
|
||||
elif seg_name == "PV1":
|
||||
# PV1-3: Assigned Patient Location (Room^Bed^...)
|
||||
if len(fields) > 3 and fields[3]:
|
||||
@@ -174,6 +178,10 @@ def parse_contec_hl7_text(raw_text: str, client_ip: str) -> Optional[NormalizedV
|
||||
if bed:
|
||||
vitals_dict["bed_id"] = bed
|
||||
|
||||
# PV1-18: Patient Type
|
||||
if len(fields) > 18 and fields[18]:
|
||||
vitals_dict["patient_type"] = fields[18].strip()
|
||||
|
||||
elif seg_name == "OBX":
|
||||
if len(fields) > 5:
|
||||
obs_val = fields[5].strip()
|
||||
@@ -279,6 +287,7 @@ def _parse_45_byte_packet(data: bytes, vitals_dict: dict) -> bool:
|
||||
if "present_fields" not in vitals_dict:
|
||||
vitals_dict["present_fields"] = []
|
||||
|
||||
logger.debug("DEBUG_NIBP_PKT len=%d nibp_hex=%s", len(data), data[8:24].hex())
|
||||
nibp_sys = read_u16_le(data, 15)
|
||||
nibp_dia = read_u16_le(data, 17)
|
||||
nibp_map = read_u16_le(data, 19)
|
||||
@@ -363,42 +372,26 @@ def _parse_spo2_waveform_packet(data: bytes, vitals_dict: dict) -> bool:
|
||||
if "pleth_wave" not in vitals_dict["present_fields"]:
|
||||
vitals_dict["present_fields"].append("pleth_wave")
|
||||
|
||||
found = False
|
||||
|
||||
# Check SpO2 at standard offset 264
|
||||
spo2_val = read_u16_le(data, 264)
|
||||
|
||||
# If 264 is disconnected sentinel, probe is NOT connected / off-finger
|
||||
if spo2_val in (None, 65535, 32767, 255, 9999, 0):
|
||||
vitals_dict["spo2"] = None
|
||||
vitals_dict["heart_rate"] = None
|
||||
if "spo2" not in vitals_dict["present_fields"]:
|
||||
vitals_dict["present_fields"].append("spo2")
|
||||
if "heart_rate" not in vitals_dict["present_fields"]:
|
||||
vitals_dict["present_fields"].append("heart_rate")
|
||||
return True
|
||||
|
||||
if 50 <= spo2_val <= 100:
|
||||
if spo2_val is not None and 50 <= spo2_val <= 100:
|
||||
vitals_dict["spo2"] = float(spo2_val)
|
||||
if "spo2" not in vitals_dict["present_fields"]:
|
||||
vitals_dict["present_fields"].append("spo2")
|
||||
found = True
|
||||
|
||||
# ECG HR is at offset 266 in the 286-byte SpO2 waveform packet footer.
|
||||
# Offset 268 is the SpO2 HIGH ALARM LIMIT (always 100) — NOT pulse rate!
|
||||
# So we read ECG HR at 266 only.
|
||||
# Pulse Rate / ECG HR is at offset 266 in the footer
|
||||
ecg_hr = read_u16_le(data, 266)
|
||||
|
||||
logger.info(
|
||||
f"SpO2 pkt: SpO2[264]={spo2_val} ECG_HR[266]={ecg_hr} alarm_hi[268]={read_u16_le(data,268)} alarm_lo[270]={read_u16_le(data,270) if len(data)>=272 else 'N/A'}"
|
||||
)
|
||||
|
||||
if ecg_hr is not None and ecg_hr not in (9999, 65535, 32767, 0) and 20 <= ecg_hr <= 300:
|
||||
vitals_dict["heart_rate"] = float(ecg_hr)
|
||||
if "heart_rate" not in vitals_dict["present_fields"]:
|
||||
vitals_dict["present_fields"].append("heart_rate")
|
||||
|
||||
return found
|
||||
logger.info(
|
||||
f"SpO2 pkt: SpO2[264]={spo2_val} ECG_HR[266]={ecg_hr} alarm_hi[268]={read_u16_le(data,268)} alarm_lo[270]={read_u16_le(data,270) if len(data)>=272 else 'N/A'}"
|
||||
)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def _parse_286_byte_packet(data: bytes, vitals_dict: dict) -> bool:
|
||||
@@ -434,13 +427,13 @@ def _parse_989_byte_packet(data: bytes, vitals_dict: dict) -> bool:
|
||||
if "ecg_wave" not in vitals_dict["present_fields"]:
|
||||
vitals_dict["present_fields"].append("ecg_wave")
|
||||
|
||||
logger.debug("DEBUG_ECG_PKT len=%d tail_hex=%s", len(data), data[890:989].hex())
|
||||
hr_val = read_u16_le(data, 904)
|
||||
if hr_val is not None and hr_val not in (65535, 9999, 0) and 20 <= hr_val <= 300:
|
||||
# Only use ECG HR if SpO2-probe PR has NOT already set heart_rate.
|
||||
# SpO2 PR (from the pleth packet) matches the monitor display and wins.
|
||||
if "heart_rate" not in vitals_dict.get("present_fields", []):
|
||||
if hr_val is not None and hr_val not in (65535, 32767, 9999, 0) and 20 <= hr_val <= 300:
|
||||
if vitals_dict.get("heart_rate") is None:
|
||||
vitals_dict["heart_rate"] = float(hr_val)
|
||||
vitals_dict.setdefault("present_fields", []).append("heart_rate")
|
||||
if "heart_rate" not in vitals_dict.setdefault("present_fields", []):
|
||||
vitals_dict["present_fields"].append("heart_rate")
|
||||
|
||||
return True
|
||||
|
||||
@@ -478,9 +471,7 @@ def _find_vitals_block_in_stream(data: bytes, client_ip: str) -> Optional[Normal
|
||||
elif pkt_len == 989:
|
||||
if _parse_989_byte_packet(pkt_data, vitals_dict):
|
||||
found_any = True
|
||||
elif 100 < pkt_len < 600:
|
||||
if _parse_spo2_waveform_packet(pkt_data, vitals_dict):
|
||||
found_any = True
|
||||
# Handled specifically by known packet sizes above
|
||||
|
||||
i += max(pkt_len, 4)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user