Index: .gitignore =================================================================== diff -u -rc3153b8411388a9318d827ae42e830627cebc220 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- .gitignore (.../.gitignore) (revision c3153b8411388a9318d827ae42e830627cebc220) +++ .gitignore (.../.gitignore) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -10,6 +10,7 @@ squishtesting *.pyc *.*~ +/leahi*common # Docs docs/build Index: leahi_dialin/common/td_defs_proxy.py =================================================================== diff -u -rdff2704b529bfbb67b2e8c822e69e3df7d955153 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/common/td_defs_proxy.py (.../td_defs_proxy.py) (revision dff2704b529bfbb67b2e8c822e69e3df7d955153) +++ leahi_dialin/common/td_defs_proxy.py (.../td_defs_proxy.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -98,7 +98,10 @@ TDTreatmentHDFDilution = td_defs.TDTreatmentHDFDilution # Alarms + AlarmLampPatterns = generic_defs.AlarmLampPatterns + AlarmPriorities = generic_defs.AlarmPriorities AlarmProperties = generic_defs.AlarmProperties + AlarmResponseButtons = generic_defs.AlarmResponseButtons # Records RecordTypes = generic_defs.RecordTypes Index: leahi_dialin/dd/modules/alarms.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -22,11 +22,10 @@ from leahi_dialin.common.alarm_defs import AlarmList from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgFieldPositions 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 @@ -52,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 @@ -73,6 +70,12 @@ self.handler_info_execution_times = [] + +# ============================================================ 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): @@ -83,177 +86,68 @@ @return: none """ start = time.perf_counter() - 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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) - @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 - """ - 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 +# ============================================================ Support ============================================================ + def clear_dialin_alarms(self): - - @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. + Clears the alarms states in Dialin. - @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 -rcb6c96886e5312796a48df6b1ec99329eb3fcee3 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/balancing_chamber.py (.../balancing_chamber.py) (revision cb6c96886e5312796a48df6b1ec99329eb3fcee3) +++ leahi_dialin/dd/modules/balancing_chamber.py (.../balancing_chamber.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -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 self.handler_execution_times = [] +# ============================================================ 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", @@ -76,21 +174,21 @@ """ start = time.perf_counter() 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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -18,11 +18,12 @@ from logging import Logger from enum import unique import time +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_defs import MsgFieldPositions 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 @@ -55,10 +56,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 @@ -78,7 +75,7 @@ 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_status = 0 #: 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 @@ -96,40 +93,145 @@ self.blood_leak_emb_mode_cmds[cmd] = '' - def get_blood_leak_status(self): + +# ============================================================ Properties ============================================================ + @property + def blood_leak_status(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_status.setter + def blood_leak_status(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', @@ -146,19 +248,18 @@ """ start = time.perf_counter() 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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) @@ -176,7 +277,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) @@ -189,6 +290,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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -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, float_to_bytearray @@ -50,8 +50,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, @@ -91,6 +89,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -101,41 +115,49 @@ @return: None """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -61,10 +61,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, @@ -98,9 +94,28 @@ }, } + 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 self.handler_cond_execution_times = [] self.handler_resist_execution_times = [] + + +# ============================================================ 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): """ @@ -111,34 +126,33 @@ @return: None """ start = time.perf_counter() - 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_dict(dict_to_update = self.dd_conductivity, - decoder_list = sensor_list, - message = message) - self.dd_conductivity_resistance_timestamp = timestamp + self.process_into_vars(decoder_list = msg_list, message = message) + self.dd_conductivity_timestamp = timestamp self.handler_resist_execution_times.append((timestamp, message, time.perf_counter() - start)) + @publish(["msg_id_dd_conductivity_version_data", "dd_conductivity_resistance", "dd_conductivity_version_timestamp"]) def _handler_conductivity_version_sync(self, message, timestamp=0.0): """ @@ -149,6 +163,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): """ @@ -159,6 +174,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 @@ -388,4 +406,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/dialysate_pump.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -52,8 +52,6 @@ function = self._handler_dialysate_pumps_sync) self.dd_dialysate_pump_timestamp = 0 #: The timestamp of the latest message - - #: The Dialysate Pumps data in dictionary format self.dd_dialysate_pumps = { dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name: { dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name: 0.0, @@ -83,6 +81,22 @@ self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def dd_dialysate_pumps(self) -> dict: + """ + The Dialysate Pumps data + """ + return self._dialysate_pumps + + @dd_dialysate_pumps.setter + def dd_dialysate_pumps(self, value): + self._dialysate_pumps = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_dialysate_pumps_data", "dd_dialysate_pumps", "dd_dialysate_pump_timestamp",]) def _handler_dialysate_pumps_sync(self, message, timestamp=0.0): """ @@ -93,35 +107,35 @@ @return: None """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.STATE.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.STATE.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name, DataTypes.U32)) + msg_list =[] + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.STATE.name, DataTypes.U32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.STATE.name, DataTypes.U32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name, DataTypes.F32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name, DataTypes.U32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name, DataTypes.U32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name, DataTypes.U32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name, DataTypes.U32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name, DataTypes.U32)) + msg_list.append((self.dd_dialysate_pumps, dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name, dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.dd_dialysate_pumps, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_dialysate_pump_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_dialysate_pump_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the dialysate pump data broadcast interval override command Index: leahi_dialin/dd/modules/drybicart.py =================================================================== diff -u -r034ef9887584984c3f261bfb748aa70994b9751b -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/drybicart.py (.../drybicart.py) (revision 034ef9887584984c3f261bfb748aa70994b9751b) +++ leahi_dialin/dd/modules/drybicart.py (.../drybicart.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,17 +17,19 @@ # Module imports from logging import Logger import time +from typing import Union # Project imports from leahi_dialin.common.constants import NO_RESET , RESET +from leahi_dialin.common.dd_defs import DDBicarbChFillExecStates, DDDryBicartDrainExecStates, DDDryBicartFillExecStates +from leahi_dialin.common.disp_defs import BicarbTypes from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from dataclasses import dataclass 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, float_to_bytearray +from leahi_dialin.utils.conversions import integer_to_bytearray class DDDryBicart(AbstractSubSystem): @@ -53,27 +55,185 @@ function = self._handler_dry_bicart_sync) self.dd_dry_bicart_timestamp = 0.0 #: The timestamp of the last message - self.dd_dry_bicart_fill_execution_state = 0 #: The Dry Bicart fill execution state - self.dd_bicarb_chamber_fill_execution_state = 0 #: The Bicarb chamber fill execution state - self.dd_dry_bicart_drain_execution_state = 0 #: The Dry Bicart drain execution state - self.dd_dry_bicart_fill_cycle_counter = 0 #: The Dry Bicart fill cycle counter - self.dd_dry_bicart_max_fill_cycle_count = 0 #: The Dry Bicart max fill cycle state - self.dd_dry_bicart_fill_request = 0 #: Is fill requested for Dry Bicart or not - self.dd_bicarb_chamber_fill_request = 0 #: Is fill requested for Bicarb Chamber or not - self.dd_dry_bicart_drain_request = 0 #: Is drain requested for Dry Bicart or not - self.dd_dry_bicart_last_fill_time = 0 #: The Dry Bicart last fill time - self.dd_dry_bicart_current_fill_time = 0 #: The Dry Bicart current fill time - self.dd_dryBiCartType = 0 #: The Dry Bicart concentrate option index - self.dd_dryBiCartDrainTimePeriod = 0 #: The Dry Bicart drain time period in sec - self.dd_dry_bicart_timestamp = 0 #: The timestamp of the last message - + self.dd_dry_bicart_fill_execution_state = DDDryBicartFillExecStates.NUM_OF_DRY_BICART_FILL_EXEC_STATES + self.dd_bicarb_chamber_fill_execution_state = DDBicarbChFillExecStates.NUM_OF_BICARB_CHAMBER_FILL_EXEC_STATES + self.dd_dry_bicart_drain_execution_state = DDDryBicartDrainExecStates.NUM_OF_DRY_BICART_DRAIN_EXEC_STATES + self.dd_dry_bicart_fill_cycle_counter = 0 + self.dd_dry_bicart_max_fill_cycle_count = 0 + self.dd_dry_bicart_fill_request = False + self.dd_dry_bicart_drain_request = False + self.dd_bicarb_chamber_fill_request = False + self.dd_dry_bicart_last_fill_time = 0 + self.dd_dry_bicart_current_fill_time = 0 + self.dry_bicart_type = BicarbTypes.NUM_OF_BICARB_TYPES + self.dry_bicart_drain_time_period = 0 self.handler_execution_times = [] + + +# ============================================================ Properties ============================================================ + @property + def dd_dry_bicart_fill_execution_state(self) -> DDDryBicartFillExecStates: + """ + The Dry Bicart fill execution state + """ + return self._dry_bicart_fill_execution_state + + @dd_dry_bicart_fill_execution_state.setter + def dd_dry_bicart_fill_execution_state(self, value: Union[int, DDDryBicartFillExecStates]): + if isinstance(value, int): + self._dry_bicart_fill_execution_state = DDDryBicartFillExecStates(value) + else: + self._dry_bicart_fill_execution_state = value + + + @property + def dd_dry_bicart_drain_execution_state(self) -> DDDryBicartDrainExecStates: + """ + The Dry Bicart drain execution state + """ + return self._dry_bicart_drain_execution_state + + @dd_dry_bicart_drain_execution_state.setter + def dd_dry_bicart_drain_execution_state(self, value: Union[int, DDDryBicartDrainExecStates]): + if isinstance(value, int): + self._dry_bicart_drain_execution_state = DDDryBicartDrainExecStates(value) + else: + self._dry_bicart_drain_execution_state = value + + + @property + def dd_bicarb_chamber_fill_execution_state(self) -> DDBicarbChFillExecStates: + """ + The Bicarb chamber F fill execution state + """ + return self._bicarb_chamber_fill_execution_state + + @dd_bicarb_chamber_fill_execution_state.setter + def dd_bicarb_chamber_fill_execution_state(self, value: Union[int, DDBicarbChFillExecStates]): + if isinstance(value, int): + self._bicarb_chamber_fill_execution_state = DDBicarbChFillExecStates(value) + else: + self._bicarb_chamber_fill_execution_state = value + + + @property + def dd_dry_bicart_fill_cycle_counter(self) -> int: + """ + The Dry Bicart fill cycle counter + """ + return self._dry_bicart_fill_cycle_counter + + @dd_dry_bicart_fill_cycle_counter.setter + def dd_dry_bicart_fill_cycle_counter(self, value): + self._dry_bicart_fill_cycle_counter = value + + + @property + def dd_dry_bicart_max_fill_cycle_count(self) -> int: + """ + The Dry Bicart max fill cycle state + """ + return self._dry_bicart_max_fill_cycle_count + + @dd_dry_bicart_max_fill_cycle_count.setter + def dd_dry_bicart_max_fill_cycle_count(self, value): + self._dry_bicart_max_fill_cycle_count = value + + + @property + def dd_dry_bicart_fill_request(self) -> bool: + """ + Is fill requested for Dry Bicart or not + """ + return self._dry_bicart_fill_request + + @dd_dry_bicart_fill_request.setter + def dd_dry_bicart_fill_request(self, value): + self._dry_bicart_fill_request = value + + + @property + def dd_dry_bicart_drain_request(self) -> bool: + """ + Is drain requested for Dry Bicart or not + """ + return self._dry_bicart_drain_request + + @dd_dry_bicart_drain_request.setter + def dd_dry_bicart_drain_request(self, value): + self._dry_bicart_drain_request = value + + + @property + def dd_bicarb_chamber_fill_request(self) -> bool: + """ + Is fill requested for Bicarb Chamber or not + """ + return self._bicarb_chamber_fill_request + + @dd_bicarb_chamber_fill_request.setter + def dd_bicarb_chamber_fill_request(self, value): + self._bicarb_chamber_fill_request = value + + + @property + def dd_dry_bicart_last_fill_time(self) -> int: + """ + The Dry Bicart last fill time + """ + return self._dry_bicart_last_fill_time + + @dd_dry_bicart_last_fill_time.setter + def dd_dry_bicart_last_fill_time(self, value): + self._dry_bicart_last_fill_time = value + + + @property + def dd_dry_bicart_current_fill_time(self) -> int: + """ + The Dry Bicart current fill time + """ + return self._dry_bicart_current_fill_time + + @dd_dry_bicart_current_fill_time.setter + def dd_dry_bicart_current_fill_time(self, value): + self._dry_bicart_current_fill_time = value + + + @property + def dry_bicart_type(self) -> BicarbTypes: + """ + The Dry Bicart concentrate option + """ + return self._dry_bicart_type + + @dry_bicart_type.setter + def dry_bicart_type(self, value: Union[int, BicarbTypes]): + if isinstance(value, int): + self._dry_bicart_type = BicarbTypes(value) + else: + self._dry_bicart_type = value + + + @property + def dry_bicart_drain_time_period(self) -> int: + """ + The Dry Bicart drain time period in sec + """ + return self._dry_bicart_drain_time_period + + @dry_bicart_drain_time_period.setter + def dry_bicart_drain_time_period(self, value): + self._dry_bicart_drain_time_period = value + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_dry_bicart_data", "dd_dry_bicart_fill_execution_state", "dd_bicarb_chamber_fill_execution_state", "dd_dry_bicart_drain_execution_state", "dd_dry_bicart_fill_cycle_counter", "dd_dry_bicart_max_fill_cycle_count", "dd_dry_bicart_fill_request", "dry_bicarb_chamber_fill_request", "dd_dry_bicart_drain_request", - "dd_dry_bicart_last_fill_time", "dd_dry_bicart_current_fill_time", "dd_dryBiCartType", "dd_dryBiCartDrainTimePeriod", + "dd_dry_bicart_last_fill_time", "dd_dry_bicart_current_fill_time", "dry_bicart_type", "dry_bicart_drain_time_period", "dd_dry_bicart_timestamp"]) def _handler_dry_bicart_sync(self, message, timestamp=0.0): """ @@ -84,26 +244,26 @@ """ start = time.perf_counter() msg_list = [] - msg_list.append(('self.dd_dry_bicart_fill_execution_state', DataTypes.U32)) - msg_list.append(('self.dd_bicarb_chamber_fill_execution_state', DataTypes.U32)) - msg_list.append(('self.dd_dry_bicart_drain_execution_state', DataTypes.U32)) - msg_list.append(('self.dd_dry_bicart_fill_cycle_counter', DataTypes.U32)) - msg_list.append(('self.dd_dry_bicart_max_fill_cycle_count', DataTypes.U32)) - msg_list.append(('self.dd_dry_bicart_fill_request', DataTypes.U32)) - msg_list.append(('self.dd_bicarb_chamber_fill_request', DataTypes.U32)) - msg_list.append(('self.dd_dry_bicart_drain_request', DataTypes.U32)) - msg_list.append(('self.dd_dry_bicart_last_fill_time', DataTypes.U32)) - msg_list.append(('self.dd_dry_bicart_current_fill_time', DataTypes.U32)) - msg_list.append(('self.dd_dryBiCartType', DataTypes.U32)) - msg_list.append(('self.dd_dryBiCartDrainTimePeriod', DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_fill_execution_state, DataTypes.U32)) + msg_list.append((type(self).dd_bicarb_chamber_fill_execution_state, DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_drain_execution_state, DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_fill_cycle_counter, DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_max_fill_cycle_count, DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_fill_request, DataTypes.U32)) + msg_list.append((type(self).dd_bicarb_chamber_fill_request, DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_drain_request, DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_last_fill_time, DataTypes.U32)) + msg_list.append((type(self).dd_dry_bicart_current_fill_time, DataTypes.U32)) + msg_list.append((type(self).dry_bicart_type, DataTypes.U32)) + msg_list.append((type(self).dry_bicart_drain_time_period, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) - + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_dry_bicart_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_dry_bicart_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the dry bicart data broadcast interval override command Index: leahi_dialin/dd/modules/events.py =================================================================== diff -u -r862daa5b6357ddaba02aa7d1fb9d0952e4a16e6f -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/events.py (.../events.py) (revision 862daa5b6357ddaba02aa7d1fb9d0952e4a16e6f) +++ leahi_dialin/dd/modules/events.py (.../events.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,7 +17,8 @@ # Module imports from logging import Logger from datetime import datetime -from typing import Tuple +import time +from typing import Tuple, Union # Project imports from leahi_dialin.common import dd_enum_repository @@ -66,7 +67,6 @@ # Dictionary of the sub-mode as key and the state enum class as the value self._sub_mode_2_states = { dd_enum_repository.DDFaultStates.DD_FAULT_STATE_START.name: dd_enum_repository.DDFaultNVDataStates, - dd_enum_repository.DDStandbyStates.DD_STANDBY_MODE_STATE_IDLE.name: dd_enum_repository.DDStanDisinfectStates, dd_enum_repository.DDPreGenDialysateStates.DD_PRE_GEN_WET_SELF_TEST.name: dd_enum_repository.DDPreGenWetSelfTestStates } # Dictionary of the state as key and the sub-state enum class as the value @@ -78,8 +78,10 @@ for event in dd_enum_repository.DDEventList: self._event_dictionary[dd_enum_repository.DDEventList(event).name] = [] + self.handler_execution_times = [] + # ============================================================ Properties ============================================================ @@ -92,6 +94,7 @@ @param message: published DD events data message @returns none """ + start = time.perf_counter() event_id = LocalVars('event_id') data_typ_1 = LocalVars('data_typ_1') data_1 = LocalVars('data_1') @@ -224,6 +227,7 @@ # Update event dictionary self._event_dictionary[event_enum.name].append(event_tuple) self.events_timestamp = timestamp + self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) @@ -287,25 +291,34 @@ return list_of_events - def _operation_status_match(self, op_mode: int, sub_mode: int=None, state:int=None, sub_state: int=None) -> Tuple[DialinEnum, DialinEnum, DialinEnum, DialinEnum]: + def _operation_status_match(self, op_mode: int, sub_mode: int=None, state:int=None, sub_state: int=None) -> Tuple[DialinEnum, Union[DialinEnum, int], Union[DialinEnum, int], Union[DialinEnum, int]]: """ Convert operation status values to enums. :param op_mode: (Integer) The operation mode value :param sub_mode: (Integer) The operation sub mode value :param state: (Integer) The operation state value :param sub_state: (Integer) The operation sub state value - :return: Returns the DialinEnum for each provied mode/state + :return: Returns the DialinEnum for each provied mode/state, or the original integer value if no enum is found """ - op_mode_enum = dd_enum_repository.TDOpModes(op_mode) + op_mode_enum = dd_enum_repository.DDOpModes(op_mode) sub_mode_enum = None state_enum = None sub_state_enum = None if sub_mode is not None: - sub_mode_enum = self._op_mode_2_sub_mode[op_mode_enum.name](sub_mode) + if op_mode_enum.name not in self._op_mode_2_sub_mode: + sub_mode_enum = sub_mode + else: + sub_mode_enum = self._op_mode_2_sub_mode[op_mode_enum.name](sub_mode) if state is not None: - state_enum = self._sub_mode_2_states[sub_mode_enum.name](state) + if sub_mode_enum.name not in self._sub_mode_2_states: + state_enum = state + else: + state_enum = self._sub_mode_2_states[sub_mode_enum.name](state) if sub_state is not None: - sub_state_enum = self._state_2_sub_states[state_enum.name](sub_state) + if state_enum.name not in self._state_2_sub_states: + sub_state_enum = sub_state + else: + sub_state_enum = self._state_2_sub_states[state_enum.name](sub_state) return op_mode_enum, sub_mode_enum, state_enum, sub_state_enum Index: leahi_dialin/dd/modules/gen_dialysate.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/gen_dialysate.py (.../gen_dialysate.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/gen_dialysate.py (.../gen_dialysate.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,9 +17,11 @@ # Module imports from logging import Logger import time +from typing import Union # Project imports from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.dd_defs import DDGenDialysateModeStates 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_broadcast_interval_override, cmd_generic_override @@ -51,13 +53,69 @@ function = self._handler_gen_dialysate_sync) self.dd_gen_dialysate_timestamp = 0.0 #: The timestamp of the last message - self.execution_state = 0 #: The Execution state - self.dialysate_delivery_in_progress = 0 #: Is Dialysate delivery in progress or not - self.dialysate_good_to_deliver = 0 #: The Dialysate is good to delover or not - self.target_qd = 0.0 #: The Target Qd - + self.execution_state = DDGenDialysateModeStates.NUM_OF_DD_GEND_MODE_STATES + self.dialysate_delivery_in_progress = False + self.dialysate_good_to_deliver = False + self.target_qd = 0.0 self.handler_execution_times = [] + + +# ============================================================ Properties ============================================================ + @property + def execution_state(self) -> DDGenDialysateModeStates: + """ + The execution state + """ + return self._execution_state + + @execution_state.setter + def execution_state(self, value: Union[int, DDGenDialysateModeStates]): + if isinstance(value, int): + self._execution_state = DDGenDialysateModeStates(value) + else: + self._execution_state = value + + + @property + def dialysate_delivery_in_progress(self) -> bool: + """ + Is Dialysate delivery in progress or not + """ + return self._delivery_in_progress + + @dialysate_delivery_in_progress.setter + def dialysate_delivery_in_progress(self, value): + self._delivery_in_progress = value + + + + @property + def dialysate_good_to_deliver(self) -> bool: + """ + The Dialysate is good to delover or not + """ + return self._good_to_deliver + + @dialysate_good_to_deliver.setter + def dialysate_good_to_deliver(self, value): + self._good_to_deliver = value + + + @property + def target_qd(self) -> float: + """ + The Target Qd + """ + return self._target_qd + + @target_qd.setter + def target_qd(self, value): + self._target_qd = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_gen_dialysate_mode_data", "execution_state", "dialysate_delivery_in_progress", "dialysate_good_to_deliver", @@ -72,17 +130,18 @@ """ start = time.perf_counter() msg_list = [] - msg_list.append(('self.execution_state', DataTypes.U32)) - msg_list.append(('self.dialysate_delivery_in_progress', DataTypes.U32)) - msg_list.append(('self.dialysate_good_to_deliver', DataTypes.U32)) - msg_list.append(('self.target_qd', DataTypes.F32)) + msg_list.append((type(self).execution_state, DataTypes.U32)) + msg_list.append((type(self).dialysate_delivery_in_progress, DataTypes.BOOL)) + msg_list.append((type(self).dialysate_good_to_deliver, DataTypes.BOOL)) + msg_list.append((type(self).target_qd, DataTypes.F32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_gen_dialysate_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_gen_dialysate_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the gen dialysate data broadcast interval override command Index: leahi_dialin/dd/modules/heaters.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -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, float_to_bytearray @@ -50,8 +50,6 @@ function = self._handler_heaters_sync) self.dd_heaters_timestamp = 0.0 #: The timestamp of the latest message - - #: The Heaters data in dictionary format self.dd_heaters = { dd_enum_repository.DDHeaterNames.D5_HEAT.name: { dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name: 0.0, @@ -66,7 +64,7 @@ dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name: 0.0, dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name: 0.0, dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name: 0, - dd_enum_repository.DDHeaterAttributes.FEED_FORWARD.name: None, # D45 Heater doesn't use this attribute + dd_enum_repository.DDHeaterAttributes.FEED_FORWARD.name: None, # D45 Heater doesn't use this attribute dd_enum_repository.DDHeaterAttributes.PWM_PERIOD.name: None, # D45 Heater doesn't use this attribute dd_enum_repository.DDHeaterAttributes.ADJUSTED_TARGET_TEMP.name: None, # D45 Heater doesn't use this attribute dd_enum_repository.DDHeaterAttributes.TARGET_TEMP_TD.name: None # D45 Heater doesn't use this attribute @@ -85,7 +83,23 @@ self.dbg9 = 0.0 self.handler_execution_times = [] - + + +# ============================================================ Properties ============================================================ + @property + def dd_heaters(self) -> dict: + """ + The Heaters data + """ + return self._heaters + + @dd_heaters.setter + def dd_heaters(self, value): + self._heaters = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_heaters_data", "dd_heaters", "dbg1", "dbg2", "dbg3", "dbg4", "dbg5", "dbg6", "dbg7", "dbg8", "dbg9", "dd_heaters_timestamp"]) @@ -97,38 +111,56 @@ @returns none """ start = time.perf_counter() - sensor_list = [] - sensor_list.append((dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D45_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D45_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D45_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.FEED_FORWARD.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.PWM_PERIOD.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.ADJUSTED_TARGET_TEMP.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.TARGET_TEMP_TD.name, DataTypes.F32)) - msg_list =[] - msg_list.append(('self.dbg1', DataTypes.F32)) - msg_list.append(('self.dbg2', DataTypes.F32)) - msg_list.append(('self.dbg3', DataTypes.F32)) - msg_list.append(('self.dbg4', DataTypes.F32)) - msg_list.append(('self.dbg5', DataTypes.F32)) - msg_list.append(('self.dbg6', DataTypes.F32)) - msg_list.append(('self.dbg7', DataTypes.F32)) - msg_list.append(('self.dbg8', DataTypes.F32)) - msg_list.append(('self.dbg9', DataTypes.F32)) + msg_list = [] + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name, DataTypes.F32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D45_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name, DataTypes.F32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D45_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name, DataTypes.U32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D45_HEAT.name, dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name, DataTypes.U32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.FEED_FORWARD.name, DataTypes.F32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.PWM_PERIOD.name, DataTypes.F32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.ADJUSTED_TARGET_TEMP.name, DataTypes.F32)) + msg_list.append((self.dd_heaters, dd_enum_repository.DDHeaterNames.D5_HEAT.name, dd_enum_repository.DDHeaterAttributes.TARGET_TEMP_TD.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.dd_heaters, - decoder_list = sensor_list, - message = message) - self.process_into_vars(decoder_list = msg_list, - message = message, - start_from_byte = len(sensor_list) * DataTypes.U32.size()) + # Temp debug values + dbg1 = LocalVars('dbg1') + dbg2 = LocalVars('dbg2') + dbg3 = LocalVars('dbg3') + dbg4 = LocalVars('dbg4') + dbg5 = LocalVars('dbg5') + dbg6 = LocalVars('dbg6') + dbg7 = LocalVars('dbg7') + dbg8 = LocalVars('dbg8') + dbg9 = LocalVars('dbg9') + msg_list.append((dbg1, DataTypes.F32)) + msg_list.append((dbg2, DataTypes.F32)) + msg_list.append((dbg3, DataTypes.F32)) + msg_list.append((dbg4, DataTypes.F32)) + msg_list.append((dbg5, DataTypes.F32)) + msg_list.append((dbg6, DataTypes.F32)) + msg_list.append((dbg7, DataTypes.F32)) + msg_list.append((dbg8, DataTypes.F32)) + msg_list.append((dbg9, DataTypes.F32)) + + self.process_into_vars(decoder_list = msg_list, message = message) + + # Not creating properties for temporary debug values + self.dbg1 = dbg1.value + self.dbg2 = dbg2.value + self.dbg3 = dbg3.value + self.dbg4 = dbg4.value + self.dbg5 = dbg5.value + self.dbg6 = dbg6.value + self.dbg7 = dbg7.value + self.dbg8 = dbg8.value + self.dbg9 = dbg9.value self.dd_heaters_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_heaters_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends broadcast time interval. Index: leahi_dialin/dd/modules/levels.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -50,18 +50,45 @@ function = self._handler_levels_sync) self.dd_levels_timestamp = 0 #: The timestamp of the latest message - - #: The Level Sensors data in dictionary format self.dd_level_sensors = { dd_enum_repository.DDLevelSensorNames.D46_LEVEL.name: 0, dd_enum_repository.DDLevelSensorNames.D63_LEVEL.name: 0, dd_enum_repository.DDLevelSensorNames.D98_LEVEL.name: 0, dd_enum_repository.DDLevelSensorNames.D6_LEVEL.name: 0, } - self.dd_bicarb_level = 0 #: The Bicarb level + + self.dd_bicarb_level = 0 self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def dd_level_sensors(self) -> dict: + """ + The Level Sensors data + """ + return self._level_sensors + + @dd_level_sensors.setter + def dd_level_sensors(self, value): + self._level_sensors = value + + + @property + def dd_bicarb_level(self) -> int: + """ + The Bicarb level + """ + return self._bicarb_level + + @dd_bicarb_level.setter + def dd_bicarb_level(self, value): + self._bicarb_level = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_level_data", "dd_level_sensors", "dd_bicarb_level", "dd_levels_timestamp"]) def _handler_levels_sync(self, message, timestamp=0.0): """ @@ -71,24 +98,20 @@ @returns none """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((dd_enum_repository.DDLevelSensorNames.D46_LEVEL.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDLevelSensorNames.D63_LEVEL.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDLevelSensorNames.D98_LEVEL.name, DataTypes.U32)) - sensor_list.append((dd_enum_repository.DDLevelSensorNames.D6_LEVEL.name, DataTypes.U32)) msg_list =[] - msg_list.append(('self.dd_bicarb_level', DataTypes.U32)) + msg_list.append((self.dd_level_sensors, dd_enum_repository.DDLevelSensorNames.D46_LEVEL.name, DataTypes.U32)) + msg_list.append((self.dd_level_sensors, dd_enum_repository.DDLevelSensorNames.D63_LEVEL.name, DataTypes.U32)) + msg_list.append((self.dd_level_sensors, dd_enum_repository.DDLevelSensorNames.D98_LEVEL.name, DataTypes.U32)) + msg_list.append((self.dd_level_sensors, dd_enum_repository.DDLevelSensorNames.D6_LEVEL.name, DataTypes.U32)) + msg_list.append((type(self).dd_bicarb_level, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.dd_level_sensors, - decoder_list = sensor_list, - message = message) - self.process_into_vars(decoder_list = msg_list, - message = message, - start_from_byte = len(sensor_list) * DataTypes.U32.size()) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_levels_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_levels_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends dd levels broadcast time interval override. Index: leahi_dialin/dd/modules/mixing_cntrl.py =================================================================== diff -u -r85ef20ba3241aa746fbdf54089c51705e55cbcf2 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/mixing_cntrl.py (.../mixing_cntrl.py) (revision 85ef20ba3241aa746fbdf54089c51705e55cbcf2) +++ leahi_dialin/dd/modules/mixing_cntrl.py (.../mixing_cntrl.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -21,10 +21,10 @@ # Project imports from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgIds +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 from leahi_dialin.common.dataclass.closed_loop_signals import ControllerSignals @@ -104,6 +104,154 @@ self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def bicarb_mixing_state(self) -> int: + """ + The Bicarb Mixing State + """ + return self._bicarb_mixing_state + + @bicarb_mixing_state.setter + def bicarb_mixing_state(self, value): + self._bicarb_mixing_state = value + + + @property + def bicarb_control_interval(self) -> int: + """ + The Bicarb Control Interval + """ + return self._bicarb_control_interval + + @bicarb_control_interval.setter + def bicarb_control_interval(self, value): + self._bicarb_control_interval = value + + + @property + def acid_mixing_state(self) -> int: + """ + The Acid Mixing State + """ + return self._acid_mixing_state + + @acid_mixing_state.setter + def acid_mixing_state(self, value): + self._acid_mixing_state = value + + + @property + def acid_control_interval(self) -> int: + """ + The Acid Control Interval + """ + return self._acid_control_interval + + @acid_control_interval.setter + def acid_control_interval(self, value): + self._acid_control_interval = value + + + @property + def current_bicarb_mix_volume(self) -> float: + """ + The Bicarb Current Mixing Volume + """ + return self._current_bicarb_mix_volume + + @current_bicarb_mix_volume.setter + def current_bicarb_mix_volume(self, value): + self._current_bicarb_mix_volume = value + + + @property + def last_bicarb_mix_volume(self) -> float: + """ + The Bicarb Last Mixing Volume + """ + return self._last_bicarb_mix_volume + + @last_bicarb_mix_volume.setter + def last_bicarb_mix_volume(self, value): + self._last_bicarb_mix_volume = value + + + @property + def current_acid_mix_volume(self) -> float: + """ + The Acid Current Mixing Volume + """ + return self._current_acid_mix_volume + + @current_acid_mix_volume.setter + def current_acid_mix_volume(self, value): + self._current_acid_mix_volume = value + + + @property + def last_acid_mix_volume(self) -> float: + """ + The Acid Last Mixing Volume + """ + return self._last_acid_mix_volume + + @last_acid_mix_volume.setter + def last_acid_mix_volume(self, value): + self._last_acid_mix_volume = value + + + @property + def bicarb_conductivity_pre_mix(self) -> float: + """ + The Bicarb Conductivity Pre Mixing + """ + return self._bicarb_conductivity_pre_mix + + @bicarb_conductivity_pre_mix.setter + def bicarb_conductivity_pre_mix(self, value): + self._bicarb_conductivity_pre_mix = value + + + @property + def bicarb_conductivity_post_mix(self) -> float: + """ + The Bicarb Conductivity Post Mixing + """ + return self._bicarb_conductivity_post_mix + + @bicarb_conductivity_post_mix.setter + def bicarb_conductivity_post_mix(self, value): + self._bicarb_conductivity_post_mix = value + + + @property + def acid_conductivity_post_mix(self) -> float: + """ + The Acid Conductivity Post Mixing + """ + return self._acid_conductivity_post_mix + + @acid_conductivity_post_mix.setter + def acid_conductivity_post_mix(self, value): + self._acid_conductivity_post_mix = value + + + @property + def total_conductivity(self) -> float: + """ + The Total Conductivity + """ + return self._total_conductivity + + @total_conductivity.setter + def total_conductivity(self, value): + self._total_conductivity = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_mixing_control_data", "bicarb_mixing_state", "bicarb_control_interval", "acid_mixing_state", "acid_control_interval", "bicarb_conductivity_pre_mix", "bicarb_conductivity_post_mix", "acid_conductivity_post_mix", @@ -125,55 +273,103 @@ """ start = time.perf_counter() msg_list = [] + msg_list.append((type(self).bicarb_mixing_state, DataTypes.U32)) + msg_list.append((type(self).bicarb_control_interval, DataTypes.U32)) + msg_list.append((type(self).acid_mixing_state, DataTypes.U32)) + msg_list.append((type(self).acid_control_interval, DataTypes.U32)) - msg_list.append(('self.bicarb_mixing_state', DataTypes.U32)) - msg_list.append(('self.bicarb_control_interval', DataTypes.U32)) - msg_list.append(('self.acid_mixing_state', DataTypes.U32)) - msg_list.append(('self.acid_control_interval', DataTypes.U32)) + msg_list.append((type(self).current_bicarb_mix_volume, DataTypes.F32)) + msg_list.append((type(self).last_bicarb_mix_volume, DataTypes.F32)) + msg_list.append((type(self).current_acid_mix_volume, DataTypes.F32)) + msg_list.append((type(self).last_acid_mix_volume, DataTypes.F32)) - msg_list.append(('self.current_bicarb_mix_volume', DataTypes.F32)) - msg_list.append(('self.last_bicarb_mix_volume', DataTypes.F32)) - msg_list.append(('self.current_acid_mix_volume', DataTypes.F32)) - msg_list.append(('self.last_acid_mix_volume', DataTypes.F32)) + msg_list.append((type(self).bicarb_conductivity_pre_mix, DataTypes.F32)) + msg_list.append((type(self).bicarb_conductivity_post_mix, DataTypes.F32)) + msg_list.append((type(self).acid_conductivity_post_mix, DataTypes.F32)) + msg_list.append((type(self).total_conductivity, DataTypes.F32)) - msg_list.append(('self.bicarb_conductivity_pre_mix', DataTypes.F32)) - msg_list.append(('self.bicarb_conductivity_post_mix', DataTypes.F32)) - msg_list.append(('self.acid_conductivity_post_mix', DataTypes.F32)) - msg_list.append(('self.total_conductivity', DataTypes.F32)) + # Temp debug values + bicarb_reference = LocalVars() + bicarb_measured = LocalVars() + bicarb_error = LocalVars() + bicarb_error_sum = LocalVars() + bicarb_error_sum_after = LocalVars() + bicarb_prop_output = LocalVars() + bicarb_integral_output = LocalVars() + bicarb_ff_output = LocalVars() + bicarb_control = LocalVars() + msg_list.append((bicarb_reference, DataTypes.F32)) + msg_list.append((bicarb_measured, DataTypes.F32)) + msg_list.append((bicarb_error, DataTypes.F32)) + msg_list.append((bicarb_error_sum, DataTypes.F32)) + msg_list.append((bicarb_error_sum_after, DataTypes.F32)) + msg_list.append((bicarb_prop_output, DataTypes.F32)) + msg_list.append((bicarb_integral_output, DataTypes.F32)) + msg_list.append((bicarb_ff_output, DataTypes.F32)) + msg_list.append((bicarb_control, DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_reference', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_measured', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_error', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_error_sum', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_error_sum_after_windup', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_proportional_output', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_integral_output ', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_signal_feed_forward_output', DataTypes.F32)) - msg_list.append(('self.bcarb_ctlrl_signal.control_singal_control', DataTypes.F32)) + acid_reference = LocalVars() + acid_measured = LocalVars() + acid_error = LocalVars() + acid_error_sum = LocalVars() + acid_error_sum_after = LocalVars() + acid_prop_output = LocalVars() + acid_integral_output = LocalVars() + acid_ff_output = LocalVars() + acid_control = LocalVars() + msg_list.append((acid_reference, DataTypes.F32)) + msg_list.append((acid_measured, DataTypes.F32)) + msg_list.append((acid_error, DataTypes.F32)) + msg_list.append((acid_error_sum, DataTypes.F32)) + msg_list.append((acid_error_sum_after, DataTypes.F32)) + msg_list.append((acid_prop_output, DataTypes.F32)) + msg_list.append((acid_integral_output, DataTypes.F32)) + msg_list.append((acid_ff_output, DataTypes.F32)) + msg_list.append((acid_control, DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_reference', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_measured', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_error', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_error_sum', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_error_sum_after_windup', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_proportional_output', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_integral_output ', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_signal_feed_forward_output', DataTypes.F32)) - msg_list.append(('self.acid_ctrl_signal.control_singal_control', DataTypes.F32)) + bicarb_kp_gain = LocalVars() + bicarb_ki_gain = LocalVars() + acid_kp_gain = LocalVars() + acid_ki_gain = LocalVars() + msg_list.append((bicarb_kp_gain, DataTypes.F32)) + msg_list.append((bicarb_ki_gain, DataTypes.F32)) + msg_list.append((acid_kp_gain, DataTypes.F32)) + msg_list.append((acid_ki_gain, DataTypes.F32)) - msg_list.append(('self.dd_bicarb_kp_gain', DataTypes.F32)) - msg_list.append(('self.dd_bicarb_ki_gain', DataTypes.F32)) + self.process_into_vars(decoder_list = msg_list, message = message) - msg_list.append(('self.dd_acid_kp_gain', DataTypes.F32)) - msg_list.append(('self.dd_acid_ki_gain', DataTypes.F32)) + # Not creating properties for temporary debug values + self.bcarb_ctlrl_signal.control_signal_reference = bicarb_reference.value + self.bcarb_ctlrl_signal.control_signal_measured = bicarb_measured.value + self.bcarb_ctlrl_signal.control_signal_error = bicarb_error.value + self.bcarb_ctlrl_signal.control_signal_error_sum = bicarb_error_sum.value + self.bcarb_ctlrl_signal.control_signal_error_sum_after_windup = bicarb_error_sum_after.value + self.bcarb_ctlrl_signal.control_signal_proportional_output = bicarb_prop_output.value + self.bcarb_ctlrl_signal.control_signal_integral_output = bicarb_integral_output.value + self.bcarb_ctlrl_signal.control_signal_feed_forward_output = bicarb_ff_output.value + self.bcarb_ctlrl_signal.control_singal_control = bicarb_control.value - self.process_into_vars(decoder_list = msg_list, - message = message) + self.acid_ctrl_signal.control_signal_reference = acid_reference.value + self.acid_ctrl_signal.control_signal_measured = acid_measured.value + self.acid_ctrl_signal.control_signal_error = acid_error.value + self.acid_ctrl_signal.control_signal_error_sum = acid_error_sum.value + self.acid_ctrl_signal.control_signal_error_sum_after_windup = acid_error_sum_after.value + self.acid_ctrl_signal.control_signal_proportional_output = acid_prop_output.value + self.acid_ctrl_signal.control_signal_integral_output = acid_integral_output.value + self.acid_ctrl_signal.control_signal_feed_forward_output = acid_ff_output.value + self.acid_ctrl_signal.control_singal_control = acid_control.value + self.dd_bicarb_kp_gain = bicarb_kp_gain.value + self.dd_bicarb_ki_gain = bicarb_ki_gain.value + self.dd_acid_kp_gain = acid_kp_gain.value + self.dd_acid_ki_gain = acid_ki_gain.value + self.dd_mixing_control_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_dialysate_mixing_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the mixing control data broadcast interval override command @@ -215,7 +411,7 @@ channel_id=CanChannels.dialin_to_dd_ch_id, msg_id=MsgIds.MSG_ID_DD_BICARB_MIX_VOL_OVERRIDE_REQUEST, entity_name='DD Bicarb Mix Vol', - override_text=str(bicarb_dose_vol), + override_text=str(bicarb_mix_vol), logger=self.logger, can_interface=self.can_interface) Index: leahi_dialin/dd/modules/post_gen_dialysate.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/post_gen_dialysate.py (.../post_gen_dialysate.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/post_gen_dialysate.py (.../post_gen_dialysate.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,9 +17,11 @@ # Module imports from logging import Logger import time +from typing import Union # Project imports from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.dd_defs import DDPostGenDialysateStates 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_broadcast_interval_override @@ -50,10 +52,28 @@ function = self._handler_post_gen_dialysate_sync) self.post_gen_state_timestamp = 0 #: The timestamp of the latest message - self.execution_state = 0 #: The execution state + self.execution_state = DDPostGenDialysateStates.NUM_OF_DD_POST_GEN_DIALYSATE_STATES self.handler_execution_times = [] +# ============================================================ Properties ============================================================ + @property + def execution_state(self) -> DDPostGenDialysateStates: + """ + The execution state + """ + return self._execution_state + + @execution_state.setter + def execution_state(self, value: Union[int, DDPostGenDialysateStates]): + if isinstance(value, int): + self._execution_state = DDPostGenDialysateStates(value) + else: + self._execution_state = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_post_gen_dialysate_state_data", "execution_state", "post_gen_state_timestamp"]) def _handler_post_gen_dialysate_sync(self, message, timestamp=0.0): """ @@ -64,14 +84,15 @@ """ start = time.perf_counter() msg_list =[] - msg_list.append(('self.execution_state', DataTypes.U32)) + msg_list.append((type(self).execution_state, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.post_gen_state_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_post_gen_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the broadcast time interval override for post gen dialysate data. Index: leahi_dialin/dd/modules/pre_gen_dialysate.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/pre_gen_dialysate.py (.../pre_gen_dialysate.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/pre_gen_dialysate.py (.../pre_gen_dialysate.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,9 +17,11 @@ # Module imports from logging import Logger import time +from typing import Union # Project imports from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.dd_defs import DDPreGenDialysateStates 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_broadcast_interval_override @@ -54,17 +56,96 @@ function = self._handler_pre_gen_request_sync) self.pre_gen_state_timestamp = 0 #: The timestamp of the latest Pre-Gen State message - self.execution_state = 0 #: The execution state + self.execution_state = DDPreGenDialysateStates.NUM_OF_DD_PRE_GEN_DIALYSATE_STATES self.pre_gen_request_timestamp = 0 #: The timestamp of the latest Pre-Gen Request message - self.pre_gen_start = 0 #: The Pre-Gen start value - self.pre_gen_dial_rate = 0.0 #: The Pre-Gen dialysate rate - self.pre_gen_dial_temp = 0.0 #: The Pre-Gen dialysate temperature - self.pre_gen_acid = 0 #: The Pre-Gen acid concentrate option index - self.pre_gen_bicarb = 0 #: The Pre-Gen bicarb concentrate option index + self.pre_gen_start = 0 + self.pre_gen_dial_rate = 0.0 + self.pre_gen_dial_temp = 0.0 + self.pre_gen_acid = 0 + self.pre_gen_bicarb = 0 self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def execution_state(self) -> DDPreGenDialysateStates: + """ + The execution state + """ + return self._execution_state + + @execution_state.setter + def execution_state(self, value: Union[int, DDPreGenDialysateStates]): + if isinstance(value, int): + self._execution_state = DDPreGenDialysateStates(value) + else: + self._execution_state = value + + + @property + def pre_gen_start(self) -> int: + """ + he Pre-Gen start value + """ + return self._start + + @pre_gen_start.setter + def pre_gen_start(self, value: int): + self._start = value + + + @property + def pre_gen_dial_rate(self) -> float: + """ + The Pre-Gen dialysate rate + """ + return self._dial_rate + + @pre_gen_dial_rate.setter + def pre_gen_dial_rate(self, value: float): + self._dial_rate = value + + + @property + def pre_gen_dial_temp(self) -> float: + """ + The Pre-Gen dialysate temperature + """ + return self._dial_temp + + @pre_gen_dial_temp.setter + def pre_gen_dial_temp(self, value: float): + self._dial_temp = value + + + @property + def pre_gen_acid(self) -> int: + """ + he Pre-Gen acid concentrate option index + """ + return self._acid + + @pre_gen_acid.setter + def pre_gen_acid(self, value: int): + self._acid = value + + + @property + def pre_gen_bicarb(self) -> int: + """ + he Pre-Gen bicarb concentrate option index + """ + return self._bicarb + + @pre_gen_bicarb.setter + def pre_gen_bicarb(self, value: int): + self._bicarb = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_pre_gen_dialysate_state_data", "execution_state", "pre_gen_state_timestamp"]) def _handler_pre_gen_state_sync(self, message, timestamp=0.0): """ @@ -75,11 +156,9 @@ """ start = time.perf_counter() msg_list =[] - msg_list.append(('self.execution_state', DataTypes.U32)) + msg_list.append((type(self).execution_state, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) - + self.process_into_vars(decoder_list = msg_list, message = message) self.pre_gen_state_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) @@ -96,17 +175,18 @@ @return: None """ msg_list =[] - msg_list.append(('self.pre_gen_start', DataTypes.U32)) - msg_list.append(('self.pre_gen_dial_rate', DataTypes.F32)) - msg_list.append(('self.pre_gen_dial_temp', DataTypes.F32)) - msg_list.append(('self.pre_gen_acid', DataTypes.U32)) - msg_list.append(('self.pre_gen_bicarb', DataTypes.U32)) + msg_list.append((type(self).pre_gen_start, DataTypes.U32)) + msg_list.append((type(self).pre_gen_dial_rate, DataTypes.F32)) + msg_list.append((type(self).pre_gen_dial_temp, DataTypes.F32)) + msg_list.append((type(self).pre_gen_acid, DataTypes.U32)) + msg_list.append((type(self).pre_gen_bicarb, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.pre_gen_request_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_pre_gen_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the broadcast time interval override for pre gen dialysate data. Index: leahi_dialin/dd/modules/pressure_sensors.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -49,8 +49,6 @@ function = self._handler_pressures_sync) self.dd_pressures_timestamp = 0 #: The timestamp of the latest message - - #: The Pressure Sensors data in dictionary format self.dd_pressures = { dd_enum_repository.DDPressureSensorNames.D9_PRES.name: 0.0, dd_enum_repository.DDPressureSensorNames.D66_PRES.name: 0.0, @@ -62,6 +60,22 @@ self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def dd_pressures(self) -> dict: + """ + The Pressure Sensors data + """ + return self._pressures + + @dd_pressures.setter + def dd_pressures(self, value): + self._pressures = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_pressures_data", "dd_pressures", "dd_pressures_timestamp"]) def _handler_pressures_sync(self, message,timestamp=0.0): """ @@ -73,19 +87,19 @@ """ start = time.perf_counter() sensor_list =[] - sensor_list.append((dd_enum_repository.DDPressureSensorNames.D9_PRES.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDPressureSensorNames.D66_PRES.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDPressureSensorNames.D51_PRES.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDPressureSensorNames.D18_PRES.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDPressureSensorNames.D41_PRES.name, DataTypes.F32)) - sensor_list.append((dd_enum_repository.DDPressureSensorNames.D87_PRES.name, DataTypes.F32)) + sensor_list.append((self.dd_pressures, dd_enum_repository.DDPressureSensorNames.D9_PRES.name, DataTypes.F32)) + sensor_list.append((self.dd_pressures, dd_enum_repository.DDPressureSensorNames.D66_PRES.name, DataTypes.F32)) + sensor_list.append((self.dd_pressures, dd_enum_repository.DDPressureSensorNames.D51_PRES.name, DataTypes.F32)) + sensor_list.append((self.dd_pressures, dd_enum_repository.DDPressureSensorNames.D18_PRES.name, DataTypes.F32)) + sensor_list.append((self.dd_pressures, dd_enum_repository.DDPressureSensorNames.D41_PRES.name, DataTypes.F32)) + sensor_list.append((self.dd_pressures, dd_enum_repository.DDPressureSensorNames.D87_PRES.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.dd_pressures, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = sensor_list, message = message) self.dd_pressures_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_pressure_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the pressure broadcast interval override command. Index: leahi_dialin/dd/modules/records.py =================================================================== diff -u -r28a21f1f2ca4ef02e6d54bae30b738fddb7bdb3a -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/records.py (.../records.py) (revision 28a21f1f2ca4ef02e6d54bae30b738fddb7bdb3a) +++ leahi_dialin/dd/modules/records.py (.../records.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -47,83 +47,83 @@ if self.can_interface is not None: # Data Request Response messages self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SYSTEM_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_system_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SERVICE_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_service_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_PRESSURE_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_pres_sensor_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_TEMP_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_temp_sensor_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_CONC_PUMP_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_conc_pump_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_D12_PUMP_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_dial_pump_d12_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_D48_PUMP_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_dial_pump_d48_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_ACID_CONCENTRATE_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_acid_conc_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_BICARB_CONCENTRATE_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_bicarb_conc_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_ACCEL_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_accelerometer_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_CAL_BLOOD_LEAK_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_blood_leak_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_INSTITUTIONAL_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_institutional_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_USAGE_INFO_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_usage_info_record_sync) # Set Data Response messages self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_SYSTEM_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_system_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_SERVICE_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_service_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_PRESSURE_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_pressure_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_TEMP_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_temp_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_CONC_PUMP_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_conc_pump_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_D12_PUMP_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_d12_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_D48_PUMP_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_d48_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_ACID_CONCENTRATE_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_acid_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_BICARB_CONCENTRATE_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_bicarb_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_ACCEL_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_accel_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_CAL_BLOOD_LEAK_SENSOR_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_cal_blood_leak_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_INSTITUTIONAL_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_institutional_rr_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_NVM_SET_USAGE_INFO_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_usage_info_rr_sync) @@ -847,7 +847,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_DD_SET_OPERATION_MODE_OVERRIDE_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = 'DD Operation Mode', override_text = f'set to {service_mode.name}', logger = self.logger, @@ -871,7 +871,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'DD System Record request', override_text = '', logger = self.logger, @@ -893,7 +893,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'DD Service Record request', override_text = '', logger = self.logger, @@ -915,7 +915,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'DD Calibration Record request', override_text = '', logger = self.logger, @@ -937,7 +937,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'DD Institutional Record request', override_text = '', logger = self.logger, @@ -959,7 +959,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'DD Usage Information Record request', override_text = '', logger = self.logger, @@ -1000,7 +1000,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_SYSTEM_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'New DD System Record', override_text = 'being set', logger = self.logger, @@ -1034,7 +1034,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_SERVICE_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'New DD Service Record', override_text = 'being set', logger = self.logger, @@ -1052,14 +1052,14 @@ @return: 1 if successful, zero otherwise """ msg_id_pairing = { - 'PRES': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_PRESSURE_SENSOR_REQUEST, - 'TEMP': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_TEMP_SENSOR_REQUEST, - 'CONC': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_CONC_PUMP_REQUEST, - 'DIAL': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D48_PUMP_REQUEST, - 'ACID': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_ACID_CONCENTRATE_REQUEST, - 'BICARB': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_BICARB_CONCENTRATE_REQUEST, - 'ACCEL': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_ACCEL_SENSOR_REQUEST, - 'BLOOD_LEAK': MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_BLOOD_LEAK_SENSOR_REQUEST, + 'PRES': MsgIds.MSG_ID_UNUSED, + 'TEMP': MsgIds.MSG_ID_UNUSED, + 'CONC': MsgIds.MSG_ID_UNUSED, + 'DIAL': MsgIds.MSG_ID_UNUSED, + 'ACID': MsgIds.MSG_ID_UNUSED, + 'BICARB': MsgIds.MSG_ID_UNUSED, + 'ACCEL': MsgIds.MSG_ID_UNUSED, + 'BLOOD_LEAK': MsgIds.MSG_ID_UNUSED, } # Make a dictionary to store all the send functions for later send send_data = [] @@ -1102,7 +1102,7 @@ kwargs['sensor_enum'] = sensor if sensor == dd_enum_repository.DDDialysatePumpNames.D12_PUMP: - kwargs['msg_id'] = MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP_REQUEST + kwargs['msg_id'] = MsgIds.MSG_ID_UNUSED else: kwargs['msg_id'] = msg_id_pairing[group] @@ -1289,7 +1289,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_INSTITUTIONAL_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'DD Institutional Record', override_text = 'being set', logger = self.logger, @@ -1339,7 +1339,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_USAGE_INFO_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'New DD Usage Information Record', override_text = 'being set', logger = self.logger, @@ -1363,7 +1363,7 @@ else: payload_sensor = byte_to_bytearray(sensor_enum.value) payload_content = b'' - if msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP_REQUEST: + if msg_id == MsgIds.MSG_ID_UNUSED: payload_content += float_to_bytearray(dialysate_pump_target_speed) else: payload_content += float_to_bytearray(fourth_order_coeff) @@ -1373,19 +1373,19 @@ payload_content += float_to_bytearray(offset) payload_content += integer_to_bytearray(calibration_time) payload_content += unsigned_short_to_bytearray(self.crc16(payload_content)) - if msg_id in [MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP_REQUEST, MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D48_PUMP_REQUEST]: + if msg_id in [MsgIds.MSG_ID_UNUSED, MsgIds.MSG_ID_UNUSED]: payload = payload_content else: payload = payload_sensor + payload_content sensor_type = '' - if msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_PRESSURE_SENSOR_REQUEST: + if msg_id == MsgIds.MSG_ID_UNUSED: sensor_type = 'Pressure Sensor' - elif msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_TEMP_SENSOR_REQUEST: + elif msg_id == MsgIds.MSG_ID_UNUSED: sensor_type = 'Temperature Sensor' - elif msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_CONC_PUMP_REQUEST: + elif msg_id == MsgIds.MSG_ID_UNUSED: sensor_type = 'Concentrate Pump' - elif msg_id in [MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP_REQUEST, MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D48_PUMP_REQUEST]: + elif msg_id in [MsgIds.MSG_ID_UNUSED, MsgIds.MSG_ID_UNUSED]: sensor_type = 'Dialysate Pump' return cmd_generic_override(payload = payload, @@ -1417,9 +1417,9 @@ payload = payload_sensor + payload_content conc_type = '' - if msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_ACID_CONCENTRATE_REQUEST: + if msg_id == MsgIds.MSG_ID_UNUSED: conc_type = 'Acid' - elif msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_BICARB_CONCENTRATE_REQUEST: + elif msg_id == MsgIds.MSG_ID_UNUSED: conc_type = 'Bicarb' return cmd_generic_override(payload = payload, Index: leahi_dialin/dd/modules/rinse_pump.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/rinse_pump.py (.../rinse_pump.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/rinse_pump.py (.../rinse_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -20,6 +20,7 @@ # Project imports from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common import dd_enum_repository 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_broadcast_interval_override, cmd_generic_override @@ -51,12 +52,51 @@ function = self._handler_rinse_pump_sync) self.dd_rinse_pump_timestamp = 0 #: The timestamp of the latest message - self.d79_state = 0 #: The State of the D79 Pump - self.d79_pump_pwm = 0.0 #: The PWM of the D79 Pump - self.d79_pump_rpm = 0 #: The RPM of the D79 Pump + self.d79_state = 0 + self.d79_pump_pwm = 0.0 + self.d79_pump_rpm = 0 self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def d79_state(self) -> int: + """ + The D79 Rinse Pump's State + """ + return self._state + + @d79_state.setter + def d79_state(self, value: int): + self._state = value + + @property + def d79_pump_pwm(self) -> float: + """ + The D79 Rinse Pump's PWM + """ + return self._pwm + + @d79_pump_pwm.setter + def d79_pump_pwm(self, value: float): + self._pwm = value + + + @property + def d79_pump_rpm(self) -> int: + """ + The D79 Rinse Pump's RPM + """ + return self._rpm + + @d79_pump_rpm.setter + def d79_pump_rpm(self, value: int): + self._rpm = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_rinse_pump_data", "d79_state", "d79_pump_pwm", "d79_pump_rpm", "dd_rinse_pump_timestamp"]) @@ -69,16 +109,17 @@ """ start = time.perf_counter() msg_list =[] - msg_list.append(('self.d79_state', DataTypes.U32)) - msg_list.append(('self.d79_pump_pwm', DataTypes.F32)) - msg_list.append(('self.d79_pump_rpm', DataTypes.U32)) + msg_list.append((type(self).d79_state, DataTypes.U32)) + msg_list.append((type(self).d79_pump_pwm, DataTypes.F32)) + msg_list.append((type(self).d79_pump_rpm, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_rinse_pump_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_rinse_pump_data_publish_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the rinse pump data publish interval override command Index: leahi_dialin/dd/modules/spent_chamber_fill.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/spent_chamber_fill.py (.../spent_chamber_fill.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/spent_chamber_fill.py (.../spent_chamber_fill.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -50,12 +50,52 @@ function = self._handler_spent_chamber_fill_sync) self.dd_spent_chamber_timestamp = 0 #: The timestamp of the latest message - self.execution_state = 0 #: The execution state - self.switching_period = 0 #: The switching period - self.total_spent_chamber_fill_counter = 0 #: The total spent chamber fill counter + self.execution_state = 0 + self.switching_period = 0 + self.total_spent_chamber_fill_counter = 0 self.handler_execution_times = [] + +# ============================================================ 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_period(self) -> int: + """ + The switching period + """ + return self._switching_period + + @switching_period.setter + def switching_period(self, value: int): + self._switching_period = value + + + @property + def total_spent_chamber_fill_counter(self) -> int: + """ + The total spent chamber fill counter + """ + return self._total_spent_chamber_fill_counter + + @total_spent_chamber_fill_counter.setter + def total_spent_chamber_fill_counter(self, value: int): + self._total_spent_chamber_fill_counter = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_spent_chamber_fill_data", "execution_state", "switching_period", "total_spent_chamber_fill_counter", @@ -69,16 +109,17 @@ """ start = time.perf_counter() msg_list =[] - msg_list.append(('self.execution_state', DataTypes.U32)) - msg_list.append(('self.switching_period', DataTypes.U32)) - msg_list.append(('self.total_spent_chamber_fill_counter', DataTypes.U32)) + msg_list.append((type(self).execution_state, DataTypes.U32)) + msg_list.append((type(self).switching_period, DataTypes.U32)) + msg_list.append((type(self).total_spent_chamber_fill_counter, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_spent_chamber_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_spent_chamber_fill_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the spent chamber fill data broadcast interval override command Index: leahi_dialin/dd/modules/substitution_pump.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/substitution_pump.py (.../substitution_pump.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/substitution_pump.py (.../substitution_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -22,7 +22,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common import dd_enum_repository from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgIds +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 @@ -51,7 +51,7 @@ message_id = MsgIds.MSG_ID_DD_SUBSTITUTION_PUMP_DATA.value, function = self._handler_substitution_pump_sync) - #: The substitution pump data in dictionary format + self.dd_substitution_pump_timestamp = 0 #: The timestamp of the latest message self.dd_substitution_pumps = { dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name: { dd_enum_repository.DDSubstitutionPumpAttributes.TARGET_SPEED.name: 0.0, @@ -60,9 +60,25 @@ dd_enum_repository.DDSubstitutionPumpAttributes.MEASURED_SPEED.name: 0.0, } } - self.dd_substitution_pump_timestamp = 0 #: The timestamp of the latest message self.handler_execution_times = [] + + +# ============================================================ Properties ============================================================ + @property + def dd_substitution_pumps(self) -> dict: + """ + The Substitution Pumps data + """ + return self._substitution_pumps + + @dd_substitution_pumps.setter + def dd_substitution_pumps(self, value): + self._substitution_pumps = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_rinse_pump_data", "dd_substitution_pumps", "dd_substitution_pump_timestamp"]) @@ -74,19 +90,19 @@ @return: None """ start = time.perf_counter() - substitution_pump_list = [] - substitution_pump_list.append((dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.TARGET_SPEED.name, DataTypes.F32)) - substitution_pump_list.append((dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.CURRENT_SPEED.name, DataTypes.F32)) - substitution_pump_list.append((dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.STATE.name, DataTypes.U32)) - substitution_pump_list.append((dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) + msg_list = [] + msg_list.append((self.dd_substitution_pumps, dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.TARGET_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_substitution_pumps, dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.CURRENT_SPEED.name, DataTypes.F32)) + msg_list.append((self.dd_substitution_pumps, dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.STATE.name, DataTypes.U32)) + msg_list.append((self.dd_substitution_pumps, dd_enum_repository.DDSubstitutionPumpNames.D92_PUMP.name, dd_enum_repository.DDSubstitutionPumpAttributes.MEASURED_SPEED.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.dd_substitution_pumps, - decoder_list = substitution_pump_list, - message = message) - + self.process_into_vars(decoder_list = msg_list, message = message) self.dd_substitution_pump_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + + +# ============================================================ Overrides and Requests ============================================================ def cmd_substitution_pump_data_publish_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the substitution pump data publish interval override command @@ -107,6 +123,7 @@ logger=self.logger, can_interface=self.can_interface) + def cmd_substitution_pump_set_start_stop(self, pump_id: int, command: int, speed: float) -> int: """ Constructs and sends the substitution pump start stop command @@ -130,5 +147,3 @@ override_text=str(spd), logger=self.logger, can_interface=self.can_interface) - - Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -45,8 +45,6 @@ function = self._handler_temperature_sensors_sync) self.dd_temperatures_timestamp = 0.0 #: The timestamp of the latest message - - #: The Temperature Sensors data in dictionary format self.dd_temperatures = { dd_enum_repository.DDTemperatureSensorNames.D1_TEMP.name: 0.0, dd_enum_repository.DDTemperatureSensorNames.D78_TEMP.name: 0.0, @@ -76,6 +74,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -85,40 +99,39 @@ @returns none """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) - + +# ============================================================ 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/dd/modules/ultrafiltration.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/ultrafiltration.py (.../ultrafiltration.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/ultrafiltration.py (.../ultrafiltration.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,16 +17,18 @@ # Module imports from logging import Logger import time +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.msg_defs import MsgFieldPositions +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): @@ -51,13 +53,68 @@ 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 self.handler_execution_times = [] + +# ============================================================ 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"]) @@ -70,16 +127,18 @@ """ start = time.perf_counter() msg_list =[] - 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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -27,32 +27,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 @@ -69,41 +54,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): @@ -113,80 +99,49 @@ self.handler_execution_times = [] - 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", @@ -236,61 +191,71 @@ 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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,6 +17,7 @@ # Module imports from logging import Logger import time +from typing import List # Project imports from leahi_dialin.common.constants import NO_RESET @@ -48,9 +49,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, @@ -68,6 +67,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -78,27 +93,27 @@ @return: none """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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/td_proxy.py =================================================================== diff -u -r99dfe2380283ce79c4ca62ead2ab425f74bea053 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision 99dfe2380283ce79c4ca62ead2ab425f74bea053) +++ leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -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 Dialysate Delivery Request data + """ + 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 -re7c76d620568e574df68be3bd0efb52a9b5d2845 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision e7c76d620568e574df68be3bd0efb52a9b5d2845) +++ leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -31,14 +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_defs import MsgFieldPositions 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 @@ -104,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 @@ -140,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 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 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): """ @@ -152,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 @@ -177,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 @@ -212,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 @@ -229,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 @@ -245,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 @@ -320,8 +402,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...") @@ -331,7 +413,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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -26,7 +26,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 @@ -67,6 +67,11 @@ self.handler_execution_times = [] +# ============================================================ 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"]) @@ -78,95 +83,68 @@ @return: none """ start = time.perf_counter() - 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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) - 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(0, len(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(0, len(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 @@ -220,5 +198,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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -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, float_to_bytearray @@ -49,8 +49,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, @@ -67,6 +65,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -77,24 +91,29 @@ @return: none """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -23,7 +23,7 @@ from leahi_dialin.common import fp_enum_repository, dd_enum_repository from leahi_dialin.common.fp_defs import BETA_IOFP_COND_SENSOR_OFFSET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgIds +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 @@ -55,11 +55,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, @@ -74,7 +70,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, @@ -86,6 +82,35 @@ self.handler_execution_times = [] self.handler_ro_execution_times = [] + + +# ============================================================ 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): """ @@ -96,19 +121,17 @@ @return: None """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) @@ -123,20 +146,20 @@ @return: None """ start = time.perf_counter() - 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_dict(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 self.handler_ro_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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/events.py =================================================================== diff -u -r862daa5b6357ddaba02aa7d1fb9d0952e4a16e6f -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/events.py (.../events.py) (revision 862daa5b6357ddaba02aa7d1fb9d0952e4a16e6f) +++ leahi_dialin/fp/modules/events.py (.../events.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,7 +17,8 @@ # Module imports from logging import Logger from datetime import datetime -from typing import Tuple +import time +from typing import Tuple, Union # Project imports from leahi_dialin.common import dd_enum_repository, fp_enum_repository @@ -63,7 +64,7 @@ fp_enum_repository.FPOpModes.MODE_NLEG.name: fp_enum_repository.FPNotLegalStates} # Dictionary of the sub-mode as key and the state enum class as the value - self._sub_mode_2_states = { fp_enum_repository.FPFaultStates.DD_FAULT_STATE_START.name: fp_enum_repository.FPFaultNVDataStates, + self._sub_mode_2_states = { fp_enum_repository.FPFaultStates.FP_FAULT_STATE_START.name: fp_enum_repository.FPFaultNVDataStates, fp_enum_repository.FPPreGenPermeateStates.FP_PRE_GENP_INLET_PRES_CHECK.name: fp_enum_repository.FPInletPresCheckStates, fp_enum_repository.FPPreGenPermeateStates.FP_PRE_GENP_FILTER_FLUSH.name: fp_enum_repository.FPFilterFlushStates, fp_enum_repository.FPPreGenPermeateStates.FP_PRE_GENP_PERMEATE_FLUSH.name: fp_enum_repository.FPPermeateFlushStates, @@ -79,6 +80,7 @@ for event in fp_enum_repository.FPEventList: self._event_dictionary[fp_enum_repository.FPEventList(event).name] = [] + self.handler_execution_times = [] # ============================================================ Properties ============================================================ @@ -93,6 +95,7 @@ @param message: published FP events data message @returns none """ + start = time.perf_counter() event_id = LocalVars('event_id') data_typ_1 = LocalVars('data_typ_1') data_1 = LocalVars('data_1') @@ -227,6 +230,7 @@ # Update event dictionary self._event_dictionary[event_enum.name].append(event_tuple) self.events_timestamp = timestamp + self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) @@ -290,25 +294,34 @@ return list_of_events - def _operation_status_match(self, op_mode: int, sub_mode: int=None, state:int=None, sub_state: int=None) -> Tuple[DialinEnum, DialinEnum, DialinEnum, DialinEnum]: + def _operation_status_match(self, op_mode: int, sub_mode: int=None, state:int=None, sub_state: int=None) -> Tuple[DialinEnum, Union[DialinEnum, int], Union[DialinEnum, int], Union[DialinEnum, int]]: """ Convert operation status values to enums. :param op_mode: (Integer) The operation mode value :param sub_mode: (Integer) The operation sub mode value :param state: (Integer) The operation state value :param sub_state: (Integer) The operation sub state value - :return: Returns the DialinEnum for each provied mode/state + :return: Returns the DialinEnum for each provied mode/state, or the original integer value if no enum is found """ - op_mode_enum = fp_enum_repository.TDOpModes(op_mode) + op_mode_enum = fp_enum_repository.FPOpModes(op_mode) sub_mode_enum = None state_enum = None sub_state_enum = None if sub_mode is not None: - sub_mode_enum = self._op_mode_2_sub_mode[op_mode_enum.name](sub_mode) + if op_mode_enum.name not in self._op_mode_2_sub_mode: + sub_mode_enum = sub_mode + else: + sub_mode_enum = self._op_mode_2_sub_mode[op_mode_enum.name](sub_mode) if state is not None: - state_enum = self._sub_mode_2_states[sub_mode_enum.name](state) + if sub_mode_enum.name not in self._sub_mode_2_states: + state_enum = state + else: + state_enum = self._sub_mode_2_states[sub_mode_enum.name](state) if sub_state is not None: - sub_state_enum = self._state_2_sub_states[state_enum.name](sub_state) + if state_enum.name not in self._state_2_sub_states: + sub_state_enum = sub_state + else: + sub_state_enum = self._state_2_sub_states[state_enum.name](sub_state) return op_mode_enum, sub_mode_enum, state_enum, sub_state_enum Index: leahi_dialin/fp/modules/flow_sensors.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -59,6 +59,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -69,16 +85,16 @@ """ start = time.perf_counter() 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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/levels.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/levels.py (.../levels.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/levels.py (.../levels.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -26,7 +26,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 @@ -51,14 +51,28 @@ 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 } self.handler_execution_times = [] + +# ============================================================ 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"]) @@ -70,16 +84,21 @@ @returns none """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((fp_enum_repository.FPFloaterLevelSensorNames.P25_LEVEL.name, DataTypes.U32)) + state = LocalVars('state') - self.process_into_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -50,9 +50,26 @@ 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 self.handler_execution_times = [] + + +# ============================================================ 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): """ @@ -63,14 +80,15 @@ """ start = time.perf_counter() 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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -50,8 +50,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, @@ -62,6 +60,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -72,20 +86,20 @@ @return: none """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -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, float_to_bytearray @@ -49,8 +49,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, @@ -67,6 +65,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -77,24 +91,29 @@ @return: none """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -45,8 +45,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, @@ -63,6 +61,22 @@ self.handler_execution_times = [] + +# ============================================================ 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): """ @@ -72,26 +86,26 @@ @returns none """ start = time.perf_counter() - 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_dict(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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -15,7 +15,6 @@ ############################################################################ # Module imports -import struct from logging import Logger from collections import OrderedDict import time @@ -28,26 +27,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): """ @@ -65,14 +54,14 @@ 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 = {} @@ -81,38 +70,27 @@ self.valve_states_enum[valve_name] = 0 self.valves_sensed_states[valve_name] = '' self.handler_execution_times = [] - - - @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", @@ -135,38 +113,47 @@ @return: none """ start = time.perf_counter() + 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_2.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 self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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 -re45b20cdc5d4c5dcff8cef530b173ca94cb2e422 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision e45b20cdc5d4c5dcff8cef530b173ca94cb2e422) +++ leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -44,6 +44,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/protocols/CAN.py =================================================================== diff -u -re45b20cdc5d4c5dcff8cef530b173ca94cb2e422 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/protocols/CAN.py (.../CAN.py) (revision e45b20cdc5d4c5dcff8cef530b173ca94cb2e422) +++ leahi_dialin/protocols/CAN.py (.../CAN.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -27,7 +27,9 @@ import sys from logging import Logger import struct -from ..common import MsgIds, MSG_HEADER_SIZE, ACK_NOT_REQUIRED +from leahi_dialin.common.msg_defs import ACK_NOT_REQUIRED +from leahi_dialin.common.msg_ids import MsgIds +from leahi_dialin.common.constants import MSG_HEADER_SIZE from ..utils import SingletonMeta, IntervalTimer from concurrent.futures import ThreadPoolExecutor Index: leahi_dialin/td/modules/air_pump.py =================================================================== diff -u -r3c2bc6419b5796c03a7e4943938055c4ac36c24b -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision 3c2bc6419b5796c03a7e4943938055c4ac36c24b) +++ leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -50,7 +50,6 @@ self.td_air_pump_timestamp = 0.0 #: The timestamp of the last message - #: The Air Trap Level Sensors data in dictionary format self.td_air_pump = { td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name: { td_enum_repository.TDAirPumpAttributes.STATE.name: 0, @@ -65,6 +64,22 @@ self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def td_air_pump(self) -> dict: + """ + The Air Pump data + """ + return self._td_air_pump + + @td_air_pump.setter + def td_air_pump(self, value): + self._td_air_pump = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_air_pump_data", "td_air_pump", "td_air_pump_timestamp"]) def _handler_air_pump_sync(self, message, timestamp=0.0): """ @@ -74,22 +89,21 @@ @return: None """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.STATE.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.DUTY_CYCLE.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.RPM.name, DataTypes.U32)) + msg_list =[] + msg_list.append((self.td_air_pump, td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.STATE.name, DataTypes.U32)) + msg_list.append((self.td_air_pump, td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.DUTY_CYCLE.name, DataTypes.F32)) + msg_list.append((self.td_air_pump, td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.RPM.name, DataTypes.U32)) # TODO remove after FPGA air pump speed validation - sensor_list.append((td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.FPGA_RPM.name, DataTypes.U32)) - # TODO remove after FPGA air pump speed validation - sensor_list.append((td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.SCALAR_POWER.name, DataTypes.U32)) + msg_list.append((self.td_air_pump, td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.FPGA_RPM.name, DataTypes.U32)) + msg_list.append((self.td_air_pump, td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name, td_enum_repository.TDAirPumpAttributes.SCALAR_POWER.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.td_air_pump, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_air_pump_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_air_pump_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the air pump data broadcast interval override command Index: leahi_dialin/td/modules/air_trap.py =================================================================== diff -u -rdff2704b529bfbb67b2e8c822e69e3df7d955153 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision dff2704b529bfbb67b2e8c822e69e3df7d955153) +++ leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -53,7 +53,6 @@ self.td_air_trap_timestamp = 0.0 #: The timestamp of the last message - #: The Air Trap Level Sensors data in dictionary format self.air_trap_level_sensors = { td_enum_repository.TDAirTrapLevelSensorNames.H17_LEVEL.name: { td_enum_repository.TDAirTrapLevelSensorAttributes.LEVEL.name: self.AIR_DETECTED_AT_LEVEL, @@ -65,20 +64,95 @@ } } - #: The Air Trap Valves data in dictionary format self.air_trap_valve_states = { td_enum_repository.TDAirTrapValveNames.H13_VALV.name: 0, td_enum_repository.TDAirTrapValveNames.H20_VALV.name: 0 } - self.air_control = 0 #: Is the Air Trap FW logic is active or not - self.airTrapState = 0 #: The Air Trap's State value + self.air_control = 0 + self.air_trap_state = 0 + # TODO remove after testing - self.AirPumpLowerPowerLevel = 0 - # TODO remove after testing - self.AirPumpRaisePowerLevel = 0 + self.air_pump_lower_power = 0 + self.air_pump_raise_power = 0 self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def air_trap_level_sensors(self) -> dict: + """ + The Air Trap level sensors data + """ + return self._air_trap_level_sensors + + @air_trap_level_sensors.setter + def air_trap_level_sensors(self, value): + self._air_trap_level_sensors = value + + + @property + def air_trap_valve_states(self) -> dict: + """ + The Air Trap valves data + """ + return self._air_trap_valve_states + + @air_trap_valve_states.setter + def air_trap_valve_states(self, value): + self._air_trap_valve_states = value + + + @property + 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:bool): + self._air_control = value + + + @property + def air_trap_state(self) -> int: + """ + The Air Trap state value + """ + return self._air_trap_state + + @air_trap_state.setter + def air_trap_state(self, value): + self._air_trap_state = value + + + @property + def air_pump_lower_power(self) -> dict: + """ + The Air Pump lower power value + """ + return self._air_pump_lower_power + + @air_pump_lower_power.setter + def air_pump_lower_power(self, value): + self._air_pump_lower_power = value + + + @property + def air_pump_raise_power(self) -> dict: + """ + The Air Pump raise power value + """ + return self._air_pump_raise_power + + @air_pump_raise_power.setter + def air_pump_raise_power(self, value): + self._air_pump_raise_power = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_air_trap_data", "air_trap_level_sensors", "air_trap_valve_states", @@ -93,34 +167,25 @@ @return: None """ start = time.perf_counter() - sensor_list_1 =[] - sensor_list_1.append((td_enum_repository.TDAirTrapLevelSensorNames.H17_LEVEL.name, td_enum_repository.TDAirTrapLevelSensorAttributes.LEVEL.name, DataTypes.U32)) - sensor_list_1.append((td_enum_repository.TDAirTrapLevelSensorNames.H16_LEVEL.name, td_enum_repository.TDAirTrapLevelSensorAttributes.LEVEL.name, DataTypes.U32)) - sensor_list_1.append((td_enum_repository.TDAirTrapLevelSensorNames.H17_LEVEL.name, td_enum_repository.TDAirTrapLevelSensorAttributes.RAW.name, DataTypes.U32)) - sensor_list_1.append((td_enum_repository.TDAirTrapLevelSensorNames.H16_LEVEL.name, td_enum_repository.TDAirTrapLevelSensorAttributes.RAW.name, DataTypes.U32)) - sensor_list_2 =[] - sensor_list_2.append((td_enum_repository.TDAirTrapValveNames.H13_VALV.name, DataTypes.U32)) - sensor_list_2.append((td_enum_repository.TDAirTrapValveNames.H20_VALV.name, DataTypes.U32)) msg_list =[] - msg_list.append(('self.air_control', DataTypes.U32)) - msg_list.append(('self.airTrapState', DataTypes.U32)) - msg_list.append(('self.AirPumpLowerPowerLevel', DataTypes.U32)) - msg_list.append(('self.AirPumpRaisePowerLevel', DataTypes.U32)) + msg_list.append((self.air_trap_level_sensors, td_enum_repository.TDAirPumpNames.H17_LEVEL.name, td_enum_repository.TDAirPumpAttributes.LEVEL.name, DataTypes.U32)) + msg_list.append((self.air_trap_level_sensors, td_enum_repository.TDAirPumpNames.H16_LEVEL.name, td_enum_repository.TDAirPumpAttributes.LEVEL.name, DataTypes.U32)) + msg_list.append((self.air_trap_level_sensors, td_enum_repository.TDAirPumpNames.H17_LEVEL.name, td_enum_repository.TDAirPumpAttributes.RAW.name, DataTypes.U32)) + 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.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)) - self.process_into_dict(dict_to_update = self.air_trap_level_sensors, - decoder_list = sensor_list_1, - message = message) - self.process_into_dict(dict_to_update = self.air_trap_valve_states, - decoder_list = sensor_list_2, - message = message, - start_from_byte = len(sensor_list_1) * DataTypes.U32.size()) - self.process_into_vars(decoder_list = msg_list, - message = message, - start_from_byte = (len(sensor_list_1) + len(sensor_list_2)) * DataTypes.U32.size()) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_air_trap_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_air_trap_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the air trap data broadcast interval override command Index: leahi_dialin/td/modules/alarms.py =================================================================== diff -u -r655be738c7bb307fcf3baa139acba0fb6c62ec4b -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) +++ leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,65 +17,27 @@ # Module imports from functools import partial from logging import Logger -import struct -from enum import unique import time +from typing import List, Union # Project imports -from leahi_dialin.common.alarm_defs import AlarmList +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 MsgFieldPositions +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, CanMessage, CanChannels -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.protocols.CAN import CanMessenger, CanChannels +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 -from leahi_dialin.utils.enums import DialinEnum class TDAlarms(AbstractSubSystem): """ TD interface containing alarm related commands. """ - # Alarm lamp patterns - TD_ALARM_LAMP_PATTERN_OFF = 0 - TD_ALARM_LAMP_PATTERN_OK = 1 - TD_ALARM_LAMP_PATTERN_FAULT = 2 - TD_ALARM_LAMP_PATTERN_HIGH = 3 - TD_ALARM_LAMP_PATTERN_MEDIUM = 4 - TD_ALARM_LAMP_PATTERN_LOW = 5 - TD_ALARM_LAMP_PATTERN_MANUAL = 6 - - # Alarm priority states - TD_ALARM_STATE_NONE = 0 - TD_ALARM_STATE_LOW = 1 - TD_ALARM_STATE_MEDIUM = 2 - TD_ALARM_STATE_HIGH = 3 - - # Alarm response buttons - @unique - class AlarmResponseButtons(DialinEnum): - TD_ALARM_RESPONSE_BUTTON_RESUME = 0 - TD_ALARM_RESPONSE_BUTTON_RINSEBACK = 1 - TD_ALARM_RESPONSE_BUTTON_END_TREATMENT = 2 - NUM_OF_TD_ALARM_RESPONSE_BUTTONS = 3 - AlarmResponseButtons._str_list = {} - - # Alarm status message field positions - START_POS_ALARM_STATE = CanMessage.PAYLOAD_START_INDEX - END_POS_ALARM_STATE = START_POS_ALARM_STATE + 4 - START_POS_ALARM_TOP = END_POS_ALARM_STATE - END_POS_ALARM_TOP = START_POS_ALARM_TOP + 4 - START_POS_ALARM_ESCALATES_IN = END_POS_ALARM_TOP - END_POS_ALARM_ESCALATES_IN = START_POS_ALARM_ESCALATES_IN + 4 - START_POS_ALARM_SILENCE_EXPIRES_IN = END_POS_ALARM_ESCALATES_IN - END_POS_ALARM_SILENCE_EXPIRES_IN = START_POS_ALARM_SILENCE_EXPIRES_IN + 4 - START_POS_ALARMS_FLAGS = END_POS_ALARM_SILENCE_EXPIRES_IN - END_POS_ALARMS_FLAGS = START_POS_ALARMS_FLAGS + 2 - def __init__(self, can_interface: CanMessenger, logger: Logger): """ @param can_interface: Can Messenger object @@ -121,11 +83,11 @@ self.alarm_table_timestamp = 0.0 #: The timestamp of the last Alarm Table Properties message # composite alarm status based on latest TD alarm status broadcast message - self.alarms_priority_state = 0 #: The current Top Alarm's priority value - self.alarm_top = 0 #: The current Top Alarm's value - self.alarms_silence_expires_in = 0 #: How many seconds the silence for the alarms expires in - self.alarms_escalates_in = 0 #: How many seconds the current Alarm escalates to the next priority - self.alarms_flags = 0 #: The Alarm flag's value + self.alarms_priority_state = 0 + self.alarm_top = 0 + self.alarms_silence_expires_in = 0 + self.alarms_escalates_in = 0 + self.alarms_flags = 0 self.alarm_states = [False] * 500 #: The States of all Alarms data in list format self.alarm_conditions = [False] * 500 #: The Conditions of all Alarms data in list format @@ -139,51 +101,228 @@ self.last_alarm_data_2 = 0.0 #: The last Alarm's data part 2 # alarm information - self.alarm_volume = 0 #: The Alarm's Volume level - self.alarm_audio_curr_hg = 0.0 #: The Alarm's Audio high current - self.alarm_audio_curr_lg = 0.0 #: The Alarm's Audio low current - self.alarm_backup_audio_curr = 0.0 #: The Alarm's Audio backup current - self.safety_shutdown_active = False #: The Safety Shutdown is active or not - self.ac_power_lost = False #: The AC Power is lost or not - self.alarm_table_button_blockers = [False] * self.AlarmResponseButtons.NUM_OF_TD_ALARM_RESPONSE_BUTTONS.value #: The Alarm Table's Button blocker data - self.alarm_state_button_blockers = [False] * self.AlarmResponseButtons.NUM_OF_TD_ALARM_RESPONSE_BUTTONS.value #: The Alarm State's Button blocker data + self.alarm_volume = 0 + self.alarm_audio_curr_hg = 0.0 + self.alarm_audio_curr_lg = 0.0 + self.alarm_backup_audio_curr = 0.0 + self.safety_shutdown_active = False + self.ac_power_lost = False + self.alarm_table_button_blockers = [False] * td_enum_repository.AlarmResponseButtons.NUM_OF_TD_ALARM_RESPONSE_BUTTONS.value # Alarms list - self.ui_alarm_list_accepted = True #: The Alarm List request accepted - self.ui_alarm_list_reject_reason = 0 #: The Alarm List request reject reason - self.ui_alarm_list = [] #: The UI Alarm List content + self.ui_alarm_list_accepted = True + 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 = {} #: The Alarm Table with Alarm Property details + self.alarm_table = {} self.handler_triggered_execution_times = [] self.handler_clr_execution_times = [] self.handler_info_execution_times = [] self.handler_sts_execution_times = [] self.handler_conclr_execution_times = [] self.handler_prop_execution_times = [] - - def get_active_alarms(self): + + +# ============================================================ Properties ============================================================ + @property + def alarms_priority_state(self) -> int: """ - Get the currently active alarms + The current Top Alarm's priority value """ - result = [] - for alarm in AlarmList: - if self.alarm_states[alarm.value]: - result.append(alarm) - return result + return self._alarms_priority_state - def clear_dialin_alarms(self): + @alarms_priority_state.setter + def alarms_priority_state(self, value): + self._alarms_priority_state = value + + + @property + def alarm_top(self) -> int: """ - Clears the alarms states in Dialin. + The current Top Alarm's value + """ + return self._alarm_top - @return: none + @alarm_top.setter + def alarm_top(self, value): + self._alarm_top = value + + + @property + def alarms_silence_expires_in(self) -> int: """ - for x in range(500): - self.alarm_states[x] = False + How many seconds the silence for the alarms expires in + """ + return self._alarms_silence_expires_in + @alarms_silence_expires_in.setter + def alarms_silence_expires_in(self, value): + self._alarms_silence_expires_in = value + + @property + def alarms_escalates_in(self) -> int: + """ + How many seconds the current Alarm escalates to the next priority + """ + return self._alarms_escalates_in + + @alarms_escalates_in.setter + def alarms_escalates_in(self, value): + self._alarms_escalates_in = value + + + @property + def alarms_flags(self) -> int: + """ + The Alarm flag's value + """ + return self._alarms_flags + + @alarms_flags.setter + def alarms_flags(self, value): + self._alarms_flags = value + + + @property + def alarm_volume(self) -> int: + """ + The Alarm's Volume level + """ + return self._alarm_volume + + @alarm_volume.setter + def alarm_volume(self, value): + self._alarm_volume = value + + + @property + def alarm_audio_curr_hg(self) -> float: + """ + The Alarm's Audio high current + """ + return self._alarm_audio_curr_hg + + @alarm_audio_curr_hg.setter + def alarm_audio_curr_hg(self, value): + self._alarm_audio_curr_hg = value + + + @property + def alarm_audio_curr_lg(self) -> float: + """ + The Alarm's Audio low current + """ + return self._alarm_audio_curr_lg + + @alarm_audio_curr_lg.setter + def alarm_audio_curr_lg(self, value): + self._alarm_audio_curr_lg = value + + + @property + def alarm_backup_audio_curr(self) -> float: + """ + The Alarm's Audio backup current + """ + return self._alarm_backup_audio_curr + + @alarm_backup_audio_curr.setter + def alarm_backup_audio_curr(self, value): + self._alarm_backup_audio_curr = value + + + @property + def safety_shutdown_active(self) -> bool: + """ + The Safety Shutdown is active or not + """ + return self._safety_shutdown_active + + @safety_shutdown_active.setter + def safety_shutdown_active(self, value): + self._safety_shutdown_active = value + + + @property + def ac_power_lost(self) -> bool: + """ + The AC Power is lost or not + """ + return self._ac_power_lost + + @ac_power_lost.setter + def ac_power_lost(self, value): + self._ac_power_lost = value + + + @property + def alarm_table_button_blockers(self) -> List[bool]: + """ + The Alarm Table's Button blocker data + """ + return self._alarm_table_button_blockers + + @alarm_table_button_blockers.setter + def alarm_table_button_blockers(self, value): + self._alarm_table_button_blockers = value + + + @property + def ui_alarm_list_accepted(self) -> bool: + """ + The UI Alarm List request accepted + """ + return self._ui_alarm_list_accepted + + @ui_alarm_list_accepted.setter + def ui_alarm_list_accepted(self, value): + self._ui_alarm_list_accepted = value + + + @property + 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: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._ui_alarm_list_reject_reason = RequestRejectReasons(value) + self._ui_alarm_list_reject_reason = value + + + @property + def ui_alarm_list(self) -> List[int]: + """ + The UI Alarm List content + """ + return self._ui_alarm_list + + @ui_alarm_list.setter + def ui_alarm_list(self, value): + self._ui_alarm_list = value + + + @property + def alarm_table(self) -> dict: + """ + The Alarm Table with Alarm Property details + """ + return self._alarm_table + + @alarm_table.setter + def alarm_table(self, value): + self._alarm_table = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_alarm_status_data", "alarms_priority_state", "alarm_top", "alarms_silence_expires_in", "alarms_escalates_in", "alarms_flags", "td_alarm_status_timestamp"]) @@ -197,14 +336,13 @@ """ start = time.perf_counter() msg_list = [] - msg_list.append(('self.alarms_priority_state', DataTypes.U32)) - msg_list.append(('self.alarm_top', DataTypes.U32)) - msg_list.append(('self.alarms_escalates_in', DataTypes.U32)) - msg_list.append(('self.alarms_silence_expires_in', DataTypes.U32)) - msg_list.append(('self.alarms_flags', DataTypes.U16)) + msg_list.append((type(self).alarms_priority_state, DataTypes.U32)) + msg_list.append((type(self).alarm_top, DataTypes.U32)) + msg_list.append((type(self).alarms_escalates_in, DataTypes.U32)) + msg_list.append((type(self).alarms_silence_expires_in, DataTypes.U32)) + msg_list.append((type(self).alarms_flags, DataTypes.U16)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_alarm_status_timestamp = timestamp self.handler_sts_execution_times.append(time.perf_counter() - start) @@ -220,42 +358,37 @@ @return: none """ start = time.perf_counter() - self.logger.debug("Alarm activated!") + 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') - result = {} 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.td_alarm_triggered_timestamp = timestamp self.handler_triggered_execution_times.append(time.perf_counter() - start) @@ -269,13 +402,15 @@ @return: none """ start = time.perf_counter() + alarm_id = LocalVars('alarm_id') + msg_list = [] - msg_list.append(('alarm_id', DataTypes.U32)) + msg_list.append((alarm_id, DataTypes.U32)) - result = self.process_into_vars(decoder_list = msg_list, - message = message) - self.alarm_states[result['alarm_id']] = False - self.alarm_conditions[result['alarm_id']] = False + self.process_into_vars(decoder_list = msg_list, message = message) + + self.alarm_states[alarm_id.value] = False + self.alarm_conditions[alarm_id.value] = False self.td_alarm_cleared_timestamp = timestamp self.handler_clr_execution_times.append(time.perf_counter() - start) @@ -289,20 +424,21 @@ @return: none """ start = time.perf_counter() + alarm_id = LocalVars('alarm_id') + msg_list = [] - msg_list.append(('alarm_id', DataTypes.U32)) + msg_list.append((alarm_id, DataTypes.U32)) - result = self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) - self.alarm_conditions[result['alarm_id']] = False + self.alarm_conditions[alarm_id.value] = False self.td_alarm_clr_condition_timestamp = timestamp self.handler_conclr_execution_times.append(time.perf_counter() - start) @publish(["msg_id_td_alarm_info_data", "alarm_volume", "alarm_audio_curr_hg", "alarm_audio_curr_lg", "alarm_backup_audio_curr", "safety_shutdown_active", "ac_power_lost", - "alarm_table_button_blockers", "alarm_state_button_blockers", + "alarm_table_button_blockers", "td_alarm_information_timestamp"]) def _handler_alarm_information_sync(self, message, timestamp=0.0): """ @@ -313,26 +449,20 @@ """ start = time.perf_counter() msg_list = [] - msg_list.append(('self.alarm_volume', DataTypes.U32)) - msg_list.append(('self.alarm_audio_curr_hg', DataTypes.F32)) - msg_list.append(('self.alarm_audio_curr_lg', DataTypes.F32)) - msg_list.append(('self.alarm_backup_audio_curr', DataTypes.U32)) - msg_list.append(('self.safety_shutdown_active', DataTypes.BOOL)) - msg_list.append(('self.ac_power_lost', DataTypes.BOOL)) - sensor_list = [] - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RESUME.value, DataTypes.BOOL_U08)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RINSEBACK.value, DataTypes.BOOL_U08)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value, DataTypes.BOOL_U08)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RESUME.value, DataTypes.BOOL_U08)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_RINSEBACK.value, DataTypes.BOOL_U08)) - sensor_list.append((self.AlarmResponseButtons.TD_ALARM_RESPONSE_BUTTON_END_TREATMENT.value, DataTypes.BOOL_U08)) + msg_list.append((type(self).alarm_volume, DataTypes.U32)) + msg_list.append((type(self).alarm_audio_curr_hg, DataTypes.F32)) + msg_list.append((type(self).alarm_audio_curr_lg, DataTypes.F32)) + msg_list.append((type(self).alarm_backup_audio_curr, DataTypes.U32)) + msg_list.append((type(self).safety_shutdown_active, DataTypes.BOOL)) + msg_list.append((type(self).ac_power_lost, DataTypes.BOOL)) + msg_list.append((self.alarm_table_button_blockers, td_enum_repository.AlarmResponseButtons.RESUME.value, DataTypes.BOOL_U08)) + msg_list.append((self.alarm_table_button_blockers, td_enum_repository.AlarmResponseButtons.RINSEBACK.value, DataTypes.BOOL_U08)) + msg_list.append((self.alarm_table_button_blockers, td_enum_repository.AlarmResponseButtons.END_TREATMENT.value, DataTypes.BOOL_U08)) + msg_list.append((self.alarm_table_button_blockers, td_enum_repository.AlarmResponseButtons.RESUME.value, DataTypes.BOOL_U08)) + msg_list.append((self.alarm_table_button_blockers, td_enum_repository.AlarmResponseButtons.RINSEBACK.value, DataTypes.BOOL_U08)) + msg_list.append((self.alarm_table_button_blockers, td_enum_repository.AlarmResponseButtons.END_TREATMENT.value, DataTypes.BOOL_U08)) - self.process_into_vars(decoder_list = msg_list, - message = message) - self.process_into_dict(dict_to_update = self.alarm_table_button_blockers, - decoder_list = sensor_list, - message = message, - start_from_byte = len(msg_list) * DataTypes.U32.size()) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_alarm_information_timestamp = timestamp self.handler_info_execution_times.append(time.perf_counter() - start) @@ -346,16 +476,22 @@ @param message: published TD alarm list response message @return: none """ - self.ui_alarm_list_accepted = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.ui_alarm_list_reject_reason = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + msg_list = [] + msg_list.append((type(self).ui_alarm_list_accepted, DataTypes.U32)) + msg_list.append((type(self).ui_alarm_list_reject_reason, DataTypes.U32)) + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #1 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #2 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #3 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #4 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #5 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #6 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #7 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #8 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #9 + msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #10 - i = 3 - for _ in range(0,10): - start_pos = eval(f'MsgFieldPositions.START_POS_FIELD_{i}') - end_pos = eval(f'MsgFieldPositions.END_POS_FIELD_{i}') - value = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] - self.ui_alarm_list.append(value) - i += 1 + self.process_into_vars(decoder_list = msg_list, message = message) + self.ui_alarm_list_timestamp = timestamp @@ -368,41 +504,87 @@ @return: none """ start = time.perf_counter() + priority = LocalVars('priority') + rank = LocalVars('rank') + source = LocalVars('source') + system_fault = LocalVars('system_fault') + dd_fault = LocalVars('dd_fault') + stops = LocalVars('stops') + clear_immediately = LocalVars('clear_immediately') + no_clear = LocalVars('no_clear') + no_resume = LocalVars('no_resume') + no_rinseback = LocalVars('no_rinseback') + no_end_treatment = LocalVars('no_end_treatment') + not_in_rinseback = LocalVars('not_in_rinseback') + not_in_post_treatment = LocalVars('not_in_post_treatment') + no_blood_recirc = LocalVars('no_blood_recirc') + no_dial_recirc = LocalVars('no_dial_recirc') + auto_resume = LocalVars('auto_resume') + clear_alarm_only = LocalVars('clear_alarm_only') + treatment_log = LocalVars('treatment_log') + alarm_id = LocalVars('alarm_id') + properties_list = [] - properties_list.append(('Priority', DataTypes.U16)) - properties_list.append(('Rank', DataTypes.U16)) - properties_list.append(('Source', DataTypes.U08)) - properties_list.append(('System_Fault', DataTypes.BOOL_U08)) - properties_list.append(('DD_Fault', DataTypes.BOOL_U08)) - properties_list.append(('Stops', DataTypes.BOOL_U08)) - properties_list.append(('Clear_Immediately', DataTypes.BOOL_U08)) - properties_list.append(('No_Clear', DataTypes.BOOL_U08)) - properties_list.append(('No_Resume', DataTypes.BOOL_U08)) - properties_list.append(('No_Rinseback', DataTypes.BOOL_U08)) - properties_list.append(('No_End_Treatment', DataTypes.BOOL_U08)) - properties_list.append(('Not_in_Rinseback', DataTypes.BOOL_U08)) - properties_list.append(('Not_in_Post_Treatment', DataTypes.BOOL_U08)) - properties_list.append(('No_Blood_Recirc', DataTypes.BOOL_U08)) - properties_list.append(('No_Dial_Recirc', DataTypes.BOOL_U08)) - properties_list.append(('Auto_Resume', DataTypes.BOOL_U08)) - properties_list.append(('Clear_Alarm_Only', DataTypes.BOOL_U08)) - properties_list.append(('Treatment_Log', DataTypes.BOOL_U08)) - properties_list.append(('Alarm_Id', DataTypes.U16)) + properties_list.append((priority, DataTypes.U16)) + properties_list.append((rank, DataTypes.U16)) + properties_list.append((source, DataTypes.U08)) + properties_list.append((system_fault, DataTypes.BOOL_U08)) + properties_list.append((dd_fault, DataTypes.BOOL_U08)) + properties_list.append((stops, DataTypes.BOOL_U08)) + properties_list.append((clear_immediately, DataTypes.BOOL_U08)) + properties_list.append((no_clear, DataTypes.BOOL_U08)) + properties_list.append((no_resume, DataTypes.BOOL_U08)) + properties_list.append((no_rinseback, DataTypes.BOOL_U08)) + properties_list.append((no_end_treatment, DataTypes.BOOL_U08)) + properties_list.append((not_in_rinseback, DataTypes.BOOL_U08)) + properties_list.append((not_in_post_treatment, DataTypes.BOOL_U08)) + properties_list.append((no_blood_recirc, DataTypes.BOOL_U08)) + properties_list.append((no_dial_recirc, DataTypes.BOOL_U08)) + properties_list.append((auto_resume, DataTypes.BOOL_U08)) + properties_list.append((clear_alarm_only, DataTypes.BOOL_U08)) + properties_list.append((treatment_log, DataTypes.BOOL_U08)) + properties_list.append((alarm_id, DataTypes.U16)) - result = self.process_into_vars(decoder_list = properties_list, - message = message) + self.process_into_vars(decoder_list = properties_list, message = message) # Save the result in the table - for prop in result: - if result['Alarm_Id'] not in self.alarm_table: - self.alarm_table[result['Alarm_Id']] = {} - if prop != 'Alarm_Id': - self.alarm_table[result['Alarm_Id']][prop] = result[prop] + for prop, _ in properties_list: + if alarm_id.value not in self.alarm_table: + self.alarm_table[alarm_id.value] = {} + if prop != alarm_id.name: + self.alarm_table[alarm_id.value][prop.name] = prop.value self.alarm_table_timestamp = timestamp self.handler_clr_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ 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) -> dict: + """ + Get the active alarms in Dialin. + + @return: (Dictionary) Active alarms in Dialin + """ + active_alarms = [] + for alarm in AlarmList: + if self.alarm_states[alarm.value]: + active_alarms.append(alarm) + return active_alarms + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_alarm_status_broadcast_interval_override(self, ms: int = 250, reset: int = NO_RESET): """ Constructs and sends the alarm status broadcast interval override command Index: leahi_dialin/td/modules/battery.py =================================================================== diff -u -r3dc5b82f0b6f0ad88f51e709ec969b3f62af5240 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/battery.py (.../battery.py) (revision 3dc5b82f0b6f0ad88f51e709ec969b3f62af5240) +++ leahi_dialin/td/modules/battery.py (.../battery.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -20,7 +20,7 @@ # Project imports from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgIds +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.common import td_enum_repository from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -48,13 +48,37 @@ function = self._handler_battery_sync) self.battery_broadcast_timestamp = 0.0 #: The timestamp of the last message - - #: The Battery data in dictionary format self.battery_data = { td_enum_repository.TDBatteryRegisterNames.REMAINING_CAPACITY.name: 0, + td_enum_repository.TDBatteryRegisterNames.BATTERY_STATUS.name: 0, + td_enum_repository.TDBatteryRegisterNames.BATTERY_CHARGE_STATUS.name: 0, + td_enum_repository.TDBatteryRegisterNames.BATTERY_I2C_STATUS.name: 0, + td_enum_repository.TDBatteryRegisterNames.FAULT_STATUS.name: 0, + td_enum_repository.TDBatteryRegisterNames.THERMISTOR_PCT.name: 0, + td_enum_repository.TDBatteryRegisterNames.BATTERY_VOLTAGE.name: 0, + td_enum_repository.TDBatteryRegisterNames.SYSTEM_VOLTAGE.name: 0, + td_enum_repository.TDBatteryRegisterNames.BATTERY_CURRENT.name: 0, + td_enum_repository.TDBatteryRegisterNames.RELATIVE_STATE_OF_CHARGE.name: 0, + td_enum_repository.TDBatteryRegisterNames.FULL_CHARGE_CAPACITY.name: 0, } + +# ============================================================ Properties ============================================================ + @property + def battery_data(self) -> dict: + """ + The Battery data + """ + return self._battery_data + + @battery_data.setter + def battery_data(self, value): + self._battery_data = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_battery_data", "battery_data", "battery_broadcast_timestamp"]) @@ -67,35 +91,34 @@ @return: None """ sensor_list =[] - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.REMAINING_CAPACITY.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.BATTERY_STATUS.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.BATTERY_CHARGE_STATUS.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.BATTERY_I2C_STATUS.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.FAULT_STATUS.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.THERMISTOR_PCT.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.BATTERY_VOLTAGE.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.SYSTEM_VOLTAGE.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.BATTERY_CURRENT.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.RELATIVE_STATE_OF_CHARGE.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBatteryRegisterNames.FULL_CHARGE_CAPACITY.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.REMAINING_CAPACITY.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.BATTERY_STATUS.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.BATTERY_CHARGE_STATUS.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.BATTERY_I2C_STATUS.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.FAULT_STATUS.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.THERMISTOR_PCT.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.BATTERY_VOLTAGE.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.SYSTEM_VOLTAGE.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.BATTERY_CURRENT.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.RELATIVE_STATE_OF_CHARGE.name, DataTypes.U32)) + sensor_list.append((self.battery_data, td_enum_repository.TDBatteryRegisterNames.FULL_CHARGE_CAPACITY.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.battery_data, - decoder_list = sensor_list, - message = message) - + self.process_into_dict(decoder_list = sensor_list, message = message) self.battery_broadcast_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_battery_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the battery data broadcast interval override command Constraints: Must be logged into TD. Given interval must be non-zero and a multiple of the TD 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 + :param ms: (Integer) Interval (in ms) to override with + :param reset: (Integer) 1 to reset a previous override, 0 to override + :return: (Integer) 1 if successful, zero otherwise """ return cmd_generic_broadcast_interval_override( ms = ms, @@ -107,19 +130,19 @@ can_interface = self.can_interface) - def cmd_battery_override(self, battery_id: int, power: int, reset: int = NO_RESET) -> int: + def cmd_battery_override(self, register_id: int, power: int, reset: int = NO_RESET) -> int: """ Constructs and sends the battery override command Constraints: Must be logged into TD. - Given interval must be non-zero and a multiple of the TD general task interval (50 ms). - @param power: integer - power to override the level lower to it - @param reset: integer - 1 to reset a previous override, 0 to override - @return: 1 if successful, zero otherwise + :param power: (Integer) Power to override the register with + :param register_id: (Integer) The battery register to override + :param reset: (Integer) 1 to reset a previous override, 0 to override + :return: (Integer) 1 if successful, zero otherwise """ payload = integer_to_bytearray(reset) - payload += integer_to_bytearray(battery_id) + payload += integer_to_bytearray(register_id) payload += integer_to_bytearray(power) return cmd_generic_override( @@ -131,3 +154,26 @@ override_text = f'{str(power)}', logger = self.logger, can_interface = self.can_interface) + + def cmd_i2c_status_override(self, state: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the battery I2C override command + Constraints: + Must be logged into TD. + + :param state: (Integer) The new I2C value + :param reset: (Integer) 1 to reset a previous override, 0 to override + :return: (Integer) 1 if successful, zero otherwise + """ + payload = integer_to_bytearray(reset) + payload += integer_to_bytearray(state) + + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = CanChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_BATTERY_I2C_STATUS_OVERRIDE_REQUEST, + entity_name = f'TD Battery I2C', + override_text = f'{str(state)}', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/modules/blood_flow.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -50,7 +50,6 @@ self.td_blood_flow_timestamp = 0.0 #: The timestamp of the last message - #: The TD Blood Flow data in dictionary format self.h4_motor = { td_enum_repository.TDBloodFlowMotorAttributes.SET_BLOOD_FLOW_RATE.name: 0, td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_FLOW_RATE.name: 0.0, @@ -62,10 +61,24 @@ td_enum_repository.TDBloodFlowMotorAttributes.PRES_BLOOD_FLOW_RATE.name: 0, td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_HALL_STATE.name: 0, } - self.handler_execution_times = [] +# ============================================================ Properties ============================================================ + @property + def h4_motor(self) -> dict: + """ + The Blood Flow data + """ + return self._h4_motor + + @h4_motor.setter + def h4_motor(self, value): + self._h4_motor = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_blood_pump_data", "h4_motor", "td_blood_flow_timestamp"]) def _handler_blood_flow_sync(self, message, timestamp=0.0): """ @@ -76,24 +89,25 @@ @return: none """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.SET_BLOOD_FLOW_RATE.name, DataTypes.S32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_FLOW_RATE.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_ROTOR_SPEED.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_SPEED.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_TORQUE.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.SET_RPM.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_COUNT.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.PRES_BLOOD_FLOW_RATE.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_HALL_STATE.name, DataTypes.U32)) + msg_list =[] + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.SET_BLOOD_FLOW_RATE.name, DataTypes.S32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_FLOW_RATE.name, DataTypes.F32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_ROTOR_SPEED.name, DataTypes.F32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_SPEED.name, DataTypes.F32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_TORQUE.name, DataTypes.F32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.SET_RPM.name, DataTypes.F32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_COUNT.name, DataTypes.U32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.PRES_BLOOD_FLOW_RATE.name, DataTypes.U32)) + msg_list.append((self.h4_motor, td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_HALL_STATE.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.h4_motor, - decoder_list = sensor_list, - message = message) + + self.process_into_vars(decoder_list = msg_list, message = message) self.td_blood_flow_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_blood_flow_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the measured blood flow broadcast interval override command Index: leahi_dialin/td/modules/blood_pressure.py =================================================================== diff -u -r034ef9887584984c3f261bfb748aa70994b9751b -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/blood_pressure.py (.../blood_pressure.py) (revision 034ef9887584984c3f261bfb748aa70994b9751b) +++ leahi_dialin/td/modules/blood_pressure.py (.../blood_pressure.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,10 +17,12 @@ # Module imports from logging import Logger import time +from typing import Union # Project imports from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgIds +from leahi_dialin.common.msg_defs import RequestRejectReasons +from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem from leahi_dialin.utils.base import publish @@ -52,15 +54,80 @@ self.blood_pressure_timestamp = 0.0 #: The timestamp of the latest message self.rr_timestamp = 0.0 #: The timestamp of the latest reject reason message - self.ack = 0 #: The Measure blood pressure requests acknowledgement response - self.reject_reason = 0 #: The Measure blood pressure requests reject reason - self.systolic = 0 #: The Patient's systolic blood pressure in mmHg - self.diastolic = 0 #: The Patient's diastolic blood pressure in mmHg - self.heart_rate = 0 #: The Patient's heart rate in PBM - self.handler_bp_time = [] - self.handler_bp_rr_time = [] + self.rr_ack = False + self.reject_reason = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.systolic = 0 + self.diastolic = 0 + self.heart_rate = 0 + +# ============================================================ Properties ============================================================ + @property + def rr_ack(self) -> bool: + """ + The Reject Reason message's Ack data + """ + return self._rr_ack + + @rr_ack.setter + def rr_ack(self, value): + self._rr_ack = value + + + @property + def reject_reason(self) -> RequestRejectReasons: + """ + The Reject Reason enum data + """ + return self._reject_reason + + @reject_reason.setter + def reject_reason(self, value: Union[int, RequestRejectReasons]): + if isinstance(value, int): + self._reject_reason = RequestRejectReasons(value) + else: + self._reject_reason = value + + + @property + def systolic(self) -> int: + """ + The Patient's systolic blood pressure in mmHg + """ + return self._systolic + + @systolic.setter + def systolic(self, value): + self._systolic = value + + + @property + def diastolic(self) -> int: + """ + The Patient's diastolic blood pressure in mmHg + """ + return self._diastolic + + @diastolic.setter + def diastolic(self, value): + self._diastolic = value + + + @property + def heart_rate(self) -> int: + """ + The Patient's heart rate in PBM + """ + return self._heart_rate + + @heart_rate.setter + def heart_rate(self, value): + self._heart_rate = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_blood_pressure_data", "systolic", "diastolic", "heart_rate", "blood_pressure_timestamp"]) def _handler_bp_sync(self, message, timestamp=0.0): """ @@ -71,15 +138,15 @@ """ start = time.perf_counter() msg_list =[] - msg_list.append(('self.systolic', DataTypes.U32)) - msg_list.append(('self.diastolic', DataTypes.U32)) - msg_list.append(('self.heart_rate', DataTypes.U32)) + msg_list.append((type(self).systolic, DataTypes.U32)) + msg_list.append((type(self).diastolic, DataTypes.U32)) + msg_list.append((type(self).heart_rate, DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.blood_pressure_timestamp = timestamp self.handler_bp_time.append((timestamp, message, time.perf_counter() - start)) + @publish(["msg_id_td_blood_pressure_response", "ack", "reject_reason", "rr_timestamp"]) def _handler_bp_rr_sync(self, message, timestamp=0.0): """ @@ -90,15 +157,16 @@ """ start = time.perf_counter() msg_list =[] - msg_list.append(('self.ack', DataTypes.U32)) - msg_list.append(('self.reject_reason', DataTypes.U32)) + msg_list.append((type(self).ack, DataTypes.BOOL)) + msg_list.append((type(self).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.rr_timestamp = timestamp self.handler_bp_rr_time.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_send_ui_blood_pressure_request(self) -> None: """ Constructs and sends a UI request to measure blood pressure. Index: leahi_dialin/td/modules/bubble_detector.py =================================================================== diff -u -rdff2704b529bfbb67b2e8c822e69e3df7d955153 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision dff2704b529bfbb67b2e8c822e69e3df7d955153) +++ leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -60,7 +60,6 @@ self.td_air_bubbles_timestamp = 0.0 #: The timestamp of the last message - #: The TD Bubble Detector data in dictionary format self.h18_bubble_detector = { td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name: { # Initialize status of ADV air bubble detectors to fluid (no air bubble) detected @@ -72,6 +71,22 @@ self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def h18_bubble_detector(self) -> dict: + """ + The Bubble Detector data + """ + return self._h18_bubble_detector + + @h18_bubble_detector.setter + def h18_bubble_detector(self, value): + self._h18_bubble_detector = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_bubbles_data", "h18_bubble_detector", "td_air_bubbles_timestamp"]) def _handler_air_bubbles_data_sync(self, message, timestamp=0.0): """ @@ -81,17 +96,17 @@ @return: None """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name, td_enum_repository.TDAirBubbleDetectorAttributes.STATUS.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name, td_enum_repository.TDAirBubbleDetectorAttributes.STATE.name, DataTypes.U32)) + msg_list =[] + msg_list.append((self.h18_bubble_detector, td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name, td_enum_repository.TDAirBubbleDetectorAttributes.STATUS.name, DataTypes.U32)) + msg_list.append((self.h18_bubble_detector, td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name, td_enum_repository.TDAirBubbleDetectorAttributes.STATE.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.h18_bubble_detector, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_air_bubbles_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_air_bubbles_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the air bubbles data broadcast interval override command Index: leahi_dialin/td/modules/buttons.py =================================================================== diff -u -r655be738c7bb307fcf3baa139acba0fb6c62ec4b -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/buttons.py (.../buttons.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) +++ leahi_dialin/td/modules/buttons.py (.../buttons.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -22,7 +22,6 @@ # Project imports from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgFieldPositions from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -52,19 +51,26 @@ function = self._handler_poweroff_timeout_occurred) self.td_power_off_timestamp = 0.0 #: The timestamp of the last message - self.poweroff_timeout_expired = False #: The Power Off timeout value + self.poweroff_timeout_expired = False self.handler_execution_times = [] - def reset_poweroff_timeout_expired(self): - """ - Resets the dialin poweroff timeout flag to False - @return: None +# ============================================================ Properties ============================================================ + @property + def poweroff_timeout_expired(self) -> dict: """ - self.poweroff_timeout_expired = False + The Power Off timeout value + """ + return self._poweroff_timeout_expired + @poweroff_timeout_expired.setter + def poweroff_timeout_expired(self, value): + self._poweroff_timeout_expired = value + + +# ============================================================ Handlers ============================================================ @publish(['msg_id_off_button_press_request', 'poweroff_timeout_expired', 'td_power_off_timestamp']) def _handler_poweroff_timeout_occurred(self, message, timestamp=0.0): """ @@ -78,18 +84,28 @@ self.logger.debug("Poweroff message id detected, but was the wrong length.") return - msg_list = [] - msg_list.append(('mode', DataTypes.U16)) - - result = self.process_into_vars(decoder_list = msg_list, - message = message) - - if len(result['mode']) > 0: - self.poweroff_timeout_expired = bool(result['mode'][0]) + msg_list =[] + msg_list.append((type(self).poweroff_timeout_expired, DataTypes.U16)) + + self.process_into_vars(decoder_list = msg_list, message = message) + self.poweroff_timeout_expired = bool(self.poweroff_timeout_expired) self.td_power_off_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Support ============================================================ + def reset_poweroff_timeout_expired(self): + """ + Resets the dialin poweroff timeout flag to False + + @return: None + """ + self.poweroff_timeout_expired = False + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_off_button_override(self, state: int, reset: int = NO_RESET) -> int: """ Constructs and sends the Off button override command Index: leahi_dialin/td/modules/ejector.py =================================================================== diff -u -rdff2704b529bfbb67b2e8c822e69e3df7d955153 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision dff2704b529bfbb67b2e8c822e69e3df7d955153) +++ leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -50,7 +50,6 @@ self.td_ejector_timestamp = 0 #: The timestamp of the last message - #: The TD Ejector data in dictionary format self.h5_motor = { td_enum_repository.TDEjectorNames.H5_MOTOR.name: { td_enum_repository.TDEjectorAttributes.STATE.name: td_enum_repository.TDEjectorStates.EJECTOR_STATE_INIT.value, @@ -62,6 +61,22 @@ self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def h5_motor(self) -> dict: + """ + The Ejector data + """ + return self._h5_motor + + @h5_motor.setter + def h5_motor(self, value): + self._h5_motor = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_ejector_data", "h5_motor", "td_ejector_timestamp"]) def _handler_ejector_sync(self, message, timestamp=0.0): """ @@ -71,19 +86,19 @@ @return: None """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.STATE.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.SET_SPEED.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.OPT_SNSR_RETRACT.name, DataTypes.U32)) - sensor_list.append((td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.OPT_SNSR_ENGAGE.name, DataTypes.U32)) + msg_list =[] + msg_list.append((self.h5_motor, td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.STATE.name, DataTypes.U32)) + msg_list.append((self.h5_motor, td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.SET_SPEED.name, DataTypes.F32)) + msg_list.append((self.h5_motor, td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.OPT_SNSR_RETRACT.name, DataTypes.U32)) + msg_list.append((self.h5_motor, td_enum_repository.TDEjectorNames.H5_MOTOR.name, td_enum_repository.TDEjectorAttributes.OPT_SNSR_ENGAGE.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.h5_motor, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_ejector_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_ejector_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the ejector motor data broadcast interval override command Index: leahi_dialin/td/modules/events.py =================================================================== diff -u -r862daa5b6357ddaba02aa7d1fb9d0952e4a16e6f -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/events.py (.../events.py) (revision 862daa5b6357ddaba02aa7d1fb9d0952e4a16e6f) +++ leahi_dialin/td/modules/events.py (.../events.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,8 +17,10 @@ # Module imports from logging import Logger from datetime import datetime -from typing import Tuple +import time +from typing import Tuple, Union + # Project imports from leahi_dialin.common import td_enum_repository from leahi_dialin.common.generic_defs import DataTypes @@ -72,9 +74,8 @@ td_enum_repository.TDTreatmentStates.TREATMENT_PAUSED_STATE.name:td_enum_repository.TDTreaPausedStates, td_enum_repository.TDTreatmentStates.TREATMENT_RINSEBACK_STATE.name:td_enum_repository.TDTreaRinsebackStates, td_enum_repository.TDTreatmentStates.TREATMENT_RECIRC_STATE.name:td_enum_repository.TDTreaRecircStates, - td_enum_repository.TDTreatmentStates.TREATMENT_SALINE_BOLUS_STATE.name:td_enum_repository.TDTreaBolusStates, - td_enum_repository.TDTreatmentStates.TREATMENT_HEPARIN_STATE.name:td_enum_repository.TDTreaHeparinStates, - td_enum_repository.TDTreatmentStates.TREATMENT_END_STATE.name:td_enum_repository.TDTreaEndStates } + td_enum_repository.TDTreatmentStates.TREATMENT_END_STATE.name:td_enum_repository.TDTreaEndStates, + td_enum_repository.TDTreatmentStates.TREATMENT_SALINE_BOLUS_STATE.name:td_enum_repository.TDTreaBolusStates } # Dictionary of the state as key and the sub state enum class as the value self._state_2_sub_states = {td_enum_repository.TDPreTreaSampleWaterStates.SAMPLE_WATER_STATE.name: td_enum_repository.TDPreTreaSamplWaterUserActionStates, @@ -89,6 +90,7 @@ self._event_dictionary = dict() for event in td_enum_repository.TDEventList: self._event_dictionary[td_enum_repository.TDEventList(event).name] = [] + self.handler_execution_times = [] @@ -104,6 +106,7 @@ @param message: published TD events data message @returns none """ + start = time.perf_counter() event_id = LocalVars('event_id') data_typ_1 = LocalVars('data_typ_1') data_1 = LocalVars('data_1') @@ -236,6 +239,7 @@ # Update event dictionary self._event_dictionary[event_enum.name].append(event_tuple) self.events_timestamp = timestamp + self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) @@ -299,25 +303,34 @@ return list_of_events - def _operation_status_match(self, op_mode: int, sub_mode: int=None, state:int=None, sub_state: int=None) -> Tuple[DialinEnum, DialinEnum, DialinEnum, DialinEnum]: + def _operation_status_match(self, op_mode: int, sub_mode: int=None, state:int=None, sub_state: int=None) -> Tuple[DialinEnum, Union[DialinEnum, int], Union[DialinEnum, int], Union[DialinEnum, int]]: """ Convert operation status values to enums. :param op_mode: (Integer) The operation mode value :param sub_mode: (Integer) The operation sub mode value :param state: (Integer) The operation state value :param sub_state: (Integer) The operation sub state value - :return: Returns the DialinEnum for each provied mode/state + :return: Returns the DialinEnum for each provied mode/state, or the original integer value if no enum is found """ op_mode_enum = td_enum_repository.TDOpModes(op_mode) sub_mode_enum = None state_enum = None sub_state_enum = None if sub_mode is not None: - sub_mode_enum = self._op_mode_2_sub_mode[op_mode_enum.name](sub_mode) + if op_mode_enum.name not in self._op_mode_2_sub_mode: + sub_mode_enum = sub_mode + else: + sub_mode_enum = self._op_mode_2_sub_mode[op_mode_enum.name](sub_mode) if state is not None: - state_enum = self._sub_mode_2_states[sub_mode_enum.name](state) + if sub_mode_enum.name not in self._sub_mode_2_states: + state_enum = state + else: + state_enum = self._sub_mode_2_states[sub_mode_enum.name](state) if sub_state is not None: - sub_state_enum = self._state_2_sub_states[state_enum.name](sub_state) + if state_enum.name not in self._state_2_sub_states: + sub_state_enum = sub_state + else: + sub_state_enum = self._state_2_sub_states[state_enum.name](sub_state) return op_mode_enum, sub_mode_enum, state_enum, sub_state_enum Index: leahi_dialin/td/modules/pressure_sensors.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -21,7 +21,6 @@ # Project imports from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import MsgFieldPositions 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.common import td_enum_repository @@ -52,7 +51,6 @@ self.td_pressure_timestamp = 0.0 #: The timestamp of the latest message - #: The Pressure data in dictionary format self.td_pressure_sensors = { td_enum_repository.TDPressureSensorNames.H2_PRES.name: { td_enum_repository.TDPressureSensorAttributes.PRES.name: 0.0, @@ -77,9 +75,38 @@ } } - self.pressure_limits_state = 0 #: Pressure limits state value + self.pressure_limits_state = 0 self.handler_execution_times = [] + + +# ============================================================ Properties ============================================================ + @property + def td_pressure_sensors(self) -> dict: + """ + The Pressure Sensors data + """ + return self._pressure_sensors + + @td_pressure_sensors.setter + def td_pressure_sensors(self, value): + self._pressure_sensors = value + + + @property + def pressure_limits_state(self) -> dict: + """ + Pressure limits state value + """ + return self._pressure_limits_state + + @pressure_limits_state.setter + def pressure_limits_state(self, value): + self._pressure_limits_state = value + + + +# ============================================================ Handlers ============================================================ @publish([ "msg_id_td_pressure_data", "td_pressure_sensors", @@ -99,41 +126,29 @@ @return: none """ start = time.perf_counter() - sensor_list_1 = [] - sensor_list_1.append((td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) - sensor_list_1.append((td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) - msg_list_1 = [] - msg_list_1.append(['self.pressure_limits_state', DataTypes.U32]) - sensor_list_2 = [] - sensor_list_2.append((td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name, DataTypes.S32)) - sensor_list_2.append((td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name, DataTypes.S32)) - sensor_list_2.append((td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name, DataTypes.S32)) - sensor_list_2.append((td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name, DataTypes.S32)) - sensor_list_2.append((td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name, DataTypes.F32)) - sensor_list_2.append((td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name, DataTypes.F32)) - sensor_list_2.append(('TMP_PRES', td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) - sensor_list_2.append(('TMP_PRES', td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name, DataTypes.F32)) - sensor_list_2.append(('TMP_PRES', td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name, DataTypes.F32)) - sensor_list_2.append(('TMP_PRES', td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name, DataTypes.F32)) - sensor_list_2.append((td_enum_repository.TDPressureSensorNames.H23_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) + msg_list = [] + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) + msg_list.append((type(self).pressure_limits_state, DataTypes.U32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name, DataTypes.S32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name, DataTypes.S32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name, DataTypes.S32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name, DataTypes.S32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H2_PRES.name, td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name, DataTypes.F32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H14_PRES.name, td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name, DataTypes.F32)) + msg_list.append((self.td_pressure_sensors, 'TMP_PRES', td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) + msg_list.append((self.td_pressure_sensors, 'TMP_PRES', td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name, DataTypes.F32)) + msg_list.append((self.td_pressure_sensors, 'TMP_PRES', td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name, DataTypes.F32)) + msg_list.append((self.td_pressure_sensors, 'TMP_PRES', td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name, DataTypes.F32)) + msg_list.append((self.td_pressure_sensors, td_enum_repository.TDPressureSensorNames.H23_PRES.name, td_enum_repository.TDPressureSensorAttributes.PRES.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.td_pressure_sensors, - decoder_list = sensor_list_1, - message = message) - - self.process_into_vars(decoder_list = msg_list_1, - message = message, - start_from_byte = len(sensor_list_1) * DataTypes.F32.size()) - - self.process_into_dict(dict_to_update = self.td_pressure_sensors, - decoder_list = sensor_list_2, - message = message, - start_from_byte = (len(sensor_list_1) + len(msg_list_1)) * DataTypes.F32.size()) - + self.process_into_vars(decoder_list = msg_list, message = message) self.td_pressure_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_pressure_sensors_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the measured pressure sensors broadcast interval override command Index: leahi_dialin/td/modules/records.py =================================================================== diff -u -r28a21f1f2ca4ef02e6d54bae30b738fddb7bdb3a -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/records.py (.../records.py) (revision 28a21f1f2ca4ef02e6d54bae30b738fddb7bdb3a) +++ leahi_dialin/td/modules/records.py (.../records.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -46,19 +46,19 @@ if self.can_interface is not None: self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_SYSTEM_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_system_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_SERVICE_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_service_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_CAL_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_calibration_record_pres_sensor_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_INSTITUTIONAL_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_institutional_record_sync) self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_NVM_USAGE_INFO_RECORD_RESPONSE.value, + message_id = MsgIds.MSG_ID_UNUSED.value, function = self._handler_usage_info_record_sync) self.system_records_timestamp = 0 #: The timestamp of the latest System Records message @@ -246,7 +246,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_UI_TD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'TD System Record request', override_text = '', logger = self.logger, @@ -268,7 +268,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_UI_TD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'TD Service Record request', override_text = '', logger = self.logger, @@ -290,7 +290,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_UI_TD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'TD Calibration Record request', override_text = '', logger = self.logger, @@ -312,7 +312,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_UI_TD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'TD Institutional Record request', override_text = '', logger = self.logger, @@ -334,7 +334,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_UI_TD_NVM_GET_RECORD_REQUEST, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'TD Usage Information Record request', override_text = '', logger = self.logger, @@ -375,7 +375,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_UI_TD_NVM_SET_SYSTEM_RECORD, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'New TD System Record', override_text = 'being set', logger = self.logger, @@ -409,7 +409,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_TD_NVM_SET_SERVICE_RECORD, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'New TD Service Record', override_text = 'being set', logger = self.logger, @@ -427,9 +427,9 @@ @return: 1 if successful, zero otherwise """ msg_id_pairing = { - 'PRES': MsgIds.MSG_ID_UI_TD_NVM_SET_CAL_PRESSURE_SENSOR, - 'TEMP': MsgIds.MSG_ID_UI_TD_NVM_SET_CAL_TEMP_SENSOR, - 'ACCEL': MsgIds.MSG_ID_UI_TD_NVM_SET_CAL_ACCEL_SENSOR, + 'PRES': MsgIds.MSG_ID_UNUSED, + 'TEMP': MsgIds.MSG_ID_UNUSED, + 'ACCEL': MsgIds.MSG_ID_UNUSED, } send_data = [] checked = [] @@ -580,7 +580,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_dd_ch_id, - msg_id = MsgIds.MSG_ID_UI_DD_NVM_SET_INSTITUTIONAL_RECORD, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'TD Institutional Record', override_text = 'being set', logger = self.logger, @@ -630,7 +630,7 @@ payload = payload, reset = None, channel_id = CanChannels.dialin_to_td_ch_id, - msg_id = MsgIds.MSG_ID_TD_NVM_SET_USAGE_INFO_RECORD, + msg_id = MsgIds.MSG_ID_UNUSED, entity_name = f'New TD Usage Information Record', override_text = 'being set', logger = self.logger, @@ -651,7 +651,7 @@ calibration_time: int = 0) -> int: payload_sensor = integer_to_bytearray(sensor_enum.value) payload_content = b'' - if msg_id == MsgIds.MSG_ID_UI_DD_NVM_SET_CAL_D12_PUMP: + if msg_id == MsgIds.MSG_ID_UNUSED: payload_content += float_to_bytearray(dialysate_pump_target_speed) payload_content += float_to_bytearray(forth_order_coeff) payload_content += float_to_bytearray(third_order_coeff) @@ -663,13 +663,13 @@ payload = payload_sensor + payload_content sensor_type = '' - if msg_id == MsgIds.TBD: + if msg_id == MsgIds.MSG_ID_UNUSED: sensor_type = 'Pressure Sensor' - elif msg_id == MsgIds.TBD: + elif msg_id == MsgIds.MSG_ID_UNUSED: sensor_type = 'Temperature Sensor' - elif msg_id == MsgIds.TBD: + elif msg_id == MsgIds.MSG_ID_UNUSED: sensor_type = 'Concentrate Pump' - elif msg_id == MsgIds.TBD: + elif msg_id == MsgIds.MSG_ID_UNUSED: sensor_type = 'Dialysate Pump' return cmd_generic_override(payload = payload, @@ -696,9 +696,9 @@ payload += unsigned_short_to_bytearray(self.crc16(payload)) conc_type = '' - if msg_id == MsgIds.TBD: + if msg_id == MsgIds.MSG_ID_UNUSED: conc_type = 'Acid' - elif msg_id == MsgIds.TBD: + elif msg_id == MsgIds.MSG_ID_UNUSED: conc_type = 'Bicarb' return cmd_generic_override(payload = payload, Index: leahi_dialin/td/modules/switches.py =================================================================== diff -u -rdff2704b529bfbb67b2e8c822e69e3df7d955153 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/switches.py (.../switches.py) (revision dff2704b529bfbb67b2e8c822e69e3df7d955153) +++ leahi_dialin/td/modules/switches.py (.../switches.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -22,6 +22,7 @@ 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.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.common import td_enum_repository from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -51,11 +52,26 @@ self.td_switches_timestamp = 0.0 #: The timestamp of the latest message - # The Switches data in dictionary format self.td_switches_status = { td_enum_repository.TDSwitchNames.H9_FRONT_DOOR.name: td_enum_repository.TDSwitchStatus.CLOSED.value } self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def td_switches_status(self) -> dict: + """ + The Switches data + """ + return self._switches + + @td_switches_status.setter + def td_switches_status(self, value): + self._switches = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_switches_data", "td_switches_status", "td_switches_timestamp"]) def _handler_switches_sync(self, message, timestamp=0.0): """ @@ -65,16 +81,16 @@ @return: none """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((td_enum_repository.TDSwitchNames.H9_FRONT_DOOR.name, DataTypes.U32)) + msg_list =[] + msg_list.append((self.td_switches_status, td_enum_repository.TDSwitchNames.H9_FRONT_DOOR.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.td_switches_status, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_switches_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_switches_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the TD switch data publication override command. Index: leahi_dialin/td/modules/syringe_pump.py =================================================================== diff -u -rdff2704b529bfbb67b2e8c822e69e3df7d955153 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/syringe_pump.py (.../syringe_pump.py) (revision dff2704b529bfbb67b2e8c822e69e3df7d955153) +++ leahi_dialin/td/modules/syringe_pump.py (.../syringe_pump.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -13,17 +13,21 @@ # @date (original) 12-Mar-2021 # ############################################################################ -import struct + +# Module imports from logging import Logger import time +from typing import Union +# Project imports from leahi_dialin.common.constants import RESET, NO_RESET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.td_defs import TDTreaHeparinStates, TDTreaSyringePumpStates, SyringePumpOperations -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.td_defs import TDTreaHeparinStates, TDTreaSyringePumpStates, TDSyringePumpStates +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 import DialinEnum from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -46,24 +50,205 @@ 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 #: current syringe pump state - self.heparin_state = TDTreaHeparinStates.HEPARIN_STATE_OFF.value #: current heparin state - self.syringe_pump_set_rate_ml_hr = 0.0 #: current set syringe pump rate. - self.syringe_pump_meas_rate_ml_hr = 0.0 #: current measured syringe pump rate. - self.syringe_pump_position = 0 #: current syringe pump position. - self.syringe_pump_volume_ml = 0.0 #: current syringe pump volume delivered in ml. - self.syringe_pump_safety_volume_ml = 0.0 #: current syringe pump safety volume reading - self.syringe_pump_home_v = 0.0 #: current syringe pump home voltage reading - self.syringe_pump_switch_v = 0.0 #: current syringe pump switch voltage reading - self.syringe_pump_force_v = 0.0 #: current syringe pump force voltage reading - self.syringe_pump_status = 0 #: current syringe pump status - self.syringe_pump_encoder_status = 0 #: current syringe pump encoder status - self.syringe_pump_adc_dac_status = 0 #: current syringe pump ADC & DAC status - self.syringe_pump_adc_read_counter = 0 #: current syringe pump ADC read counter + 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 + self.syringe_pump_volume_ml = 0.0 + self.syringe_pump_safety_volume_ml = 0.0 + 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 = TDSyringePumpStates.STOP + self.syringe_pump_encoder_status = 0 + self.syringe_pump_adc_dac_status = 0 + self.syringe_pump_adc_read_counter = 0 self.td_syringe_pump_timestamp = 0.0 #: The timestamp of the syringe pump message self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def syringe_pump_state(self) -> TDTreaSyringePumpStates: + """ + The Srynge Pump State + """ + return self._syringe_pump_state + + @syringe_pump_state.setter + 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) -> TDTreaHeparinStates: + """ + The Heparin State + """ + return self._heparin_state + + @heparin_state.setter + 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 Set Syringe Pump rate + """ + return self._syringe_pump_set_rate_ml_hr + + @syringe_pump_set_rate_ml_hr.setter + def syringe_pump_set_rate_ml_hr(self, value): + self._syringe_pump_set_rate_ml_hr = value + + + @property + def syringe_pump_meas_rate_ml_hr(self) -> float: + """ + The Measured Syringe Pump rate + """ + return self._syringe_pump_meas_rate_ml_hr + + @syringe_pump_meas_rate_ml_hr.setter + def syringe_pump_meas_rate_ml_hr(self, value): + self._syringe_pump_meas_rate_ml_hr = value + + + @property + def syringe_pump_position(self) -> int: + """ + The Syringe Pump position + """ + return self._syringe_pump_position + + @syringe_pump_position.setter + def syringe_pump_position(self, value): + self._syringe_pump_position = value + + + @property + def syringe_pump_volume_ml(self) -> float: + """ + The Syringe Pump volume delivered in ml + """ + return self._syringe_pump_volume_ml + + @syringe_pump_volume_ml.setter + def syringe_pump_volume_ml(self, value): + self._syringe_pump_volume_ml = value + + + @property + def syringe_pump_safety_volume_ml(self) -> float: + """ + The Syringe Pump safety volume reading + """ + return self._syringe_pump_safety_volume_ml + + @syringe_pump_safety_volume_ml.setter + def syringe_pump_safety_volume_ml(self, value): + self._syringe_pump_safety_volume_ml = value + + + @property + def syringe_pump_home_v(self) -> float: + """ + The Syringe Pump home voltage reading + """ + return self._syringe_pump_home_v + + @syringe_pump_home_v.setter + def syringe_pump_home_v(self, value): + self._syringe_pump_home_v = value + + + @property + def syringe_pump_switch_v(self) -> float: + """ + The Syringe Pump switch voltage reading + """ + return self._syringe_pump_switch_v + + @syringe_pump_switch_v.setter + def syringe_pump_switch_v(self, value): + self._syringe_pump_switch_v = value + + + @property + def syringe_pump_force_v(self) -> float: + """ + The Syringe Pump force voltage reading + """ + return self._syringe_pump_force_v + + @syringe_pump_force_v.setter + def syringe_pump_force_v(self, value): + self._syringe_pump_force_v = value + + + @property + def syringe_pump_status(self) -> TDSyringePumpStates: + """ + The Syringe Pump status + """ + return self._syringe_pump_status + + @syringe_pump_status.setter + 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 Syringe Pump encoder status + """ + return self._syringe_pump_encoder_status + + @syringe_pump_encoder_status.setter + def syringe_pump_encoder_status(self, value): + self._syringe_pump_encoder_status = value + + + @property + def syringe_pump_adc_dac_status(self) -> int: + """ + The Syringe Pump ADC & DAC status + """ + return self._syringe_pump_adc_dac_status + + @syringe_pump_adc_dac_status.setter + def syringe_pump_adc_dac_status(self, value): + self._syringe_pump_adc_dac_status = value + + + @property + def syringe_pump_adc_read_counter(self) -> int: + """ + The Syringe Pump ADC read counter + """ + return self._syringe_pump_adc_read_counter + + @syringe_pump_adc_read_counter.setter + def syringe_pump_adc_read_counter(self, value): + self._syringe_pump_adc_read_counter = value + + + +# ============================================================ Handlers ============================================================ @publish(["td_syringe_pump_timestamp", "syringe_pump_state", "syringe_pump_set_rate_ml_hr", "syringe_pump_meas_rate_ml_hr", "syringe_pump_position", @@ -82,28 +267,28 @@ """ start = time.perf_counter() msg_list = [] - msg_list.append(('self.syringe_pump_state', DataTypes.U32)) - msg_list.append(('self.heparin_state', DataTypes.U32)) - msg_list.append(('self.syringe_pump_set_rate_ml_hr', DataTypes.F32)) - msg_list.append(('self.syringe_pump_meas_rate_ml_hr', DataTypes.F32)) - msg_list.append(('self.syringe_pump_position', DataTypes.U32)) - msg_list.append(('self.syringe_pump_volume_ml', DataTypes.F32)) - msg_list.append(('self.syringe_pump_home_v', DataTypes.F32)) - msg_list.append(('self.syringe_pump_switch_v', DataTypes.F32)) - msg_list.append(('self.syringe_pump_force_v', DataTypes.F32)) - msg_list.append(('self.syringe_pump_safety_volume_ml', DataTypes.F32)) - msg_list.append(('self.syringe_pump_status', DataTypes.U08)) - msg_list.append(('self.syringe_pump_encoder_status', DataTypes.U08)) - msg_list.append(('self.syringe_pump_adc_dac_status', DataTypes.U08)) - msg_list.append(('self.syringe_pump_adc_read_counter', DataTypes.U08)) + msg_list.append((type(self).syringe_pump_state, DataTypes.U32)) + msg_list.append((type(self).heparin_state, DataTypes.U32)) + msg_list.append((type(self).syringe_pump_set_rate_ml_hr, DataTypes.F32)) + msg_list.append((type(self).syringe_pump_meas_rate_ml_hr, DataTypes.F32)) + msg_list.append((type(self).syringe_pump_position, DataTypes.U32)) + msg_list.append((type(self).syringe_pump_volume_ml, DataTypes.F32)) + msg_list.append((type(self).syringe_pump_home_v, DataTypes.F32)) + msg_list.append((type(self).syringe_pump_switch_v, DataTypes.F32)) + msg_list.append((type(self).syringe_pump_force_v, DataTypes.F32)) + msg_list.append((type(self).syringe_pump_safety_volume_ml, DataTypes.F32)) + msg_list.append((type(self).syringe_pump_status, DataTypes.U08)) + msg_list.append((type(self).syringe_pump_encoder_status, DataTypes.U08)) + msg_list.append((type(self).syringe_pump_adc_dac_status, DataTypes.U08)) + msg_list.append((type(self).syringe_pump_adc_read_counter, DataTypes.U08)) - self.process_into_vars(decoder_list = msg_list, - message = message) - + self.process_into_vars(decoder_list = msg_list, message = message) self.td_syringe_pump_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) - def cmd_syringe_pump_operation(self, operation: int = SyringePumpOperations.SYRINGE_PUMP_OP_STOP.value, + +# ============================================================ Overrides and Requests ============================================================ + def cmd_syringe_pump_operation(self, operation: int = TDSyringePumpStates.STOP.value, rate: float = 0.0, volume: float = 0.0) -> int: """ Index: leahi_dialin/td/modules/temperature_sensors.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -22,6 +22,7 @@ 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.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.common import td_enum_repository from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -53,9 +54,24 @@ # The Temperature data in dictionary format self.td_temperatures_status = { td_enum_repository.TDTemperatureSensorNames.H23_TEMP.name: 0.0 } self.handler_execution_times = [] - + +# ============================================================ Properties ============================================================ + @property + def td_temperatures_status(self) -> dict: + """ + The Temperature Sensors data + """ + return self._temperatures + + @td_temperatures_status.setter + def td_temperatures_status(self, value): + self._temperatures = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_temperature_data", "td_temperatures_status", "td_temperature_timestamp" @@ -69,16 +85,16 @@ @return: none """ start = time.perf_counter() - sensor_list =[] - sensor_list.append((td_enum_repository.TDTemperatureSensorNames.H23_TEMP.name, DataTypes.F32)) + msg_list =[] + msg_list.append((self.td_temperatures_status, td_enum_repository.TDTemperatureSensorNames.H23_TEMP.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.td_temperatures_status, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_temperature_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_temperature_sensors_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the measured temperature sensors broadcast interval override command Index: leahi_dialin/td/modules/treatment.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -22,6 +22,7 @@ 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.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.common import td_enum_repository from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -69,70 +70,158 @@ function = self._handler_resp_treatment_parameters_sync) # Treatment param ranges data - self.min_tx_time = 0 #: Minimum Treatment time - self.max_tx_time = 0 #: Maximum Treatment time - self.min_uf_volume = 0.0 #: Minimum Ultrafiltration volume - self.max_uf_volume = 0.0 #: Maximum Ultrafiltration volume - self.min_dial_rate = 0 #: Minimum Dialysate rate - self.max_dial_rate = 0 #: Maximum Dialysate rate self.tx_params_timestamp = 0 #: The timestamp of the latest Treatment Parameters message + self.treatment_param_ranges = { + 'min_tx_time': 0, # The Minimum Treatment time + 'max_tx_time': 0, # The Maximum Treatment time + 'min_uf_volume': 0.0, # The Minimum Ultrafiltration volume + 'max_uf_volume': 0.0, # The Maximum Ultrafiltration volume + 'min_dial_rate': 0, # The Minimum Dialysate rate + 'max_dial_rate': 0 # The Maximum Dialysate rate + } # Saline Bolus data - self.tgt_saline_volume = 0 #: Target Saline Bolus volume in mL - self.cum_saline_volume = 0.0 #: Cum Saline Bolus volume in mL - self.bol_saline_volume = 0.0 #: Bol Saline Bolus volume in mL - self.saline_bolus_state = 0 #: The State of the Saline Bolus self.saline_bolus_timestamp = 0 #: The timestamp of the latest Saline Bolus message + self.saline_bolus = { + 'tgt_saline_volume': 0, # Target Saline Bolus volume in mL + 'cum_saline_volume': 0.0, # Cum Saline Bolus volume in mL + 'bol_saline_volume': 0.0, # Bol Saline Bolus volume in mL + 'saline_bolus_state': 0 # The State of the Saline Bolus + } - # UF data - self.set_uf_volume = 0.0 #: The Ultrafiltration volume in L - self.tgt_uf_rate = 0.0 #: The Ultrafiltration rate in L/hr - self.uf_volume_delivered = 0.0 #: How much was delivered during Ultrafiltration in L - self.uf_state = 0 #: The State of the Ultrafiltration + # Saline Bolus data self.uf_timestamp = 0 #: The timestamp of the latest Ultrafiltration message + self.ultrafiltration = { + 'set_uf_volume': 0.0, # The Ultrafiltration volume in L + 'tgt_uf_rate': 0.0, # The Ultrafiltration rate in L/hr + 'uf_volume_delivered': 0.0, # How much was delivered during Ultrafiltration in L + 'uf_state': 0 # The State of the Ultrafiltration + } # Treatment Time Data - self.tx_time_prescribed = 0 #: Total Treatment duration - self.tx_time_elapsed = 0 #: How much time is elapsed in the Treatment - self.tx_time_remaining = 0 #: How much time is remaining from the Treatment self.tx_time_timestamp = 0 #: The timestamp of the latest Treatment message + self.treatment_times ={ + 'tx_time_prescribed': 0, # Total Treatment duration + 'tx_time_elapsed': 0, # How much time is elapsed in the Treatment + 'tx_time_remaining': 0 # How much time is remaining from the Treatment + } # Treatment State Data - self.tx_sub_mode = 0 #: The Treatment Operation Sub-Mode - self.blood_prime_state = 0 #: The Blood Prime Operation Sub-Mode - self.dialysis_state = 0 #: The Dialysis Operation Sub-Mode - self.isolated_uf_state = 0 #: The Isolated Ultrafiltration Operation Sub-Mode - self.tx_stop_state = 0 #: The Treatment Stop Operation Sub-Mode - self.rinseback_state = 0 #: The Rinsback Operation Sub-Mode - self.tx_recirc_state = 0 #: The Recirculation Operation Sub-Mode - self.tx_end_state = 0 #: The Treatment End Operation Sub-Mode self.tx_state_timestamp = 0 #: The timestamp of the latest Treatment State message + self.treatment_states = { + 'tx_sub_mode': 0, # The Treatment Operation Sub-Mode + 'blood_prime_state': 0, # The Blood Prime Operation Sub-Mode + 'dialysis_state': 0, # The Dialysis Operation Sub-Mode + 'isolated_uf_state': 0, # The Isolated Ultrafiltration Operation Sub-Mode + 'tx_stop_state': 0, # The Treatment Stop Operation Sub-Mode + 'rinseback_state': 0, # The Rinsback Operation Sub-Mode + 'tx_recirc_state': 0, # The Recirculation Operation Sub-Mode + 'tx_end_state': 0 # The Treatment End Operation Sub-Mode + } # Treatment Parameters Data. Most recent response. - self.blood_flow_rate = 0 #: The Blood flow rate - self.dialysate_flow_rate = 0 #: The Dialysate flow rate - self.tx_duration = 0 #: The Treatment duration - self.saline_bolus_volume = 0 #: The Saline Bolus volume - self.hep_stop_time = 0 #: The Heparin stop time - self.hep_time = 0 #: The Heparin start time - self.acid_con = 0 #: The selected Acid concentrate's option index - self.bicarb_con = 0 #: The selected Bicarb concentrate's option index - self.dialyzer_type = 0 #: The selected Dialyser option index - self.bp_interval = 0 #: The Body Pulse interval - self.rb_flow_rate = 0 #: The RB flow rate - self.rb_volume = 0 #: The RB volume - self.art_pressure_window = 0 #: The Artery pressure window duration - self.venous_pressure_window = 0 #: The Venous pressure window duration - self.venous_asymm_window = 0 #: The Venous asymmetric window duration - self.tmp_limit_window = 0 #: The Transmembrane limit window duration - self.dialysate_temp = 0.0 #: The Dialysate temperature - self.hep_dispense_rate = 0.0 #: The Heparin dispense rate - self.hep_bolus_vol = 0.0 #: The Heparin bolus volume - self.uf_vol = 0.0 #: The Ultrafiltration volume self.tx_param_req_timestamp = 0 #: The timestamp of the latest Treatment Parameters Request message self.handler_execution_times = [] + self.treatment_paramters = { + 'blood_flow_rate': 0, # The Blood flow rate + 'dialysate_flow_rate': 0, # The Dialysate flow rate + 'tx_duration': 0, # The Treatment duration + 'saline_bolus_volume': 0, # The Saline Bolus volume + 'hep_stop_time': 0, # The Heparin stop time + 'hep_time': 0, # The Heparin start time + 'acid_con': 0, # The selected Acid concentrate's option index + 'bicarb_con': 0, # The selected Bicarb concentrate's option index + 'dialyzer_type': 0, # The selected Dialyser option index + 'bp_interval': 0, # The Body Pulse interval + 'rb_flow_rate': 0, # The RB flow rate + 'rb_volume': 0, # The RB volume + 'art_pressure_window': 0, # The Artery pressure window duration + 'venous_pressure_window': 0, # The Venous pressure window duration + 'venous_asymm_window': 0, # The Venous asymmetric window duration + 'tmp_limit_window': 0, # The Transmembrane limit window duration + 'dialysate_temp': 0, # The Dialysate temperature + 'hep_dispense_rate': 0, # The Heparin dispense rate + 'hep_bolus_vol': 0, # The Heparin bolus volume + 'uf_vol': 0 # The Ultrafiltration volume + } + +# ============================================================ Properties ============================================================ + @property + def treatment_param_ranges(self) -> dict: + """ + The Treatment Parameter limits + """ + return self._min_tx_time + + @treatment_param_ranges.setter + def treatment_param_ranges(self, value): + self._min_tx_time = value + + + @property + def saline_bolus(self) -> dict: + """ + The Saline Bolus data + """ + return self._saline_bolus + + @saline_bolus.setter + def saline_bolus(self, value): + self._saline_bolus = value + + + @property + def ultrafiltration(self) -> int: + """ + The Ultrafiltration data + """ + return self._ultrafiltration + + @ultrafiltration.setter + def ultrafiltration(self, value): + self._ultrafiltration = value + + + @property + def treatment_times(self) -> int: + """ + The Treatment times + """ + return self._treatment_times + + @treatment_times.setter + def treatment_times(self, value): + self._treatment_times = value + + + @property + def treatment_states(self) -> int: + """ + The Treatment states + """ + return self._treatment_states + + @treatment_states.setter + def treatment_states(self, value): + self._treatment_states = value + + + @property + def treatment_paramters(self) -> int: + """ + The Treatment Parameters + """ + return self._treatment_paramters + + @treatment_paramters.setter + def treatment_paramters(self, value): + self._treatment_paramters = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_treatment_param_ranges", "min_tx_time","max_tx_time","min_uf_volume","max_uf_volume", "min_dial_rate","max_dial_rate","tx_params_timestamp"]) def _handler_treatment_param_ranges_sync(self, message, timestamp=0.0): @@ -144,15 +233,14 @@ """ start = time.perf_counter() msg_list = [] - msg_list.append(['self.min_tx_time', DataTypes.U32]) - msg_list.append(['self.max_tx_time', DataTypes.U32]) - msg_list.append(['self.min_uf_volume', DataTypes.F32]) - msg_list.append(['self.max_uf_volume', DataTypes.F32]) - msg_list.append(['self.min_dial_rate', DataTypes.U32]) - msg_list.append(['self.max_dial_rate', DataTypes.U32]) + msg_list.append((self.treatment_param_ranges, 'min_tx_time', DataTypes.U32)) + msg_list.append((self.treatment_param_ranges, 'max_tx_time', DataTypes.U32)) + msg_list.append((self.treatment_param_ranges, 'min_uf_volume', DataTypes.F32)) + msg_list.append((self.treatment_param_ranges, 'max_uf_volume', DataTypes.F32)) + msg_list.append((self.treatment_param_ranges, 'min_dial_rate', DataTypes.U32)) + msg_list.append((self.treatment_param_ranges, 'max_dial_rate', 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_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) @@ -167,13 +255,12 @@ @return: none """ msg_list = [] - msg_list.append(['self.tgt_saline_volume', DataTypes.U32]) - msg_list.append(['self.cum_saline_volume', DataTypes.F32]) - msg_list.append(['self.bol_saline_volume', DataTypes.F32]) - msg_list.append(['self.saline_bolus_state', DataTypes.U32]) + msg_list.append((self.saline_bolus, 'tgt_saline_volume', DataTypes.U32)) + msg_list.append((self.saline_bolus, 'cum_saline_volume', DataTypes.F32)) + msg_list.append((self.saline_bolus, 'bol_saline_volume', DataTypes.F32)) + msg_list.append((self.saline_bolus, 'saline_bolus_state', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.saline_bolus_timestamp = timestamp @@ -187,13 +274,12 @@ @return: none """ msg_list = [] - msg_list.append(['self.set_uf_volume', DataTypes.F32]) - msg_list.append(['self.tgt_uf_rate', DataTypes.F32]) - msg_list.append(['self.uf_volume_delivered', DataTypes.F32]) - msg_list.append(['self.uf_state', DataTypes.U32]) + msg_list.append((self.ultrafiltration, 'set_uf_volume', DataTypes.F32)) + msg_list.append((self.ultrafiltration, 'tgt_uf_rate', DataTypes.F32)) + msg_list.append((self.ultrafiltration, 'uf_volume_delivered', DataTypes.F32)) + msg_list.append((self.ultrafiltration, 'uf_state', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.uf_timestamp = timestamp @@ -207,12 +293,11 @@ @return: none """ msg_list = [] - msg_list.append(['self.tx_time_prescribed', DataTypes.U32]) - msg_list.append(['self.tx_time_elapsed', DataTypes.U32]) - msg_list.append(['self.tx_time_remaining', DataTypes.U32]) + msg_list.append((self.treatment_times, 'tx_time_prescribed', DataTypes.U32)) + msg_list.append((self.treatment_times, 'tx_time_elapsed', DataTypes.U32)) + msg_list.append((self.treatment_times, 'tx_time_remaining', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.tx_time_timestamp = timestamp @@ -226,17 +311,16 @@ @return: none """ msg_list = [] - msg_list.append(['self.tx_sub_mode', DataTypes.U32]) - msg_list.append(['self.blood_prime_state', DataTypes.U32]) - msg_list.append(['self.dialysis_state', DataTypes.U32]) - msg_list.append(['self.isolated_uf_state', DataTypes.U32]) - msg_list.append(['self.tx_stop_state', DataTypes.U32]) - msg_list.append(['self.rinseback_state', DataTypes.U32]) - msg_list.append(['self.tx_recirc_state', DataTypes.U32]) - msg_list.append(['self.tx_end_state', DataTypes.U32]) + msg_list.append((self.treatment_states, 'tx_sub_mode', DataTypes.U32)) + msg_list.append((self.treatment_states, 'blood_prime_state', DataTypes.U32)) + msg_list.append((self.treatment_states, 'dialysis_state', DataTypes.U32)) + msg_list.append((self.treatment_states, 'isolated_uf_state', DataTypes.U32)) + msg_list.append((self.treatment_states, 'tx_stop_state', DataTypes.U32)) + msg_list.append((self.treatment_states, 'rinseback_state', DataTypes.U32)) + msg_list.append((self.treatment_states, 'tx_recirc_state', DataTypes.U32)) + msg_list.append((self.treatment_states, 'tx_end_state', DataTypes.U32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.tx_state_timestamp = timestamp @@ -253,32 +337,33 @@ @return: none """ msg_list = [] - msg_list.append(['self.blood_flow_rate', DataTypes.U32]) - msg_list.append(['self.dialysate_flow_rate', DataTypes.U32]) - msg_list.append(['self.tx_duration', DataTypes.U32]) - msg_list.append(['self.saline_bolus_volume', DataTypes.U32]) - msg_list.append(['self.hep_stop_time', DataTypes.U32]) - msg_list.append(['self.hep_time', DataTypes.U32]) - msg_list.append(['self.acid_con', DataTypes.U32]) - msg_list.append(['self.bicarb_con', DataTypes.U32]) - msg_list.append(['self.dialyzer_type', DataTypes.U32]) - msg_list.append(['self.bp_interval', DataTypes.U32]) - msg_list.append(['self.rb_flow_rate', DataTypes.U32]) - msg_list.append(['self.rb_volume', DataTypes.U32]) - msg_list.append(['self.art_pressure_window', DataTypes.U32]) - msg_list.append(['self.venous_pressure_window', DataTypes.U32]) - msg_list.append(['self.venous_asymm_window', DataTypes.U32]) - msg_list.append(['self.tmp_limit_window', DataTypes.U32]) - msg_list.append(['self.dialysate_temp', DataTypes.F32]) - msg_list.append(['self.hep_dispense_rate', DataTypes.F32]) - msg_list.append(['self.hep_bolus_vol', DataTypes.F32]) - msg_list.append(['self.uf_vol', DataTypes.F32]) + msg_list.append((self.treatment_paramters, 'blood_flow_rate', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'dialysate_flow_rate', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'tx_duration', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'saline_bolus_volume', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'hep_stop_time', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'hep_time', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'acid_con', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'bicarb_con', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'dialyzer_type', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'bp_interval', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'rb_flow_rate', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'rb_volume', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'art_pressure_window', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'venous_pressure_window', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'venous_asymm_window', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'tmp_limit_window', DataTypes.U32)) + msg_list.append((self.treatment_paramters, 'dialysate_temp', DataTypes.F32)) + msg_list.append((self.treatment_paramters, 'hep_dispense_rate', DataTypes.F32)) + msg_list.append((self.treatment_paramters, 'hep_bolus_vol', DataTypes.F32)) + msg_list.append((self.treatment_paramters, 'uf_vol', DataTypes.F32)) - self.process_into_vars(decoder_list = msg_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.tx_param_req_timestamp = timestamp + +# ============================================================ Overrides and Requests ============================================================ def cmd_set_treatment_parameter(self, tx_param_id: int = 0, tx_param_value = 0 ): """ Constructs and sends set treatment parameter command to the TD. Index: leahi_dialin/td/modules/valves.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/valves.py (.../valves.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/valves.py (.../valves.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -25,7 +25,7 @@ from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.common import td_enum_repository 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 @@ -53,12 +53,27 @@ self.td_valves_timestamp = 0.0 #: The timestamp of the latest message - # The Valves data in dictionary format self.valves_status = {td_enum_repository.TDValveNames.H1_VALV.name: {}, td_enum_repository.TDValveNames.H19_VALV.name: {}} self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def valves_status(self) -> dict: + """ + The Valves data + """ + return self._valves + + @valves_status.setter + def valves_status(self, value): + self._valves = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_valves_data", "valves_status", "td_valves_timestamp"]) def _handler_valves_sync(self, message: dict, timestamp=0.0) -> None: """ @@ -69,33 +84,54 @@ @returns none """ start = time.perf_counter() + valve_id = LocalVars('valve_id') + state = LocalVars('state') + pos_id = LocalVars('pos_id') + pos_cnt = LocalVars('pos_cnt') + cmd = LocalVars('cmd') + pos_a = LocalVars('pos_a') + pos_b = LocalVars('pos_b') + pos_c = LocalVars('pos_c') + pos_d = LocalVars('pos_d') + max_homing_enc = LocalVars('max_homing_enc') + msg_list = [] - msg_list.append(('Valve', DataTypes.U32)) - msg_list.append(('State', DataTypes.U32)) - msg_list.append(('PosID', DataTypes.U32)) - msg_list.append(('PosCnt', DataTypes.S16)) - msg_list.append(('Cmd', DataTypes.S16)) - msg_list.append(('PosA', DataTypes.S16)) - msg_list.append(('PosB', DataTypes.S16)) - msg_list.append(('PosC', DataTypes.S16)) - msg_list.append(('PosD', DataTypes.S16)) - msg_list.append(('Max_homing_enc', DataTypes.S16)) + msg_list.append((valve_id, DataTypes.U32)) + msg_list.append((state, DataTypes.U32)) + msg_list.append((pos_id, DataTypes.U32)) + msg_list.append((pos_cnt, DataTypes.S16)) + msg_list.append((cmd, DataTypes.S16)) + msg_list.append((pos_a, DataTypes.S16)) + msg_list.append((pos_b, DataTypes.S16)) + msg_list.append((pos_c, DataTypes.S16)) + msg_list.append((pos_d, DataTypes.S16)) + msg_list.append((max_homing_enc, DataTypes.S16)) - result = self.process_into_vars(decoder_list = msg_list, - message = message) + result = self.process_into_vars(decoder_list = msg_list, message = message) # To make sure values of the enums are not out of range - if td_enum_repository.TDValveNames.has_value(result['Valve']) and td_enum_repository.TDValvePositions.has_value(result['PosID']) and td_enum_repository.TDValveStates.has_value(result['State']): + if td_enum_repository.TDValveNames.has_value(valve_id.value) and td_enum_repository.TDValvePositions.has_value(pos_id.value) and td_enum_repository.TDValveStates.has_value(state.value): # Updating fields - result['Valve'] = td_enum_repository.TDValveNames(result['Valve']).name - result['State'] = td_enum_repository.TDValveStates(result['State']).name - result['PosID'] = td_enum_repository.TDValvePositions(result['PosID']).name + valve_id = td_enum_repository.TDValveNames(valve_id.value).name + state = td_enum_repository.TDValveStates(state.value).name + pos_id = td_enum_repository.TDValvePositions(pos_id.value).name # Update the valves dictionary - self.valves_status[result['Valve']] = result + self.valves_status[valve_id.value][td_enum_repository.TDValveNames(valve_id.value).name] = valve_id.value + self.valves_status[valve_id.value][td_enum_repository.TDValveStates(state.value).name] = state.value + self.valves_status[valve_id.value][td_enum_repository.TDValvePositions(pos_id.value).name] = pos_id.value + self.valves_status[valve_id.value]['PosCnt'] = pos_cnt.value + self.valves_status[valve_id.value]['Cmd'] = cmd.value + self.valves_status[valve_id.value]['PosA'] = pos_a.value + self.valves_status[valve_id.value]['PosB'] = pos_b.value + self.valves_status[valve_id.value]['PosC'] = pos_c.value + self.valves_status[valve_id.value]['PosD'] = pos_d.value + self.valves_status[valve_id.value]['MaxHomingEnc'] = max_homing_enc.value self.td_valves_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_valves_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends broadcast time interval Index: leahi_dialin/td/modules/voltages.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -17,6 +17,7 @@ # Module imports from logging import Logger import time +from typing import List # Project imports from leahi_dialin.common.constants import NO_RESET @@ -50,11 +51,25 @@ self.td_voltages_timestamp = 0.0 #: The timestamp of the latest message - #: The Voltage data in list format self.monitored_voltages = [0.0] * td_enum_repository.TDMonitoredVoltages.NUM_OF_MONITORED_VOLTAGE_LINES.value - self.handler_execution_times = [] + +# ============================================================ Properties ============================================================ + @property + def monitored_voltages(self) -> List[float]: + """ + The Voltages data + """ + return self._monitored_voltages + + @monitored_voltages.setter + def monitored_voltages(self, value: float): + self._monitored_voltages = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_voltages_data", "monitored_voltages", "td_voltages_timestamp"]) def _handler_monitored_voltages_sync(self, message, timestamp=0.0): """ @@ -65,26 +80,26 @@ @return: none """ start = time.perf_counter() - sensor_list = [] - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_1_2V.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_3_3V.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_5V_SENSORS.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_24V.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_24V_REGEN.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_REF_V.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_PBA_REF_V.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.name, DataTypes.F32)) - sensor_list.append((td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.name, DataTypes.F32)) + msg_list = [] + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_1_2V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_3_3V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_5V_SENSORS.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_24V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_24V_REGEN.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_REF_V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_PBA_REF_V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.name, DataTypes.F32)) + msg_list.append((self.monitored_voltages, td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.monitored_voltages, - decoder_list = sensor_list, - message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_voltages_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) + +# ============================================================ Overrides and Requests ============================================================ def cmd_monitored_voltages_broadcast_interval_override(self, ms: int = 1000, reset: int = NO_RESET) -> int: """ Constructs and sends the monitored TD voltages broadcast interval override command Index: leahi_dialin/td/proxies/ui_proxy.py =================================================================== diff -u -r655be738c7bb307fcf3baa139acba0fb6c62ec4b -r6caa49d072aceb2655d605de5d2eea52ab1a8911 --- leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) +++ leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 6caa49d072aceb2655d605de5d2eea52ab1a8911) @@ -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_defs import RequestRejectReasons from leahi_dialin.common.msg_ids import MsgIds @@ -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,