Index: leahi_dialin/common/msg_defs.py =================================================================== diff -u -r775f2d7ca9a4d1c86c02bc27130f8765dc4156ad -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/common/msg_defs.py (.../msg_defs.py) (revision 775f2d7ca9a4d1c86c02bc27130f8765dc4156ad) +++ leahi_dialin/common/msg_defs.py (.../msg_defs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -15,9 +15,8 @@ ############################################################################ from enum import unique from ..utils.enums import DialinEnum -from .msg_ids import MsgIds -from .constants import MSG_HEADER_SIZE + ACK_NOT_REQUIRED = [ ] @@ -72,153 +71,3 @@ REQUEST_REJECT_REASON_RO_ONLY_MODE_INVALID_PAYLOAD_LENGTH = 46 REQUEST_REJECT_REASON_TREATMENT_CANNOT_BE_RESUMED = 47 RequestRejectReasons._str_list = {} - - -class MsgFieldPositions: - # Generic response msg field byte positions (where 32-bit data fields are used) - START_POS_FIELD_1 = MSG_HEADER_SIZE # Hardcoded for now to avoid cyclic import issue. See protocols.CAN.CanMessage class - END_POS_FIELD_1 = START_POS_FIELD_1 + 4 - START_POS_FIELD_2 = END_POS_FIELD_1 - END_POS_FIELD_2 = START_POS_FIELD_2 + 4 - START_POS_FIELD_3 = END_POS_FIELD_2 - END_POS_FIELD_3 = START_POS_FIELD_3 + 4 - START_POS_FIELD_4 = END_POS_FIELD_3 - END_POS_FIELD_4 = START_POS_FIELD_4 + 4 - START_POS_FIELD_5 = END_POS_FIELD_4 - END_POS_FIELD_5 = START_POS_FIELD_5 + 4 - START_POS_FIELD_6 = END_POS_FIELD_5 - END_POS_FIELD_6 = START_POS_FIELD_6 + 4 - START_POS_FIELD_7 = END_POS_FIELD_6 - END_POS_FIELD_7 = START_POS_FIELD_7 + 4 - START_POS_FIELD_8 = END_POS_FIELD_7 - END_POS_FIELD_8 = START_POS_FIELD_8 + 4 - START_POS_FIELD_9 = END_POS_FIELD_8 - END_POS_FIELD_9 = START_POS_FIELD_9 + 4 - START_POS_FIELD_10 = END_POS_FIELD_9 - END_POS_FIELD_10 = START_POS_FIELD_10 + 4 - START_POS_FIELD_11 = END_POS_FIELD_10 - END_POS_FIELD_11 = START_POS_FIELD_11 + 4 - START_POS_FIELD_12 = END_POS_FIELD_11 - END_POS_FIELD_12 = START_POS_FIELD_12 + 4 - START_POS_FIELD_13 = END_POS_FIELD_12 - END_POS_FIELD_13 = START_POS_FIELD_13 + 4 - START_POS_FIELD_14 = END_POS_FIELD_13 - END_POS_FIELD_14 = START_POS_FIELD_14 + 4 - START_POS_FIELD_15 = END_POS_FIELD_14 - END_POS_FIELD_15 = START_POS_FIELD_15 + 4 - START_POS_FIELD_16 = END_POS_FIELD_15 - END_POS_FIELD_16 = START_POS_FIELD_16 + 4 - START_POS_FIELD_17 = END_POS_FIELD_16 - END_POS_FIELD_17 = START_POS_FIELD_17 + 4 - START_POS_FIELD_18 = END_POS_FIELD_17 - END_POS_FIELD_18 = START_POS_FIELD_18 + 4 - START_POS_FIELD_19 = END_POS_FIELD_18 - END_POS_FIELD_19 = START_POS_FIELD_19 + 4 - START_POS_FIELD_20 = END_POS_FIELD_19 - END_POS_FIELD_20 = START_POS_FIELD_20 + 4 - START_POS_FIELD_21 = END_POS_FIELD_20 - END_POS_FIELD_21 = START_POS_FIELD_21 + 4 - START_POS_FIELD_22 = END_POS_FIELD_21 - END_POS_FIELD_22 = START_POS_FIELD_22 + 4 - START_POS_FIELD_23 = END_POS_FIELD_22 - END_POS_FIELD_23 = START_POS_FIELD_23 + 4 - START_POS_FIELD_24 = END_POS_FIELD_23 - END_POS_FIELD_24 = START_POS_FIELD_24 + 4 - START_POS_FIELD_25 = END_POS_FIELD_24 - END_POS_FIELD_25 = START_POS_FIELD_25 + 4 - START_POS_FIELD_26 = END_POS_FIELD_25 - END_POS_FIELD_26 = START_POS_FIELD_26 + 4 - START_POS_FIELD_27 = END_POS_FIELD_26 - END_POS_FIELD_27 = START_POS_FIELD_27 + 4 - START_POS_FIELD_28 = END_POS_FIELD_27 - END_POS_FIELD_28 = START_POS_FIELD_28 + 4 - START_POS_FIELD_29 = END_POS_FIELD_28 - END_POS_FIELD_29 = START_POS_FIELD_29 + 4 - START_POS_FIELD_30 = END_POS_FIELD_29 - END_POS_FIELD_30 = START_POS_FIELD_29 + 4 - START_POS_FIELD_31 = END_POS_FIELD_30 - END_POS_FIELD_31 = START_POS_FIELD_30 + 4 - START_POS_FIELD_32 = END_POS_FIELD_31 - END_POS_FIELD_32 = START_POS_FIELD_31 + 4 - START_POS_FIELD_33 = END_POS_FIELD_32 - END_POS_FIELD_33 = START_POS_FIELD_32 + 4 - START_POS_FIELD_34 = END_POS_FIELD_33 - END_POS_FIELD_34 = START_POS_FIELD_33 + 4 - START_POS_FIELD_35 = END_POS_FIELD_34 - END_POS_FIELD_35 = START_POS_FIELD_34 + 4 - START_POS_FIELD_36 = END_POS_FIELD_35 - END_POS_FIELD_36 = START_POS_FIELD_35 + 4 - START_POS_FIELD_37 = END_POS_FIELD_36 - END_POS_FIELD_37 = START_POS_FIELD_36 + 4 - START_POS_FIELD_38 = END_POS_FIELD_37 - END_POS_FIELD_38 = START_POS_FIELD_37 + 4 - START_POS_FIELD_39 = END_POS_FIELD_38 - END_POS_FIELD_39 = START_POS_FIELD_38 + 4 - START_POS_FIELD_40 = END_POS_FIELD_39 - END_POS_FIELD_40 = START_POS_FIELD_39 + 4 - START_POS_FIELD_41 = END_POS_FIELD_40 - END_POS_FIELD_41 = START_POS_FIELD_40 + 4 - START_POS_FIELD_42 = END_POS_FIELD_41 - END_POS_FIELD_42 = START_POS_FIELD_41 + 4 - START_POS_FIELD_43 = END_POS_FIELD_42 - END_POS_FIELD_43 = START_POS_FIELD_42 + 4 - START_POS_FIELD_44 = END_POS_FIELD_43 - END_POS_FIELD_44 = START_POS_FIELD_43 + 4 - START_POS_FIELD_45 = END_POS_FIELD_44 - END_POS_FIELD_45 = START_POS_FIELD_44 + 4 - START_POS_FIELD_46 = END_POS_FIELD_45 - END_POS_FIELD_46 = START_POS_FIELD_45 + 4 - START_POS_FIELD_47 = END_POS_FIELD_46 - END_POS_FIELD_47 = START_POS_FIELD_46 + 4 - START_POS_FIELD_48 = END_POS_FIELD_47 - END_POS_FIELD_48 = START_POS_FIELD_47 + 4 - START_POS_FIELD_49 = END_POS_FIELD_48 - END_POS_FIELD_49 = START_POS_FIELD_48 + 4 - START_POS_FIELD_50 = END_POS_FIELD_49 - END_POS_FIELD_50 = START_POS_FIELD_49 + 4 - START_POS_FIELD_51 = END_POS_FIELD_50 - END_POS_FIELD_51 = START_POS_FIELD_50 + 4 - START_POS_FIELD_52 = END_POS_FIELD_51 - END_POS_FIELD_52 = START_POS_FIELD_51 + 4 - START_POS_FIELD_53 = END_POS_FIELD_52 - END_POS_FIELD_53 = START_POS_FIELD_52 + 4 - START_POS_FIELD_54 = END_POS_FIELD_53 - END_POS_FIELD_54 = START_POS_FIELD_53 + 4 - START_POS_FIELD_55 = END_POS_FIELD_54 - END_POS_FIELD_55 = START_POS_FIELD_54 + 4 - START_POS_FIELD_56 = END_POS_FIELD_55 - END_POS_FIELD_56 = START_POS_FIELD_55 + 4 - START_POS_FIELD_57 = END_POS_FIELD_56 - END_POS_FIELD_57 = START_POS_FIELD_56 + 4 - START_POS_FIELD_58 = END_POS_FIELD_57 - END_POS_FIELD_58 = START_POS_FIELD_57 + 4 - START_POS_FIELD_59 = END_POS_FIELD_58 - END_POS_FIELD_59 = START_POS_FIELD_58 + 4 - START_POS_FIELD_60 = END_POS_FIELD_59 - END_POS_FIELD_60 = START_POS_FIELD_59 + 4 - START_POS_FIELD_61 = END_POS_FIELD_60 - END_POS_FIELD_61 = START_POS_FIELD_60 + 4 - START_POS_FIELD_62 = END_POS_FIELD_61 - END_POS_FIELD_62 = START_POS_FIELD_61 + 4 - - -class MsgFieldPositionsFWVersions: - # UI version message field positions - START_POS_MAJOR = MSG_HEADER_SIZE # Hardcoded for now to avoid cyclic import issue. See protocols.CAN.CanMessage class - END_POS_MAJOR = START_POS_MAJOR + 1 - START_POS_MINOR = END_POS_MAJOR - END_POS_MINOR = START_POS_MINOR + 1 - START_POS_MICRO = END_POS_MINOR - END_POS_MICRO = START_POS_MICRO + 1 - START_POS_BUILD = END_POS_MICRO - END_POS_BUILD = START_POS_BUILD + 2 - START_POS_FPGA_ID = END_POS_BUILD - END_POS_FPGA_ID = START_POS_FPGA_ID + 1 - START_POS_FPGA_MAJOR = END_POS_FPGA_ID - END_POS_FPGA_MAJOR = START_POS_FPGA_MAJOR + 1 - START_POS_FPGA_MINOR = END_POS_FPGA_MAJOR - END_POS_FPGA_MINOR = START_POS_FPGA_MINOR + 1 - START_POS_FPGA_MICRO = END_POS_FPGA_MINOR - END_POS_FPGA_MICRO = START_POS_FPGA_MICRO + 1 - START_POS_COMPATIBILITY_REV = END_POS_FPGA_MICRO - END_POS_COMPATIBILITY_REV = START_POS_COMPATIBILITY_REV + 4 Index: leahi_dialin/dd/dialysate_delivery.py =================================================================== diff -u -r88eea899fa8d03596f944505285bf3049e64312b -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision 88eea899fa8d03596f944505285bf3049e64312b) +++ leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -45,7 +45,7 @@ from ..common.constants import NO_RESET from ..common import dd_enum_repository from ..common.generic_defs import DataTypes -from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..common.msg_defs 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 Index: leahi_dialin/dd/modules/alarms.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ 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 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 leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/balancing_chamber.py =================================================================== diff -u -rf1b8b4e9558e9cb95b994044f1d7d247c6c8be3f -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/balancing_chamber.py (.../balancing_chamber.py) (revision f1b8b4e9558e9cb95b994044f1d7d247c6c8be3f) +++ leahi_dialin/dd/modules/balancing_chamber.py (.../balancing_chamber.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/blood_leak.py =================================================================== diff -u -rf1b8b4e9558e9cb95b994044f1d7d247c6c8be3f -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision f1b8b4e9558e9cb95b994044f1d7d247c6c8be3f) +++ leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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, 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 from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/concentrate_pump.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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 @@ -124,7 +124,7 @@ 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)) - self.process_into_dict(dict_to_update = self.dd_concentrate_pumps, + self.process_into_vars(dict_to_update = self.dd_concentrate_pumps, decoder_list = sensor_list, message = message) self.dd_concentrate_pump_timestamp = timestamp Index: leahi_dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -r6ce1aaaa1c5ce4ef44d51d7c805c81e34cdb2499 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 6ce1aaaa1c5ce4ef44d51d7c805c81e34cdb2499) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ from leahi_dialin.common import dd_enum_repository from leahi_dialin.common import fp_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 @@ -128,7 +128,7 @@ 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)) - self.process_into_dict(dict_to_update = self.dd_conductivity, + self.process_into_vars(dict_to_update = self.dd_conductivity, decoder_list = sensor_list, message = message) self.dd_conductivity_timestamp = timestamp Index: leahi_dialin/dd/modules/dd_test_configs.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/dd_test_configs.py (.../dd_test_configs.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/dd_test_configs.py (.../dd_test_configs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -19,7 +19,7 @@ # Project imports from leahi_dialin.common.constants import NO_RESET -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_override from leahi_dialin.common.test_config_defs import DDFPTestConfigOptions from leahi_dialin.protocols.CAN import CanMessenger, CanChannels Index: leahi_dialin/dd/modules/dialysate_pump.py =================================================================== diff -u -r465679409a5fe6f6007ddffca1fd3e89ead9d9c4 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision 465679409a5fe6f6007ddffca1fd3e89ead9d9c4) +++ leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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 @@ -112,7 +112,7 @@ 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)) - self.process_into_dict(dict_to_update = self.dd_dialysate_pumps, + self.process_into_vars(dict_to_update = self.dd_dialysate_pumps, decoder_list = sensor_list, message = message) self.dd_dialysate_pump_timestamp = timestamp Index: leahi_dialin/dd/modules/drybicart.py =================================================================== diff -u -r4fc29aead7deff5ba3ddb4c9e1290fc0d5b2b6e8 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/drybicart.py (.../drybicart.py) (revision 4fc29aead7deff5ba3ddb4c9e1290fc0d5b2b6e8) +++ leahi_dialin/dd/modules/drybicart.py (.../drybicart.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -20,7 +20,7 @@ # Project imports from leahi_dialin.common.constants import NO_RESET , RESET 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 Index: leahi_dialin/dd/modules/events.py =================================================================== diff -u -r8b54f610f3b5c0610bea0a481b892e8c70935765 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/events.py (.../events.py) (revision 8b54f610f3b5c0610bea0a481b892e8c70935765) +++ leahi_dialin/dd/modules/events.py (.../events.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -15,21 +15,18 @@ ############################################################################ # Module imports -import struct from logging import Logger from datetime import datetime # Project imports from leahi_dialin.common import dd_enum_repository 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.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 - - class DDEvents(AbstractSubSystem): """ Dialysate Delivery (DD) Dialin API sub-class for events related commands. @@ -49,15 +46,8 @@ self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, message_id = MsgIds.MSG_ID_DD_EVENT.value, function = self._handler_events_sync) - - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.dd_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_DD_OP_MODE_DATA.value, - function = self._handler_dd_op_mode_sync) self.events_timestamp = 0.0 #: The timestamp of the last Event message - self.op_mode = 0 #: The new Operation Mode value - self.sub_mode = 0 #: The new Operation Sub-Mode value - self.event_op_mode_timestamp = 0.0 #: The timestamp of the last Operation Mode change message # Dictionary of the mode as key and the sub mode states enum class as the value self._op_mode_2_sub_mode = {dd_enum_repository.DDOpModes.MODE_FAUL.name: dd_enum_repository.DDFaultStates, @@ -79,65 +69,11 @@ self._event_dictionary[dd_enum_repository.DDEventList(event).name] = [] - def get_dd_nth_event(self, event_id, event_number=0): - """ - Returns the nth requested DD event - @param event_id the ID of the DD event types (i.e. DD_EVENT_STARTUP) - @param event_number the event number that is requested. The default is 0 meaning the last occurred event +# ============================================================ Properties ============================================================ - @returns the requested DD event number - """ - list_length = len(self._event_dictionary[dd_enum_repository.DDEventList(event_id).name]) - if list_length == 0: - event = [] - elif event_number > list_length: - event = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name][list_length - 1] - else: - event = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name][list_length - event_number - 1] - - return event - - - def clear_dd_event_list(self): - """ - Clears the DD event list - - @returns none - """ - for key in self._event_dictionary: - self._event_dictionary[key].clear() - - - def get_dd_events(self, event_id, number_of_events=1): - """ - Returns the requested number of a certain DD event ID - - @param event_id the ID of the DD event types (i.e. DD_EVENT_STARTUP) - @param number_of_events the last number of messages of a certain event type - - @returns a list of the requested DD event type - """ - list_of_events = [] - - # If there are not enough event lists send all the events that are available - if len(self._event_dictionary[dd_enum_repository.DDEventList(event_id).name]) <= number_of_events: - list_of_events = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name] - else: - # Get the all the events - complete_list = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name] - # Since the last are located at the end of the list, iterate backwards for the defined - # event messages - for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): - list_of_events.append(complete_list[i]) - - if number_of_events == 0: - list_of_events = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name] - - return list_of_events - - +# ============================================================ Handlers ============================================================ @publish(["msg_id_dd_event", "events_timestamp", '_event_dictionary']) def _handler_events_sync(self, message, timestamp=0.0): """ @@ -146,57 +82,46 @@ @param message: published DD events data message @returns none """ - event_data_1 = 0 - event_data_2 = 0 - op_mode = 0 - sub_mode = 0 - sub_state = 0 - current_sub_tuple = [] + event_id = LocalVars('event_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') + op_mode = LocalVars('op_mode') + sub_mode = LocalVars('sub_mode') + state = LocalVars('state') + sub_state = LocalVars('sub_state') - event_id = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - # Convert the event ID to enum - event_enum = dd_enum_repository.DDEventList(event_id) - current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') - + msg_list = [] + msg_list.append((event_id, DataTypes.U32)) if event_enum is dd_enum_repository.DDEventList.DD_EVENT_OPERATION_STATUS: - # Get the data type - irrelevant - event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - # Opmode data is compressed into the 4 byte - op_mode = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.START_POS_FIELD_3+1]))[0] - sub_mode = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3+1:MsgFieldPositions.START_POS_FIELD_3+2]))[0] - sub_state = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3+2:MsgFieldPositions.START_POS_FIELD_3+3]))[0] - _ = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4+3:MsgFieldPositions.END_POS_FIELD_4]))[0] - - event_data_type_2 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - event_data_2 = struct.unpack(DataTypes(event_data_type_2).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + msg_list.append((data_typ_1, DataTypes.U32)) # It's not used in operation status case + msg_list.append((op_mode, DataTypes.U08)) + msg_list.append((sub_mode, DataTypes.U08)) + msg_list.append((state, DataTypes.U08)) + msg_list.append((sub_state, DataTypes.U08)) + msg_list.append((data_typ_2, DataTypes.U32)) + msg_list.append((data_2, 'data_typ_2')) else: - # Get the data type - event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - event_data_1 = struct.unpack(DataTypes(event_data_type_1).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + 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')) - event_data_type_2 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - event_data_2 = struct.unpack(DataTypes(event_data_type_2).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + self.process_into_vars(decoder_list = msg_list, message = message) - # Create the event data - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + # Convert the event ID to enum + event_enum = dd_enum_repository.DDEventList(event_id) + + # Get the current timestamp and create a tuple of the current events + current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) # Update event data from integer to name if it's op mode change if event_enum is dd_enum_repository.DDEventList.DD_EVENT_OP_MODE_CHANGE: - event_data_1 = dd_enum_repository.DDOpModes(event_data_1).name - event_data_2 = dd_enum_repository.DDOpModes(event_data_2).name - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + data_1 = dd_enum_repository.DDOpModes(data_1.value).name + data_2 = dd_enum_repository.DDOpModes(data_2.value).name + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) # Check if the event state name is sub mode change. elif event_enum is dd_enum_repository.DDEventList.DD_EVENT_SUB_MODE_CHANGE: @@ -223,20 +148,20 @@ # In case the Op Mode Change is older then the previous Sub Mode Change, # use the current Op Mode from the previous Op Mode Change message for both data if prev_op_mode_timestamp <= prev_sub_mode_timestamp: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case the Op Mode Change is newer then the previous Sub Mode Change, # use the operation mode informations from the last Op Mode Change message else: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case this is the very first Sub Mode Change message, # use the operation mode informations from the last Op Mode Change message else: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case there are no Op Mode Change messages, use the Operations States messages # to identify the Op Modes for the Sub Modes @@ -257,53 +182,95 @@ for i in range(len(op_status_list) - 1, -1, -1): op_status_msg = op_status_list[i] - # Look for a match for event_data_2 + # Look for a match for data_2.value if not data_2_found: - if op_status_msg[2] == event_data_2: + if op_status_msg[2] == data_2.value: event_2_op_mode = dd_enum_repository.DDOpModes(op_status_msg[1]).name data_2_found = True - # Look for a match for event_data_1 after event_data_2 is found - # Criteria is that the opmode, submode pair can't be the same as the one found for event_data_2 + # Look for a match for data_1.value after data_2.value is found + # Criteria is that the opmode, submode pair can't be the same as the one found for data_2.value else: - if op_status_msg[2] == event_data_1 and \ - (op_status_msg[2] != event_data_2 or dd_enum_repository.DDOpModes(op_status_msg[1]).name != event_2_op_mode): + if op_status_msg[2] == data_1.value and \ + (op_status_msg[2] != data_2.value or dd_enum_repository.DDOpModes(op_status_msg[1]).name != event_2_op_mode): event_1_op_mode = dd_enum_repository.DDOpModes(op_status_msg[1]).name - # If op mode for event_data_2 found but not found for event_data_1 and run out of operation states + # If op mode for data_2.value found but not found for data_1.value and run out of operation states # assume it's the start of the unit start up and the going to standby is not logged yet if event_2_op_mode != self.UNKNOWN_STATE and event_1_op_mode == self.UNKNOWN_STATE: event_1_op_mode = dd_enum_repository.DDOpModes.MODE_STAN.name # Update the event_data values - event_data_1 = self._op_mode_2_sub_mode[event_1_op_mode](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[event_2_op_mode](event_data_2).name + data_1 = self._op_mode_2_sub_mode[event_1_op_mode](data_1.value).name + data_2 = self._op_mode_2_sub_mode[event_2_op_mode](data_2.value).name # Update the tuple - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) elif event_enum is dd_enum_repository.DDEventList.DD_EVENT_OPERATION_STATUS: - event_tuple = (current_timestamp, op_mode, sub_mode, sub_state) + event_tuple = (current_timestamp, op_mode.value, sub_mode.value, state.value) # Update event dictionary self._event_dictionary[event_enum.name].append(event_tuple) self.events_timestamp = timestamp - @publish(["msg_id_dd_op_mode_data", "event_op_mode_timestamp", "op_mode", "sub_mode"]) - def _handler_dd_op_mode_sync(self, message, timestamp=0.0): +# ============================================================ Support ============================================================ + def get_dd_nth_event(self, event_id, event_number=0): """ - Handles published DD operation mode messages. Current DD operation mode - is captured for reference. + Returns the nth requested DD event - @param message: published DD operation mode broadcast message - @return: None + @param event_id the ID of the DD event types (i.e. DD_EVENT_STARTUP) + @param event_number the event number that is requested. The default is 0 meaning the last occurred event + + @returns the requested DD event number """ - msg_list = [] - msg_list.append(('self.op_mode', DataTypes.U32)) - msg_list.append(('self.sub_mode', DataTypes.U32)) + list_length = len(self._event_dictionary[dd_enum_repository.DDEventList(event_id).name]) - self.process_into_vars(decoder_list = msg_list, - message = message) - self.event_op_mode_timestamp = timestamp + if list_length == 0: + event = [] + elif event_number > list_length: + event = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name][list_length - 1] + else: + event = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name][list_length - event_number - 1] + + return event + + + def clear_dd_event_list(self): + """ + Clears the DD event list + + @returns none + """ + for key in self._event_dictionary: + self._event_dictionary[key].clear() + + + def get_dd_events(self, event_id, number_of_events=1): + """ + Returns the requested number of a certain DD event ID + + @param event_id the ID of the DD event types (i.e. DD_EVENT_STARTUP) + @param number_of_events the last number of messages of a certain event type + + @returns a list of the requested DD event type + """ + list_of_events = [] + + # If there are not enough event lists send all the events that are available + if len(self._event_dictionary[dd_enum_repository.DDEventList(event_id).name]) <= number_of_events: + list_of_events = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name] + else: + # Get the all the events + complete_list = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name] + # Since the last are located at the end of the list, iterate backwards for the defined + # event messages + for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): + list_of_events.append(complete_list[i]) + + if number_of_events == 0: + list_of_events = self._event_dictionary[dd_enum_repository.DDEventList(event_id).name] + + return list_of_events Index: leahi_dialin/dd/modules/gen_dialysate.py =================================================================== diff -u -rf1b8b4e9558e9cb95b994044f1d7d247c6c8be3f -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/gen_dialysate.py (.../gen_dialysate.py) (revision f1b8b4e9558e9cb95b994044f1d7d247c6c8be3f) +++ leahi_dialin/dd/modules/gen_dialysate.py (.../gen_dialysate.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/heaters.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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 @@ -116,7 +116,7 @@ msg_list.append(('self.dbg8', DataTypes.F32)) msg_list.append(('self.dbg9', DataTypes.F32)) - self.process_into_dict(dict_to_update = self.dd_heaters, + self.process_into_vars(dict_to_update = self.dd_heaters, decoder_list = sensor_list, message = message) self.process_into_vars(decoder_list = msg_list, Index: leahi_dialin/dd/modules/levels.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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 @@ -76,7 +76,7 @@ msg_list =[] msg_list.append(('self.dd_bicarb_level', DataTypes.U32)) - self.process_into_dict(dict_to_update = self.dd_level_sensors, + self.process_into_vars(dict_to_update = self.dd_level_sensors, decoder_list = sensor_list, message = message) self.process_into_vars(decoder_list = msg_list, Index: leahi_dialin/dd/modules/mixing_cntrl.py =================================================================== diff -u -re412f48fe7363639f8e729d2274501ec02d51aa9 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/mixing_cntrl.py (.../mixing_cntrl.py) (revision e412f48fe7363639f8e729d2274501ec02d51aa9) +++ leahi_dialin/dd/modules/mixing_cntrl.py (.../mixing_cntrl.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/post_gen_dialysate.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/post_gen_dialysate.py (.../post_gen_dialysate.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/post_gen_dialysate.py (.../post_gen_dialysate.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/pre_gen_dialysate.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/pre_gen_dialysate.py (.../pre_gen_dialysate.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/pre_gen_dialysate.py (.../pre_gen_dialysate.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/pressure_sensors.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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 @@ -77,7 +77,7 @@ sensor_list.append((dd_enum_repository.DDPressureSensorNames.D41_PRES.name, DataTypes.F32)) sensor_list.append((dd_enum_repository.DDPressureSensorNames.D87_PRES.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.dd_pressures, + self.process_into_vars(dict_to_update = self.dd_pressures, decoder_list = sensor_list, message = message) self.dd_pressures_timestamp = timestamp Index: leahi_dialin/dd/modules/rinse_pump.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/rinse_pump.py (.../rinse_pump.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/rinse_pump.py (.../rinse_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/spent_chamber_fill.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/spent_chamber_fill.py (.../spent_chamber_fill.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/spent_chamber_fill.py (.../spent_chamber_fill.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/substitution_pump.py =================================================================== diff -u -r7867a1799d96a5803a80c1914b30e34d6a9ee8b7 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/substitution_pump.py (.../substitution_pump.py) (revision 7867a1799d96a5803a80c1914b30e34d6a9ee8b7) +++ leahi_dialin/dd/modules/substitution_pump.py (.../substitution_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 @@ -78,7 +78,7 @@ 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)) - self.process_into_dict(dict_to_update = self.dd_substitution_pumps, + self.process_into_vars(dict_to_update = self.dd_substitution_pumps, decoder_list = substitution_pump_list, message = message) Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r465679409a5fe6f6007ddffca1fd3e89ead9d9c4 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 465679409a5fe6f6007ddffca1fd3e89ead9d9c4) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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 @@ -108,7 +108,7 @@ sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D41_TEMP.name, DataTypes.F32)) sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D87_TEMP.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.dd_temperatures, + self.process_into_vars(dict_to_update = self.dd_temperatures, decoder_list = sensor_list, message = message) self.dd_temperatures_timestamp = timestamp Index: leahi_dialin/dd/modules/ultrafiltration.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/ultrafiltration.py (.../ultrafiltration.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/ultrafiltration.py (.../ultrafiltration.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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, MsgFieldPositions +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 Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -23,7 +23,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, CanMessage, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/modules/voltages.py =================================================================== diff -u -r7d9c0eeed29a86791382b338d5b2c8b8751f3467 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision 7d9c0eeed29a86791382b338d5b2c8b8751f3467) +++ leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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 @@ -89,7 +89,7 @@ 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)) - self.process_into_dict(dict_to_update = self.monitored_voltages, + self.process_into_vars(dict_to_update = self.monitored_voltages, decoder_list = sensor_list, message = message) self.dd_voltages_timestamp = timestamp Index: leahi_dialin/dd/proxies/ro_proxy.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/proxies/ro_proxy.py (.../ro_proxy.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/dd/proxies/ro_proxy.py (.../ro_proxy.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -18,7 +18,7 @@ from logging import Logger # Project imports -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_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/dd/proxies/td_proxy.py =================================================================== diff -u -re5a48b1ffd05454177a0966e96f8bb1755884615 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision e5a48b1ffd05454177a0966e96f8bb1755884615) +++ leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -19,7 +19,7 @@ # Project imports 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_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/fp/filtration_purification.py =================================================================== diff -u -r88eea899fa8d03596f944505285bf3049e64312b -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 88eea899fa8d03596f944505285bf3049e64312b) +++ leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -34,7 +34,7 @@ from ..common.constants import NO_RESET from ..common import fp_enum_repository from ..common.generic_defs import DataTypes -from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..common.msg_defs 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 Index: leahi_dialin/fp/modules/alarms.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ 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 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, CanMessage, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/fp/modules/boost_pump.py =================================================================== diff -u -rf1b8b4e9558e9cb95b994044f1d7d247c6c8be3f -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision f1b8b4e9558e9cb95b994044f1d7d247c6c8be3f) +++ leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common import fp_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 @@ -85,7 +85,7 @@ 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)) - self.process_into_dict(dict_to_update = self.boost_pump, + self.process_into_vars(dict_to_update = self.boost_pump, decoder_list = sensor_list, message = message) self.boost_pump_timestamp = timestamp Index: leahi_dialin/fp/modules/conductivity_sensors.py =================================================================== diff -u -r6ce1aaaa1c5ce4ef44d51d7c805c81e34cdb2499 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 6ce1aaaa1c5ce4ef44d51d7c805c81e34cdb2499) +++ leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,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 @@ -102,7 +102,7 @@ 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)) - self.process_into_dict(dict_to_update = self.fp_conductivity, + self.process_into_vars(dict_to_update = self.fp_conductivity, decoder_list = sensor_list, message = message) self.fp_conductivity_timestamp = timestamp @@ -124,7 +124,7 @@ 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)) - self.process_into_dict(dict_to_update = self.ro_rejection_ratio, + self.process_into_vars(dict_to_update = self.ro_rejection_ratio, decoder_list = sensor_list, message = message) self.ro_rejection_ratio_timestamp = timestamp Index: leahi_dialin/fp/modules/events.py =================================================================== diff -u -r8b54f610f3b5c0610bea0a481b892e8c70935765 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/events.py (.../events.py) (revision 8b54f610f3b5c0610bea0a481b892e8c70935765) +++ leahi_dialin/fp/modules/events.py (.../events.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -14,16 +14,14 @@ # ############################################################################ -import struct from logging import Logger from datetime import datetime -from time import time from leahi_dialin.common import dd_enum_repository, fp_enum_repository 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.protocols.CAN import CanMessenger, CanChannels, CanMessenger -from leahi_dialin.utils.abstract_classes import AbstractSubSystem +from leahi_dialin.utils.abstract_classes import AbstractSubSystem, LocalVars from leahi_dialin.utils.base import publish @@ -47,14 +45,7 @@ message_id = MsgIds.MSG_ID_FP_EVENT.value, function = self._handler_events_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.fp_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_FP_OP_MODE_DATA.value, - function = self._handler_fp_op_mode_sync) - self.events_timestamp = 0.0 #: The timestamp of the last Event message - self.op_mode = 0 #: The new Operation Mode value - self.sub_mode = 0 #: The new Operation Sub-Mode value - self.event_op_mode_timestamp = 0.0 #: The timestamp of the last Operation Mode change message # Dictionary of the mode as key and the sub mode states enum class as the value self._op_mode_2_sub_mode = {fp_enum_repository.FPOpModes.MODE_FAUL.name: fp_enum_repository.FPFaultStates, @@ -74,65 +65,11 @@ self._event_dictionary[fp_enum_repository.FPEventList(event).name] = [] - def get_fp_nth_event(self, event_id, event_number=0): - """ - Returns the nth requested FP event - @param event_id the ID of the FP event types (i.e. FP_EVENT_STARTUP) - @param event_number the event number that is requested. The default is 0 meaning the last occurred event +# ============================================================ Properties ============================================================ - @returns the requested FP event number - """ - list_length = len(self._event_dictionary[fp_enum_repository.FPEventList(event_id).name]) - if list_length == 0: - event = [] - elif event_number > list_length: - event = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name][list_length - 1] - else: - event = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name][list_length - event_number - 1] - - return event - - - def clear_fp_event_list(self): - """ - Clears the FP event list - - @returns none - """ - for key in self._event_dictionary: - self._event_dictionary[key].clear() - - - def get_fp_events(self, event_id, number_of_events=1): - """ - Returns the requested number of a certain FP event ID - - @param event_id the ID of the FP event types (i.e. FP_EVENT_STARTUP) - @param number_of_events the last number of messages of a certain event type - - @returns a list of the requested FP event type - """ - list_of_events = [] - - # If there are not enough event lists send all the events that are available - if len(self._event_dictionary[fp_enum_repository.FPEventList(event_id).name]) <= number_of_events: - list_of_events = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name] - else: - # Get the all the events - complete_list = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name] - # Since the last are located at the end of the list, iterate backwards for the defined - # event messages - for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): - list_of_events.append(complete_list[i]) - - if number_of_events == 0: - list_of_events = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name] - - return list_of_events - - +# ============================================================ Handlers ============================================================ @publish(["msg_id_fp_event", "events_timestamp", '_event_dictionary']) def _handler_events_sync(self, message, timestamp=0.0): """ @@ -141,62 +78,48 @@ @param message: published FP events data message @returns none """ - event_data_1 = 0 - event_data_2 = 0 - op_mode = 0 - sub_mode = 0 - sub_state = 0 + event_id = LocalVars('event_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') + op_mode = LocalVars('op_mode') + sub_mode = LocalVars('sub_mode') + state = LocalVars('state') + sub_state = LocalVars('sub_state') - event_id = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - - # Convert the event ID to enum - compensated_event_id = event_id - dd_enum_repository.DDEventList.NUM_OF_DD_EVENT_IDS.value - event_enum = fp_enum_repository.FPEventList(compensated_event_id) - current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') - + msg_list = [] + msg_list.append((event_id, DataTypes.U32)) if event_enum is fp_enum_repository.FPEventList.FP_EVENT_OPERATION_STATUS: - # Get the data type - irrelevant - event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - # For debug reasons get the full second byte - event_data_1 = struct.unpack(DataTypes(event_data_type_1).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - # Opmode data is compressed into the 4 byte - op_mode = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.START_POS_FIELD_3+1]))[0] - sub_mode = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3+1:MsgFieldPositions.START_POS_FIELD_3+2]))[0] - sub_state = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3+2:MsgFieldPositions.START_POS_FIELD_3+3]))[0] - _ = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4+3:MsgFieldPositions.END_POS_FIELD_4]))[0] - - event_data_type_2 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - event_data_2 = struct.unpack(DataTypes(event_data_type_2).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + msg_list.append((data_typ_1, DataTypes.U32)) # It's not used in operation status case + msg_list.append((op_mode, DataTypes.U08)) + msg_list.append((sub_mode, DataTypes.U08)) + msg_list.append((state, DataTypes.U08)) + msg_list.append((sub_state, DataTypes.U08)) + msg_list.append((data_typ_2, DataTypes.U32)) + msg_list.append((data_2, 'data_typ_2')) else: - # Get the data type - event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - # Get the data value by unpacking the data type - event_data_1 = struct.unpack(DataTypes(event_data_type_1).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + 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')) - event_data_type_2 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - event_data_2 = struct.unpack(DataTypes(event_data_type_2).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + self.process_into_vars(decoder_list = msg_list, message = message) + # Convert the event ID to enum + compensated_event_id = event_id.value - dd_enum_repository.DDEventList.NUM_OF_DD_EVENT_IDS.value + event_enum = fp_enum_repository.FPEventList(compensated_event_id) + # Get the current timestamp and create a tuple of the current events - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) + # Check if the event state name is operation mode change. If it is, get the name of the operation modes # from the op modes enum class if event_enum is fp_enum_repository.FPEventList.FP_EVENT_OP_MODE_CHANGE: - event_data_1 = fp_enum_repository.FPOpModes(event_data_1).name - event_data_2 = fp_enum_repository.FPOpModes(event_data_2).name - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + data_1 = fp_enum_repository.FPOpModes(data_1.value).name + data_2 = fp_enum_repository.FPOpModes(data_2.value).name + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) # Check if the event state name is sub mode change. elif event_enum is fp_enum_repository.FPEventList.FP_EVENT_SUB_MODE_CHANGE: @@ -223,20 +146,20 @@ # In case the Op Mode Change is older then the previous Sub Mode Change, # use the current Op Mode from the previous Op Mode Change message for both data if prev_op_mode_timestamp <= prev_sub_mode_timestamp: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case the Op Mode Change is newer then the previous Sub Mode Change, # use the operation mode informations from the last Op Mode Change message else: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case this is the very first Sub Mode Change message, # use the operation mode informations from the last Op Mode Change message else: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case there are no Op Mode Change messages, use the Operations States messages # to identify the Op Modes for the Sub Modes @@ -257,52 +180,95 @@ for i in range(len(op_status_list) - 1, -1, -1): op_status_msg = op_status_list[i] - # Look for a match for event_data_2 + # Look for a match for data_2.value if not data_2_found: - if op_status_msg[2] == event_data_2: + if op_status_msg[2] == data_2.value: event_2_op_mode = fp_enum_repository.FPOpModes(op_status_msg[1]).name data_2_found = True - # Look for a match for event_data_1 after event_data_2 is found - # Criteria is that the opmode, submode pair can't be the same as the one found for event_data_2 + # Look for a match for data_1.value after data_2.value is found + # Criteria is that the opmode, submode pair can't be the same as the one found for data_2.value else: - if op_status_msg[2] == event_data_1 and \ - (op_status_msg[2] != event_data_2 or fp_enum_repository.FPOpModes(op_status_msg[1]).name != event_2_op_mode): + if op_status_msg[2] == data_1.value and \ + (op_status_msg[2] != data_2.value or fp_enum_repository.FPOpModes(op_status_msg[1]).name != event_2_op_mode): event_1_op_mode = fp_enum_repository.FPOpModes(op_status_msg[1]).name - # If op mode for event_data_2 found but not found for event_data_1 and run out of operation states + # If op mode for data_2.value found but not found for data_1.value and run out of operation states # assume it's the start of the unit start up and the going to standby is not logged yet if event_2_op_mode != self.UNKNOWN_STATE and event_1_op_mode == self.UNKNOWN_STATE: event_1_op_mode = fp_enum_repository.FPOpModes.MODE_STAN.name # Update the event_data values - event_data_1 = self._op_mode_2_sub_mode[event_1_op_mode](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[event_2_op_mode](event_data_2).name + data_1 = self._op_mode_2_sub_mode[event_1_op_mode](data_1.value).name + data_2 = self._op_mode_2_sub_mode[event_2_op_mode](data_2.value).name # Update the tuple - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) elif event_enum is fp_enum_repository.FPEventList.FP_EVENT_OPERATION_STATUS: - event_tuple = (current_timestamp, op_mode, sub_mode, sub_state) + event_tuple = (current_timestamp, op_mode.value, sub_mode.value, state.value) # Update event dictionary self._event_dictionary[event_enum.name].append(event_tuple) self.events_timestamp = timestamp - @publish(["msg_id_fp_op_mode_data", "event_op_mode_timestamp", "op_mode", "sub_mode"]) - def _handler_fp_op_mode_sync(self, message, timestamp=0.0): + +# ============================================================ Support ============================================================ + def get_fp_nth_event(self, event_id, event_number=0): """ - Handles published FP operation mode messages. Current FP operation mode - is captured for reference. + Returns the nth requested FP event - @param message: published FP operation mode broadcast message - @return: None + @param event_id the ID of the FP event types (i.e. FP_EVENT_STARTUP) + @param event_number the event number that is requested. The default is 0 meaning the last occurred event + + @returns the requested FP event number """ - msg_list = [] - msg_list.append(('self.op_mode', DataTypes.U32)) - msg_list.append(('self.sub_mode', DataTypes.U32)) + list_length = len(self._event_dictionary[fp_enum_repository.FPEventList(event_id).name]) - self.process_into_vars(decoder_list = msg_list, - message = message) - self.event_op_mode_timestamp = timestamp + if list_length == 0: + event = [] + elif event_number > list_length: + event = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name][list_length - 1] + else: + event = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name][list_length - event_number - 1] + + return event + + + def clear_fp_event_list(self): + """ + Clears the FP event list + + @returns none + """ + for key in self._event_dictionary: + self._event_dictionary[key].clear() + + + def get_fp_events(self, event_id, number_of_events=1): + """ + Returns the requested number of a certain FP event ID + + @param event_id the ID of the FP event types (i.e. FP_EVENT_STARTUP) + @param number_of_events the last number of messages of a certain event type + + @returns a list of the requested FP event type + """ + list_of_events = [] + + # If there are not enough event lists send all the events that are available + if len(self._event_dictionary[fp_enum_repository.FPEventList(event_id).name]) <= number_of_events: + list_of_events = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name] + else: + # Get the all the events + complete_list = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name] + # Since the last are located at the end of the list, iterate backwards for the defined + # event messages + for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): + list_of_events.append(complete_list[i]) + + if number_of_events == 0: + list_of_events = self._event_dictionary[fp_enum_repository.FPEventList(event_id).name] + + return list_of_events Index: leahi_dialin/fp/modules/flow_sensors.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/flow_sensors.py (.../flow_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common import fp_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 @@ -69,7 +69,7 @@ sensor_list.append((fp_enum_repository.FPFlowSensorNames.P7_FLOW.name, DataTypes.F32)) sensor_list.append((fp_enum_repository.FPFlowSensorNames.P16_FLOW.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.fp_flows, + self.process_into_vars(dict_to_update = self.fp_flows, decoder_list = sensor_list, message = message) self.fp_flow_timestamp = timestamp Index: leahi_dialin/fp/modules/fp_test_configs.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -19,7 +19,7 @@ # Project imports from leahi_dialin.common.constants import NO_RESET -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_override from leahi_dialin.common.test_config_defs import DDFPTestConfigOptions from leahi_dialin.protocols.CAN import CanMessenger, CanChannels Index: leahi_dialin/fp/modules/levels.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/levels.py (.../levels.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/levels.py (.../levels.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ from leahi_dialin.common import fp_enum_repository from leahi_dialin.common.fp_defs import BETA_IOFP_LEVEL_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 @@ -70,7 +70,7 @@ sensor_list =[] sensor_list.append((fp_enum_repository.FPFloaterLevelSensorNames.P25_LEVEL.name, DataTypes.U32)) - self.process_into_dict(dict_to_update = self.fp_levels, + self.process_into_vars(dict_to_update = self.fp_levels, decoder_list = sensor_list, message = message) self.fp_levels_timestamp = timestamp Index: leahi_dialin/fp/modules/permeate_tank.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/permeate_tank.py (.../permeate_tank.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/fp/modules/pressure_sensors.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ from leahi_dialin.common import fp_enum_repository from leahi_dialin.common.fp_defs import BETA_IOFP_PRES_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 @@ -76,7 +76,7 @@ sensor_list.append((fp_enum_repository.FPPressureSensorNames.P17_PRES.name, DataTypes.F32)) sensor_list.append((fp_enum_repository.FPPressureSensorNames.P46_PRES.name, DataTypes.F32)) - self.process_into_dict(dict_to_update = self.fp_pressures, + self.process_into_vars(dict_to_update = self.fp_pressures, decoder_list = sensor_list, message = message) self.fp_pressure_timestamp = timestamp Index: leahi_dialin/fp/modules/ro_pump.py =================================================================== diff -u -r465679409a5fe6f6007ddffca1fd3e89ead9d9c4 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision 465679409a5fe6f6007ddffca1fd3e89ead9d9c4) +++ leahi_dialin/fp/modules/ro_pump.py (.../ro_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common import fp_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 @@ -85,7 +85,7 @@ 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)) - self.process_into_dict(dict_to_update = self.ro_pump, + self.process_into_vars(dict_to_update = self.ro_pump, decoder_list = sensor_list, message = message) self.ro_pump_timestamp = timestamp Index: leahi_dialin/fp/modules/temperatures.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ from leahi_dialin.common import fp_enum_repository from leahi_dialin.common.fp_defs import BETA_IOFP_COND_SENSOR_OFFSET, BETA_IOFP_PRES_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 @@ -82,7 +82,7 @@ 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)) - self.process_into_dict(dict_to_update = self.fp_temperatures, + self.process_into_vars(dict_to_update = self.fp_temperatures, decoder_list = sensor_list, message = message) self.fp_temperature_sensors_timestamp = timestamp Index: leahi_dialin/fp/modules/valves.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -24,7 +24,7 @@ from leahi_dialin.common import fp_enum_repository from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.fp_defs import BETA_IOFP_VALVE_OFFSET -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, CanMessage, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/fp/modules/water_pumps.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/modules/water_pumps.py (.../water_pumps.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -20,7 +20,7 @@ # Project imports from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common import fp_enum_repository -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_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/fp/proxies/dd_proxy.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/fp/proxies/dd_proxy.py (.../dd_proxy.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/fp/proxies/dd_proxy.py (.../dd_proxy.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -18,7 +18,7 @@ from logging import Logger # Project imports -from leahi_dialin.common.msg_defs import MsgIds +from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.test_config_defs import DDFPTestConfigOptions from leahi_dialin.protocols.CAN import CanMessenger, CanMessage, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/td/modules/air_pump.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 @@ -52,7 +52,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, @@ -66,6 +65,22 @@ } + +# ============================================================ Properties ============================================================ + @property + def td_air_pump(self) -> dict: + """ + The current 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,21 +89,20 @@ @param message: published air pump data message as: air pump state @return: None """ - 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 + +# ============================================================ 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 -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 @@ -55,7 +55,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, @@ -67,19 +66,94 @@ } } - #: 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 + +# ============================================================ Properties ============================================================ + @property + def air_trap_level_sensors(self) -> dict: + """ + The current 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 current 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) -> int: + """ + Is the Air Trap FW logic is active or not + """ + return self._air_control + + @air_control.setter + def air_control(self, value): + self._air_control = value + + + @property + def air_trap_state(self) -> int: + """ + The current 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 current 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 current 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,33 +167,24 @@ @param message: published air trap data message @return: None """ - 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.U32)) + 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 + +# ============================================================ 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 -rb167367cb2256f8b4a35bc2c9cde6cde2129d05d -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision b167367cb2256f8b4a35bc2c9cde6cde2129d05d) +++ leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -17,12 +17,13 @@ # Module imports from functools import partial from logging import Logger +from typing import List # Project imports from leahi_dialin.common import td_enum_repository, AlarmList from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes -from leahi_dialin.common.msg_defs import 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, LocalVars @@ -126,9 +127,10 @@ self.alarm_states[x] = False + # ============================================================ Properties ============================================================ @property - def alarms_priority_state(self): + def alarms_priority_state(self) -> int: """ The current Top Alarm's priority value """ @@ -140,7 +142,7 @@ @property - def alarm_top(self): + def alarm_top(self) -> int: """ The current Top Alarm's value """ @@ -152,7 +154,7 @@ @property - def alarms_silence_expires_in(self): + def alarms_silence_expires_in(self) -> int: """ How many seconds the silence for the alarms expires in """ @@ -164,7 +166,7 @@ @property - def alarms_escalates_in(self): + def alarms_escalates_in(self) -> int: """ How many seconds the current Alarm escalates to the next priority """ @@ -176,7 +178,7 @@ @property - def alarms_flags(self): + def alarms_flags(self) -> int: """ The Alarm flag's value """ @@ -188,7 +190,7 @@ @property - def alarm_volume(self): + def alarm_volume(self) -> int: """ The Alarm's Volume level """ @@ -200,7 +202,7 @@ @property - def alarm_audio_curr_hg(self): + def alarm_audio_curr_hg(self) -> float: """ The Alarm's Audio high current """ @@ -212,7 +214,7 @@ @property - def alarm_audio_curr_lg(self): + def alarm_audio_curr_lg(self) -> float: """ The Alarm's Audio low current """ @@ -224,7 +226,7 @@ @property - def alarm_backup_audio_curr(self): + def alarm_backup_audio_curr(self) -> float: """ The Alarm's Audio backup current """ @@ -236,7 +238,7 @@ @property - def safety_shutdown_active(self): + def safety_shutdown_active(self) -> bool: """ The Safety Shutdown is active or not """ @@ -248,7 +250,7 @@ @property - def ac_power_lost(self): + def ac_power_lost(self) -> bool: """ The AC Power is lost or not """ @@ -260,7 +262,7 @@ @property - def alarm_table_button_blockers(self): + def alarm_table_button_blockers(self) -> List[bool]: """ The Alarm Table's Button blocker data """ @@ -272,7 +274,7 @@ @property - def ui_alarm_list_accepted(self): + def ui_alarm_list_accepted(self) -> bool: """ The UI Alarm List request accepted """ @@ -284,7 +286,7 @@ @property - def ui_alarm_list_reject_reason(self): + def ui_alarm_list_reject_reason(self) -> int: """ The UI Alarm List request reject reason """ @@ -296,7 +298,7 @@ @property - def ui_alarm_list(self): + def ui_alarm_list(self) -> List[int]: """ The UI Alarm List content """ @@ -308,7 +310,7 @@ @property - def alarm_table(self): + def alarm_table(self) -> dict: """ The Alarm Table with Alarm Property details """ @@ -320,8 +322,6 @@ - - # ============================================================ Handlers ============================================================ @publish(["msg_id_td_alarm_status_data", "alarms_priority_state", "alarm_top", "alarms_silence_expires_in", "alarms_escalates_in", "alarms_flags", @@ -341,7 +341,7 @@ msg_list.append((type(self).alarms_silence_expires_in, DataTypes.U32)) msg_list.append((type(self).alarms_flags, DataTypes.U16)) - self.process_into_vars_2(decoder_list = msg_list, message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_alarm_status_timestamp = timestamp @@ -375,7 +375,7 @@ msg_list.append((rank, DataTypes.U32)) msg_list.append((clr_top_only, DataTypes.U32)) - self.process_into_vars_2(decoder_list = msg_list, message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.logger.debug("Alarm ID: %d %d %d" % (alarm_id.value, data_1.value, data_2.value)) self.alarm_states[alarm_id.value] = True @@ -403,7 +403,7 @@ msg_list = [] msg_list.append((alarm_id, DataTypes.U32)) - self.process_into_vars_2(decoder_list = msg_list, message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.alarm_states[alarm_id.value] = False self.alarm_conditions[alarm_id.value] = False @@ -423,7 +423,7 @@ msg_list = [] msg_list.append((alarm_id, DataTypes.U32)) - self.process_into_vars_2(decoder_list = msg_list, message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.alarm_conditions[alarm_id.value] = False self.td_alarm_clr_condition_timestamp = timestamp @@ -454,7 +454,7 @@ 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_2(decoder_list = msg_list, message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.td_alarm_information_timestamp = timestamp @@ -481,7 +481,7 @@ msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #9 msg_list.append((self.ui_alarm_list, DataTypes.U32)) # UI Alarm #10 - self.process_into_vars_2(decoder_list = msg_list, message = message) + self.process_into_vars(decoder_list = msg_list, message = message) self.ui_alarm_list_timestamp = timestamp @@ -535,7 +535,7 @@ properties_list.append((treatment_log, DataTypes.BOOL_U08)) properties_list.append((alarm_id, DataTypes.U16)) - self.process_into_vars_2(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 properties_list: @@ -547,6 +547,7 @@ self.alarm_table_timestamp = timestamp + # ============================================================ Overrides and Requests ============================================================ def cmd_alarm_status_broadcast_interval_override(self, ms: int = 250, reset: int = NO_RESET): """ Index: leahi_dialin/td/modules/blood_flow.py =================================================================== diff -u -rd4692c944b4b54a9bfd1b2ad178a37de854806ff -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision d4692c944b4b54a9bfd1b2ad178a37de854806ff) +++ leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -20,7 +20,7 @@ # Project imports from leahi_dialin.common.constants import NO_RESET, PUMP_CONTROL_MODE_CLOSED_LOOP 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 @@ -49,7 +49,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, @@ -64,6 +63,21 @@ +# ============================================================ Properties ============================================================ + @property + def h4_motor(self) -> dict: + """ + The current 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): """ @@ -73,23 +87,23 @@ @param message: published blood flow data message @return: none """ - 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 + +# ============================================================ 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 -r3e8c15745640db0568536912a36704a567bd73c2 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/blood_pressure.py (.../blood_pressure.py) (revision 3e8c15745640db0568536912a36704a567bd73c2) +++ leahi_dialin/td/modules/blood_pressure.py (.../blood_pressure.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -19,7 +19,8 @@ # 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 @@ -51,13 +52,77 @@ 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.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): + 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): """ @@ -67,12 +132,11 @@ @return: none """ 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 @@ -85,14 +149,16 @@ @return: none """ 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.reject_reason = RequestRejectReasons(self.reject_reason) self.rr_timestamp = timestamp + +# ============================================================ 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 -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 @@ -61,7 +61,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 @@ } + +# ============================================================ Properties ============================================================ + @property + def h18_bubble_detector(self) -> dict: + """ + The current 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): """ @@ -80,16 +95,16 @@ @param message: published air bubbles data message as: h18 bubble status, h18 bubble state @return: None """ - 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 + +# ============================================================ 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 -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/buttons.py (.../buttons.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/buttons.py (.../buttons.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -21,7 +21,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, 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 from leahi_dialin.utils.abstract_classes import AbstractSubSystem @@ -50,18 +50,25 @@ 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 - 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): """ @@ -74,14 +81,26 @@ self.logger.debug("Poweroff message id detected, but was the wrong length.") return - mode = struct.unpack(DataTypes.U16.unpack_attrib(), bytearray( - message["message"][MsgFieldPositions.START_POS_FIELD_1: MsgFieldPositions.START_POS_FIELD_1 + 2])) - - if len(mode) > 0: - self.poweroff_timeout_expired = bool(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 + +# ============================================================ 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 -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 @@ -51,7 +51,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 @@ } + +# ============================================================ Properties ============================================================ + @property + def h5_motor(self) -> dict: + """ + The current 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): """ @@ -70,18 +85,18 @@ @param message: published ejector data message as: ejector state @return: None """ - 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 + +# ============================================================ 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 -r8b54f610f3b5c0610bea0a481b892e8c70935765 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/events.py (.../events.py) (revision 8b54f610f3b5c0610bea0a481b892e8c70935765) +++ leahi_dialin/td/modules/events.py (.../events.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -14,19 +14,16 @@ # ############################################################################ -import struct -from logging import Logger -from datetime import datetime -from time import time # Module imports from logging import Logger +from datetime import datetime # Project imports from leahi_dialin.common import td_enum_repository 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.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 @@ -49,14 +46,7 @@ message_id = MsgIds.MSG_ID_TD_EVENT.value, function = self._handler_events_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, - message_id = MsgIds.MSG_ID_TD_OP_MODE_DATA.value, - function = self._handler_td_op_mode_sync) - self.events_timestamp = 0.0 #: The timestamp of the last Event message - self.op_mode = 0 #: The new Operation Mode value - self.sub_mode = 0 #: The new Operation Sub-Mode value - self.event_op_mode_timestamp = 0.0 #: The timestamp of the last Operation Mode change message # Dictionary of the mode as key and the sub mode states enum class as the valued self._op_mode_2_sub_mode = {td_enum_repository.TDOpModes.MODE_FAUL.name: td_enum_repository.TDFaultStates, @@ -75,65 +65,11 @@ self._event_dictionary[td_enum_repository.TDEventList(event).name] = [] - def get_td_nth_event(self, event_id, event_number=0): - """ - Returns the nth requested TD event - @param event_id the ID of the TD event types (i.e. TD_EVENT_STARTUP) - @param event_number the event number that is requested. The default is 0 meaning the last occurred event +# ============================================================ Properties ============================================================ - @returns the requested TD event number - """ - list_length = len(self._event_dictionary[td_enum_repository.TDEventList(event_id).name]) - if list_length == 0: - event = [] - elif event_number > list_length: - event = self._event_dictionary[td_enum_repository.TDEventList(event_id).name][list_length - 1] - else: - event = self._event_dictionary[td_enum_repository.TDEventList(event_id).name][list_length - event_number - 1] - - return event - - - def clear_td_event_list(self): - """ - Clears the TD event list - - @returns none - """ - for key in self._event_dictionary: - self._event_dictionary[key].clear() - - - def get_td_events(self, event_id, number_of_events=1): - """ - Returns the requested number of a certain TD event ID - - @param event_id the ID of the TD event types (i.e. TD_EVENT_STARTUP) - @param number_of_events the last number of messages of a certain event type - - @returns a list of the requested TD event type - """ - list_of_events = [] - - # If there are not enough event lists send all the events that are available - if len(self._event_dictionary[td_enum_repository.TDEventList(event_id).name]) <= number_of_events: - list_of_events = self._event_dictionary[td_enum_repository.TDEventList(event_id).name] - else: - # Get the all the events - complete_list = self._event_dictionary[td_enum_repository.TDEventList(event_id).name] - # Since the last are located at the end of the list, iterate backwards for the defined - # event messages - for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): - list_of_events.append(complete_list[i]) - - if number_of_events == 0: - list_of_events = self._event_dictionary[td_enum_repository.TDEventList(event_id).name] - - return list_of_events - - +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_event", "events_timestamp", '_event_dictionary']) def _handler_events_sync(self, message, timestamp=0.0): """ @@ -142,57 +78,47 @@ @param message: published TD events data message @returns none """ - event_data_1 = 0 - event_data_2 = 0 - op_mode = 0 - sub_mode = 0 - sub_state = 0 + event_id = LocalVars('event_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') + op_mode = LocalVars('op_mode') + sub_mode = LocalVars('sub_mode') + state = LocalVars('state') + sub_state = LocalVars('sub_state') - event_id = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - # Convert the event ID to enum - event_enum = td_enum_repository.TDEventList(event_id) - current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') - + msg_list = [] + msg_list.append((event_id, DataTypes.U32)) if event_enum is td_enum_repository.TDEventList.TD_EVENT_OPERATION_STATUS: - # Get the data type - irrelevant - event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - # Opmode data is compressed into the 4 byte - op_mode = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.START_POS_FIELD_3+1]))[0] - sub_mode = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3+1:MsgFieldPositions.START_POS_FIELD_3+2]))[0] - sub_state = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3+2:MsgFieldPositions.START_POS_FIELD_3+3]))[0] - _ = struct.unpack(DataTypes.U08.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4+3:MsgFieldPositions.END_POS_FIELD_4]))[0] - - event_data_type_2 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - event_data_2 = struct.unpack(DataTypes(event_data_type_2).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + msg_list.append((data_typ_1, DataTypes.U32)) # It's not used in operation status case + msg_list.append((op_mode, DataTypes.U08)) + msg_list.append((sub_mode, DataTypes.U08)) + msg_list.append((state, DataTypes.U08)) + msg_list.append((sub_state, DataTypes.U08)) + msg_list.append((data_typ_2, DataTypes.U32)) + msg_list.append((data_2, 'data_typ_2')) else: - # Get the data type - event_data_type_1 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - # Get the data value by unpacking the data type - event_data_1 = struct.unpack(DataTypes(event_data_type_1).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + 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')) - event_data_type_2 = struct.unpack(DataTypes.U32.unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - event_data_2 = struct.unpack(DataTypes(event_data_type_2).unpack_attrib(), bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + self.process_into_vars(decoder_list = msg_list, message = message) + # Convert the event ID to enum + event_enum = td_enum_repository.TDEventList(event_id.value) + # Get the current timestamp and create a tuple of the current events - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + current_timestamp = datetime.now().astimezone().strftime('%Y-%m-%d %H:%M:%S.%f') + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) + # Check if the event state name is operation mode change. If it is, get the name of the operation modes # from the op modes enum class if event_enum is td_enum_repository.TDEventList.TD_EVENT_OP_MODE_CHANGE: - event_data_1 = td_enum_repository.TDOpModes(event_data_1).name - event_data_2 = td_enum_repository.TDOpModes(event_data_2).name - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + data_1 = td_enum_repository.TDOpModes(data_1.value).name + data_2 = td_enum_repository.TDOpModes(data_2.value).name + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) # Check if the event state name is sub mode change. elif event_enum is td_enum_repository.TDEventList.TD_EVENT_SUB_MODE_CHANGE: # Get the Op Mode Change messages @@ -218,20 +144,20 @@ # In case the Op Mode Change is older then the previous Sub Mode Change, # use the current Op Mode from the previous Op Mode Change message for both data if prev_op_mode_timestamp <= prev_sub_mode_timestamp: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case the Op Mode Change is newer then the previous Sub Mode Change, # use the operation mode informations from the last Op Mode Change message else: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case this is the very first Sub Mode Change message, # use the operation mode informations from the last Op Mode Change message else: - event_data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](event_data_2).name + data_1 = self._op_mode_2_sub_mode[last_op_mode_message[2]](data_1.value).name + data_2 = self._op_mode_2_sub_mode[last_op_mode_message[3]](data_2.value).name # In case there are no Op Mode Change messages, use the Operations States messages # to identify the Op Modes for the Sub Modes @@ -252,52 +178,95 @@ for i in range(len(op_status_list) - 1, -1, -1): op_status_msg = op_status_list[i] - # Look for a match for event_data_2 + # Look for a match for data_2.value if not data_2_found: - if op_status_msg[2] == event_data_2: + if op_status_msg[2] == data_2.value: event_2_op_mode = td_enum_repository.TDOpModes(op_status_msg[1]).name data_2_found = True - # Look for a match for event_data_1 after event_data_2 is found - # Criteria is that the opmode, submode pair can't be the same as the one found for event_data_2 + # Look for a match for data_1.value after data_2.value is found + # Criteria is that the opmode, submode pair can't be the same as the one found for data_2.value else: - if op_status_msg[2] == event_data_1 and \ - (op_status_msg[2] != event_data_2 or td_enum_repository.TDOpModes(op_status_msg[1]).name != event_2_op_mode): + if op_status_msg[2] == data_1.value and \ + (op_status_msg[2] != data_2.value or td_enum_repository.TDOpModes(op_status_msg[1]).name != event_2_op_mode): event_1_op_mode = td_enum_repository.TDOpModes(op_status_msg[1]).name - # If op mode for event_data_2 found but not found for event_data_1 and run out of operation states + # If op mode for data_2.value found but not found for data_1.value and run out of operation states # assume it's the start of the unit start up and the going to standby is not logged yet if event_2_op_mode != self.UNKNOWN_STATE and event_1_op_mode == self.UNKNOWN_STATE: event_1_op_mode = td_enum_repository.TDOpModes.MODE_STAN.name # Update the event_data values - event_data_1 = self._op_mode_2_sub_mode[event_1_op_mode](event_data_1).name - event_data_2 = self._op_mode_2_sub_mode[event_2_op_mode](event_data_2).name + data_1 = self._op_mode_2_sub_mode[event_1_op_mode](data_1.value).name + data_2 = self._op_mode_2_sub_mode[event_2_op_mode](data_2.value).name # Update the tuple - event_tuple = (current_timestamp, event_enum.name, event_data_1, event_data_2) + event_tuple = (current_timestamp, event_enum.name, data_1.value, data_2.value) elif event_enum is td_enum_repository.TDEventList.TD_EVENT_OPERATION_STATUS: - event_tuple = (current_timestamp, op_mode, sub_mode, sub_state) + event_tuple = (current_timestamp, op_mode.value, sub_mode.value, state.value) # Update event dictionary self._event_dictionary[event_enum.name].append(event_tuple) self.events_timestamp = timestamp - @publish(["msg_id_td_op_mode_data", "event_op_mode_timestamp", "op_mode", "sub_mode"]) - def _handler_td_op_mode_sync(self, message, timestamp=0.0): + +# ============================================================ Support ============================================================ + def get_td_nth_event(self, event_id, event_number=0): """ - Handles published TD operation mode messages. Current TD operation mode - is captured for reference. + Returns the nth requested TD event - @param message: published TD operation mode broadcast message - @return: None + @param event_id the ID of the TD event types (i.e. TD_EVENT_STARTUP) + @param event_number the event number that is requested. The default is 0 meaning the last occurred event + + @returns the requested TD event number """ - msg_list = [] - msg_list.append(('self.op_mode', DataTypes.U32)) - msg_list.append(('self.sub_mode', DataTypes.U32)) + list_length = len(self._event_dictionary[td_enum_repository.TDEventList(event_id).name]) - self.process_into_vars(decoder_list = msg_list, - message = message) - self.event_op_mode_timestamp = timestamp + if list_length == 0: + event = [] + elif event_number > list_length: + event = self._event_dictionary[td_enum_repository.TDEventList(event_id).name][list_length - 1] + else: + event = self._event_dictionary[td_enum_repository.TDEventList(event_id).name][list_length - event_number - 1] + + return event + + + def clear_td_event_list(self): + """ + Clears the TD event list + + @returns none + """ + for key in self._event_dictionary: + self._event_dictionary[key].clear() + + + def get_td_events(self, event_id, number_of_events=1): + """ + Returns the requested number of a certain TD event ID + + @param event_id the ID of the TD event types (i.e. TD_EVENT_STARTUP) + @param number_of_events the last number of messages of a certain event type + + @returns a list of the requested TD event type + """ + list_of_events = [] + + # If there are not enough event lists send all the events that are available + if len(self._event_dictionary[td_enum_repository.TDEventList(event_id).name]) <= number_of_events: + list_of_events = self._event_dictionary[td_enum_repository.TDEventList(event_id).name] + else: + # Get the all the events + complete_list = self._event_dictionary[td_enum_repository.TDEventList(event_id).name] + # Since the last are located at the end of the list, iterate backwards for the defined + # event messages + for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): + list_of_events.append(complete_list[i]) + + if number_of_events == 0: + list_of_events = self._event_dictionary[td_enum_repository.TDEventList(event_id).name] + + return list_of_events Index: leahi_dialin/td/modules/pressure_sensors.py =================================================================== diff -u -r60a4cdf7272161c64bb60aac93b26acf50465494 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 60a4cdf7272161c64bb60aac93b26acf50465494) +++ leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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, 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 @@ -50,7 +50,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, @@ -75,9 +74,37 @@ } } - self.pressure_limits_state = 0 #: Pressure limits state value + self.pressure_limits_state = 0 + +# ============================================================ Properties ============================================================ + @property + def td_pressure_sensors(self) -> dict: + """ + The current Pressure 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", @@ -96,41 +123,28 @@ @param message: published pressure & occlusion data message @return: none """ + 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)) - 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)) - - 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 + +# ============================================================ 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/switches.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/switches.py (.../switches.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/switches.py (.../switches.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 @@ -50,10 +50,25 @@ 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 } + +# ============================================================ Properties ============================================================ + @property + def td_switches_status(self) -> dict: + """ + The current 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): """ @@ -62,15 +77,15 @@ @param message: published switches data message @return: none """ - 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 + +# ============================================================ 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 -r60a4cdf7272161c64bb60aac93b26acf50465494 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/syringe_pump.py (.../syringe_pump.py) (revision 60a4cdf7272161c64bb60aac93b26acf50465494) +++ leahi_dialin/td/modules/syringe_pump.py (.../syringe_pump.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -13,13 +13,15 @@ # @date (original) 12-Mar-2021 # ############################################################################ -import struct + +# Module imports from logging import Logger +# 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.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 @@ -47,23 +49,195 @@ 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.value + self.heparin_state = TDTreaHeparinStates.HEPARIN_STATE_OFF.value + 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 = 0 + 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 + +# ============================================================ Properties ============================================================ + @property + def syringe_pump_state(self) -> int: + """ + The current Srynge Pump State + """ + return self._syringe_pump_state + + @syringe_pump_state.setter + def syringe_pump_state(self, value): + self._syringe_pump_state = value + + + @property + def heparin_state(self) -> int: + """ + The current Heparin State + """ + return self._heparin_state + + @heparin_state.setter + def heparin_state(self, value): + self._heparin_state = value + + + @property + def syringe_pump_set_rate_ml_hr(self) -> float: + """ + The current 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 current 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 current 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 current 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 current 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 current 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 current 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 current 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) -> int: + """ + The current Syringe Pump status + """ + return self._syringe_pump_status + + @syringe_pump_status.setter + def syringe_pump_status(self, value): + self._syringe_pump_status = value + + + @property + def syringe_pump_encoder_status(self) -> int: + """ + The current 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 current 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 current 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", @@ -81,27 +255,27 @@ @return: None """ 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 + +# ============================================================ Overrides and Requests ============================================================ def cmd_syringe_pump_operation(self, operation: int = SyringePumpOperations.SYRINGE_PUMP_OP_STOP.value, rate: float = 0.0, volume: float = 0.0) -> int: Index: leahi_dialin/td/modules/td_test_configs.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/td_test_configs.py (.../td_test_configs.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/td_test_configs.py (.../td_test_configs.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -18,8 +18,8 @@ from logging import Logger # Project imports -from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.constants import NO_RESET, MSG_HEADER_SIZE +from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.common.test_config_defs import TDTestConfigOptions from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -48,19 +48,25 @@ function = self._handler_td_test_config_sync) self.td_test_configs_response_timestamp = 0.0 #: The timestamp of the latest message - self.td_test_configs = dict() #: The Test Config data in dictionary format + self.td_test_configs = {} - def cmd_get_test_config_status(self, config: int): - """ - Returns the status of a test config - @param config: (int) Test config to set - @return: the status of a test config +# ============================================================ Properties ============================================================ + @property + def td_test_configs(self) -> dict: """ - return self.td_test_configs[TDTestConfigOptions(config).name] + The current Test Configs data + """ + return self._test_configs + @td_test_configs.setter + def td_test_configs(self, value): + self._test_configs = value + + +# ============================================================ Handlers ============================================================ @publish(['msg_id_td_send_test_config', 'td_test_configs', 'td_test_configs_response_timestamp']) def _handler_td_test_config_sync(self, message, timestamp=0.0): """ @@ -69,17 +75,30 @@ @param message: published TD test configurations message @return: None """ - print('test config response') payload = message['message'] - index = MsgFieldPositions.START_POS_FIELD_1 + index = MSG_HEADER_SIZE - for config in TDTestConfigOptions.__members__: - if 'NUM_OF_TEST_CONFIGS' not in config: - config_value, index = bytearray_to_integer(payload, index, False) + for config in TDTestConfigOptions: + if config != TDTestConfigOptions.NUM_OF_TEST_CONFIGS: + config_value, index = bytearray_to_integer(payload, index, False) # The return value is the incremented index self.td_test_configs[config] = config_value self.td_test_configs_response_timestamp = timestamp + +# ============================================================ Support ============================================================ + def cmd_get_test_config_status(self, config: int): + """ + Returns the status of a test config + + @param config: (int) Test config to set + @return: the status of a test config + """ + return self.td_test_configs[TDTestConfigOptions(config).name] + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_set_test_config(self, config: int, reset: int = NO_RESET): """ Constructs and sends the TD test config Index: leahi_dialin/td/modules/temperature_sensors.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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 @@ -51,9 +51,24 @@ # The Temperature data in dictionary format self.td_temperatures_status = { td_enum_repository.TDTemperatureSensorNames.H23_TEMP.name: 0.0 } - + +# ============================================================ Properties ============================================================ + @property + def td_temperatures_status(self) -> dict: + """ + The current Temperatures 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" @@ -66,15 +81,15 @@ @param message: published temperature data message @return: none """ - 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 + +# ============================================================ 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 -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -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_override from leahi_dialin.common import td_enum_repository from leahi_dialin.protocols.CAN import CanMessenger, CanChannels @@ -68,12 +68,12 @@ 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.min_tx_time = 0 + self.max_tx_time = 0 + self.min_uf_volume = 0.0 + self.max_uf_volume = 0.0 + self.min_dial_rate = 0 + self.max_dial_rate = 0 self.tx_params_timestamp = 0 #: The timestamp of the latest Treatment Parameters message # Saline Bolus data @@ -131,6 +131,82 @@ self.tx_param_req_timestamp = 0 #: The timestamp of the latest Treatment Parameters Request message + +# ============================================================ Properties ============================================================ + @property + def min_tx_time(self) -> int: + """ + The Minimum Treatment time + """ + return self._min_tx_time + + @min_tx_time.setter + def min_tx_time(self, value): + self._min_tx_time = value + + + @property + def max_tx_time(self) -> int: + """ + The Maximum Treatment time + """ + return self._max_tx_time + + @max_tx_time.setter + def max_tx_time(self, value): + self._max_tx_time = value + + + @property + def min_uf_volume(self) -> int: + """ + The Minimum Ultrafiltration volume + """ + return self._min_uf_volume + + @min_uf_volume.setter + def min_uf_volume(self, value): + self._min_uf_volume = value + + + @property + def max_uf_volume(self) -> int: + """ + The Maximum Ultrafiltration volume + """ + return self._max_uf_volume + + @max_uf_volume.setter + def max_uf_volume(self, value): + self._max_uf_volume = value + + + @property + def min_dial_rate(self) -> int: + """ + The Minimum Dialysate rate + """ + return self._min_dial_rate + + @min_dial_rate.setter + def min_dial_rate(self, value): + self._min_dial_rate = value + + + @property + def max_dial_rate(self) -> int: + """ + The Maximum Dialysate rate + """ + return self._max_dial_rate + + @max_dial_rate.setter + def max_dial_rate(self, value): + self._max_dial_rate = 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): @@ -141,15 +217,14 @@ @return: none """ 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((type(self).min_tx_time, DataTypes.U32)) + msg_list.append((type(self).max_tx_time, DataTypes.U32)) + msg_list.append((type(self).min_uf_volume, DataTypes.F32)) + msg_list.append((type(self).max_uf_volume, DataTypes.F32)) + msg_list.append((type(self).min_dial_rate, DataTypes.U32)) + msg_list.append((type(self).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 @@ -163,13 +238,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((type(self).tgt_saline_volume, DataTypes.U32)) + msg_list.append((type(self).cum_saline_volume, DataTypes.F32)) + msg_list.append((type(self).bol_saline_volume, DataTypes.F32)) + msg_list.append((type(self).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 @@ -183,13 +257,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((type(self).set_uf_volume, DataTypes.F32)) + msg_list.append((type(self).tgt_uf_rate, DataTypes.F32)) + msg_list.append((type(self).uf_volume_delivered, DataTypes.F32)) + msg_list.append((type(self).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 @@ -203,12 +276,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((type(self).tx_time_prescribed, DataTypes.U32)) + msg_list.append((type(self).tx_time_elapsed, DataTypes.U32)) + msg_list.append((type(self).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 @@ -222,17 +294,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((type(self).tx_sub_mode, DataTypes.U32)) + msg_list.append((type(self).blood_prime_state, DataTypes.U32)) + msg_list.append((type(self).dialysis_state, DataTypes.U32)) + msg_list.append((type(self).isolated_uf_state, DataTypes.U32)) + msg_list.append((type(self).tx_stop_state, DataTypes.U32)) + msg_list.append((type(self).rinseback_state, DataTypes.U32)) + msg_list.append((type(self).tx_recirc_state, DataTypes.U32)) + msg_list.append((type(self).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 @@ -249,32 +320,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((type(self).blood_flow_rate, DataTypes.U32)) + msg_list.append((type(self).dialysate_flow_rate, DataTypes.U32)) + msg_list.append((type(self).tx_duration, DataTypes.U32)) + msg_list.append((type(self).saline_bolus_volume, DataTypes.U32)) + msg_list.append((type(self).hep_stop_time, DataTypes.U32)) + msg_list.append((type(self).hep_time, DataTypes.U32)) + msg_list.append((type(self).acid_con, DataTypes.U32)) + msg_list.append((type(self).bicarb_con, DataTypes.U32)) + msg_list.append((type(self).dialyzer_type, DataTypes.U32)) + msg_list.append((type(self).bp_interval, DataTypes.U32)) + msg_list.append((type(self).rb_flow_rate, DataTypes.U32)) + msg_list.append((type(self).rb_volume, DataTypes.U32)) + msg_list.append((type(self).art_pressure_window, DataTypes.U32)) + msg_list.append((type(self).venous_pressure_window, DataTypes.U32)) + msg_list.append((type(self).venous_asymm_window, DataTypes.U32)) + msg_list.append((type(self).tmp_limit_window, DataTypes.U32)) + msg_list.append((type(self).dialysate_temp, DataTypes.F32)) + msg_list.append((type(self).hep_dispense_rate, DataTypes.F32)) + msg_list.append((type(self).hep_bolus_vol, DataTypes.F32)) + msg_list.append((type(self).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 -r6c90336ac2cd8cf34ac620cff431a847d9ddf557 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/valves.py (.../valves.py) (revision 6c90336ac2cd8cf34ac620cff431a847d9ddf557) +++ leahi_dialin/td/modules/valves.py (.../valves.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -20,11 +20,11 @@ # 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 -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,11 +52,26 @@ 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: {}} + +# ============================================================ Properties ============================================================ + @property + def valves_status(self) -> dict: + """ + The current 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: """ @@ -66,32 +81,53 @@ @param message: published TD valves data message @returns none """ + 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 + +# ============================================================ 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 -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -16,11 +16,12 @@ # Module imports from logging import Logger +from typing import List # 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 @@ -49,10 +50,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 + +# ============================================================ Properties ============================================================ + @property + def monitored_voltages(self) -> List[int]: + """ + The current Voltages data + """ + return self._monitored_voltages + + @monitored_voltages.setter + def monitored_voltages(self, value): + 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): """ @@ -62,25 +78,25 @@ @param message: published monitored voltages data message @return: none """ - 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 + +# ============================================================ 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 -r3e8c15745640db0568536912a36704a567bd73c2 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 3e8c15745640db0568536912a36704a567bd73c2) +++ leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ 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 MsgIds, RequestRejectReasons +from leahi_dialin.common.msg_ids import MsgIds, RequestRejectReasons from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem Index: leahi_dialin/td/treatment_delivery.py =================================================================== diff -u -r3e8c15745640db0568536912a36704a567bd73c2 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 3e8c15745640db0568536912a36704a567bd73c2) +++ leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -40,13 +40,13 @@ from .proxies.dd_proxy import DDProxy from .proxies.ui_proxy import UIProxy -from ..common.constants import NO_RESET -from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..common.constants import NO_RESET, MSG_HEADER_SIZE +from ..common.msg_defs import MsgIds from ..common import td_enum_repository from ..common.generic_defs import DataTypes from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from ..protocols.CAN import CanMessage, CanMessenger, CanChannels -from ..utils.abstract_classes import AbstractSubSystem +from ..utils.abstract_classes import AbstractSubSystem, LocalVars from ..utils.base import publish, LogManager from ..utils.conversions import integer_to_bytearray, bytearray_to_byte @@ -113,19 +113,16 @@ self.td_debug_events_timestamp = 0.0 #: The timestamp of the latest events message self.ui_version_info_response_timestamp = 0.0 #: The timestamp of the latest UI version info message self.td_version_response_timestamp = 0.0 #: The timestamp of the latest TD version info message - self.td_operation_mode = td_enum_repository.TDOpModes.MODE_INIT.value #: The Operation Mode's value - self.td_operation_sub_mode = 0 #: The Operation Sub-Mode's value - self.td_logged_in = False #: The value showing if the user is logged in or not - self.td_set_logged_in_status(False) - self.ui_version = None #: The UI's version value - self.td_version = None #: The TD's version value - self.td_fpga_version = None #: The TD's FPGA version value + self.td_operation_mode = td_enum_repository.TDOpModes.MODE_INIT.value + self.td_operation_sub_mode = 0 + self.ui_version = None + self.td_version = None + self.td_fpga_version = None self.td_debug_events = [''] * self._TD_DEBUG_EVENT_LIST_COUNT #: The Debug Event's list self.td_debug_event_index = 0 #: The index of the last Event self.td_last_debug_event = '' #: The name of the last Event # Create command groups - self.air_pump = TDAirPump(self.can_interface, self.logger) #: The Air Pump module self.air_trap = TDAirTrap(self.can_interface, self.logger) #: The Air Trap module self.alarms = TDAlarms(self.can_interface, self.logger) #: The Alarms module @@ -148,18 +145,82 @@ self.ui_proxy = UIProxy(self.can_interface, self.logger) #: The UI Proxy module (imitates commands sent by UI) + +# ============================================================ Properties ============================================================ + @property + def td_operation_mode(self) -> int: + """ + The current Operation Mode + """ + return self._op_mode + + @td_operation_mode.setter + def td_operation_mode(self, value): + self._op_mode = value + + + @property + def td_operation_sub_mode(self) -> int: + """ + The current Operation Sub Mode + """ + return self._sub_mode + + @td_operation_sub_mode.setter + def td_operation_sub_mode(self, value): + self._sub_mode = value + + + @property + def ui_version(self) -> int: + """ + The UI Version data + """ + return self._ui_version + + @ui_version.setter + def ui_version(self, value): + self._ui_version = value + + + @property + def td_version(self) -> int: + """ + The TD Version data + """ + return self._td_version + + @td_version.setter + def td_version(self, value): + self._td_version = value + + + @property + def td_fpga_version(self) -> int: + """ + The TD FPGA Version data + """ + return self._fpga_version + + @td_fpga_version.setter + def td_fpga_version(self, value): + self._fpga_version = value + + + +# ============================================================ Handlers ============================================================ @publish(["msg_id_td_debug_event", "td_debug_events_timestamp","td_debug_events"]) def _handler_td_debug_event_sync(self, message, timestamp = 0.0): payload = message['message'] message_length = payload[self._TD_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 - char, char_index = bytearray_to_byte(payload, index + i, False) + char, index = bytearray_to_byte(payload, index, False) # The return value is the incremented index temp_message += chr(char) self.td_debug_events_timestamp = timestamp @@ -171,16 +232,7 @@ self.td_debug_event_index = 0 - def td_set_logged_in_status(self, logged_in: bool = False): - """ - Callback for td logged in status change. - @param logged_in: Logged in status for TD - @return: None - """ - self.td_logged_in = logged_in - - @publish(["msg_id_td_op_mode_data", "td_op_mode_timestamp","td_operation_mode", "td_operation_sub_mode"]) def _handler_td_op_mode_sync(self, message, timestamp = 0.0): """ @@ -191,11 +243,10 @@ @return: None """ msg_list = [] - msg_list.append(('self.td_operation_mode', DataTypes.U32)) - msg_list.append(('self.td_operation_sub_mode', DataTypes.U32)) + msg_list.append((type(self).td_operation_mode, DataTypes.U32)) + msg_list.append((type(self).td_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.td_op_mode_timestamp = timestamp @@ -208,26 +259,35 @@ @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.td_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.td_version = f"v{major.value}.{minor.value}.{micro.value}-{build.value}.{compatibility.value}" self.logger.debug(f'TD VERSION: {self.td_version}') - if all([each is not None for each in [result['fpga_id'], result['fpga_major'], result['fpga_minor'], result['fpga_lab']]]): - self.td_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.td_fpga_version = f"v{fpga_id.value}.{fpga_major.value}.{fpga_minor.value}-{fpga_lab.value}" self.logger.debug(f'TD FPGA VERSION: {self.td_fpga_version}') self.td_version_response_timestamp = timestamp @@ -247,24 +307,44 @@ @return: None if not successful, the version string if unpacked successfully """ + major = LocalVars('major') + minor = LocalVars('minor') + micro = LocalVars('micro') + build = LocalVars('build') + 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(('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((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.ui_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.ui_version = f"v{major.value}.{minor.value}.{micro.value}-{build.value}.{compatibility.value}" self.logger.debug(f'UI VERSION: {self.ui_version}') else: self.ui_version = None self.logger.debug("Failed to retrieve UI Version.") self.ui_version_info_response_timestamp = timestamp + + +# ============================================================ Support ============================================================ + def td_set_logged_in_status(self, logged_in: bool = False): + """ + Callback for td logged in status change. + + @param logged_in: Logged in status for TD + @return: None + """ + self.td_logged_in = logged_in + + + +# ============================================================ Overrides and Requests ============================================================ def cmd_op_mode_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the measured op mode broadcast interval override command Index: leahi_dialin/utils/abstract_classes.py =================================================================== diff -u -rb167367cb2256f8b4a35bc2c9cde6cde2129d05d -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- leahi_dialin/utils/abstract_classes.py (.../abstract_classes.py) (revision b167367cb2256f8b4a35bc2c9cde6cde2129d05d) +++ leahi_dialin/utils/abstract_classes.py (.../abstract_classes.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -76,7 +76,7 @@ self._observers.remove(observer) - def process_into_vars(self, decoder_list: List[Tuple], message, start_from_byte: int=0, debug: bool=False) -> dict: + def process_into_vars(self, decoder_list: List[Tuple], message, start_from_byte: int=0, debug: bool=False) -> None: """ Process the CAN message with the help of the decoder list into variables and a dictionary. Note: updating variables will only be done when it's class wide one, aka "self.attr_name". @@ -89,59 +89,8 @@ :return: (Dictionary) A dictionary for the variable_name and value pair """ start_pos = MSG_HEADER_SIZE + start_from_byte - results = {} + result = {} # Needed if datatype is a string and indicates an earlier entry's value. Entry will be stored here and then it's value is read from here if debug: - print(f'\n\ndecoder_list: {decoder_list}') - print(f'len: {len(decoder_list[0])}') - for decode_details in decoder_list: - # Content of the decode list - variable_name = decode_details[0] - datatype: DataTypes = decode_details[-1] - end_pos = start_pos + datatype.size() - try: - value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] - except Exception as e: - value = None - if debug: - print(f'{variable_name}: {value} ({datatype.name})') - print(f'pos: {start_pos} - {end_pos}') - if 'nan' in str(value).lower(): - value = None - # raise ValueError(f'{value} is not an accepted value!') - if datatype in [DataTypes.BOOL, DataTypes.BOOL_U08]: - value = True if value == 1 else False - results[variable_name] = value - - # If it's a instance variable (self.) then set it's value - if variable_name.startswith('self'): - attr_path = variable_name[5:].split('.') - obj = self - for attr in attr_path[:-1]: - obj = getattr(obj, attr) - setattr(obj, attr_path[-1], value) - start_pos = end_pos - if debug: - print('Finished cycle\n') - if debug: - print(f'results: {results}\n') - return results - - - def process_into_vars_2(self, decoder_list: List[Tuple], message, start_from_byte: int=0, debug: bool=False) -> None: - """ - Process the CAN message with the help of the decoder list into variables and a dictionary. - Note: updating variables will only be done when it's class wide one, aka "self.attr_name". - For local attributes to avoid namespace issues use the returned dictionary. Format: {attr_name : value} - - :param decoder_list: (List[Tuple[String, DataTypes]]) Contains the variable name and DataType pair of the indexed message - :param message: (Bytearray) The raw CAN message - :param start_from_byte: (Integer) Start from the nth byte after the header - :param debug: (Boolean) Prints for debugging - :return: (Dictionary) A dictionary for the variable_name and value pair - """ - start_pos = MSG_HEADER_SIZE + start_from_byte - result = {} - if debug: print(f'\n\nDecoder_list: {decoder_list}') for decode_details in decoder_list: # If last position is multichar length @@ -159,7 +108,7 @@ length = 1 datatype = DataTypes(result[decode_details[-1]]) base_list_length = 2 - # If it's a dictionary and the decoder list contains keys + # Check if the decoder list contains keys indicating the target is a dictionary key_list_length = len(decode_details) - base_list_length key_1 = decode_details[1] if len(decode_details) >= base_list_length + 1 else None key_2 = decode_details[2] if len(decode_details) >= base_list_length + 2 else None @@ -179,9 +128,10 @@ end_pos = start_pos + datatype.size() try: new_value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] - print('new_value') + # If not multilength just save it if length == 1: value = new_value + # If multilength entry (length > 1), convert it to character and add append it to the value until fully read elif datatype == DataTypes.U08 and length > 1: if i == 0: value = chr(new_value) @@ -205,13 +155,15 @@ if datatype in [DataTypes.BOOL, DataTypes.BOOL_U08]: value = True if value == 1 else False - # Save processed value into the input + # Save processed value into the target + # If the target is a property if isinstance(decode_details[0], property): property_name = decode_details[0].fget.__name__ if debug: print(f'Property name: {property_name} <- {value}') decode_details[0].__set__(self, value) result[property_name] = value + # If the target is a dictionary use the extracted keys to add it under the correct position, key should exist in the dictionary already elif isinstance(decode_details[0], dict): dict_to_update = decode_details[0] if key_list_length == 1: @@ -232,8 +184,10 @@ dict_to_update[key_1][key_2][key_3] = value if debug: print(f'Dictionary key [{key_1}][{key_2}][{key_3}] <- {value}') + # If the target is a list, append the current value to the end elif isinstance(decode_details[0], list): decode_details[0].append(value) + # If the target is a local variables else: variable_name = decode_details[0].name if debug: @@ -243,48 +197,3 @@ start_pos = end_pos if debug: print('Finished cycle\n') - - - def process_into_dict(self, dict_to_update: dict, decoder_list: List[Tuple], message, start_from_byte: int=0, debug: bool=False): - """ - Process the CAN message with the help of the decoder list into a dictionary. - - :param decoder_list: (List[Tuple[DialEnum, DialEnum, DataTypes]]) Contains the dictioarny key names and DataType of the indexed message - :param message: (Bytearray) The raw CAN message - :param start_from_byte: (Integer) Start from the nth byte after the header - :param debug: (Boolean) Prints for debugging - :return: (Dictionary) The updated dictionary - """ - start_pos = MSG_HEADER_SIZE + start_from_byte - if debug: - print(f'\n\ndecoder_list: {decoder_list}') - print(f'len: {len(decoder_list[0])}') - for decode_details in decoder_list: - # Content of the decode list - key_1 = decode_details[0] - key_2 = decode_details[1] if len(decode_details) >= 3 else None - datatype: DataTypes = decode_details[-1] - - end_pos = start_pos + datatype.size() - value = struct.unpack(datatype.unpack_attrib(), bytearray(message['message'][start_pos:end_pos]))[0] - if debug: - print(f'key_1: {key_1}') - print(f'key_2: {key_2}') - print(f'value: {value} ({datatype.name})') - print(f'pos: {start_pos} - {end_pos}') - if 'nan' in str(value).lower(): - value = None - # raise ValueError(f'{value} is not an accepted value!') - # If the type is Bool, convert the value from Integer to Boolean - if datatype in [DataTypes.BOOL, DataTypes.BOOL_U08]: - value = True if value == 1 else False - # Save the value into the Dictionary - if len(decode_details) == 2: - dict_to_update[key_1] = value - elif len(decode_details) == 3: - dict_to_update[key_1][key_2] = value - start_pos = end_pos - if debug: - print('Finished cycle\n') - if debug: - print('done\n') Index: tests/DebugMsgCatcher.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- tests/DebugMsgCatcher.py (.../DebugMsgCatcher.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ tests/DebugMsgCatcher.py (.../DebugMsgCatcher.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -24,7 +24,7 @@ import threading from dialin.hd.hemodialysis_device import HD from dialin.dg.dialysate_generator import DG -from dialin.common.msg_defs import MsgIds, MsgFieldPositions +from dialin.common.msg_defs import MsgIds from dialin.protocols.CAN import CanMessenger, CanMessage, Channels from dialin.utils.base import AbstractSubSystem, publish, LogManager from dialin.utils.checks import check_broadcast_interval_override_ms Index: tests/unit_tests/test_enums.py =================================================================== diff -u -r72c423da1d07c40699f40b5da5bee6d992d3082c -r3f4937e339925dde0b95f08e49969f8983c5cba4 --- tests/unit_tests/test_enums.py (.../test_enums.py) (revision 72c423da1d07c40699f40b5da5bee6d992d3082c) +++ tests/unit_tests/test_enums.py (.../test_enums.py) (revision 3f4937e339925dde0b95f08e49969f8983c5cba4) @@ -22,7 +22,7 @@ def test_msg_defs(self): try: - from leahi_dialin.common.msg_defs import MsgIds + from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.msg_defs import RequestRejectReasons except ValueError as e: self.fail("Could not import msg_defs: {0}".format(e))