Index: dialin/common/__init__.py =================================================================== diff -u --- dialin/common/__init__.py (revision 0) +++ dialin/common/__init__.py (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -0,0 +1 @@ \ No newline at end of file Index: dialin/common/alarm_defs.py =================================================================== diff -u --- dialin/common/alarm_defs.py (revision 0) +++ dialin/common/alarm_defs.py (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -0,0 +1,89 @@ +import enum + + +class AlarmList(enum.Enum): + ALARM_ID_NO_ALARM = 0 # Indication for when no alarms is a possible situation + ALARM_ID_HD_SOFTWARE_FAULT = 1 # HD Software fault. Software found itself in an unexpected state + ALARM_ID_STUCK_BUTTON_TEST_FAILED = 2 # Stuck button POST failure. Stop or Off button detected to be pressed for at least 1 second during test shortly after power up + ALARM_ID_FPGA_POST_TEST_FAILED = 3 # FPGA POST failure + ALARM_ID_WATCHDOG_POST_TEST_FAILED = 4 # Watchdog POST failure + ALARM_ID_UI_COMM_POST_FAILED = 5 # UI communication POST failure. UI failed to communicate within a reasonable time after power up + ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK = 6 # Blood pump failed motor controller current check. Too high when pump should be off or out of range when pump should be running + ALARM_ID_BLOOD_PUMP_OFF_CHECK = 7 # Blood pump failed motor off check. Measured speed while commanded off + ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK = 8 # Blood pump failed motor direction check. Measured vs. commanded + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK = 9 # Blood pump failed rotor speed check. Mismatch with rotor and motor speeds + ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK = 10 # Dialysis inlet pump failed motor controller current check. Too high when pump should be off or out of range when pump should be running + ALARM_ID_DIAL_IN_PUMP_OFF_CHECK = 11 # Dialysis inlet pump failed motor off check. Measured speed while commanded off + ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK = 12 # Dialysis inlet pump failed motor direction check. Measured vs. commanded + ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK = 13 # Dialysis inlet pump failed rotor speed check. Mismatch with rotor and motor speeds + ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK = 14 # Dialysis outlet pump failed motor controller current check. Too high when pump should be off or out of range when pump should be running + ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK = 15 # Dialysis outlet pump failed motor off check. Measured speed while commanded off + ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK = 16 # Dialysis outlet pump failed motor direction check. Measured vs. commanded + ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK = 17 # Dialysis outlet pump failed rotor speed check. Mismatch with rotor and motor speeds + ALARM_ID_WATCHDOG_EXPIRED = 18 # Watchdog expired error. Watchdog was not "pet" within the appropriate time + ALARM_ID_RTC_COMM_ERROR = 19 # Real-time clock communication error + ALARM_ID_RTC_CONFIG_ERROR = 20 # Real-time clock configuration error + ALARM_ID_DG_COMM_TIMEOUT = 21 # Dialysate generator communication timeout + ALARM_ID_UI_COMM_TIMEOUT = 22 # User interface communication timeout + ALARM_ID_COMM_TOO_MANY_BAD_CRCS = 23 # Too many bad CRCs detected on received system messages + ALARM_ID_TREATMENT_STOPPED_BY_USER = 24 # Treatment stopped by user action - pressed stop button + ALARM_ID_BLOOD_SITTING_WARNING = 25 # Blood sitting too long warning (>4 min) + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME = 26 # Blood sitting too long alarm (>5 min) + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK = 27 # Blood sitting too long alarm (>10 min) + ALARM_ID_CAN_MESSAGE_NOT_ACKED = 28 # System message that required acknowledgment was not acknowledged + ALARM_ID_OCCLUSION_BLOOD_PUMP = 29 # Blood pump occlusion detected + ALARM_ID_OCCLUSION_DIAL_IN_PUMP = 30 # Dialysate inlet pump occlusion detected + ALARM_ID_OCCLUSION_DIAL_OUT_PUMP = 31 # Dialysate outlet pump occlusion detected + ALARM_ID_ARTERIAL_PRESSURE_LOW = 32 # Arterial pressure too low during treatment + ALARM_ID_ARTERIAL_PRESSURE_HIGH = 33 # Arterial pressure too high during treatment + ALARM_ID_VENOUS_PRESSURE_LOW = 34 # Venous pressure too low during treatment + ALARM_ID_VENOUS_PRESSURE_HIGH = 35 # Venous pressure too high during treatment + ALARM_ID_UF_RATE_TOO_HIGH_ERROR = 36 # Ultrafiltration rate is too high error during treatment + ALARM_ID_UF_VOLUME_ACCURACY_ERROR = 37 # Ultrafiltration volume accuracy error during treatment + ALARM_ID_RTC_BATTERY_LOW = 38 # RTC battery low + ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE = 39 # RTC or MCU timer inaccurate + ALARM_ID_RTC_RAM_OPS_ERROR = 40 # RTC (i.e read time) or RAM operations failure (read or write) + ALARM_ID_NVDATA_EEPROM_OPS_FAILURE = 41 # EEPRON operations (read write erase) failure + ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR = 42 # Manufacturing record CRC failure + ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR = 43 # Service record CRC failure + ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR = 44 # Calibration record CRC failure + ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR = 45 # HW usage data (treatment time in HD and total consumed water in DG) failure + AlARM_ID_NVDATA_DISINFECTION_DATE_CRC_ERROR = 46 # Last disinfection date CRC error + ALARM_ID_RO_PUMP_OUT_PRESSURE_OUT_OF_RANGE = 47 # Pressure at outlet of RO pump is out of range + ALARM_ID_TEMPERATURE_SENSORS_FAULT = 48 # DG temperature sensors fault + ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT = 49 # DG temperature sensors values are inconsistent with respect to each other + ALARM_ID_HD_COMM_TIMEOUT = 50 # HD communication timeout + ALARM_ID_VALVE_CONTROL_FAILURE = 51 # FPGA not accepting commanded valve states + ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 52 # Blood pump failed flow vs. motor speed check. Mismatch with flow rate and rate implied by motor speed + ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 53 # Dialysate inlet pump failed flow vs. motor speed check. Mismatch with flow rate and rate implied by motor speed + ALARM_ID_DIAL_OUT_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 54 # Dialysate outlet pump failed flow vs. motor speed check. Mismatch with flow rate and rate implied by motor speed + ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK = 55 # Blood pump failed motor speed check. Measured vs. commanded + ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK = 56 # Dialysate inlet pump failed motor speed check. Measured vs. commanded + ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK = 57 # Dialysate outlet pump failed motor speed check. Measured vs. commanded + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH = 58 # Blood pump rotor speed too high + ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY = 59 # Inlet water conductivity too low + ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY = 60 # Inlet water conductivity too high + ALARM_ID_DG_SOFTWARE_FAULT = 61 # DG software fault. Software found itself in an unexpected state + ALARM_ID_CONDUCTIVITY_SENSOR_FAULT = 62 # Conductivity sensor fault + ALARM_ID_INLET_WATER_LOW_TEMPERATURE = 63 # Inlet water temperature too low + ALARM_ID_INLET_WATER_HIGH_TEMPERATURE = 64 # Inlet water temperature too high + ALARM_ID_PRESSURE_SENSOR_FAULT = 65 # Pressure sensor fault + ALARM_ID_INLET_WATER_LOW_PRESSURE = 66 # Inlet water pressure too low + ALARM_ID_HD_CRITICAL_DATA_ERROR = 67 # HD critical data integrity check failed. + ALARM_ID_HD_ACCELEROMETER_SELF_TEST_FAILURE = 68 # HD accelerometer failed POST. + ALARM_ID_DG_ACCELEROMETER_SELF_TEST_FAILURE = 69 # DG accelerometer failed POST. + ALARM_ID_HD_EXCESSIVE_TILT = 70 # HD tilt exceeds maximum. + ALARM_ID_DG_EXCESSIVE_TILT = 71 # DG tilt exceeds maximu. + ALARM_ID_HD_SHOCK = 72 # HD experienced large acceleration. + ALARM_ID_DG_SHOCK = 73 # DG experienced large acceleration. + ALARM_ID_HD_ACCELEROMETER_FAILURE = 74 # HD accelerometer error (no readings or FPGA reports error) + ALARM_ID_DG_ACCELEROMETER_FAILURE = 75 # DG accelerometer error (no readings or FPGA reports error) + ALARM_ID_DG_CRITICAL_DATA_ERROR = 76 # DG critical data integrity check failed. + NUM_OF_ALARM_IDS = 77 # Total number of alarms + +class AlarmPriorities: + ALARM_PRIORITY_NONE = 0 # Indicates not an alarm or no alarms active at this time + ALARM_PRIORITY_LOW = 1 # Low priority alarm + ALARM_PRIORITY_MEDIUM = 2 # Medium priority alarm + ALARM_PRIORITY_HIGH = 3 # High priority alarm + NUM_OF_ALARM_PRIORITIES = 4 # Total number of alarm priorities Index: dialin/common/msg_defs.py =================================================================== diff -u --- dialin/common/msg_defs.py (revision 0) +++ dialin/common/msg_defs.py (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -0,0 +1,175 @@ +import enum + + +class MsgIds(enum.Enum): + MSG_ID_UNUSED = 0 # Zero is an undefined (un-used) message ID) + MSG_ID_OFF_BUTTON_PRESS = 1 # HD/UI off button interactions + MSG_ID_ALARM_STATUS = 2 # HD broadcast of system alarm state information + MSG_ID_ALARM_TRIGGERED = 3 # HD broadcast of a triggered alarm + MSG_ID_ALARM_CLEARED = 4 # HD broadcast of a cleared alarm + MSG_ID_BLOOD_FLOW_DATA = 5 # HD broadcast of blood flow/pump data + MSG_ID_DG_CHECK_IN = 6 # DG check-in with HD + MSG_ID_UI_CHECK_IN = 7 # UI check-in with HD + MSG_ID_DIALYSATE_FLOW_DATA = 8 # HD broadcast of dialysate inlet flow/pump data + MSG_ID_PRESSURE_OCCLUSION_DATA = 9 # HD broadcast of pressure/occlusion data + MSG_ID_RTC_EPOCH = 0xA # HD broadcast of current date and time from clock + MSG_ID_DIALYSATE_OUT_FLOW_DATA = 0xB # HD broadcast of dialysate outlet flow/pump/load cell data + MSG_ID_LOAD_CELL_READINGS = 0xC # DG broadcast of load cell weights + MSG_ID_TREATMENT_TIME = 0xD # HD broadcast of treatment time + MSG_ID_POWER_OFF_WARNING = 0xE # HD broadcast power off warning - system power down is imminent + MSG_ID_TREATMENT_STATE = 0xF # HD broadcast of treatment state + MSG_ID_USER_UF_PAUSE_RESUME_REQUEST = 0x10 # User request to pause or resume ultrafiltration + MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST = 0x11 # User request to change ultrafiltration settings + MSG_ID_USER_SALINE_BOLUS_REQUEST = 0x12 # User request for a saline bolus + MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE = 0x13 # HD response to user request to change ultrafiltration settings + MSG_ID_USER_SALINE_BOLUS_RESPONSE = 0x14 # HD response to user saline bolus request + MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE = 0x15 # User confirmation of ultrafiltration settings change + MSG_ID_USER_TREATMENT_TIME_CHANGE_REQUEST = 0x16 # User request to change treatment duration + MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST = 0x17 # User request to change blood and dialysate rates + MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_RESPONSE = 0x18 # HD response to user request to change blood and dialysate rates + MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS = 0x19 # HD provides DG with dialysate temperature set points + MSG_ID_TREATMENT_PARAM_CHANGE_RANGES = 0x1A # HD provides several parameter change ranges as they evolve over treatment duration + MSG_ID_USER_TREATMENT_TIME_CHANGE_RESPONSE = 0x1B # HD response to user request to change treatment duration + MSG_ID_REQUEST_FW_VERSIONS = 0x1C # UI request for f/w versions + MSG_ID_HD_VERSION = 0x1D # HD f/w version + MSG_ID_DG_VERSION = 0x1E # DG f/w version + MSG_ID_RO_PUMP_DATA = 0x1F # DG broadcast of RO pump data + MSG_ID_DG_PRESSURES_DATA = 0x20 # DG broadcast of pressure sensors data + MSG_ID_DG_SWITCH_RESERVOIR_CMD = 0x21 # HD request to DG to switch reservoirs (A->B or B->A) + MSG_ID_DG_FILL_CMD = 0x22 # HD request to DG to fill inactive reservoir + MSG_ID_DG_DRAIN_CMD = 0x23 # HD request to DG to drain inactive reservoir + MSG_ID_DRAIN_PUMP_DATA = 0x24 # DG broadcast of drain pump data + MSG_ID_HD_OP_MODE = 0x25 # HD broadcast current operating mode + MSG_ID_STARTING_STOPPING_TREATMENT_CMD = 0x26 # HD request to DG to move in/out of standby mode due to treatment start/stop + MSG_ID_DG_OP_MODE = 0x27 # DG broadcast current operating mode + MSG_ID_DG_RESERVOIR_DATA = 0x28 # DG broadcast reservoir data + MSG_ID_DG_SAMPLE_WATER_CMD = 0x29 # HD request to DG to allow user to get a water sample + MSG_ID_DG_VALVES_STATES = 0x2A # DG broadcast valve states + MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD = 0x2B # HD request to DG to start/stop trimmer heater + MSG_ID_DG_HEATERS_DATA = 0x2C # DG broadcast of the heaters data + MSG_ID_DG_TEMPERATURE_DATA = 0x2D # DG broadcast of the temperature sensors data + MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE = 0x2E # HD response to user selection of ultrafiltration settings change option selection + MSG_ID_DG_START_STOP_HEAT_DISINFECT = 0x2F # HD request to start or stop DG heat disinfection + MSG_ID_SALINE_BOLUS_DATA = 0x30 # HD broadcast of saline bolus data + MSG_ID_DG_CONDUCTIVITY_DATA = 0x31 # DG broadcast of the conductivity sensors data + MSG_ID_USER_REQUEST_ALARM_SILENCE = 0x32 # UI request alarm silence (or cancel) + MSG_ID_HD_ACCELEROMETER_DATA = 0x33 # HD broadcast of accelerometer data + MSG_ID_DG_ACCELEROMETER_DATA = 0x34 # DG broadcast of accelerometer data + MSG_ID_UI_NEW_TREATMENT_PARAMS = 0x35 # UI request to validate new treatment parameter set + MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE = 0x36 # HD response to new treatment parameters set + MSG_ID_DG_HEAT_DISINFECT_DATA = 0x37 # DG heat disinfection publish data + MSG_ID_UI_START_TREATMENT = 0x38 # UI user request to initiate a treatment + MSG_ID_HD_START_TREATMENT_RESPONSE = 0x39 # HD response to user request to initiate a treatment + + MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing + + # service/test CAN messages + MSG_ID_FIRST_TESTER_MESSAGE = 0x8000 # First HD test message ID + MSG_ID_TESTER_LOGIN_REQUEST = MSG_ID_FIRST_TESTER_MESSAGE # HD tester log-in + MSG_ID_HD_MESSAGE = 0x8001 # Obsolete - TODO - remove when all references to this ID are deleted + MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE = 0x8001 # Dialysate outlet flow set point override request + MSG_ID_OFF_BUTTON_STATE_OVERRIDE = 0x8002 # Off button override request + MSG_ID_STOP_BUTTON_STATE_OVERRIDE = 0x8003 # Stop button override request + MSG_ID_ALARM_LAMP_PATTERN_OVERRIDE = 0x8004 # Alarm lamp pattern override request + MSG_ID_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0x8005 # Watchdog task check-in override request + MSG_ID_ALARM_STATE_OVERRIDE = 0x8006 # Alarm state override request + MSG_ID_ALARM_TIME_OVERRIDE = 0x8007 # Alarm time override request + MSG_ID_BLOOD_FLOW_SET_PT_OVERRIDE = 0x8008 # Blood flow set point override request + MSG_ID_BLOOD_FLOW_MEAS_OVERRIDE = 0x8009 # Blood flow measured override request + MSG_ID_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x800A # Blood pump motor controller speed override request + MSG_ID_BLOOD_PUMP_MC_MEAS_CURR_OVERRIDE = 0x800B # Blood pump motor controller current override request + MSG_ID_BLOOD_FLOW_SEND_INTERVAL_OVERRIDE = 0x800C # Blood flow broadcast interval override request + MSG_ID_ALARM_STATUS_SEND_INTERVAL_OVERRIDE = 0x800D # Alarm status broadcast interval override request + MSG_ID_BLOOD_PUMP_MEAS_SPEED_OVERRIDE = 0x800E # Blood pump measured motor speed override request + MSG_ID_BLOOD_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0x800F # Blood pump measured rotor speed override request + MSG_ID_DIAL_IN_FLOW_SET_PT_OVERRIDE = 0x8010 # Dialysate inlet flow set point override request + MSG_ID_DIAL_IN_FLOW_MEAS_OVERRIDE = 0x8011 # Dialysate inlet flow measured override request + MSG_ID_DIAL_IN_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x8012 # Dialysate inlet pump motor controller speed override request + MSG_ID_DIAL_IN_PUMP_MC_MEAS_CURR_OVERRIDE = 0x8013 # Dialysate inlet pump motor controller current override request + MSG_ID_DIAL_IN_FLOW_SEND_INTERVAL_OVERRIDE = 0x8014 # Dialysate inlet flow broadcast interval override request + MSG_ID_DIAL_IN_PUMP_MEAS_SPEED_OVERRIDE = 0x8015 # Dialysate inlet pump measured motor speed override request + MSG_ID_DIAL_IN_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0x8016 # Dialysate inlet pump measured rotor speed override request + MSG_ID_PRESSURE_ARTERIAL_OVERRIDE = 0x8017 # Arterial pressure measured override request + MSG_ID_PRESSURE_VENOUS_OVERRIDE = 0x8018 # Venous pressure measured override request + MSG_ID_OCCLUSION_BLOOD_PUMP_OVERRIDE = 0x8019 # Blood pump occlusion pressure measured override request + MSG_ID_OCCLUSION_DIAL_IN_PUMP_OVERRIDE = 0x801A # Dialysate inlet pump occlusion pressure measured override request + MSG_ID_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE = 0x801B # Dialysate outlet pump occlusion pressure measured override request + MSG_ID_PRES_OCCL_SEND_INTERVAL_OVERRIDE = 0x801C # Pressure and occlusion broadcast interval override request + MSG_ID_SET_RTC_DATE_TIME = 0x801D # RTC set date/time request + MSG_ID_DIAL_OUT_FLOW_SEND_INTERVAL_OVERRIDE = 0x801E # Dialysate outlet flow broadcast interval override request + MSG_ID_DIAL_OUT_UF_REF_VOLUME_OVERRIDE = 0x801F # Dialysate outlet - ultrafiltration reference volume override request + MSG_ID_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE = 0x8020 # Dialysate outlet - ultrafiltration measured volume override request + MSG_ID_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x8021 # Dialysate outlet pump motor controller speed override request + MSG_ID_DIAL_OUT_PUMP_MC_MEAS_CURR_OVERRIDE = 0x8022 # Dialysate outlet pump motor controller current override request + MSG_ID_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE = 0x8023 # Dialysate outlet pump measured motor speed override request + MSG_ID_DIAL_OUT_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0x8024 # Dialysate outlet pump measured rotor speed override request + MSG_ID_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE = 0x8025 # Load cell measured weight override request + MSG_ID_HD_SAFETY_SHUTDOWN_OVERRIDE = 0x8026 # HD safety shutdown override request + MSG_ID_HD_ACCEL_OVERRIDE = 0x8027 # HD accelerometer sensor override request + MSG_ID_HD_ACCEL_MAX_OVERRIDE = 0x8028 # HD accelerometer sensor max. override request + MSG_ID_HD_ACCEL_SEND_INTERVAL_OVERRIDE = 0x8029 # HD accelerometer data broadcast interval override request + MSG_ID_HD_ACCEL_SET_CALIBRATION = 0x802A # HD accelerometer set calibration factors request + MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION = 0x802B # Blood flow set calibration factors request + MSG_ID_HD_DIALYSATE_FLOW_SET_CALIBRATION = 0x802C # Dialysate flow set calibration factors request + + MSG_ID_FIRST_DG_TESTER_MESSAGE = 0xA000 # First DG test message ID + MSG_ID_DG_TESTER_LOGIN_REQUEST = MSG_ID_FIRST_DG_TESTER_MESSAGE # DG tester log-in + MSG_ID_DG_ALARM_STATE_OVERRIDE = 0xA001 # DG alarm state override message ID + MSG_ID_DG_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0xA002 # Watchdog check-in override request + MSG_ID_DG_SET_RTC_DATE_TIME = 0xA004 # DG RTC set date/time + MSG_ID_LOAD_CELL_OVERRIDE = 0xA005 # Load cell sensor override request + MSG_ID_PRESSURE_OVERRIDE = 0xA006 # Pressure sensor override request + MSG_ID_PRESSURE_SEND_INTERVAL_OVERRIDE = 0xA007 # Pressure data broadcast interval override request + MSG_ID_RO_PUMP_SET_PT_OVERRIDE = 0xA008 # RO pump set pt. override request + MSG_ID_RO_MEASURED_FLOW_OVERRIDE = 0xA009 # RO measured flow rate override request + MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE = 0xA00A # RO pump data broadcast interval override request + MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE = 0xA00B # Drain pump set RPM override request + MSG_ID_DRAIN_PUMP_SEND_INTERVAL_OVERRIDE = 0xA00C # Drain pump data broadcast interval override request + MSG_ID_LOAD_CELLL_SEND_INTERVAL_OVERRIDE = 0xA00D # Load cell data broadcast interval override request + MSG_ID_VALVE_STATE_OVERRIDE = 0xA00E # Valve state override request + MSG_ID_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE = 0xA00F # Valve data broadcast interval override request + MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE = 0xA010 # Temperature sensor override request + MSG_ID_START_STOP_PRIMARY_HEATER = 0xA011 # Start/stop primary heaters + MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE = 0xA012 # Temperature sensors data publish override + MSG_ID_HEATERS_PUBLISH_INTERVAL_ORVERRIDE = 0xA013 # Heaters data publish override + MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE = 0xA014 # DG safety shutdown override request + MSG_ID_CONDUCTIVITY_OVERRIDE = 0xA015 # Conductivity sensor override request + MSG_ID_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE = 0xA016 # Conductivity sensors data publish override + MSG_ID_DG_ACCEL_OVERRIDE = 0xA017 # DG accelerometer sensor override request + MSG_ID_DG_ACCEL_MAX_OVERRIDE = 0xA018 # DG accelerometer sensor max. override request + MSG_ID_DG_ACCEL_SEND_INTERVAL_OVERRIDE = 0xA019 # DG accelerometer data broadcast interval override request + MSG_ID_DG_ACCEL_SET_CALIBRATION = 0xA01A # DG accelerometer set calibration factors request + MSG_ID_RO_PUMP_SET_PWM = 0xA01B # RO pump set PWM for open loop + MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE = 0xA01C # Drain pump set delta pressure override + MSG_ID_HEAT_DISINFECT_RECIRC_PATH_DURATION_MINS = 0xA01D # Heat disinfection recirculation path duration in minutes + MSG_ID_HEAT_DISINFECT_RSRVR1_TO_RSRVR2_DURATION_MINS = 0xA01E # Heat disinfection reservoir 1 to reservoir 2 duration in minutes + MSG_ID_HEAT_DISINFECT_RSRVR2_TO_RSRVR1_DURATION_MINS = 0xA01F # Heat disinfection reservoir 2 to reservoir 1 duration in minutes + MSG_ID_HEAT_DISINFECT_NO_OF_CYCLES_TO_RUN = 0xA020 # Heat disinfection number of cycles to run + MSG_ID_HEAT_DISINFECT_PUBLISH_INTERVAL_OVERRIDE = 0xA021 # Heat disinfection data publish interval override request + + MSG_ID_HD_DEBUG_EVENT = 0xFFF1 # HD debug event text to be logged in event log + MSG_ID_DG_DEBUG_EVENT = 0xFFF2 # DG debug event text to be logged in event log + + END_OF_MSG_IDS = 0xFFF3 # End of system message IDs + + +class RequestRejectReasons(enum.Enum): + + REQUEST_REJECT_REASON_NONE = 0 + REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE = 1 + REQUEST_REJECT_REASON_TIMEOUT_WAITING_FOR_USER_CONFIRM = 2 + REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE = 3 + REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE = 4 + REQUEST_REJECT_REASON_TREATMENT_TOO_CLOSE_TO_FINISHED = 5 + REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE = 6 + REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT = 7 + REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE = 8 + REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE = 9 + REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE = 10 + REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE = 11 + REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE = 12 + REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_MINIMUM = 13 + REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS = 14 + REQUEST_REJECT_REASON_UF_NOT_PAUSED = 15 + REQUEST_REJECT_REASON_SALINE_BOLUS_IN_PROGRESS = 16 + NUM_OF_REQUEST_REJECT_REASONS = 17 Index: dialin/hd/alarms.py =================================================================== diff -u -r8d1f61499650e23dac6f857e48daad42180db949 -r80501868a8f9a2c145945bbebb486fb3a32edfb2 --- dialin/hd/alarms.py (.../alarms.py) (revision 8d1f61499650e23dac6f857e48daad42180db949) +++ dialin/hd/alarms.py (.../alarms.py) (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -21,6 +21,7 @@ from collections import OrderedDict import struct from logging import Logger +from ..common.alarm_defs import AlarmList class HDAlarms(_AbstractSubSystem): @@ -162,10 +163,10 @@ self.alarm_states = [False] * 500 self.ids = OrderedDict() - for attr in dir(self): - if not callable(getattr(self, attr)) and attr.startswith("ALARM_ID"): - self.ids[attr] = getattr(self, attr) - self.ids = OrderedDict(sorted(self.ids.items(), key=lambda key: key[1])) + for attr in dir(AlarmList): + if not callable(getattr(AlarmList, attr)) and attr.startswith("ALARM_ID"): + self.ids[attr] = getattr(AlarmList, attr) + self.ids = OrderedDict(sorted(self.ids.items(), key=lambda key: key[1].value)) def get_alarm_states(self): """ Index: dialin/ui/dg_proxy.py =================================================================== diff -u --- dialin/ui/dg_proxy.py (revision 0) +++ dialin/ui/dg_proxy.py (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -0,0 +1 @@ \ No newline at end of file Fisheye: Tag 80501868a8f9a2c145945bbebb486fb3a32edfb2 refers to a dead (removed) revision in file `dialin/ui/dg_simulator.py'. Fisheye: No comparison available. Pass `N' to diff? Index: dialin/ui/hd_proxy.py =================================================================== diff -u --- dialin/ui/hd_proxy.py (revision 0) +++ dialin/ui/hd_proxy.py (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -0,0 +1,121 @@ +########################################################################### +# +# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +# +# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +# WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +# +# @file hd_proxy.py +# +# @date 29-July-2020 +# @author P. Lucia +# +# @brief This class simulates the hd when interfacing with the UI +# +############################################################################ +from ..protocols.CAN import (DenaliMessage, + DenaliCanMessenger, + DenaliChannels) +from ..utils.base import _AbstractSubSystem, _LogManager +from ..utils.conversions import integer_to_bytearray +from ..hd.buttons import HDButtons +from .hd_proxy_alarms import HDProxyAlarms +import enum +from typing import List +from ..common.msg_defs import RequestRejectReasons, MsgIds + + +class HDSimulator(_AbstractSubSystem): + + MSG_ID_HD_CREATE_TREATMENT_RESPONSE = 0x0036 + + NUM_TREATMENT_PARAMETERS = 18 + + def __init__(self, can_interface="can0", log_level=None): + + super().__init__() + + self._log_manager = _LogManager(log_level=log_level, log_filepath=self.__class__.__name__+".log") + self.logger = self._log_manager.logger + self.can_interface = DenaliCanMessenger(can_interface=can_interface, + logger=self.logger, + log_can=self._log_manager.log_level == "CAN_ONLY") + self.alarms = HDProxyAlarms(self.can_interface, self.logger) + + def cmd_send_treatment_parameter_validation_response(self, rejections: List[RequestRejectReasons]): + """ + Sends a treatment parameter validation response + + @param rejections: A list of rejection code enums + @return: True if successful, False otherwise + """ + if len(rejections) != self.NUM_TREATMENT_PARAMETERS: + self.logger.error("Invalid number of treatment parameter enums provided.") + return False + + if not all([isinstance(each, enum.Enum) for each in rejections]): + self.logger.error("Not all rejections are enums.") + return False + + payload = bytearray() + + for rejection in rejections: + payload += integer_to_bytearray(rejection.value) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=MsgIds.MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE, + payload=payload) + + # Send message + self.can_interface.send(message, 0) + + return True + + def cmd_send_poweroff_button_pressed(self): + """ + Broadcast that the poweroff button was pressed + + @return: None + """ + + payload = bytearray(0x01) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=HDButtons.MSG_ID_HD_POWEROFF_OPEN, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_send_broadcast_poweroff_imminent(self): + """ + Broadcast that the system will shut down + + @return: None + """ + + payload = integer_to_bytearray(1) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_sync_broadcast_ch_id, + message_id=HDButtons.MSG_ID_HD_POWEROFF_BROADCAST, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_send_poweroff_timeout(self): + """ + Sends a poweroff timeout + + @return: None + """ + + payload = integer_to_bytearray(1) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=HDButtons.MSG_ID_HD_POWEROFF_TIMEOUT, + payload=payload) + + self.can_interface.send(message, 0) + + + + Index: dialin/ui/hd_proxy_alarms.py =================================================================== diff -u --- dialin/ui/hd_proxy_alarms.py (revision 0) +++ dialin/ui/hd_proxy_alarms.py (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -0,0 +1,146 @@ +########################################################################### +# +# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +# +# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +# WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +# +# @file hd_proxy_alarms.py +# +# @author (last) Peter Lucia +# @date (last) 20-Jul-2020 +# @author (original) Peter Lucia +# @date (original) 02-Apr-2020 +# +############################################################################ +from ..protocols.CAN import (DenaliMessage, + DenaliCanMessenger, + DenaliChannels) +from ..hd.alarms import HDAlarms +from logging import Logger +from ..utils.base import _AbstractSubSystem +from ..utils.conversions import integer_to_bytearray + +HIGH = 3 +MED = 2 +LOW = 1 +NONE = 0 + + +class Alarms: + + # ALARM_ID = (priority, alarmID, escalates in, silent_espires_in, flags) + ALARM_ID_NO_ALARM = (NONE, 0, 0, 0, 0) + ALARM_ID_SOFTWARE_FAULT = (HIGH, 1, 0, 0, 0) + ALARM_ID_STUCK_BUTTON_TEST_FAILED = (HIGH, 2, 0, 0, 0) + ALARM_ID_FPGA_POST_TEST_FAILED = (HIGH, 3, 0, 0, 0) + ALARM_ID_WATCHDOG_POST_TEST_FAILED = (HIGH, 4, 0, 0, 0) + ALARM_ID_UI_COMM_POST_FAILED = (HIGH, 5, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK = (MED, 6, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_OFF_CHECK = (MED, 7, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK = (MED, 8, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK = (HIGH, 9, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK = (MED, 10, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_OFF_CHECK = (MED, 11, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK = (MED, 12, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK = (HIGH, 13, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK = (MED, 14, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK = (MED, 15, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK = (MED, 16, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK = (HIGH, 17, 0, 0, 0) + ALARM_ID_WATCHDOG_EXPIRED = (HIGH, 18, 0, 0, 0) + ALARM_ID_RTC_COMM_ERROR = (HIGH, 19, 0, 0, 0) + ALARM_ID_RTC_CONFIG_ERROR = (HIGH, 20, 0, 0, 0) + ALARM_ID_DG_COMM_TIMEOUT = (HIGH, 21, 0, 0, 0) + ALARM_ID_UI_COMM_TIMEOUT = (HIGH, 22, 0, 0, 0) + ALARM_ID_COMM_TOO_MANY_BAD_CRCS = (HIGH, 23, 0, 0, 0) + ALARM_ID_TREATMENT_STOPPED_BY_USER = (LOW, 24, 0, 0, 0) + ALARM_ID_BLOOD_SITTING_WARNING = (MED, 25, 0, 0, 0) + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME = (MED, 26, 0, 0, 0) + ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK = (HIGH, 27, 0, 0, 0) + ALARM_ID_CAN_MESSAGE_NOT_ACKED = (HIGH, 28, 0, 0, 0) + ALARM_ID_OCCLUSION_BLOOD_PUMP = (HIGH, 29, 0, 0, 0) + ALARM_ID_OCCLUSION_DIAL_IN_PUMP = (HIGH, 30, 0, 0, 0) + ALARM_ID_OCCLUSION_DIAL_OUT_PUMP = (HIGH, 31, 0, 0, 0) + ALARM_ID_ARTERIAL_PRESSURE_LOW = (HIGH, 32, 0, 0, 0) + ALARM_ID_ARTERIAL_PRESSURE_HIGH = (HIGH, 33, 0, 0, 0) + ALARM_ID_VENOUS_PRESSURE_LOW = (HIGH, 34, 0, 0, 0) + ALARM_ID_VENOUS_PRESSURE_HIGH = (HIGH, 35, 0, 0, 0) + ALARM_ID_UF_RATE_TOO_HIGH_ERROR = (HIGH, 36, 0, 0, 0) + ALARM_ID_UF_VOLUME_ACCURACY_ERROR = (HIGH, 37, 0, 0, 0) + ALARM_ID_RTC_BATTERY_LOW = (HIGH, 38, 0, 0, 0) + ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE = (HIGH, 39, 0, 0, 0) + ALARM_ID_RTC_RAM_OPS_ERROR = (HIGH, 40, 0, 0, 0) + ALARM_ID_NVDATA_EEPROM_OPS_FAILURE = (HIGH, 41, 0, 0, 0) + ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR = (HIGH, 42, 0, 0, 0) + ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR = (HIGH, 43, 0, 0, 0) + ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR = (HIGH, 44, 0, 0, 0) + ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR = (HIGH, 45, 0, 0, 0) + ALARM_ID_NVDATA_DISINFECTION_DATE_CRC_ERROR = (HIGH, 46, 0, 0, 0) + ALARM_ID_RO_PUMP_OUT_PRESSURE_OUT_OF_RANGE = (HIGH, 47, 0, 0, 0) + ALARM_ID_TEMPERATURE_SENSORS_OUT_OF_RANGE = (HIGH, 48, 0, 0, 0) + ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT = (HIGH, 49, 0, 0, 0) + ALARM_ID_HD_COMM_TIMEOUT = (HIGH, 50, 0, 0, 0) + ALARM_ID_VALVE_CONTROL_FAILURE = (HIGH, 51, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = (HIGH, 52, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = (HIGH, 53, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = (HIGH, 54, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK = (HIGH, 55, 0, 0, 0) + ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK = (HIGH, 56, 0, 0, 0) + ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK = (HIGH, 57, 0, 0, 0) + ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH = (HIGH, 58, 0, 0, 0) + ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE = (HIGH, 59, 0, 0, 0) + ALARM_ID_DOES_NOT_EXIST = (HIGH, 99, 0, 0, 0) + + +class HDProxyAlarms(_AbstractSubSystem): + def __init__(self, can_interface: DenaliCanMessenger, logger: Logger): + """ + @param can_interface: Denali Can Messenger object + """ + super().__init__() + self.can_interface = can_interface + self.logger = logger + + def cmd_activate_alarm(self, alarm: Alarms): + """ + Send the specified alarm + + @return: None + """ + + state = integer_to_bytearray(alarm[0]) + top = integer_to_bytearray(alarm[1]) + escalates_in = integer_to_bytearray(alarm[2]) + silence_expires = integer_to_bytearray(alarm[3]) + flags = integer_to_bytearray(alarm[4]) + + payload = state + top + escalates_in + silence_expires + flags + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_alarm_broadcast_ch_id, + message_id=HDAlarms.MSG_ID_HD_ALARMS_PUBLISHED_STATUS, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_send_clear_alarms(self): + """ + Broadcasts a clear alarms message + + @return: None + """ + + state = integer_to_bytearray(Alarms.ALARM_ID_NO_ALARM[0]) + top = integer_to_bytearray(Alarms.ALARM_ID_NO_ALARM[1]) + escalates_in = integer_to_bytearray(Alarms.ALARM_ID_NO_ALARM[2]) + silence_expires = integer_to_bytearray(Alarms.ALARM_ID_NO_ALARM[3]) + flags = integer_to_bytearray(Alarms.ALARM_ID_NO_ALARM[4]) + + payload = state + top + escalates_in + silence_expires + flags + + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_alarm_broadcast_ch_id, + message_id=HDAlarms.MSG_ID_HD_ALARMS_PUBLISHED_STATUS, + payload=payload) + + self.can_interface.send(message, 0) + Fisheye: Tag 80501868a8f9a2c145945bbebb486fb3a32edfb2 refers to a dead (removed) revision in file `dialin/ui/hd_simulator.py'. Fisheye: No comparison available. Pass `N' to diff? Index: tests/test_hd_simulator.py =================================================================== diff -u -rf3171e14b9cbfabe015e6aa093234d8dd8b55b45 -r80501868a8f9a2c145945bbebb486fb3a32edfb2 --- tests/test_hd_simulator.py (.../test_hd_simulator.py) (revision f3171e14b9cbfabe015e6aa093234d8dd8b55b45) +++ tests/test_hd_simulator.py (.../test_hd_simulator.py) (revision 80501868a8f9a2c145945bbebb486fb3a32edfb2) @@ -17,7 +17,8 @@ import sys sys.path.append("..") -from dialin.ui.hd_simulator import HDSimulator, MsgDefs, Alarms +from dialin.ui.hd_proxy import HDSimulator, RequestRejectReasons +from dialin.ui.hd_proxy_alarms import Alarms from dialin.hd.hemodialysis_device import HD from dialin.utils.base import AbstractObserver from time import sleep @@ -27,24 +28,24 @@ hd_simulator = HDSimulator(log_level="DEBUG") rejections = [ - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # overall response - MsgDefs.REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE, # blood flow - MsgDefs.REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE, # dialysate flow - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # duration - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # heparin dispensing rate - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # heparin bolus volume - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # heparin stop time - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # saline bolus - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # acid concentrate - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # bicarbonate concentrate - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # dialyzer type - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # dialysate temperature - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # arterial pressure limit low - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # arterial pressure limit high - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # venous pressure limit low - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # venous pressure limit high - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # blood pressure measurement interval - MsgDefs.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE # rinseback flow rate + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # overall response + RequestRejectReasons.REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE, # blood flow + RequestRejectReasons.REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE, # dialysate flow + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # duration + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # heparin dispensing rate + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # heparin bolus volume + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # heparin stop time + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # saline bolus + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # acid concentrate + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # bicarbonate concentrate + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # dialyzer type + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # dialysate temperature + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # arterial pressure limit low + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # arterial pressure limit high + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # venous pressure limit low + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # venous pressure limit high + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE, # blood pressure measurement interval + RequestRejectReasons.REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE # rinseback flow rate ] hd_simulator.cmd_send_treatment_parameter_validation_response(rejections) @@ -78,9 +79,9 @@ def test_clear_alarms(): hd_simulator = HDSimulator() - hd_simulator.cmd_activate_alarm(Alarms.ALARM_ID_TREATMENT_STOPPED_BY_USER) + hd_simulator.alarms.cmd_activate_alarm(Alarms.ALARM_ID_TREATMENT_STOPPED_BY_USER) sleep(1) - hd_simulator.cmd_send_clear_alarms() + hd_simulator.alarms.cmd_send_clear_alarms() if __name__ == '__main__':