Index: leahi_dialin/common/dd_defs_proxy.py =================================================================== diff -u -r5994adea1a1022175f9cc4e6dacfa02de3fc45a0 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/common/dd_defs_proxy.py (.../dd_defs_proxy.py) (revision 5994adea1a1022175f9cc4e6dacfa02de3fc45a0) +++ leahi_dialin/common/dd_defs_proxy.py (.../dd_defs_proxy.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -20,76 +20,76 @@ class DD_Defs(): # Operation Modes - Lvl 1 - DDOpModes = dd_defs.DDOpModes + DDOpModes = dd_defs.DDOpModes # Operation Modes - Lvl 2 - DDFaultStates = dd_defs.DDFaultStates - DDServiceStates = dd_defs.DDServiceStates - DDInitStates = dd_defs.DDInitStates - DDStandbyStates = dd_defs.DDStandbyStates - DDPreGenDialysateStates = dd_defs.DDPreGenDialysateStates - DDGenDialysateModeStates = dd_defs.DDGenDialysateModeStates - DDPostGenDialysateStates = dd_defs.DDPostGenDialysateStates - DDHeatDisinfectStates = dd_defs.DDHeatDisinfectStates - DDHeaterCoolingStates = dd_defs.DDHeaterCoolingStates - DDROPermeateStates = dd_defs.DDROPermeateStates - DDNotLegalStates = dd_defs.DDNotLegalStates + DDFaultStates = dd_defs.DDFaultStates + DDServiceStates = dd_defs.DDServiceStates + DDInitStates = dd_defs.DDInitStates + DDStandbyStates = dd_defs.DDStandbyStates + DDPreGenDialysateStates = dd_defs.DDPreGenDialysateStates + DDGenDialysateModeStates = dd_defs.DDGenDialysateModeStates + DDPostGenDialysateStates = dd_defs.DDPostGenDialysateStates + DDHeatDisinfectStates = dd_defs.DDHeatDisinfectStates + DDHeaterCoolingStates = dd_defs.DDHeaterCoolingStates + DDROPermeateStates = dd_defs.DDROPermeateStates + DDNotLegalStates = dd_defs.DDNotLegalStates # Operation Modes - Lvl 3 - DDFaultNVDataStates = dd_defs.DDFaultNVDataStates - DDPreGenWetSelfTestStates = dd_defs.DDPreGenWetSelfTestStates + DDFaultNVDataStates = dd_defs.DDFaultNVDataStates + DDPreGenWetSelfTestStates = dd_defs.DDPreGenWetSelfTestStates # Events - DDEventList = dd_defs.DDEventList - DataTypes = generic_defs.DataTypes + DDEventList = dd_defs.DDEventList + DataTypes = generic_defs.DataTypes # Sensor Names - DDConcentratePumpNames = dd_defs.DDConcentratePumpNames - DDConductivitySensorNames = dd_defs.DDConductivitySensorNames - DDDialysatePumpNames = dd_defs.DDDialysatePumpNames - DDHeaterNames = dd_defs.DDHeaterNames - DDLevelSensorNames = dd_defs.DDLevelSensorNames - DDPistonPumpNames = dd_defs.DDPistonPumpNames - DDPressureSensorNames = dd_defs.DDPressureSensorNames - DDTemperatureSensorNames = dd_defs.DDTemperatureSensorNames - DDValveNames = dd_defs.DDValveNames - DDMonitoredVoltages = dd_defs.DDMonitoredVoltages - DDSubstitutionPumpNames = dd_defs.DDSubstitutionPumpNames + DDConcentratePumpNames = dd_defs.DDConcentratePumpNames + DDConductivitySensorNames = dd_defs.DDConductivitySensorNames + DDDialysatePumpNames = dd_defs.DDDialysatePumpNames + DDHeaterNames = dd_defs.DDHeaterNames + DDLevelSensorNames = dd_defs.DDLevelSensorNames + DDPistonPumpNames = dd_defs.DDPistonPumpNames + DDPressureSensorNames = dd_defs.DDPressureSensorNames + DDTemperatureSensorNames = dd_defs.DDTemperatureSensorNames + DDValveNames = dd_defs.DDValveNames + DDMonitoredVoltages = dd_defs.DDMonitoredVoltages + DDSubstitutionPumpNames = dd_defs.DDSubstitutionPumpNames # Sensor Attributes - DDBalancingChamberStates = dd_defs.DDBalancingChamberStates - DDBalancingChamberSwitchStates = dd_defs.DDBalancingChamberSwitchStates - DDBicartChFFillExecStates = dd_defs.DDBicartChFFillExecStates - DDBloodLeakStates = dd_defs.DDBloodLeakStates - DDConcentratePumpAttributes = dd_defs.DDConcentratePumpAttributes - DDConcentratePumpStates = dd_defs.DDConcentratePumpStates - DDDialysatePumpAttributes = dd_defs.DDDialysatePumpAttributes - DDDialysatePumpsStates = dd_defs.DDDialysatePumpsStates - DDDryBicartDrainExecStates = dd_defs.DDDryBicartDrainExecStates - DDDryBicartFillExecStates = dd_defs.DDDryBicartFillExecStates - DDHeaterStartStop = dd_defs.DDHeaterStartStop - DDHeaterAttributes = dd_defs.DDHeaterAttributes - DDHeaterExecState = dd_defs.DDHeaterExecState - DDPistonPumpAttributes = dd_defs.DDPistonPumpAttributes - DDSpentChFillExecState = dd_defs.DDSpentChFillExecState - DDValveStates = dd_defs.DDValveStates - DDCancelModes = dd_defs.DDCancelModes - DDSubstitutionPumpAttributes = dd_defs.DDSubstitutionPumpAttributes + DDBalancingChamberStates = dd_defs.DDBalancingChamberStates + DDBalancingChamberSwitchStates = dd_defs.DDBalancingChamberSwitchStates + DDBicartChFFillExecStates = dd_defs.DDBicartChFFillExecStates + DDBloodLeakStates = dd_defs.DDBloodLeakStates + DDConcentratePumpAttributes = dd_defs.DDConcentratePumpAttributes + DDConcentratePumpStates = dd_defs.DDConcentratePumpStates + DDDialysatePumpAttributes = dd_defs.DDDialysatePumpAttributes + DDDialysatePumpsStates = dd_defs.DDDialysatePumpsStates + DDDryBicartDrainExecStates = dd_defs.DDDryBicartDrainExecStates + DDDryBicartFillExecStates = dd_defs.DDDryBicartFillExecStates + DDHeaterStartStop = dd_defs.DDHeaterStartStop + DDHeaterAttributes = dd_defs.DDHeaterAttributes + DDHeaterExecState = dd_defs.DDHeaterExecState + DDPistonPumpAttributes = dd_defs.DDPistonPumpAttributes + DDSpentChFillExecState = dd_defs.DDSpentChFillExecState + DDValveStates = dd_defs.DDValveStates + DDCancelModes = dd_defs.DDCancelModes + DDSubstitutionPumpAttributes = dd_defs.DDSubstitutionPumpAttributes DDConductivityResistanceAttributes = dd_defs.DDConductivityResistanceAttributes # Records - RecordTypes = generic_defs.RecordTypes - SystemRecordFields = generic_defs.SystemRecordFields - ServiceRecordFields = generic_defs.ServiceRecordFields - CalibrationRecordFields = generic_defs.get_calibration_record_fields() - InstitutionalRecordFields = generic_defs.InstitutionalRecordFields - UsageInformationRecordFields = generic_defs.UsageInformationRecordFields + RecordTypes = generic_defs.RecordTypes + SystemRecordFields = generic_defs.SystemRecordFields + ServiceRecordFields = generic_defs.ServiceRecordFields + CalibrationRecordFields = generic_defs.get_calibration_record_fields() + InstitutionalRecordFields = generic_defs.InstitutionalRecordFields + UsageInformationRecordFields = generic_defs.UsageInformationRecordFields # Record support - CalibRecordAccelerometerFields = generic_defs.CalibRecordAccelerometerFields - CalibRecordBloodLeakFields = generic_defs.CalibRecordBloodLeakFields - CalibRecordConcentrateFields = generic_defs.CalibRecordConcentrateFields - CalibRecordSensorFields = generic_defs.CalibRecordSensorFields + CalibRecordAccelerometerFields = generic_defs.CalibRecordAccelerometerFields + CalibRecordBloodLeakFields = generic_defs.CalibRecordBloodLeakFields + CalibRecordConcentrateFields = generic_defs.CalibRecordConcentrateFields + CalibRecordSensorFields = generic_defs.CalibRecordSensorFields dd_enum_repository = DD_Defs() Index: leahi_dialin/dd/dialysate_delivery.py =================================================================== diff -u -r4c11f61e1e328407ed98a1b81a3e8b0adb278bd5 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision 4c11f61e1e328407ed98a1b81a3e8b0adb278bd5) +++ leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -43,13 +43,13 @@ from .proxies.ro_proxy import ROProxy from .proxies.td_proxy import TDProxy -from ..common.constants import NO_RESET +from ..common.constants import NO_RESET, MSG_HEADER_SIZE from ..common import dd_enum_repository from ..common.generic_defs import DataTypes from ..common.msg_ids import MsgIds from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from ..protocols.CAN import CanMessage, CanMessenger, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish, LogManager from ..utils.conversions import integer_to_bytearray, bytearray_to_byte @@ -107,18 +107,16 @@ self.cmd_log_in_to_dd() # create properties - self.dd_op_mode_timestamp = 0.0 #: The timestamp of the latest operation mode message - self.dd_debug_events_timestamp = 0.0 #: The timestamp of the latest events message - self.dd_version_response_timestamp = 0.0 #: The timestamp of the latest DD version info message - self.dd_operation_mode = dd_enum_repository.DDOpModes.MODE_INIT.value #: The Operation Mode's value - self.dd_operation_sub_mode = 0 #: The Operation Sub-Mode's value - self.dd_logged_in = False #: The value showing if the user is logged in or not - self.dd_set_logged_in_status(False) - self.dd_version = None #: The DD's version value - self.dd_fpga_version = None #: The DD's FPGA version value - self.dd_debug_events = [''] * self._DD_DEBUG_EVENT_LIST_COUNT #: The Debug Event's list - self.dd_debug_event_index = 0 #: The index of the last Event - self.dd_last_debug_event = '' #: The name of the last Event + self.dd_op_mode_timestamp = 0.0 #: The timestamp of the latest operation mode message + self.dd_debug_events_timestamp = 0.0 #: The timestamp of the latest events message + self.dd_version_response_timestamp = 0.0 #: The timestamp of the latest DD version info message + self.dd_operation_mode = dd_enum_repository.DDOpModes.MODE_INIT.value + self.dd_operation_sub_mode = 0 + self.dd_version = None + self.dd_fpga_version = None + self.dd_debug_events = [''] * self._DD_DEBUG_EVENT_LIST_COUNT #: The Debug Event's list + self.dd_debug_event_index = 0 #: The index of the last Event + self.dd_last_debug_event = '' #: The name of the last Event # Create command groups self.alarms = DDAlarms(self.can_interface, self.logger) #: The Alarms module @@ -150,23 +148,66 @@ self.td_proxy = TDProxy(self.can_interface, self.logger) #: The TD Proxy module (imitates commands sent by UI) - def dd_set_logged_in_status(self, logged_in: bool = False): + + +# ============================================================ Properties ============================================================ + @property + def dd_operation_mode(self) -> int: """ - Callback for dd logged in status change. - - @param logged_in: Logged in status for DD - @return: None + The current Operation Mode """ - self.dd_logged_in = logged_in + return self._op_mode + @dd_operation_mode.setter + def dd_operation_mode(self, value): + self._op_mode = value + + @property + def dd_operation_sub_mode(self) -> int: + """ + The current Operation Sub Mode + """ + return self._sub_mode + + @dd_operation_sub_mode.setter + def dd_operation_sub_mode(self, value): + self._sub_mode = value + + + @property + def dd_version(self) -> str: + """ + The DD Version data + """ + return self._dd_version + + @dd_version.setter + def dd_version(self, value): + self._dd_version = value + + + @property + def dd_fpga_version(self) -> str: + """ + The DD FPGA Version data + """ + return self._fpga_version + + @dd_fpga_version.setter + def dd_fpga_version(self, value): + self._fpga_version = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_debug_event", "dd_debug_events_timestamp","dd_debug_events"]) def _handler_dd_debug_event_sync(self, message, timestamp = 0.0): payload = message['message'] message_length = payload[self._DD_DEBUG_EVENT_MSG_LEN_INDEX] temp_message = '' - index = MsgFieldPositions.START_POS_FIELD_1 + index = MSG_HEADER_SIZE for i in range(0, message_length): # Loop through the length and get the @@ -192,11 +233,10 @@ @return: None """ msg_list = [] - msg_list.append(('self.dd_operation_mode', DataTypes.U32)) - msg_list.append(('self.dd_operation_sub_mode', DataTypes.U32)) + msg_list.append((type(self).dd_operation_mode, DataTypes.U32)) + msg_list.append((type(self).dd_operation_sub_mode, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_op_mode_timestamp = timestamp @@ -209,31 +249,42 @@ @return: None if not successful, the version string if unpacked successfully """ + major = LocalVars('major') + minor = LocalVars('minor') + micro = LocalVars('micro') + build = LocalVars('build') + fpga_id = LocalVars('fpga_id') + fpga_major = LocalVars('fpga_major') + fpga_minor = LocalVars('fpga_minor') + fpga_lab = LocalVars('fpga_lab') + compatibility = LocalVars('compatibility') + msg_list = [] - msg_list.append(('major', DataTypes.U08)) - msg_list.append(('minor', DataTypes.U08)) - msg_list.append(('micro', DataTypes.U08)) - msg_list.append(('build', DataTypes.U16)) - msg_list.append(('fpga_id', DataTypes.U08)) - msg_list.append(('fpga_major', DataTypes.U08)) - msg_list.append(('fpga_minor', DataTypes.U08)) - msg_list.append(('fpga_lab', DataTypes.U08)) - msg_list.append(('compatibility', DataTypes.U32)) + msg_list.append((major, DataTypes.U08)) + msg_list.append((minor, DataTypes.U08)) + msg_list.append((micro, DataTypes.U08)) + msg_list.append((build, DataTypes.U16)) + msg_list.append((fpga_id, DataTypes.U08)) + msg_list.append((fpga_major, DataTypes.U08)) + msg_list.append((fpga_minor, DataTypes.U08)) + msg_list.append((fpga_lab, DataTypes.U08)) + msg_list.append((compatibility, DataTypes.U32)) - result = self.process_into_vars(decoder_list = msg_list, - message = message) - - if all([each is not None for each in [result['major'], result['minor'], result['micro'], result['build'], result['compatibility']]]): - self.dd_version = f"v{result['major']}.{result['minor']}.{result['micro']}-{result['build']}.{result['compatibility']}" - self.logger.debug(f'DD VERSION: {self.dd_version}') + self.process_into_vars(decoder_list = msg_list, message = message) - if all([each is not None for each in [result['fpga_id'], result['fpga_major'], result['fpga_minor'], result['fpga_lab']]]): - self.dd_fpga_version = f"v{result['fpga_id']}.{result['fpga_major']}.{result['fpga_minor']}-{result['fpga_lab']}" - self.logger.debug(f'DD FPGA VERSION: {self.dd_fpga_version}') + if all([each is not None for each in [major.value, minor.value, micro.value, build.value, compatibility.value]]): + self.dd_version = f"v{major.value}.{minor.value}.{micro.value}-{build.value}.{compatibility.value}" + self.logger.debug(f'TD VERSION: {self.dd_version}') + if all([each is not None for each in [fpga_id.value, fpga_major.value, fpga_minor.value, fpga_lab.value]]): + self.dd_fpga_version = f"v{fpga_id.value}.{fpga_major.value}.{fpga_minor.value}-{fpga_lab.value}" + self.logger.debug(f'TD FPGA VERSION: {self.dd_fpga_version}') + self.dd_version_response_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ # def cmd_op_mode_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: # """ # Constructs and sends the measured op mode broadcast interval override command Index: leahi_dialin/dd/modules/alarms.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -25,7 +25,7 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -51,8 +51,6 @@ message_id = MsgIds.MSG_ID_ALARM_TRIGGERED.value, function = self._handler_alarm_triggered) - self.alarm_safety_shutdown_status = 0.0 #: The Alarm's Safety Shutdown status value - self.dd_alarm_info_timestamp = 0.0 #: The timestamp of the last Alarm Information message self.dd_alarm_triggered_timestamp = 0.0 #: The timestamp of the last Alarm Triggered message self.dd_alarm_cleared_timestamp = 0.0 #: The timestamp of the last Alarm Cleared message @@ -70,6 +68,12 @@ self.last_alarm_data_2 = 0.0 #: The last Alarm's data part 2 + +# ============================================================ Properties ============================================================ + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_alarm_triggered", "alarm_states", "alarm_conditions", "alarm_data", "alarm_priorities", "alarm_ranks", "alarm_clear_top_only_flags", "dd_alarm_triggered_timestamp"]) def _handler_alarm_triggered(self, message, timestamp = 0.0): @@ -79,176 +83,66 @@ @param message: published DD alarm activation message @return: none """ - result = {} + alarm_id = LocalVars('alarm_id') + data_typ_1 = LocalVars('data_typ_1') + data_1 = LocalVars('data_1') + data_typ_2 = LocalVars('data_typ_2') + data_2 = LocalVars('data_2') + priority = LocalVars('priority') + rank = LocalVars('rank') + clr_top_only = LocalVars('clr_top_only') + msg_list = [] - msg_list.append(('alarm_id', DataTypes.U32)) - msg_list.append(('data_typ_1', DataTypes.U32)) - msg_list.append(('data_1', 'data_typ_1')) - msg_list.append(('data_typ_2', DataTypes.U32)) - msg_list.append(('data_2', 'data_typ_2')) - msg_list.append(('priority', DataTypes.U32)) - msg_list.append(('rank', DataTypes.U32)) - msg_list.append(('clr_top_only', DataTypes.U32)) + msg_list.append((alarm_id, DataTypes.U32)) + msg_list.append((data_typ_1, DataTypes.U32)) + msg_list.append((data_1, 'data_typ_1')) + msg_list.append((data_typ_2, DataTypes.U32)) + msg_list.append((data_2, 'data_typ_2')) + msg_list.append((priority, DataTypes.U32)) + msg_list.append((rank, DataTypes.U32)) + msg_list.append((clr_top_only, DataTypes.U32)) - i = 1 - for msg_detail in msg_list: - start_pos = eval(f'MsgFieldPositions.START_POS_FIELD_{i}') - end_pos = eval(f'MsgFieldPositions.END_POS_FIELD_{i}') - if isinstance(msg_detail[1], DataTypes): - unpack_attrib = msg_detail[1].unpack_attrib() - else: - unpack_attrib = DataTypes(result[msg_detail[1]]).unpack_attrib() - - value = struct.unpack(unpack_attrib, bytearray(message['message'][start_pos:end_pos]))[0] - result[msg_detail[0]] = value - i += 1 + self.process_into_vars(decoder_list = msg_list, message = message) - self.logger.debug("Alarm ID: %d %d %d" % (result['alarm_id'], result['data_1'], result['data_2'])) - self.alarm_states[result['alarm_id']] = True - self.alarm_conditions[result['alarm_id']] = True - self.alarm_priorities[result['alarm_id']] = result['priority'] - self.alarm_ranks[result['alarm_id']] = result['rank'] - self.alarm_clear_top_only_flags[result['alarm_id']] = result['clr_top_only'] - self.alarm_data[result['alarm_id']] = [result['data_1'], result['data_2']] - self.last_alarm_triggered = result['alarm_id'] - self.last_alarm_data_1 = result['data_1'] - self.last_alarm_data_2 = result['data_2'] + self.logger.debug("Alarm ID: %d %d %d" % (alarm_id.value, data_1.value, data_2.value)) + self.alarm_states[alarm_id.value] = True + self.alarm_conditions[alarm_id.value] = True + self.alarm_priorities[alarm_id.value] = priority.value + self.alarm_ranks[alarm_id.value] = rank.value + self.alarm_clear_top_only_flags[alarm_id.value] = clr_top_only.value + self.alarm_data[alarm_id.value] = [data_1.value, data_2.value] + self.last_alarm_triggered = alarm_id.value + self.last_alarm_data_1 = data_1.value + self.last_alarm_data_2 = data_2.value self.dd_alarm_triggered_timestamp = timestamp - @publish(["msg_id_dd_alarm_info", "alarm_safety_shutdown_status", "dd_alarm_info_timestamp"]) - def _handler_alarm_info(self, message, timestamp = 0.0): - """ - Handles published DD alarm info messages. - @param message: published DD alarm info message - @return: none +# ============================================================ Support ============================================================ + def clear_dialin_alarms(self): """ - self.alarm_safety_shutdown_status = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])) - - self.dd_alarm_info_timestamp = timestamp + Clears the alarms states in Dialin. - - @publish(["msg_id_dd_alarm_cleared", "dd_alarm_cleared_timestamp"]) - def _handler_alarm_cleared(self, message, timestamp = 0.0): - """ - Handles published DD alarm cleared messages. - - @param message: published DD alarm cleared message @return: none """ - #ToDo - self.dd_alarm_cleared_timestamp = timestamp + for x in range(self.alarm_states): + self.alarm_states[x] = False - @publish(["msg_id_dd_alarm_condition_cleared", "dd_alarm_condition_cleared_timestamp"]) - def _handler_alarm_condition_cleared(self, message, timestamp = 0.0): + def get_dialin_alarms(self): """ - Handles published DD alarm condition cleared messages. + Get the active alarms in Dialin. - @param message: published DD alarm condition cleared message @return: none """ - #ToDo - self.dd_alarm_condition_cleared_timestamp = timestamp + active_alarms = [] + for x in range(self.alarm_states): + if self.alarm_states[x]: + active_alarms.append(AlarmList(x)) + return active_alarms - def cmd_alarm_state_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm state data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm state', - logger = self.logger, - can_interface = self.can_interface) - - - def cmd_alarm_info_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm info data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm info', - logger = self.logger, - can_interface = self.can_interface) - - - def cmd_alarm_cleared_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm cleared data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm cleared', - logger = self.logger, - can_interface = self.can_interface) - - - def cmd_alarm_condition_cleared_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the alarm condition cleared data broadcast interval override command - Constraints: - Must be logged into DD. - Given interval must be non-zero and a multiple of the DD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise - """ - print('Not implemented in the FW') - return False - - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = '', - module_name = 'DD Alarm condition cleared', - logger = self.logger, - can_interface = self.can_interface) - - +# ============================================================ Overrides and Requests ============================================================ def cmd_alarm_state_override(self, alarm: int, state: int, reset: int = NO_RESET) -> int: """ Constructs and sends the alarm state override command Index: leahi_dialin/dd/modules/balancing_chamber.py =================================================================== diff -u -r4c11f61e1e328407ed98a1b81a3e8b0adb278bd5 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/balancing_chamber.py (.../balancing_chamber.py) (revision 4c11f61e1e328407ed98a1b81a3e8b0adb278bd5) +++ leahi_dialin/dd/modules/balancing_chamber.py (.../balancing_chamber.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -49,17 +49,115 @@ message_id = MsgIds.MSG_ID_DD_BAL_CHAMBER_DATA.value, function = self._handler_balancing_chamber_sync) - self.execution_state = 0 #: The Execution state - self.switching_state = 0 #: The Switching state - self.switching_frequency = 0.0 #: The Switching frequency of the balancing chamber - self.is_spent_fill_complete = 0 #: Is Spent fill complete or not - self.current_bal_chamber_switching_counter = 0 #: The Balancing Chamber's switching counter - self.is_pressure_stabilized_during_fill = 0 #: Is pressure stabilized during fill or not - self.bal_chamber_switch_only_state = 0 #: The balancing chamber's switch only state - self.is_bal_chamber_switching_active = 0 #: Is balancing chamber switching active + self.execution_state = 0 + self.switching_state = 0 + self.switching_frequency = 0.0 + self.is_spent_fill_complete = False + self.current_bal_chamber_switching_counter = 0 + self.is_pressure_stabilized_during_fill = False + self.bal_chamber_switch_only_state = False + self.is_bal_chamber_switching_active = False self.dd_bal_chamber_timestamp = 0 #: The timestamp of the last message +# ============================================================ Properties ============================================================ + @property + def execution_state(self) -> int: + """ + The Execution State + """ + return self._execution_state + + @execution_state.setter + def execution_state(self, value: int): + self._execution_state = value + + + @property + def switching_state(self) -> int: + """ + The Switching State + """ + return self._switching_state + + @switching_state.setter + def switching_state(self, value: int): + self._switching_state = value + + + @property + def switching_frequency(self) -> float: + """ + The Switching frequency of the balancing chamber + """ + return self._switching_frequency + + @switching_frequency.setter + def switching_frequency(self, value: float): + self._switching_frequency = value + + + @property + def is_spent_fill_complete(self) -> bool: + """ + Is Spent fill complete or not + """ + return self._is_spent_fill_complete + + @is_spent_fill_complete.setter + def is_spent_fill_complete(self, value: bool): + self._is_spent_fill_complete = value + + + @property + def is_pressure_stabilized_during_fill(self) -> bool: + """ + Is pressure stabilized during fill or not + """ + return self._is_pressure_stabilized_during_fill + + @is_pressure_stabilized_during_fill.setter + def is_pressure_stabilized_during_fill(self, value: bool): + self._is_pressure_stabilized_during_fill = value + + + @property + def bal_chamber_switch_only_state(self) -> bool: + """ + The balancing chamber's switch only state + """ + return self._switch_only_state + + @bal_chamber_switch_only_state.setter + def bal_chamber_switch_only_state(self, value: bool): + self._switch_only_state = value + + + @property + def is_bal_chamber_switching_active(self) -> bool: + """ + Is balancing chamber switching active + """ + return self._is_bal_chamber_switching_active + + @is_bal_chamber_switching_active.setter + def is_bal_chamber_switching_active(self, value: bool): + self._is_bal_chamber_switching_active = value + + + @property + def current_bal_chamber_switching_counter(self) -> int: + """ + The Balancing Chamber's switching counter + """ + return self._current_bal_chamber_switching_counter + + @current_bal_chamber_switching_counter.setter + def current_bal_chamber_switching_counter(self, value: int): + self._current_bal_chamber_switching_counter = value + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_bal_chamber_data", "execution_state", "switching_state", "switching_frequency", @@ -75,21 +173,21 @@ @return: None """ msg_list = [] - msg_list.append(('self.execution_state', DataTypes.U32)) - msg_list.append(('self.switching_state', DataTypes.U32)) - msg_list.append(('self.switching_frequency', DataTypes.F32)) - msg_list.append(('self.is_spent_fill_complete', DataTypes.U32)) - msg_list.append(('self.current_bal_chamber_switching_counter', DataTypes.U32)) - msg_list.append(('self.is_pressure_stabilized_during_fill', DataTypes.U32)) - msg_list.append(('self.bal_chamber_switch_only_state', DataTypes.U32)) - msg_list.append(('self.is_bal_chamber_switching_active', DataTypes.U32)) + msg_list.append((type(self).execution_state, DataTypes.U32)) + msg_list.append((type(self).switching_state, DataTypes.U32)) + msg_list.append((type(self).switching_frequency, DataTypes.F32)) + msg_list.append((type(self).is_spent_fill_complete, DataTypes.BOOL)) + msg_list.append((type(self).current_bal_chamber_switching_counter, DataTypes.U32)) + msg_list.append((type(self).is_pressure_stabilized_during_fill, DataTypes.BOOL)) + msg_list.append((type(self).bal_chamber_switch_only_state, DataTypes.BOOL)) + msg_list.append((type(self).is_bal_chamber_switching_active, DataTypes.BOOL)) - self.process_into_vars(decoder_list = msg_list, - message = message) - + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_bal_chamber_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_balancing_chamber_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the balancing chamber data broadcast interval override command Index: leahi_dialin/dd/modules/blood_leak.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -17,9 +17,10 @@ # Module imports from logging import Logger from enum import unique +from typing import Union # Project imports -from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.constants import NO_RESET, MSG_HEADER_SIZE from leahi_dialin.common import dd_enum_repository from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.msg_ids import MsgIds @@ -54,10 +55,6 @@ Dialysate Delivery (DD) Dialin API sub-class for blood leak related commands. """ - # Blood leak detector status - BLOOD_LEAK_DETECTED = 0 # Blood detected - NO_BLOOD_LEAK_DETECTED = 1 # No blood detected - def __init__(self, can_interface: CanMessenger, logger: Logger): """ @param can_interface: Leahi Can Messenger object @@ -77,57 +74,161 @@ self.dd_blood_leak_status_timestamp = 0.0 #: The timestamp of the last Blood Leak data message self.dd_blood_leak_emb_mode_response_timestamp = 0.0 #: The timestamp of the last Emb Mode response message - self.blood_leak_status = self.NO_BLOOD_LEAK_DETECTED #: The Blood leak status - self.blood_leak_state = dd_enum_repository.DDBloodLeakStates.BLOOD_LEAK_INIT_STATE.value #: The Blood leak state - self.blood_leak_emb_mode_cmds = dict() #: The Blood leak Emb mode commands in dictionary format - self.blood_leak_error_persistent_ctr = 0 #: The Blood leak error persistent counter - self.blood_leak_serial_comm_state = 0 #: The Blood leak serial communication state - self.blood_leak_intensity = 0 #: The Blood leak intensity - self.blood_leak_blood_detect = 0 #: The Blood leak blood detected or not - self.blood_leak_intensity_moving_average = 0.0 #: The Blood leak intensity moving average - self.blood_leak_in_range_drift_status = 0 #: The Blood leak in range drift status - self.blood_leak_upper_range_drift_status = 0 #: The Blood leak upper range drift status - self.blood_leak_time_elapsed_since_last_drift_zero_ms = 0 #: The Elapsed time since the last zeroing in ms + self.blood_leak_status = False + self.blood_leak_state = dd_enum_repository.DDBloodLeakStates.BLOOD_LEAK_INIT_STATE + self.blood_leak_error_persistent_ctr = 0 + self.blood_leak_serial_comm_state = 0 + self.blood_leak_intensity = 0 + self.blood_leak_blood_detect = False + self.blood_leak_intensity_moving_average = 0.0 + self.blood_leak_in_range_drift_status = 0 + self.blood_leak_upper_range_drift_status = 0 + self.blood_leak_time_elapsed_since_last_drift_zero_ms = 0 for cmd in EmbModeCommands.__members__: # Initialize all the embedded mode commands self.blood_leak_emb_mode_cmds[cmd] = '' - def get_blood_leak_status(self): + +# ============================================================ Properties ============================================================ + @property + def blood_leak_detected(self) -> bool: """ - Gets the current blood leak status + The Blood Leak Detected Status + """ + return self._blood_leak_detected - @return: List containing blood leak status: [detected, undetected] + @blood_leak_detected.setter + def blood_leak_detected(self, value: bool): + self._blood_leak_detected = value + + + @property + def blood_leak_state(self) -> DialinEnum: """ - return self.blood_leak_status + The Blood Leak State + """ + return self._state + @blood_leak_state.setter + def blood_leak_state(self, value: Union[int, DialinEnum]): + if isinstance(value, int): + self._blood_leak_state = dd_enum_repository.DDBloodLeakStates(value) + else: + self._state = value - def get_blood_leak_state(self): + + @property + def blood_leak_emb_mode_cmds(self) -> dict: """ - Gets the current blood leak state - (0: wait for POST, 1: check set point, 2: init, - 3: zero and self test, 4: verify zero, 5: normal, 6: recover blood detect state ) + The Blood leak Emb mode commands + """ + return self._emb_mode_cmds - @return: integer - blood leak state + @blood_leak_emb_mode_cmds.setter + def blood_leak_emb_mode_cmds(self, value): + self._emb_mode_cmds = value + + + @property + def blood_leak_error_persistent_ctr(self) -> int: """ - return self.blood_leak_state + The Blood leak error persistent counter + """ + return self._blood_leak_error_persistent_ctr + @blood_leak_error_persistent_ctr.setter + def blood_leak_error_persistent_ctr(self, value: int): + self._blood_leak_error_persistent_ctr = value - def get_blood_leak_emb_mode_command_response(self, emb_mod_cmd: int) -> str: + + @property + def blood_leak_serial_comm_state(self) -> int: """ - Gets the most recent embedded mode command response for a given command + The Blood Leak serial communication state + """ + return self._serial_comm_state - @param emb_mod_cmd the command to get its response + @blood_leak_serial_comm_state.setter + def blood_leak_serial_comm_state(self, value: int): + self._serial_comm_state = value - @return: string - embedded mode command response + + @property + def blood_leak_intensity(self) -> int: """ - if emb_mod_cmd < len(EmbModeCommands): - return self.blood_leak_emb_mode_cmds[EmbModeCommands(emb_mod_cmd).name] - else: - self.logger.debug("Invalid command!") + The Blood Leak intensity + """ + return self._intensity + @blood_leak_intensity.setter + def blood_leak_intensity(self, value: int): + self._intensity = value + + @property + def blood_leak_blood_detect(self) -> bool: + """ + The Blood Leak blood detected or not + """ + return self._blood_detect + + @blood_leak_blood_detect.setter + def blood_leak_blood_detect(self, value: bool): + self._blood_detect = value + + + @property + def blood_leak_intensity_moving_average(self) -> float: + """ + The Blood Leak intensity moving average + """ + return self._intensity_moving_average + + @blood_leak_intensity_moving_average.setter + def blood_leak_intensity_moving_average(self, value: float): + self._intensity_moving_average = value + + + @property + def blood_leak_time_elapsed_since_last_drift_zero_ms(self) -> int: + """ + The Elapsed time since the last zeroing in ms + """ + return self._time_elapsed_since_last_drift_zero_ms + + @blood_leak_time_elapsed_since_last_drift_zero_ms.setter + def blood_leak_time_elapsed_since_last_drift_zero_ms(self, value: int): + self._time_elapsed_since_last_drift_zero_ms = value + + + @property + def blood_leak_in_range_drift_status(self) -> int: + """ + The Blood Leak in range drift status + """ + return self._blood_leak_in_range_drift_status + + @blood_leak_in_range_drift_status.setter + def blood_leak_in_range_drift_status(self, value: int): + self._blood_leak_in_range_drift_status = value + + + @property + def blood_leak_upper_range_drift_status(self) -> int: + """ + The Blood Leak upper range drift status + """ + return self._upper_range_drift_status + + @blood_leak_upper_range_drift_status.setter + def blood_leak_upper_range_drift_status(self, value: int): + self._upper_range_drift_status = value + + + +# ============================================================ Handlers ============================================================ @publish(['msg_id_dd_blood_leak_data', 'blood_leak_status', 'blood_leak_state', 'blood_leak_error_persistent_ctr', 'blood_leak_serial_comm_state', 'blood_leak_intensity', 'blood_leak_blood_detect', 'blood_leak_intensity_moving_average', @@ -143,19 +244,18 @@ @return: None """ msg_list =[] - msg_list.append(('self.blood_leak_status', DataTypes.U32)) - msg_list.append(('self.blood_leak_state', DataTypes.U32)) - msg_list.append(('self.blood_leak_error_persistent_ctr', DataTypes.U32)) - msg_list.append(('self.blood_leak_serial_comm_state', DataTypes.U32)) - msg_list.append(('self.blood_leak_intensity', DataTypes.U32)) - msg_list.append(('self.blood_leak_blood_detect', DataTypes.U32)) - msg_list.append(('self.blood_leak_intensity_moving_average', DataTypes.F32)) - msg_list.append(('self.blood_leak_time_elapsed_since_last_drift_zero_ms', DataTypes.U32)) - msg_list.append(('self.blood_leak_in_range_drift_status', DataTypes.U32)) - msg_list.append(('self.blood_leak_upper_range_drift_status', DataTypes.U32)) + msg_list.append((type(self).blood_leak_status, DataTypes.BOOL)) + msg_list.append((type(self).blood_leak_state, DataTypes.U32)) + msg_list.append((type(self).blood_leak_error_persistent_ctr, DataTypes.U32)) + msg_list.append((type(self).blood_leak_serial_comm_state, DataTypes.U32)) + msg_list.append((type(self).blood_leak_intensity, DataTypes.U32)) + msg_list.append((type(self).blood_leak_blood_detect, DataTypes.BOOL)) + msg_list.append((type(self).blood_leak_intensity_moving_average, DataTypes.F32)) + msg_list.append((type(self).blood_leak_time_elapsed_since_last_drift_zero_ms, DataTypes.U32)) + msg_list.append((type(self).blood_leak_in_range_drift_status, DataTypes.U32)) + msg_list.append((type(self).blood_leak_upper_range_drift_status, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_blood_leak_status_timestamp = timestamp @@ -172,7 +272,7 @@ # Clear the variable for the next read blood_leak_emb_mode_cmd_response = '' payload = message['message'] - index = MsgFieldPositions.START_POS_FIELD_1 + index = MSG_HEADER_SIZE cmd, index = bytearray_to_byte(payload, index, False) length, index = bytearray_to_integer(payload, index, False) @@ -185,6 +285,23 @@ self.dd_blood_leak_emb_mode_response_timestamp = timestamp + +# ============================================================ Support ============================================================ + def get_blood_leak_emb_mode_command_response(self, emb_mod_cmd: int) -> str: + """ + Gets the most recent embedded mode command response for a given command + + @param emb_mod_cmd the command to get its response + + @return: string - embedded mode command response + """ + if emb_mod_cmd < len(EmbModeCommands): + return self.blood_leak_emb_mode_cmds[EmbModeCommands(emb_mod_cmd).name] + else: + self.logger.debug("Invalid command!") + + +# ============================================================ Overrides and Requests ============================================================ def cmd_blood_leak_data_broadcast_interval_override(self, ms, reset=NO_RESET): """ Constructs and sends the blood leak data broadcast interval override command Index: leahi_dialin/dd/modules/concentrate_pump.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -24,7 +24,7 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -49,8 +49,6 @@ function = self._handler_concentrate_pumps_sync) self.dd_concentrate_pump_timestamp = 0.0 #: The timestamp of the last message - - #: The Concentrate Pumps data in dictionary format self.dd_concentrate_pumps = { dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name: { dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name: 0, @@ -88,6 +86,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def dd_concentrate_pumps(self) -> dict: + """ + The Concentrate Pumps data + """ + return self._concentrate_pumps + + @dd_concentrate_pumps.setter + def dd_concentrate_pumps(self, value): + self._concentrate_pumps = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_conc_pump_data", "dd_concentrate_pumps", "dd_concentrate_pump_timestamp"]) def _handler_concentrate_pumps_sync(self, message, timestamp=0.0): """ @@ -97,39 +111,48 @@ @param message: published concentrate pumps' data message @return: None """ - sensor_list =[] - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.PARKED.name, DataTypes.BOOL)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.PARKED.name, DataTypes.BOOL)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name, DataTypes.BOOL)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name, DataTypes.BOOL)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name, DataTypes.F32)) + d11_state = LocalVars('d11_state') + d10_state = LocalVars('d10_state') + d76_state = LocalVars('d76_state') - self.process_into_vars(dict_to_update = self.dd_concentrate_pumps, - decoder_list = sensor_list, - message = message) + msg_list =[] + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name, DataTypes.U32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name, DataTypes.U32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name, DataTypes.U32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name, DataTypes.U32)) + msg_list.append((d11_state, DataTypes.U32)) + msg_list.append((d10_state, DataTypes.U32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.PARKED.name, DataTypes.BOOL)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.PARKED.name, DataTypes.BOOL)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name, dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name, DataTypes.BOOL)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name, dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name, DataTypes.BOOL)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name, DataTypes.U32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name, DataTypes.U32)) + msg_list.append((d76_state, DataTypes.U32)) + msg_list.append((self.dd_concentrate_pumps, dd_enum_repository.DDConcentratePumpNames.D76_UF.name, dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name, DataTypes.F32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert the state to enum + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name] = dd_enum_repository.DDConcentratePumpStates(d11_state.value) + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name] = dd_enum_repository.DDConcentratePumpStates(d10_state.value) + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name] = dd_enum_repository.DDConcentratePumpStates(d76_state.value) self.dd_concentrate_pump_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_concentrate_pump_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the concentrate pump data broadcast interval override command Index: leahi_dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -60,10 +60,6 @@ function = self._handler_conductivity_cal_sync) self.dd_conductivity_timestamp = 0.0 #: The timestamp of the last conductivity message - self.dd_conductivity_cal_timestamp = 0.0 #: The timestamp of the last calibration response message - self.dd_conductivity_version_timestamp = 0.0 #: The timestamp of the last version response message - - #: The Conductivity Sensors data in dictionary format self.dd_conductivity = { dd_enum_repository.DDConductivitySensorNames.D17_COND.name: { dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name: 0.0, @@ -97,6 +93,26 @@ }, } + self.dd_conductivity_cal_timestamp = 0.0 #: The timestamp of the last calibration response message + self.dd_conductivity_version_timestamp = 0.0 #: The timestamp of the last version response message + + + +# ============================================================ Properties ============================================================ + @property + def dd_conductivity(self) -> dict: + """ + The Conductivity data + """ + return self._conductivity + + @dd_conductivity.setter + def dd_conductivity(self, value): + self._conductivity = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_conductivity_data", "dd_conductivity", "dd_conductivity_timestamp"]) def _handler_conductivity_sensors_sync(self, message, timestamp=0.0): """ @@ -106,31 +122,29 @@ @param message: published DD conductivity sensor data message @return: None """ - sensor_list =[] - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) + msg_list =[] + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D17_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D27_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D29_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D43_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) + msg_list.append((self.dd_conductivity, dd_enum_repository.DDConductivitySensorNames.D74_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) - self.process_into_vars(dict_to_update = self.dd_conductivity, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_conductivity_timestamp = timestamp @publish(["msg_id_dd_conductivity_version_data", "dd_conductivity_resistance", "dd_conductivity_version_timestamp"]) @@ -143,6 +157,7 @@ #TODO: complete response handler self.dd_conductivity_version_timestamp = timestamp + @publish(["msg_id_dd_conductivity_cal_data", "dd_conductivity_resistance", "dd_conductivity_cal_timestamp"]) def _handler_conductivity_cal_sync(self, message, timestamp=0.0): """ @@ -153,6 +168,9 @@ #TODO: complete response handler self.dd_conductivity_cal_timestamp = timestamp + + +# ============================================================ Overrides and Requests ============================================================ def cmd_conductivity_sensor_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the conductivity sensor data broadcast interval override command @@ -382,4 +400,4 @@ entity_name = 'DD Conductivity Calibration Request', override_text = 'N/A', logger = self.logger, - can_interface = self.can_interface) \ No newline at end of file + can_interface = self.can_interface) Index: leahi_dialin/dd/modules/dd_test_configs.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/dd_test_configs.py (.../dd_test_configs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/dd_test_configs.py (.../dd_test_configs.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -18,7 +18,8 @@ from logging import Logger # Project imports -from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.constants import NO_RESET, MSG_HEADER_SIZE +from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.common.test_config_defs import DDFPTestConfigOptions @@ -48,19 +49,26 @@ function = self._handler_dd_test_config_sync) self.dd_test_configs_response_timestamp = 0.0 #: The timestamp of the latest message - self.dd_test_configs = dict() #: The Test Config data in dictionary format + self.dd_test_configs = {} - def get_test_config_status(self, config: int): - """ - Returns the status of a test config - @param config: (int) Test config to set - @return: the status of a test config +# ============================================================ Properties ============================================================ + @property + def dd_test_configs(self) -> dict: """ - return self.dd_test_configs[DDFPTestConfigOptions(config).name] + The current Test Configs data + """ + return self._test_configs + @dd_test_configs.setter + def dd_test_configs(self, value): + self._test_configs = value + + +# ============================================================ Handlers ============================================================ + @publish(['msg_id_dd_send_test_config', 'dd_test_configs', 'dd_test_configs_response_timestamp']) def _handler_dd_test_config_sync(self, message, timestamp=0.0): """ @@ -70,17 +78,29 @@ @param message: published DD test configurations message @return: None """ - payload = message['message'] - index = MsgFieldPositions.START_POS_FIELD_1 + msg_list = [] + for config in DDFPTestConfigOptions: + if config != DDFPTestConfigOptions.NUM_OF_TEST_CONFIGS: + msg_list.append(self.dd_test_configs, config, DataTypes.U08) - for config in DDFPTestConfigOptions.__members__: - if 'NUM_OF_TEST_CONFIGS' not in config: - config_value, index = bytearray_to_integer(payload, index, False) - self.dd_test_configs[config] = config_value - + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_test_configs_response_timestamp = timestamp + +# ============================================================ Support ============================================================ + def get_test_config_status(self, config: int): + """ + Returns the status of a test config + + @param config: (int) Test config to set + @return: the status of a test config + """ + return self.dd_test_configs[DDFPTestConfigOptions(config).name] + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_set_test_config(self, config: int, reset: int = NO_RESET): """ Constructs and sends the DD test config Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -74,6 +74,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def dd_temperatures(self) -> dict: + """ + The Temperature Sensors data + """ + return self._temperatures + + @dd_temperatures.setter + def dd_temperatures(self, value): + self._temperatures = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_temperature_data", "dd_temperatures", "dd_temperatures_timestamp"]) def _handler_temperature_sensors_sync(self, message,timestamp=0.0): """ @@ -82,35 +98,33 @@ @param message: published DD temperature sensors data message @returns none """ - sensor_list =[] - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D1_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D78_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D4_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D50_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D99_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.BRD_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D16_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D28_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D30_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D44_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D75_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D4_AVG_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D50_AVG_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D99_AVG_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D28_AVG_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D30_AVG_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D78_AVG_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D1_AVG_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D9_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D66_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D51_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D18_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D41_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D87_TEMP.name, DataTypes.F32)) + msg_list =[] + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D1_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D78_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D4_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D50_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D99_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.BRD_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D16_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D28_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D30_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D44_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D75_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D4_AVG_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D50_AVG_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D99_AVG_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D28_AVG_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D30_AVG_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D78_AVG_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D1_AVG_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D9_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D66_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D51_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D18_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D41_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_temperatures, dd_enum_repository.DDTemperatureSensorNames.D87_TEMP.name, DataTypes.F32)) - self.process_into_vars(dict_to_update = self.dd_temperatures, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_temperatures_timestamp = timestamp Index: leahi_dialin/dd/modules/ultrafiltration.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/ultrafiltration.py (.../ultrafiltration.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/ultrafiltration.py (.../ultrafiltration.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -16,15 +16,18 @@ # Module imports from logging import Logger +from typing import Union # Project imports from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes +from leahi_dialin.common import dd_enum_repository from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem from leahi_dialin.utils.base import publish +from leahi_dialin.utils import DialinEnum class DDUltrafiltration(AbstractSubSystem): @@ -49,12 +52,67 @@ function = self._handler_ultrafiltration_sync) self.uf_timestamp = 0.0 #: The timestamp of the latest message - self.uf_exec_state = 0 #: The Ultrafiltration execution state - self.uf_rate = 0.0 #: The Ultrafiltration rate - self.compensated_uf_rate = 0.0 #: The Compensated Ultrafiltration rate - self.is_uf_requested = 0 #: Is Ultrafiltration requested or not + self.uf_exec_state = 0 + self.uf_rate = 0.0 + self.compensated_uf_rate = 0.0 + self.is_uf_requested = False + +# ============================================================ Properties ============================================================ + @property + def uf_exec_state(self) -> int: + """ + The Ultrafiltration execution state + """ + return self._uf_exec_state + + @uf_exec_state.setter + def uf_exec_state(self, value: Union[int, DialinEnum]): + if isinstance(value, int): + self._uf_exec_state = value + else: + self._uf_exec_state = value + + + @property + def uf_rate(self) -> float: + """ + The Ultrafiltration rate + """ + return self._uf_rate + + @uf_rate.setter + def uf_rate(self, value: float): + self._uf_rate = value + + + @property + def compensated_uf_rate(self) -> float: + """ + The Compensated Ultrafiltration rate + """ + return self._compensated_uf_rate + + @compensated_uf_rate.setter + def compensated_uf_rate(self, value: float): + self._compensated_uf_rate = value + + + @property + def is_uf_requested(self) -> bool: + """ + Is Ultrafiltration requested or not + """ + return self._is_uf_requested + + @is_uf_requested.setter + def is_uf_requested(self, value: bool): + self._is_uf_requested = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_uf_data", "uf_exec_state","uf_rate", "compensated_uf_rate", "is_uf_requested", "uf_timestamp"]) @@ -66,16 +124,17 @@ @return: None """ msg_list =[] - msg_list.append(('self.uf_exec_state', DataTypes.U32)) - msg_list.append(('self.uf_rate', DataTypes.F32)) - msg_list.append(('self.compensated_uf_rate', DataTypes.F32)) - msg_list.append(('self.is_uf_requested', DataTypes.U32)) + # msg_list.append((type(self).uf_exec_state, DataTypes.U32)) + msg_list.append((type(self).uf_rate, DataTypes.F32)) + msg_list.append((type(self).compensated_uf_rate, DataTypes.F32)) + msg_list.append((type(self).is_uf_requested, DataTypes.BOOL)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.uf_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_uf_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the broadcast time interval override for ultrafiltration data. Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -26,32 +26,17 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish -from leahi_dialin.utils.abstract_classes import AbstractSubSystem -from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray -# Valve states -ENERGIZED = True -DEENERGIZED = False - class DDValves(AbstractSubSystem): """ Dialysate Delivery (DD) interface for valve related commands. """ - # Valves states publish message field positions - START_POS_VALVES_STATES = CanMessage.PAYLOAD_START_INDEX - END_POS_VALVES_STATES = START_POS_VALVES_STATES + 2 # Valves States come in as a U16 value (2 bytes) - START_POS_BCV_VALVES_STATES = END_POS_VALVES_STATES - END_POS_BCV_VALVES_STATES = START_POS_BCV_VALVES_STATES + 1 - START_POS_SPARE_VALVES_STATES = END_POS_BCV_VALVES_STATES - END_POS_SPARE_VALVES_STATES = START_POS_SPARE_VALVES_STATES + 1 - END_POS_ALL_VALVES = START_POS_VALVES_STATES + 4 - def __init__(self, can_interface: CanMessenger, logger: Logger): """ @param can_interface: Can Messenger object @@ -68,41 +53,42 @@ self.dd_valves_states_timestamp = 0.0 #: The timestamp of the latest message self.valve_states_all = 0x00000000 #: States of all the vales in binary format self.valves_sensed_states = OrderedDict() #: The Valve's Sensed State data in dictionary format - self.d14_valv = {"id": dd_enum_repository.DDValveNames.D14_VALV.value, "state": DEENERGIZED} #: The D14 valve's value - self.d52_valv = {"id": dd_enum_repository.DDValveNames.D52_VALV.value, "state": DEENERGIZED} #: The D52 valve's value - self.d8_valv = {"id": dd_enum_repository.DDValveNames.D8_VALV.value, "state": DEENERGIZED} #: The D8 valve's value - self.d54_valv = {"id": dd_enum_repository.DDValveNames.D54_VALV.value, "state": DEENERGIZED} #: The D54 valve's value - self.d53_valv = {"id": dd_enum_repository.DDValveNames.D53_VALV.value, "state": DEENERGIZED} #: The D53 valve's value - self.d34_valv = {"id": dd_enum_repository.DDValveNames.D34_VALV.value, "state": DEENERGIZED} #: The D34 valve's value - self.d64_valv = {"id": dd_enum_repository.DDValveNames.D64_VALV.value, "state": DEENERGIZED} #: The D64 valve's value - self.d31_valv = {"id": dd_enum_repository.DDValveNames.D31_VALV.value, "state": DEENERGIZED} #: The D31 valve's value - self.d65_valv = {"id": dd_enum_repository.DDValveNames.D65_VALV.value, "state": DEENERGIZED} #: The D65 valve's value - self.d35_valv = {"id": dd_enum_repository.DDValveNames.D35_VALV.value, "state": DEENERGIZED} #: The D35 valve's value - self.d40_valv = {"id": dd_enum_repository.DDValveNames.D40_VALV.value, "state": DEENERGIZED} #: The D40 valve's value - self.d47_valv = {"id": dd_enum_repository.DDValveNames.D47_VALV.value, "state": DEENERGIZED} #: The D47 valve's value - self.d3_valv = {"id": dd_enum_repository.DDValveNames.D3_VALV.value, "state": DEENERGIZED} #: The D3 valve's value - self.d80_valv = {"id": dd_enum_repository.DDValveNames.D80_VALV.value, "state": DEENERGIZED} #: The D80 valve's value - self.d81_valv = {"id": dd_enum_repository.DDValveNames.D81_VALV.value, "state": DEENERGIZED} #: The D81 valve's value - self.d85_valv = {"id": dd_enum_repository.DDValveNames.D85_VALV.value, "state": DEENERGIZED} #: The D85 valve's value - self.d23_valv = {"id": dd_enum_repository.DDValveNames.D23_VALV.value, "state": DEENERGIZED} #: The D23 valve's value - self.d19_valv = {"id": dd_enum_repository.DDValveNames.D19_VALV.value, "state": DEENERGIZED} #: The D19 valve's value - self.d25_valv = {"id": dd_enum_repository.DDValveNames.D25_VALV.value, "state": DEENERGIZED} #: The D25 valve's value - self.d21_valv = {"id": dd_enum_repository.DDValveNames.D21_VALV.value, "state": DEENERGIZED} #: The D31 valve's value - self.d24_valv = {"id": dd_enum_repository.DDValveNames.D24_VALV.value, "state": DEENERGIZED} #: The D24 valve's value - self.d20_valv = {"id": dd_enum_repository.DDValveNames.D20_VALV.value, "state": DEENERGIZED} #: The D20 valve's value - self.d26_valv = {"id": dd_enum_repository.DDValveNames.D26_VALV.value, "state": DEENERGIZED} #: The D26 valve's value - self.d22_valv = {"id": dd_enum_repository.DDValveNames.D22_VALV.value, "state": DEENERGIZED} #: The D22 valve's value + self.d14_valv = {"id": dd_enum_repository.DDValveNames.D14_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D14 valve's value + self.d52_valv = {"id": dd_enum_repository.DDValveNames.D52_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D52 valve's value + self.d8_valv = {"id": dd_enum_repository.DDValveNames.D8_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D8 valve's value + self.d54_valv = {"id": dd_enum_repository.DDValveNames.D54_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D54 valve's value + self.d53_valv = {"id": dd_enum_repository.DDValveNames.D53_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D53 valve's value + self.d34_valv = {"id": dd_enum_repository.DDValveNames.D34_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D34 valve's value + self.d64_valv = {"id": dd_enum_repository.DDValveNames.D64_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D64 valve's value + self.d31_valv = {"id": dd_enum_repository.DDValveNames.D31_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D31 valve's value + self.d65_valv = {"id": dd_enum_repository.DDValveNames.D65_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D65 valve's value + self.d35_valv = {"id": dd_enum_repository.DDValveNames.D35_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D35 valve's value + self.d40_valv = {"id": dd_enum_repository.DDValveNames.D40_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D40 valve's value + self.d47_valv = {"id": dd_enum_repository.DDValveNames.D47_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D47 valve's value + self.d3_valv = {"id": dd_enum_repository.DDValveNames.D3_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D3 valve's value + self.d80_valv = {"id": dd_enum_repository.DDValveNames.D80_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D80 valve's value + self.d81_valv = {"id": dd_enum_repository.DDValveNames.D81_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D81 valve's value + self.d85_valv = {"id": dd_enum_repository.DDValveNames.D85_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D85 valve's value - self.d88_d79_valv = {"id": dd_enum_repository.DDValveNames.D88_D79_VALV.value, "state": DEENERGIZED} #: The D88 or D79 valve's value - self.d83_valv = {"id": dd_enum_repository.DDValveNames.D83_VALV.value, "state": DEENERGIZED} #: The D83 valve's value - self.d91_valv = {"id": dd_enum_repository.DDValveNames.D91_VALV.value, "state": DEENERGIZED} #: The D91 valve's value - self.d104_valv = {"id": dd_enum_repository.DDValveNames.D104_VALV.value, "state": DEENERGIZED} #: The D104 valve's value - self.d95_valv = {"id": dd_enum_repository.DDValveNames.D95_VALV.value, "state": DEENERGIZED} #: The D95 valve's value - self.spare5_valv = {"id": dd_enum_repository.DDValveNames.SPARE5_VALV.value, "state": DEENERGIZED} #: The Spare5 valve's value - self.d100_valv = {"id": dd_enum_repository.DDValveNames.D100_VALV.value, "state": DEENERGIZED} #: The D100 valve's value - self.spare7_valv = {"id": dd_enum_repository.DDValveNames.SPARE7_VALV.value, "state": DEENERGIZED} #: The Spare7 valve's value + self.d23_valv = {"id": dd_enum_repository.DDValveNames.D23_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D23 valve's value + self.d19_valv = {"id": dd_enum_repository.DDValveNames.D19_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D19 valve's value + self.d25_valv = {"id": dd_enum_repository.DDValveNames.D25_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D25 valve's value + self.d21_valv = {"id": dd_enum_repository.DDValveNames.D21_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D31 valve's value + self.d24_valv = {"id": dd_enum_repository.DDValveNames.D24_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D24 valve's value + self.d20_valv = {"id": dd_enum_repository.DDValveNames.D20_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D20 valve's value + self.d26_valv = {"id": dd_enum_repository.DDValveNames.D26_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D26 valve's value + self.d22_valv = {"id": dd_enum_repository.DDValveNames.D22_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D22 valve's value + self.d88_d79_valv = {"id": dd_enum_repository.DDValveNames.D88_D79_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D88 or D79 valve's value + self.d83_valv = {"id": dd_enum_repository.DDValveNames.D83_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D83 valve's value + self.d91_valv = {"id": dd_enum_repository.DDValveNames.D91_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D91 valve's value + self.d104_valv = {"id": dd_enum_repository.DDValveNames.D104_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D104 valve's value + self.d95_valv = {"id": dd_enum_repository.DDValveNames.D95_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D95 valve's value + self.spare5_valv = {"id": dd_enum_repository.DDValveNames.SPARE5_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The Spare5 valve's value + self.d100_valv = {"id": dd_enum_repository.DDValveNames.D100_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The D100 valve's value + self.spare7_valv = {"id": dd_enum_repository.DDValveNames.SPARE7_VALV.value, "state": dd_enum_repository.DDValveStates.VALVE_STATE_CLOSED.value } #: The Spare7 valve's value + #: States of all the vales in list format self.valve_states_enum = {} for i in range(0, dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value): @@ -111,80 +97,49 @@ self.valves_sensed_states[valve_name] = '' - def get_valve_states(self): - """ - Gets the valve states - @return: All valve states +# ============================================================ Properties ============================================================ + @property + def dd_valves(self) -> dict: """ - return [ - self.d14_valv.get("state", None), - self.d52_valv.get("state", None), - self.d8_valv.get("state", None), - self.d54_valv.get("state", None), - self.d53_valv.get("state", None), - self.d34_valv.get("state", None), - self.d64_valv.get("state", None), - self.d31_valv.get("state", None), - self.d65_valv.get("state", None), - self.d35_valv.get("state", None), - self.d40_valv.get("state", None), - self.d47_valv.get("state", None), - self.d3_valv.get("state", None), - self.d80_valv.get("state", None), - self.d81_valv.get("state", None), - self.d85_valv.get("state", None), - - self.d23_valv.get("state", None), - self.d19_valv.get("state", None), - self.d25_valv.get("state", None), - self.d21_valv.get("state", None), - self.d24_valv.get("state", None), - self.d20_valv.get("state", None), - self.d26_valv.get("state", None), - self.d22_valv.get("state", None), - - self.d88_d79_valv.get("state", None), - self.d83_valv.get("state", None), - self.d91_valv.get("state", None), - self.d104_valv.get("state", None), - self.d95_valv.get("state", None), - self.spare5_valv.get("state", None), - self.d100_valv.get("state", None), - self.spare7_valv.get("state", None) - ] - - - @staticmethod - def sort_by_id(observation): + The Valves data """ - Converts a published dictionary of valve state information to an ordered list - of tuples. + return {dd_enum_repository.DDValveNames.D14_VALV.name: self.d14_valv['state'], + dd_enum_repository.DDValveNames.D52_VALV.name: self.spare5_valv['state'], + dd_enum_repository.DDValveNames.D8_VALV.name: self.d8_valv['state'], + dd_enum_repository.DDValveNames.D54_VALV.name: self.d54_valv['state'], + dd_enum_repository.DDValveNames.D53_VALV.name: self.d53_valv['state'], + dd_enum_repository.DDValveNames.D34_VALV.name: self.d34_valv['state'], + dd_enum_repository.DDValveNames.D64_VALV.name: self.d64_valv['state'], + dd_enum_repository.DDValveNames.D31_VALV.name: self.d31_valv['state'], + dd_enum_repository.DDValveNames.D65_VALV.name: self.d65_valv['state'], + dd_enum_repository.DDValveNames.D35_VALV.name: self.d35_valv['state'], + dd_enum_repository.DDValveNames.D40_VALV.name: self.d40_valv['state'], + dd_enum_repository.DDValveNames.D47_VALV.name: self.d47_valv['state'], + dd_enum_repository.DDValveNames.D3_VALV.name: self.d3_valv['state'], + dd_enum_repository.DDValveNames.D80_VALV.name: self.d80_valv['state'], + dd_enum_repository.DDValveNames.D81_VALV.name: self.d81_valv['state'], + dd_enum_repository.DDValveNames.D85_VALV.name: self.d85_valv['state'], + dd_enum_repository.DDValveNames.D23_VALV.name: self.d23_valv['state'], + dd_enum_repository.DDValveNames.D19_VALV.name: self.d19_valv['state'], + dd_enum_repository.DDValveNames.D25_VALV.name: self.d25_valv['state'], + dd_enum_repository.DDValveNames.D21_VALV.name: self.d21_valv['state'], + dd_enum_repository.DDValveNames.D24_VALV.name: self.d24_valv['state'], + dd_enum_repository.DDValveNames.D20_VALV.name: self.d20_valv['state'], + dd_enum_repository.DDValveNames.D26_VALV.name: self.d26_valv['state'], + dd_enum_repository.DDValveNames.D22_VALV.name: self.d22_valv['state'], + dd_enum_repository.DDValveNames.D88_D79_VALV.name: self.d88_d79_valv['state'], + dd_enum_repository.DDValveNames.D83_VALV.name: self.d83_valv['state'], + dd_enum_repository.DDValveNames.D91_VALV.name: self.d91_valv['state'], + dd_enum_repository.DDValveNames.D104_VALV.name: self.d104_valv['state'], + dd_enum_repository.DDValveNames.D95_VALV.name: self.d95_valv['state'], + dd_enum_repository.DDValveNames.SPARE5_VALV.name: self.spare5_valv['state'], + dd_enum_repository.DDValveNames.D100_VALV.name: self.d100_valv['state'], + dd_enum_repository.DDValveNames.SPARE7_VALV.name: self.spare7_valv['state']} - @param observation: dictionary of the observed valve states - @return: a list of tuples of the valve states - """ - result = [] - for key, value in observation.items(): - if isinstance(value, dict): - result.append((key, value.get("id", None), value.get("state", None))) - result = sorted(result, key=lambda each: each[1]) - return result - - @staticmethod - def _binary_to_valve_state(binary) -> bool: - """ - @param binary: binary value - @return: 1 = energized, otherwise de-energized - """ - if binary != 0: - return ENERGIZED - else: - return DEENERGIZED - - +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_valves_states_data", "valve_states_all", "d14_valv", @@ -233,60 +188,70 @@ vsa = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_ALL_VALVES])) self.valve_states_all = vsa[0] - vst = struct.unpack(DataTypes.U16.unpack_attrib(), bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_VALVES_STATES])) + valves = LocalVars('valves') + bc_valves = LocalVars('bc_valves') + spare_valves = LocalVars('spare_valves') + + msg_list = [] + msg_list.append((valves, DataTypes.U16)) + msg_list.append((bc_valves, DataTypes.U08)) + msg_list.append((spare_valves, DataTypes.U08)) + + self.process_into_vars(decoder_list = msg_list, message = message) + # Extract each valve state from U16 valves states using bit-masking - self.d14_valv["state"] = self._binary_to_valve_state(vst[0] & 1) - self.d52_valv["state"] = self._binary_to_valve_state(vst[0] & 2) - self.d8_valv["state"] = self._binary_to_valve_state(vst[0] & 4) - self.d54_valv["state"] = self._binary_to_valve_state(vst[0] & 8) - self.d53_valv["state"] = self._binary_to_valve_state(vst[0] & 16) - self.d34_valv["state"] = self._binary_to_valve_state(vst[0] & 32) - self.d64_valv["state"] = self._binary_to_valve_state(vst[0] & 64) - self.d31_valv["state"] = self._binary_to_valve_state(vst[0] & 128) - self.d65_valv["state"] = self._binary_to_valve_state(vst[0] & 256) - self.d35_valv["state"] = self._binary_to_valve_state(vst[0] & 512) - self.d40_valv["state"] = self._binary_to_valve_state(vst[0] & 1024) - self.d47_valv["state"] = self._binary_to_valve_state(vst[0] & 2048) - self.d3_valv["state"] = self._binary_to_valve_state(vst[0] & 4096) - self.d80_valv["state"] = self._binary_to_valve_state(vst[0] & 8192) - self.d81_valv["state"] = self._binary_to_valve_state(vst[0] & 16384) - self.d85_valv["state"] = self._binary_to_valve_state(vst[0] & 32768) + self.d14_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 1) + self.d52_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 2) + self.d8_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 4) + self.d54_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 8) + self.d53_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 16) + self.d34_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 32) + self.d64_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 64) + self.d31_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 128) + self.d65_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 256) + self.d35_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 512) + self.d40_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 1024) + self.d47_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 2048) + self.d3_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 4096) + self.d80_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 8192) + self.d81_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 16384) + self.d85_valv["state"] = dd_enum_repository.DDValveStates(valves.value & 32768) - bcv = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_POS_BCV_VALVES_STATES:self.END_POS_BCV_VALVES_STATES])) - self.d23_valv["state"] = self._binary_to_valve_state(bcv[0] & 1) - self.d19_valv["state"] = self._binary_to_valve_state(bcv[0] & 2) - self.d25_valv["state"] = self._binary_to_valve_state(bcv[0] & 4) - self.d21_valv["state"] = self._binary_to_valve_state(bcv[0] & 8) - self.d24_valv["state"] = self._binary_to_valve_state(bcv[0] & 16) - self.d20_valv["state"] = self._binary_to_valve_state(bcv[0] & 32) - self.d26_valv["state"] = self._binary_to_valve_state(bcv[0] & 64) - self.d22_valv["state"] = self._binary_to_valve_state(bcv[0] & 128) + self.d23_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 1) + self.d19_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 2) + self.d25_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 4) + self.d21_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 8) + self.d24_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 16) + self.d20_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 32) + self.d26_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 64) + self.d22_valv["state"] = dd_enum_repository.DDValveStates(bc_valves.value & 128) - spv = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_POS_SPARE_VALVES_STATES:self.END_POS_SPARE_VALVES_STATES])) - self.d88_d79_valv["state"] = self._binary_to_valve_state(spv[0] & 1) - self.d83_valv["state"] = self._binary_to_valve_state(spv[0] & 2) - self.d91_valv["state"] = self._binary_to_valve_state(spv[0] & 4) - self.d104_valv["state"] = self._binary_to_valve_state(spv[0] & 8) - self.d95_valv["state"] = self._binary_to_valve_state(spv[0] & 16) - self.spare5_valv["state"] = self._binary_to_valve_state(spv[0] & 32) - self.d100_valv["state"] = self._binary_to_valve_state(spv[0] & 64) - self.spare7_valv["state"] = self._binary_to_valve_state(spv[0] & 128) + self.d88_d79_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 1) + self.d83_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 2) + self.d91_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 4) + self.d104_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 8) + self.d95_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 16) + self.spare5_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 32) + self.d100_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 64) + self.spare7_valv["state"] = dd_enum_repository.DDValveStates(spare_valves.value & 128) # Updating Valve_states_enum for i in range(0, dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value): valve_name = dd_enum_repository.DDValveNames(i).name self.valve_states_enum[valve_name] = eval(f'self.{valve_name.lower()}["state"]') - start = self.END_POS_SPARE_VALVES_STATES - end = start + 1 + # Extract each valve sensed state + start = DataTypes.U32.size() + msg_list_2 = [] for valve_id in self.valves_sensed_states: - valve_state_number = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][start:end]))[0] - self.valves_sensed_states[valve_id] = valve_state_number - start = end - end += 1 + msg_list.append((self.valves_sensed_states, valve_id, DataTypes.U08)) + + self.process_into_vars(decoder_list = msg_list_2, message = message, start_from_byte = start) self.dd_valves_states_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_valve_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the valve state override command. Index: leahi_dialin/dd/modules/voltages.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -16,6 +16,7 @@ # Module imports from logging import Logger +from typing import List # Project imports from leahi_dialin.common.constants import NO_RESET @@ -47,9 +48,7 @@ message_id = MsgIds.MSG_ID_DD_VOLTAGES_DATA.value, function = self._handler_monitored_voltages_sync) - self.dd_voltages_timestamp = 0.0 #: The timestamp of the latest message - - #: The Voltages data in list format + self.dd_voltages_timestamp = 0.0 #: The timestamp of the latest message self.monitored_voltages = { dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_1_2V.name: 0.0, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_3_3V.name: 0.0, @@ -66,6 +65,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def monitored_voltages(self) -> List[float]: + """ + The Voltages data + """ + return self._monitored_voltages + + @monitored_voltages.setter + def monitored_voltages(self, value): + self._monitored_voltages = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_voltages_data","dd_voltages_timestamp","monitored_voltages"]) def _handler_monitored_voltages_sync(self, message, timestamp=0.0): """ @@ -75,26 +90,26 @@ @param message: published monitored voltages data message @return: none """ - sensor_list = [] - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_1_2V.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_3_3V.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_24V_1.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_24V_2.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.FPGA_AC_DC_POWER_SUPPY_VOLTAGE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.FPGA_AC_DC_POWER_SUPPY_CURRENT.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.FPGA_AC_HEATER_VOLTAGE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDMonitoredVoltages.FPGA_AC_HEATER_CURRENT.name, DataTypes.F32)) + msg_list = [] + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_1_2V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_3_3V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_24V_1.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_24V_2.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.FPGA_AC_DC_POWER_SUPPY_VOLTAGE.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.FPGA_AC_DC_POWER_SUPPY_CURRENT.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.FPGA_AC_HEATER_VOLTAGE.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, dd_enum_repository.DDMonitoredVoltages.FPGA_AC_HEATER_CURRENT.name, DataTypes.F32)) - self.process_into_vars(dict_to_update = self.monitored_voltages, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_voltages_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_monitored_voltages_broadcast_interval_override(self, ms: int = 1000, reset: int = NO_RESET) -> int: """ Constructs and sends the monitored DD voltages broadcast interval override command Index: leahi_dialin/dd/proxies/ro_proxy.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/proxies/ro_proxy.py (.../ro_proxy.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/proxies/ro_proxy.py (.../ro_proxy.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -43,6 +43,16 @@ # no current registered call back methods + +# ============================================================ Properties ============================================================ + + + +# ============================================================ Handlers ============================================================ + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_dd_send_ro_start_stop_request(self, cmdID: int = 0, start: bool = 0, ro_rate: float = 0): """ Constructs and sends a DD command request to the RO. Index: leahi_dialin/dd/proxies/td_proxy.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -47,22 +47,34 @@ message_id = MsgIds.MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA.value, function = self._handler_dialysate_delivery_request_response) - self.dialysate_delivery_request_start = 0 - self.dialysate_delivery_request_dial_rate = 0.0 - self.dialysate_delivery_request_uf_rate = 0.0 - self.dialysate_delivery_request_dial_temp = 0.0 - self.dialysate_delivery_request_bypass = 0 - self.dialysate_delivery_request_acid = 0 - self.dialysate_delivery_request_bicarb = 0 - self.dd_td_to_dd_request_response_timestamp = 0.0 + self.dialysate_delivery_request = { + 'start': False, + 'dial_rate': 0.0, + 'uf_rate': 0.0, + 'dial_temp': 0.0, + 'bypass': 0, + 'acid': 0, + 'bicarb': 0 + } + self.td_to_dd_request_response_timestamp = 0.0 #: The timestamp of the latest Dialysate Delivery request info message - @publish(["dd_td_to_dd_request_response_timestamp", - "dialysate_delivery_request_start","dialysate_delivery_request_dial_rate", - "dialysate_delivery_request_uf_rate","dialysate_delivery_request_dial_temp", - "dialysate_delivery_request_bypass","dialysate_delivery_request_acid", - "dialysate_delivery_request_bicarb", - ]) + +# ============================================================ Properties ============================================================ + @property + def dialysate_delivery_request(self) -> dict: + """ + The current Operation Mode + """ + return self._dialysate_delivery_request + + @dialysate_delivery_request.setter + def dialysate_delivery_request(self, value): + self._dialysate_delivery_request = value + + +# ============================================================ Handlers ============================================================ + @publish(["msg_id_dd_gen_dialysate_request_data", "dialysate_delivery_request", "td_to_dd_request_response_timestamp"]) def _handler_dialysate_delivery_request_response(self, message, timestamp=0.0): """ Handles published dialysate delivery request response data messages. @@ -71,19 +83,20 @@ @return: None """ msg_list =[] - msg_list.append(('self.dialysate_delivery_request_start', DataTypes.U32)) - msg_list.append(('self.dialysate_delivery_request_dial_rate', DataTypes.F32)) - msg_list.append(('self.dialysate_delivery_request_uf_rate', DataTypes.F32)) - msg_list.append(('self.dialysate_delivery_request_dial_temp', DataTypes.F32)) - msg_list.append(('self.dialysate_delivery_request_bypass', DataTypes.U32)) - msg_list.append(('self.dialysate_delivery_request_acid', DataTypes.U32)) - msg_list.append(('self.dialysate_delivery_request_bicarb', DataTypes.U32)) + msg_list.append((self.dialysate_delivery_request, 'start', DataTypes.U32)) + msg_list.append((self.dialysate_delivery_request, 'dial_rate', DataTypes.F32)) + msg_list.append((self.dialysate_delivery_request, 'uf_rate', DataTypes.F32)) + msg_list.append((self.dialysate_delivery_request, 'dial_temp', DataTypes.F32)) + msg_list.append((self.dialysate_delivery_request, 'bypass', DataTypes.U32)) + msg_list.append((self.dialysate_delivery_request, 'acid', DataTypes.U32)) + msg_list.append((self.dialysate_delivery_request, 'bicarb', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) - self.dd_td_to_dd_request_response_timestamp = timestamp + self.process_into_vars(decoder_list = msg_list, message = message) + self.td_to_dd_request_response_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_td_send_dd_gen_dialysate_request(self, start: bool = 0, dial_rate: float = 0, uf_rate: float = 0, dial_temp: float = 0, bypass: int = 0, acid_conv_factor: float = 0.0, bicarb_conv_factor: float = 0.0, sodium: int = 0, bicarb_volume: int = 0, sub_rate: float = 0): Index: leahi_dialin/fp/filtration_purification.py =================================================================== diff -u -r4bbcf07a714e5b38fb117023694cb0be0bd3815d -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 4bbcf07a714e5b38fb117023694cb0be0bd3815d) +++ leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -31,13 +31,13 @@ from .proxies.dd_proxy import DDProxy -from ..common.constants import NO_RESET +from ..common.constants import NO_RESET, MSG_HEADER_SIZE from ..common import fp_enum_repository from ..common.generic_defs import DataTypes from ..common.msg_ids import MsgIds from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from ..protocols.CAN import CanMessage, CanMessenger, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish, LogManager from ..utils.conversions import integer_to_bytearray, bytearray_to_byte @@ -103,20 +103,19 @@ self.cmd_log_in_to_fp() # configuration records - self.fp_defeatured = False #: The FP is defeaturized or not + self.fp_defeatured = False self.fp_defeatured_timestamp = 0.0 #: The timestamp of the latest defeatured message - self.fp_p40_installed = False #: The P40 Boost Pump is installed or not + self.fp_p40_installed = False self.fp_p40_installed_timestamp = 0.0 #: The timestamp of the latest P40 Boost Pump is installed message # create properties self.fp_op_mode_timestamp = 0.0 #: The timestamp of the latest operation mode message self.fp_debug_events_timestamp = 0.0 #: The timestamp of the latest events message self.fp_version_response_timestamp = 0.0 #: The timestamp of the latest FP version info message - self.fp_operation_mode = fp_enum_repository.FPOpModes.MODE_INIT.value #: The Operation Mode's value - self.fp_operation_sub_mode = 0 #: The Operation Sub-Mode's value - self.fp_logged_in = False #: The value showing if the user is logged in or not - self.fp_version = None #: The FP's version value - self.fp_fpga_version = None #: The FP's FPGA version value + self.fp_operation_mode = fp_enum_repository.FPOpModes.MODE_INIT.value + self.fp_operation_sub_mode = 0 + self.fp_version = None + self.fp_fpga_version = None self.fp_debug_events = [''] * self._FP_DEBUG_EVENT_LIST_COUNT #: The Debug Event's list self.fp_debug_event_index = 0 #: The index of the last Event self.fp_last_debug_event = '' #: The name of the last Event @@ -139,6 +138,82 @@ self.dd_proxy = DDProxy(self.can_interface, self.logger, fp = self) #: The DD Proxy module (imitates commands sent by DD) + +# ============================================================ Properties ============================================================ + @property + def fp_operation_mode(self) -> int: + """ + The current Operation Mode + """ + return self._op_mode + + @fp_operation_mode.setter + def fp_operation_mode(self, value): + self._op_mode = value + + + @property + def fp_operation_sub_mode(self) -> int: + """ + The current Operation Sub Mode + """ + return self._sub_mode + + @fp_operation_sub_mode.setter + def fp_operation_sub_mode(self, value): + self._sub_mode = value + + + @property + def fp_version(self) -> str: + """ + The FP Version data + """ + return self._fp_version + + @fp_version.setter + def fp_version(self, value): + self._fp_version = value + + + @property + def fp_fpga_version(self) -> str: + """ + The FP FPGA Version data + """ + return self._fpga_version + + @fp_fpga_version.setter + def fp_fpga_version(self, value): + self._fpga_version = value + + + @property + def fp_defeatured(self) -> bool: + """ + The FP Defeatured data + """ + return self._defeatured + + @fp_defeatured.setter + def fp_defeatured(self, value: bool): + self._defeatured = value + + + @property + def fp_p40_installed(self) -> bool: + """ + The FP P40 (Boost Pump) installed information + """ + return self._p40_installed + + @fp_p40_installed.setter + def fp_p40_installed(self, value: bool): + self._p40_installed = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_debug_event", "fp_debug_events_timestamp","fp_debug_events"]) def _handler_fp_debug_event_sync(self, message, timestamp = 0.0): """ @@ -151,7 +226,7 @@ message_length = payload[self._FP_DEBUG_EVENT_MSG_LEN_INDEX] temp_message = '' - index = MsgFieldPositions.START_POS_FIELD_1 + index = MSG_HEADER_SIZE for i in range(0, message_length): # Loop through the length and get the @@ -176,28 +251,37 @@ @return: None if not successful, the version string if unpacked successfully """ + major = LocalVars('major') + minor = LocalVars('minor') + micro = LocalVars('micro') + build = LocalVars('build') + fpga_id = LocalVars('fpga_id') + fpga_major = LocalVars('fpga_major') + fpga_minor = LocalVars('fpga_minor') + fpga_lab = LocalVars('fpga_lab') + compatibility = LocalVars('compatibility') + msg_list = [] - msg_list.append(('major', DataTypes.U08)) - msg_list.append(('minor', DataTypes.U08)) - msg_list.append(('micro', DataTypes.U08)) - msg_list.append(('build', DataTypes.U16)) - msg_list.append(('fpga_id', DataTypes.U08)) - msg_list.append(('fpga_major', DataTypes.U08)) - msg_list.append(('fpga_minor', DataTypes.U08)) - msg_list.append(('fpga_lab', DataTypes.U08)) - msg_list.append(('compatibility', DataTypes.U32)) + msg_list.append((major, DataTypes.U08)) + msg_list.append((minor, DataTypes.U08)) + msg_list.append((micro, DataTypes.U08)) + msg_list.append((build, DataTypes.U16)) + msg_list.append((fpga_id, DataTypes.U08)) + msg_list.append((fpga_major, DataTypes.U08)) + msg_list.append((fpga_minor, DataTypes.U08)) + msg_list.append((fpga_lab, DataTypes.U08)) + msg_list.append((compatibility, DataTypes.U32)) - result = self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) - if all([each is not None for each in [result['major'], result['minor'], result['micro'], result['build'], result['compatibility']]]): - self.fp_version = f"v{result['major']}.{result['minor']}.{result['micro']}-{result['build']}.{result['compatibility']}" + if all([each is not None for each in [major.value, minor.value, micro.value, build.value, compatibility.value]]): + self.fp_version = f"v{major.value}.{minor.value}.{micro.value}-{build.value}.{compatibility.value}" self.logger.debug(f'FP VERSION: {self.fp_version}') - if all([each is not None for each in [result['fpga_id'], result['fpga_major'], result['fpga_minor'], result['fpga_lab']]]): - self.fp_fpga_version = f"v{result['fpga_id']}.{result['fpga_major']}.{result['fpga_minor']}-{result['fpga_lab']}" + if all([each is not None for each in [fpga_id.value, fpga_major.value, fpga_minor.value, fpga_lab.value]]): + self.fp_fpga_version = f"v{fpga_id.value}.{fpga_major.value}.{fpga_minor.value}-{fpga_lab.value}" self.logger.debug(f'FP FPGA VERSION: {self.fp_fpga_version}') - + self.fp_version_response_timestamp = timestamp @@ -211,11 +295,10 @@ @return: None """ msg_list = [] - msg_list.append(('self.fp_operation_mode', DataTypes.U32)) - msg_list.append(('self.fp_operation_sub_mode', DataTypes.U32)) + msg_list.append((type(self).fp_operation_mode, DataTypes.U32)) + msg_list.append((type(self).fp_operation_sub_mode, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.fp_op_mode_timestamp = timestamp @@ -228,10 +311,9 @@ @return: None """ msg_list = [] - msg_list.append(('self.fp_defeatured', DataTypes.BOOL)) + msg_list.append((type(self).fp_defeatured, DataTypes.BOOL)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.fp_defeatured_timestamp = timestamp @@ -244,13 +326,14 @@ @return: None """ msg_list = [] - msg_list.append(('self.fp_p40_installed', DataTypes.BOOL)) + msg_list.append((type(self).fp_p40_installed, DataTypes.BOOL)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.fp_p40_installed_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_request_defeatured_status(self) -> int: """ Constructs and sends the FP defeatured status request @@ -260,7 +343,7 @@ @return: 1 if successful, zero otherwise """ message = CanMessage.build_message(channel_id=CanChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_DEF_STATUS_REQUEST.value) + message_id=MsgIds.MSG_ID_FP_DEF_STATUS_REQUEST.value) self.logger.debug('Getting FP defeatured status') received_message = self.can_interface.send(message) @@ -285,7 +368,7 @@ """ # ToDo: Update the msg id when FW part of LDT-3779 is implemented message = CanMessage.build_message(channel_id=CanChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_BOOST_PUMP_INSTALL_STATUS_REQUEST.value) + message_id=MsgIds.MSG_ID_FP_BOOST_PUMP_INSTALL_STATUS_REQUEST.value) self.logger.debug('Getting FP P40 Boost Pump installed status') received_message = self.can_interface.send(message) @@ -331,8 +414,8 @@ @return: 1 if logged in, 0 if log in failed """ message = CanMessage.build_message(channel_id=CanChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_TESTER_LOGIN_REQUEST.value, - payload=list(map(int, map(ord, self.FP_LOGIN_PASSWORD)))) + message_id=MsgIds.MSG_ID_FP_TESTER_LOGIN_REQUEST.value, + payload=list(map(int, map(ord, self.FP_LOGIN_PASSWORD)))) self.logger.debug("Logging in...") @@ -342,7 +425,6 @@ if received_message is not None: if received_message['message'][CanMessage.PAYLOAD_START_INDEX] == 1: self.logger.debug("Success: Logged In") - self.fp_logged_in = True self.cmd_request_defeatured_status() #self._send_ro_checkin_message() # Timer starts interval first #self.can_interface.transmit_interval_dictionary[self.callback_id].start() Index: leahi_dialin/fp/modules/alarms.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -25,7 +25,7 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -65,6 +65,12 @@ self.last_alarm_data_2 = 0.0 #: The last Alarm's data part 2 + +# ============================================================ Properties ============================================================ + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_alarm_triggered", "alarm_states", "alarm_conditions", "alarm_data", "alarm_priorities", "alarm_ranks", "alarm_clear_top_only_flags", "fp_alarm_triggered_timestamp"]) @@ -75,94 +81,67 @@ @param message: published FP alarm activation message @return: none """ - self.logger.debug("Alarm activated!") - - result = {} + alarm_id = LocalVars('alarm_id') + data_typ_1 = LocalVars('data_typ_1') + data_1 = LocalVars('data_1') + data_typ_2 = LocalVars('data_typ_2') + data_2 = LocalVars('data_2') + priority = LocalVars('priority') + rank = LocalVars('rank') + clr_top_only = LocalVars('clr_top_only') + msg_list = [] - msg_list.append(('alarm_id', DataTypes.U32)) - msg_list.append(('data_typ_1', DataTypes.U32)) - msg_list.append(('data_1', 'data_typ_1')) - msg_list.append(('data_typ_2', DataTypes.U32)) - msg_list.append(('data_2', 'data_typ_2')) - msg_list.append(('priority', DataTypes.U32)) - msg_list.append(('rank', DataTypes.U32)) - msg_list.append(('clr_top_only', DataTypes.U32)) + msg_list.append((alarm_id, DataTypes.U32)) + msg_list.append((data_typ_1, DataTypes.U32)) + msg_list.append((data_1, 'data_typ_1')) + msg_list.append((data_typ_2, DataTypes.U32)) + msg_list.append((data_2, 'data_typ_2')) + msg_list.append((priority, DataTypes.U32)) + msg_list.append((rank, DataTypes.U32)) + msg_list.append((clr_top_only, DataTypes.U32)) - i = 1 - for msg_detail in msg_list: - start_pos = eval(f'MsgFieldPositions.START_POS_FIELD_{i}') - end_pos = eval(f'MsgFieldPositions.END_POS_FIELD_{i}') - if isinstance(msg_detail[1], DataTypes): - unpack_attrib = msg_detail[1].unpack_attrib() - else: - unpack_attrib = DataTypes(result[msg_detail[1]]).unpack_attrib() - - value = struct.unpack(unpack_attrib, bytearray(message['message'][start_pos:end_pos]))[0] - result[msg_detail[0]] = value - i += 1 + self.process_into_vars(decoder_list = msg_list, message = message) - self.logger.debug("Alarm ID: %d %d %d" % (result['alarm_id'], result['data_1'], result['data_2'])) - self.alarm_states[result['alarm_id']] = True - self.alarm_conditions[result['alarm_id']] = True - self.alarm_priorities[result['alarm_id']] = result['priority'] - self.alarm_ranks[result['alarm_id']] = result['rank'] - self.alarm_clear_top_only_flags[result['alarm_id']] = result['clr_top_only'] - self.alarm_data[result['alarm_id']] = [result['data_1'], result['data_2']] - self.last_alarm_triggered = result['alarm_id'] - self.last_alarm_data_1 = result['data_1'] - self.last_alarm_data_2 = result['data_2'] + self.logger.debug("Alarm ID: %d %d %d" % (alarm_id.value, data_1.value, data_2.value)) + self.alarm_states[alarm_id.value] = True + self.alarm_conditions[alarm_id.value] = True + self.alarm_priorities[alarm_id.value] = priority.value + self.alarm_ranks[alarm_id.value] = rank.value + self.alarm_clear_top_only_flags[alarm_id.value] = clr_top_only.value + self.alarm_data[alarm_id.value] = [data_1.value, data_2.value] + self.last_alarm_triggered = alarm_id.value + self.last_alarm_data_1 = data_1.value + self.last_alarm_data_2 = data_2.value self.fp_alarm_triggered_timestamp = timestamp - def cmd_alarm_state_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: + +# ============================================================ Support ============================================================ + def clear_dialin_alarms(self): """ - Constructs and sends the alarm state data broadcast interval override command - Constraints: - Must be logged into FP. - Given interval must be non-zero and a multiple of the FP general task interval (50 ms). + Clears the alarms states in Dialin. - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise + @return: none """ - print('Not implemented in the FW') - return False + for x in range(self.alarm_states): + self.alarm_states[x] = False - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_fp_ch_id, - msg_id = '', - module_name = 'FP Alarm state', - logger = self.logger, - can_interface = self.can_interface) - - def cmd_alarm_info_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: + def get_dialin_alarms(self): """ - Constructs and sends the alarm info data broadcast interval override command - Constraints: - Must be logged into FP. - Given interval must be non-zero and a multiple of the FP general task interval (50 ms). + Get the active alarms in Dialin. - @param ms: integer - interval (in ms) to override with - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise + @return: none """ + active_alarms = [] + for x in range(self.alarm_states): + if self.alarm_states[x]: + active_alarms.append(AlarmList(x)) + return active_alarms - print('Not implemented in the FW') - return False - return cmd_generic_broadcast_interval_override( - ms = ms, - reset = reset, - channel_id = CanChannels.dialin_to_fp_ch_id, - msg_id = '', - module_name = 'FP Alarm info', - logger = self.logger, - can_interface = self.can_interface) - +# ============================================================ Overrides and Requests ============================================================ def cmd_alarm_state_override(self, alarm: int, state: int, reset: int = NO_RESET) -> int: """ Constructs and sends the alarm state override command @@ -216,5 +195,3 @@ override_text = f'Cleared', logger = self.logger, can_interface = self.can_interface) - - #TODO: alarm state override, alarm info pubish override Index: leahi_dialin/fp/modules/boost_pump.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -24,7 +24,7 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -48,8 +48,6 @@ function = self._handler_pump_sync) self.boost_pump_timestamp = 0.0 #: The timestamp of the last message - - # The Boost Pump data in dictionary format self.boost_pump = { fp_enum_repository.FPBoostPumpNames.P40_PUMP.name: { fp_enum_repository.FPPumpAttributes.STATE.name: fp_enum_repository.FPBoostPumpStates.PUMP_OFF_STATE.value, @@ -65,6 +63,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def boost_pump(self) -> dict: + """ + The Boost Pump data + """ + return self._boost_pump + + @boost_pump.setter + def boost_pump(self, value): + self._boost_pump = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_boost_pump_data", "boost_pump", "boost_pump_timestamp"]) def _handler_pump_sync(self, message, timestamp=0.0): """ @@ -74,23 +88,28 @@ @param message: published FP ro pump data message @return: none """ - sensor_list =[] - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.STATE.name, DataTypes.U32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE.name, DataTypes.U32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE.name, DataTypes.U32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.SPEED.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_PRES.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_FLOW.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_DUTY_CYCLE_PCT.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE_PCT.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE_PCT.name, DataTypes.F32)) + state = LocalVars('state') - self.process_into_vars(dict_to_update = self.boost_pump, - decoder_list = sensor_list, - message = message) + msg_list =[] + msg_list.append((state, DataTypes.U32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE.name, DataTypes.U32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE.name, DataTypes.U32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.SPEED.name, DataTypes.F32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_PRES.name, DataTypes.F32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_FLOW.name, DataTypes.F32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_DUTY_CYCLE_PCT.name, DataTypes.F32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE_PCT.name, DataTypes.F32)) + msg_list.append((self.boost_pump, fp_enum_repository.FPBoostPumpNames.P40_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE_PCT.name, DataTypes.F32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert the state to enum + self.fp_levels[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.STATE.name] = fp_enum_repository.FPBoostPumpStates(state.value) self.boost_pump_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_boost_pump_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP boost pump broadcast interval override command Index: leahi_dialin/fp/modules/conductivity_sensors.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -54,11 +54,7 @@ function = self._handler_ro_rejection_ratio_sync) self.fp_conductivity_timestamp = 0.0 #: The timestamp of the last Conductivity data message - self.ro_rejection_ratio_timestamp = 0.0 #: The timestamp of the last RO Rejection Ratio data message - - #: The Conductivity Sensors data in dictionary format self.fp_conductivity = { - fp_enum_repository.FPConductivitySensorNames.P9_COND.name: { dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name: 0.0, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name: 0.0, @@ -73,7 +69,7 @@ }, } - #: The RO Rejection Ratio data in dictionary format + self.ro_rejection_ratio_timestamp = 0.0 #: The timestamp of the last RO Rejection Ratio data message self.ro_rejection_ratio = { fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO.name: 0.0, fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO_TANK_FILL.name: 0.0, @@ -83,6 +79,35 @@ } + + +# ============================================================ Properties ============================================================ + @property + def fp_conductivity(self) -> dict: + """ + The Conductivity data + """ + return self._conductivity + + @fp_conductivity.setter + def fp_conductivity(self, value): + self._conductivity = value + + + @property + def ro_rejection_ratio(self) -> dict: + """ + The current RO Rejection Ratio data + """ + return self._ro_rejection_ratio + + @ro_rejection_ratio.setter + def ro_rejection_ratio(self, value): + self._ro_rejection_ratio = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_conductivity_data", "fp_conductivity", "fp_conductivity_timestamp"]) def _handler_conductivity_sensors_sync(self, message, timestamp=0.0): """ @@ -92,19 +117,17 @@ @param message: published conductivity sensor data message @return: None """ - sensor_list =[] - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) + msg_list =[] + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY.name, DataTypes.F32)) + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.CONDUCTIVITY_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.RTD_RESISTANCE.name, DataTypes.F32)) + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P9_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) + msg_list.append((self.fp_conductivity, fp_enum_repository.FPConductivitySensorNames.P18_COND.name, dd_enum_repository.DDConductivityResistanceAttributes.UNCOMPENSATED_COND.name, DataTypes.F32)) - self.process_into_vars(dict_to_update = self.fp_conductivity, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.fp_conductivity_timestamp = timestamp @@ -117,19 +140,19 @@ @param message: Published RO Rejection Ratio data message @return: None """ - sensor_list =[] - sensor_list.append((fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO_TANK_FILL.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO_TANK_FILL.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPRORejectionRatioNames.GEN_PERMEATE_STATE.name, DataTypes.U32)) + msg_list =[] + msg_list.append((self.ro_rejection_ratio, fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO.name, DataTypes.F32)) + msg_list.append((self.ro_rejection_ratio, fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO_TANK_FILL.name, DataTypes.F32)) + msg_list.append((self.ro_rejection_ratio, fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO.name, DataTypes.F32)) + msg_list.append((self.ro_rejection_ratio, fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO_TANK_FILL.name, DataTypes.F32)) + msg_list.append((self.ro_rejection_ratio, fp_enum_repository.FPRORejectionRatioNames.GEN_PERMEATE_STATE.name, DataTypes.U32)) - self.process_into_vars(dict_to_update = self.ro_rejection_ratio, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.ro_rejection_ratio_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_conductivity_sensor_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP conductivity sensor data broadcast interval override command Index: leahi_dialin/fp/modules/flow_sensors.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -57,6 +57,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def fp_flows(self) -> dict: + """ + The Flow Sensors data + """ + return self._flows + + @fp_flows.setter + def fp_flows(self, value): + self._flows = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_flow_data", "fp_flows", "fp_flows_timestamp"]) def _handler_flow_sensor_sync(self, message, timestamp=0.0): """ @@ -66,15 +82,15 @@ @returns none """ sensor_list =[] - sensor_list.append((fp_enum_repository.FPFlowSensorNames.P7_FLOW.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPFlowSensorNames.P16_FLOW.name, DataTypes.F32)) + sensor_list.append((self.fp_flows, fp_enum_repository.FPFlowSensorNames.P7_FLOW.name, DataTypes.F32)) + sensor_list.append((self.fp_flows, fp_enum_repository.FPFlowSensorNames.P16_FLOW.name, DataTypes.F32)) - self.process_into_vars(dict_to_update = self.fp_flows, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = sensor_list, message = message) self.fp_flow_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_flow_sensor_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends an FP flow sensor broadcast interval override command message. Index: leahi_dialin/fp/modules/fp_test_configs.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -19,13 +19,14 @@ # Project imports from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.common.test_config_defs import DDFPTestConfigOptions from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem from leahi_dialin.utils.base import publish -from leahi_dialin.utils.conversions import integer_to_bytearray, bytearray_to_integer +from leahi_dialin.utils.conversions import integer_to_bytearray class FPTestConfig(AbstractSubSystem): @@ -48,19 +49,25 @@ function = self._handler_fp_test_config_sync) self.fp_test_configs_response_timestamp = 0.0 #: The timestamp of the last message - self.fp_test_configs = dict() #: The Test Config data in dictionary format + self.fp_test_configs = {} - def cmd_get_test_config_status(self, config: int): - """ - Returns the status of a test config - @param config: (int) Test config to set - @return: the status of a test config +# ============================================================ Properties ============================================================ + @property + def fp_test_configs(self) -> dict: """ - return self.fp_test_configs[DDFPTestConfigOptions(config).name] + The current Test Configs data + """ + return self._test_configs + @fp_test_configs.setter + def fp_test_configs(self, value): + self._test_configs = value + + +# ============================================================ Handlers ============================================================ @publish(['msg_id_fp_send_test_config', 'fp_test_configs', 'fp_test_configs_response_timestamp']) def _handler_fp_test_config_sync(self, message, timestamp=0.0): """ @@ -69,17 +76,29 @@ @param message: published FP test configurations message @return: None """ - payload = message['message'] - index = MsgFieldPositions.START_POS_FIELD_1 + msg_list = [] + for config in DDFPTestConfigOptions: + if config != DDFPTestConfigOptions.NUM_OF_TEST_CONFIGS: + msg_list.append(self.fp_test_configs, config, DataTypes.U08) - for config in DDFPTestConfigOptions.__members__: - if 'NUM_OF_TEST_CONFIGS' not in config.name: - config_value, index = bytearray_to_integer(payload, index, False) - self.fp_test_configs[config.name] = config_value - + self.process_into_vars(decoder_list = msg_list, message = message) self.fp_test_configs_response_timestamp = timestamp + +# ============================================================ Support ============================================================ + def get_test_config_status(self, config: int): + """ + Returns the status of a test config + + @param config: (int) Test config to set + @return: the status of a test config + """ + return self.fp_test_configs[DDFPTestConfigOptions(config).name] + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_set_test_config(self, config: int, reset: int = NO_RESET): """ Constructs and sends the FP test config Index: leahi_dialin/fp/modules/levels.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/levels.py (.../levels.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/levels.py (.../levels.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -25,7 +25,7 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -50,13 +50,27 @@ function = self._handler_levels_sync) self.fp_levels_timestamp = 0 #: The timestamp of the last message - - #: The Level Sensors data in dictionary format self.fp_levels = { - fp_enum_repository.FPFloaterLevelSensorNames.P25_LEVEL.name: 0 + fp_enum_repository.FPFloaterLevelSensorNames.P25_LEVEL.name: fp_enum_repository.FPFloaterLevels.LEVEL_STATE_EMPTY.value } + +# ============================================================ Properties ============================================================ + @property + def fp_levels(self) -> dict: + """ + The Levels data + """ + return self._levels + + @fp_levels.setter + def fp_levels(self, value): + self._levels = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_level_data", "fp_levels", "fp_levels_timestamp"]) @@ -67,15 +81,20 @@ @param message: published levels data message @returns none """ - sensor_list =[] - sensor_list.append((fp_enum_repository.FPFloaterLevelSensorNames.P25_LEVEL.name, DataTypes.U32)) + state = LocalVars('state') - self.process_into_vars(dict_to_update = self.fp_levels, - decoder_list = sensor_list, - message = message) + msg_list =[] + msg_list.append((state, DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert the state to enum + self.fp_levels[fp_enum_repository.FPFloaterLevelSensorNames.P25_LEVEL.name] = fp_enum_repository.FPFloaterLevels(state.value) self.fp_levels_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_levels_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends an FP levels data broadcast interval override command message. Index: leahi_dialin/fp/modules/permeate_tank.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -49,9 +49,25 @@ function = self._handler_permeate_tank_sync) self.permeate_tank_timestamp = 0.0 #: The timestamp of the last message - self.permeate_tank_state = 0 #: The Permeate Tank's State value + self.permeate_tank_state = 0 + +# ============================================================ Properties ============================================================ + @property + def permeate_tank_state(self) -> int: + """ + The Permeate Tank state + """ + return self._permeate_tank_state + + @permeate_tank_state.setter + def permeate_tank_state(self, value): + self._permeate_tank_state = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_permeate_tank_data", "permeate_tank_state", "permeate_tank_timestamp"]) def _handler_permeate_tank_sync(self, message, timestamp=0.0): """ @@ -61,13 +77,14 @@ @return: None """ msg_list =[] - msg_list.append(('self.permeate_tank_state', DataTypes.U32)) + msg_list.append((type(self).permeate_tank_state, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.permeate_tank_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_permeate_tank_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the broadcast time interval override for permeate tank data. Index: leahi_dialin/fp/modules/pressure_sensors.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -49,8 +49,6 @@ function = self._handler_pressure_sync) self.fp_pressure_timestamp = 0.0 #: The timestamp of the last message - - # The Pressure Sensors data in dictionary format self.fp_pressures = { fp_enum_repository.FPPressureSensorNames.M3_PRES.name: 0.0, fp_enum_repository.FPPressureSensorNames.P8_PRES.name: 0.0, @@ -60,6 +58,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def fp_pressures(self) -> dict: + """ + The Pressure Sensors data + """ + return self._pressures + + @fp_pressures.setter + def fp_pressures(self, value): + self._pressures = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_pressures_data", "fp_pressures", "fp_pressure_timestamp"]) def _handler_pressure_sync(self, message, timestamp=0.0): """ @@ -69,19 +83,19 @@ @param message: published FP pressure sensor data message @return: none """ - sensor_list =[] - sensor_list.append((fp_enum_repository.FPPressureSensorNames.M3_PRES.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPPressureSensorNames.P8_PRES.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPPressureSensorNames.P13_PRES.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPPressureSensorNames.P17_PRES.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPPressureSensorNames.P46_PRES.name, DataTypes.F32)) + msg_list =[] + msg_list.append((self.fp_pressures, fp_enum_repository.FPPressureSensorNames.M3_PRES.name, DataTypes.F32)) + msg_list.append((self.fp_pressures, fp_enum_repository.FPPressureSensorNames.P8_PRES.name, DataTypes.F32)) + msg_list.append((self.fp_pressures, fp_enum_repository.FPPressureSensorNames.P13_PRES.name, DataTypes.F32)) + msg_list.append((self.fp_pressures, fp_enum_repository.FPPressureSensorNames.P17_PRES.name, DataTypes.F32)) + msg_list.append((self.fp_pressures, fp_enum_repository.FPPressureSensorNames.P46_PRES.name, DataTypes.F32)) - self.process_into_vars(dict_to_update = self.fp_pressures, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.fp_pressure_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_pressure_sensors_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP pressure data broadcast interval override command. Index: leahi_dialin/fp/modules/ro_pump.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -24,7 +24,7 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -48,8 +48,6 @@ function = self._handler_pump_sync) self.ro_pump_timestamp = 0.0 #: The timestamp of the last message - - # The RO Pump data in dictionary format self.ro_pump = { fp_enum_repository.FPROPumpNames.P12_PUMP.name: { fp_enum_repository.FPPumpAttributes.STATE.name: fp_enum_repository.FPROPumpStates.PUMP_OFF_STATE.value, @@ -65,6 +63,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def ro_pump(self) -> dict: + """ + The RO Pump data + """ + return self._ro_pump + + @ro_pump.setter + def ro_pump(self, value): + self._ro_pump = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_ro_pump_data", "ro_pump", "ro_pump_timestamp" ]) def _handler_pump_sync(self, message, timestamp=0.0): """ @@ -74,23 +88,28 @@ @param message: published FP ro pump data message @return: none """ - sensor_list =[] - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.STATE.name, DataTypes.U32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE.name, DataTypes.U32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE.name, DataTypes.U32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.SPEED.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_PRES.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_FLOW.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_DUTY_CYCLE_PCT.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE_PCT.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE_PCT.name, DataTypes.F32)) + state = LocalVars('state') - self.process_into_vars(dict_to_update = self.ro_pump, - decoder_list = sensor_list, - message = message) + msg_list =[] + msg_list.append((state, DataTypes.U32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE.name, DataTypes.U32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE.name, DataTypes.U32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.SPEED.name, DataTypes.F32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_PRES.name, DataTypes.F32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_FLOW.name, DataTypes.F32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.TARGET_DUTY_CYCLE_PCT.name, DataTypes.F32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.DUTY_CYCLE_PCT.name, DataTypes.F32)) + msg_list.append((self.ro_pump, fp_enum_repository.FPROPumpNames.P12_PUMP.name, fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE_PCT.name, DataTypes.F32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Convert the state to enum + self.ro_pump[fp_enum_repository.FPROPumpNames.P12_PUMP.name][fp_enum_repository.FPPumpAttributes.STATE.name] = fp_enum_repository.FPROPumpStates(state.value) self.ro_pump_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_ro_pump_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP RO pump broadcast interval override command Index: leahi_dialin/fp/modules/temperatures.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -44,8 +44,6 @@ function = self._handler_temperature_sensors_sync) self.fp_temperature_sensors_timestamp = 0 #: The timestamp of the last message - - # The Temperature data in dictionary format self.fp_temperatures = { fp_enum_repository.FPTemperatureSensorNames.M3_TEMP.name: 0.0, fp_enum_repository.FPTemperatureSensorNames.P8_TEMP.name: 0.0, @@ -61,6 +59,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def fp_temperatures(self) -> dict: + """ + The Temperature Sensors data + """ + return self._temperatures + + @fp_temperatures.setter + def fp_temperatures(self, value): + self._temperatures = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_temperature_data", "fp_temperatures", "fp_temperatures_timestamp"]) def _handler_temperature_sensors_sync(self, message,timestamp=0.0): """ @@ -69,25 +83,25 @@ @param message: published FP temperature sensors data message @returns none """ - sensor_list =[] - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.M3_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P8_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P13_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P17_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P46_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P10_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P19_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P7_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P16_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P7_INTERNAL_TEMP.name, DataTypes.F32)) - sensor_list.append((fp_enum_repository.FPTemperatureSensorNames.P16_INTERNAL_TEMP.name, DataTypes.F32)) + msg_list =[] + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.M3_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P8_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P13_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P17_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P46_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P10_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P19_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P7_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P16_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P7_INTERNAL_TEMP.name, DataTypes.F32)) + msg_list.append((self.fp_temperatures, fp_enum_repository.FPTemperatureSensorNames.P16_INTERNAL_TEMP.name, DataTypes.F32)) - self.process_into_vars(dict_to_update = self.fp_temperatures, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.fp_temperature_sensors_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_temperatures_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends broadcast time interval. Index: leahi_dialin/fp/modules/valves.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -15,7 +15,6 @@ ############################################################################ # Module imports -import struct from logging import Logger from collections import OrderedDict @@ -27,26 +26,16 @@ from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray -# Valve states -ENERGIZED = True -DEENERGIZED = False - - class FPValves(AbstractSubSystem): """ Dialin API sub-class for FP valve related commands. """ - # Valves states publish message field positions - START_IO_VALVES_STATES = CanMessage.PAYLOAD_START_INDEX - END_IO_VALVES_STATES = START_IO_VALVES_STATES + 1 # IO Valves States come in as a U08 value (1 byte) - START_FP_VALVES_STATES = END_IO_VALVES_STATES - END_FP_VALVES_STATES = START_FP_VALVES_STATES + 1 # FP Valves States come in as a U08 value (1 byte) def __init__(self, can_interface: CanMessenger, logger: Logger): """ @@ -64,53 +53,42 @@ self.fp_valves_states_timestamp = 0.0 #: The timestamp of the last message self.valve_states_all = 0x0000 #: States of all the vales in binary format self.valves_sensed_states = OrderedDict() #: The Valve's Sensed State data in dictionary format - self.m4_valv = {"id": fp_enum_repository.FPValveNames.M4_VALV.value, "state": DEENERGIZED} #: The M4 valve's value - self.m12_valv = {"id": fp_enum_repository.FPValveNames.M12_VALV.value, "state": DEENERGIZED} #: The M12 valve's value - self.p11_valv = {"id": fp_enum_repository.FPValveNames.P11_VALV.value, "state": DEENERGIZED} #: The P11 valve's value - self.p33_valv = {"id": fp_enum_repository.FPValveNames.P33_VALV.value, "state": DEENERGIZED} #: The P33 valve's value - self.p34_valv = {"id": fp_enum_repository.FPValveNames.P34_VALV.value, "state": DEENERGIZED} #: The P34 valve's value - self.p37_valv = {"id": fp_enum_repository.FPValveNames.P37_VALV.value, "state": DEENERGIZED} #: The P37 valve's value - self.p39_valv = {"id": fp_enum_repository.FPValveNames.P39_VALV.value, "state": DEENERGIZED} #: The P39 valve's value - self.p6_valv = {"id": fp_enum_repository.FPValveNames.P6_VALV.value, "state": DEENERGIZED} #: The P6 valve's value + self.m4_valv = {"id": fp_enum_repository.FPValveNames.M4_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The M4 valve's value + self.m12_valv = {"id": fp_enum_repository.FPValveNames.M12_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The M12 valve's value + self.p11_valv = {"id": fp_enum_repository.FPValveNames.P11_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P11 valve's value + self.p33_valv = {"id": fp_enum_repository.FPValveNames.P33_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P33 valve's value + self.p34_valv = {"id": fp_enum_repository.FPValveNames.P34_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P34 valve's value + self.p37_valv = {"id": fp_enum_repository.FPValveNames.P37_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P37 valve's value + self.p39_valv = {"id": fp_enum_repository.FPValveNames.P39_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P39 valve's value + self.p6_valv = {"id": fp_enum_repository.FPValveNames.P6_VALV.value, "state": fp_enum_repository.FPValveStates.VALVE_STATE_CLOSED.value } #: The P6 valve's value #: States of all the vales in list format self.valve_states_enum = {} for i in range(0, fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value): valve_name = fp_enum_repository.FPValveNames(i).name self.valve_states_enum[valve_name] = 0 self.valves_sensed_states[valve_name] = '' - - - @staticmethod - def sort_by_id(observation): - """ - Converts a published dictionary of valve state information to an ordered list - of tuples. - @param observation: dictionary of the observed valve states - @return: a list of tuples of the valve states - """ - result = [] - for key, value in observation.items(): - if isinstance(value, dict): - result.append((key, value.get("id", None), value.get("state", None))) - result = sorted(result, key=lambda each: each[1]) - return result - - @staticmethod - def _binary_to_valve_state(binary) -> bool: +# ============================================================ Properties ============================================================ + @property + def fp_valves(self) -> dict: """ - @param binary: binary value - @return: 1 = energized, otherwise de-energized + The Valves data """ - if binary != 0: - return ENERGIZED - else: - return DEENERGIZED + return {fp_enum_repository.FPValveNames.M4_VALV.name: self.m4_valv['state'], + fp_enum_repository.FPValveNames.M12_VALV.name: self.m12_valv['state'], + fp_enum_repository.FPValveNames.P11_VALV.name: self.p11_valv['state'], + fp_enum_repository.FPValveNames.P33_VALV.name: self.p33_valv['state'], + fp_enum_repository.FPValveNames.P34_VALV.name: self.p34_valv['state'], + fp_enum_repository.FPValveNames.P37_VALV.name: self.p37_valv['state'], + fp_enum_repository.FPValveNames.P39_VALV.name: self.p39_valv['state'], + fp_enum_repository.FPValveNames.P6_VALV.name: self.p6_valv['state']} + +# ============================================================ Handlers ============================================================ @publish([ "msg_id_fp_valves_states_data", "valve_states_all", @@ -132,37 +110,46 @@ @param message: published FP valves states message @return: none """ + io_valves = LocalVars('io_valves') + fp_valves = LocalVars('fp_valves') + + msg_list = [] + msg_list.append((io_valves, DataTypes.U08)) + msg_list.append((fp_valves, DataTypes.U08)) + + self.process_into_vars(decoder_list = msg_list, message = message) + # Extract each valve state from U08 valves states using bit-masking - io_valves = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_IO_VALVES_STATES:self.END_IO_VALVES_STATES])) - self.m4_valv["state"] = self._binary_to_valve_state(io_valves[0] & 1) - self.m12_valv["state"] = self._binary_to_valve_state(io_valves[0] & 2) + self.m4_valv["state"] = fp_enum_repository.FPValveStates(io_valves.value & 1) + self.m12_valv["state"] = fp_enum_repository.FPValveStates(io_valves.value & 2) self.valve_states_all = io_valves[0] # Extract each valve state from U08 valves states using bit-masking - fp_valves = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][self.START_FP_VALVES_STATES:self.END_FP_VALVES_STATES])) - self.p11_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 1) - self.p33_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 2) - self.p34_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 4) - self.p37_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 8) - self.p39_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 16) - self.p6_valv["state"] = self._binary_to_valve_state(fp_valves[0] & 32) + self.p11_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 1) + self.p33_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 2) + self.p34_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 4) + self.p37_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 8) + self.p39_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 16) + self.p6_valv["state"] = fp_enum_repository.FPValveStates(fp_valves.value & 32) self.valve_states_all += fp_valves[0] << 8 # Updating Valve_states_enum for i in range(0, fp_enum_repository.FPValveNames.NUM_OF_FP_VALVES.value): valve_name = fp_enum_repository.FPValveNames(i).name self.valve_states_enum[valve_name] = eval(f'self.{valve_name.lower()}["state"]') - # Extract each valve sensed state from U08 valves states using bit-masking - start = self.END_FP_VALVES_STATES - end = start + 1 + # Extract each valve sensed state + start = len(msg_list) * DataTypes.U08.size() + msg_list_2 = [] for valve_id in self.valves_sensed_states: - self.valves_sensed_states[valve_id] = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray(message['message'][start:end]))[0] - start = end - end += 1 + msg_list.append((self.valves_sensed_states, valve_id, DataTypes.U08)) + + self.process_into_vars(decoder_list = msg_list_2, message = message, start_from_byte = start) self.fp_valves_states_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_valve_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the FP valve state override command. Index: leahi_dialin/fp/modules/water_pumps.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -43,6 +43,16 @@ # no current registered call back methods + +# ============================================================ Properties ============================================================ + + + +# ============================================================ Handlers ============================================================ + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_pump_set_speed_rate_override(self, pump: int, speed: int, reset: int = NO_RESET) -> int: """ Constructs and sends the boost pump set speed rate command Index: leahi_dialin/fp/proxies/dd_proxy.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/fp/proxies/dd_proxy.py (.../dd_proxy.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/fp/proxies/dd_proxy.py (.../dd_proxy.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -44,6 +44,16 @@ # no current registered call back methods + +# ============================================================ Properties ============================================================ + + + +# ============================================================ Handlers ============================================================ + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_dd_send_ro_start_stop_request(self, cmdID: int = 0, start: bool = 0, ro_rate: float = 0): """ Constructs and sends a DD command request to the FP. Index: leahi_dialin/td/modules/air_pump.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -70,7 +70,7 @@ @property def td_air_pump(self) -> dict: """ - The current Air Pump data + The Air Pump data """ return self._td_air_pump Index: leahi_dialin/td/modules/air_trap.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -83,7 +83,7 @@ @property def air_trap_level_sensors(self) -> dict: """ - The current Air Trap level sensors data + The Air Trap level sensors data """ return self._air_trap_level_sensors @@ -95,7 +95,7 @@ @property def air_trap_valve_states(self) -> dict: """ - The current Air Trap valves data + The Air Trap valves data """ return self._air_trap_valve_states @@ -105,21 +105,21 @@ @property - def air_control(self) -> int: + def air_control(self) -> bool: """ Is the Air Trap FW logic is active or not """ return self._air_control @air_control.setter - def air_control(self, value): + def air_control(self, value:bool): self._air_control = value @property def air_trap_state(self) -> int: """ - The current Air Trap state value + The Air Trap state value """ return self._air_trap_state @@ -131,7 +131,7 @@ @property def air_pump_lower_power(self) -> dict: """ - The current Air Pump lower power value + The Air Pump lower power value """ return self._air_pump_lower_power @@ -143,7 +143,7 @@ @property def air_pump_raise_power(self) -> dict: """ - The current Air Pump raise power value + The Air Pump raise power value """ return self._air_pump_raise_power @@ -174,7 +174,7 @@ msg_list.append((self.air_trap_level_sensors, td_enum_repository.TDAirPumpNames.H16_LEVEL.name, td_enum_repository.TDAirPumpAttributes.RAW.name, DataTypes.U32)) msg_list.append((self.air_trap_valve_states, td_enum_repository.TDAirPumpNames.H13_VALV.name, DataTypes.U32)) msg_list.append((self.air_trap_valve_states, td_enum_repository.TDAirPumpNames.H20_VALV.name, DataTypes.U32)) - msg_list.append((type(self).air_control, DataTypes.U32)) + msg_list.append((type(self).air_control, DataTypes.BOOL)) msg_list.append((type(self).airTrapState, DataTypes.U32)) msg_list.append((type(self).AirPumpLowerPowerLevel, DataTypes.U32)) msg_list.append((type(self).AirPumpRaisePowerLevel, DataTypes.U32)) Index: leahi_dialin/td/modules/alarms.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -17,12 +17,13 @@ # Module imports from functools import partial from logging import Logger -from typing import List +from typing import List, Union # Project imports from leahi_dialin.common import td_enum_repository, AlarmList from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes +from leahi_dialin.common.msg_defs import RequestRejectReasons from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -109,25 +110,15 @@ # Alarms list self.ui_alarm_list_accepted = True - self.ui_alarm_list_reject_reason = 0 + self.ui_alarm_list_reject_reason = RequestRejectReasons.REQUEST_REJECT_REASON_NONE self.ui_alarm_list = [] self.ui_alarm_list_timestamp = 0.0 #: The timestamp of the last Alarm List # Alarm Table Properties self.alarm_table = {} - def clear_dialin_alarms(self): - """ - Clears the alarms states in Dialin. - @return: none - """ - for x in range(500): - self.alarm_states[x] = False - - - # ============================================================ Properties ============================================================ @property def alarms_priority_state(self) -> int: @@ -286,14 +277,16 @@ @property - def ui_alarm_list_reject_reason(self) -> int: + def ui_alarm_list_reject_reason(self) -> RequestRejectReasons: """ The UI Alarm List request reject reason """ return self._ui_alarm_list_reject_reason @ui_alarm_list_reject_reason.setter - def ui_alarm_list_reject_reason(self, value): + def ui_alarm_list_reject_reason(self, value: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._ui_alarm_list_reject_reason = RequestRejectReasons(value) self._ui_alarm_list_reject_reason = value @@ -364,7 +357,6 @@ rank = LocalVars('rank') clr_top_only = LocalVars('clr_top_only') - result = {} msg_list = [] msg_list.append((alarm_id, DataTypes.U32)) msg_list.append((data_typ_1, DataTypes.U32)) @@ -548,6 +540,30 @@ +# ============================================================ Support ============================================================ + def clear_dialin_alarms(self): + """ + Clears the alarms states in Dialin. + + @return: none + """ + for x in range(self.alarm_states): + self.alarm_states[x] = False + + + def get_dialin_alarms(self): + """ + Get the active alarms in Dialin. + + @return: none + """ + active_alarms = [] + for x in range(self.alarm_states): + if self.alarm_states[x]: + active_alarms.append(AlarmList(x)) + return active_alarms + + # ============================================================ Overrides and Requests ============================================================ def cmd_alarm_status_broadcast_interval_override(self, ms: int = 250, reset: int = NO_RESET): """ Index: leahi_dialin/td/modules/blood_flow.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -67,7 +67,7 @@ @property def h4_motor(self) -> dict: """ - The current Blood Flow data + The Blood Flow data """ return self._h4_motor Index: leahi_dialin/td/modules/blood_pressure.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/blood_pressure.py (.../blood_pressure.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/blood_pressure.py (.../blood_pressure.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -16,6 +16,7 @@ # Module imports from logging import Logger +from typing import Union # Project imports from leahi_dialin.common.generic_defs import DataTypes @@ -81,8 +82,11 @@ return self._reject_reason @reject_reason.setter - def reject_reason(self, value): - self._reject_reason = value + def reject_reason(self, value: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._reject_reason = RequestRejectReasons(value) + else: + self._reject_reason = value @property @@ -153,7 +157,6 @@ msg_list.append((type(self).reject_reason, DataTypes.U32)) self.process_into_vars(decoder_list = msg_list, message = message) - self.reject_reason = RequestRejectReasons(self.reject_reason) self.rr_timestamp = timestamp Index: leahi_dialin/td/modules/bubble_detector.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -76,7 +76,7 @@ @property def h18_bubble_detector(self) -> dict: """ - The current Bubble Detector data + The Bubble Detector data """ return self._h18_bubble_detector Index: leahi_dialin/td/modules/ejector.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -66,7 +66,7 @@ @property def h5_motor(self) -> dict: """ - The current Ejector data + The Ejector data """ return self._h5_motor Index: leahi_dialin/td/modules/pressure_sensors.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -82,7 +82,7 @@ @property def td_pressure_sensors(self) -> dict: """ - The current Pressure data + The Pressure Sensors data """ return self._pressure_sensors Index: leahi_dialin/td/modules/switches.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/switches.py (.../switches.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/switches.py (.../switches.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -58,7 +58,7 @@ @property def td_switches_status(self) -> dict: """ - The current Switches data + The Switches data """ return self._switches Index: leahi_dialin/td/modules/syringe_pump.py =================================================================== diff -u -r28a21f1f2ca4ef02e6d54bae30b738fddb7bdb3a -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/syringe_pump.py (.../syringe_pump.py) (revision 28a21f1f2ca4ef02e6d54bae30b738fddb7bdb3a) +++ leahi_dialin/td/modules/syringe_pump.py (.../syringe_pump.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -16,6 +16,7 @@ # Module imports from logging import Logger +from typing import Union # Project imports from leahi_dialin.common.constants import RESET, NO_RESET @@ -25,6 +26,7 @@ from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils import DialinEnum from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -49,8 +51,8 @@ message_id = MsgIds.MSG_ID_TD_SYRINGE_PUMP_DATA.value, function = self._handler_syringe_pump_data) - self.syringe_pump_state = TDTreaSyringePumpStates.SYRINGE_PUMP_INIT_STATE.value - self.heparin_state = TDTreaHeparinStates.HEPARIN_STATE_OFF.value + self.syringe_pump_state = TDTreaSyringePumpStates.SYRINGE_PUMP_INIT_STATE + self.heparin_state = TDTreaHeparinStates.HEPARIN_STATE_OFF self.syringe_pump_set_rate_ml_hr = 0.0 self.syringe_pump_meas_rate_ml_hr = 0.0 self.syringe_pump_position = 0 @@ -59,7 +61,7 @@ self.syringe_pump_home_v = 0.0 self.syringe_pump_switch_v = 0.0 self.syringe_pump_force_v = 0.0 - self.syringe_pump_status = 0 + self.syringe_pump_status = TDSyringePumpStates.SYRINGE_PUMP_OP_STOP self.syringe_pump_encoder_status = 0 self.syringe_pump_adc_dac_status = 0 self.syringe_pump_adc_read_counter = 0 @@ -69,33 +71,39 @@ # ============================================================ Properties ============================================================ @property - def syringe_pump_state(self) -> int: + def syringe_pump_state(self) -> TDTreaSyringePumpStates: """ - The current Srynge Pump State + The Srynge Pump State """ return self._syringe_pump_state @syringe_pump_state.setter - def syringe_pump_state(self, value): - self._syringe_pump_state = value + def syringe_pump_state(self, value: Union[int, DialinEnum]): + if isinstance(value, int): + self._syringe_pump_state = TDTreaSyringePumpStates(value) + else: + self._syringe_pump_state = value @property - def heparin_state(self) -> int: + def heparin_state(self) -> TDTreaHeparinStates: """ - The current Heparin State + The Heparin State """ return self._heparin_state @heparin_state.setter - def heparin_state(self, value): - self._heparin_state = value + def heparin_state(self, value: Union[int, DialinEnum]): + if isinstance(value, int): + self._heparin_state = TDTreaHeparinStates(value) + else: + self._heparin_state = value @property def syringe_pump_set_rate_ml_hr(self) -> float: """ - The current Set Syringe Pump rate + The Set Syringe Pump rate """ return self._syringe_pump_set_rate_ml_hr @@ -107,7 +115,7 @@ @property def syringe_pump_meas_rate_ml_hr(self) -> float: """ - The current Measured Syringe Pump rate + The Measured Syringe Pump rate """ return self._syringe_pump_meas_rate_ml_hr @@ -119,7 +127,7 @@ @property def syringe_pump_position(self) -> int: """ - The current Syringe Pump position + The Syringe Pump position """ return self._syringe_pump_position @@ -131,7 +139,7 @@ @property def syringe_pump_volume_ml(self) -> float: """ - The current Syringe Pump volume delivered in ml + The Syringe Pump volume delivered in ml """ return self._syringe_pump_volume_ml @@ -143,7 +151,7 @@ @property def syringe_pump_safety_volume_ml(self) -> float: """ - The current Syringe Pump safety volume reading + The Syringe Pump safety volume reading """ return self._syringe_pump_safety_volume_ml @@ -155,7 +163,7 @@ @property def syringe_pump_home_v(self) -> float: """ - The current Syringe Pump home voltage reading + The Syringe Pump home voltage reading """ return self._syringe_pump_home_v @@ -167,7 +175,7 @@ @property def syringe_pump_switch_v(self) -> float: """ - The current Syringe Pump switch voltage reading + The Syringe Pump switch voltage reading """ return self._syringe_pump_switch_v @@ -179,7 +187,7 @@ @property def syringe_pump_force_v(self) -> float: """ - The current Syringe Pump force voltage reading + The Syringe Pump force voltage reading """ return self._syringe_pump_force_v @@ -189,21 +197,24 @@ @property - def syringe_pump_status(self) -> int: + def syringe_pump_status(self) -> TDSyringePumpStates: """ - The current Syringe Pump status + The Syringe Pump status """ return self._syringe_pump_status @syringe_pump_status.setter - def syringe_pump_status(self, value): - self._syringe_pump_status = value + def syringe_pump_status(self, value: Union[int, DialinEnum]): + if isinstance(value, int): + self._syringe_pump_status = TDSyringePumpStates(value) + else: + self._syringe_pump_status = value @property def syringe_pump_encoder_status(self) -> int: """ - The current Syringe Pump encoder status + The Syringe Pump encoder status """ return self._syringe_pump_encoder_status @@ -215,7 +226,7 @@ @property def syringe_pump_adc_dac_status(self) -> int: """ - The current Syringe Pump ADC & DAC status + The Syringe Pump ADC & DAC status """ return self._syringe_pump_adc_dac_status @@ -227,7 +238,7 @@ @property def syringe_pump_adc_read_counter(self) -> int: """ - The current Syringe Pump ADC read counter + The Syringe Pump ADC read counter """ return self._syringe_pump_adc_read_counter Index: leahi_dialin/td/modules/td_test_configs.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/td_test_configs.py (.../td_test_configs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/td_test_configs.py (.../td_test_configs.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -18,14 +18,15 @@ from logging import Logger # Project imports -from leahi_dialin.common.constants import NO_RESET, MSG_HEADER_SIZE +from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.common.test_config_defs import TDTestConfigOptions from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem from leahi_dialin.utils.base import publish -from leahi_dialin.utils.conversions import integer_to_bytearray, bytearray_to_integer +from leahi_dialin.utils.conversions import integer_to_bytearray class TDTestConfig(AbstractSubSystem): @@ -75,19 +76,18 @@ @param message: published TD test configurations message @return: None """ - payload = message['message'] - index = MSG_HEADER_SIZE - + msg_list = [] for config in TDTestConfigOptions: if config != TDTestConfigOptions.NUM_OF_TEST_CONFIGS: - config_value, index = bytearray_to_integer(payload, index, False) # The return value is the incremented index - self.td_test_configs[config] = config_value + msg_list.append(self.fp_test_configs, config, DataTypes.U08) + + self.process_into_vars(decoder_list = msg_list, message = message) self.td_test_configs_response_timestamp = timestamp # ============================================================ Support ============================================================ - def cmd_get_test_config_status(self, config: int): + def get_test_config_status(self, config: int): """ Returns the status of a test config Index: leahi_dialin/td/modules/temperature_sensors.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/temperature_sensors.py (.../temperature_sensors.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -58,7 +58,7 @@ @property def td_temperatures_status(self) -> dict: """ - The current Temperatures data + The Temperature Sensors data """ return self._temperatures Index: leahi_dialin/td/modules/valves.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/valves.py (.../valves.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/valves.py (.../valves.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -61,7 +61,7 @@ @property def valves_status(self) -> dict: """ - The current Valves data + The Valves data """ return self._valves Index: leahi_dialin/td/modules/voltages.py =================================================================== diff -u -r3f4937e339925dde0b95f08e49969f8983c5cba4 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) +++ leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -56,14 +56,14 @@ # ============================================================ Properties ============================================================ @property - def monitored_voltages(self) -> List[int]: + def monitored_voltages(self) -> List[float]: """ - The current Voltages data + The Voltages data """ return self._monitored_voltages @monitored_voltages.setter - def monitored_voltages(self, value): + def monitored_voltages(self, value: float): self._monitored_voltages = value Index: leahi_dialin/td/proxies/ui_proxy.py =================================================================== diff -u -r4bbcf07a714e5b38fb117023694cb0be0bd3815d -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 4bbcf07a714e5b38fb117023694cb0be0bd3815d) +++ leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -16,11 +16,10 @@ # Module imports from logging import Logger +from typing import List, Union # Project imports -from leahi_dialin.common import td_enum_repository from leahi_dialin.common.constants import ACCEPTED -from leahi_dialin.common.disp_defs_proxy import disp_enum_repository from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.msg_defs import RequestRejectReasons @@ -66,48 +65,175 @@ function = self._handler_uf_pause_resp_sync) # MSG_ID_TD_RESP_TREATMENT_PARAMS_TO_VALIDATE - self.tx_params_treatment_modality = td_enum_repository.TDTreatmentModalityTypes.HD.value - self.tx_params_hdf_dilution = td_enum_repository.TDTreatmentHDFDilution.HDF_NOT_APPLICABLE.value - self.tx_params_blood_flow_rate = 0 - self.tx_params_dialysate_flow_rate = 0 - self.tx_params_tx_duration = 0 - self.tx_params_heparin_duration = 0 - self.tx_params_heparin_type = disp_enum_repository.HeparinTypes.HEPARIN_TYPE_FRESENIUS_CENTRISOL.value - self.tx_params_dry_bicarb_cart_size = 0 - self.tx_params_sodium = 0 - self.tx_params_bicarb_concentrate = disp_enum_repository.BicarbTypes.BICARB_08_677753_0.value - self.tx_params_dialyzer_type = disp_enum_repository.DialyzerTypes.DIALYZER_TYPE_BBRAUN_PRO_13H.value - self.tx_params_fluid_bolus_volume = 0 - self.tx_params_bp_interval = 0 - self.tx_params_rinseback_volume = 0 - self.tx_params_hepatitis_b_status = td_enum_repository.TDTreaHeparinStates.HEPARIN_STATE_OFF.value - self.tx_params_acid_concentrate = disp_enum_repository.AcidTypes.ACID_08_1251_1.value - self.tx_params_subst_fluid_volume = 0.0 - self.tx_params_heparin_bolus_volume = 0.0 - self.tx_params_heparin_delivery_rate = 0.0 - self.tx_params_dialysate_temperature = 0.0 - self.tx_params_uf_pre_weight = 0.0 - self.tx_params_uf_est_target_weight = 0.0 - self.tx_params_uf_volume = 0.0 - self.tx_params_validate_timestamp = 0 + self.tx_param_ack = False + self.tx_param_reject_reason = { + 'treatment_modality': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'hdf_dilution': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'blood_flow_rate': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'dialysate_flow_rate': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'tx_duration': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'heparin_duration': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'heparin_type': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'dry_bicarb_cart_size': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'sodium': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'bicarb_concentrate': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'dialyzer_type': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'fluid_bolus_volume': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'bp_interval': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'rinseback_volume': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'hepatitis_b_status': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'acid_concentrate': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'subst_fluid_volume': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'heparin_bolus_volume': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'heparin_delivery_rate': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'dialysate_temperature': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'uf_pre_weight': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'uf_est_target_weight': RequestRejectReasons.REQUEST_REJECT_REASON_NONE, + 'uf_volume': RequestRejectReasons.REQUEST_REJECT_REASON_NONE + } + self.tx_params_validate_timestamp = 0 #: The timestamp of the latest treatment parameters validate response message # MSG_ID_TD_RESP_ULTRAFILTRATION_VOLUME_TO_VALIDATE - self.uf_volume_acceptance = 0 - self.uf_volume_rr = 0 + self.uf_volume_ack = False + self.uf_volume_reject_reason = RequestRejectReasons.REQUEST_REJECT_REASON_NONE self.uf_volume_ml = 0.0 - self.uf_volume_timestamp = 0 + self.uf_volume_timestamp = 0 #: The timestamp of the latest ultrafiltration validate response message # MSG_ID_TD_RESP_INITIATE_TREATMENT_WORKFLOW - self.initiate_tx_acceptance = 0 - self.initiate_tx_rr = 0 - self.initiate_tx_timestamp = 0 + self.initiate_tx_ack = False + self.initiate_tx_reject_reason = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.initiate_tx_timestamp = 0 #: The timestamp of the latest initiate treatment reponse message # MSG_ID_TD_UF_PAUSE_RESUME_RESPONSE - self.uf_pause_resume_acceptance = 0 - self.uf_pause_resume_rr = 0 - self.uf_pause_resume_timestamp = 0 + self.uf_pause_resume_ack = False + self.uf_pause_resume_reject_reason = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.uf_pause_resume_timestamp = 0 #: The timestamp of the latest pause ultrafiltration response message + +# ============================================================ Properties ============================================================ + @property + def tx_param_ack(self) -> bool: + """ + The Treatment Parameter Validate message's Ack data + """ + return self._tx_param_ack + + @tx_param_ack.setter + def tx_param_ack(self, value: bool): + self._tx_param_ack = value + + + @property + def tx_param_reject_reason(self) -> dict: + """ + The Treatment Parameter Validate Reject Reasons data + """ + return self._tx_param_reject_reason + + @tx_param_reject_reason.setter + def tx_param_reject_reason(self, value: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._tx_param_reject_reason = RequestRejectReasons(value) + else: + self._tx_param_reject_reason = value + + + @property + def uf_volume_ack(self) -> bool: + """ + The Ultrafiltration Validate message's Ack data + """ + return self._uf_volume_ack + + @uf_volume_ack.setter + def uf_volume_ack(self, value: bool): + self._uf_volume_ack = value + + + @property + def uf_volume_reject_reason(self) -> RequestRejectReasons: + """ + The Ultrafiltration Validate Reject Reasons data + """ + return self._uf_volume_reject_reason + + @uf_volume_reject_reason.setter + def uf_volume_reject_reason(self, value: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._uf_volume_reject_reason = RequestRejectReasons(value) + else: + self._uf_volume_reject_reason = value + + + @property + def uf_volume_ml(self) -> float: + """ + The Ultrafiltration Volume (mL) data + """ + return self._uf_volume_ml + + @uf_volume_ml.setter + def uf_volume_ml(self, value: float): + self._uf_volume_ml = value + + + @property + def initiate_tx_ack(self) -> bool: + """ + The Initiate Treatment message's Ack data + """ + return self._initiate_tx_ack + + @initiate_tx_ack.setter + def initiate_tx_ack(self, value: bool): + self._initiate_tx_ack = value + + + @property + def initiate_tx_reject_reason(self) -> RequestRejectReasons: + """ + The Initiate Treatment Reject Reasons data + """ + return self._initiate_tx_reject_reason + + @initiate_tx_reject_reason.setter + def initiate_tx_reject_reason(self, value: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._initiate_tx_reject_reason = RequestRejectReasons(value) + else: + self._initiate_tx_reject_reason = value + + + @property + def uf_pause_resume_ack(self) -> bool: + """ + The Pause Ultrafiltration message's Ack data + """ + return self._uf_pause_resume_ack + + @uf_pause_resume_ack.setter + def uf_pause_resume_ack(self, value: bool): + self._uf_pause_resume_ack = value + + + @property + def uf_pause_resume_reject_reason(self) -> RequestRejectReasons: + """ + The Pause Ultrafiltration Reject Reasons data + """ + return self._uf_pause_resume_reject_reason + + @uf_pause_resume_reject_reason.setter + def uf_pause_resume_reject_reason(self, value: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._uf_pause_resume_reject_reason = RequestRejectReasons(value) + else: + self._uf_pause_resume_reject_reason = value + + + +# ============================================================ Handlers ============================================================ def _handler_tx_parameters_val_resp_sync(self, message: dict, timestamp=0.0) -> None: """ Handles treatment parameters validation response from the TD. Treatment parameters acceptance and rejection @@ -118,32 +244,32 @@ :return: none """ msg_list = [] - msg_list.append(('self.tx_params_treatment_modality', DataTypes.U32)) - msg_list.append(('self.tx_params_hdf_dilution', DataTypes.U32)) - msg_list.append(('self.tx_params_blood_flow_rate', DataTypes.U32)) - msg_list.append(('self.tx_params_dialysate_flow_rate', DataTypes.U32)) - msg_list.append(('self.tx_params_tx_duration', DataTypes.U32)) - msg_list.append(('self.tx_params_heparin_duration', DataTypes.U32)) - msg_list.append(('self.tx_params_heparin_type', DataTypes.U32)) - msg_list.append(('self.tx_params_dry_bicarb_cart_size', DataTypes.U32)) - msg_list.append(('self.tx_params_sodium', DataTypes.U32)) - msg_list.append(('self.tx_params_bicarb_concentrate', DataTypes.U32)) - msg_list.append(('self.tx_params_dialyzer_type', DataTypes.U32)) - msg_list.append(('self.tx_params_fluid_bolus_volume', DataTypes.U32)) - msg_list.append(('self.tx_params_bp_interval', DataTypes.U32)) - msg_list.append(('self.tx_params_rinseback_volume', DataTypes.U32)) - msg_list.append(('self.tx_params_hepatitis_b_status', DataTypes.U32)) - msg_list.append(('self.tx_params_acid_concentrate', DataTypes.U32)) - msg_list.append(('self.tx_params_subst_fluid_volume', DataTypes.F32)) - msg_list.append(('self.tx_params_heparin_bolus_volume', DataTypes.F32)) - msg_list.append(('self.tx_params_heparin_delivery_rate', DataTypes.F32)) - msg_list.append(('self.tx_params_dialysate_temperature', DataTypes.F32)) - msg_list.append(('self.tx_params_uf_pre_weight', DataTypes.F32)) - msg_list.append(('self.tx_params_uf_est_target_weight', DataTypes.F32)) - msg_list.append(('self.tx_params_uf_volume', DataTypes.F32)) + msg_list.append((type(self).tx_param_ack, DataTypes.BOOL)) + msg_list.append((self.tx_param_reject_reason, 'treatment_modality', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'hdf_dilution', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'blood_flow_rate', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'dialysate_flow_rate', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'tx_duration', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'heparin_duration', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'heparin_type', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'dry_bicarb_cart_size', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'sodium', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'bicarb_concentrate', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'dialyzer_type', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'fluid_bolus_volume', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'bp_interval', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'rinseback_volume', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'hepatitis_b_status', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'acid_concentrate', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'subst_fluid_volume', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'heparin_bolus_volume', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'heparin_delivery_rate', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'dialysate_temperature', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'uf_pre_weight', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'uf_est_target_weight', DataTypes.U32)) + msg_list.append((self.tx_param_reject_reason, 'uf_volume', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.tx_params_validate_timestamp = timestamp @@ -157,12 +283,11 @@ :return: none """ msg_list = [] - msg_list.append(('self.uf_volume_acceptance', DataTypes.U32)) - msg_list.append(('self.uf_volume_rr', DataTypes.U32)) - msg_list.append(('self.uf_volume_ml', DataTypes.F32)) + msg_list.append((type(self).uf_pause_resume_ack, DataTypes.BOOL)) + msg_list.append((type(self).uf_pause_resume_reject_reason, DataTypes.U32)) + msg_list.append((type(self).uf_volume_ml, DataTypes.F32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.uf_volume_timestamp = timestamp @@ -176,11 +301,10 @@ :return: none """ msg_list = [] - msg_list.append(('self.initiate_tx_acceptance', DataTypes.U32)) - msg_list.append(('self.initiate_tx_rr', DataTypes.U32)) + msg_list.append((type(self).initiate_tx_ack, DataTypes.BOOL)) + msg_list.append((type(self).initiate_tx_reject_reason, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.initiate_tx_timestamp = timestamp @@ -194,14 +318,15 @@ :return: none """ msg_list = [] - msg_list.append(('self.uf_pause_resume_acceptance', DataTypes.U32)) - msg_list.append(('self.uf_pause_resume_rr', DataTypes.U32)) + msg_list.append((type(self).uf_pause_resume_ack, DataTypes.BOOL)) + msg_list.append((type(self).uf_pause_resume_reject_reason, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, bmessage = message) self.uf_pause_resume_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_send_ui_treatment_param_data(self, final_confirmation: int, treatment_modality: int, Index: leahi_dialin/td/treatment_delivery.py =================================================================== diff -u -r4c11f61e1e328407ed98a1b81a3e8b0adb278bd5 -rba415df9f8e76d6b0f21e8f69ba99346e42f7b09 --- leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 4c11f61e1e328407ed98a1b81a3e8b0adb278bd5) +++ leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision ba415df9f8e76d6b0f21e8f69ba99346e42f7b09) @@ -186,7 +186,7 @@ @property - def td_version(self) -> int: + def td_version(self) -> str: """ The TD Version data """ @@ -198,7 +198,7 @@ @property - def td_fpga_version(self) -> int: + def td_fpga_version(self) -> str: """ The TD FPGA Version data """ @@ -334,18 +334,6 @@ -# ============================================================ Support ============================================================ - def td_set_logged_in_status(self, logged_in: bool = False): - """ - Callback for td logged in status change. - - @param logged_in: Logged in status for TD - @return: None - """ - self.td_logged_in = logged_in - - - # ============================================================ Overrides and Requests ============================================================ def cmd_op_mode_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ @@ -388,7 +376,6 @@ if received_message is not None: if received_message['message'][CanMessage.PAYLOAD_START_INDEX] == 1: self.logger.debug("Success: Logged In") - self.td_set_logged_in_status(True) #self._send_td_checkin_message() # Timer starts interval first #self.can_interface.transmit_interval_dictionary[self.callback_id].start() else: