Index: dialin/common/msg_defs.py =================================================================== diff -u -r0392b232e0f257fb6946f6e8e2cdf4eadd05974d -r5a37805d29dc8d0a1013b5bde6855b3cde9ee853 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision 0392b232e0f257fb6946f6e8e2cdf4eadd05974d) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 5a37805d29dc8d0a1013b5bde6855b3cde9ee853) @@ -94,6 +94,8 @@ MSG_ID_DG_FANS_DATA = 0x48 # DG broadcast fans data MSG_ID_HD_CALIBRATION_DATA = 0x49 # HD broadcast calibration data MSG_ID_DG_CALIBRATION_DATA = 0x4A # DG broadcast calibration data + 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_HD_PRE_TREATMENT_UF_RESPONSE = 0x50 # HD response to user request to adjust the ultrafiltration in pre-treatment MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing Index: dialin/ui/hd_simulator.py =================================================================== diff -u -r0392b232e0f257fb6946f6e8e2cdf4eadd05974d -r5a37805d29dc8d0a1013b5bde6855b3cde9ee853 --- dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision 0392b232e0f257fb6946f6e8e2cdf4eadd05974d) +++ dialin/ui/hd_simulator.py (.../hd_simulator.py) (revision 5a37805d29dc8d0a1013b5bde6855b3cde9ee853) @@ -1352,7 +1352,6 @@ self.can_interface.send(message, 0) HDSimulator.wait_for_message_to_be_sent() - def cmd_send_unknown_hd(self): """ the unknown message from HD setter/sender method @@ -1381,191 +1380,78 @@ self.can_interface.send(message, 0) - @staticmethod - def buildTreatmentStatesData(vSubMode, vUFState, vSalineState, vHeparinState): + def cmd_set_treatment_heparin_data(self, vCumulative): """ - the Treatment States Data message builder method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(U32) | #4:(U32) | - |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: | - |0x0F00| 0x040 | 7 | 1 Hz | N | HD | All | Treatment States Data | \ref Data::mSubMode | \ref Data::mUFState | \ref Data::mSalineState | \ref Data::mHeparinState | - :param vSubMode: (int) Sub-Mode - :param vUFState: (int) UF State - :param vSalineState: (int) Saline Bolus State - :param vHeparinState: (int) Heparin State - :return: (str) built message frame(s) - """ - msg = messageBuilder.buildMessage(0x000F, 4 + 4 + 4 + 4, False, - utils.toI32(vSubMode), - utils.toI32(vUFState), - utils.toI32(vSalineState), - utils.toI32(vHeparinState) - ) - return messageBuilder.toFrames(msg) - - @staticmethod - def setTreatmentStatesData(vSubMode, vUFState, vSalineState, vHeparinState): - """ - the Treatment States Data message setter/sender method - :param vSubMode: (int) Sub-Mode - :param vUFState: (int) UF State - :param vSalineState: (int) Saline Bolus State - :param vHeparinState: (int) Heparin State - :return: none - """ - frames = HDSimulator.buildTreatmentStatesData(vSubMode, vUFState, vSalineState, vHeparinState) - frames = messageBuilder.toCandumpFormat(frames) - for frame in frames: - subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) - HDSimulator.wait_for_message_to_be_sent() - - @staticmethod - def setTreatmentStartState(): - """ - starting the treatment for user convenience since Tx is not by default running - :return: none - """ - HDSimulator.setTreatmentStatesData( - TXStates.TREATMENT_DIALYSIS_STATE, - TXStates.UF_OFF_STATE, - TXStates.SALINE_BOLUS_STATE_IDLE, - TXStates.HEPARIN_STATE_OFF - ) - - @staticmethod - def buildTreatmentHeparinData(vCumulative): - """ - the Treatment Heparin Data message builder method + the Treatment Heparin Data message setter/sender method | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(F32) | |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: | |0x4D00| 0x040 | 7 | 1 Hz | N | HD | All | Treatment Heparin Data | \ref Data::mCumulative | - :param vCumulative: (float) Heparin Cumulative Volume - :return: (str) built message frame(s) - """ - msg = messageBuilder.buildMessage(0x004D, 4, False, - utils.toF32(vCumulative) - ) - return messageBuilder.toFrames(msg) - @staticmethod - def setTreatmentHeparinData(vCumulative): - """ - the Treatment Heparin Data message setter/sender method :param vCumulative: (float) Heparin Cumulative Volume :return: none """ - frames = HDSimulator.buildTreatmentHeparinData(vCumulative) - frames = messageBuilder.toCandumpFormat(frames) - for frame in frames: - subprocess.call(['cansend', 'can0', '040#{}'.format(frame)]) - HDSimulator.wait_for_message_to_be_sent() + payload = float_to_bytearray(vCumulative) - @staticmethod - def buildHeparinResponse(vAccepted, vReason, vState): + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_sync_broadcast_ch_id, + message_id=MsgIds.MSG_ID_HD_HEPARIN_DATA.value, + payload=payload) + + self.can_interface.send(message, 0) + + def cmd_set_heparin_pause_resume_response(self, vAccepted, vReason, vState): """ - the Heparin Response message builder method + the Heparin Response message setter/sender method | MSG | CAN ID | M.Box | Type | Ack | Src | Dest | Description | #1:(U32) | #2:(U32) | #3:(U32) | |:----:|:------:|:-----:|:----:|:---:|:---:|:----:|:----------------:|:--------------------:|:-------------------:|:-------------------:| |0x4C00| 0x020 | 6 | Rsp | Y | HD | UI | Heparin Response | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mState | - :param vAccepted: (int) boolean accept/reject response - :param vReason: (int) rejection reason - :param vState: (int) Heparin current State - :return: (str) built message frame(s) - """ - msg = messageBuilder.buildMessage(0x004C, 4 + 4 + 4, True, - utils.toI32(vAccepted), - utils.toI32(vReason), - utils.toI32(vState)) - return messageBuilder.toFrames(msg) - @staticmethod - def setHeparinResponse(vAccepted, vReason, vState): - """ - the Heparin Response message setter/sender method :param vAccepted: (int) boolean accept/reject response :param vReason: (int) rejection reason :param vState: (int) Heparin current State :return: none """ - frames = HDSimulator.buildHeparinResponse(vAccepted, vReason, vState) - frames = messageBuilder.toCandumpFormat(frames) - for frame in frames: - subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) - HDSimulator.wait_for_message_to_be_sent() + payload = integer_to_bytearray(vAccepted) + payload += integer_to_bytearray(vReason) + payload += integer_to_bytearray(vState) - @staticmethod - def buildTreatmentAdjustPressuresLimitsResponse(vAccepted, vReason, vArterialLow, vArterialHigh, vVenousLow, - vVenousHigh): + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=MsgIds.MSG_ID_HD_HEPARIN_PAUSE_RESUME_RESPONSE.value, + payload=payload) + + self.can_interface.send(message, 0) + + + def cmd_send_treatment_adjust_pressures_limit_response(self, vAccepted, vReason, vArterialLow, vArterialHigh, vVenousLow, + vVenousHigh): """ - the Blood/dialysate rate change Response message builder method + the Blood/dialysate rate change Response message setter/sender method | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | #2:(U32) | #3:(S32) | #4:(S32) | #3:(S32) | #4:(S32) | |:----:|:------:|:---:|:------:|:---:|:---:|:---:|:-----------: |:--: |:--: |:--: |:--: |:--: |:--: | |0x4700| 0x020 | 6 | Rsp | Y | HD | UI | A/V BP Limit Change Response | \ref Data::mAccepted | \ref Data::mReason | \ref Data::mArterialLow | \ref Data::mArterialHigh | \ref Data::mVenousLow | \ref Data::mVenousHigh | - :param vAccepted: (int) boolean accept/reject response - :param vReason: (int) rejection reason - :param mArterialLow: (int) Arterial Pressure Limit Low (mmHg) - :param mArterialHigh: (int) Arterial Pressure Limit High (mmHg) - :param mVenousLow: (int) Venous Pressure Limit Low (mmHg) - :param mVenousHigh: (int) Venous Pressure Limit High (mmHg) - :return: (str) built message frame(s) - """ - msg = messageBuilder.buildMessage(GuiActionType.AdjustPressuresLimitsRsp, 6 * 4, True, - utils.toI32(vAccepted), - utils.toI32(vReason), - utils.toI32(vArterialLow), - utils.toI32(vArterialHigh), - utils.toI32(vVenousLow), - utils.toI32(vVenousHigh) - ) - return messageBuilder.toFrames(msg) - @staticmethod - def sendTreatmentAdjustPressuresLimitsResponse(vAccepted, vReason, vArterialLow, vArterialHigh, vVenousLow, - vVenousHigh): - """ - the Blood/dialysate rate change Response message setter/sender method :param vAccepted: (int) boolean accept/reject response :param vReason: (int) rejection reason - :param mArterialLow: (int) Arterial Pressure Limit Low (mmHg) - :param mArterialHigh: (int) Arterial Pressure Limit High (mmHg) - :param mVenousLow: (int) Venous Pressure Limit Low (mmHg) - :param mVenousHigh: (int) Venous Pressure Limit High (mmHg) + :param vArterialLow: (int) Arterial Pressure Limit Low (mmHg) + :param vArterialHigh: (int) Arterial Pressure Limit High (mmHg) + :param vVenousLow: (int) Venous Pressure Limit Low (mmHg) + :param vVenousHigh: (int) Venous Pressure Limit High (mmHg) :return: none """ - frames = HDSimulator.buildTreatmentAdjustPressuresLimitsResponse(vAccepted, vReason, vArterialLow, vArterialHigh, - vVenousLow, vVenousHigh) - frames = messageBuilder.toCandumpFormat(frames) - for frame in frames: - subprocess.call(['cansend', 'can0', '020#{}'.format(frame)]) - HDSimulator.wait_for_message_to_be_sent() - @staticmethod - def buildAlarmClearedCondition(vAlarmID): - """ - the Alarm Condition Cleared message builder method - | MSG | CAN ID | Box | Type | Ack | Src | Dst | Description | #1:(U32) | - |:----:|:---------:|:---:|:------:|:---:|:---:|:---:|:-----------------------:|:--: | - |0x3F00| 0x001,2,4 | 1 | Event | Y | HD | All | Alarm Condition Cleared | \ref Data::mAlarmID | - :param vAlarmID: (int) Alarm ID - :return: (str) built message frame(s) - """ - msg = messageBuilder.buildMessage(63, 4, True, - utils.toI32(vAlarmID)) - return messageBuilder.toFrames(msg) + payload = integer_to_bytearray(vAccepted) + payload += integer_to_bytearray(vReason) + payload += integer_to_bytearray(vArterialLow) + payload += integer_to_bytearray(vArterialHigh) + payload += integer_to_bytearray(vVenousLow) + payload += integer_to_bytearray(vVenousHigh) - @staticmethod - def setAlarmClearedCondition(vAlarmID): - """ - the Alarm Condition Cleared message setter/sender method - :param vAlarmID: (int) Alarm ID - :return: none - """ - frames = HDSimulator.buildAlarmClearedCondition(vAlarmID) - frames = messageBuilder.toCandumpFormat(frames) - for frame in frames: - subprocess.call(['cansend', 'can0', '001#{}'.format(frame)]) - HDSimulator.wait_for_message_to_be_sent() + message = DenaliMessage.build_message(channel_id=DenaliChannels.hd_to_ui_ch_id, + message_id=MsgIds.MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE.value, + payload=payload) + self.can_interface.send(message, 0) +