Index: dialin/common/alarm_defs.py =================================================================== diff -u -rcd3313bfafed2f2a1e43cf2591f1248db23d0b88 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision cd3313bfafed2f2a1e43cf2591f1248db23d0b88) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -8,9 +8,9 @@ # @file alarm_defs.py # # @author (last) Peter Lucia -# @date (last) 03-May-2021 +# @date (last) 10-Jun-2021 # @author (original) Peter Lucia -# @date (original) 03-May-2021 +# @date (original) 10-Jun-2021 # ############################################################################ from enum import unique @@ -21,195 +21,3 @@ @unique class AlarmList(AlarmEnum): ALARM_ID_NO_ALARM = 0 - ALARM_ID_HD_SOFTWARE_FAULT = 1 - ALARM_ID_STUCK_BUTTON_TEST_FAILED = 2 - ALARM_ID_FPGA_POST_TEST_FAILED = 3 - ALARM_ID_WATCHDOG_POST_TEST_FAILED = 4 - ALARM_ID_UI_COMM_POST_FAILED = 5 - ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK = 6 - ALARM_ID_BLOOD_PUMP_OFF_CHECK = 7 - ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK = 8 - ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK = 9 - ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK = 10 - ALARM_ID_DIAL_IN_PUMP_OFF_CHECK = 11 - ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK = 12 - ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK = 13 - ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK = 14 - ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK = 15 - ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK = 16 - ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK = 17 - ALARM_ID_WATCHDOG_EXPIRED = 18 - ALARM_ID_RTC_COMM_ERROR = 19 - ALARM_ID_RTC_CONFIG_ERROR = 20 - ALARM_ID_DG_COMM_TIMEOUT = 21 - ALARM_ID_UI_COMM_TIMEOUT = 22 - ALARM_ID_COMM_TOO_MANY_BAD_CRCS = 23 - ALARM_ID_TREATMENT_STOPPED_BY_USER = 24 - ALARM_ID_BLOOD_SITTING_WARNING = 25 - ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME = 26 - ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK = 27 - ALARM_ID_CAN_MESSAGE_NOT_ACKED = 28 - ALARM_ID_OCCLUSION_BLOOD_PUMP = 29 - ALARM_ID_OCCLUSION_DIAL_IN_PUMP = 30 - ALARM_ID_OCCLUSION_DIAL_OUT_PUMP = 31 - ALARM_ID_ARTERIAL_PRESSURE_LOW = 32 - ALARM_ID_ARTERIAL_PRESSURE_HIGH = 33 - ALARM_ID_VENOUS_PRESSURE_LOW = 34 - ALARM_ID_VENOUS_PRESSURE_HIGH = 35 - ALARM_ID_UF_RATE_TOO_HIGH_ERROR = 36 - ALARM_ID_UF_VOLUME_ACCURACY_ERROR = 37 - ALARM_ID_RTC_BATTERY_LOW = 38 - ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE = 39 - ALARM_ID_RTC_RAM_OPS_ERROR = 40 - ALARM_ID_NVDATA_EEPROM_OPS_FAILURE = 41 - ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR = 42 - ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR = 43 - ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR = 44 - ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR = 45 - ALARM_ID_RO_PUMP_OUT_PRESSURE_OUT_OF_RANGE = 47 - ALARM_ID_TEMPERATURE_SENSORS_FAULT = 48 - ALARM_ID_FPGA_COMM_TIMEOUT = 49 - ALARM_ID_HD_COMM_TIMEOUT = 50 - ALARM_ID_VALVE_CONTROL_FAILURE = 51 - ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 52 - ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 53 - ALARM_ID_HD_PRIME_PURGE_AIR_TIME_OUT = 54 - ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK = 55 - ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK = 56 - ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK = 57 - ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH = 58 - ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY = 59 - ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY = 60 - ALARM_ID_DG_SOFTWARE_FAULT = 61 - ALARM_ID_CONDUCTIVITY_SENSOR_FAULT = 62 - ALARM_ID_INLET_WATER_LOW_TEMPERATURE = 63 - ALARM_ID_INLET_WATER_HIGH_TEMPERATURE = 64 - ALARM_ID_PRESSURE_SENSOR_FAULT = 65 - ALARM_ID_INLET_WATER_LOW_PRESSURE = 66 - ALARM_ID_HD_CRITICAL_DATA_ERROR = 67 - ALARM_ID_HD_ACCELEROMETER_SELF_TEST_FAILURE = 68 - ALARM_ID_DG_ACCELEROMETER_SELF_TEST_FAILURE = 69 - ALARM_ID_HD_EXCESSIVE_TILT = 70 - ALARM_ID_DG_EXCESSIVE_TILT = 71 - ALARM_ID_HD_SHOCK = 72 - ALARM_ID_DG_SHOCK = 73 - ALARM_ID_HD_ACCELEROMETER_FAILURE = 74 - ALARM_ID_DG_ACCELEROMETER_FAILURE = 75 - ALARM_ID_DG_CRITICAL_DATA_ERROR = 76 - ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE = 77 - ALARM_ID_INLET_WATER_PRESSURE_FAULT = 78 - ALARM_ID_HD_VALVE_HOMING_FAILED = 79 - ALARM_ID_HD_VALVE_TRANSITION_TIMEOUT = 80 - ALARM_ID_HD_VALVE_NOT_FUNCTIONAL = 81 - ALARM_ID_HD_VALVE_CURRENT_OUT_OF_RANGE = 82 - ALARM_ID_HD_VALVE_POSITION_OUT_OF_RANGE = 83 - ALARM_ID_AIR_TRAP_ILLEGAL_LEVELS = 84 - ALARM_ID_AIR_TRAP_FILL_DURING_PRIME = 85 - ALARM_ID_AIR_TRAP_FILL_DURING_TREATMENT = 86 - ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW = 87 - ALARM_ID_DIALYSATE_FLOW_SIGNAL_STRENGTH_TOO_LOW = 88 - ALARM_ID_EMPTY_SALINE_BAG = 89 - ALARM_ID_SALINE_BOLUS_VOLUME_CHECK_FAILURE = 90 - ALARM_ID_ARTERIAL_PRESSURE_SENSOR_FAULT = 91 - ALARM_ID_VENOUS_PRESSURE_SENSOR_FAULT = 92 - ALARM_ID_UV_REACTOR_NOT_HEALTHY = 93 - ALARM_ID_ACID_CONDUCTIVITY_OUT_OF_RANGE = 94 - ALARM_ID_BICARB_CONDUCTIVITY_OUT_OF_RANGE = 95 - ALARM_ID_RO_PUMP_FLOW_RATE_OUT_OF_RANGE = 96 - ALARM_ID_DG_THERMISTORS_TEMPERATURE_OUT_OF_RANGE = 97 - ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE = 98 - ALARM_ID_DG_DIALYSATE_FILL_OUT_OF_TIME = 99 - ALARM_ID_CP1_SPEED_CONTROL_ERROR = 100 - ALARM_ID_CP2_SPEED_CONTROL_ERROR = 101 - ALARM_ID_FLOW_RATE_OUT_OF_UPPER_RANGE = 102 - ALARM_ID_RO_PUMP_PRESSURE_OUT_OF_RANGE = 103 - ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE = 104 - ALARM_ID_DG_HEATERS_NEGATIVE_COLD_JUNCTION_TEMPERATURE = 105 - ALARM_ID_DG_HEATERS_FAULT = 106 - ALARM_ID_END_OF_TREATMENT_WARNING = 107 - ALARM_ID_END_OF_TREATMENT_ALARM = 108 - ALARM_ID_END_OF_TREATMENT_HIGH = 109 - ALARM_ID_DG_HEAT_DISINFECT_CYCLE_FAILED = 110 - ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT = 111 - ALARM_ID_FLOW_RATE_OUT_OF_LOWER_RANGE = 112 - ALARM_ID_DRAIN_PUMP_OFF_FAULT = 113 - ALARM_ID_RO_PUMP_OFF_FAULT = 114 - ALARM_ID_PRIME_DIALYSATE_DIALYZER_TIME_OUT = 115 - ALARM_ID_PRIME_DIALYSATE_BYPASS_TIME_OUT = 116 - ALARM_ID_PRIME_COMPLETED_LOW_PRIORITY = 117 - ALARM_ID_PRIME_COMPLETED_MEDIUM_PRIORITY = 118 - ALARM_ID_PRIME_COMPLETED_HIGH_PRIORITY = 119 - ALARM_ID_PRIME_OUT_OF_TIME = 120 - ALARM_ID_DG_COMMAND_INVALID_PARAMETER_FAULT = 121 - ALARM_ID_HD_LOAD_CELL_ACCELERATION_RES_1_ALARM = 122 - ALARM_ID_HD_LOAD_CELL_ACCELERATION_RES_2_ALARM = 123 - ALARM_ID_TREATMENT_STOPPED_AFTER_RINSEBACK = 124 - ALARM_ID_TREATMENT_RINSEBACK_TIMEOUT_ALARM = 125 - ALARM_ID_TREATMENT_RECIRC_TIMEOUT_ALARM = 126 - ALARM_ID_CARTRIDGE_DOOR_OPENED = 127 - ALARM_ID_PRE_TREATMENT_NO_CART_SELF_TEST_FAILURE = 128 - ALARM_ID_INSTALL_NEW_CARTRIDGE = 129 - ALARM_ID_CARTRIDGE_INSTALLED_IMPROPERLY = 130 - ALARM_ID_RINSEBACK_VOLUME_CHECK_FAILURE = 131 - ALARM_ID_NO_CARTRIDGE_LOADED = 132 - ALARM_ID_END_TREATMENT_TIMEOUT_ALARM = 133 - ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE = 134 - ALARM_ID_DIALYSATE_TEMPERATURE_TOO_HIGH = 135 - ALARM_ID_DIALYSATE_TEMPERATURE_TOO_LOW = 136 - ALARM_ID_PRE_TREATMENT_DRY_SELF_TEST_FAILURE = 137 - ALARM_ID_PRE_TREATMENT_WET_SELF_TEST_FAILURE = 138 - ALARM_ID_DG_FLOW_METER_CHECK_FAILURE = 139 - ALARM_ID_DG_RO_PUMP_TOO_MANY_RAMP_UP_RETRY = 140 - ALARM_ID_NVDATAMGMT_GROUP_RECORD_CRC_INVALID = 141 - ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_CRC_INVALID = 142 - ALARM_ID_NVDATAMGMT_INDIVIDUAL_RECORD_TIME_INVALID = 143 - ALARM_ID_HD_AC_POWER_LOST = 144 - ALARM_ID_DG_RESTARTED_FAULT = 145 - ALARM_ID_DIALYSATE_CONDUCTIVITY_OUT_OF_RANGE = 146 - ALARM_ID_HD_FLUID_LEAK_DETECTED = 147 - ALARM_ID_DG_FLUID_LEAK_DETECTED = 148 - ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR = 149 - ALARM_ID_HD_SYRINGE_DETECTED = 150 - ALARM_ID_HD_SYRINGE_PUMP_VOLUME_ERROR = 151 - ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR = 152 - ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY = 153 - ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION = 154 - ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_REMOVED = 155 - ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR = 156 - ALARM_ID_HD_BLOOD_LEAK_DETECTED = 157 - ALARM_ID_CARTRIDGE_REMOVAL_FAILURE = 158 - ALARM_ID_DG_RESERVOIR_DRAIN_TIMEOUT = 159 - ALARM_ID_DG_RESERVOIR_FILL_TIMEOUT = 160 - ALARM_ID_DG_RESERVOIR_LEAK_TIMEOUT = 161 - ALARM_ID_DG_HEAT_DISINFECT_TARGET_TEMP_TIMEOUT = 162 - ALARM_ID_DG_TEMP_SENSORS_DIFF_OUT_OF_RANGE = 163 - ALARM_ID_DG_HEAT_DISINFECT_INLET_PRES_AND_TEMP_SNSRS_OUT = 164 - ALARM_ID_DG_HEAT_DISINFECT_INLET_COND_AND_TEMP_OUT = 165 - ALARM_ID_DG_BAD_INLET_WATER_QUALITY = 166 - ALARM_ID_HD_BP_OCCLUSION_SELF_TEST_FAILURE = 167 - ALARM_ID_HD_DIP_OCCLUSION_SELF_TEST_FAILURE = 168 - ALARM_ID_HD_DOP_OCCLUSION_SELF_TEST_FAILURE = 169 - ALARM_ID_HD_ARTERIAL_PRESSURE_SELF_TEST_FAILURE = 170 - ALARM_ID_HD_VENOUS_PRESSURE_SELF_TEST_FAILURE = 171 - ALARM_ID_HD_BLOOD_FLOW_STATUS_SELF_TEST_FAILURE = 172 - ALARM_ID_HD_DIALYSATE_FLOW_STATUS_SELF_TEST_FAILURE = 173 - ALARM_ID_HD_BLOOD_LEAK_SELF_TEST_FAILURE = 174 - ALARM_ID_HD_BLOOD_LEAK_FAULT = 175 - ALARM_ID_DG_LOAD_CELLS_INVALID_CALIBRATION = 176 - ALARM_ID_HD_VOLTAGE_OUT_OF_RANGE = 177 - ALARM_ID_DG_PRIMARY_HEATERS_INTERNAL_TEMP_OUT_OF_RANGE = 178 - ALARM_ID_DG_TRIMMER_HEATER_INTERNAL_TEMP_OUT_OF_RANGE = 179 - ALARM_ID_DG_HEATERS_ON_WITH_NO_FLOW_TIMEOUT = 180 - ALARM_ID_DIALYSATE_CONDUCTIVITY_FAULT = 181 - ALARM_ID_DIALYSATE_TEMPERATURE_HIGH = 182 - ALARM_ID_DIALYSATE_TEMPERATURE_LOW = 183 - ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE = 184 - ALARM_ID_DG_DRAIN_CIRCULATION_LINE_TIMEOUT = 185 - ALARM_ID_DG_INVALID_LOAD_CELL_VALUE = 186 - ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR = 187 - ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR = 188 - ALARM_ID_HD_SYRINGE_PUMP_FAULT = 189 - ALARM_ID_HD_SYRINGE_PUMP_OVER_TRAVEL_ERROR = 190 - ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM = 191 - ALARM_ID_HD_SYRINGE_PUMP_DAC_WRITE_ERROR = 192 - ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR = 193 Index: dialin/common/msg_ids.py =================================================================== diff -u -rcd3313bfafed2f2a1e43cf2591f1248db23d0b88 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision cd3313bfafed2f2a1e43cf2591f1248db23d0b88) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -8,9 +8,9 @@ # @file msg_ids.py # # @author (last) Peter Lucia -# @date (last) 03-May-2021 +# @date (last) 10-Jun-2021 # @author (original) Peter Lucia -# @date (original) 03-May-2021 +# @date (original) 10-Jun-2021 # ############################################################################ from enum import unique @@ -22,6 +22,20 @@ class MsgIds(DialinEnum): MSG_ID_UNUSED = 0X0 MSG_ID_OFF_BUTTON_PRESS = 0X1 + MSG_ID_ALARM_STATUS = 0X2 + MSG_ID_ALARM_TRIGGERED = 0X3 + MSG_ID_ALARM_CLEARED = 0X4 + MSG_ID_BLOOD_FLOW_DATA = 0X5 + MSG_ID_DG_CHECK_IN = 0X6 + MSG_ID_UI_CHECK_IN = 0X7 + MSG_ID_DIALYSATE_FLOW_DATA = 0X8 + MSG_ID_PRESSURE_OCCLUSION_DATA = 0X9 + MSG_ID_RTC_EPOCH = 0XA + MSG_ID_DIALYSATE_OUT_FLOW_DATA = 0XB + MSG_ID_LOAD_CELL_READINGS = 0XC + MSG_ID_TREATMENT_TIME = 0XD + MSG_ID_POWER_OFF_WARNING = 0XE + MSG_ID_TREATMENT_STATE = 0XF MSG_ID_USER_UF_PAUSE_RESUME_REQUEST = 0X10 MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST = 0X11 MSG_ID_USER_SALINE_BOLUS_REQUEST = 0X12 @@ -38,7 +52,6 @@ MSG_ID_HD_VERSION = 0X1D MSG_ID_DG_VERSION = 0X1E MSG_ID_RO_PUMP_DATA = 0X1F - MSG_ID_ALARM_STATUS = 0X2 MSG_ID_DG_PRESSURES_DATA = 0X20 MSG_ID_DG_SWITCH_RESERVOIR_CMD = 0X21 MSG_ID_DG_FILL_CMD = 0X22 @@ -55,7 +68,6 @@ MSG_ID_DG_TEMPERATURE_DATA = 0X2D MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE = 0X2E MSG_ID_SALINE_BOLUS_DATA = 0X2F - MSG_ID_ALARM_TRIGGERED = 0X3 MSG_ID_DG_START_STOP_HEAT_DISINFECT = 0X30 MSG_ID_DG_CONDUCTIVITY_DATA = 0X31 MSG_ID_USER_REQUEST_ALARM_SILENCE = 0X32 @@ -72,7 +84,6 @@ MSG_ID_HD_START_PRIME_RESPONSE = 0X3D MSG_ID_HD_AIR_TRAP_DATA = 0X3E MSG_ID_ALARM_CONDITION_CLEARED = 0X3F - MSG_ID_ALARM_CLEARED = 0X4 MSG_ID_UI_ALARM_USER_ACTION = 0X40 MSG_ID_USER_UF_PAUSE_RESUME_RESPONSE = 0X41 MSG_ID_DG_CONCENTRATE_PUMP_DATA = 0X42 @@ -89,7 +100,6 @@ MSG_ID_HD_HEPARIN_DATA_BROADCAST = 0X4D MSG_ID_UI_SET_ALARM_AUDIO_VOLUME_LEVEL_CMD = 0X4E MSG_ID_UI_SET_UF_VOLUME_PARAMETER = 0X4F - MSG_ID_BLOOD_FLOW_DATA = 0X5 MSG_ID_HD_SET_UF_VOLUME_PARAMETER_RESPONSE = 0X50 MSG_ID_DG_COMMAND_RESPONSE = 0X51 MSG_ID_UI_RINSEBACK_CMD = 0X52 @@ -106,7 +116,6 @@ MSG_ID_UI_SAMPLE_WATER_CMD = 0X5D MSG_ID_HD_SAMPLE_WATER_CMD_RESPONSE = 0X5E MSG_ID_UI_SAMPLE_WATER_RESULT = 0X5F - MSG_ID_DG_CHECK_IN = 0X6 MSG_ID_DG_FILTER_FLUSH_PROGRESS = 0X60 MSG_ID_HD_NO_CART_SELF_TEST_PROGRESS = 0X61 MSG_ID_UI_INSTALLATION_CONFIRM = 0X62 @@ -123,7 +132,6 @@ MSG_ID_UI_HD_SET_RTC_REQUEST = 0X6D MSG_ID_HD_UI_SET_RTC_RESPONSE = 0X6E MSG_ID_UI_DG_SET_RTC_REQUEST = 0X6F - MSG_ID_UI_CHECK_IN = 0X7 MSG_ID_DG_UI_SET_RTC_RESPONSE = 0X70 MSG_ID_UI_START_TREATMENT_REQUEST = 0X71 MSG_ID_HD_START_TREATMENT_RESPONSE = 0X72 @@ -138,7 +146,38 @@ MSG_ID_HD_VOLTAGES_DATA = 0X7B MSG_ID_HD_ALARM_AUDIO_VOLUME_SET_RESPONSE = 0X7C MSG_ID_HD_ALARM_INFORMATION = 0X7D - MSG_ID_DIALYSATE_FLOW_DATA = 0X8 + MSG_ID_HD_STANDBY_STATE = 0X7E + MSG_ID_UI_DISINFECT_REQUEST = 0X7F + MSG_ID_HD_DISINFECT_RESPONSE = 0X80 + MSG_ID_UI_CHEM_DISINFECT_CONFIRM = 0X81 + MSG_ID_HD_CHEM_DISINFECT_CONFIRM_RESPONSE = 0X82 + MSG_ID_DG_FLUSH_TIME_DATA = 0X83 + MSG_ID_DG_HEAT_DISINFECT_TIME_DATA = 0X84 + MSG_ID_DG_CHEM_DISINFECT_TIME_DATA = 0X85 + MSG_ID_DG_VOLTAGES_DATA = 0X86 + MSG_ID_DG_CHEM_DISINFECT_DATA = 0X87 + MSG_ID_DG_SERIAL_NUMBER = 0X88 + MSG_ID_UI_REQUEST_SYSTEM_USAGE_INFO = 0X89 + MSG_ID_HD_SERVICE_SCHEDULE_DATA = 0X8A + MSG_ID_HD_USAGE_DATA = 0X8B + MSG_ID_DG_SERVICE_SCHEDULE_DATA = 0X8C + MSG_ID_DG_USAGE_DATA = 0X8D + MSG_ID_HD_POST_SINGLE_TEST_RESULT = 0X8E + MSG_ID_HD_POST_FINAL_TEST_RESULT = 0X8F + MSG_ID_DG_POST_SINGLE_TEST_RESULT = 0X90 + MSG_ID_DG_POST_FINAL_TEST_RESULT = 0X91 + MSG_ID_UI_POST_FINAL_TEST_RESULT = 0X92 + MSG_ID_HD_BUBBLES_DATA = 0X93 + MSG_ID_HD_TREATMENT_LOG_PERIODIC_DATA = 0X94 + MSG_ID_HD_TREATMENT_LOG_ALARM_EVENT = 0X95 + MSG_ID_HD_TREATMENT_LOG_EVENT = 0X96 + MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST = 0X97 + MSG_ID_HD_ACTIVE_ALARMS_LIST_REQUEST_RESPONSE = 0X98 + MSG_ID_HD_SERIAL_NUMBER = 0X99 + MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_REQUEST = 0X9A + MSG_ID_HD_SET_STANDBY_DISINFECT_SUB_MODE_RESPONSE = 0X9B + MSG_ID_HD_DISINFECTS_UI_STATE_READINGS = 0X9C + MSG_ID_CAN_ERROR_COUNT = 0X999 MSG_ID_TESTER_LOGIN_REQUEST = 0X8000 MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE = 0X8001 MSG_ID_OFF_BUTTON_STATE_OVERRIDE = 0X8002 @@ -230,11 +269,9 @@ MSG_ID_HD_SYRINGE_PUMP_ENCODER_STATUS_OVERRIDE = 0X805A MSG_ID_HD_SYRINGE_PUMP_ADC_DAC_STATUS_OVERRIDE = 0X805B MSG_ID_HD_SYRINGE_PUMP_ADC_READ_COUNTER_OVERRIDE = 0X805C - MSG_ID_DG_VOLTAGES_DATA = 0X86 - MSG_ID_DG_CHEM_DISINFECT_DATA = 0X87 - MSG_ID_PRESSURE_OCCLUSION_DATA = 0X9 - MSG_ID_CAN_ERROR_COUNT = 0X999 - MSG_ID_RTC_EPOCH = 0XA + MSG_ID_HD_BUBBLES_DATA_SEND_INTERVAL_OVERRIDE = 0X805D + MSG_ID_HD_BUBBLE_STATUS_OVERRIDE = 0X805E + MSG_ID_HD_BUBBLE_SELF_TEST_REQUEST = 0X8060 MSG_ID_DG_TESTER_LOGIN_REQUEST = 0XA000 MSG_ID_DG_ALARM_STATE_OVERRIDE = 0XA001 MSG_ID_DG_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0XA002 @@ -298,11 +335,7 @@ MSG_ID_DG_FLUID_LEAK_SEND_INTERVAL_OVERRIDE = 0XA03F MSG_ID_DG_FLUID_LEAK_STATE_DETECTOR_OVERRIDE = 0XA040 MSG_ID_DG_FLUSH_PUBLISH_INTERVAL_OVERRIDE = 0XA041 - MSG_ID_DIALYSATE_OUT_FLOW_DATA = 0XB - MSG_ID_LOAD_CELL_READINGS = 0XC - MSG_ID_TREATMENT_TIME = 0XD - MSG_ID_POWER_OFF_WARNING = 0XE - MSG_ID_TREATMENT_STATE = 0XF + MSG_ID_FILTER_FLUSH_TIME_PERIOD_OVERRIDE = 0XA042 MSG_ID_HD_DEBUG_EVENT = 0XFFF1 MSG_ID_DG_DEBUG_EVENT = 0XFFF2 MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0XFFFF Index: dialin/dg/accelerometer.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/accelerometer.py (.../accelerometer.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/accelerometer.py (.../accelerometer.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -20,6 +20,7 @@ from .constants import RESET, NO_RESET from ..utils.base import _AbstractSubSystem, _publish from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..utils.checks import check_broadcast_interval_override_ms from logging import Logger class DGAccelerometer(_AbstractSubSystem): @@ -216,6 +217,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/dg/concentrate_pumps.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/concentrate_pumps.py (.../concentrate_pumps.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/concentrate_pumps.py (.../concentrate_pumps.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -16,6 +16,7 @@ import struct from .constants import RESET,NO_RESET from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, DialinEnum from ..common.msg_defs import MsgIds @@ -212,6 +213,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + reset_byte_array = integer_to_bytearray(reset) ms_byte_array = integer_to_bytearray(ms) payload = reset_byte_array + ms_byte_array Index: dialin/dg/conductivity_sensors.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/conductivity_sensors.py (.../conductivity_sensors.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/conductivity_sensors.py (.../conductivity_sensors.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -16,6 +16,7 @@ import struct from .constants import RESET,NO_RESET from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, DialinEnum from ..common.msg_defs import MsgIds, MsgFieldPositions @@ -148,6 +149,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + reset_byte_array = integer_to_bytearray(reset) ms_byte_array = integer_to_bytearray(ms) payload = reset_byte_array + ms_byte_array Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r98f33dd32881796730218a2b07595015da946466 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 98f33dd32881796730218a2b07595015da946466) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -13,7 +13,6 @@ # @date (original) 02-Apr-2020 # ############################################################################ -import struct from .accelerometer import DGAccelerometer from .alarms import DGAlarms from .concentrate_pumps import ConcentratePumps @@ -23,7 +22,6 @@ from .fans import Fans from .hd_proxy import DGHDProxy from .heaters import Heaters -from .heat_disinfect import HeatDisinfect from .load_cells import DGLoadCells from .pressures import DGPressures from .reservoirs import DGReservoirs @@ -38,11 +36,33 @@ from .scheduled_runs_record import DGScheduledRunsNVRecord from .valves import DGValves from .voltages import DGVoltages +from ..utils import * from ..protocols.CAN import (DenaliCanMessenger, DenaliMessage, DenaliChannels) -from ..utils.base import _AbstractSubSystem, _publish, _LogManager +from ..utils.base import _AbstractSubSystem, _publish, _LogManager, DialinEnum from ..common.msg_defs import MsgIds, MsgFieldPositions +from .flush import FlushMode +from .chemical_disinfect import ChemicalDisinfect +from .heat_disinfect import HeatDisinfect +from .rtc import DGRTC +from enum import unique +@unique +class DGOperationModes(DialinEnum): + # DG operation modes + DG_OP_MODE_FAULT = 0 + DG_OP_MODE_SERVICE = 1 + DG_OP_MODE_INIT_POST = 2 + DG_OP_MODE_STANDBY = 3 + DG_OP_MODE_STANDBY_SOLO = 4 + DG_OP_MODE_RECIRCULATE = 5 + DG_OP_MODE_FILL = 6 + DG_OP_MODE_DRAIN = 7 + DG_OP_MODE_FLUSH = 8 + DG_OP_MODE_DISINFECT = 9 + DG_OP_MODE_CHEMICAL_DISINFECT = 10 + + class DG(_AbstractSubSystem): """ Dialysate Generator (DG) Dialin object API. It provides the basic interface to communicate with @@ -72,19 +92,6 @@ START_POS_FPGA_LAB = END_POS_FPGA_MINOR END_POS_FPGA_LAB = START_POS_FPGA_LAB + 1 - # DG operation modes - DG_OP_MODE_FAULT = 0 - DG_OP_MODE_SERVICE = 1 - DG_OP_MODE_INIT_POST = 2 - DG_OP_MODE_STANDBY = 3 - DG_OP_MODE_STANDBY_SOLO = 4 - DG_OP_MODE_RECIRCULATE = 5 - DG_OP_MODE_FILL = 6 - DG_OP_MODE_DRAIN = 7 - DG_OP_MODE_FLUSH = 8 - DG_OP_MODE_DISINFECT = 9 - DG_OP_MODE_CHEMICAL_DISINFECT = 10 - # DG sub_modes DG_POST_STATE_START = 0 # Start initialize & POST mode state DG_POST_STATE_FPGA = 1 # FPGA POST test state @@ -133,7 +140,7 @@ self.dg_version = None self.fpga_version = None # create properties - self.dg_operation_mode = self.DG_OP_MODE_INIT_POST + self.dg_operation_mode = 0 #self.DG_OP_MODE_INIT_POST self.dg_operation_sub_mode = 0 self.dg_logged_in = False self.dg_set_logged_in_status(False) @@ -166,6 +173,9 @@ self.scheduled_runs_record = DGScheduledRunsNVRecord(self.can_interface, self.logger) self.valves = DGValves(self.can_interface, self.logger) self.voltages = DGVoltages(self.can_interface, self.logger) + self.flush = FlushMode(self.can_interface, self.logger) + self.chemical_disinfect = ChemicalDisinfect(self.can_interface, self.logger) + self.rtc = DGRTC(self.can_interface, self.logger) def get_version(self): """ @@ -269,7 +279,7 @@ self.dg_operation_mode = mode[0] self.dg_operation_sub_mode = smode[0] - def cmd_log_in_to_dg(self, resend: bool = False): + def cmd_log_in_to_dg(self, resend: bool = False) -> int: """ Constructs and sends a login command via CAN bus. Login required before \n other commands can be sent to the DG. @@ -298,7 +308,7 @@ self.logger.error("Timeout!!!!") return False - def cmd_ui_request_dg_version(self): + def cmd_ui_request_dg_version(self) -> None: """ Constructs and sends the ui request for version message @@ -311,12 +321,10 @@ self.can_interface.send(message, 0) - def cmd_dg_safety_shutdown_override(self): + def cmd_dg_safety_shutdown_override(self) -> int: """ Constructs and sends an DG safety shutdown override command via CAN bus. - \returns response message if received, False if no response received - @return: 1 if successful, zero otherwise """ @@ -338,16 +346,13 @@ self.logger.debug("Timeout!!!!") return False - def cmd_dg_software_reset_request(self): + def cmd_dg_software_reset_request(self) -> None: """ Constructs and sends an DG software reset request via CAN bus. Constraints: Must be logged into DG. - \returns response message if received, False if no response received - - @return: 1 if successful, zero otherwise - + @return: None """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, @@ -359,4 +364,3 @@ self.can_interface.send(message, 0) self.logger.debug("Sent request to DG to reset...") self.dg_set_logged_in_status(False) - return True Index: dialin/dg/drain_pump.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/drain_pump.py (.../drain_pump.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/drain_pump.py (.../drain_pump.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -19,6 +19,7 @@ from .constants import RESET, NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, DialinEnum +from ..utils.checks import check_broadcast_interval_override_ms from logging import Logger from enum import unique @@ -157,6 +158,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/dg/fans.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/fans.py (.../fans.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/fans.py (.../fans.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -1,6 +1,7 @@ import struct from ..utils.conversions import integer_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import NO_RESET, RESET from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -149,6 +150,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/dg/fluid_leak.py =================================================================== diff -u -ra2d44432a913537ca0627cd7dde7dcb1154f2156 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/fluid_leak.py (.../fluid_leak.py) (revision a2d44432a913537ca0627cd7dde7dcb1154f2156) +++ dialin/dg/fluid_leak.py (.../fluid_leak.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -31,8 +31,8 @@ """ # Fluid leak detector state - FLUID_LEAK_DETECTED = 0 # Wet - NO_FLUID_LEAK_DETECTED = 1 # Dry + FLUID_LEAK_DETECTED_STATE = 0 # Wet + NO_FLUID_LEAK_DETECTED_STATE = 1 # Dry def __init__(self, can_interface, logger: Logger): """ @@ -49,7 +49,7 @@ self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_fluid_leak_sync) - self.fluid_leak_state = self.NO_FLUID_LEAK_DETECTED + self.fluid_leak_state = self.NO_FLUID_LEAK_DETECTED_STATE def get_fluid_leak_state(self): """ @@ -59,8 +59,8 @@ """ return self.fluid_leak_state - @_publish("fluid_leak_state") - def _handler_fluid_leak_sync(self, message): + @_publish(["fluid_leak_state"]) + def _handler_fluid_leak_sync(self, message: dict) -> None: """ Handles published fluid leak state messages. Fluid leak state is captured for reference. @@ -74,7 +74,7 @@ self.fluid_leak_state = state[0] - def cmd_fluid_leak_detector_override(self, detected, reset=NO_RESET): + def cmd_fluid_leak_detector_override(self, detected: int, reset: int = NO_RESET) -> int: """ Constructs and sends the fluid leak detector state override command Constraints: @@ -87,7 +87,7 @@ """ rst = integer_to_bytearray(reset) - det = float_to_bytearray(detected) + det = integer_to_bytearray(detected) payload = rst + det message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, @@ -107,7 +107,7 @@ self.logger.debug("Timeout!!!!") return False - def cmd_fluid_leak_state_broadcast_interval_override(self, ms, reset=NO_RESET): + def cmd_fluid_leak_state_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the fluid leak state broadcast interval override command Constraints: @@ -147,4 +147,4 @@ return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: self.logger.debug("Timeout!!!!") - return False + return False \ No newline at end of file Index: dialin/dg/heaters.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/heaters.py (.../heaters.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/heaters.py (.../heaters.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -17,6 +17,7 @@ import struct from ..utils.conversions import integer_to_bytearray from ..utils.conversions import float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..common.msg_defs import MsgIds, MsgFieldPositions from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -203,6 +204,9 @@ @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + resetValue = integer_to_bytearray(reset) intervalValue = integer_to_bytearray(ms) payload = resetValue + intervalValue Index: dialin/dg/load_cells.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/load_cells.py (.../load_cells.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/load_cells.py (.../load_cells.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -15,6 +15,7 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..common.msg_defs import MsgIds, MsgFieldPositions from .constants import RESET,NO_RESET from ..protocols.CAN import (DenaliMessage, @@ -140,6 +141,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/dg/pressures.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/pressures.py (.../pressures.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/pressures.py (.../pressures.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -15,6 +15,7 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..common.msg_defs import MsgIds, MsgFieldPositions from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, @@ -149,6 +150,9 @@ """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) ivl = integer_to_bytearray(ms) payload = rst + ivl Index: dialin/dg/reservoirs.py =================================================================== diff -u -r8a13a85045edfcf69bf0e728d294f04b924d732c -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/reservoirs.py (.../reservoirs.py) (revision 8a13a85045edfcf69bf0e728d294f04b924d732c) +++ dialin/dg/reservoirs.py (.../reservoirs.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -15,7 +15,6 @@ ############################################################################ import struct from logging import Logger - from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish Index: dialin/dg/ro_pump.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/ro_pump.py (.../ro_pump.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/ro_pump.py (.../ro_pump.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -15,6 +15,7 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..common.msg_defs import MsgIds, MsgFieldPositions from .constants import RESET, NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -243,6 +244,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/dg/temperature_sensors.py =================================================================== diff -u -r97592c35f4d79caf180f4bfc8f68bd4823829347 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision 97592c35f4d79caf180f4bfc8f68bd4823829347) +++ dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -16,6 +16,7 @@ import struct from ..utils.conversions import integer_to_bytearray from ..utils.conversions import float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..common.msg_defs import MsgIds, MsgFieldPositions from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -212,6 +213,9 @@ @param reset: (int) 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + reset_value = integer_to_bytearray(reset) interval_value = integer_to_bytearray(ms) payload = reset_value + interval_value Index: dialin/dg/thermistors.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/thermistors.py (.../thermistors.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/thermistors.py (.../thermistors.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -4,6 +4,7 @@ from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, DialinEnum from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import RESET, NO_RESET from logging import Logger from enum import unique @@ -111,6 +112,9 @@ @param reset: (int) 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/dg/uv_reactors.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/uv_reactors.py (.../uv_reactors.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/uv_reactors.py (.../uv_reactors.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -1,6 +1,7 @@ import struct from ..utils.conversions import integer_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import NO_RESET, RESET from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -128,6 +129,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/dg/valves.py =================================================================== diff -u -r5aea950f649f72211632cbb17be314f3b4c24f10 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/dg/valves.py (.../valves.py) (revision 5aea950f649f72211632cbb17be314f3b4c24f10) +++ dialin/dg/valves.py (.../valves.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -16,6 +16,7 @@ import struct from ..utils.conversions import integer_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from ..common.msg_defs import MsgIds from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -346,6 +347,9 @@ """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) ivl = integer_to_bytearray(ms) payload = rst + ivl Index: dialin/hd/accelerometer.py =================================================================== diff -u -r97592c35f4d79caf180f4bfc8f68bd4823829347 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/accelerometer.py (.../accelerometer.py) (revision 97592c35f4d79caf180f4bfc8f68bd4823829347) +++ dialin/hd/accelerometer.py (.../accelerometer.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -17,6 +17,7 @@ from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import RESET, NO_RESET from ..utils.base import _AbstractSubSystem, _publish from ..common.msg_defs import MsgIds, MsgFieldPositions @@ -216,6 +217,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/hd/air_trap.py =================================================================== diff -u -r0f4ba40a63c79697d979203f67ef0338a12cae23 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/air_trap.py (.../air_trap.py) (revision 0f4ba40a63c79697d979203f67ef0338a12cae23) +++ dialin/hd/air_trap.py (.../air_trap.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -15,6 +15,7 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import RESET,NO_RESET from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import (DenaliMessage, @@ -149,6 +150,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/hd/alarms.py =================================================================== diff -u -r97592c35f4d79caf180f4bfc8f68bd4823829347 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/alarms.py (.../alarms.py) (revision 97592c35f4d79caf180f4bfc8f68bd4823829347) +++ dialin/hd/alarms.py (.../alarms.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -22,6 +22,7 @@ DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms class HDAlarms(_AbstractSubSystem): @@ -504,6 +505,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/hd/blood_flow.py =================================================================== diff -u -r97592c35f4d79caf180f4bfc8f68bd4823829347 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/blood_flow.py (.../blood_flow.py) (revision 97592c35f4d79caf180f4bfc8f68bd4823829347) +++ dialin/hd/blood_flow.py (.../blood_flow.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -16,6 +16,7 @@ from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import RESET, NO_RESET from .constants import PUMP_CONTROL_MODE_CLOSED_LOOP, PUMP_CONTROL_MODE_OPEN_LOOP from ..utils.base import _AbstractSubSystem, _publish @@ -456,6 +457,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/hd/calibration_record.py =================================================================== diff -u -rdd42e4d9cfe821b0a755ccc86cc1a4a2a3dd2f37 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/calibration_record.py (.../calibration_record.py) (revision dd42e4d9cfe821b0a755ccc86cc1a4a2a3dd2f37) +++ dialin/hd/calibration_record.py (.../calibration_record.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -50,65 +50,46 @@ self._write_fw_data_to_excel = True self.cal_data = 0 self._raw_cal_record = [] - self._utilities = NVOpsUtils() - # Calibration main record - self.hd_calibration_record = OrderedDict() + self._utilities = NVOpsUtils(logger=self.logger) + # HD Calibration main record + self.hd_calibration_record = self._setup_base_calibration_record() if self.can_interface is not None: channel_id = DenaliChannels.hd_to_dialin_ch_id msg_id = MsgIds.MSG_ID_HD_SEND_CALIBRATION_RECORD.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_hd_calibration_sync) - # Prepare the calibration_record record by putting sub-dictionaries together - self._prepare_hd_calibration_record() - # Prepare the excel report and workspace - self._utilities.prepare_excel_report('HD', 'Calibration') - - def is_reading_record_done(self): + def cmd_request_hd_calibration_record(self) -> int: """ - Handles getting the status of reading record + Handles getting HD calibration_record record from firmware. - @return: True if reading is done otherwise False + @return: 1 upon success, False otherwise """ - return self._utilities.get_writing_to_excel_status() - - def get_hd_calibration_record(self): - """ - Handles getting HD calibration_record data from firmware. - - @return: None - """ if self._is_getting_cal_in_progress is not True: self._is_getting_cal_in_progress = True # Clear the list for the next call self._raw_cal_record.clear() - # Run the firmware commands to get the calibration_record record - self._request_hd_fw_calibration_record() - def _request_hd_fw_calibration_record(self): - """ - Handles getting HD calibration_record record from firmware. + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_GET_CALIBRATION_RECORD.value) - @return: None - """ - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=MsgIds.MSG_ID_HD_GET_CALIBRATION_RECORD.value) + self.logger.debug('Getting HD calibration record') - self.logger.debug('Getting HD calibration record') + received_message = self.can_interface.send(message) - received_message = self.can_interface.send(message) + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False + self.logger.debug("Request cancelled: an existing request is in progress.") + return False - @_publish(["current_message", "total_messages", "received_msg_length", "service_data"]) def _handler_hd_calibration_sync(self, message): """ Handles published HD calibration_record record messages. DG calibration_record records are captured for @@ -145,33 +126,30 @@ # Done with receiving the messages self._is_getting_cal_in_progress = False # If all the messages have been received, call another function to process the raw data - self._utilities.process_received_record_from_fw(self.hd_calibration_record, self._raw_cal_record, - write_to_excel=self._write_fw_data_to_excel) + self._utilities.process_received_record_from_fw(self.hd_calibration_record, self._raw_cal_record) + self._handler_received_complete_hd_calibration_record() - def set_hd_calibration_record(self): + @_publish(["hd_calibration_record"]) + def _handler_received_complete_hd_calibration_record(self): """ + Publishes the received system record + + @return: None + """ + self.logger.debug("Received a complete hd calibration record.") + + def cmd_set_hd_calibration_record(self, hd_calibration_record: OrderedDict) -> bool: + """ Handles updating the HD calibration_record record with the newest calibration_record data of a hardware and sends it to FW. + @param hd_calibration_record: (OrderedDict) the hd calibration record to be send @return: none """ - # Read the data from firmware but do not update the excel document - # At this step, another read from firmware is requested internally to update the dictionary. - # The values in the dictionary is compared against the excel report and if they are different, it automatically - # sets the calibration time and calculates the CRC for that group. By default once a read from firmware is - # requested, the excel report is updated automatically. - self._write_fw_data_to_excel = False - self.get_hd_calibration_record() - # Wait until reading calibration record from firmware is updated - while self._utilities.get_reading_record_status() is not True: - time.sleep(self._DIALIN_RECORD_UPDATE_DELAY_S) + record_packets = self._utilities.prepare_record_to_send_to_fw(hd_calibration_record) - # Write the excel record - self._utilities.write_excel_record_to_dialin_record(self.hd_calibration_record) - record_packets = self._utilities.prepare_record_to_send_to_fw(self.hd_calibration_record) + self.logger.debug("Setting HD calibration record") - self.logger.debug('Setting HD calibration record') - # Update all the data packets with the last message count since is the number of messages that firmware # should receive for packet in record_packets: @@ -192,12 +170,17 @@ self.logger.debug("Timeout!!!!") return False - def _prepare_hd_calibration_record(self): + self.logger.debug("Finished sending HD calibration record.") + return True + + def _setup_base_calibration_record(self): """ Handles assembling the sub dictionaries of each hardware group to make the main HD calibration_record record. - @return: None + @return: (OrderedDict) the assembled hd calibration record """ + result = OrderedDict() + groups_byte_size = 0 # create a list of the functions of the sub dictionaries functions = [self._prepare_pumps_record(), self._prepare_valves_record(), @@ -209,7 +192,7 @@ # Update the groups bytes size so far to be use to padding later groups_byte_size += function[1] # Update the calibration record - self.hd_calibration_record.update(function[0]) + result.update(function[0]) # Build the CRC of the main calibration_record record record_crc = OrderedDict({'crc': [' int: + def cmd_fluid_leak_detector_override(self, detected: int, reset: int = NO_RESET) -> int: """ Constructs and sends the fluid leak detector state override command Constraints: @@ -87,7 +87,7 @@ """ rst = integer_to_bytearray(reset) - det = float_to_bytearray(detected) + det = integer_to_bytearray(detected) payload = rst + det message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, @@ -107,7 +107,7 @@ self.logger.debug("Timeout!!!!") return False - def cmd_fluid_leak_state_broadcast_interval_override(self, ms:int, reset=NO_RESET) -> int: + def cmd_fluid_leak_state_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the fluid leak state broadcast interval override command Constraints: @@ -147,4 +147,4 @@ return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: self.logger.debug("Timeout!!!!") - return False + return False \ No newline at end of file Index: dialin/hd/hemodialysis_device.py =================================================================== diff -u -r97592c35f4d79caf180f4bfc8f68bd4823829347 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 97592c35f4d79caf180f4bfc8f68bd4823829347) +++ dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -89,6 +89,8 @@ # create properties self.hd_operation_mode = HDOpModes.MODE_INIT.value self.hd_operation_sub_mode = 0 + self.hd_logged_in = False + self.hd_set_logged_in_status(False) # Create command groups self.accel = HDAccelerometer(self.can_interface, self.logger) @@ -121,6 +123,23 @@ """ return self.hd_operation_mode + def get_hd_logged_in(self): + """ + Gets the logged in status of the HD + + @return: True if HD is logged in, False if not + """ + return self.hd_logged_in + + @_publish(["hd_logged_in"]) + def hd_set_logged_in_status(self, logged_in:bool=False): + """ + Callback for HD logged in status change. + @param logged_in boolean logged in status for HD + @return: none + """ + self.hd_logged_in = logged_in + @_publish(["hd_operation_mode"]) def _handler_hd_op_mode_sync(self, message): """ @@ -159,6 +178,7 @@ if received_message is not None: if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: self.logger.debug("Success: Logged In") + self.hd_set_logged_in_status(True) else: self.logger.debug("Failure: Log In Failed.") return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] @@ -295,3 +315,4 @@ # Send message self.can_interface.send(message, 0) self.logger.debug("Sent request to HD to reset...") + self.hd_set_logged_in_status(False) Index: dialin/hd/pressure_occlusion.py =================================================================== diff -u -r97592c35f4d79caf180f4bfc8f68bd4823829347 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision 97592c35f4d79caf180f4bfc8f68bd4823829347) +++ dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -17,6 +17,7 @@ from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import RESET, NO_RESET from ..utils.base import _AbstractSubSystem, _publish from ..common.msg_defs import MsgIds, MsgFieldPositions @@ -326,6 +327,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/hd/syringe_pump.py =================================================================== diff -u -r97592c35f4d79caf180f4bfc8f68bd4823829347 -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/syringe_pump.py (.../syringe_pump.py) (revision 97592c35f4d79caf180f4bfc8f68bd4823829347) +++ dialin/hd/syringe_pump.py (.../syringe_pump.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -15,6 +15,7 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms from .constants import RESET,NO_RESET from ..common.msg_defs import MsgIds, MsgFieldPositions from ..protocols.CAN import (DenaliMessage, @@ -192,7 +193,9 @@ "syringe_pump_meas_rate_ml_hr","syringe_pump_position", "syringe_pump_volume_ml","syringe_pump_home_v", "syringe_pump_switch_v","syringe_pump_force_v", - "heparin_state","syringe_pump_safety_volume_ml"]) + "heparin_state","syringe_pump_safety_volume_ml", + "syringe_pump_status","syringe_pump_encoder_status", + "syringe_pump_adc_dac_status","syringe_pump_adc_read_counter"]) def _handler_syringe_pump_data(self, message): """ Handles published syringe pump data messages. Syringe pump data are captured @@ -300,6 +303,9 @@ @return: 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + rst = integer_to_bytearray(reset) mis = integer_to_bytearray(ms) payload = rst + mis Index: dialin/hd/ui_proxy.py =================================================================== diff -u -r91993c31b1fb88a3937ea9ae4b549d357b53e14e -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 91993c31b1fb88a3937ea9ae4b549d357b53e14e) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -235,11 +235,11 @@ self.treatment_end_cmd_succeeded = False self.treatment_end_cmd_reject_reason = 0 - self.reject_reasons = OrderedDict() - for attr in dir(self): - if not callable(getattr(self, attr)) and attr.startswith("REQUEST_REJECT"): - self.reject_reasons[attr] = getattr(self, attr) - self.reject_reasons = OrderedDict(sorted(self.reject_reasons.items(), key=lambda key: key[1])) +# self.reject_reasons = OrderedDict() +# for attr in RequestRejectReasons.__members__: +# attr: RequestRejectReasons = attr +# self.reject_reasons[attr.name] = attr.value +# self.reject_reasons = OrderedDict(sorted(self.reject_reasons.items(), key=lambda key: key[1])) def get_hd_version(self): """ @@ -1233,7 +1233,7 @@ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, message_id=MsgIds.MSG_ID_HD_SET_PARAMETER_TREATMENT_PARAMETER.value, payload=payload) - self.logger.debug("Setting treatment parameter " + param_idx + " to " + value + ".") + self.logger.debug("Setting treatment parameter " + str(param_idx) + " to " + str(value) + ".") self.can_interface.send(message, 0) else: self.logger.debug("Invalid param_idx given.") Index: dialin/hd/valves.py =================================================================== diff -u -r09ced2280f05d07e7763245984b32bd3fbccff8a -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/hd/valves.py (.../valves.py) (revision 09ced2280f05d07e7763245984b32bd3fbccff8a) +++ dialin/hd/valves.py (.../valves.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -16,6 +16,7 @@ import struct +from ..utils.checks import check_broadcast_interval_override_ms from ..utils.conversions import integer_to_bytearray, float_to_bytearray from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -147,6 +148,9 @@ @param reset: integer - 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ + if not check_broadcast_interval_override_ms(ms): + return False + reset_value = integer_to_bytearray(reset) interval_value = integer_to_bytearray(ms) payload = reset_value + interval_value Index: dialin/utils/__init__.py =================================================================== diff -u -rb20262631dc86edf5c3550762bc888089fa2626d -r6e20f4690ce887c351d8c65546f93311e5df6ad1 --- dialin/utils/__init__.py (.../__init__.py) (revision b20262631dc86edf5c3550762bc888089fa2626d) +++ dialin/utils/__init__.py (.../__init__.py) (revision 6e20f4690ce887c351d8c65546f93311e5df6ad1) @@ -1,4 +1,5 @@ from .base import * +from .checks import * from .helpers import * from .conversions import * from .excel_ops import *