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