Index: HemodialysisDevice.py =================================================================== diff -u -r3b321f8ad2966cce65d6234ea44d3a2d4d79d133 -rdc9c24e034cd5882cd437899199cc9c0834ef8c6 --- HemodialysisDevice.py (.../HemodialysisDevice.py) (revision 3b321f8ad2966cce65d6234ea44d3a2d4d79d133) +++ HemodialysisDevice.py (.../HemodialysisDevice.py) (revision dc9c24e034cd5882cd437899199cc9c0834ef8c6) @@ -252,10 +252,12 @@ # UI message IDs MSG_ID_UI_CHECKIN_WITH_HD = 0x0007 MSG_ID_HD_UF_PAUSE_RESUME_REQUEST = 0x0010 + MSG_ID_HD_TREATMENT_PARAMS_RANGES = 0x001A MSG_ID_UF_SETTINGS_CHANGE_REQUEST_BY_USER = 0x0011 MSG_ID_UF_SETTINGS_CHANGE_RESPONSE_FROM_HD = 0x0013 MSG_ID_UF_SETTINGS_CHANGE_CONFIRMED_BY_USER = 0x0015 MSG_ID_TREATMENT_DURATION_SETTING_CHANGE_REQUEST = 0x0016 + MSG_ID_TREATMENT_DURATION_SETTING_CHANGE_RESPONSE_FROM_HD = 0x001B MSG_ID_BLOOD_DIALYSATE_FLOW_SETTING_CHANGE_REQUEST_BY_USER = 0x0017 MSG_ID_BLOOD_DIALYSATE_FLOW_SETTING_CHANGE_RESPONSE_FROM_HD = 0x0018 @@ -267,7 +269,31 @@ RESPONSE_REJECTED = 0 RESPONSE_ACCEPTED = 1 - # HD response to UF change request message field positions + # HD update on valid treatment parameter ranges message field positions + START_POS_MIN_TREAT_TIME = DenaliMessage.PAYLOAD_START_INDEX + END_POS_MIN_TREAT_TIME = START_POS_MIN_TREAT_TIME + 4 + START_POS_MAX_TREAT_TIME = END_POS_MIN_TREAT_TIME + END_POS_MAX_TREAT_TIME = START_POS_MAX_TREAT_TIME + 4 + START_POS_MIN_UF_VOL = END_POS_MAX_TREAT_TIME + END_POS_MIN_UF_VOL = START_POS_MIN_UF_VOL + 4 + START_POS_MAX_UF_VOL = END_POS_MIN_UF_VOL + END_POS_MAX_UF_VOL = START_POS_MAX_UF_VOL + 4 + START_POS_MIN_DIAL_RATE = END_POS_MAX_UF_VOL + END_POS_MIN_DIAL_RATE = START_POS_MIN_DIAL_RATE + 4 + START_POS_MAX_DIAL_RATE = END_POS_MIN_DIAL_RATE + END_POS_MAX_DIAL_RATE = START_POS_MAX_DIAL_RATE + 4 + + # HD response to treatment duration change request message field positions + START_POS_TIME_CHG_RSP_ACCEPTED = DenaliMessage.PAYLOAD_START_INDEX + END_POS_TIME_CHG_RSP_ACCEPTED = START_POS_TIME_CHG_RSP_ACCEPTED + 4 + START_POS_TIME_CHG_RSP_REASON = END_POS_TIME_CHG_RSP_ACCEPTED + END_POS_TIME_CHG_RSP_REASON = START_POS_TIME_CHG_RSP_REASON + 4 + START_POS_TIME_CHG_RSP_TIME = END_POS_TIME_CHG_RSP_REASON + END_POS_TIME_CHG_RSP_TIME = START_POS_TIME_CHG_RSP_TIME + 4 + START_POS_TIME_CHG_RSP_UF_VOL = END_POS_TIME_CHG_RSP_TIME + END_POS_TIME_CHG_RSP_UF_VOL = START_POS_TIME_CHG_RSP_UF_VOL + 4 + + # HD response to UF volume change request message field positions START_POS_UF_CHG_RSP_RESP = DenaliMessage.PAYLOAD_START_INDEX END_POS_UF_CHG_RSP_RESP = START_POS_UF_CHG_RSP_RESP + 4 START_POS_UF_CHG_RSP_REJECT_REASON = END_POS_UF_CHG_RSP_RESP @@ -276,11 +302,11 @@ END_POS_UF_CHG_RSP_VOL = START_POS_UF_CHG_RSP_VOL + 4 START_POS_UF_CHG_RSP_TIME = END_POS_UF_CHG_RSP_VOL END_POS_UF_CHG_RSP_TIME = START_POS_UF_CHG_RSP_TIME + 4 - START_POS_UF_CHG_RSP_RATE = END_POS_UF_CHG_RSP_TIME - END_POS_UF_CHG_RSP_RATE = START_POS_UF_CHG_RSP_RATE + 4 - START_POS_UF_CHG_RSP_TIME_DIFF = END_POS_UF_CHG_RSP_RATE + START_POS_UF_CHG_RSP_TIME_DIFF = END_POS_UF_CHG_RSP_TIME END_POS_UF_CHG_RSP_TIME_DIFF = START_POS_UF_CHG_RSP_TIME_DIFF + 4 - START_POS_UF_CHG_RSP_RATE_DIFF = END_POS_UF_CHG_RSP_TIME_DIFF + START_POS_UF_CHG_RSP_RATE = END_POS_UF_CHG_RSP_TIME_DIFF + END_POS_UF_CHG_RSP_RATE = START_POS_UF_CHG_RSP_RATE + 4 + START_POS_UF_CHG_RSP_RATE_DIFF = END_POS_UF_CHG_RSP_RATE END_POS_UF_CHG_RSP_RATE_DIFF = START_POS_UF_CHG_RSP_RATE_DIFF + 4 # HD response to blood/dialysate flow change request message field positions @@ -309,9 +335,25 @@ channel_id = DenaliChannels.hd_to_ui_ch_id can_interface.registerReceivingPublicationFunction(channel_id, self.MSG_ID_UF_SETTINGS_CHANGE_RESPONSE_FROM_HD, self.handlerUFChangeResponseFunction) + can_interface.registerReceivingPublicationFunction(channel_id, self.MSG_ID_TREATMENT_DURATION_SETTING_CHANGE_RESPONSE_FROM_HD, + self.handlerTreatmentDurationChangeResponseFunction) can_interface.registerReceivingPublicationFunction(channel_id, self.MSG_ID_BLOOD_DIALYSATE_FLOW_SETTING_CHANGE_RESPONSE_FROM_HD, self.handlerBloodAndDialysateChangeResponseFunction) + can_interface.registerReceivingPublicationFunction(channel_id, self.MSG_ID_HD_TREATMENT_PARAMS_RANGES, + self.handlerTreatmentParamRangesFunction) + # initialize variables that will be populated by treatment parameter ranges message + self.MinTreatmentDurationMin = 0 + self.MaxTreatmentDurationMin = 0 + self.MinUFVolumeMl = 0 + self.MaxUFVolumeMl = 0 + self.MinDialysateFlowRateMlMin = 0 + self.MaxDialysateFlowRateMlMin = 0 + # initialize variables that will be populated by response from HD to treatment duration change request + self.DurationChangeSucceeded = False + self.DurationChangeRejectReason = 0 + self.DurationChangeTimeMin = 0 + self.DurationChangeUFVolMl = 0 # initialize variables that will be populated by response from HD to UF change request self.UFChangeSucceeded = False self.UFChangeRejectReason = 0 @@ -326,6 +368,66 @@ self.TargetBloodFlowRate = 0 self.TargetDialysateFlowRate = 0 + def handlerTreatmentParamRangesFunction(self, message): + """ + Handler for response from HD regarding valid treatment parameter ranges. + + \param message: response message from HD regarding valid treatment parameter ranges.\n + U32 Minimum treatment duration setting (in min.). \n + U32 Maximum treatment duration setting (in min.). \n + U32 Minimum ultrafiltration volume (in mL). \n + U32 Maximum ultrafiltration volume (in mL). \n + U32 Minimum dialysate flow rate (in mL/min). \n + U32 Maximum dialysate flow rate (in mL/min). + + \returns none + """ + minTime = struct.unpack('i',bytearray( + message['message'][self.START_POS_MIN_TREAT_TIME:self.END_POS_MIN_TREAT_TIME])) + maxTime = struct.unpack('i',bytearray( + message['message'][self.START_POS_MAX_TREAT_TIME:self.END_POS_MAX_TREAT_TIME])) + minUFVol = struct.unpack('i',bytearray( + message['message'][self.START_POS_MIN_UF_VOL:self.END_POS_MIN_UF_VOL])) + maxUFVol = struct.unpack('i',bytearray( + message['message'][self.START_POS_MAX_UF_VOL:self.END_POS_MAX_UF_VOL])) + minDialRt = struct.unpack('i',bytearray( + message['message'][self.START_POS_MIN_DIAL_RATE:self.END_POS_MIN_DIAL_RATE])) + maxDialRt = struct.unpack('i',bytearray( + message['message'][self.START_POS_MAX_DIAL_RATE:self.END_POS_MAX_DIAL_RATE])) + + self.MinTreatmentDurationMin = minTime[0] + self.MaxTreatmentDurationMin = maxTime[0] + self.MinUFVolumeMl = minUFVol[0] + self.MaxUFVolumeMl = maxUFVol[0] + self.MinDialysateFlowRateMlMin = minDialRt[0] + self.MaxDialysateFlowRateMlMin = maxDialRt[0] + + def handlerTreatmentDurationChangeResponseFunction(self, message): + """ + Handler for response from HD regarding treatment duration change request. + + \param message: response message from HD regarding treatment duration change.\n + BOOL Accepted \n + U32 Reject reason (if not accepted) \n + U32 Treatment duration (min) \n + U32 UF volue (mL) \n + + \returns none + """ + rsp = struct.unpack('i',bytearray( + message['message'][self.START_POS_TIME_CHG_RSP_ACCEPTED:self.END_POS_TIME_CHG_RSP_ACCEPTED])) + rea = struct.unpack('i',bytearray( + message['message'][self.START_POS_TIME_CHG_RSP_REASON:self.END_POS_TIME_CHG_RSP_REASON])) + tim = struct.unpack('i',bytearray( + message['message'][self.START_POS_TIME_CHG_RSP_TIME:self.END_POS_TIME_CHG_RSP_TIME])) + vol = struct.unpack('i',bytearray( + message['message'][self.START_POS_TIME_CHG_RSP_UF_VOL:self.END_POS_TIME_CHG_RSP_UF_VOL])) + + self.DurationChangeSucceeded = rsp[0] + self.DurationChangeRejectReason = rea[0] + self.DurationChangeTimeMin = tim[0] + self.DurationChangeUFVolMl = vol[0] + def handlerBloodAndDialysateChangeResponseFunction(self, message): """ Handler for response from HD regarding blood & dialysate flow rate change request. @@ -353,7 +455,7 @@ resp = True self.BloodAndDialysateFlowRateChangeSucceeded = resp self.BloodAndDialysateFlowRateChangeRejectReason = rea[0] - self.TargetBloodFlowRate = bld[0] / self.LITER_TO_ML_CONVERSION_FACTOR + self.TargetBloodFlowRate = bld[0] self.TargetDialysateFlowRate = dil[0] def handlerUFChangeResponseFunction(self, message): @@ -365,8 +467,8 @@ U32 RejectReason (if not accepted) F32 UF Volume (mL) - converted to Liters \n U32 Treatment Time (min) \n - F32 UF Rate (mL/min) \n S32 Treatment Time Change (min) \n + F32 UF Rate (mL/min) \n F32 UF Rate Change (mL/min) \returns none @@ -379,10 +481,10 @@ message['message'][self.START_POS_UF_CHG_RSP_VOL:self.END_POS_UF_CHG_RSP_VOL])) tim = struct.unpack('i',bytearray( message['message'][self.START_POS_UF_CHG_RSP_TIME:self.END_POS_UF_CHG_RSP_TIME])) - rat = struct.unpack('f', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_RATE:self.END_POS_UF_CHG_RSP_RATE])) tmd = struct.unpack('i',bytearray( message['message'][self.START_POS_UF_CHG_RSP_TIME_DIFF:self.END_POS_UF_CHG_RSP_TIME_DIFF])) + rat = struct.unpack('f', bytearray( + message['message'][self.START_POS_UF_CHG_RSP_RATE:self.END_POS_UF_CHG_RSP_RATE])) rtd = struct.unpack('f', bytearray( message['message'][self.START_POS_UF_CHG_RSP_RATE_DIFF:self.END_POS_UF_CHG_RSP_RATE_DIFF])) @@ -394,8 +496,8 @@ self.UFChangeRejectReason = rea[0] self.UFChangeVolumeL = vol[0] / self.LITER_TO_ML_CONVERSION_FACTOR self.UFChangeTimeMin = tim[0] - self.UFChangeRateMlMin = rat[0] self.UFChangeTimeDiff = tmd[0] + self.UFChangeRateMlMin = rat[0] self.UFChangeRateDifff = rtd[0] def CmdUICheckinWithHD(self): @@ -442,11 +544,35 @@ return 0 - def CmdUIUFSettingsChangeRequest(self, vol=0.0, adj=UF_CMD_CHANGE_TIME_TO_ADJUST): + def CmdUIUFSettingsChangeRequest(self, vol=0.0): """ Constructs and sends a UI UF change settings command message \param vol (float): new ultrafiltration volume setting (in L) + + \returns none + """ + + # reset response to this command so we can tell when response is received + self.UFChangeResponse = None + # build command message + volume = self.outer_instance.float2ByteArray(vol * self.LITER_TO_ML_CONVERSION_FACTOR) + message = DenaliMessage.buildMessage(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=self.MSG_ID_UF_SETTINGS_CHANGE_REQUEST_BY_USER, + payload=volume) + + print("Sending UF settings change request.") + + # Send message + received_message = self.outer_instance.can_interface.send(message, 0) + + return 0 + + def CmdUIUFSettingsChangeConfirm(self, vol=0.0, adj=UF_CMD_CHANGE_TIME_TO_ADJUST): + """ + Constructs and sends a UI UF change settings command message + + \param vol (float): new ultrafiltration volume setting (in L) \param adj (int): 0 for adjust time, 1 for adjust rate \returns none