Fisheye: Tag 02eff24a2b116fe3d71d8275eeb78f419302efd6 refers to a dead (removed) revision in file `dialin/common/AlarmIds.txt'. Fisheye: No comparison available. Pass `N' to diff? Index: dialin/common/alarm_defs.py =================================================================== diff -u -r3f12fb75e3d92e3ecbcb86a4b9b284dd0b05e26f -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 3f12fb75e3d92e3ecbcb86a4b9b284dd0b05e26f) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -9,9 +9,9 @@ # @file alarm_defs.py # # @author (last) Peter Lucia -# @date (last) 05-Apr-2021 +# @date (last) 06-Apr-2021 # @author (original) Peter Lucia -# @date (original) 05-Apr-2021 +# @date (original) 06-Apr-2021 # ############################################################################ from enum import unique Index: dialin/common/msg_defs.py =================================================================== diff -u -re8afa8d6323ede293e1fb094a461555fcf7ce0d9 -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision e8afa8d6323ede293e1fb094a461555fcf7ce0d9) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -15,264 +15,9 @@ ############################################################################ from enum import unique from ..utils.base import DialinEnum +from .msg_ids import MsgIds @unique -class MsgIds(DialinEnum): - 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_SALINE_BOLUS_DATA = 0x2F # HD broadcast of saline bolus data - MSG_ID_DG_START_STOP_HEAT_DISINFECT = 0x30 # HD request to start or stop DG heat disinfection - 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_HD_VALVES_DATA = 0x3A # HD broadcast of valves data - MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0x3B # UI user confirmation of treatment parameters - MSG_ID_UI_START_PRIME_REQUEST = 0x3C # UI user has requested to start priming - MSG_ID_HD_START_PRIME_RESPONSE = 0x3D # HD response to user request to start priming - MSG_ID_HD_AIR_TRAP_DATA = 0x003E # HD broadcast of air trap data - MSG_ID_ALARM_CONDITION_CLEARED = 0x3F # Broadcast that the alarm condition has been cleared - MSG_ID_UI_ALARM_USER_ACTION = 0x40 # UI user has requested an alarm action - MSG_ID_USER_UF_PAUSE_RESUME_RESPONSE = 0x41 # HD response to user request to pause or resume UF - MSG_ID_DG_CONCENTRATE_PUMP_DATA = 0x42 # DG broadcast of concentrate pump data - MSG_ID_HD_PRIMING_STATUS_DATA = 0x43 # HD priming status during cartridge prime - MSG_ID_DG_UV_REACTORS_DATA = 0x44 # DG broadcast UV reactors data - MSG_ID_DG_THERMISTORS_DATA = 0x45 # DG broadcast thermistors data - MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST = 0x46 # UI request to change pressure limits - MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE = 0x47 # HD response to change pressure limits request - MSG_ID_DG_FANS_DATA = 0x48 # DG broadcast fans data - MSG_ID___AVAILABLE_4 = 0x49 # HD broadcast calibration_record data - MSG_ID___AVAILABLE_5 = 0x4A # DG broadcast calibration_record data - MSG_ID_UI_HEPARIN_PAUSE_RESUME_REQUEST = 0x4B # UI request to pause/resume Heparin delivery - MSG_ID_HD_HEPARIN_PAUSE_RESUME_RESPONSE = 0x4C # HD Heparin Pause/Resume Response - MSG_ID_HD_HEPARIN_DATA = 0x4D # HD Broadcast heparin data - MSG_ID_UI_SET_ALARM_AUDIO_VOLUME_LEVEL_CMD = 0x4E # UI command to set alarm audio volume level - MSG_ID_UI_PRE_TREATMENT_UF_REQUEST = 0x4F # UI UF Initialization Request - MSG_ID_HD_PRE_TREATMENT_UF_RESPONSE = 0x50 # HD response to user request to adjust the ultrafiltration in pre-treatment - MSG_ID_DG_COMMAND_RESPONSE = 0x51 # DG response to command from HD - MSG_ID_UI_RINSEBACK_CMD = 0x52 # UI rinseback request - MSG_ID_HD_RINSEBACK_CMD_RESPONSE = 0x53 # HD rinseback request response - MSG_ID_UI_RECIRC_CMD = 0x54 # UI re-circ request - MSG_ID_HD_RECIRC_CMD_RESPONSE = 0x55 # HD re-circ request response - MSG_ID_HD_RINSEBACK_PROGRESS = 0x56 # HD broadcast of rinseback progress - MSG_ID_UI_TX_END_CMD = 0x57 # UI end treatment sub-mode user request - MSG_ID_HD_TX_END_CMD_RESPONSE = 0x58 # HD end treatment sub-mode user request response - MSG_ID_HD_BLOOD_PRIME_PROGRESS = 0x59 # HD broadcast of blood prime progress - MSG_ID_HD_RECIRC_PROGRESS = 0x5A # HD broadcast of treatment re-circulate progress - MSG_ID_DG_CHANGE_VALVE_SETTING_CMD = 0x5B # HD request to DG to change valve setting - MSG_ID_PRE_TREATMENT_STATE = 0x5C # HD broadcast of pre-treatment state - MSG_ID_UI_SAMPLE_WATER_CMD = 0x5D # UI sample water sub-mode user request - MSG_ID_HD_SAMPLE_WATER_CMD_RESPONSE = 0x5E # HD sample water sub-mode request response - MSG_ID_UI_SAMPLE_WATER_RESULT = 0x5F # UI sample water result message - MSG_ID_DG_FILTER_FLUSH_PROGRESS = 0x60 # DG broadcast of filter flush progress - MSG_ID_HD_NO_CART_SELF_TEST_PROGRESS = 0x61 # HD broadcast of no cartridge self-tests progress - MSG_ID_UI_INSTALLATION_CONFIRM = 0x62 # UI disposable installation user confirmation - MSG_ID_HD_DRY_SELF_TEST_PROGRESS = 0x63 # HD broadcast of dry self-tests progress - MSG_ID_UI_CONTINUE_TO_TREATMENT_REQUEST = 0x64 # UI user has requested to continue to treatment - MSG_ID_HD_CONTINUE_TO_TREATMENT_RESPONSE = 0x65 # HD response to user request to continue to treatment - MSG_ID_UI_PATIENT_CONNECTION_CONFIRM = 0x66 # UI user has confirmed patient connection completed - MSG_ID_HD_PATIENT_CONNECTION_CONFIRM_RESPONSE = 0x67 # HD response to user confirmation of patient connection - MSG_ID_UI_CONSUMABLE_INSTALL_CONFIRM = 0x68 # UI user has confirmed consumable install - MSG_ID_UI_HD_SET_RTC_REQUEST = 0x6D # UI to DG Request to set RTC Request - MSG_ID_HD_UI_SET_RTC_RESPONSE = 0x6E # DG to UI set RTC Response - MSG_ID_UI_DG_SET_RTC_REQUEST = 0x6F # UI to HD request to set RTC Request - MSG_ID_DG_UI_SET_RTC_RESPONSE = 0x70 # HD to UI Set RTC Response - - MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing - - # service/test CAN messages - MSG_ID_TESTER_LOGIN_REQUEST = 0x8000 # HD tester log-in - 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_TREATMENT_TIME_REMAINING_OVERRIDE = 0x800D # This msg ID is available for use - 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___AVAILABLE_6 = 0x802A # This msg ID is available for use - MSG_ID___AVAILABLE_7 = 0x802B # This msg ID is available for use - MSG_ID___AVAILABLE_8 = 0x802C # This msg ID is available for use - MSG_ID_HD_SET_PARAMETER_TREATMENT_PARAMETER = 0x802D # Set a treatment parameter (will change actual setting, not an override) - MSG_ID_HD_VALVES_HOME = 0x802E # Home an HD Valve - MSG_ID_HD_VALVES_POSITION_OVERRIDE = 0x802F # Set an HD valve to a position in counts - MSG_ID_HD_VALVES_SET_AIR_TRAP_VALVE = 0x8030 # Set the HD blood trap valve status - MSG_ID_HD_VALVES_SET_PWM_OVERRIDE = 0x8031 # Set an HD valve PWM - MSG_ID_DG_AIR_TRAP_DATA_BROADCAST_INTERVAL_OVERRIDE = 0x8032 # HD air trap data broadcast interval override request - MSG_ID_DG_AIR_TRAP_LEVEL_SENSOR_OVERRIDE = 0x8033 # HD air trap level sensor override request - MSG_ID_HD_SOFTWARE_RESET_REQUEST = 0x8034 # HD reset request - MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE = 0x8035 # Blood flow signal strength override request - MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE = 0x8036 # Dialysate flow signal strength override request - MSG_ID_BLOOD_PUMP_HOME_CMD = 0x8037 # Blood pump home command - MSG_ID_DIAL_IN_PUMP_HOME_CMD = 0x8038 # Dialysate inlet pump home command - MSG_ID_DIAL_OUT_PUMP_HOME_CMD = 0x8039 # Dialysate outlet pump home command - MSG_ID_SUPER_CLEAR_ALARMS_CMD = 0x803A # Clears all alarms (even if non-recoverable or fault) - MSG_ID___AVAILABLE_9 = 0x803B # This msg ID is available for use - MSG_ID___AVAILABLE_10 = 0x803C # This msg ID is available for use - MSG_ID_HD_SET_CALIBRATION_RECORD = 0x803D # HD set calibration_record record that is received from Dialin - MSG_ID_HD_GET_CALIBRATION_RECORD = 0x803E # HD get calibration_record record that is requested from Dialin - MSG_ID_HD_SEND_CALIBRATION_RECORD = 0x803F # HD send calibration_record record to CAN bus to be received in Dialin (equivalent to publish) - MSG_ID_HD_SET_SYSTEM_RECORD = 0x8040 # HD set system record that is received from Dialin - MSG_ID_HD_GET_SYSTEM_RECORD = 0x8041 # HD get system record that is requested from Dialin - MSG_ID_HD_SEND_SYSTEM_RECORD = 0x8042 # HD send system record to CAN bus to be received in Dialin (equivalent to publish) - MSG_ID_HD_GET_SERVICE_RECORD = 0x8043 # HD get service record that is requested from Dialin - MSG_ID_HD_SET_SERVICE_RECORD = 0x8044 # HD set service record that is received from Dialin - MSG_ID_HD_SEND_SERVICE_RECORD = 0x8045 # HD send service record to CAN bus to be received in Dialin (equivalent to publish) - MSG_ID_HD_SET_OP_MODE_REQUEST = 0x8046 # HD set operation mode request - - MSG_ID_DG_TESTER_LOGIN_REQUEST = 0XA000 # 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___AVAILABLE_11 = 0xA01A # This msg ID is available for use - 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_DG_SOFTWARE_RESET_REQUEST = 0xA022 # DG reset request - MSG_ID_DG_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE = 0xA023 # DG concentrate pump measured speed override request - MSG_ID_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE = 0xA024 # Concentrate pumps' target speed override request - MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0xA025 # UV reactors data publish interval override - MSG_ID_CONCENTRATE_PUMP_STATE_CHANGE_REQUEST = 0xA026 # Concentrate pumps' state change request (on / off) - MSG_ID_CONCENTRATE_PUMP_PUBLISH_INTERVAL_OVERRIDE = 0xA027 # Concentrate pumps' data publish interval override request - MSG_ID_DG_START_STOP_INLET_UV_REACTOR = 0xA028 # DG start/stop inlet UV reactor - MSG_ID_DG_REQUEST_CALIBRATION_DATA = 0xA029 # Requests calibration_record data from DG - MSG_ID_DG_FANS_DATA_PUBLISH_OVERRIDE = 0xA02A # Fans data publish interval override request - MSG_ID_DG_START_STOP_OUTLET_UV_REACTOR = 0xA02B # DG start/stop outlet UV reactor - MSG_ID_DG_UV_REACTORS_HEALTH_OVERRIDE = 0xA02C # DG UV reactors health override request - MSG_ID_DG_THERMISTORS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0xA02D # DG thermistors data publish interval override - MSG_ID_DG_THERMISTORS_VALUE_OVERRIDE = 0xA02E # DG thermistors value override - MSG_ID_DG_RO_PUMP_DUTY_CYCLE_OVERRIDE = 0xA02F # DG RO pump duty cycle override - MSG_ID_DG_RO_FLOW_RATE_OVERRIDE = 0xA030 # DG RO flow rate override - MSG_ID_DG_RO_PUMP_TARGET_FLOW_OVERRIDE = 0xA031 # DG RO pump target flow rate override - MSG_ID_DG_RO_PUMP_TARGET_PRESSURE_OVERRIDE = 0xA032 # DG RO pump target pressure override - MSG_ID_DG_SET_CALIBRATION_RECORD = 0xA033 # DG set calibration_record record - MSG_ID_DG_GET_CALIBRATION_RECORD = 0xA034 # DG get calibration_record record - MSG_ID_DG_SEND_CALIBRATION_RECORD = 0xA035 # DG send calibration_record record from firmware - MSG_ID_DG_SET_SYSTEM_RECORD = 0xA036 # DG send system record - MSG_ID_DG_GET_SYSTEM_RECORD = 0xA037 # DG get system record - MSG_ID_DG_SEND_SYSTEM_RECORD = 0xA038 # DG send system record from firmware - MSG_ID_DG_SET_SERVICE_RECORD = 0xA03A # DG set service record that is sent from Dialin - MSG_ID_DG_GET_SERVICE_RECORD = 0xA039 # DG get service record that is requested from Dialin - MSG_ID_DG_SEND_SERVICE_RECORD = 0xA03B # DG send service record that is requested from Dialin - MSG_ID_DG_GET_SCHEDULED_RUNS_RECORD = 0xA03C # DG get scheduled runs that is requested from Dialin - MSG_ID_DG_SET_SCHEDULED_RUNS_RECORD = 0xA03D # DG set scheduled runs that is received from Dialin - MSG_ID_DG_SEND_SCHEDULED_RUNS_RECORD = 0xA03E # DG send scheduled runs to CAN bus to be received in Dialin (equivalent to publish) - - 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 - MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0XFFFF # Generic acknowledge - -@unique class RequestRejectReasons(DialinEnum): REQUEST_REJECT_REASON_NONE = 0 REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE = 1 Index: dialin/common/msg_ids.py =================================================================== diff -u --- dialin/common/msg_ids.py (revision 0) +++ dialin/common/msg_ids.py (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -0,0 +1,282 @@ + +########################################################################### +# +# Copyright (c) 2019-2021 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 msg_ids.py +# +# @author (last) Peter Lucia +# @date (last) 06-Apr-2021 +# @author (original) Peter Lucia +# @date (original) 06-Apr-2021 +# +############################################################################ +from enum import unique +from ..utils.base import DialinEnum + + +# Branch: Sprint37 +@unique +class MsgIds(DialinEnum): + MSG_ID_UNUSED = 0X0 + MSG_ID_OFF_BUTTON_PRESS = 0X1 + MSG_ID_USER_UF_PAUSE_RESUME_REQUEST = 0X10 + MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST = 0X11 + MSG_ID_USER_SALINE_BOLUS_REQUEST = 0X12 + MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE = 0X13 + MSG_ID_USER_SALINE_BOLUS_RESPONSE = 0X14 + MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE = 0X15 + MSG_ID_USER_TREATMENT_TIME_CHANGE_REQUEST = 0X16 + MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST = 0X17 + MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_RESPONSE = 0X18 + MSG_ID_SET_DG_DIALYSATE_TEMP_TARGETS = 0X19 + MSG_ID_TREATMENT_PARAM_CHANGE_RANGES = 0X1A + MSG_ID_USER_TREATMENT_TIME_CHANGE_RESPONSE = 0X1B + MSG_ID_REQUEST_FW_VERSIONS = 0X1C + 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 + MSG_ID_DG_DRAIN_CMD = 0X23 + MSG_ID_DRAIN_PUMP_DATA = 0X24 + MSG_ID_HD_OP_MODE = 0X25 + MSG_ID_STARTING_STOPPING_TREATMENT_CMD = 0X26 + MSG_ID_DG_OP_MODE = 0X27 + MSG_ID_DG_RESERVOIR_DATA = 0X28 + MSG_ID_DG_SAMPLE_WATER_CMD = 0X29 + MSG_ID_DG_VALVES_STATES = 0X2A + MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD = 0X2B + MSG_ID_DG_HEATERS_DATA = 0X2C + 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 + MSG_ID_HD_ACCELEROMETER_DATA = 0X33 + MSG_ID_DG_ACCELEROMETER_DATA = 0X34 + MSG_ID_UI_NEW_TREATMENT_PARAMS = 0X35 + MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE = 0X36 + MSG_ID_DG_HEAT_DISINFECT_DATA = 0X37 + MSG_ID_UI_INITIATE_TREATMENT_REQUEST = 0X38 + MSG_ID_HD_INITIATE_TREATMENT_RESPONSE = 0X39 + MSG_ID_HD_VALVES_DATA = 0X3A + MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0X3B + MSG_ID_UI_START_PRIME_REQUEST = 0X3C + 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 + MSG_ID_HD_PRIMING_STATUS_DATA = 0X43 + MSG_ID_DG_UV_REACTORS_DATA = 0X44 + MSG_ID_DG_THERMISTORS_DATA = 0X45 + MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST = 0X46 + MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE = 0X47 + MSG_ID_DG_FANS_DATA = 0X48 + MSG_ID_HD_TREATMENT_STOP_TIMER_DATA = 0X49 + MSG_ID_UI_PATIENT_DISCONNECTION_CONFIRM = 0X4A + MSG_ID_UI_HEPARIN_PAUSE_RESUME_REQUEST = 0X4B + MSG_ID_HD_HEPARIN_PAUSE_RESUME_RESPONSE = 0X4C + 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 + MSG_ID_HD_RINSEBACK_CMD_RESPONSE = 0X53 + MSG_ID_UI_RECIRC_CMD = 0X54 + MSG_ID_HD_RECIRC_CMD_RESPONSE = 0X55 + MSG_ID_HD_RINSEBACK_PROGRESS = 0X56 + MSG_ID_UI_TX_END_CMD = 0X57 + MSG_ID_HD_TX_END_CMD_RESPONSE = 0X58 + MSG_ID_HD_BLOOD_PRIME_PROGRESS = 0X59 + MSG_ID_HD_RECIRC_PROGRESS = 0X5A + MSG_ID_DG_CHANGE_VALVE_SETTING_CMD = 0X5B + MSG_ID_PRE_TREATMENT_STATE = 0X5C + 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 + MSG_ID_HD_DRY_SELF_TEST_PROGRESS = 0X63 + MSG_ID_UI_PATIENT_CONNECTION_BEGIN_REQUEST = 0X64 + MSG_ID_HD_PATIENT_CONNECTION_BEGIN_RESPONSE = 0X65 + MSG_ID_UI_PATIENT_CONNECTION_CONFIRM = 0X66 + MSG_ID_HD_PATIENT_CONNECTION_CONFIRM_RESPONSE = 0X67 + MSG_ID_UI_CONSUMABLE_INSTALL_CONFIRM = 0X68 + MSG_ID_HD_SYRINGE_PUMP_DATA = 0X69 + MSG_ID_HD_FLUID_LEAK_STATE = 0X6A + MSG_ID_DG_FLUID_LEAK_STATE = 0X6B + MSG_ID_HD_BLOOD_LEAK_STATE = 0X6C + MSG_ID_UI_CHECK_IN = 0X7 + MSG_ID_UI_START_TREATMENT_REQUEST = 0X71 + MSG_ID_HD_START_TREATMENT_RESPONSE = 0X72 + MSG_ID_UI_DISPOSABLE_REMOVAL_CONFIRM = 0X73 + MSG_ID_HD_DISPOSABLE_REMOVAL_CONFIRM_RESPONSE = 0X74 + MSG_ID_UI_TREATMENT_LOG_DATA_REQUEST = 0X75 + MSG_ID_HD_TREATMENT_LOG_DATA_RESPONSE = 0X76 + MSG_ID_HD_POST_TREATMENT_STATE = 0X77 + MSG_ID_DIALYSATE_FLOW_DATA = 0X8 + MSG_ID_FIRST_TESTER_MESSAGE = 0X8000 + MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE = 0X8001 + MSG_ID_OFF_BUTTON_STATE_OVERRIDE = 0X8002 + MSG_ID_STOP_BUTTON_STATE_OVERRIDE = 0X8003 + MSG_ID_ALARM_LAMP_PATTERN_OVERRIDE = 0X8004 + MSG_ID_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0X8005 + MSG_ID_ALARM_STATE_OVERRIDE = 0X8006 + MSG_ID_ALARM_TIME_OVERRIDE = 0X8007 + MSG_ID_BLOOD_FLOW_SET_PT_OVERRIDE = 0X8008 + MSG_ID_BLOOD_FLOW_MEAS_OVERRIDE = 0X8009 + MSG_ID_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE = 0X800A + MSG_ID_BLOOD_PUMP_MC_MEAS_CURR_OVERRIDE = 0X800B + MSG_ID_BLOOD_FLOW_SEND_INTERVAL_OVERRIDE = 0X800C + MSG_ID_TREATMENT_TIME_REMAINING_OVERRIDE = 0X800D + MSG_ID_BLOOD_PUMP_MEAS_SPEED_OVERRIDE = 0X800E + MSG_ID_BLOOD_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0X800F + MSG_ID_DIAL_IN_FLOW_SET_PT_OVERRIDE = 0X8010 + MSG_ID_DIAL_IN_FLOW_MEAS_OVERRIDE = 0X8011 + MSG_ID_DIAL_IN_PUMP_MC_MEAS_SPEED_OVERRIDE = 0X8012 + MSG_ID_DIAL_IN_PUMP_MC_MEAS_CURR_OVERRIDE = 0X8013 + MSG_ID_DIAL_IN_FLOW_SEND_INTERVAL_OVERRIDE = 0X8014 + MSG_ID_DIAL_IN_PUMP_MEAS_SPEED_OVERRIDE = 0X8015 + MSG_ID_DIAL_IN_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0X8016 + MSG_ID_PRESSURE_ARTERIAL_OVERRIDE = 0X8017 + MSG_ID_PRESSURE_VENOUS_OVERRIDE = 0X8018 + MSG_ID_OCCLUSION_BLOOD_PUMP_OVERRIDE = 0X8019 + MSG_ID_OCCLUSION_DIAL_IN_PUMP_OVERRIDE = 0X801A + MSG_ID_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE = 0X801B + MSG_ID_PRES_OCCL_SEND_INTERVAL_OVERRIDE = 0X801C + MSG_ID_SET_RTC_DATE_TIME = 0X801D + MSG_ID_DIAL_OUT_FLOW_SEND_INTERVAL_OVERRIDE = 0X801E + MSG_ID_DIAL_OUT_UF_REF_VOLUME_OVERRIDE = 0X801F + MSG_ID_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE = 0X8020 + MSG_ID_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE = 0X8021 + MSG_ID_DIAL_OUT_PUMP_MC_MEAS_CURR_OVERRIDE = 0X8022 + MSG_ID_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE = 0X8023 + MSG_ID_DIAL_OUT_PUMP_MEAS_ROTOR_SPEED_OVERRIDE = 0X8024 + MSG_ID_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE = 0X8025 + MSG_ID_HD_SAFETY_SHUTDOWN_OVERRIDE = 0X8026 + MSG_ID_HD_ACCEL_OVERRIDE = 0X8027 + MSG_ID_HD_ACCEL_MAX_OVERRIDE = 0X8028 + MSG_ID_HD_ACCEL_SEND_INTERVAL_OVERRIDE = 0X8029 + MSG_ID_HD_SYRINGE_PUMP_SEND_INTERVAL_OVERRIDE = 0X802A + MSG_ID_HD_SYRINGE_PUMP_OPERATION_REQUEST = 0X802B + MSG_ID_HD_SYRINGE_PUMP_MEASURED_RATE_OVERRIDE = 0X802C + MSG_ID_HD_SET_PARAMETER_TREATMENT_PARAMETER = 0X802D + MSG_ID_HD_VALVES_HOME = 0X802E + MSG_ID_HD_VALVES_POSITION_OVERRIDE = 0X802F + MSG_ID_HD_VALVES_SET_AIR_TRAP_VALVE = 0X8030 + MSG_ID_HD_VALVES_SET_PWM_OVERRIDE = 0X8031 + MSG_ID_HD_AIR_TRAP_SEND_INTERVAL_OVERRIDE = 0X8032 + MSG_ID_HD_AIR_TRAP_LEVEL_SENSOR_OVERRIDE = 0X8033 + MSG_ID_HD_SOFTWARE_RESET_REQUEST = 0X8034 + MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE = 0X8035 + MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE = 0X8036 + MSG_ID_BLOOD_PUMP_HOME_CMD = 0X8037 + MSG_ID_DIAL_IN_PUMP_HOME_CMD = 0X8038 + MSG_ID_DIAL_OUT_PUMP_HOME_CMD = 0X8039 + MSG_ID_SUPER_CLEAR_ALARMS_CMD = 0X803A + MSG_ID_HD_SYRINGE_PUMP_MEASURED_FORCE_OVERRIDE = 0X803B + MSG_ID_HD_SYRINGE_PUMP_SYRINGE_DETECT_OVERRIDE = 0X803C + MSG_ID_HD_SET_CALIBRATION_RECORD = 0X803D + MSG_ID_HD_GET_CALIBRATION_RECORD = 0X803E + MSG_ID_HD_SEND_CALIBRATION_RECORD = 0X803F + MSG_ID_HD_SET_SYSTEM_RECORD = 0X8040 + MSG_ID_HD_GET_SYSTEM_RECORD = 0X8041 + MSG_ID_HD_SEND_SYSTEM_RECORD = 0X8042 + MSG_ID_HD_GET_SERVICE_RECORD = 0X8043 + MSG_ID_HD_SET_SERVICE_RECORD = 0X8044 + MSG_ID_HD_SEND_SERVICE_RECORD = 0X8045 + MSG_ID_HD_SET_OP_MODE_REQUEST = 0X8046 + MSG_ID_HD_FLUID_LEAK_SEND_INTERVAL_OVERRIDE = 0X8047 + MSG_ID_HD_FLUID_LEAK_STATE_DETECTOR_OVERRIDE = 0X8048 + MSG_ID_HD_SYRINGE_PUMP_MEASURED_HOME_OVERRIDE = 0X8049 + MSG_ID_HD_SYRINGE_PUMP_MEASURED_POSITION_OVERRIDE = 0X804A + MSG_ID_HD_SYRINGE_PUMP_MEASURED_VOLUME_OVERRIDE = 0X804B + MSG_ID_HD_BLOOD_LEAK_SEND_INTERVAL_OVERRIDE = 0X804C + MSG_ID_HD_BLOOD_LEAK_STATE_DETECTOR_OVERRIDE = 0X804D + MSG_ID_PRESSURE_OCCLUSION_DATA = 0X9 + MSG_ID_CAN_ERROR_COUNT = 0X999 + MSG_ID_RTC_EPOCH = 0XA + MSG_ID_FIRST_DG_TESTER_MESSAGE = 0XA000 + MSG_ID_DG_ALARM_STATE_OVERRIDE = 0XA001 + MSG_ID_DG_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0XA002 + MSG_ID_DG_SET_RTC_DATE_TIME = 0XA004 + MSG_ID_LOAD_CELL_OVERRIDE = 0XA005 + MSG_ID_PRESSURE_OVERRIDE = 0XA006 + MSG_ID_PRESSURE_SEND_INTERVAL_OVERRIDE = 0XA007 + MSG_ID_RO_MEASURED_FLOW_OVERRIDE = 0XA009 + MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE = 0XA00A + MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE = 0XA00B + MSG_ID_DRAIN_PUMP_SEND_INTERVAL_OVERRIDE = 0XA00C + MSG_ID_LOAD_CELLL_SEND_INTERVAL_OVERRIDE = 0XA00D + MSG_ID_VALVE_STATE_OVERRIDE = 0XA00E + MSG_ID_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE = 0XA00F + MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE = 0XA010 + MSG_ID_START_STOP_PRIMARY_HEATER = 0XA011 + MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE = 0XA012 + MSG_ID_HEATERS_PUBLISH_INTERVAL_ORVERRIDE = 0XA013 + MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE = 0XA014 + MSG_ID_CONDUCTIVITY_OVERRIDE = 0XA015 + MSG_ID_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE = 0XA016 + MSG_ID_DG_ACCEL_OVERRIDE = 0XA017 + MSG_ID_DG_ACCEL_MAX_OVERRIDE = 0XA018 + MSG_ID_DG_ACCEL_SEND_INTERVAL_OVERRIDE = 0XA019 + MSG_ID___AVAILABLE_11 = 0XA01A + MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE = 0XA01C + MSG_ID_HEAT_DISINFECT_RECIRC_PATH_DURATION_MINS = 0XA01D + MSG_ID_HEAT_DISINFECT_R1_TO_R2_DURATION_MINS = 0XA01E + MSG_ID_HEAT_DISINFECT_R2_TO_R1_DURATION_MINS = 0XA01F + MSG_ID_HEAT_DISINFECT_NO_OF_CYCLES_TO_RUN = 0XA020 + MSG_ID_HEAT_DISINFECT_PUBLISH_INTERVAL_OVERRIDE = 0XA021 + MSG_ID_DG_SOFTWARE_RESET_REQUEST = 0XA022 + MSG_ID_DG_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE = 0XA023 + MSG_ID_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE = 0XA024 + MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0XA025 + MSG_ID_CONCENTRATE_PUMP_STATE_CHANGE_REQUEST = 0XA026 + MSG_ID_CONCENTRATE_PUMP_PUBLISH_INTERVAL_OVERRIDE = 0XA027 + MSG_ID_DG_START_STOP_UV_REACTORS = 0XA028 + MSG_ID_DG_REQUEST_CALIBRATION_DATA = 0XA029 + MSG_ID_DG_FANS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0XA02A + MSG_ID_DG_UV_REACTORS_HEALTH_OVERRIDE = 0XA02C + MSG_ID_DG_THERMISTORS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0XA02D + MSG_ID_DG_THERMISTORS_VALUE_OVERRIDE = 0XA02E + MSG_ID_DG_RO_PUMP_DUTY_CYCLE_OVERRIDE = 0XA02F + MSG_ID_DG_RO_FLOW_RATE_OVERRIDE = 0XA030 + MSG_ID_DG_RO_PUMP_TARGET_FLOW_OVERRIDE = 0XA031 + MSG_ID_DG_RO_PUMP_TARGET_PRESSURE_OVERRIDE = 0XA032 + MSG_ID_DG_SET_CALIBRATION_RECORD = 0XA033 + MSG_ID_DG_GET_CALIBRATION_RECORD = 0XA034 + MSG_ID_DG_SEND_CALIBRATION_RECORD = 0XA035 + MSG_ID_DG_SET_SYSTEM_RECORD = 0XA036 + MSG_ID_DG_GET_SYSTEM_RECORD = 0XA037 + MSG_ID_DG_SEND_SYSTEM_RECORD = 0XA038 + MSG_ID_DG_GET_SERVICE_RECORD = 0XA039 + MSG_ID_DG_SET_SERVICE_RECORD = 0XA03A + MSG_ID_DG_SEND_SERVICE_RECORD = 0XA03B + MSG_ID_DG_GET_SCHEDULED_RUNS_RECORD = 0XA03C + MSG_ID_DG_SET_SCHEDULED_RUNS_RECORD = 0XA03D + MSG_ID_DG_SEND_SCHEDULED_RUNS_RECORD = 0XA03E + MSG_ID_DG_FLUID_LEAK_SEND_INTERVAL_OVERRIDE = 0XA03F + MSG_ID_DG_FLUID_LEAK_STATE_DETECTOR_OVERRIDE = 0XA040 + 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_HD_DEBUG_EVENT = 0XFFF1 + MSG_ID_DG_DEBUG_EVENT = 0XFFF2 + MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0XFFFF Index: dialin/hd/treatment.py =================================================================== diff -u -r7ddc296f52c2b64cb429e53af4d72cdc50679fd5 -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- dialin/hd/treatment.py (.../treatment.py) (revision 7ddc296f52c2b64cb429e53af4d72cdc50679fd5) +++ dialin/hd/treatment.py (.../treatment.py) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -21,6 +21,7 @@ from logging import Logger from ..utils.conversions import integer_to_bytearray, float_to_bytearray + class HDTreatment(_AbstractSubSystem): """ Index: dialin/ui/__init__.py =================================================================== diff -u -r82e32ae00355b2245a2660569935de152a883799 -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- dialin/ui/__init__.py (.../__init__.py) (revision 82e32ae00355b2245a2660569935de152a883799) +++ dialin/ui/__init__.py (.../__init__.py) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -1,6 +1,163 @@ -from .hd_simulator import (HDSimulator, - TXStates, - EResponse, - TreatmentParameterRejections) +from .hd_simulator import HDSimulator from .dg_simulator import DGSimulator -from .hd_simulator_alarms import HDAlarmsSimulator \ No newline at end of file +from .hd_simulator_alarms import HDAlarmsSimulator +from ..common.msg_defs import RequestRejectReasons + + +class EResponse: + Rejected = 0 + Accepted = 1 + + +class GuiActionType: + Unknown = 0 + PowerOff = 1 + KeepAlive = 7 + BloodFlow = 5 + DialysateInletFlow = 8 + DialysateOutletFlow = 11 + TreatmentTime = 13 + PowerOffBroadcast = 14 + + AlarmStatus = 2 + AlarmTriggered = 3 + AlarmCleared = 4 + + PressureOcclusion = 9 + + DGDrainPumpData = 36 + DGHeatersData = 44 + LoadCellReadings = 12 + DGPressuresData = 32 + TemperatureSensors = 45 + + CanBUSFaultCount = 2457 + HDDebugText = 0xFFF1 + DGDebugText = 0xFFF2 + + AdjustBloodDialysateReq = 23 + AdjustBloodDialysateRsp = 24 + + AdjustDurationReq = 22 + AdjustDurationRsp = 27 + + AdjustUltrafiltrationStateReq = 16 + AdjustUltrafiltrationStateRsp = 65 + AdjustUltrafiltrationEditReq = 17 + AdjustUltrafiltrationEditRsp = 19 + AdjustUltrafiltrationConfirmReq = 21 + AdjustUltrafiltrationConfirmRsp = 46 + + AdjustPressuresLimitsReq = 70 + AdjustPressuresLimitsRsp = 71 + + TreatmentRanges = 26 + + String = 65279 + Acknow = 65535 + AcknowGeneric = 0 # Generic Acknowledgment is not a unique message ID and inherits its Id from the actual message. Zero is a placeholder + + +class TXStates: + # Sub Mode + TREATMENT_START_STATE = 0 # Start treatment - initialize treatment and go to blood prime state + TREATMENT_BLOOD_PRIME_STATE = 1 # Prime blood-side of dialyzer with gradual ramp for 1 min. while dialyzer is bypassed. No dialysis or UF taking place. No treatment time. + TREATMENT_DIALYSIS_STATE = 2 # Perform dialysis. Deliver Heparin as prescribed. Deliver UF as prescribed. Handle saline boluses as requested + TREATMENT_STOP_STATE = 3 # Treatment stopped. All pumps off. Dializer bypassed + TREATMENT_RINSEBACK_STATE = 4 # Perform rinseback with saline. Dialyzer bypassed. Dialysate recirculating + TREATMENT_RECIRC_STATE = 5 # Recirculate saline and dialysate while patient disconnected. Blood lines open and shunted. Dialyzer is bypassed + TREATMENT_END_STATE = 6 # Dialysis has ended. Blood pump slowed. Dialyzer is bypassed. Dialysate is recirculated. User can rinseback + + # Saline states + SALINE_BOLUS_STATE_IDLE = 0 # No saline bolus delivery is in progress + SALINE_BOLUS_STATE_WAIT_FOR_PUMPS_STOP = 1 # Wait for pumps to stop before starting bolus + SALINE_BOLUS_STATE_IN_PROGRESS = 2 # A saline bolus delivery is in progress + SALINE_BOLUS_STATE_MAX_DELIVERED = 3 # Maximum saline bolus volume reached - no more saline bolus deliveries allowed + + # UF states + UF_START_STATE = 0 # Start state of the ultrafiltration state machine + UF_PAUSED_STATE = 1 # Paused state of the ultrafiltration state machine + UF_RUNNING_STATE = 2 # Running state of the ultrafiltration state machine + UF_OFF_STATE = 3 # Completed/off state of the ultrafiltration state machine + UF_COMPLETED_STATE = 4 # Completed state of ultrafiltration state machine + + # Sub Mode + TREATMENT_START_STATE = 0 + TREATMENT_BLOOD_PRIME_STATE = 1 + TREATMENT_DIALYSIS_STATE = 2 + TREATMENT_STOP_STATE = 3 + TREATMENT_RINSEBACK_STATE = 4 + TREATMENT_RECIRC_STATE = 5 + TREATMENT_END_STATE = 6 + + # Heparin states + HEPARIN_STATE_OFF = 0 # No heparin delivery is in progress + HEPARIN_STATE_PAUSED = 1 # Heparin delivery paused + HEPARIN_STATE_INITIAL_BOLUS = 2 # Initial heparin bolus delivery in progress + HEPARIN_STATE_DISPENSING = 3 # Gradual heparin dispensing in progress + HEPARIN_STATE_COMPLETED = 4 # Heparin delivery stopped due to the set stop time before treatment end + HEPARIN_STATE_EMPTY = 5 # Heparin Syringe empty + + # Rinseback states + RINSEBACK_STOP_INIT_STATE = 0 # Start state (stopped) of the rinseback sub-mode state machine + RINSEBACK_RUN_STATE = 1 # Rinseback running state of the rinseback sub-mode state machine + RINSEBACK_PAUSED_STATE = 2 # Rinseback paused state of the rinseback sub-mode state machine + RINSEBACK_STOP_STATE = 3 # Rinseback stopped (done) state of the rinseback sub-mode state machine + RINSEBACK_RUN_ADDITIONAL_STATE = 4 # Additional rinseback volume (10 mL) state of the rinseback sub-mode state machine + + # Recirculate + TREATMENT_RECIRC_RECIRC_STATE = 0 # Re-circulate state of the treatment re-circulate sub-mode state machine + TREATMENT_RECIRC_STOPPED_STATE = 1 # Stopped state of the treatment re-circulate sub-mode state machine + + # Blood Prime + BLOOD_PRIME_RAMP_STATE = 0 # Ramp state of the blood prime sub-mode state machine + + # Treatment End + TREATMENT_END_WAIT_FOR_RINSEBACK_STATE = 0 # Wait for rinseback state of the treatment end sub-mode state machine + TREATMENT_END_PAUSED_STATE = 1 # Paused state of the treatment end sub-mode state machine + + # Treatment Stop + TREATMENT_STOP_RECIRC_STATE = 0 # Dialysate re-circulation state of the treatment stop sub-mode state machine + TREATMENT_STOP_NO_RECIRC_STATE = 1 # No dialysate re-circulation state of the treatment stop sub-mode state machine + + +class TreatmentParameterRejections: + def __init__(self): + self.param_request_valid = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_blood_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_dialysate_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_duration = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_heparin_stop_time = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_saline_bolus = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_acid_concentrate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_bicarbonate_concentrate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_dialyzer_type = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_blood_pressure_measure_interval = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_rinseback_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_arterial_pressure_limit_low = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_arterial_pressure_limit_high = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_venous_pressure_limit_low = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_venous_pressure_limit_high = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_heparin_dispensing_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_heparin_bolus_volume = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + self.param_dialysate_temp = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + + def set_all_valid(self): + """ + Sets all parameters as valid + + @return: None + """ + for attr in dir(self): + if not callable(getattr(self, attr)) and attr.startswith("param_"): + self.__dict__[attr] = RequestRejectReasons.REQUEST_REJECT_REASON_NONE + + def set_all_invalid(self): + """ + Sets all treatment parameters to be invalid + + @return: None + """ + for attr in dir(self): + if not callable(getattr(self, attr)) and attr.startswith("param_"): + self.__dict__[attr] = RequestRejectReasons.REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE Index: dialin/ui/dg_simulator.py =================================================================== diff -u -r82e32ae00355b2245a2660569935de152a883799 -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- dialin/ui/dg_simulator.py (.../dg_simulator.py) (revision 82e32ae00355b2245a2660569935de152a883799) +++ dialin/ui/dg_simulator.py (.../dg_simulator.py) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -21,7 +21,8 @@ DenaliCanMessenger, DenaliChannels) from ..utils.base import _AbstractSubSystem, _LogManager -from ..utils.conversions import integer_to_bytearray +from ..utils.conversions import integer_to_bytearray, float_to_bytearray, byte_to_bytearray, short_to_bytearray +from . import messageBuilder, GuiActionType class DGSimulator(_AbstractSubSystem): @@ -78,3 +79,354 @@ payload=payload) self.can_interface.send(message, 0) + + def cmd_send_checkin_dg(self): + """ + check-in (keep alive) message from DG + :return: none + """ + + payload = ["A5", "01", "00", "06", "00", "00", "76", "00"] + payload = [int(each, 16) for each in payload] + + message = {"channel_id": DenaliChannels.dg_to_hd_ch_id, + "message": payload} + + self.can_interface.send(message, 0) + + + def cmd_set_dg_ro_pump_data(self, vSetPtPressure, vFlowRate, vPWM): + """ + the DG RO Pump Data message setter/sender method + + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(F32) | #3:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x1F00| 0x080 | 8 | 1 Hz | N | DG | All | DG RO Pump Data | \ref Data::mPressure | \ref Data::mFlowRate | \ref Data::mPWM | :param vSetPtPressure: + + :param vSetPtPressure: (int) set Point Pressure + :param vFlowRate: (float) Flow Rate + :param vPWM: (float) PWM + :return: none + """ + + payload = integer_to_bytearray(vSetPtPressure) + payload += float_to_bytearray(vFlowRate) + payload += float_to_bytearray(vPWM) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_RO_PUMP_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_pressures_data(self, vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI): + """ + the DG Pressures Data message setter/sender method + + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | + |0x2000| 0x080 | 8 | 1 Hz | N | DG | All | DG Pressures Data | \ref Data::mROInletPSI | \ref Data::mROOutletPSI | \ref Data::mDrainInletPSI | \ref Data::mDrainOutletPSI | + + :param vROInletPSI: (float) RO Inlet PSI + :param vROOutletPSI: (float) RO Outlet PSI + :param vDrainInletPSI: (float) Drain Inlet PSI + :param vDrainOutletPSI: (float) Drain Outlet PSI + :return: none + """ + + payload = float_to_bytearray(vROInletPSI) + payload += float_to_bytearray(vROOutletPSI) + payload += float_to_bytearray(vDrainInletPSI) + payload += float_to_bytearray(vDrainOutletPSI) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_DG_PRESSURES_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_drain_pump_data(self, vSetPtRPM, vDACValue): + """ + the DG Drain Pump Data message setter/sender method + + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: | + |0x2400| 0x080 | 8 | 1 Hz | N | DG | All | DG Drain Pump Data | \ref Data::mRPM | \ref Data::mDAC | + + :param vSetPtRPM: (int) Set Point RPM + :param vDACValue: (int) DAC Value + :return: none + """ + + payload = integer_to_bytearray(vSetPtRPM) + payload += integer_to_bytearray(vDACValue) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_DRAIN_PUMP_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_operation_mode(self, vDGOpMode): + """ + the DG Operation Mode Data message setter/sender method + + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | + |0x2700| 0x080 | 8 | 1 Hz | N | DG | All | DG Operation Mode Data | \ref Data::mOpMode | + + :param vDGOpMode: (int) DG Operation Mode + :return: none + """ + + payload = integer_to_bytearray(vDGOpMode) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_DG_OP_MODE.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_reservoir_data(self, vActiveReservoir, vFillToVolML, vDrainToVolML): + """ + the DG Reservoir Data message setter/sender method + + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x2800| 0x080 | 8 | 1 Hz | N | DG | All | DG Reservoir Data | \ref Data::mActiveReservoir | \ref Data::mFillToVol | \ref Data::mDrainToVol | + + :param vActiveReservoir: (int) Active Reservoir + :param vFillToVolML: (int) Fill To Volume ML + :param vDrainToVolML: (int) Drain To Vol ML + :return: none + """ + + payload = integer_to_bytearray(vActiveReservoir) + payload += integer_to_bytearray(vFillToVolML) + payload += integer_to_bytearray(vDrainToVolML) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_DG_RESERVOIR_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_valves_states(self, vValvesStates): + """ + the DG Valves States Data message setter/sender method + + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U16) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | + |0x2A00| 0x080 | 8 | 2 Hz | N | DG | All | DG Valves States Data | \ref Data::mStates | + + :param vValvesStates: (int)Valves states + :return: none + """ + + payload = integer_to_bytearray(vValvesStates) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_DG_VALVES_STATES.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_heaters_data(self, vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC): + """ + the DG Heaters Data message setter/sender method + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x2C00| 0x080 | 8 | 2 Hz | N | DG | All | DG Heaters Data | \ref Data::mMainPrimaryDC | \ref Data::mSmallPrimaryDC | \ref Data::mTrimmerDC | + + :param vMainPriMaryDC: (int) Main PriMary DC + :param vSmallPrimaryDC: (int) Small Primary DC + :param vTrimmerDC: (int) Trimmer DC + :return: none + """ + + payload = integer_to_bytearray(vMainPriMaryDC) + payload += integer_to_bytearray(vSmallPrimaryDC) + payload += integer_to_bytearray(vTrimmerDC) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_DG_HEATERS_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_load_cell_readings_data(self, vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup): + """ + The DG Load Cell Readings Data message setter/sender method + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | + |0x0C00| 0x080 | 8 | 10 Hz | N | DG | All | DG Load Cell Readings Data | \ref Data::mReservoir1Prim | \ref Data::mReservoir1Bkup | \ref Data::mReservoir2Prim | \ref Data::mReservoir2Bkup | + :param vRs1Prim: (float) Reservoir 1 Primary + :param vRs1Bkup: (float) Reservoir 1 Backup + :param vRs2Prim: (float) Reservoir 2 Primary + :param vRs2Bkup: (float) Reservoir 2 Backup + :return: none + """ + + payload = float_to_bytearray(vRs1Prim) + payload += float_to_bytearray(vRs1Bkup) + payload += float_to_bytearray(vRs2Prim) + payload += float_to_bytearray(vRs2Bkup) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_LOAD_CELL_READINGS.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_dg_temperatures_data(self, vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, + vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, + vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, + vTrimmerHeaterInternalTemperature): + """ + the DG Temperatures Data message setter/sender method + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | + |0x2D00| 0x080 | 8 | 2 Hz | N | DG | All | DG Temperatures Data | \ref Data::mInletPrimaryHeater | \ref Data::mOutletPrimaryHeater | \ref Data::mConductivitySensor1 | + + | #4:(F32) | #5:(F32) | #6:(F32) | #7:(F32) | #8:(F32) | + |:--: |:--: |:--: |:--: |:--: | + | \ref Data::mConductivitySensor2 | \ref Data::mOutletRedundancy | \ref Data::mInletDialysate | \ref Data::mPrimaryHeaterThermoCouple | \ref Data::mTrimmerHeaterThermoCouple | + + | #9:(F32) | #10:(F32) | #11:(F32) | #12:(F32) | + | :--: |:--: |:--: |:--: | + | \ref Data::mPrimaryHeaterColdJunction | \ref Data::mTrimmerHeaterColdJunction | \ref Data::mPrimaryHeaterInternal | \ref Data::mTrimmerHeaterInternal | + :param vInletPrimaryHeater: (float) Inlet Primary Heater + :param vOutletPrimaryHeater: (float) Outlet Primary Heater + :param vConductivitySensor1: (float) Conductivity Sensor 1 + :param vConductivitySensor2: (float) Conductivity Sensor 2 + :param vOutletRedundancy: (float) Outlet Redundancy + :param vInletDialysate: (float) Inlet Dialysate + :param vPrimaryHeaterThermocouple: (float) Primary Heater Thermocouple + :param vTrimmerHeaterThermocouple: (float) Trimmer Heater Thermocouple + :param vPrimaryHeaterColdJunction: (float) Primary Heater ColdJunction + :param vTrimmerHeaterColdJunction: (float) Trimmer Heater ColdJunction + :param vPrimaryHeaterInternalTemperature: (float) Primary Heater Internal Temperature + :param vTrimmerHeaterInternalTemperature: (float) Trimmer HeaterInternal Temperature + :return: none + """ + + payload = float_to_bytearray(vInletPrimaryHeater) + payload += float_to_bytearray(vOutletPrimaryHeater) + payload += float_to_bytearray(vConductivitySensor1) + payload += float_to_bytearray(vConductivitySensor2) + payload += float_to_bytearray(vOutletRedundancy) + payload += float_to_bytearray(vInletDialysate) + payload += float_to_bytearray(vPrimaryHeaterThermocouple) + payload += float_to_bytearray(vTrimmerHeaterThermocouple) + payload += float_to_bytearray(vPrimaryHeaterColdJunction) + payload += float_to_bytearray(vTrimmerHeaterColdJunction) + payload += float_to_bytearray(vPrimaryHeaterInternalTemperature) + payload += float_to_bytearray(vTrimmerHeaterInternalTemperature) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_DG_TEMPERATURE_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_send_unknown_dg(self): + """ + the unknown message from DG setter/sender method + :return: none + """ + + payload = integer_to_bytearray(0) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, + message_id=MsgIds.MSG_ID_UNUSED.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_send_accelerometer_dg_data(self, vX, vY, vZ, vXMax, vYMax, vZMax, vXTilt, vYTilt, vZTilt ): + """ + the accelerometer hd data message method + | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | + |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: | + |0x3400| 0x080 | 8 | 1Hz | N | HD | UI | DG Accelerometer data | + + | #1:(F32) | #2:(F32) | #3:(U32) | + |:--: |:--: |:--: | + | \ref Data::mX | \ref Data::mY | \ref Data::mX | + + | #4:(F32) | #5:(F32) | #6:(U32) | + |:--: |:--: |:--: | + | \ref Data::mXMax | \ref Data::mYMax | \ref Data::mXMax | + + | #7:(F32) | #8:(F32) | #9:(U32) | + |:--: |:--: |:--: | + | \ref Data::mXTilt | \ref Data::mYTilt | \ref Data::mXTilt | + + :param vX: x axis + :param vY: y axis + :param vZ: z axis + :param vXMax: x axis max + :param vYMax: y axis max + :param vZMax: z axis max + :param vXTilt: x axis tilt + :param vYTilt: y axis tilt + :param vZTilt: z axis tilt + :return: None + """ + + payload = float_to_bytearray(vX) + payload += float_to_bytearray(vY) + payload += float_to_bytearray(vZ) + payload += float_to_bytearray(vXMax) + payload += float_to_bytearray(vYMax) + payload += float_to_bytearray(vZMax) + payload += float_to_bytearray(vXTilt) + payload += float_to_bytearray(vYTilt) + payload += float_to_bytearray(vZTilt) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, + message_id=MsgIds.MSG_ID_DG_ACCELEROMETER_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_send_version_dg_data(self, vMajor, vMinor, vMicro, vBuild, vFPGA_id, vFPGA_Major, vFPGA_Minor, vFPGA_Lab ): + """ + the hd version response message method + :param vMajor: Major version number + :param vMinor: Minor version number + :param vMicro: Micro version number + :param vBuild: Build version number + :param vFPGA_id: FPGA id version number + :param vFPGA_Major: FPGA Major version number + :param vFPGA_Minor: FPGA Minor version number + :param vFPGA_Lab: FPGA Lab version number + :return: None + """ + + payload = byte_to_bytearray(vMajor) + payload += byte_to_bytearray(vMinor) + payload += byte_to_bytearray(vMicro) + payload += short_to_bytearray(vBuild) + payload += byte_to_bytearray(vFPGA_id) + payload += byte_to_bytearray(vFPGA_Major) + payload += byte_to_bytearray(vFPGA_Minor) + payload += byte_to_bytearray(vFPGA_Lab) + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, + message_id=MsgIds.MSG_ID_DG_VERSION.value, + payload=payload) + + self.can_interface.send(message, 0) + + @staticmethod + def build_dg_debug_text(vText): + """ + the debug text message from DG builder method + :param vText: (str) the debug text + :return: none + """ + message_length = 40 + txt = messageBuilder.textToByte(vText, message_length) # + 1 null term + msg = messageBuilder.buildMessage(GuiActionType.DGDebugText, 1 * (message_length + 1), False, txt) + return messageBuilder.toFrames(msg) Index: dialin/ui/hd_simulator.py =================================================================== diff -u -r3a5030c08d57bddc2c22dca05d1070375e3cb5f7 -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision 3a5030c08d57bddc2c22dca05d1070375e3cb5f7) +++ dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -20,7 +20,7 @@ import time import subprocess -from . import utils, messageBuilder +from . import messageBuilder from .hd_simulator_alarms import HDAlarmsSimulator from ..common.msg_defs import RequestRejectReasons, MsgIds, MsgFieldPositions from ..common.hd_defs import HDDefs @@ -30,167 +30,9 @@ from ..utils.base import _AbstractSubSystem, _LogManager from ..utils.conversions import integer_to_bytearray, float_to_bytearray, byte_to_bytearray, short_to_bytearray from ..utils import YES +from . import GuiActionType, EResponse, TXStates -class TreatmentParameterRejections: - def __init__(self): - self.param_request_valid = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_blood_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_dialysate_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_duration = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_heparin_stop_time = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_saline_bolus = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_acid_concentrate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_bicarbonate_concentrate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_dialyzer_type = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_blood_pressure_measure_interval = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_rinseback_flow_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_arterial_pressure_limit_low = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_arterial_pressure_limit_high = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_venous_pressure_limit_low = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_venous_pressure_limit_high = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_heparin_dispensing_rate = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_heparin_bolus_volume = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - self.param_dialysate_temp = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - def set_all_valid(self): - """ - Sets all parameters as valid - - @return: None - """ - for attr in dir(self): - if not callable(getattr(self, attr)) and attr.startswith("param_"): - self.__dict__[attr] = RequestRejectReasons.REQUEST_REJECT_REASON_NONE - - def set_all_invalid(self): - """ - Sets all treatment parameters to be invalid - - @return: None - """ - for attr in dir(self): - if not callable(getattr(self, attr)) and attr.startswith("param_"): - self.__dict__[attr] = RequestRejectReasons.REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE - - -class TXStates: - # Sub Mode - TREATMENT_START_STATE = 0 # Start treatment - initialize treatment and go to blood prime state - TREATMENT_BLOOD_PRIME_STATE = 1 # Prime blood-side of dialyzer with gradual ramp for 1 min. while dialyzer is bypassed. No dialysis or UF taking place. No treatment time. - TREATMENT_DIALYSIS_STATE = 2 # Perform dialysis. Deliver Heparin as prescribed. Deliver UF as prescribed. Handle saline boluses as requested - TREATMENT_STOP_STATE = 3 # Treatment stopped. All pumps off. Dializer bypassed - TREATMENT_RINSEBACK_STATE = 4 # Perform rinseback with saline. Dialyzer bypassed. Dialysate recirculating - TREATMENT_RECIRC_STATE = 5 # Recirculate saline and dialysate while patient disconnected. Blood lines open and shunted. Dialyzer is bypassed - TREATMENT_END_STATE = 6 # Dialysis has ended. Blood pump slowed. Dialyzer is bypassed. Dialysate is recirculated. User can rinseback - - # Saline states - SALINE_BOLUS_STATE_IDLE = 0 # No saline bolus delivery is in progress - SALINE_BOLUS_STATE_WAIT_FOR_PUMPS_STOP = 1 # Wait for pumps to stop before starting bolus - SALINE_BOLUS_STATE_IN_PROGRESS = 2 # A saline bolus delivery is in progress - SALINE_BOLUS_STATE_MAX_DELIVERED = 3 # Maximum saline bolus volume reached - no more saline bolus deliveries allowed - - # UF states - UF_START_STATE = 0 # Start state of the ultrafiltration state machine - UF_PAUSED_STATE = 1 # Paused state of the ultrafiltration state machine - UF_RUNNING_STATE = 2 # Running state of the ultrafiltration state machine - UF_OFF_STATE = 3 # Completed/off state of the ultrafiltration state machine - UF_COMPLETED_STATE = 4 # Completed state of ultrafiltration state machine - - # Sub Mode - # UI only cares about the actual state and _NOT could be any other state - TREATMENT_START_STATE = 0 - TREATMENT_BLOOD_PRIME_STATE = 1 - TREATMENT_DIALYSIS_STATE = 2 - TREATMENT_STOP_STATE = 3 - TREATMENT_RINSEBACK_STATE = 4 - TREATMENT_RECIRC_STATE = 5 - TREATMENT_END_STATE = 6 - - # Heparin states - HEPARIN_STATE_OFF = 0 # No heparin delivery is in progress - HEPARIN_STATE_PAUSED = 1 # Heparin delivery paused - HEPARIN_STATE_INITIAL_BOLUS = 2 # Initial heparin bolus delivery in progress - HEPARIN_STATE_DISPENSING = 3 # Gradual heparin dispensing in progress - HEPARIN_STATE_COMPLETED = 4 # Heparin delivery stopped due to the set stop time before treatment end - HEPARIN_STATE_EMPTY = 5 # Heparin Syringe empty - - # Rinseback states - RINSEBACK_STOP_INIT_STATE = 0 # Start state (stopped) of the rinseback sub-mode state machine - RINSEBACK_RUN_STATE = 1 # Rinseback running state of the rinseback sub-mode state machine - RINSEBACK_PAUSED_STATE = 2 # Rinseback paused state of the rinseback sub-mode state machine - RINSEBACK_STOP_STATE = 3 # Rinseback stopped (done) state of the rinseback sub-mode state machine - RINSEBACK_RUN_ADDITIONAL_STATE = 4 # Additional rinseback volume (10 mL) state of the rinseback sub-mode state machine - - # Recirculate - TREATMENT_RECIRC_RECIRC_STATE = 0 # Re-circulate state of the treatment re-circulate sub-mode state machine - TREATMENT_RECIRC_STOPPED_STATE = 1 # Stopped state of the treatment re-circulate sub-mode state machine - - # Blood Prime - BLOOD_PRIME_RAMP_STATE = 0 # Ramp state of the blood prime sub-mode state machine - - # Treatment End - TREATMENT_END_WAIT_FOR_RINSEBACK_STATE = 0 # Wait for rinseback state of the treatment end sub-mode state machine - TREATMENT_END_PAUSED_STATE = 1 # Paused state of the treatment end sub-mode state machine - - # Treatment Stop - TREATMENT_STOP_RECIRC_STATE = 0 # Dialysate re-circulation state of the treatment stop sub-mode state machine - TREATMENT_STOP_NO_RECIRC_STATE = 1 # No dialysate re-circulation state of the treatment stop sub-mode state machine - - -class EResponse: - Rejected = 0 - Accepted = 1 - - -class GuiActionType: - Unknown = 0 - PowerOff = 1 - KeepAlive = 7 - BloodFlow = 5 - DialysateInletFlow = 8 - DialysateOutletFlow = 11 - TreatmentTime = 13 - PowerOffBroadcast = 14 - - AlarmStatus = 2 - AlarmTriggered = 3 - AlarmCleared = 4 - - PressureOcclusion = 9 - - DGDrainPumpData = 36 - DGHeatersData = 44 - LoadCellReadings = 12 - DGPressuresData = 32 - TemperatureSensors = 45 - - CanBUSFaultCount = 2457 - HDDebugText = 0xFFF1 - DGDebugText = 0xFFF2 - - AdjustBloodDialysateReq = 23 - AdjustBloodDialysateRsp = 24 - - AdjustDurationReq = 22 - AdjustDurationRsp = 27 - - AdjustUltrafiltrationStateReq = 16 - AdjustUltrafiltrationStateRsp = 65 - AdjustUltrafiltrationEditReq = 17 - AdjustUltrafiltrationEditRsp = 19 - AdjustUltrafiltrationConfirmReq = 21 - AdjustUltrafiltrationConfirmRsp = 46 - - AdjustPressuresLimitsReq = 70 - AdjustPressuresLimitsRsp = 71 - - TreatmentRanges = 26 - - String = 65279 - Acknow = 65535 - AcknowGeneric = 0 # Generic Acknowledgment is not a unique message ID and inherits its Id from the actual message. Zero is a placeholder - - class HDSimulator(_AbstractSubSystem): NUM_TREATMENT_PARAMETERS = 18 instanceCount = 0 @@ -616,20 +458,6 @@ self.can_interface.send(message, 0) - def cmd_send_checkin_dg(self): - """ - check-in (keep alive) message from DG - :return: none - """ - - payload = ["A5", "01", "00", "06", "00", "00", "76", "00"] - payload = [int(each, 16) for each in payload] - - message = {"channel_id": DenaliChannels.dg_to_hd_ch_id, - "message": payload} - - self.can_interface.send(message, 0) - def cmd_show_poweroff_dialog(self): """ the message from HD to UI to show the power off dialog @@ -697,18 +525,6 @@ time.sleep(delay) @staticmethod - def build_dg_debug_text(vText): - """ - the debug text message from DG builder method - :param vText: (str) the debug text - :return: none - """ - message_length = 40 - txt = messageBuilder.textToByte(vText, message_length) # + 1 null term - msg = messageBuilder.buildMessage(GuiActionType.DGDebugText, 1 * (message_length + 1), False, txt) - return messageBuilder.toFrames(msg) - - @staticmethod def build_hd_debug_text(vText): """ the debug text message from HD builder method @@ -1133,240 +949,6 @@ self.can_interface.send(message, 0) - def cmd_set_dg_ro_pump_data(self, vSetPtPressure, vFlowRate, vPWM): - """ - the DG RO Pump Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(F32) | #3:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x1F00| 0x080 | 8 | 1 Hz | N | DG | All | DG RO Pump Data | \ref Data::mPressure | \ref Data::mFlowRate | \ref Data::mPWM | :param vSetPtPressure: - - :param vSetPtPressure: (int) set Point Pressure - :param vFlowRate: (float) Flow Rate - :param vPWM: (float) PWM - :return: none - """ - - payload = integer_to_bytearray(vSetPtPressure) - payload += float_to_bytearray(vFlowRate) - payload += float_to_bytearray(vPWM) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_RO_PUMP_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_pressures_data(self, vROInletPSI, vROOutletPSI, vDrainInletPSI, vDrainOutletPSI): - """ - the DG Pressures Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | - |0x2000| 0x080 | 8 | 1 Hz | N | DG | All | DG Pressures Data | \ref Data::mROInletPSI | \ref Data::mROOutletPSI | \ref Data::mDrainInletPSI | \ref Data::mDrainOutletPSI | - - :param vROInletPSI: (float) RO Inlet PSI - :param vROOutletPSI: (float) RO Outlet PSI - :param vDrainInletPSI: (float) Drain Inlet PSI - :param vDrainOutletPSI: (float) Drain Outlet PSI - :return: none - """ - - payload = float_to_bytearray(vROInletPSI) - payload += float_to_bytearray(vROOutletPSI) - payload += float_to_bytearray(vDrainInletPSI) - payload += float_to_bytearray(vDrainOutletPSI) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_PRESSURES_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_drain_pump_data(self, vSetPtRPM, vDACValue): - """ - the DG Drain Pump Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: | - |0x2400| 0x080 | 8 | 1 Hz | N | DG | All | DG Drain Pump Data | \ref Data::mRPM | \ref Data::mDAC | - - :param vSetPtRPM: (int) Set Point RPM - :param vDACValue: (int) DAC Value - :return: none - """ - - payload = integer_to_bytearray(vSetPtRPM) - payload += integer_to_bytearray(vDACValue) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DRAIN_PUMP_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_operation_mode(self, vDGOpMode): - """ - the DG Operation Mode Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | - |0x2700| 0x080 | 8 | 1 Hz | N | DG | All | DG Operation Mode Data | \ref Data::mOpMode | - - :param vDGOpMode: (int) DG Operation Mode - :return: none - """ - - payload = integer_to_bytearray(vDGOpMode) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_OP_MODE.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_reservoir_data(self, vActiveReservoir, vFillToVolML, vDrainToVolML): - """ - the DG Reservoir Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x2800| 0x080 | 8 | 1 Hz | N | DG | All | DG Reservoir Data | \ref Data::mActiveReservoir | \ref Data::mFillToVol | \ref Data::mDrainToVol | - - :param vActiveReservoir: (int) Active Reservoir - :param vFillToVolML: (int) Fill To Volume ML - :param vDrainToVolML: (int) Drain To Vol ML - :return: none - """ - - payload = integer_to_bytearray(vActiveReservoir) - payload += integer_to_bytearray(vFillToVolML) - payload += integer_to_bytearray(vDrainToVolML) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_RESERVOIR_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_valves_states(self, vValvesStates): - """ - the DG Valves States Data message setter/sender method - - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U16) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | - |0x2A00| 0x080 | 8 | 2 Hz | N | DG | All | DG Valves States Data | \ref Data::mStates | - - :param vValvesStates: (int)Valves states - :return: none - """ - - payload = integer_to_bytearray(vValvesStates) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_VALVES_STATES.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_heaters_data(self, vMainPriMaryDC, vSmallPrimaryDC, vTrimmerDC): - """ - the DG Heaters Data message setter/sender method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x2C00| 0x080 | 8 | 2 Hz | N | DG | All | DG Heaters Data | \ref Data::mMainPrimaryDC | \ref Data::mSmallPrimaryDC | \ref Data::mTrimmerDC | - - :param vMainPriMaryDC: (int) Main PriMary DC - :param vSmallPrimaryDC: (int) Small Primary DC - :param vTrimmerDC: (int) Trimmer DC - :return: none - """ - - payload = integer_to_bytearray(vMainPriMaryDC) - payload += integer_to_bytearray(vSmallPrimaryDC) - payload += integer_to_bytearray(vTrimmerDC) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_HEATERS_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_load_cell_readings_data(self, vRs1Prim, vRs1Bkup, vRs2Prim, vRs2Bkup): - """ - The DG Load Cell Readings Data message setter/sender method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | #4:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | - |0x0C00| 0x080 | 8 | 10 Hz | N | DG | All | DG Load Cell Readings Data | \ref Data::mReservoir1Prim | \ref Data::mReservoir1Bkup | \ref Data::mReservoir2Prim | \ref Data::mReservoir2Bkup | - :param vRs1Prim: (float) Reservoir 1 Primary - :param vRs1Bkup: (float) Reservoir 1 Backup - :param vRs2Prim: (float) Reservoir 2 Primary - :param vRs2Bkup: (float) Reservoir 2 Backup - :return: none - """ - - payload = float_to_bytearray(vRs1Prim) - payload += float_to_bytearray(vRs1Bkup) - payload += float_to_bytearray(vRs2Prim) - payload += float_to_bytearray(vRs2Bkup) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_LOAD_CELL_READINGS.value, - payload=payload) - - self.can_interface.send(message, 0) - - def cmd_set_dg_temperatures_data(self, vInletPrimaryHeater, vOutletPrimaryHeater, vConductivitySensor1, vConductivitySensor2, - vOutletRedundancy, vInletDialysate, vPrimaryHeaterThermocouple, vTrimmerHeaterThermocouple, - vPrimaryHeaterColdJunction, vTrimmerHeaterColdJunction, vPrimaryHeaterInternalTemperature, - vTrimmerHeaterInternalTemperature): - """ - the DG Temperatures Data message setter/sender method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | #2:(F32) | #3:(F32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: | - |0x2D00| 0x080 | 8 | 2 Hz | N | DG | All | DG Temperatures Data | \ref Data::mInletPrimaryHeater | \ref Data::mOutletPrimaryHeater | \ref Data::mConductivitySensor1 | - - | #4:(F32) | #5:(F32) | #6:(F32) | #7:(F32) | #8:(F32) | - |:--: |:--: |:--: |:--: |:--: | - | \ref Data::mConductivitySensor2 | \ref Data::mOutletRedundancy | \ref Data::mInletDialysate | \ref Data::mPrimaryHeaterThermoCouple | \ref Data::mTrimmerHeaterThermoCouple | - - | #9:(F32) | #10:(F32) | #11:(F32) | #12:(F32) | - | :--: |:--: |:--: |:--: | - | \ref Data::mPrimaryHeaterColdJunction | \ref Data::mTrimmerHeaterColdJunction | \ref Data::mPrimaryHeaterInternal | \ref Data::mTrimmerHeaterInternal | - :param vInletPrimaryHeater: (float) Inlet Primary Heater - :param vOutletPrimaryHeater: (float) Outlet Primary Heater - :param vConductivitySensor1: (float) Conductivity Sensor 1 - :param vConductivitySensor2: (float) Conductivity Sensor 2 - :param vOutletRedundancy: (float) Outlet Redundancy - :param vInletDialysate: (float) Inlet Dialysate - :param vPrimaryHeaterThermocouple: (float) Primary Heater Thermocouple - :param vTrimmerHeaterThermocouple: (float) Trimmer Heater Thermocouple - :param vPrimaryHeaterColdJunction: (float) Primary Heater ColdJunction - :param vTrimmerHeaterColdJunction: (float) Trimmer Heater ColdJunction - :param vPrimaryHeaterInternalTemperature: (float) Primary Heater Internal Temperature - :param vTrimmerHeaterInternalTemperature: (float) Trimmer HeaterInternal Temperature - :return: none - """ - - payload = float_to_bytearray(vInletPrimaryHeater) - payload += float_to_bytearray(vOutletPrimaryHeater) - payload += float_to_bytearray(vConductivitySensor1) - payload += float_to_bytearray(vConductivitySensor2) - payload += float_to_bytearray(vOutletRedundancy) - payload += float_to_bytearray(vInletDialysate) - payload += float_to_bytearray(vPrimaryHeaterThermocouple) - payload += float_to_bytearray(vTrimmerHeaterThermocouple) - payload += float_to_bytearray(vPrimaryHeaterColdJunction) - payload += float_to_bytearray(vTrimmerHeaterColdJunction) - payload += float_to_bytearray(vPrimaryHeaterInternalTemperature) - payload += float_to_bytearray(vTrimmerHeaterInternalTemperature) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_DG_TEMPERATURE_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - def cmd_set_treatment_states_data(self, vSubMode, vUFState, vSalineState, vHeparingState, vRinsebackState, vRecirculateState, @@ -1523,20 +1105,6 @@ self.can_interface.send(message, 0) - def cmd_send_unknown_dg(self): - """ - the unknown message from DG setter/sender method - :return: none - """ - - payload = integer_to_bytearray(0) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, - message_id=MsgIds.MSG_ID_UNUSED.value, - payload=payload) - - self.can_interface.send(message, 0) - def cmd_set_treatment_heparin_data(self, vCumulative): """ the Treatment Heparin Data message setter/sender method @@ -1736,7 +1304,6 @@ else: self.logger.debug("End treatment unknown request") - def cmd_send_treatment_adjust_end_response(self, vAccepted, vReason): """ the treatment end state change Response message method @@ -1805,53 +1372,6 @@ self.can_interface.send(message, 0) - def cmd_send_accelerometer_dg_data(self, vX, vY, vZ, vXMax, vYMax, vZMax, vXTilt, vYTilt, vZTilt ): - """ - the accelerometer hd data message method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: | - |0x3400| 0x080 | 8 | 1Hz | N | HD | UI | DG Accelerometer data | - - | #1:(F32) | #2:(F32) | #3:(U32) | - |:--: |:--: |:--: | - | \ref Data::mX | \ref Data::mY | \ref Data::mX | - - | #4:(F32) | #5:(F32) | #6:(U32) | - |:--: |:--: |:--: | - | \ref Data::mXMax | \ref Data::mYMax | \ref Data::mXMax | - - | #7:(F32) | #8:(F32) | #9:(U32) | - |:--: |:--: |:--: | - | \ref Data::mXTilt | \ref Data::mYTilt | \ref Data::mXTilt | - - :param vX: x axis - :param vY: y axis - :param vZ: z axis - :param vXMax: x axis max - :param vYMax: y axis max - :param vZMax: z axis max - :param vXTilt: x axis tilt - :param vYTilt: y axis tilt - :param vZTilt: z axis tilt - :return: None - """ - - payload = float_to_bytearray(vX) - payload += float_to_bytearray(vY) - payload += float_to_bytearray(vZ) - payload += float_to_bytearray(vXMax) - payload += float_to_bytearray(vYMax) - payload += float_to_bytearray(vZMax) - payload += float_to_bytearray(vXTilt) - payload += float_to_bytearray(vYTilt) - payload += float_to_bytearray(vZTilt) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, - message_id=MsgIds.MSG_ID_DG_ACCELEROMETER_DATA.value, - payload=payload) - - self.can_interface.send(message, 0) - def cmd_send_version_hd_data(self, vMajor, vMinor, vMicro, vBuild, vFPGA_id, vFPGA_Major, vFPGA_Minor, vFPGA_Lab ): """ the hd version response message method @@ -1880,32 +1400,3 @@ payload=payload) self.can_interface.send(message, 0) - - def cmd_send_version_dg_data(self, vMajor, vMinor, vMicro, vBuild, vFPGA_id, vFPGA_Major, vFPGA_Minor, vFPGA_Lab ): - """ - the hd version response message method - :param vMajor: Major version number - :param vMinor: Minor version number - :param vMicro: Micro version number - :param vBuild: Build version number - :param vFPGA_id: FPGA id version number - :param vFPGA_Major: FPGA Major version number - :param vFPGA_Minor: FPGA Minor version number - :param vFPGA_Lab: FPGA Lab version number - :return: None - """ - - payload = byte_to_bytearray(vMajor) - payload += byte_to_bytearray(vMinor) - payload += byte_to_bytearray(vMicro) - payload += short_to_bytearray(vBuild) - payload += byte_to_bytearray(vFPGA_id) - payload += byte_to_bytearray(vFPGA_Major) - payload += byte_to_bytearray(vFPGA_Minor) - payload += byte_to_bytearray(vFPGA_Lab) - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dg_to_ui_ch_id, - message_id=MsgIds.MSG_ID_DG_VERSION.value, - payload=payload) - - self.can_interface.send(message, 0) Index: requirements.txt =================================================================== diff -u -re525a317896ad03c21cc600d7590dc2c6ba3903d -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- requirements.txt (.../requirements.txt) (revision e525a317896ad03c21cc600d7590dc2c6ba3903d) +++ requirements.txt (.../requirements.txt) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -7,18 +7,19 @@ cycler==0.10.0 docutils==0.16 doxypypy==0.8.8.6 -flake8==3.8.3 +et-xmlfile==1.0.1 +flake8==3.8.4 idna==2.9 imagesize==1.2.0 -importlib-metadata==1.7.0 +importlib-metadata==2.0.0 Jinja2==2.11.2 kiwisolver==1.1.0 m2r==0.2.1 MarkupSafe==1.1.1 -matplotlib==3.2.1 mccabe==0.6.1 mistune==0.8.4 -numpy==1.18.2 +numpy==1.19.5 +openpyxl==3.0.7 packaging==20.4 pycodestyle==2.6.0 pyflakes==2.2.0 @@ -28,6 +29,7 @@ python-dateutil==2.8.1 pytz==2020.1 requests==2.23.0 +shiboken2==5.15.2 six==1.14.0 snowballstemmer==2.0.0 Sphinx==3.0.4 @@ -40,4 +42,4 @@ sphinxcontrib-serializinghtml==1.1.4 urllib3==1.25.9 wrapt==1.12.0 -zipp==3.1.0 +zipp==3.3.1 Fisheye: Tag 02eff24a2b116fe3d71d8275eeb78f419302efd6 refers to a dead (removed) revision in file `tools/build_alarm_defs.py'. Fisheye: No comparison available. Pass `N' to diff? Index: tools/build_common_defs.py =================================================================== diff -u --- tools/build_common_defs.py (revision 0) +++ tools/build_common_defs.py (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -0,0 +1,182 @@ +########################################################################### +# +# 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 build_alarm_defs.py +# +# @author (last) Peter Lucia +# @date (last) 05-Apr-2021 +# @author (original) Peter Lucia +# @date (original) 05-Apr-2021 +# +############################################################################ +import heapq +import os +import subprocess +from datetime import datetime + + +def create_enum_file(in_path: str, out_path:str, author: str, code_imports: str, code_class_def: str, as_int=True): + """ + Generates an enum source code file + @param in_path: (str) input txt file + @param out_path: (str) output .py file + @param author: (str) name of author for header + @param code_imports: (str) raw source code as string imports needed for this header file + @param code_class_def: (str) raw source code class definition for this enum + @param as_int: (bool) if True, output enums as int, if False output as hex + @return: True upon success, False upon failure + """ + + if os.path.exists(in_path): + enums = [] + try: + with open(in_path, 'r') as f: + for line in f: + split_str = line.split('=') + num = split_str[1].split(",")[0] + num = num.replace(",", "").strip() + var = split_str[0].strip() + + base = 10 + if "x" in num.lower(): + base = 16 + try: + if as_int: + num = int(num, base) + else: + num = hex(int(num, base)).upper() + enums.append((num, var)) + except ValueError as e: + print("Skipping {0}: {1}".format(var, e)) + + except FileNotFoundError as e: + print("Error reading in txt file: {0}".format(e)) + return False + + heapq.heapify(enums) + current_time = datetime.now() + + code_header = \ +""" +########################################################################### +# +# Copyright (c) 2019-{0} 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 {4} +# +# @author (last) {3} +# @date (last) {2}-{1}-{0} +# @author (original) {3} +# @date (original) {2}-{1}-{0} +# +############################################################################""" \ + .format(current_time.strftime("%Y"), + current_time.strftime("%b"), + current_time.strftime("%d"), + author, + out_path.split("/")[-1]) + + # build the resultant source code + code_result = code_header + code_result += code_imports + code_result += code_class_def + + # pop the enums from the min heap until its empty + code = "" + while enums: + enum = heapq.heappop(enums) + code += " {0} = {1}\n".format(enum[1], enum[0]) + code_result += code + + try: + # write the generated file to disk + with open(out_path, 'w') as f: + f.write(code_result) + return True + except FileNotFoundError as e: + print("Error writing source code: {0}".format(e)) + return False + else: + print("Error: Input file {0} does not exist!".format(in_path)) + return False + + +def build_common_defs(dst_alarms_txt: str, + dst_common: str, + common_branch: str, + dst_python: str, + author: str, + prefix_match: str, + cpp_header: str, + code_prepend: str, + code_class_def: str, + as_int: bool, + ): + """ + Driver function to build a common defs .py source file + @param dst_alarms_txt: (str) the intermediary txt file to create + @param dst_common: (str) where to temporarily clone common + @param common_branch: (str) the common branch to clone + @param dst_python: (str) the python source file to generate + @param author: (str) the author's name to put in the header of the source file + @param prefix_match: (str) the prefix token to search for (e.g. ALARM_ID_) + @param cpp_header: (str) the cpp header in common to read + @param code_prepend: (str) raw source code as string imports needed for this header file + @param code_class_def: (str) raw source code class definition for this enum + @param as_int: (bool) if True, output enums as int, if False output as hex + @return: None + """ + + if subprocess.call("bash gen_alarm_ids.sh {0} {1} {2} {3} {4}" + .format(dst_alarms_txt, dst_common, common_branch, prefix_match, cpp_header), shell=True) != 0: + print("Failure: Could not generate alarm ids.") + return + + if create_enum_file(dst_alarms_txt, dst_python, author, code_prepend, code_class_def, as_int): + print("Created enum file: {0}".format(dst_python)) + print("Done.") + else: + print("Failure: Could not create enum file.") + + +if __name__ == '__main__': + common_branch="Sprint37" + build_common_defs(dst_alarms_txt="/tmp/AlarmIds.txt", + dst_common="/tmp/common", + common_branch=common_branch, + dst_python=os.path.join(os.path.abspath("../"), "dialin/common/alarm_defs.py"), + author="Peter Lucia", + prefix_match="ALARM_ID_", + cpp_header="AlarmDefs.h", + code_prepend= ("\n" + "from enum import unique\n" + "from ..utils.base import AlarmEnum\n"), + code_class_def=("\n\n" + "# Branch: {0}\n" + "@unique\n" + "class AlarmList(AlarmEnum):\n").format(common_branch), + as_int=True, + ) + build_common_defs(dst_alarms_txt="/tmp/MsgDefs.txt", + dst_common="/tmp/common", + common_branch=common_branch, + dst_python=os.path.join(os.path.abspath("../"), "dialin/common/msg_ids.py"), + author="Peter Lucia", + prefix_match="MSG_ID_", + cpp_header="MsgDefs.h", + code_prepend= ("\n" + "from enum import unique\n" + "from ..utils.base import DialinEnum\n"), + code_class_def=("\n\n" + "# Branch: {0}\n" + "@unique\n" + "class MsgIds(DialinEnum):\n").format(common_branch), + as_int=False, + ) Index: tools/gen_alarm_ids.sh =================================================================== diff -u -r3f12fb75e3d92e3ecbcb86a4b9b284dd0b05e26f -r02eff24a2b116fe3d71d8275eeb78f419302efd6 --- tools/gen_alarm_ids.sh (.../gen_alarm_ids.sh) (revision 3f12fb75e3d92e3ecbcb86a4b9b284dd0b05e26f) +++ tools/gen_alarm_ids.sh (.../gen_alarm_ids.sh) (revision 02eff24a2b116fe3d71d8275eeb78f419302efd6) @@ -17,20 +17,22 @@ if [[ "$1" == "-h" || "$1" == "--help" || $# -eq 0 ]]; then currentFile=$(basename "$0") - echo "Usage: ./$currentFile , " + echo "Usage: ./$currentFile " exit 1 fi OUTPUT_FILE=$1 COMMON_REPO=$2 COMMON_BRANCH=$3 +PREFIX_MATCH=$4 +CPP_HEADER=$5 rm -rf "$COMMON_REPO" git clone -b "$COMMON_BRANCH" ssh://git@dvm-linux02:7999/comm/common.git "$COMMON_REPO" if [ $? -ne 0 ]; then echo "Could not clone common"; exit 1; fi -grep -oh "ALARM_ID_.* = [0-9]*" -- "$COMMON_REPO/AlarmDefs.h" > "$OUTPUT_FILE" +grep -oh "$PREFIX_MATCH.* = .*," -- "$COMMON_REPO/$CPP_HEADER" > "$OUTPUT_FILE" if [ $? -ne 0 ]; then echo "Error during grep"; exit 1; fi rm -rf "$COMMON_REPO"