Index: leahi_dialin/common/msg_ids.py =================================================================== diff -u -ref2941249089bf9eeb6f771112ce13a4a1f39a36 -redccc0fd295ef1c384046edbcc3a83901bfc9bc9 --- leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision ef2941249089bf9eeb6f771112ce13a4a1f39a36) +++ leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision edccc0fd295ef1c384046edbcc3a83901bfc9bc9) @@ -283,8 +283,8 @@ MSG_ID_DD_TEMPERATURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xA018 MSG_ID_DD_TEMPERATURE_SENSOR_MEASURED_TEMPERATURE_OVERRIDE_REQUEST = 0xA019 MSG_ID_DD_TEMPERATURE_SENSOR_READ_COUNTER_OVERRIDE_REQUEST = 0xA01A - MSG_ID_DD_TEMPERATURE_SENSOR_BARO_READ_COUNTER_OVERRIDE_REQUEST = 0xA01B - MSG_ID_DD_TEMPERATURE_SENSOR_BARO_CRC_OVERRIDE_REQUEST = 0xA01C + MSG_ID_DD_TEMPERATURE_SENSOR_FILTERED_TEMP_OVERRIDE_REQUEST = 0xA01B + MSG_ID_DD_AVAILABLE_3 = 0xA01C MSG_ID_DD_DIALYSATE_PUMPS_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xA01D MSG_ID_DD_DIALYSATE_PUMPS_TARGET_SPEED_OVERRIDE_REQUEST = 0xA01E MSG_ID_DD_DIALYSATE_PUMPS_MEASURED_SPEED_OVERRIDE_REQUEST = 0xA01F @@ -348,6 +348,7 @@ MSG_ID_DD_BICARB_CHAMBER_FILL_REQUEST_OVERRIDE_REQUEST = 0xA05A MSG_ID_DD_BICART_DRAIN_REQUEST_OVERRIDE_REQUEST = 0xA05B MSG_ID_DD_BICART_CARTRIDGE_SELECT_OVERRIDE_REQUEST = 0xA05C + MSG_ID_DD_CONDUCTIVITY_SENSOR_RESISTANCE_OVERRIDE_REQUEST = 0xA05D # Placeholder messages MSG_ID_DD_ALARM_STATE_OVERRIDE_REQUEST = 0xAF03 @@ -365,8 +366,8 @@ MSG_ID_FP_RO_PUMP_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB009 MSG_ID_FP_PRESSURE_OVERRIDE_REQUEST = 0xB00A MSG_ID_FP_PRESSURE_TEMP_OVERRIDE_REQUEST = 0xB00B - MSG_ID_FP_PRESSURE_READ_COUNT_OVERRIDE_REQUEST = 0xB00C - MSG_ID_FP_PRESSURE_ERROR_COUNT_OVERRIDE_REQUEST = 0xB00D + MSG_ID_FP_PRESSURE_SENSOR_FILTER_READINGS_OVERRIDE_REQUEST = 0xB00C + MSG_ID_FP_PRESSURE_SENSOR_FILTER_TEMPERATURE_OVERRIDE_REQUEST = 0xB00D MSG_ID_FP_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB00E MSG_ID_FP_LEVEL_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB00F MSG_ID_FP_LEVEL_OVERRIDE_REQUEST = 0xB010 @@ -404,12 +405,26 @@ MSG_ID_FP_INLET_PRES_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB030 MSG_ID_FP_INLET_PRES_CHECK_TIME_OVERRIDE_REQUEST = 0xB031 MSG_ID_FP_FILTERED_COND_SENSOR_READINGS_OVERRIDE_REQUEST = 0xB032 - # MSG_ID_FP_FILTERED_COND_SENSOR_TEMPERATURE_OVERRIDE_REQUEST = 0xB032 - MSG_ID_FP_SET_START_STOP_OVERRIDE_REQUEST = 0xB033 - MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB034 - MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST = 0xB035 - MSG_ID_FP_DEF_STATUS_REQUEST = 0xB049 - MSG_ID_FP_DEF_STATUS_RESPONSE = 0xB04A + MSG_ID_FP_FILTERED_COND_SENSOR_TEMPERATURE_OVERRIDE_REQUEST = 0xB033 + MSG_ID_FP_SET_START_STOP_OVERRIDE_REQUEST = 0xB034 + MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB035 + MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST = 0xB036 + MSG_ID_FP_RO_GET_CALCULATED_DUTY_CYCLE_REQUEST = 0xB037 + MSG_ID_FP_RO_CALCULATED_DUTY_CYCLE_RESPONSE = 0xB038 + MSG_ID_FP_FLUSH_FILTER_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB039 + MSG_ID_FP_FLUSH_FILTER_TIMER_OVERRIDE_REQUEST = 0xB03A + MSG_ID_FP_FLUSH_PERMEATE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB03B + MSG_ID_FP_FLUSH_PERMEATE_TIMER_OVERRIDE_REQUEST = 0xB03C + MSG_ID_FP_FLUSH_PERMEATE_ALARM_TIMER_OVERRIDE_REQUEST = 0xB03D + MSG_ID_FP_FLUSH_CONCENTRATE_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB03E + MSG_ID_FP_FLUSH_CONCENTRATE_TIMER_OVERRIDE_REQUEST = 0xB03F + MSG_ID_FP_DEF_FLUSH_FILTER_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB040 + MSG_ID_FP_DEF_FLUSH_FILTER_TIMER_OVERRIDE_REQUEST = 0xB041 + MSG_ID_FP_DEF_PRE_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB042 + MSG_ID_FP_DEF_GEN_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB043 + MSG_ID_FP_DEF_STATUS_REQUEST = 0xB044 + MSG_ID_FP_DEF_STATUS_RESPONSE = 0xB045 + MSG_ID_FP_CONDUCTIVITY_SENSOR_RESISTANCE_OVERRIDE_REQUEST = 0xB046 MSG_ID_TD_DEBUG_EVENT = 0xFFF1 MSG_ID_DD_DEBUG_EVENT = 0xFFF2 Index: leahi_dialin/dd/dialysate_delivery.py =================================================================== diff -u -rb9e9c4477d1083db8d96beafd98ae6cd96ea432f -redccc0fd295ef1c384046edbcc3a83901bfc9bc9 --- leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision b9e9c4477d1083db8d96beafd98ae6cd96ea432f) +++ leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision edccc0fd295ef1c384046edbcc3a83901bfc9bc9) @@ -31,6 +31,7 @@ from .modules.pre_gen_dialysate import DDPreGenDialysate from .modules.rinse_pump import DDRinsePump from .modules.spent_chamber_fill import DDSpentChamberFill +from .modules.drybicart import DDDryBicart from .modules.temperature_sensors import DDTemperatureSensors from .modules.dd_test_configs import DDTestConfig from .modules.ultrafiltration import DDUltrafiltration @@ -133,6 +134,7 @@ self.pre_gen_dialysate = DDPreGenDialysate(self.can_interface, self.logger) self.rinse_pump = DDRinsePump(self.can_interface, self.logger) self.spent_chamber_fill = DDSpentChamberFill(self.can_interface, self.logger) + self.drybicart = DDDryBicart(self.can_interface, self.logger) self.temperature_sensors = DDTemperatureSensors(self.can_interface, self.logger) self.test_configs = DDTestConfig(self.can_interface, self.logger) self.ultrafiltration = DDUltrafiltration(self.can_interface, self.logger) Index: leahi_dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -r55a8c10a40d37ca346976b11dd5fdc0c8ee76c97 -redccc0fd295ef1c384046edbcc3a83901bfc9bc9 --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 55a8c10a40d37ca346976b11dd5fdc0c8ee76c97) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision edccc0fd295ef1c384046edbcc3a83901bfc9bc9) @@ -221,3 +221,60 @@ logger = self.logger, can_interface = self.can_interface) + def cmd_conductivity_sensor_resistance_override(self, sensor_index: int, conductivity: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the conductivity resistance override command + Constraints: + Must be logged into DD. + Given sensor_index must be one of the sensors defined in ConductivitySensorsEnum + + Note: Override only works for Teensy conductivity sensor implementation. D79 is not installed with Teensy sensors. + + @param sensor_index: unsigned int - index of the sensor + @param conductivity: float - conductivity value to override sensor with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + reset_byte_array = integer_to_bytearray(reset) + cond_byte_array = float_to_bytearray(conductivity) + sensor_byte_array = integer_to_bytearray(sensor_index) + payload = reset_byte_array + cond_byte_array + sensor_byte_array + + sensor_name = dd_enum_repository.DDConductivitySensorNames(sensor_index).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_RESISTANCE_OVERRIDE_REQUEST, + entity_name = f'DD {sensor_name} Conductivity Sensor resistance', + override_text = f'{str(conductivity)} ohms', + logger = self.logger, + can_interface = self.can_interface) + + def cmd_conductivity_sensor_filtered_readings_override(self, sensor_index: int, conductivity: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the conductivity value override command + Constraints: + Must be logged into DD. + Given sensor_index must be one of the sensors defined in ConductivitySensorsEnum + + @param sensor_index: unsigned int - index of the sensor + @param conductivity: float - conductivity value to override sensor with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + reset_byte_array = integer_to_bytearray(reset) + cond_byte_array = float_to_bytearray(conductivity) + sensor_byte_array = integer_to_bytearray(sensor_index) + payload = reset_byte_array + cond_byte_array + sensor_byte_array + + sensor_name = dd_enum_repository.DDConductivitySensorNames(sensor_index).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_FILTERED_COND_SENSOR_READINGS_OVERRIDE_REQUEST, + entity_name = f'DD {sensor_name} Conductivity Sensor reading', + override_text = f'{str(conductivity)} microsiemens/cm', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r18f767a4c701bf22d074eda6cafe3dfd98906585 -redccc0fd295ef1c384046edbcc3a83901bfc9bc9 --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 18f767a4c701bf22d074eda6cafe3dfd98906585) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision edccc0fd295ef1c384046edbcc3a83901bfc9bc9) @@ -253,8 +253,7 @@ logger = self.logger, can_interface = self.can_interface) - - def cmd_pressure_filtered_temperature_override(self, sensor: int, temperature: float, reset: int = NO_RESET) -> int: + def cmd_temperatures_filtered_value_override(self, sensor: int, temperature: float, reset: int = NO_RESET) -> int: """ Constructs and sends the filtered temperature override command. Constraints: @@ -265,17 +264,40 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ + + # DD Conductivity Sensors' Temperature Reading Override + if dd_enum_repository.DDTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value <= sensor <= dd_enum_repository.DDTemperatureSensorNames.LAST_CONDUCTIVITY_SENSOR.value: + modified_index= sensor - dd_enum_repository.DDTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value + message_id = MsgIds.MSG_ID_DD_FILTERED_COND_SENSOR_TEMPERATURE_OVERRIDE_REQUEST + + # DD Conductivity Sensors' Average Temperature Reading Override + elif dd_enum_repository.DDTemperatureSensorNames.FIRST_AVERAGE_SENSOR.value <= sensor <= dd_enum_repository.DDTemperatureSensorNames.LAST_AVERAGE_SENSOR.value: + modified_index= sensor - dd_enum_repository.DDTemperatureSensorNames.FIRST_AVERAGE_SENSOR.value + message_id = 'Unknown' + self.logger.info('No Msg ID is present for Conductivity sensor Average override! Skipping...') + return False + + # DD Pressure Sensors' Temperature Reading Override + elif dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value <= sensor <= dd_enum_repository.DDTemperatureSensorNames.LAST_PRESSURE_SENSOR.value: + modified_index= sensor - dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value + message_id = MsgIds.MSG_ID_DD_PRESSURE_SENSOR_FILTER_TEMPERATURE_OVERRIDE_REQUEST + + # DD Temperature Sensors' Temperature Reading Override + else: + modified_index= sensor + message_id = MsgIds.MSG_ID_DD_TEMPERATURE_SENSOR_FILTERED_TEMP_OVERRIDE_REQUEST + rst = integer_to_bytearray(reset) tmp = float_to_bytearray(temperature) - idx = integer_to_bytearray(sensor - dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value) + idx = integer_to_bytearray(modified_index) payload = rst + tmp + idx sensor_name = dd_enum_repository.DDTemperatureSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_DD_PRESSURE_SENSOR_FILTER_TEMPERATURE_OVERRIDE_REQUEST, + msg_id = message_id, entity_name = f'DD {sensor_name} Temperature Sensor filtered temperature', override_text = f'{str(temperature)} Celsius', logger = self.logger, Index: leahi_dialin/fp/filtration_purification.py =================================================================== diff -u -r18f767a4c701bf22d074eda6cafe3dfd98906585 -redccc0fd295ef1c384046edbcc3a83901bfc9bc9 --- leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 18f767a4c701bf22d074eda6cafe3dfd98906585) +++ leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision edccc0fd295ef1c384046edbcc3a83901bfc9bc9) @@ -93,16 +93,9 @@ self.can_interface.register_receiving_publication_function(channel_id, MsgIds.MSG_ID_FP_DEF_STATUS_RESPONSE.value, self._handler_fp_defeatured_response) - # For current builds and setups without UI, there are no CAN messages sent on the bus to let the - # subsystems know there are other nodes and start publishing. Dialin will send a plain ACK to the CANbus over - # the dd channel to start publishing. - message = DenaliMessage.build_message( - channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK.value, - payload=bytearray(), - seq=0) - if message is not None: - self.can_interface.send(message, 0, is_ack=True) + # Dialin will send a login message during construction. This is for the leahi subsystems to start + # publishing CAN data when there is no UI connected as the UI typically does this job. + self.cmd_log_in_to_fp() # create properties self.fp_defeatured = False Index: leahi_dialin/fp/modules/temperatures.py =================================================================== diff -u -r3715028b608b10e1d440a8a738c8a4f70d3d411b -redccc0fd295ef1c384046edbcc3a83901bfc9bc9 --- leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision 3715028b608b10e1d440a8a738c8a4f70d3d411b) +++ leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision edccc0fd295ef1c384046edbcc3a83901bfc9bc9) @@ -45,6 +45,7 @@ fp_enum_repository.FPTemperatureSensorNames.P8_TEMP.name: 0.0, fp_enum_repository.FPTemperatureSensorNames.P13_TEMP.name: 0.0, fp_enum_repository.FPTemperatureSensorNames.P17_TEMP.name: 0.0, + fp_enum_repository.FPTemperatureSensorNames.P46_TEMP.name: 0.0, fp_enum_repository.FPTemperatureSensorNames.P10_TEMP.name: 0.0, fp_enum_repository.FPTemperatureSensorNames.P19_TEMP.name: 0.0, fp_enum_repository.FPTemperatureSensorNames.P7_TEMP.name: 0.0, @@ -72,9 +73,9 @@ sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P17_TEMP, 'f')) sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P7_TEMP, 'f')) sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P16_TEMP, 'f')) + sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P46_TEMP, 'f')) sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P7_INTERNAL_TEMP, 'f')) sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P16_INTERNAL_TEMP, 'f')) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P46_TEMP, 'f')) i = 1 for sensor in sensor_list: @@ -152,3 +153,47 @@ override_text = str(sensor_value), logger = self.logger, can_interface = self.can_interface) + + def cmd_temperatures_filtered_value_override(self, sensor_index: int, sensor_value: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the filtered value override of a temperature sensor. + Constraints: + Must be logged into FP. + Given sensor_index must be one of the sensors listed below. + + @param sensor_index : (int) Index of the sensor + @param sensor_value: (float) Value of the sensor to override + @param reset: (int) whether to reset the override value. The default is NO_RESET + @returns 1 if successful, zero otherwise + """ + + # FP Conductivity Sensors' Temperature Override + if fp_enum_repository.FPTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value <= sensor_index <= fp_enum_repository.FPTemperatureSensorNames.LAST_CONDUCTIVITY_SENSOR.value: + modified_index = sensor_index - fp_enum_repository.FPTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value + BETA_IOFP_COND_SENSOR_OFFSET - 1 + msg_id = MsgIds.MSG_ID_FP_FILTERED_COND_SENSOR_TEMPERATURE_OVERRIDE_REQUEST + + # FP Flow Sensors' Temperature Override + elif fp_enum_repository.FPTemperatureSensorNames.FIRST_FLOW_SENSOR.value <= sensor_index <= fp_enum_repository.FPTemperatureSensorNames.LAST_FLOW_SENSOR.value: + modified_index = sensor_index - fp_enum_repository.FPTemperatureSensorNames.FIRST_FLOW_SENSOR.value + msg_id = MsgIds.MSG_ID_FP_FILTERED_FLOW_TEMP_OVERRIDE_REQUEST + + # FP Pressure Sensors' Temperature Override + else: + modified_index = sensor_index - fp_enum_repository.FPTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value + BETA_IOFP_PRES_SENSOR_OFFSET + msg_id = MsgIds.MSG_ID_FP_PRESSURE_SENSOR_FILTER_TEMPERATURE_OVERRIDE_REQUEST + + index = integer_to_bytearray(modified_index) + rst = integer_to_bytearray(reset) + value = float_to_bytearray(sensor_value) + payload = rst + value + index + + sensor_name = fp_enum_repository.FPTemperatureSensorNames(sensor_index).name.split('_')[0] + return cmd_generic_override( + payload=payload, + reset=reset, + channel_id=DenaliChannels.dialin_to_fp_ch_id, + msg_id=msg_id, + entity_name=f'FP {sensor_name} Temperature Sensor filtered temperature', + override_text=str(sensor_value), + logger=self.logger, + can_interface=self.can_interface) \ No newline at end of file