Index: dialin/common/alarm_defs.py =================================================================== diff -u -r1f6af0afb3388e3a491e1446f336fff9997a3dba -r3b0142439081e79391b4c0531a673fcc0783bae7 --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 1f6af0afb3388e3a491e1446f336fff9997a3dba) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 3b0142439081e79391b4c0531a673fcc0783bae7) @@ -112,15 +112,15 @@ ALARM_ID_DG_OUTLET_UV_REACTOR_ON_WITH_NO_FLOW = 89 ALARM_ID_DG_LOAD_CELL_A1_B1_FPGA_FAULT = 90 ALARM_ID_HD_DIALYSATE_FLOW_DATA_NOT_RECEIVE = 91 - ALARM_ID_AVAILABLE_1 = 92 + ALARM_ID_DG_TEMPERATURE_SENSORS_INVALID_CAL_RECORD = 92 ALARM_ID_DG_OUTLET_PRIMARY_CONDUCTIVITY_OUT_OF_RANGE = 93 ALARM_ID_DG_PRESSURE_OUT_OF_RANGE = 94 ALARM_ID_DG_WATCHDOG_EXPIRED = 95 ALARM_ID_DG_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE = 96 ALARM_ID_DG_FILL_CONDUCTIVITY_OUT_OF_RANGE = 97 ALARM_ID_HD_BATTERY_COMM_FAULT = 98 ALARM_ID_HD_SYRINGE_PUMP_STALL = 99 - ALARM_ID_AVAILABLE_12 = 100 + ALARM_ID_DG_COND_SENSORS_INVALID_TEMP_COMP_CAL_RECORD = 100 ALARM_ID_UI_POST_HD_COMM = 101 ALARM_ID_DG_HEAT_DISINFECT_TEMP_GRAD_OUT_OF_RANGE = 102 ALARM_ID_HD_NVDATAMGMT_CAL_GROUP_RECORD_CRC_INVALID = 103 @@ -223,7 +223,7 @@ ALARM_ID_DG_THERMISTORS_TEMPERATURE_OUT_OF_RANGE = 200 ALARM_ID_HD_PRE_TREATMENT_WET_FLOW_TEST_FAILURE = 201 ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_NORMAL_TEST_FAILURE = 202 - ALARM_ID_AVAILABLE_6 = 203 + ALARM_ID_DG_FILL_CONDUCTIVITIES_INVALID_CAL_RECORD = 203 ALARM_ID_DG_RO_REJECTION_RATIO_OUT_OF_RANGE = 204 ALARM_ID_DG_CONDUCTIVITY_SENSOR_FAULT = 205 ALARM_ID_DG_DIALYSATE_FILL_OUT_OF_TIME = 206 @@ -277,7 +277,7 @@ ALARM_ID_DG_INVALID_SERVICE_RECORD_CRC = 254 ALARM_ID_HD_UI_COMPATIBILITY_ERROR = 255 ALARM_ID_HD_DISINFECT_CHEM_FLUSH = 256 - ALARM_ID_AVAILABLE_8 = 257 + ALARM_ID_HD_INVALID_INSTITUTIONAL_RECORD_CRC = 257 ALARM_ID_HD_UI_POST_FAILURE_OS_VERSION = 258 ALARM_ID_HD_TEMPERATURES_OUT_OF_RANGE = 259 ALARM_ID_HD_UI_POST_FAILURE_SHASUM = 260 @@ -294,7 +294,7 @@ ALARM_ID_DG_SAFETY_SHUTDOWN_POST_TEST_FAILED = 271 ALARM_ID_HD_FAN_RPM_OUT_OF_RANGE = 272 ALARM_ID_AVAILABLE_10 = 273 - ALARM_ID_AVAILABLE_11 = 274 + ALARM_ID_DG_INACTIVE_RESERVOIR_WEIGHT_OUT_OF_RANGE = 274 ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE = 275 ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE = 276 ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE = 277 @@ -326,7 +326,7 @@ ALARM_ID_DG_DRAIN_PUMP_DIRECTION_FPGA_FAULT = 303 ALARM_ID_HD_INVALID_USAGE_RECORD_CRC = 304 ALARM_ID_HD_CPU_RAM_ERROR = 305 - ALARM_ID_DG_CD1_CD2_CHECK_FAULT = 306 + ALARM_ID_AVAILABLE_50 = 306 ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT = 307 ALARM_ID_DG_CPI_COND_SENSOR_INVALID_CHAR = 308 ALARM_ID_DG_CPO_COND_SENSOR_INVALID_CHAR = 309 Index: dialin/common/msg_ids.py =================================================================== diff -u -r48427fdc48c23aed46c6f971da1d5d4795b92f65 -r3b0142439081e79391b4c0531a673fcc0783bae7 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision 48427fdc48c23aed46c6f971da1d5d4795b92f65) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 3b0142439081e79391b4c0531a673fcc0783bae7) @@ -226,6 +226,8 @@ MSG_ID_HD_SEND_RO_PERMEATE_SAMPLE_DISPENSE_REQUEST_TO_DG = 0xCB MSG_ID_DG_SEND_RO_PERMEATE_SAMPLE_DISPENSE_READY_TO_HD = 0xCD MSG_ID_DG_DRAIN_MODE_DATA = 0xCE + MSG_ID_UI_INSTITUTIONAL_RECORD_REQUEST = 0xCF + MSG_ID_HD_INSTITUTIONAL_RECORD_RESPONSE = 0xD0 MSG_ID_CAN_ERROR_COUNT = 0x999 @@ -385,7 +387,10 @@ MSG_ID_HD_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE = 0x809A MSG_ID_HD_CAN_RECEIVE_ACK_MESSAGE_OVERRIDE = 0x809B MSG_ID_HD_RECIRULATION_PCT_OVERRIDE = 0x809C - MSD_ID_HD_RAW_AIR_TRAP_LEVEL_SENSOR_OVERRIDE = 0x809D + MSG_ID_HD_RAW_AIR_TRAP_LEVEL_SENSOR_OVERRIDE = 0x809D + MSG_ID_HD_GET_INSTITUTIONAL_RECORD = 0x809E + MSG_ID_HD_SET_INSTITUTIONAL_RECORD = 0x809F + MSG_ID_HD_SEND_INSTITUTIONAL_RECORD = 0x80A0 MSG_ID_DG_TESTER_LOGIN_REQUEST = 0xA000 MSG_ID_DG_ALARM_STATE_OVERRIDE = 0xA001 Index: dialin/dg/calibration_record.py =================================================================== diff -u -r1f6af0afb3388e3a491e1446f336fff9997a3dba -r3b0142439081e79391b4c0531a673fcc0783bae7 --- dialin/dg/calibration_record.py (.../calibration_record.py) (revision 1f6af0afb3388e3a491e1446f336fff9997a3dba) +++ dialin/dg/calibration_record.py (.../calibration_record.py) (revision 3b0142439081e79391b4c0531a673fcc0783bae7) @@ -50,10 +50,22 @@ _DEFAULT_TIME_VALUE = 0 _DEFAULT_CRC_VALUE = 0 _DEFAULT_FLUSH_LINES_VOLUME = 0.01 - _DEFAULT_ULTRAFILTER_TAU_C_PER_MIN = -1.0 + _DEFAULT_ULTRAFILTER_TAU_C_PER_MIN = -0.6 _DEFAULT_RESERVOIR_TAU_C_PER_MIN = -0.25 _DEFAULT_ULTRAFILTER_VOLUME_ML = 700 _DEFAULT_COND_SENSOR_TEMP_COMP_COEFF = 0.0207 + # Fill acid/bicarb target conductivities uS/cm + _DEFAULT_FILL_1251_1_ACID_SNSR_US_PER_CM = 0.0 + _DEFAULT_FILL_1251_1_BIC_SNSR_US_PER_CM = 13616.23 + _DEFAULT_FILL_2251_0_ACID_SNSR_US_PER_CM = 0.0 + _DEFAULT_FILL_2251_0_BIC_SNSR_US_PER_CM = 13734.88 + _DEFAULT_FILL_3251_9_ACID_SNSR_US_PER_CM = 0.0 + _DEFAULT_FILL_3251_9_BIC_SNSR_US_PER_CM = 13854.49 + _DEFAULT_ACID_TEST_1251_1_US_PER_CM = 13768.28 + _DEFAULT_ACID_TEST_2251_0_US_PER_CM = 13919.05 + _DEFAULT_ACID_TEST_3251_9_US_PER_CM = 14071.04 + _DEFAULT_BIC_TEST_ACID_SNSR_US_PER_CM = 0.0 + _DEFAULT_BIC_TEST_BIC_SNSR_US_PER_CM = 3890.0 # Maximum allowed bytes that are allowed to be written to EEPROM in firmware # The padding size then is calculated to be divisions of 16 @@ -325,7 +337,10 @@ self._prepare_volume_record(), self._prepare_acid_concentrates_record(), self._prepare_bicarb_concentrates_record(), self._prepare_filters_record(), self._prepare_fans_record(), self._prepare_accelerometer_sensor_record(), - self._prepare_heating_constants_record()] + self._prepare_heating_constants_record(), + self._prepare_acid_08_1251_1_conductivity_record(), + self._prepare_acid_08_2251_0_conductivity_record(), + self._prepare_acid_08_3251_9_conductivity_record()] for record, byte_size in records_with_sizes: # Update the groups bytes size so far to be use to padding later @@ -721,3 +736,105 @@ hardware_group[group_name] = hardware return hardware_group, group_byte_size + + def _prepare_acid_08_1251_1_conductivity_record(self): + """ + Handles creating the calibration dictionary of the acid/bicarb fill conductivities group. + + @return: acid/bicarb fill conductivities hardware group dictionary and the byte size of this hardware group + """ + hardware_names = ['fill', 'acid_tst', 'bicarb_tst'] + group_byte_size = 0 + group_name = 'acid_08_1251_1_fill_cond' + hardware_group = OrderedDict({group_name: OrderedDict()}) + hardware = OrderedDict() + + for i in hardware_names: + acid_cond = self._DEFAULT_BIC_TEST_ACID_SNSR_US_PER_CM + bicarb_cond = self._DEFAULT_BIC_TEST_BIC_SNSR_US_PER_CM + + if i == 'fill': + acid_cond = self._DEFAULT_FILL_1251_1_ACID_SNSR_US_PER_CM + bicarb_cond = self._DEFAULT_FILL_1251_1_BIC_SNSR_US_PER_CM + elif i == 'acid_tst': + acid_cond = self._DEFAULT_ACID_TEST_1251_1_US_PER_CM + bicarb_cond = self._DEFAULT_ACID_TEST_1251_1_US_PER_CM + + hardware[i] = {'acid_cond': [' int: """ - Constructs and sends the raw air trap level sensor override command - Constraints: - Must be logged into HD. - Given sensor must be one of the sensors listed below. + Constructs and sends the raw air trap level sensor override command + Constraints: + Must be logged into HD. + Given sensor must be one of the sensors listed below. - @param sensor: unsigned int - sensor ID - @param detected: unsigned int - detected (0=air, 1=fluid) to override sensor with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise + @param sensor: unsigned int - sensor ID + @param detected: unsigned int - detected (0=air, 1=fluid) to override sensor with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise - Air trap sensor IDs: \n - 0 = Lower level \n - 1 = Upper level \n - """ + Air trap sensor IDs: \n + 0 = Lower level \n + 1 = Upper level \n + """ rst = integer_to_bytearray(reset) det = integer_to_bytearray(detected) Index: dialin/hd/dialysate_outlet_flow.py =================================================================== diff -u -r1f6af0afb3388e3a491e1446f336fff9997a3dba -r3b0142439081e79391b4c0531a673fcc0783bae7 --- dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision 1f6af0afb3388e3a491e1446f336fff9997a3dba) +++ dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision 3b0142439081e79391b4c0531a673fcc0783bae7) @@ -124,20 +124,21 @@ def get_uf_set_rate(self): """ - Gets the prescribed UF set rate. + Gets the prescribed UF set rate. - @return: the prescribed UF set rate - """ + @return: the prescribed UF set rate + """ return self.uf_set_rate def get_dial_outlet_pump_state(self): """ - Gets the dialysate outlet pump state. + Gets the dialysate outlet pump state. - @return: the current dialysate outlet pump state (0 = Pump Off, 1 = Ramp up, 2 = Ramp down, 3 = Control to Target) - """ + @return: the current dialysate outlet pump state (0 = Pump Off, 1 = Ramp up, 2 = Ramp down, 3 = Control to Target) + """ return self.dialysate_outlet_pump_state + @publish([ "hd_dial_outlet_flow_timestamp", "reference_dialysate_outlet_uf_volume", @@ -699,4 +700,4 @@ return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + return False Index: dialin/hd/hemodialysis_device.py =================================================================== diff -u -r1f6af0afb3388e3a491e1446f336fff9997a3dba -r3b0142439081e79391b4c0531a673fcc0783bae7 --- dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 1f6af0afb3388e3a491e1446f336fff9997a3dba) +++ dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 3b0142439081e79391b4c0531a673fcc0783bae7) @@ -52,6 +52,7 @@ from .battery import HDBattery from .usage_info_record import HDUsageNVRecord from .hd_test_configs import HDTestConfig +from .institutional_record import HDInstitutionalNVRecords from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels from ..utils.base import AbstractSubSystem, publish, LogManager, INTERVAL_10s @@ -179,6 +180,7 @@ self.battery = HDBattery(self.can_interface, self.logger) self.usage_record = HDUsageNVRecord(self.can_interface, self.logger) self.test_configs = HDTestConfig(self.can_interface, self.logger) + self.institutional_record = HDInstitutionalNVRecords(self.can_interface, self.logger) def __del__(self): self.can_interface.transmit_interval_dictionary[self.callback_id].stop() @@ -831,4 +833,4 @@ return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + return False Index: dialin/hd/service_record.py =================================================================== diff -u -r1f6af0afb3388e3a491e1446f336fff9997a3dba -r3b0142439081e79391b4c0531a673fcc0783bae7 --- dialin/hd/service_record.py (.../service_record.py) (revision 1f6af0afb3388e3a491e1446f336fff9997a3dba) +++ dialin/hd/service_record.py (.../service_record.py) (revision 3b0142439081e79391b4c0531a673fcc0783bae7) @@ -46,8 +46,9 @@ _DEFAULT_CRC_VALUE = 0 _FIRMWARE_STACK_NAME = 'HD' - # Maximum allowed bytes to be written to RTC RAM - _RTC_RAM_MAX_BYTES_TO_WRITE = 64 + # Maximum allowed bytes that are allowed to be written to EEPROM in firmware + # The padding size then is calculated to be divisions of 16 + _EEPROM_MAX_BYTES_TO_WRITE = 16 # Delay in between each payload transfer _PAYLOAD_TRANSFER_DELAY_S = 0.2 @@ -267,7 +268,7 @@ groups_byte_size += self._utilities.calculate_group_byte_size(record_crc) # Get the padding size to create a dictionary from it - padding_size = self._utilities.calculate_padding_byte_size(groups_byte_size, self._RTC_RAM_MAX_BYTES_TO_WRITE) + padding_size = self._utilities.calculate_padding_byte_size(groups_byte_size, self._EEPROM_MAX_BYTES_TO_WRITE) # Create the padding dictionary as list of unsigned char. All the elements are 0. padding = OrderedDict({'padding': ['