Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -reca9e15bc984af2b7f59eb38f3836ca354ee1251 -rbe799e12803dba3054ff893b68f8b79a9dde440b --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision eca9e15bc984af2b7f59eb38f3836ca354ee1251) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision be799e12803dba3054ff893b68f8b79a9dde440b) @@ -14,9 +14,14 @@ # ############################################################################ +# Module import from enum import unique -from ..utils.enums import DialinEnum +# Project imports +from leahi_dialin.common.disp_defs import AcidTypes, BicarbTypes +from leahi_dialin.common.fp_defs import FPPressureSensorNames +from leahi_dialin.common.generic_defs import RecordsBaseEnum, DataTypes +from leahi_dialin.utils.enums import DialinEnum # ================================================== Enum Creators: Operations Lvl 1 ================================================== @@ -1051,4 +1056,354 @@ 'RTD_RESISTANCE' : ['rtd resistance'], 'UNCOMPENSATED_COND' : ['uncompensated conductivity'], 'NUM_OF_RESISTANCE_ATTRIBUTES': [], -} \ No newline at end of file +} + + + +# ================================================== Enum Creators: Record Sub Fields ================================================== +@unique +class DDCalibRecordAccelerometerFields(RecordsBaseEnum): + ACCEL_X_OFFSET = (0, DataTypes.F32) # DD accelerometer X axis offset + ACCEL_Y_OFFSET = (1, DataTypes.F32) # DD accelerometer Y axis offset + ACCEL_Z_OFFSET = (2, DataTypes.F32) # DD accelerometer Z axis offset + CALIBRATION_TIME = (3, DataTypes.U32) # Calibration time + NUM_OF_CALIBRATION_RECORD_ACCELEROMETER_FIELDS = (4, DataTypes.NONE) # Number of Calibration Record Accelerometer's Fields + +DDCalibRecordAccelerometerFields._str_list = { + # Official Name : Accepted strings + 'ACCEL_X_OFFSET': [], + 'ACCEL_Y_OFFSET': [], + 'ACCEL_Z_OFFSET': [], + 'CALIBRATION_TIME': [], + 'NUM_OF_CALIBRATION_RECORD_ACCELEROMETER_FIELDS': [], +} + + +@unique +class DDCalibRecordBloodLeakFields(RecordsBaseEnum): + SET_POINT = (0, DataTypes.U16) # DD Blood leak sensor set point + CALIBRATION_TIME = (1, DataTypes.U32) # Calibration time + NUM_OF_CALIBRATION_RECORD_BLOOD_LEAK_FIELDS = (2, DataTypes.NONE) # Number of Calibration Record Accelerometer's Fields + +DDCalibRecordBloodLeakFields._str_list = { + # Official Name : Accepted strings + 'SET_POINT': [], + 'CALIBRATION_TIME': [], + 'NUM_OF_CALIBRATION_RECORD_BLOOD_LEAK_FIELDS': [], +} + + +@unique +class DDCalibRecordConcentrateFields(RecordsBaseEnum): + CONCENTRATE_MIX_RATIO = (0, DataTypes.F32) # Acid or Bicarb Concentrate mix ratio. + FULL_BOTTLE_VOLUME_ML = (1, DataTypes.F32) # Acid or Bicarb full bottle volume in milliliters. + CONDUCTIVITY_USPCM = (2, DataTypes.F32) # Acid or Bicarb conductivity in uS/cm. + BOTTLE_TEMPERATURE_C = (3, DataTypes.F32) # Acid or Bicarb bottle temperature in C. + CALIBRATION_TIME = (4, DataTypes.U32) # Calibration time + NUM_OF_CALIBRATION_RECORD_CONCENTRATE_FIELDS = (5, DataTypes.NONE) # Number of Calibration Record Acid and Bicarb Concentrate's Fields + +DDCalibRecordConcentrateFields._str_list = { + # Official Name : Accepted strings + 'CONCENTRATE_MIX_RATIO': [], + 'FULL_BOTTLE_VOLUME_ML': [], + 'CONDUCTIVITY_USPCM': [], + 'BOTTLE_TEMPERATURE_C': [], + 'CALIBRATION_TIME': [], + 'NUM_OF_CALIBRATION_RECORD_CONCENTRATE_FIELDS': [], +} + + +@unique +class DDCalibRecordConductivityFields(RecordsBaseEnum): + K_HIGH = (0, DataTypes.F32) # Cell Coefficient High + ALPHA_HIGH = (1, DataTypes.F32) # Temperature correction High + ETA_HIGH = (2, DataTypes.F32) # Resistance Scale Factor High + ZETA_HIGH = (3, DataTypes.F32) # Resistance Offset High + K_LOW = (4, DataTypes.F32) # Cell Coefficient Low + ALPHA_LOW = (5, DataTypes.F32) # Temperature correction Low + ETA_LOW = (6, DataTypes.F32) # Resistance Scale Factor Low + ZETA_LOW = (7, DataTypes.F32) # Resistance Offset Low + BETA = (8, DataTypes.F32) # Temperature Scale Factor + DELTA = (9, DataTypes.F32) # Temperature Offset + RSRVD_1 = (10, DataTypes.F32) # Reserved slot + RSRVD_2 = (11, DataTypes.F32) # Reserved slot + CALIBRATION_TIME = (12, DataTypes.U32) # Calibration time + NUM_OF_CALIBRATION_RECORD_CONDUCTIVITY_FIELDS = (13, DataTypes.NONE) # Number of Calibration Record Conductivity Fields + +DDCalibRecordConductivityFields._str_list = { + # Official Name : Accepted strings + 'K_HIGH': [], + 'ALPHA_HIGH': [], + 'ETA_HIGH': [], + 'ZETA_HIGH': [], + 'K_LOW': [], + 'ALPHA_LOW': [], + 'ETA_LOW': [], + 'ZETA_LOW': [], + 'BETA': [], + 'DELTA': [], + 'RSRVD_1': [], + 'RSRVD_2': [], + 'CALIBRATION_TIME': [], + 'NUM_OF_CALIBRATION_RECORD_CONCENTRATE_FIELDS': [], +} + + +@unique +class DDCalibRecordSensorFields(RecordsBaseEnum): + GAIN = (0, DataTypes.F32) # Sensor's Gain + OFFSET = (1, DataTypes.F32) # Sensor's Offset + CALIBRATION_TIME = (2, DataTypes.U32) # Sensor's Calibration time + NUM_OF_CALIBRATION_RECORD_SENSOR_FIELDS = (3, DataTypes.NONE) # Number of Calibration Record Sensor's Fields + +DDCalibRecordSensorFields._str_list = { + # Official Name : Accepted strings + 'GAIN': [], + 'OFFSET': [], + 'CALIBRATION_TIME': [], + 'NUM_OF_CALIBRATION_RECORD_SENSOR_FIELDS': [], +} + + +# ================================================== Enum Creators: Record Fields ================================================== +@unique +class DDSystemRecordFields(RecordsBaseEnum): + IS_RO_FEATURED = (0, DataTypes.BOOL) # Is RO featured or defeatured + IS_RO_BOOST_PUMP_ADDED = (1, DataTypes.BOOL) # Is RO have boost pump or not + TOP_LEVEL_PN = (2, DataTypes.U08, 10) # Top level part number + TOP_LEVEL_SN = (3, DataTypes.U08, 20) # Top level serial number + MFG_LOCATION = (4, DataTypes.U08) # Manufacturing Location + MFG_DATE = (5, DataTypes.U32) # Manufacturing Date + NUM_OF_SYSTEM_RECORD_FIELDS = (6, DataTypes.NONE) # Number of System Record Fields + +DDSystemRecordFields._str_list = { + # Official Name : Accepted strings + 'TOP_LEVEL_PN': ['pn', 'part number'], + 'TOP_LEVEL_SN': ['sn', 'serial number'], + 'MFG_LOCATION': ['location', 'manufacturing location'], + 'MFG_DATE': ['date', 'manufacturing date'], + 'NUM_OF_SYSTEM_RECORD_FIELDS': [], +} + + +@unique +class DDServiceRecordFields(RecordsBaseEnum): + IS_HDF_ONLINE_FLUID = (0, DataTypes.BOOL) # DD Is HDF Online + WATER_RECOVERY = (1, DataTypes.U32) # DD Water Recovery + SERVICE_LOC = (2, DataTypes.U08) # DD service location + LAST_SERVICE_EPOCH_DATE = (3, DataTypes.U32) # DD last service date in epoch + SERVICE_INTERVAL_SECONDS = (4, DataTypes.U32) # DD service interval in seconds + LAST_RESET_TIME_EPOCH = (5, DataTypes.U32) # Last time the record was reset in epoch + NUM_OF_SERVICE_RECORD_FIELDS = (6, DataTypes.NONE) # Number of Service Record Fields + +DDServiceRecordFields._str_list = { + # Official Name : Accepted strings + 'IS_HDF_ONLINE_FLUID': [], + 'WATER_RECOVERY': [], + 'SERVICE_LOC': [], + 'LAST_SERVICE_EPOCH_DATE': [], + 'SERVICE_INTERVAL_SECONDS': [], + 'LAST_RESET_TIME_EPOCH': [], + 'NUM_OF_SERVICE_RECORD_FIELDS': [], +} + + +def get_calibration_record_fields() -> RecordsBaseEnum: + # Creating the enum members list + i = 0 + members = {} + for pres_sensor in DDPressureSensorNames: + if 'num_' in pres_sensor.name.lower(): + continue + for field_name in DDCalibRecordSensorFields: + if 'num_' in field_name.name.lower(): + continue + members[f'PRES__{pres_sensor.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for pres_sensor in FPPressureSensorNames: + if 'num_' in pres_sensor.name.lower(): + continue + for field_name in DDCalibRecordSensorFields: + if 'num_' in field_name.name.lower(): + continue + members[f'PRES__{pres_sensor.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for temp_sensor in DDTemperatureSensorNames: + if 'num_' in temp_sensor.name.lower(): + continue + elif temp_sensor.value >= DDTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value: + continue + for field_name in DDCalibRecordSensorFields: + if 'num_' in field_name.name.lower(): + continue + members[f'TEMP__{temp_sensor.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for conc_pump in DDConcentratePumpNames: + if 'num_' in conc_pump.name.lower(): + continue + for field_name in DDCalibRecordSensorFields: + if 'num_' in field_name.name.lower(): + continue + members[f'CONC__{conc_pump.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for dial_pump in DDDialysatePumpNames: + if 'num_' in dial_pump.name.lower(): + continue + elif 'd12' in dial_pump.name.lower(): + members[f'DIAL__{dial_pump.name}__TARGET_SPEED'] = (i, DataTypes.F32) + i += 1 + members[f'DIAL__{dial_pump.name}__{DDCalibRecordSensorFields.CALIBRATION_TIME.name}'] = (i, DDCalibRecordSensorFields.CALIBRATION_TIME.datatype()) + i += 1 + else: + for field_name in DDCalibRecordSensorFields: + if 'num_' in field_name.name.lower(): + continue + members[f'DIAL__{dial_pump.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for acid in AcidTypes: + if 'num_' in acid.name.lower(): + continue + for field_name in DDCalibRecordConcentrateFields: + if 'num_' in field_name.name.lower(): + continue + members[f'ACID__{acid.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for bicarb in BicarbTypes: + if 'num_' in bicarb.name.lower(): + continue + for field_name in DDCalibRecordConcentrateFields: + if 'num_' in field_name.name.lower(): + continue + members[f'BICARB__{bicarb.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for field_name in DDCalibRecordAccelerometerFields: + if 'num_' in field_name.name.lower(): + continue + members[f'ACCEL__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for field_name in DDCalibRecordBloodLeakFields: + if 'num_' in field_name.name.lower(): + continue + members[f'BLOOD_LEAK__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + for cond_sensor in DDConductivitySensorNames: + if 'num_' in cond_sensor.name.lower(): + continue + for field_name in DDCalibRecordConductivityFields: + if 'num_' in field_name.name.lower(): + continue + members[f'COND__{cond_sensor.name}__{field_name.name}'] = (i, field_name.datatype()) + i += 1 + members[f'NUM_OF_CALIBRATION_RECORD_FIELDS'] = (i, DataTypes.NONE) + + # Enum creation + DDCalibrationRecordFields = RecordsBaseEnum('DDCalibrationRecordFields', members,) + + # Setting the _str_list values for the enum + DDCalibrationRecordFields._str_list = {} + for member in members: + DDCalibrationRecordFields._str_list[member] = [] + + return DDCalibrationRecordFields + + +@unique +class DDInstitutionalRecordBasicFields(RecordsBaseEnum): + MIN_DIALYSATE_SYSTEM_FLOW_MLPM = (0, DataTypes.U32) # Min dialysate flow in mL/min + MAX_DIALYSATE_SYSTEM_FLOW_MLPM = (1, DataTypes.U32) # Max dialysate flow in mL/min + MIN_DIALYSATE_TEMP_C = (2, DataTypes.F32) # Min dialysate temperature in C + MAX_DIALYSATE_TEMP_C = (3, DataTypes.F32) # Max dialysate temperature in C + MIN_ACID_CONCENTRATE = (4, DataTypes.U32) # Min Acid concentrate + MAX_ACID_CONCENTRATE = (5, DataTypes.U32) # Max Acid concentrate + MIN_BICARB_CARTRIDGE_SIZE_G = (6, DataTypes.U32) # Min Bicarbonate cartridge size in grams + MAX_BICARB_CARTRIDGE_SIZE_G = (7, DataTypes.U32) # Max Bicarbonate cartridge size in grams + MIN_SODIUM_MEQPL = (8, DataTypes.U32) # Min sodium in mEq/L + MAX_SODIUM_MEQPL = (9, DataTypes.U32) # Max sodium in mEq/L + MIN_BICARBONATE_MEQPL = (10, DataTypes.U32) # Min bicarbonate in mEq/L + MAX_BICARBONATE_MEQPL = (11, DataTypes.U32) # Max bicarbonate in mEq/L + MIN_RO_REJECTION_RATIO_PCT = (12, DataTypes.F32) # Min RO rejection ratio in percent + DISINFECTION_FREQUENCY = (13, DataTypes.U32) # Disinfection days between cycles + DISINFECTION_CYCLE_TIME = (14, DataTypes.F32) # Disinfection Cycle Time + MIN_INLET_WATER_CIND_AKARN_LIMIT_USPCM = (15, DataTypes.F32) # Min inlet water conductivity alarm limit in uS/cm + MAX_INLET_WATER_CIND_AKARN_LIMIT_USPCM = (16, DataTypes.F32) # Max inlet water conductivity alarm limit in uS/cm + ACID_CONCENTRATE_JUG_SIZE_L = (17, DataTypes.F32) # acid concentrate jug size in Liters + MIN_ACID_ALARM_LIMIT_PCT = (18, DataTypes.F32) # Min acid alarm limit in percent + MIN_BICARB_ALARM_LIMIT_PCT = (19, DataTypes.F32) # Min bicarbonate alarm limit in percent + POST_TREAT_DRAIN_OPTION = (20, DataTypes.U32) # Dialysate Post Treatment Drain OptionĀ  + POST_TREAT_DRY_BICARB_OPTION = (21, DataTypes.U32) # Dry Bicarbonate Post Treatment OptionĀ  + CALIBRATION_TIME = (22, DataTypes.U32) # Calibration time in epoch. + NUM_OF_INSTITUTIONAL_RECORD_BASIC_FIELDS = (23, DataTypes.NONE) # Number of Institutional Record Basic Fields + +DDInstitutionalRecordBasicFields._str_list = { + # Official Name : Accepted strings + 'MIN_DIALYSATE_SYSTEM_FLOW_MLPM': [], + 'MAX_DIALYSATE_SYSTEM_FLOW_MLPM': [], + 'MIN_DIALYSATE_TEMP_C': [], + 'MAX_DIALYSATE_TEMP_C': [], + 'ACID_CONCENTRATE': [], + 'BICARB_CARTRIDGE_SIZE_G': [], + 'MIN_SODIUM_MEQPL': [], + 'MAX_SODIUM_MEQPL': [], + 'MIN_BICARBONATE_MEQPL': [], + 'MAX_BICARBONATE_MEQPL': [], + 'MIN_RO_REJECTION_RATIO_PCT': [], + 'DISINFECTION_FREQUENCY': [], + 'DISINFECTION_CYCLE_TIME': [], + 'MIN_INLET_WATER_CIND_AKARN_LIMIT_USPCM': [], + 'MAX_INLET_WATER_CIND_AKARN_LIMIT_USPCM': [], + 'ACID_CONCENTRATE_JUG_SIZE_L': [], + 'MIN_ACID_ALARM_LIMIT_PCT': [], + 'MIN_BICARB_ALARM_LIMIT_PCT': [], + 'POST_TREAT_DRAIN_OPTION': [], + 'POST_TREAT_DRY_BICARB_OPTION': [], + 'CALIBRATION_TIME': [], + 'NUM_OF_INSTITUTIONAL_RECORD_BASIC_FIELDS': [], +} + + +@unique +class DDInstitutionalRecordAdvancedFields(RecordsBaseEnum): + CALIBRATION_TIME = (0, DataTypes.U32) # Calibration time in epoch. + NUM_OF_INSTITUTIONAL_RECORD_ADVANCED_FIELDS = (1, DataTypes.NONE) # Number of Institutional Record Advanced Fields + +DDInstitutionalRecordAdvancedFields._str_list = { + # Official Name : Accepted strings + 'CALIBRATION_TIME': [], + 'NUM_OF_INSTITUTIONAL_RECORD_FIELDS': [], +} + + +@unique +class DDInstitutionalRecordAdditionalFields(RecordsBaseEnum): + CALIBRATION_TIME = (0, DataTypes.U32) # Calibration time in epoch. + NUM_OF_INSTITUTIONAL_RECORD_ADDITIONAL_FIELDS = (1, DataTypes.NONE) # Number of Institutional Record Additional Fields + +DDInstitutionalRecordAdditionalFields._str_list = { + # Official Name : Accepted strings + 'CALIBRATION_TIME': [], + 'NUM_OF_INSTITUTIONAL_RECORD_ADDITIONAL_FIELDS': [], +} + + +@unique +class DDUsageInformationRecordFields(RecordsBaseEnum): + RO_WATER_GEN_TOTAL_L = (0, DataTypes.F32) # Total RO water generated in liters. (Cannot be reset) + RO_WATER_GEN_SINCE_LAST_SERVICE_L = (1, DataTypes.F32) # RO water generated since last treatment in liters + LAST_BASIC_FLUSH_COMPLETE_DATE_EPOCH = (2, DataTypes.U32) # Last basic flush complete date in epoch. + LAST_HEAT_DISINFECT_COMPLETE_DATE_EPOCH = (3, DataTypes.U32) # Last heat disinfect complete date in epoch. + LAST_HEAT_ACTIVE_COOL_COMPLETE_DATE_EPOCH = (4, DataTypes.U32) # Last heat disinfect active cool complete date in epoch. + LAST_FILTER_FLUSH_COMPLETE_DATE_EPOCH = (5, DataTypes.U32) # Last filter flush complete date in epoch. + LAST_RESET_TIME_EPOCH = (6, DataTypes.U32) # Last time the record was reset in epoch. + NUM_OF_USAGE_INFO_RECORD_FIELDS = (7, DataTypes.NONE) # Number of Usage Information Record Fields + +DDUsageInformationRecordFields._str_list = { + # Official Name : Accepted strings + 'RO_WATER_GEN_TOTAL_L': [], + 'RO_WATER_GEN_SINCE_LAST_SERVICE_L': [], + 'LAST_BASIC_FLUSH_COMPLETE_DATE_EPOCH': [], + 'LAST_HEAT_DISINFECT_COMPLETE_DATE_EPOCH': [], + 'LAST_HEAT_ACTIVE_COOL_COMPLETE_DATE_EPOCH': [], + 'LAST_FILTER_FLUSH_COMPLETE_DATE_EPOCH': [], + 'LAST_RESET_TIME_EPOCH': [], + 'NUM_OF_USAGE_INFO_RECORD_FIELDS': [], +}