Index: shared/scripts/configuration/strings.py =================================================================== diff -u -r264a09400a06be340935253b902784cfc5ca29fe -r24823f5bcd89337f1626a648865a83de9095f1e4 --- shared/scripts/configuration/strings.py (.../strings.py) (revision 264a09400a06be340935253b902784cfc5ca29fe) +++ shared/scripts/configuration/strings.py (.../strings.py) (revision 24823f5bcd89337f1626a648865a83de9095f1e4) @@ -1,4 +1,6 @@ +# -*- coding: utf-8 -*- + ########################################################################### # # Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. @@ -8,16 +10,701 @@ # # @file strings.py # -# @author (last) LTTS -# @date (last) 18-Jan-2022 -# +# @author (last) LTTS +# @date (last) 14-June-2022 ############################################################################ BLOOD_PRIMING_TEXT = "Blood Priming" SALINE_UNIT = "mL" BLOOD_PRIMING_UNIT = "mL" BLOOD_PRIMING_VALUE_0 = "0" BLOOD_PRIMING_DEFAULT_VALUE = BLOOD_PRIMING_VALUE_0 + " " + BLOOD_PRIMING_UNIT -#ui_logs + +#pretreatment_screen_bullets +PRE_TREATMENT_SCREENS = ["Create" , "Sample" , "Consumables" , "Disposables" , "Prime" , "Ultrafiltration" , "BP/HR" , "Connection" , "Start"] +POST_TREATMENT_SCREENS = ["Disconnection", "Review", "Disposables", "Disinfection"] + + +SALINE_UNIT = "mL" +BLOOD_PRIMING_UNIT = "mL" +BLOOD_PRIMING_VALUE_0 = "0" +BLOOD_PRIMING_DEFAULT_VALUE = BLOOD_PRIMING_VALUE_0 + " " + BLOOD_PRIMING_UNIT + +#main_treatment_ultrafilteration +ULTRAFILTRATION_PAUSED_TEXT = "Ultrafiltration Paused" +INCREASE_UF_RATE_TEXT = "Increase UF Rate" +INCREASE_TREATMENT_DURATION_TEXT = "Increase Treatment Duration" +RESUME_TEXT = "RESUME ULTRAFILTRATION" +EDIT_TEXT = "EDIT ULTRAFILTRATION VOLUME" +TITLE_TEXT = "ULTRAFILTRATION VOLUME (L)" + +#recirculate screens +RECIRCULATE_TEXT = "Recirculate" +RECONNECT_BUTTON_TEXT = "RECONNECT" +# pretreatment_patient_connection +DIASTOLIC_TEXT = "diastolic" +SYSTOLIC_TEXT = "systolic" +OUT_OF_RANGE_COLOR = "#c53b33" +IN_RANGE_COLOR = "#fcfcfc" +HEART_RATE_TITLE = "Heart Rate" +BLOOD_PRESSURE_TITLE = "Blood Pressure" +BLOOD_PRESSURE_UNIT = "mmHg" +HEART_RATE_UNIT = "BPM" +PATIENT_CONNECTION_TEXT = "Patient Connection" +UF_VOLUME_TEXT = "Ultrafiltration Volume (L)" +UF_TITLE_TEXT = "Ultrafiltration Setup" +BP_HR_TEXT = "BP/HR" +SKIP_TEXT = "SKIP" +TUTORIAL_TEXT = { + 0 : "Wash your hands and establish vascular access per your clinic's instructions.", + 1 : "Pinch arterial clamp and venous clamp on located on the cartridge patient lines.", + 2 : "Remove arterial and venous line connector.", + 3 : "Connect arterial and venous cartridge lines to your patient access lines." +} + +#rinseback-setup +RINSE_BACK_SETUP_TEXT = "Rinseback Setup" +RINSEBACK_BUTTON_TEXT = "START RINSEBACK" +BACK_TO_TREATMENT_BUTTON_TEXT = "BACK TO TREATMENT" +END_IMAGE_BUTTON_TEXT = "End" +DECELERATE_BUTTON_TEXT = "Decelerate" +ACCELERATE_BUTTON_TEXT = "Accelerate" +PAUSE_BUTTON_TEXT = "Pause" +RESUME_BUTTON_TEXT = "Resume" +RINSEBACK_TEXT = "Rinseback" +RINSEBACK_COMPLETE_TEXT = "Rinseback Complete" +END_TREATMENT_BUTTON_TEXT = "END TREATMENT" +BACK_TO_RECIRCULATE_TEXT = "BACK TO RECIRCULATE" +RECONNECT_TEXT = "Reconnect" + +#Blood Priming +BLOOD_PRIMING_TEXT = "Blood Priming" + +#tst_treatment_saline_data +SALINE_UNIT = "mL" ACK_REQ_STATUS = 'Ack Req' -ACK_BAK_STATUS = 'Ack Bak' \ No newline at end of file +ACK_BAK_STATUS = 'Ack Bak' + +#main treatment pressure +PRESSURE_TITLE = "PRESSURES" +ARTERIAL_TITLE = "Arterial" +VENOUS_TITLE = "Venous" +VENOUS_UOM = "mmHg" +ARTERIAL_UOM = "mmHg" +LOW_TEXT = "LOW" +HIGH_TEXT = "HIGH" + +#main-treatment heparin +HEPARIN_TEXT = "HEPARIN" +HEPARIN_UNIT = "mL" +HEPARIN_DELIVERY_TEXT = "HEPARIN DELIVERY" +HEPARIN_DELIVERY_OFF_TEXT = "OFF" +HEPARIN_STOP_TEXT = "Delivery Stopped" +HEPARIN_RESUME_DELIVERY_TEXT = "RESUME DELIVERY" +HEPARIN_BOLUS_ACTIVE_TEXT = "Bolus Active" +HEPARIN_BOLUS_DISPENSING_TEXT = "Dispensing Active" +HEPARIN_PAUSE_DELIVERY_TEXT = "PAUSE DELIVERY" +HEPARIN_MAXIMUM_VOLUME_DELIVERED_TEXT = "Maximum Cumulative Heparin Volume Delivered" +HEPARIN_SYRINGE_EMPTY_TEXT = "Syringe Empty" +HEPARIN_DISPENSING_RATE = "Heparin Dispensing Rate" +HEPARIN_BOLUS_VOLUME = "Heparin Bolus Volume" +HEPARIN_STOP_TIME = "Heparin Stop Time" +HEPARIN_TYPE_TITLE = "Heparin Type" + +# dictionary of rejection reason from application source code. +# message location -> denali-> Headers-> common-> MsgDefs.h +REJECTION_REASON = { + 0: "REQUEST_REJECT_REASON_NONE", # Used when there is no rejection + 1: "REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE", # Request is not allowed in the current operating mode + 2: "REQUEST_REJECT_REASON_TIMEOUT_WAITING_FOR_USER_CONFIRM", # Validated request was not confirmed by user in reasonable time + 3: "REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE", # Request is not allowed if not in treatment mode + 4: "REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE", # Request is not allowed in current treatment state + 5: "REQUEST_REJECT_REASON_TREATMENT_TOO_CLOSE_TO_FINISHED", # Request is not allowed so near end of treatment + 6: "REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE", # Treatment duration is out of range + 7: "REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT", # Treatment time change is less than currently elapsed treatment time + 8: "REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE", # Blood flow is out of range + 9: "REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE", # Dialysate flow is out of range + 10: "REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE", # Dialysate flow rate or treatment duration causes dialysate volume to exceed limit + 11: "REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE", # Ultrafiltration volume is out of range + 12: "REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE", # Ultrafiltration rate is out of range + 13: "REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_MINIMUM", # Treatment time change is less than minimum treatment time + 14: "REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS", # Ultrafiltration is not currently in progress + 15: "REQUEST_REJECT_REASON_UF_NOT_PAUSED", # Ultrafiltration is not currently paused + 16: "REQUEST_REJECT_REASON_SALINE_BOLUS_IN_PROGRESS", # A saline bolus is in progress + 17: "REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE", # A treatment parameter is out of range + 18: "REQUEST_REJECT_REASON_HEPARIN_PRESTOP_EXCEEDS_DURATION", # The Heparin pre-stop setting is greater than the treatment duration + 19: "REQUEST_REJECT_REASON_ARTERIAL_PRESSURE_LOW_VS_HIGH", # Arterial pressure low and high alarm limits are not inconsistent + 20: "REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH", # Venous pressure low and high alarm limits are inconsistent + 21: "REQUEST_REJECT_REASON_SALINE_MAX_VOLUME_REACHED", # Saline bolus volume maximum has been reached - no more saline allowed + 22: "REQUEST_REJECT_REASON_SALINE_BOLUS_NOT_IN_PROGRESS", # A saline bolus is not in progress + 23: "REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE", # Requested user action is disabled in current state + 24: "REQUEST_REJECT_REASON_ALARM_IS_ACTIVE", # Requested user action not allowed while alarm is active + 25: "REQUEST_REJECT_REASON_INVALID_COMMAND", # Requested user action invalid + 26: "REQUEST_REJECT_REASON_TREATMENT_IS_COMPLETED", # The treatment has been completed + 27: "REQUEST_REJECT_REASON_ADDL_RINSEBACK_MAX_VOLUME_REACHED", # Rinseback additional volume maximum has been reached - no more additional rinsebacks allowed + 28: "REQUEST_REJECT_REASON_UF_VOLUME_NOT_SET", # Ultrafiltration volume is not set yet + 29: "REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM", # The user has not confirmed patient connection + 30: "REQUEST_REJECT_REASON_HEPARIN_PAUSE_INVALID_IN_THIS_STATE", # Heparin cannot be paused if not currently deliverying Heparin + 31: "REQUEST_REJECT_REASON_HEPARIN_NOT_PAUSED", # Heparin cannot be resumed if not paused + 32: "REQUEST_REJECT_REASON_DG_COMM_LOST", # Treatment cannot initiate if DG comm is lost + 33: "REQUEST_REJECT_REASON_DRAIN_NOT_COMPLETE", # Post-treatment reservoirs drain not complete + 34: "REQUEST_REJECT_REASON_DG_NOT_IN_STANDBY_IDLE_STATE", # Treatment cannot initiate if DG is not in standby idle state + 35: "REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT", # Request message not formatted properly + 36: "REQUEST_REJECT_REASON_INVALID_DATE_OR_TIME", # Given date/time is invalid + 37: "REQUEST_REJECT_REASON_TREATMENT_IN_PROGRESS", # Treatment is in progress + 38: "REQUEST_REJECT_REASON_BATTERY_IS_NOT_CHARGED", # Battery does not have enough charge to start treatment + 39: "REQUEST_REJECT_REASON_RINSEBACK_NOT_COMPLETED", # Cannot move on to recirculate without completing full rinseback. + 40: "REQUEST_REJECT_REASON_RESERVOIR_ONE_IS_NOT_READY", # Reservoir one fill is not complete + 41: "REQUEST_REJECT_REASON_PUMP_TRACK_NOT_CLOSED", # Pump track is not ready / closed + 42: "REQUEST_REJECT_REASON_DOOR_NOT_CLOSED", # Door is not closed + 43: "REQUEST_REJECT_REASON_SYRINGE_NOT_PRESENT", # Syringe is not present + 44: "REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN", # Dialysate cap open + 45: "REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN", # Concentrate cap open + 46: "NUM_OF_REQUEST_REJECT_REASONS" # Number of settings change reject codes +} + +#Alarm List +UNDEFINED_ALARM_ID_MSG = "ALARM_ID_UNDEFINED" +ALARM_TITLE = "Alarm" +ALARM_LIST_TITLE = "Alarm list" +ALARM_PRIORITIES = {1: "LOW", 2: "MEDIUM", 3: "HIGH"} + +ALARM_PRIORITY_OPTIONS = { + 0 : 'ALARM_PRIORITY_NONE' , + 1 : 'ALARM_PRIORITY_LOW' , + 2 : 'ALARM_PRIORITY_MEDIUM', + 3 : 'ALARM_PRIORITY_HIGH', +} + +#Setting +DEVICE_SETTINGS_TEXT = "Device Settings" +DEVICE_SETTINGS_SCREEN_PARAMETER = ["Information", "Volume And Brightness", "Wi-Fi", "Bluetooth Cuff", "DG Cleaning", "Service", "Export Logs"] +SettingsHome_Treatment_Text = "Treatment" +SettingsHome_Manager_Text = "Manager" +SettingsHome_Settings_Text = "Settings" + +#create custom treatment +TREATMENT_TITLE = "Create a Custom Treatment" +CONFIRM_TREATMENT_TITLE = "Confirm Treatment" +PRESCRIPTION_TITLE = "PRESCRIPTION" +OPERATING_PARAMETERS_TITLE = "OPERATING PARAMETERS" +PATIENT_ID_TEXT = "Patient ID" +BLOOD_FLOW_RATE = "Blood Flow Rate" +DIALYSATE_FLOW_RATE = "Dialysate Flow Rate" +DURATION = "Duration" +SALINE_BOLUS_VOLUME = "Saline Bolus Volume" + +#main treatment screen +VITALS_TITLE = "VITALS" + + +PATIENT_ID = "demopatientid" +SALINE_BOLUS_TITLE = "Saline Bolus" +ACID_CONCENTRATE_TITLE = "Acid Concentrate" +BICARBONATE_CONCENTRATE_TITLE = "Bicarbonate Concentrate" +DIALYZER_TYPE_TITLE = "Dialyzer Type" +DIALYSATE_TEMPERATURE = "Dialysate Temperature" +BLOOD_PRESSURE_MEASUREMENT_INTERVAL = "Blood Pressure Measurement Interval" +RINSEBACK_FLOW_RATE = "Rinseback Flow Rate" + + +CREATE_TREATMENT_PARAMETERS = ["Blood Flow Rate", "Dialysate Flow Rate", "Duration","Heparin Dispensing Rate", + "Heparin Bolus Volume","Heparin Stop Time", "Saline Bolus", "Dialysate Temperature", + "Blood Pressure Measurement Interval", "Rinseback Flow Rate"] + +OFF_TEXT = "OFF" +CONTINUE_TEXT = "CONTINUE" + +PRESCRIPTION_DETAILS = { + "Blood Flow Rate": "mL/min", "Dialysate Flow Rate": "mL/min", + "Duration": "min", "Heparin Dispensing Rate": "mL/hr", + "Heparin Bolus Volume": "mL", "Heparin Stop Time": "min", + "Saline Bolus Volume": "mL", + "Dialysate Temperature": "°C", "Arterial Pressure Limit Low": "mmHg", + "Arterial Pressure Limit High": "mmHg","Blood Pressure Measure Interval":"min", + "Rinseback Rate" : "mL/min", "Venous Pressure Limit High": "mmHg", + "Venous Pressure Limit Low": "mmHg" +} + +#Time_Duration +TREATMENT_PAUSED_TEXT = "Treatment Paused" + +#pre-treatment +CONSUMABLE_SELF_TEST_TEXT = "Consumables Self Test" +BICARB_PUMP_CHECK_TEXT = "BiCarb Pump Check" +ACID_PUMP_CHECK_TEXT = "Acid Pump Check" +SELF_TEST_COMPLETE_TEXT = "Self Test Complete!" +BUSY = "Busy" +CHECK = "Check" +BEGIN_PRIME_TITLE = "Begin Prime" +PRIMING_TITLE = "Priming" +SYSTEM_SELF_TEST_TITLE = "System Self Test" +FILTER_FLUSH_TITLE = "Filter Flush" + +#Pre-Treatment Disposables +NEXT_BUTTON_TEXT = "NEXT" +BACK_BUTTON_TEXT = "BACK" +CONFIRM_BUTTON_TEXT = "CONFIRM" + +#Pre_treatment_water_sample +SAMPLE_TEXT = "Sample" +CREATE_TEXT = "Create" +WATER_SAMPLE_BUTTON_TEXT = "WATER SAMPLE" +PASS_TEXT = "PASS" +FAIL_TEXT = "FAIL" +OK_TEXT = "OK" + +#Vitals & pretreatment_patient_connection +SYSTOLIC_TEXT = "systolic" +DIASTOLIC_TEXT = "diastolic" + +#priming +TEST_DRY_STEPS = ["Used Cartridge Check", "Occlusion Sensors Check", "Pressure Sensors Check", "Syringe Pump Check"] +PRIMING_STEPS = ["Blood Circuit Priming", "Dialysate Circuit Priming", "Wet Self Tests"] +SELF_TEST_COMPLETION_MSG = "Self Test Complete!" +PRIMING_COMPLETE_MSG = "Priming Complete!" + +#main_treatment_flows +FLOW_UNIT = "mL/min" +BLOOD_FLOW_TEXT = "blood" +DIALYSATE_FLOW_TEXT = "dialysate" + +LIQUID_UNIT = "mL" + +#tst_treatment_monitoring +FLOWS_TEXT = "FLOWS" +BLOOD_UNIT = "mL/min" +DIALYSATE_TEXT = "Dialysate" +BLOOD_TEXT = "Blood" +VITALS_TEXT = "VITALS" +BLOOD_PRESSURE_TEXT = "mmHg" +HEARTRATE_UNIT = "BPM" +PRESSURE_TEXT = "PRESSURE (mmHg)" +ARTEREAL_TEXT = "Arterial" +VENOUS_TEXT = "Venous" +TIME_DURATION_TEXT = "Time Remaining" +ULTRAFILTERATION_TEXT = "ULTRAFILTRATION VOLUME (L)" +SALINE_BOLUS = "SALINE BOLUS" +VOLUME_DELIVERED = "Volume Delivered" +CUMULATIVE_DELIVERED = "Cumulative Delivered" + +#post-treatment +PATIENT_DISCONNECTION_TEXT = "Patient Disconnection" +REVIEW_TEXT = "Review" +PATIENT_DISCONNECTION_CONFIRM_BUTTON_TEXT = "CONFIRM" +DISPOSABLE_TEXT = "Disposables" +NEXT_TEXT = "NEXT" +BACK_TEXT = "BACK" +CONFIRM_TEXT = "CONFIRM" +DISPOSABLES_REMOVAL_TEXT = "Disposables Removal" + +#post treatment review +TREATMENT_REVIEW_TITLE_TEXT = "Treatment Review" +POST_TREATMENT_REVIEW_SCREEN_UNITS = { + "Patient ID" : "", + "Heparin Stop" : "min", + "Device ID" : "", + "Heparin Delivered Volume": "mL", + "Blood Flow Rate" : "mL/min", + "Treatment Start DateTime" : "", + "Dialysate Flow Rate" : "mL/min", + "Treatment End DateTime" : "", + "Treatment Duration" : "min", + "Water Sample Test Result": "", + "Actual Treatment Duration":"min", + "Dialysate Volume Used" : "L", + "Acid ConcentrateType" : "", + "Prescribed UF Volume" : "L", + "Bicarbonate Concentrate Type" : "", + "Target UF Volume" : "L", + "Potassium Concentration" : "mEg/L", + "Actual UF Volume" : "L", + "Calcium Concentration" :"mEg/L", + "Prescribed UF Rate" : "mL/min", + "Bicarbonate Concentration" : "mEg/L", + "Target UF Rate": "mL/min", + "Sodium Concentration" : "mEg/L", + "Actual UF Rate": "mL/min", + "Dialysate Temperature" :"°C", + "Saline Bolus Volume" : "mL", + "Dialyzer Type" : "", + "Average Blood Flow" : "mL/min", + "Heparin Type" : "IU/mL", + "Average Dialysate Flow" : "mL/min", + "Heparin Concentration" : "IU/mL", + "Average Dialysate Temp" : "°C", + "Heparin Bolus Volume": "mL", + "Average Arterial Pressure" : "mmHg", + "Heparin Dispense Rate" : "mL/hr", + "Average Venous Pressure" : "mmHg", + } + +#Information +INFORMATION_TITLES = ["Information", "Versions"] +INFORMATION_PARAMETERS = ["Information", "UI Version", "HD Version", "HD FPGA Version", "HD Serial Number", "DG Version", "DG FPGA Version", "DG Serial Number"] +SERIVCES_TITLE = "Service" +SERVICES_PARAMETERS = ["HD Last Service Date", "HD Next Service Date", "DG Last Service Date", "DG Next Service Date"] + + +#volume and brightness +VOLUME_AND_BRIGHTNESS_TEXT = "Volume And Brightness" +BRIGHTNESS_TEXT = "Brightness" +ALARM_VOLUME_TEXT = "Alarm Volume" +UNIT_OF_VOLUME_AND_BRIGHTNESS = "%" + +#services +SHUTDOWN_TEXT = "SHUTDOWN" + +# pretreatment_patient_connection & ui logs +ACK_REQ_STATUS = 'Ack Req' +ACK_BAK_STATUS = 'Ack Bak' +PATIENT_CONNECTION_TEXT = "Patient Connection" +UF_VOLUME_TEXT = "Ultrafiltration Volume (L)" +UF_TITLE_TEXT = "Ultrafiltration Setup" +BP_HR_TEXT = "BP/HR" +SKIP_TEXT = "SKIP" +TUTORIAL_TEXT = { + 0 : "Wash your hands and establish vascular access per your clinic's instructions.", + 1 : "Pinch arterial clamp and venous clamp on located on the cartridge patient lines.", + 2 : "Remove arterial and venous shunt.", + 3 : "Connect arterial and venous cartridge lines to your patient access lines." +} + +#End treatment +RINSEBACK_BUTTON_TEXT = "START RINSEBACK" +END_TREATMENT_COMPLETE_STATE_TEXT = "Treatment Complete" +END_TREATMENT_COMPLETE_PAUSED_STATE_TEXT = "Treatment Complete Paused" + +#rinseback-setup +RINSE_BACK_SETUP_TEXT = "Rinseback Setup" +RINSEBACK_BUTTON_TEXT = "START RINSEBACK" +END_IMAGE_BUTTON_TEXT = "End" +DECELERATE_BUTTON_TEXT = "Decelerate" +ACCELERATE_BUTTON_TEXT = "Accelerate" +PAUSE_BUTTON_TEXT = "Pause" +RESUME_BUTTON_TEXT = "Resume" +RINSEBACK_TEXT = "Rinseback" +RINSEBACK_COMPLETE_TEXT = "Rinseback Complete" +END_TREATMENT_BUTTON_TEXT = "END TREATMENT" +ADDITIONAL_BUTTON_TEXT = "ADDITIONAL" +ADDITIONAL_RINSEBACK_TEXT = "Additional Rinseback" +RINSEBACK_UNIT = " mL" +RINSEBACK_UNIT_MIN = " mL/min" + +ALARM_ID_AND_MESSAGES = { + 1: "Stuck button POST failure.\nStop or Off button detected to be pressed for at least 1 second during test shortly after power up.", + 2: "HD FPGA POST failure.", + 3: "DG FPGA POST failure.", + 4: "HD Watchdog POST failure.", + 5: "DG Watchdog POST failure.", + 6: "UI communication POST failure.\nUI failed to communicate within a reasonable time after power up.", + 7: "Real-time clock configuration error.", + 8: "HD accelerometer failed POST.", + 9: "DG accelerometer failed POST." , + 10: "RTC or MCU timer inaccurate.", + 11: "DG heaters failed POST.", + 12: "HD firmware image integrity POST test failed.", + 13: "DG firmware image integrity POST test failed.", + 14: "HD blood flow invalid calibration.", + 15: "HD dialysate flow invalid calibration.", + 16: "HD alarm audio failed POST.", + 17: "HD UI POST failed.", + 18: "DG load cells invalid calibration record.", + 19: "DG flow sensors invalid calibration record.", + 20: "DG conductivity sensors invalid calibration record.", + 21: "DG drain line volume invalid calibration record.", + 22: "DG reservoirs invalid calibration record.", + 23: "DG acid concentrate calibration record.", + 24: "DG bicarb concentrate calibration record.", + 25: "DG accelerometer invalid calibration record.", + 26: "HD accelerometer invalid calibration record.", + 27: "HD blood flow invalid calibration record.", + 28: "HD dialyzer flow invalid calibration record.", + 29: "HD heparin force sensor invalid calibration record.", + 30: "HD Software fault.\nSoftware found itself in an unexpected state.", + 31: "Blood pump failed motor controller current check.\nToo high when pump should be off or out of range when pump should be running.", + 32: "Blood pump failed motor off check.\nMeasured speed while commanded off.", + 33: "Blood pump failed motor direction check.\nMeasured vs commanded.", + 34: "Blood pump failed rotor speed check.\nMismatch with rotor and motor speeds.", + 35: "Dialysis inlet pump failed motor controller current check.\nToo high when pump should be off or out of range when pump should be running.", + 36: "Dialysis inlet pump failed motor off check.\nMeasured speed while commanded off.", + 37: "Dialysis inlet pump failed motor direction check.\nMeasured vs commanded.", + 38: "Dialysis inlet pump failed rotor speed check.\nMismatch with rotor and motor speeds.", + 39: "Dialysis outlet pump failed motor controller current check.\nToo high when pump should be off or out of range when pump should be running.", + 40: "Dialysis outlet pump failed motor off check.\nMeasured speed while commanded off.", + 41: "Dialysis outlet pump failed motor direction check.\nMeasured vs commanded.", + 42: "Dialysis outlet pump failed rotor speed check.\nMismatch with rotor and motor speeds.", + 43: "Watchdog expired error.\nWatchdog was not \"pet\" within the appropriate time.", + 44: "User interface communication timeout.", + 45: "Too many bad CRCs detected on received system messages.", + 46: "System message that required acknowledgment was not acknowledged.", + 47: "Ultrafiltration rate is too high error during treatment.", + 48: "Ultrafiltration volume accuracy error during treatment.", + 49: "HD FPGA communication down for too long.", + 50: "FPGA not accepting commanded valve states.", + 51: "Blood pump failed motor speed check.\nMeasured vs commanded.", + 52: "Dialysate inlet pump failed motor speed check.\nMeasured vs commanded.", + 53: "Dialysate outlet pump failed motor speed check.\nMeasured vs commanded.", + 54: "HD critical data integrity check failed.", + 55: "DG critical data integrity check failed.", + 56: "HD accelerometer error (no readings or FPGA reports error).", + 57: "DG accelerometer error (no readings or FPGA reports error).", + 58: "HD valve homing failed.", + 59: "HD valve transition time out.", + 60: "HD valve not functional.", + 61: "HD valve current out of range.", + 62: "HD valve position out of target.", + 63: "FPGA reports failure reading arterial pressure sensor.", + 64: "FPGA reports failure reading venous pressure sensor.", + 65: "HD requests DG command with invalid parameter fault.", + 66: "HD blood leak sensor set point set failure.", + 67: "HD blood pump occlusion self-test failure alarm.", + 68: "HD active reservoir recirculation out of range.", + 69: "HD blood leak sensor invalid calibration record.", + 70: "HD arterial pressure self-test failure alarm." , + 71: "HD venous pressure self-test failure alarm.", + 72: "HD blood flow meter status check self-test failure alarm.", + 73: "HD dialysate flow meter status check self-test failure alarm.", + 74: "HD blood leak detector self-test failure alarm.", + 75: "HD syringe pump self-test failure alarm.", + 76: "HD monitored voltage is out of range.", + 77: "DG monitored voltage is out of range.", + 78: "HD syringe pump direction (from encoder) error.", + 79: "HD syringe pump direction (from controller) error.", + 80: "HD syringe pump fault reported by FPGA.", + 81: "HD syringe pump over travel error.", + 82: "HD syringe pump DAC write failure.", + 83: "HD syringe pump is running while the BP is off.", + 84: "HD venous pressure sensor not being read.", + 85: "HD pump track latch opened alarm.", + 86: "HD BP occlusion sensor not being read.", + 87: "DG heating invalid calibration record.", + 88: "DG concentrate pumps hall sensor out of range.", + 89: "HD BP occlusion sensor error.", + 90: "This alarm ID is available for use.", + 91: "HD No dialysate flow data receive in the last 3 seconds.", + 92: "DG conductivity sensor bad status.", + 93: "This alarm ID is available for use.", + 94: "This alarm ID is available for use.", + 95: "This alarm ID is available for use.", + 96: "Inlet water temperature in high range.", + 97: "Fill conductivity out of range.", + 98: "HD battery communication fault.", + 99: "HD syringe pump stall alarm.", + 100: "HD no cartridge self-test timeout.", + 101: "HD dry self-test timeout.", + 102: "Real-time clock communication error.", + 103: "HD non-volatile calibration group invalid record CRC.", + 104: "Air trap level sensors reporting illegal combination of air/fluid.", + 105: "DG non-volatile system group invalid record CRC.", + 106: "DG inlet water conductivity is greater than threshold.", + 107: "HD reports DG restarted fault.", + 108: "HD syringe pump ADC error.", + 109: "HD syringe pump volume check error.", + 110: "HD syringe pump speed check error.", + 111: "HD syringe pump not stopped in off state error.", + 112: "HD blood leak detector fault.", + 113: "HD arterial air bubble detector self-test failure.", + 114: "HD venous air bubble detector self-test failure.", + 115: "DG temperature sensor out of range.", + 116: "DG temperature sensor ADC out of range.", + 117: "DG primary heater internal temperature out of range.", + 118: "DG primary heater cold junction temperature out of range.", + 119: "DG trimmer heater internal temperature out of range.", + 120: "DG trimmer heater cold junction temperature out of range.", + 121: "DG main primary heater voltage out of range.", + 122: "DG small primary heater voltage out of range.", + 123: "DG trimmer heater voltage out of range.", + 124: "HD end of treatment alarm (high priority).", + 125: "Blood sitting too long after treatment stopped by user alarm (>5 min).", + 126: "HD blood leak detected alarm.", + 127: "Venous pressure too low during treatment." , + 128: "HD venous air bubble detected alarm.", + 129: "HD venous air bubble detected rinseback alarm.", + 130: "Venous pressure too high during treatment.", + 131: "Arterial pressure too low during treatment.", + 132: "Arterial pressure too high during treatment.", + 133: "DG fluid leak detected alarm.", + 134: "HD fluid leak detected alarm." , + 135: "HD experienced large acceleration.", + 136: "DG experienced large acceleration.", + 137: "HD tilt exceeds maximum.", + 138: "DG tilt exceeds maximum.", + 139: "HD AC power lost alarm.", + 140: "Dialysate generator communication timeout.", + 141: "Air trap fill timeout during treatment.", + 142: "Blood pump occlusion detected.", + 143: "DG dialysate temperature sensors drift timeout.", + 144: "DG software configuration record invalid CRC.", + 145: "Concentrate conductivity after adding acid out of range alarm.", + 146: "Dialysate conductivity out of range.", + 147: "Wait for the DG to produce dialysate.", + 148: "Inlet water temperature too high.", + 149: "Alarm ID available for use.", + 150: "Inlet water conductivity in high range.", + 151: "Inlet water conductivity in low range.", + 152: "Inlet water pressure in low range.", + 153: "HD prime completed high priority alarm.", + 154: "EEPROM operations (read, write, erase) failure.", + 155: "DG software configuration record invalid CRC.", + 156: "HW usage data (treatment time in HD and total consumed water in DG) failure.", + 157: "DG chemical disinfect prime acid line timeout.", + 158: "Inlet water temperature is in the low range.", + 159: "Dialysate inlet pump failed flow vs motor speed check.", + 160: "Blood pump rotor speed too high.", + 161: "This alarm ID is available for use.", + 162: "This alarm ID is available for use.", + 163: "HD sees primary load cell for reservoir 1 change too much too fast.", + 164: "HD sees primary load cell for reservoir 2 change too much too fast.", + 165: "HD in treatment rinseback operation timeout.", + 166: "HD in treatment re-circ sub-mode for too long.", + 167: "HD cartridge door opened alarm.", + 168: "HD active reservoir depletion timeout.", + 169: "Dialysate flow rate out of range.", + 170: "HD syringe empty alarm.", + 171: "HD syringe pump occlusion alarm.", + 172: "HD syringe pump not enough Heparin alarm.", + 173: "HD arterial air bubble detected alarm.", + 174: "HD arterial air bubble detected rinseback alarm.", + 175: "HD pump direction status error.", + 176: "HD active reservoir is full during treatment and DG not ready to switch reservoirs.", + 177: "DG software fault.\nSoftware found itself in an unexpected state.", + 178: "HD communication timeout.", + 179: "DG FPGA communication down for too long.", + 180: "DG load cell ADC error.", + 181: "DG load cells weight out of range for tare.", + 182: "DG load cells invalid calibration.", + 183: "DG invalid load cell value.", + 184: "Inlet or Outlet UV reactor not healthy.", + 185: "DG fan RPM out of range.", + 186: "DG concentrate pump fault.", + 187: "DG concentrate pump CP1 speed control error.", + 188: "DG concentrate pump CP2 speed control error.", + 189: "DG drain pump RPM out of range.", + 190: "DG drain pump off fault.", + 191: "DG flow rate out of upper range.", + 192: "DG flow rate out of lower range.", + 193: "RO pump flow rate out of range.", + 194: "DG RO pump duty cycle out of range.", + 195: "DG RO pump pressure out of range.", + 196: "DG temperature sensor error flag fault.", + 197: "DG temperature sensors ADC fault.", + 198: "DG heaters cold junction temperature out of range.", + 199: "DG heaters fault.", + 200: "DG thermistors/sensors temperature out of range.", + 201: "Inlet water quality is bad (temperature, conductivity, pressure).", + 202: "Inlet water pressure fault.", + 203: "Pressure sensor fault.", + 204: "RO rejection ratio out of range.", + 205: "Conductivity sensor fault.", + 206: "DG dialysate fill runs out of time.", + 207: "DG flow meter check failure alarm.", + 208: "DG primary heater on with no flow time out.", + 209: "DG drain circulation line timeout.", + 210: "HD battery pack detected an error.", + 211: "Blood sitting too long warning (>4 min).", + 212: "HD end of treatment alarm (user not acting to end treatment).", + 213: "HD prime completed medium priority alarm.", + 214: "HD Saline bolus volume check failure.", + 215: "HD rinseback volume check failure.", + 216: "HD end treatment sub-mode timeout alarm.", + 217: "HD blood prime volume check failure.", + 218: "HD syringe detected alarm.", + 219: "HD syringe pump syringe removed alarm.", + 220: "HD battery pack SOC is too low.", + 221: "HD Saline bag is empty.", + 222: "HD dialysate temperature too high alarm.", + 223: "HD dialysate temperature too low alarm.", + 224: "Treatment stopped by user action.", + 225: "HD end of treatment warning.", + 226: "HD prime completed low priority alarm.", + 227: "HD prime out of time alarm.", + 228: "HD time out on prime sub-mode purge air state.", + 229: "HD prime dialysate dialyzer time out alarm.", + 230: "HD prime dialysate bypass time out alarm.", + 231: "HD pre-treatment mode dry self-tests failure.", + 232: "HD pre-treatment mode wet self-tests failure.", + 233: "RTC battery low.", + 234: "RTC (i.e read time) or RAM operations failure (read or write).", + 235: "HD in treatment stopped sub-mode after rinseback completed (no escalation).", + 236: "HD needs new cartridge to be installed.", + 237: "HD prime saline dialyzer time out alarm.", + 238: "HD no cartridge loaded or installed improperly alarm.", + 239: "HD fail to remove cartridge alarm.", + 240: "Bicarb conductivity out of range during bicarb pump check alarm.", + 241: "DG reservoir drain time out.", + 242: "DG reservoir fill time out.", + 243: "DG reservoir leak time out.", + 244: "DG temperature sensors difference out of range.", + 245: "DG heat disinfect target temperature time out (could not reach to temperature).", + 246: "DG heat disinfect inlet pressure and temperature sensors out of range.", + 247: "DG heat disinfect inlet conductivity and temperature out of range.", + 248: "DG chemical disinfect could not reach to target temperature.", + 249: "DG chemical disinfect inlet pressure and temperature sensors out of range.", + 250: "DG chemical disinfect inlet conductivity and temperature out of range.", + 251: "HD invalid system record.", + 252: "HD invalid service record.", + 253: "DG invalid system record.", + 254: "DG invalid service record.", + 255: "HD and UI software builds are not compatible.", + 256: "HD and DG software builds are not compatible.", + 257: "DG FPGA power out timeout.", + 258: "HD FPGA power out timeout.", + 259: "HD temperatures out of range.", + 260: "UI POST Application Integrity (Sha256Sum) failure.", + 261: "UI POST CANBus failure.", + 262: "UI POST Display failure.", + 263: "UI POST Touch failure.", + 264: "UI POST SD-Card failure.", + 265: "UI POST RTC failure.", + 266: "UI POST WiFi failure.", + 267: "UI POST Bluetooth failure.", + 268: "UI POST Ethernet failure.", + 269: "UI POST Sound failure.", + 270: "HD POST Safety Shutdown failure.", + 271: "DG POST Safety Shutdown failure.", + 272: "HD Fan RPM out of range.", + 273: "HD measured blood pump flow rate is out of range.", + 274: "HD measured dialysate inlet pump flow rate is out of range.", + 275: "HD arterial pressure sensor is reading out of range.", + 276: "HD venous pressure sensor is reading out of range.", + 277: "HD BP occlusion sensor is reading out of range.", + 278: "HD active reservoir weight out of range.", + 279: "DG dialysate drain time out.", + 280: "HD arterial pressure sensor read timeout error.", + 281: "Acid concentration bottle low volume alarm.", + 282: "Bicarbonate concentration bottle low volume alarm.", + 283: "DG load cells weight out of range.", + 284: "DG load cells primary/back up drift out of range.", + 285: "HD treatment recirculate timeout warning.", + 286: "HD treatment rinseback complete timeout warning.", + 287: "HD processor clock speed checks against FPGA clock failure.", + 288: "DG trimmer heater on with flow timeout.", + 289: "DG dialysate or concentrate caps not closed." + } + +ALARM_PRIORITIES = {1: "LOW", 2: "MEDIUM", 3: "HIGH"} +ALARM_LIST_TITLE = "Alarm list" +UNDEFINED_ALARM_ID_MSG = "ALARM_ID_UNDEFINED" +ALARM_TITLE = "Alarm" + +ALARM_PRIORITY_OPTIONS = { + 0 : 'ALARM_PRIORITY_NONE' , + 1 : 'ALARM_PRIORITY_LOW' , + 2 : 'ALARM_PRIORITY_MEDIUM', + 3 : 'ALARM_PRIORITY_HIGH', +} + + +PRESSURE_TITLE = "PRESSURES" +ARTERIAL_TITLE = "Arterial" +VENOUS_TITLE = "Venous" +VENOUS_UOM = "mmHg" +ARTERIAL_UOM = "mmHg" +LOW_TEXT = "LOW" +HIGH_TEXT = "HIGH" + +FLOW_UNIT = "mL/min" +BLOOD_FLOW_TEXT = "blood" +DIALYSATE_FLOW_TEXT = "dialysate" + Index: shared/scripts/configuration/utility.py =================================================================== diff -u -r264a09400a06be340935253b902784cfc5ca29fe -r24823f5bcd89337f1626a648865a83de9095f1e4 --- shared/scripts/configuration/utility.py (.../utility.py) (revision 264a09400a06be340935253b902784cfc5ca29fe) +++ shared/scripts/configuration/utility.py (.../utility.py) (revision 24823f5bcd89337f1626a648865a83de9095f1e4) @@ -6,61 +6,799 @@ # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # @file utils.py -# -# @author (last) Joseph varghese +# @author (last) LTTS # @date (last) 15-Jan-2022 # ############################################################################ + +import builtins import csv -import test +import glob +import math +import names +import object +import os +import sys import squish -from dialin.ui.hd_simulator import HDSimulator -from builtins import int as pyInt +import time +import test from builtins import format +from builtins import int as pyInt +from builtins import str as pyStr +from configuration import config +from dialin.ui import utils +from dialin.utils import * +from dialin.common.msg_ids import MsgIds +from dialin.ui.hd_simulator import HDSimulator +from dialin.protocols import DenaliMessage, DenaliCanMessenger, DenaliChannels from datetime import datetime -hd_simulator = HDSimulator() LOG_LOCATION = "/home/denali/Desktop/sd-card/log/*.log" - + +def color_verification(exp_val = "Red", act_val = "#c53b33"): + test.compare(config.COLOR_CODES[color_name],(act_val.color[name])) + + +def get_text_object(screen_obj, txt): + """ + To obtain a text object based on text provided + @param screen_obj: provides the container on which the txt must be present + @returns a real name object + """ + names.o_text_object["container"] = screen_obj + names.o_text_object["text"] = txt + return names.o_text_object + + +def get_bullet_object(screen_obj, num): + """ + To obtain a bullet object based on occurrence provided. + @param screen_obj: provides the container on which the bullet must be present + @param num: provides the occurrence value + @returns a real name object + """ + names.o_bullet_object["container"] = screen_obj + names.o_bullet_object["occurrence"] = num + 1 + return names.o_bullet_object -def scroll_to_zone(zone=None, screen_object=None): + +def get_indicators(screen_obj, txt): """ - scroll to the numeric if object is hidden - @param zone - UI object - @param screen_object - UI object (UI Home screen = waveforms + numerics) - @return boolean true/false + Verifying the busy indicators for BiCarb Pump Check and Acid Pump Check. + indicator object of expected text + @param step - (str) expected text + @return indicators - (obj) list of busy and check indicator """ + parent_obj = object.parent(squish.waitForObjectExists(get_text_object(screen_obj,txt))) + children_obj = object.children(parent_obj) + indicator_parent = children_obj[2] + indicators = object.children(indicator_parent) + return indicators + + +def check_if_object_is_within_the_container(obj=None, container=None): + """ + check if an object is inside a container + @param obj - child UI object + @param container - container UI object + @return boolean True/False + """ + container = squish.findObject(container) + containerPos = container.mapToGlobal(squish.QPoint(0, 0)) + container_x, container_y = pyInt(containerPos.x), pyInt(containerPos.y) + container_width, container_height = pyInt(container.width), pyInt(container.height) + + obj = squish.findObject(obj) + objPos = obj.mapToGlobal(squish.QPoint(0, 0)) + obj_x, obj_y = pyInt(objPos.x), pyInt(objPos.y) + obj_width, obj_height = pyInt(obj.width), pyInt(obj.height) + + if obj_x >= container_x and obj_y >= container_y: + if (obj_x + obj_width) <= (container_x + container_width) and (obj_y + obj_height) <= (container_y + container_height): + return True + + return False + +def scroll_to_value_on_pop_up(value=None, container=None): + """ + scroll to the to the value if object is hidden + @param value - (obj) value object + @param container - (obj) Container of the value + @return boolean true and false + """ counter = 0 while counter <= 100: try: counter += 1 - squish.findObject(zone) + squish.findObject(value) squish.snooze(0.5) - if check_if_object_is_within_the_container(obj=zone, container=screen_object): + if check_if_object_is_within_the_container(obj=value, container=container): return True else: raise RuntimeError except RuntimeError: - ScreenObj = squish.waitForObject(screen_object) + ScreenObj = squish.waitForObject(container) screenHeight = pyInt(ScreenObj.height) screenWidth = pyInt(ScreenObj.width) - squish.mouseWheel(ScreenObj, screenWidth-1000, - screenHeight-10, 0, -50, squish.Qt.NoModifier) - - raise LookupError("zone object is not in view to the user after " + \ - "trying 100 times") + squish.mouseWheel(ScreenObj, screenWidth//2, screenHeight//2, 0, -50, squish.Qt.NoModifier) + raise LookupError("value object is not in view to the user after trying 100 times") -def get_current_date_and_time(date_format='%Y/%b/%d - %H:%M:%S'): +def pressure_pop_up_text_obj(text): + names.o_pop_up_pressure_text_obj["text"] = text + return names.o_pop_up_pressure_text_obj + return names.o_bullet_object + +def verify_bullet_navigation(num, num_of_instructions, screen_obj): + """ + Method to verify status of bullets based + on number of instruction screen + @param num - (int) number of indicator + @param num_of_instructions- (int) count the number of instructions + @param object - screen_obj - (str) Screen object + """ + test.startSection("instruction bullet verification for screens") + for instruction in range(1, num_of_instructions): + bullet_children = object.children(squish.waitForObjectExists(get_bullet_object(screen_obj,(0 + instruction) - 1))) + bullet_circle_color = bullet_children[0].color.name + bullet_border_color = bullet_children[0].border.color.name + if instruction <= num: + test.compare(bullet_circle_color, config.COMPLETE_COLOR) + test.compare(bullet_border_color,config.COMPLETE_COLOR) + test.log(str(instruction) + " Complete bullet") + else: + test.compare(bullet_circle_color, config.CURRENT_COLOR) + test.compare(bullet_border_color,config.INCOMPLETE_COLOR) + test.log(str(instruction) + " Incomplete bullet") + test.endSection() + +def convert_seconds_into_min_and_sec(seconds, time_format="%M:%S"): + """ + Method to convert seconds into minute format. + @param seconds - time in seconds. + @param time_format (str) - time format. + @return (int) - minute time + """ + seconds = int(seconds) + min_and_sec = time.strftime(time_format, time.gmtime(seconds)) + return min_and_sec + + +def verify_missing_object(object_to_check): + """ + Method to verify the given object is invisible or is not present on the screen + @param object_to_check: the object whose invisibility must be verified + """ + try: + squish.testSettings.objectNotFoundDebugging = False + squish.waitForObject(object_to_check,3000) + test.fail("Given object should not be present initially") + except LookupError as _: + test.passes("object is not present as expected") + squish.testSettings.objectNotFoundDebugging = True + + +def pressure_pop_up_text_obj(text): + names.o_pop_up_pressure_text_obj["text"] = text + return names.o_pop_up_pressure_text_obj + +def pressure_text_obj(text): + names.o_pressure_text_obj["text"] = text + return names.o_pressure_text_obj + +def get_current_date_and_time(date_format='%Y/%b/%d - %H:%M'): date = datetime.now() return str(date.strftime(date_format)) + +def vitals_reading_obj(reading): + names.o_vitals_reading["text"] = reading + return names.o_vitals_reading + + +def get_current_date_and_time(date_format='%Y/%b/%d - %H:%M'): + + date = datetime.now() + return str(date.strftime(date_format)) + +def enter_keypad_value(entry): + """ + Method to enter user desired + value using keypad + @param entry: (int) User expected value + """ + test.startSection("Entering {}".format(entry)) + entry = pyStr(entry) + for value in entry: + squish.mouseClick(squish.waitForObject(keypad_input(value))) + test.endSection() + +def erase_entered_value(input_field): + """ + Method to erase the entered value + @param input_field - (obj) object of input field + """ + test.startSection("Erasing value") + input_field= squish.waitForObject(input_field) + entered_value = str(input_field.text) + for value in range(len(entered_value)+1): + utils.waitForGUI(0.1) + squish.mouseClick(squish.waitForObjectExists(names.o_back_space_key)) + test.compare(str(input_field.text), "", "Input field should be empty") + test.endSection() + +def vitals_reading_obj(reading): + names.o_vitals_reading["text"] = reading + return names.o_vitals_reading + +def keypad_input(key_value): + names.o_keypad_input["text"] = key_value + return names.o_keypad_input + + +def scroll_to_zone(zone=None, screen_object=None, direction = None): + """ + scroll to the to the value if object is hidden + @param value - (obj) value object + @param container - (obj) Container of the value + @return boolean true and false + """ + counter = 0 + while counter <= 100: + try: + counter += 1 + squish.findObject(zone) + squish.snooze(0.5) + if check_if_object_is_within_the_container(obj=zone, container=screen_object): + return True + else: + raise RuntimeError + except RuntimeError: + ScreenObj = squish.findObject(screen_object) + screenHeight = pyInt(ScreenObj.height) + screenWidth = pyInt(ScreenObj.width) + if direction is None: + squish.mouseWheel(ScreenObj, (screenWidth-100), 107, 0, -(screenHeight-460), squish.Qt.NoModifier) + else: + squish.mouseWheel(ScreenObj, (screenWidth-100), -(screenHeight-700), 0, 200, squish.Qt.NoModifier) + + raise LookupError("zone object is not in view to the user after trying 100 times") + +def get_alarm_id_obj(id): + names.o_alarm_id["text"] = id + return names.o_alarm_id + +def get_alarm_msg_obj(msg): + names.o_alarm_message["text"] = msg + return names.o_alarm_message + +def rejection_msg(text): + names.o_rejection_msg["text"] = text + return names.o_rejection_msg + +def verify_page_step_indicator(screen_obj, treatment_step, treatment_screens): + """ + Method to verify the Page Step indicators [the object on top of the screen which indicates the steps passed, current, remained] + @param treatment_step : indicates the Current treatment step + """ + + test.startSection("verification of page step indicators") + for page in range(len(treatment_screens)): + bullet_children = object.children(squish.waitForObjectExists(get_bullet_object(screen_obj, page))) + bullet_circle_color = bullet_children[0].color.name + bullet_border_color = bullet_children[0].border.color.name + step_title = squish.waitForObjectExists(get_text_object(screen_obj, treatment_screens[page])) + + #To verify the step indicators of the completed treatment screens + if page < treatment_step: + test.verify(squish.waitForObjectExists(get_bullet_object(screen_obj, page)).complete) + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).current) + test.compare(bullet_circle_color, config.COMPLETE_COLOR) + test.compare(bullet_border_color,config.COMPLETE_COLOR) + test.compare(step_title.color.name,config.ENABLED_COLOR) + #To verify the step indicators of the current treatment screen + elif page == treatment_step: + test.verify(squish.waitForObjectExists(get_bullet_object(screen_obj, page)).current) + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).complete) + test.compare(bullet_circle_color, config.CURRENT_COLOR) + test.compare(bullet_border_color, config.COMPLETE_COLOR) + test.compare(step_title.color.name, config.ENABLED_COLOR) + test.verify(step_title.font.bold) + #To verify the step indicators of the remaining treatment screens + else: + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).current,) + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).complete,) + test.compare(step_title.color.name, config.INCOMPLETE_COLOR) + test.compare(bullet_circle_color, config.CURRENT_COLOR) + test.compare(bullet_border_color, config.INCOMPLETE_COLOR) + test.endSection() + +def set_arterial_ranges_min_val(art_low): + """ + Method to set the Arterial range maximum value to user expected value + @param art_low - (int) user expected value + """ + test.startSection("Set Arterial range minimum value to {}".format(art_low)) + arterial_min = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_min = pyInt(arterial_min.minimum) + arterial_max = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_max = pyInt(arterial_max.maximum) + low_handler_parent = object.parent(squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery)) + low_handler_children = object.children(low_handler_parent) + low_handler = low_handler_children[-2] + width = pyInt(low_handler.width) - 8 + height = pyInt(low_handler.height)- 10 + if arterial_min == art_low: + test.passes("Arterial range minimum is already set to {}".format(art_low)) + elif arterial_min < art_low: + while arterial_min != art_low: + squish.mouseDrag(low_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_min += 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_min == arterial_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(low_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range minimum value cannot be moved beyond {}".format(arterial_min)) + break + else: + continue + elif arterial_min > art_low: + while arterial_min != art_low: + squish.mouseDrag(low_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_min -= 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_min == arterial_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(low_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range minimum value cannot be moved beyond {}".format(arterial_min)) + break + else: + continue + # arterial blood pressure low limit should be lower than the high limit by atleast 30mmHg + if arterial_min == arterial_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + test.compare(low_handler_parent.minValue, arterial_min, "Arterial range minimum value cannot be moved beyond {}".format(arterial_min)) + else: + test.compare(arterial_min, art_low, "Actual Arterial range minimum value: {} is equal to Expected value: {}".format(arterial_min, art_low)) + test.endSection() + +def set_arterial_ranges_max_val(art_high): + """ + Method to set the Arterial range maximum value to user expected value + @param art_high - (int) user expected value + """ + test.startSection("Set Arterial range maximum value to {}".format(art_high)) + arterial_max = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_max = pyInt(arterial_max.maximum) + arterial_min = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_min = pyInt(arterial_min.minimum) + high_handler_parent = object.parent(squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery)) + high_handler_children = object.children(high_handler_parent) + high_handler = high_handler_children[-1] + width = pyInt(high_handler.width) - 20 + height = pyInt(high_handler.height) - 25 + if arterial_max == art_high: + test.passes("Arterial range maximum is already set to {}".format(art_high)) + elif arterial_max < art_high: + while arterial_max != art_high: + squish.mouseDrag(high_handler, -1, height, width, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_max += 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_max == arterial_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(high_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range maximum value cannot be moved beyond {}".format(arterial_max)) + break + else: + continue + elif arterial_max > art_high: + while arterial_max != art_high: + squish.mouseDrag(high_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_max -= 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_max == arterial_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(high_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range maximum value cannot be moved beyond {}".format(arterial_max)) + break + else: + continue + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_max == arterial_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + test.compare(high_handler_parent.maxValue, arterial_max, "Arterial range maximum value cannot be moved beyond {}".format(arterial_max)) + else: + test.compare(arterial_max, art_high, "Actual Arterial range maximum value: {} is equal to Expected value: {}".format(arterial_max, art_high)) + test.endSection() + +def set_venous_ranges_max_val(ven_high): + """ + Method to set the Venous range maximum value to user expected value + @param ven_high - (int) user expected value + """ + test.startSection("Set Venous range maximum value to {}".format(ven_high)) + ven_max = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Venous) + ven_max = pyInt(ven_max.maximum) + ven_min = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Venous) + ven_min = pyInt(ven_min.minimum) + high_handler_parent = object.parent(squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Venous)) + high_handler_children = object.children(high_handler_parent) + high_handler = high_handler_children[-1] + width = pyInt(high_handler.width) - 15 + height = pyInt(high_handler.height) - 10 + if ven_max == ven_high: + test.passes("Venous range maximum is already set to {}".format(ven_high)) + elif ven_max < ven_high: + while ven_max != ven_high: + squish.mouseDrag(high_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + ven_max += 10 + # venous blood pressure low limit should be lower than the high limit by at least 30mmHg + if ven_max == ven_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(high_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Venous range maximum value cannot be moved beyond {}".format(ven_max)) + break + else: + continue + elif ven_max > ven_high: + while ven_max != ven_high: + squish.mouseDrag(high_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + ven_max -= 10 + # venous blood pressure low limit should be lower than the high limit by at least 30mmHg + if ven_max == ven_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(high_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Venous range maximum value cannot be moved beyond {}".format(ven_max)) + break + else: + continue + # venous blood pressure low limit should be lower than the high limit by at least 30mmHg + if ven_max == ven_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + test.compare(high_handler_parent.maxValue, ven_max, "Venous range maximum value cannot be moved beyond {}".format(ven_max)) + else: + test.compare(ven_max, ven_high, "Actual Venous range maximum value: {} is equal to Expected value: {}".format(ven_max, ven_high)) + test.endSection() + +#Methods for create custom treatment +def set_venous_ranges_min_val(ven_low): + """ + Method to set the Venous range maximum value to user expected value + @param ven_low - (int) user expected value + """ + test.startSection("set Venous range minimum value to {}".format(ven_low)) + ven_min = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Venous) + ven_min = pyInt(ven_min.minimum) + ven_max = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Venous) + ven_max = pyInt(ven_max.maximum) + low_handler_parent = object.parent(squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Venous)) + low_handler_children = object.children(low_handler_parent) + low_handler = low_handler_children[-2] + width = pyInt(low_handler.width) - 15 + height = pyInt(low_handler.height) - 10 + if ven_min == ven_low: + test.passes("Venous range minimum is already set to {}".format(ven_low)) + elif ven_min < ven_low: + while ven_min != ven_low: + squish.mouseDrag(low_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + ven_min += 10 + if ven_min == ven_max - config.BUFFER_LOW_AND_HIGH_LIMITS: # venous blood pressure low limit should be lower than the high limit by at least 30mmHg + squish.mouseDrag(low_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Venous range minimum value cannot be moved beyond {}".format(ven_min)) + break + else: + continue + elif ven_min > ven_low: + while ven_min != ven_low: + squish.mouseDrag(low_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + ven_min -= 10 + # venous blood pressure low limit should be lower than the high limit by at least 30mmHg + if ven_min == ven_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(low_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Venous range minimum value cannot be moved beyond {}".format(ven_min)) + break + else: + continue + # venous blood pressure low limit should be lower than the high limit by at least 30mmHg + if ven_min == ven_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + test.compare(low_handler_parent.minValue, ven_min, "Venous range minimum value cannot be moved beyond {}".format(ven_min)) + else: + test.compare(ven_min, ven_low, "Actual Venous range minimum value: {} is equal to Expected value: {}".format(ven_min, ven_low)) + test.endSection() + +def expected_heparin_value(val): + names.o_heparin_value["text"] = val + return names.o_heparin_value + +def msg(string): + """ + Added ### at the right side of the string to make sure that it is a message. + @param string: (str) the string to add trailing ### to + @return pad_str: (str) padded string + """ + padded_str = "###"+string + return padded_str + +def navigate_to_pretreatment_screen(mode): + """ + Method to navigate to sub mode under pre-treatment screen + @param mode - (int) pre treatment state + """ + hd_simulator.cmd_set_hd_operation_mode_data(HDOpModes.MODE_PRET.value,0) + hd_simulator.cmd_send_pre_treatment_state_data(sub_mode=mode, water_sample_state=0, + consumables_self_test_state=0, no_cartridge_self_test_state=0, + installation_state=0, dry_self_test_state=0, prime_state=0, + recirculate_state=0, patient_connection_state=0) + +def self_test_dry_check_list_text(text): + names.o_self_test_dry_check_list_text["text"] = text + return names.o_self_test_dry_check_list_text + +def get_time(screen_title): + """ + Method to return the current count down + in the application + @param screen_title - (str) current title of the screen + @return time_text - (str) count down in the application + """ + if screen_title == config.BEGIN_PRIME_TITLE or screen_title == config.PRIMING_TITLE: + parent_object = object.parent(squish.waitForObjectExists(self_test_dry_check_list_text(screen_title))) + elif screen_title == config.SYSTEM_SELF_TEST_TITLE: + parent_object = object.parent(squish.waitForObjectExists(names.o_system_self_test)) + else: + parent_object = object.parent(squish.waitForObjectExists(names.o_PreTreatmentBase_Filter_Flush_Text)) + time_parent_children = object.children(parent_object) + progress_circle_parent = time_parent_children[4] + progress_circle_parent = object.children(progress_circle_parent) + progress_circle_parent = progress_circle_parent[0] + progress_circle_parent = object.children(progress_circle_parent) + progress_circle_children = object.children(progress_circle_parent[0]) + time_text = progress_circle_children[1] + return time_text.time + +def verify_countdown(screen_title, time_out, hd_simulator, dg_simulator): + """ + Method to verify the count down + time in application + @param screen_title - (str) current title of the screen + @param time_out - (int) time out duration in secs + @Param hd_simulator - Instance of class HDSimulator + @Param dg_simulator - Instance of class DGSimulator + """ + test.startSection("Verify the count down time in application") + for count_down in range(config.COUNT_DOWN_TIME_100, config.MINIMUM_COUNTDOWN_TIME-1, -1): + if screen_title == config.BEGIN_PRIME_TITLE: + hd_simulator.cmd_send_pre_treatment_self_test_dry_progress_data(time_out, count_down) + elif screen_title == config.PRIMING_TITLE: + hd_simulator.cmd_send_pre_treatment_disposables_prime_progress_data(time_out, count_down) + elif screen_title == config.SYSTEM_SELF_TEST_TITLE: + hd_simulator.cmd_send_pre_treatment_self_test_no_cartridge_progress_data(time_out, count_down) + else: + dg_simulator.cmd_send_dg_pre_treatment_filter_flush_progress_data(time_out, count_down) + actual_time = get_time(screen_title) + expected_time = convert_seconds_into_min_and_sec(count_down) + test.compare(actual_time, expected_time, "Actual count down time: {} should be equal to expected count down time {}".format(actual_time, expected_time)) + verify_the_progress(count_down, screen_title, time_out) + test.endSection() + +def verify_the_progress(count_down, screen_title, time_out): + """ + Method to verify the current progress + @param count_down - (int) current count down time + @param screen_title - (str) current title of the screen + @param time_out - (int) time out duration in secs + """ + test.startSection("Verifying the current progress") + if screen_title == config.BEGIN_PRIME_TITLE or screen_title == config.PRIMING_TITLE: + current_progress = (squish.waitForObjectExists(names.o_self_test_dry_progress)).progressValue + elif screen_title == config.SYSTEM_SELF_TEST_TITLE: + current_progress = (squish.waitForObjectExists(names.o_system_self_test_progress)).progressValue + else: + current_progress = (squish.waitForObjectExists(names.o_filter_flush_progress)).progressValue + #Since progress value is equal maximum count down value - current count down value + expected_progress = time_out - count_down + test.compare(current_progress, expected_progress, "{} should be the current progress".format(expected_progress)) + test.endSection() + +def verify_page_step_indicator(screen_obj, treatment_step, treatment_screens): + """ + Method to verify the Page Step indicators [the object on top of the screen which indicates the steps passed, current, remained] + @param treatment_step : (int) indicates the Current treatment step + """ + test.startSection("verification of page step indicators") + for page in range(len(treatment_screens)): + bullet_children = object.children(squish.waitForObjectExists(get_bullet_object(screen_obj, page))) + bullet_circle_color = bullet_children[0].color.name + bullet_border_color = bullet_children[0].border.color.name + step_title = squish.waitForObjectExists(get_text_object(screen_obj, treatment_screens[page])) + #To verify the step indicators of the completed treatment screens + if page < treatment_step: + test.verify(squish.waitForObjectExists(get_bullet_object(screen_obj, page)).complete) + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).current) + test.compare(bullet_circle_color, config.COMPLETE_COLOR) + test.compare(bullet_border_color, config.COMPLETE_COLOR) + test.compare(step_title.color.name, config.ENABLED_COLOR) + #To verify the step indicators of the current treatment screen + elif page == treatment_step: + test.verify(squish.waitForObjectExists(get_bullet_object(screen_obj, page)).current,) + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).complete) + test.compare(bullet_circle_color, config.CURRENT_COLOR) + test.compare(bullet_border_color, config.COMPLETE_COLOR) + test.compare(step_title.color.name, config.ENABLED_COLOR) + test.verify(step_title.font.bold) + #To verify the step indicators of the remaining treatment screens + else: + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).current,) + test.verify(not squish.waitForObjectExists(get_bullet_object(screen_obj, page)).complete,) + test.compare(step_title.color.name, config.INCOMPLETE_COLOR) + test.compare(bullet_circle_color, config.CURRENT_COLOR) + test.compare(bullet_border_color, config.INCOMPLETE_COLOR) + test.endSection() + +def verify_missing_object(object_to_check): + """ + Method to verify the given object is invisible or is not present on the screen + @param object_to_check: the object whose invisibility must be verified + """ + try: + squish.testSettings.objectNotFoundDebugging = False + squish.waitForObject(object_to_check,3000) + test.fail("Given object should not be present initially") + except LookupError as _: + test.passes("object is not present as expected") + squish.testSettings.objectNotFoundDebugging = True + +def set_arterial_ranges_min_val(art_low): + """ + Method to set the Arterial range maximum value to user expected value + @param art_low - (int) user expected value + """ + test.startSection("Set Arterial range minimum value to {}".format(art_low)) + arterial_min = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_min = pyInt(arterial_min.minimum) + arterial_max = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_max = pyInt(arterial_max.maximum) + low_handler_parent = object.parent(squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery)) + low_handler_children = object.children(low_handler_parent) + low_handler = low_handler_children[-2] + width = pyInt(low_handler.width) - 8 + height = pyInt(low_handler.height)- 10 + if arterial_min == art_low: + test.passes("Arterial range minimum is already set to {}".format(art_low)) + elif arterial_min < art_low: + while arterial_min != art_low: + squish.mouseDrag(low_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_min += 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_min == arterial_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(low_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range minimum value cannot be moved beyond {}".format(arterial_min)) + break + else: + continue + elif arterial_min > art_low: + while arterial_min != art_low: + squish.mouseDrag(low_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_min -= 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_min == arterial_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(low_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range minimum value cannot be moved beyond {}".format(arterial_min)) + break + else: + continue + # arterial blood pressure low limit should be lower than the high limit by atleast 30mmHg + if arterial_min == arterial_max - config.BUFFER_LOW_AND_HIGH_LIMITS: + test.compare(low_handler_parent.minValue, arterial_min, "Arterial range minimum value cannot be moved beyond {}".format(arterial_min)) + else: + test.compare(arterial_min, art_low, "Actual Arterial range minimum value: {} is equal to Expected value: {}".format(arterial_min, art_low)) + test.endSection() + + +def set_arterial_ranges_max_val(art_high): + """ + Method to set the Arterial range maximum value to user expected value + @param art_high - (int) user expected value + """ + test.startSection("Set Arterial range maximum value to {}".format(art_high)) + arterial_max = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_max = pyInt(arterial_max.maximum) + arterial_min = squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery) + arterial_min = pyInt(arterial_min.minimum) + high_handler_parent = object.parent(squish.waitForObjectExists(names.o_PreTreatmentCreate_rangeRect_RangeRect_Artery)) + high_handler_children = object.children(high_handler_parent) + high_handler = high_handler_children[-1] + width = pyInt(high_handler.width) - 20 + height = pyInt(high_handler.height) - 25 + if arterial_max == art_high: + test.passes("Arterial range maximum is already set to {}".format(art_high)) + elif arterial_max < art_high: + while arterial_max != art_high: + squish.mouseDrag(high_handler, -1, height, width, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_max += 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_max == arterial_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(high_handler, width, height, 1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range maximum value cannot be moved beyond {}".format(arterial_max)) + break + else: + continue + elif arterial_max > art_high: + while arterial_max != art_high: + squish.mouseDrag(high_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + arterial_max -= 10 + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_max == arterial_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + squish.mouseDrag(high_handler, width, height, -1, 0, squish.Qt.NoModifier, squish.Qt.LeftButton) + test.log("Arterial range maximum value cannot be moved beyond {}".format(arterial_max)) + break + else: + continue + # arterial blood pressure low limit should be lower than the high limit by at least 30mmHg + if arterial_max == arterial_min + config.BUFFER_LOW_AND_HIGH_LIMITS: + test.compare(high_handler_parent.maxValue, arterial_max, "Arterial range maximum value cannot be moved beyond {}".format(arterial_max)) + else: + test.compare(arterial_max, art_high, "Actual Arterial range maximum value: {} is equal to Expected value: {}".format(arterial_max, art_high)) + test.endSection() + +def get_text_object(screen_obj, txt): + """ + To obtain a text object based on text provided + @param screen_obj: provides the container on which the txt must be present + @returns a real name object + """ + names.o_text_object["container"] = screen_obj + names.o_text_object["text"] = txt + return names.o_text_object + +def verify_color_of_entry(entry, vital_parameter, input_field): + """ + Method to verify the color of entry + of systolic, diastolic and heart rate + @param entry: (int) user user entered value + @param vital_parameter - (str) parameter name under which user is entering value (sys/dia/heart rate) + @param input_field - (obj) object of input field + """ + test.startSection("Verify the color of {} value {}".format(vital_parameter, entry)) + input_field_color = input_field.color.name + entry = pyInt(entry) + if vital_parameter is config.SYSTOLIC_TEXT: + if (entry < config.SYSTOLIC_LOWER_LIMIT) or (entry > config.SYSTOLIC_UPPER_LIMIT): + test.compare(input_field_color, config.OUT_OF_RANGE_COLOR, "systolic value {} is out of range, systolic value should be in range of {} and {}".format(entry, config.SYSTOLIC_LOWER_LIMIT, config.SYSTOLIC_UPPER_LIMIT)) + elif (entry >= config.SYSTOLIC_LOWER_LIMIT) and (entry <= config.SYSTOLIC_UPPER_LIMIT): + test.compare(input_field_color, config.IN_RANGE_COLOR, "systolic value {} is in range of {} and {}".format(entry, config.SYSTOLIC_LOWER_LIMIT, config.SYSTOLIC_UPPER_LIMIT)) + elif vital_parameter is config.DIASTOLIC_TEXT: + if (entry < config.DIASTOLIC_LOWER_LIMIT) or (entry > config.DIASTOLIC_UPPER_LIMIT): + test.compare(input_field_color, config.OUT_OF_RANGE_COLOR, "diastolic value {} is out of range, diastolic value should be in range of {} and {}".format(entry, config.DIASTOLIC_LOWER_LIMIT, config.DIASTOLIC_UPPER_LIMIT)) + elif (entry >= config.DIASTOLIC_LOWER_LIMIT) and (entry <= config.DIASTOLIC_UPPER_LIMIT): + test.compare(input_field_color, config.IN_RANGE_COLOR, "diastolic value {} is in range of {} and {}".format(entry, config.DIASTOLIC_LOWER_LIMIT, config.DIASTOLIC_UPPER_LIMIT)) + elif vital_parameter is config.HEART_RATE_TITLE: + if (entry < config.HEART_RATE_LOWER_LIMIT) or (entry > config.HEART_RATE_UPPER_LIMIT): + test.compare(input_field_color, config.OUT_OF_RANGE_COLOR, "Heart Rate value {} is out of range, Heart Rate value should be in range of {} and {}".format(entry, config.HEART_RATE_LOWER_LIMIT, config.HEART_RATE_UPPER_LIMIT)) + elif (entry >= config.HEART_RATE_LOWER_LIMIT) and (entry <= config.HEART_RATE_UPPER_LIMIT): + test.compare(input_field_color, config.IN_RANGE_COLOR, "Heart Rate value {} is in range of {} and {}".format(entry, config.HEART_RATE_LOWER_LIMIT, config.HEART_RATE_UPPER_LIMIT)) + test.endSection() + +def keypad_input(key_value): + """ + Method to enter values using application UI keyboard + @param key_value: (str) User expected value + """ + if key_value is not None: + names.o_keypad_input["text"] = key_value + return names.o_keypad_input + else: + test.log("Invalid text for object.") + names.o_keypad_input["text"] = None + +def enter_keypad_value(entry): + """ + Method to enter user desired + value using keypad + @param entry: (str) User expected value + """ + test.startSection("Entering {}".format(entry)) + entry = pyStr(entry) #type casted into string format + for value in entry: + squish.mouseClick(squish.waitForObject(keypad_input(value))) + test.endSection() + def is_float(num): """ This function checks the value is adaptable for float conversion. - @param num - (string) input value for conversion. @return True/False- (bool) returns True if the value can type casted into float, else False """ @@ -71,11 +809,9 @@ except ValueError: return False - def is_intiger(num): """ This function checks the value is adaptable for integer conversion. - @param num - (string) (string) input value for conversion. @return True/False- (bool) returns True if the value can type casted into int, else False """ @@ -85,16 +821,12 @@ except ValueError: return False - def get_extracted_file(): """ This function is the handler for getting file from log folder. - This handler will go inside log folder and looks for newly added log based on current time. if it satisfied that condition, it will return the exact path of newly created log. - Application log file is automatically created on '/home/denali/Desktop/sd-card/log/ {current_date}_denaliSquish.log' - @return latest_file - (string) returns latest file that append on log folder from sd-data """ try: @@ -103,14 +835,12 @@ return latest_file except: return False - - + def get_message_from_log(file_name, message_text): """ This method intended to extract the message from application log. For row[index], index represent column to be extracted. - @param file_name - (string) path of the latest log file created. @param message_text - (string) message text to be extracted. @return message - (list) API arguments displayed in log. @@ -140,22 +870,20 @@ message[value] = float(message[value]) if int_status is True: message[value] = int(message[value]) + test.log(str(message)) return message else: pass except: test.fail("application log data is corrupted") except: test.fail("Log file is not created or log file is not created based on standard log naming format.") - - + def get_ack_request_details(file_name, message_text): """ This method intended to extract acknowledgement request status, negative requested acknowledgement and message id from application log. - For row[index], were index represent column to be extracted. - @param file_name - (string) path of the latest log file created. @param message_text - (string) message text to be extracted from log. @return row[3] - (string) acknowledgement request status. @@ -190,13 +918,10 @@ except: test.fail("Log file is not created or log file is not created based on standard log naming format.") - def get_bak_request_details(file_name, ack_bak_value): """ This method intended to extract the acknowledgement back status from application log. - For row[index], were index represent column to be extracted. - @param file_name - (string) path of the latest log file created. @param ack_bak_value - (string) Positive back acknowledgement value (Sq). @return row[3] - (string) acknowledgement back status. @@ -220,15 +945,11 @@ test.fail("application log data is corrupted") except: test.fail("Log file is not created or log file is not created based on standard log naming format.") - - - + def get_current_log_details(message_ack = False, message_text = None): """ This function is capable to perform data analysis from application log folder. - logs are automatically created in path :"/home/denali/Desktop/sd-card/log/*.log". - In row[index], index represent column to be extracted. @param message_ack - (bool) 'True' - if ack is satisfied in log / 'False' - if ack condition is not satisfied @param message_text - (string) message text to be extracted from log. @@ -249,4 +970,97 @@ content_record.append(ack_bak_status) return content_record +def vitals_interval_obj(interval): + names.o_time_interval_obj["text"] = interval + return names.o_time_interval_obj + +def get_extracted_error_file(): + """ + This function is the handler for getting error file from service folder. + Application log file is automatically created on '/home/denali/Desktop/sd-card/service/ {current_date}_denaliSquish.err ' + @return latest_file - (string) returns latest file that append on log folder from service + """ + try: + current_date = get_current_date_and_time(date_format = "%Y_%m_%d") + latest_file = '/home/denali/Desktop/sd-card/service/'+current_date+'_denaliSquish.err' + return latest_file + except: + return False + +def keyboard_input(key_value): + names.o_keyboard_object["text"] = key_value + return names.o_keyboard_object + +def enter_keyboard_numeric_value(entry): + """ + Method to enter user desired + value using keypad + @param entry: (str) User expected value + """ + test.startSection("Entering {}".format(entry)) + for value in entry: + if value.isalpha(): + value = pyStr(value) + else: + value = pyInt(value) + key_val = squish.waitForObject(keyboard_input(value)) + squish.mouseClick(key_val) + utils.waitForGUI(0.1) + test.endSection() + + +def end_treatment_states_rejection_msg(text): + names.o_end_treatment_state_rejection_msg["text"] = text + return names.o_end_treatment_state_rejection_msg + +def verify_parameter_from_post_treatment_log(msg_text): + """ + To obtain the details of parameter from post treatment log file. + @param msg_text: parameter to be extracted. + @returns message value and message unit + """ + try: + log_location = str(get_extracted_file_from_post_treatment()) + with open(log_location, 'r') as csv_file: + try: + for row in csv_file: + reader = csv.reader(csv_file) + for row in reader: + row_length = sum(1 for values in row) + for row1 in row: + if row[0]!= None and row[0] == msg_text and row_length == 3: + return (row[1],row[2]) + else: + pass + except: + test.fail("Treatment log data is corrupted") + except: + test.fail("Log file is not created or log file is not created based on standard log naming format.") + +def get_extracted_file_from_post_treatment(): + """ + This function is the handler for getting file from log folder. + This handler will go inside log folder and looks for newly added log based on current time. + if it satisfied that condition, it will return the exact path of newly created log. + @return latest_file - (string) returns latest file that append on log folder from sd-data + """ + try: + list_of_files = glob.glob(config.TREATMENT_LOG_LOCATION) + latest_file = max(list_of_files, key=os.path.getctime) + return latest_file + except: + test.fail("log file is not created during application interaction") + return False + +def rinseback_rejection_msg(text): + names.o_rinseback_rejection_msg["text"] = text + return names.o_rinseback_rejection_msg + squish.testSettings.objectNotFoundDebugging = True + + +def recirculate_rejection_msg(text): + names.o_recirculate_rejection_msg["text"] = text + return names.o_recirculate_rejection_msg + + Index: tst_ui_logs/test.py =================================================================== diff -u -r1aa64d8752ffcc05db72fa3fbcebc4064d401fd8 -r24823f5bcd89337f1626a648865a83de9095f1e4 --- tst_ui_logs/test.py (.../test.py) (revision 1aa64d8752ffcc05db72fa3fbcebc4064d401fd8) +++ tst_ui_logs/test.py (.../test.py) (revision 24823f5bcd89337f1626a648865a83de9095f1e4) @@ -29,28 +29,36 @@ from configuration import config import builtins from dialin.common.msg_ids import MsgIds +from dialin.common.hd_defs import HDOpSubModes, HDOpModes from dialin.common import msg_defs -from dialin.utils.conversions import byte_to_bytearray, integer_to_bytearray, float_to_bytearray, short_to_bytearray, unsigned_integer_to_bytearray, integer_to_bit_array -# from dialin.utils import YES +from dialin.utils.conversions import integer_to_bytearray, float_to_bytearray, short_to_bytearray, unsigned_integer_to_bytearray, integer_to_bit_array hd_simulator = HDSimulator() +dg_simulator = DGSimulator() + +hd_simulator = HDSimulator() logger= logging.getLogger("INFO") messenger= DenaliCanMessenger('can0') - hd_alarm= HDAlarmsSimulator(can_interface=messenger, logger=logger) dg_simulator = DGSimulator() + NUMBER_OF_OPMODE = 9 NUMBER_OF_TREATMENTMODES = 3 CONDITIONS = [0,1] - -def verify_log(msg_id,msg = None, param = None): +def verify_log(msg_id,msg=None, param=None): + """ + This function verifies the UI log's. + @param msg_id - (string) expected message_id's. + @param msg - (string) message to be displayed on log. + @param param - (list) parameters for msg_id's. + """ + test.startSection("Verification of UI log based on message ID : " + str(msg_id)) utils.waitForGUI(2) ack = False if not msg_id in msg_defs.ACK_NOT_REQUIRED: ack = True - message_extracted = utility.get_current_log_details(message_ack = ack, message_text = msg) - test.log(str(message_extracted)) + message_extracted = utility.get_current_log_details(message_ack=ack, message_text=msg) if ack == True: test.verify(config.ACK_REQ_STATUS in message_extracted, "ack request is verified") test.verify(config.ACK_BAK_STATUS in message_extracted, "ack back is verified") @@ -59,19 +67,20 @@ test.verify(message_id_str in message_extracted, "message ID is verified") if param != None: test.verify(param in message_extracted, "parameters are verified") - + test.endSection() + def main(): utils.tstStart(__file__) startApplication(config.AUT_NAME) - + #HD Broadcast #0x0D00 hd_simulator.cmd_set_treatment_time(200,60,0) verify_log(msg_id = MsgIds.MSG_ID_TREATMENT_TIME.value, msg = "TreatmentTime", param = [200,60,0]) #0x0500 - hd_simulator.cmd_set_treatment_blood_flow_rate(flow_set_pt=20, measured_flow=10.5, + hd_simulator.cmd_set_treatment_blood_flow_rate(flow_set_pt = 20, measured_flow = 10.5, rot_speed = 112.2 , mot_speed = 120.3, mc_speed = 100.0, mc_current = 12.5, pwm = 32.3, rotor_count = 30) verify_log(msg_id = MsgIds.MSG_ID_BLOOD_FLOW_DATA.value, msg = "BloodFlow", param = [20,10.5,112.2,120.3,100.0,12.5,32.3,30]) @@ -231,9 +240,13 @@ #HD Operation Mode #0x2500 - for mode in range(NUMBER_OF_OPMODE): - hd_simulator.cmd_send_hd_operation_mode(op_mode = mode, sub_mode = 0) - verify_log(msg_id = MsgIds.MSG_ID_HD_OP_MODE.value, msg = "OpMode", param = [mode,0]) + mode_data = HDOpModes.NUM_OF_MODES.value + submode_data = HDOpSubModes.NUM_OF_STANDBY_STATES.value + for mode in range(mode_data): + for sub_mode in range(submode_data): + #hd_simulator.cmd_send_hd_operation_mode(op_mode = mode, sub_mode = 0) + hd_simulator.cmd_send_hd_operation_mode(op_mode = mode, sub_mode = sub_mode) + verify_log(msg_id = MsgIds.MSG_ID_HD_OP_MODE.value, msg = "OpMode", param = [mode,sub_mode]) #0x5C00 for s_mode in range(NUMBER_OF_OPMODE): @@ -388,7 +401,7 @@ dg_simulator.cmd_send_version_dg_data(major=1, minor=1, micro=0, build=4, fpga_id=5, fpga_major=1, fpga_minor=2, fpga_lab=3, compatibility_rev=6) - verify_log(msg_id = MsgIds.MSG_ID_DG_VERSION.value, msg = "Version", param = [1,1,0,4,5,1,2,3,6]) + verify_log(msg_id = MsgIds.MSG_ID_DG_VERSION.value, msg = "VersionRsp", param = [1,1,0,4,5,1,2,3,6]) #0x9E00 hd_simulator.cmd_send_hd_request_ui_version() @@ -554,12 +567,12 @@ #0xAB00 #TODO: Payload values need to been changed after discussion - dg_simulator.cmd_send_dg_general_response(message_id=171, accepted=0, reason=1) + dg_simulator.cmd_send_dg_general_response(message_id=171, accepted=0, reason=1, is_pure_data=False, has_parameters=False, parameters_payload=None) verify_log(msg_id=MsgIds.MSG_ID_DG_SCHEDULED_RUNS_DATA.value, msg="DG scheduled runs data") #0xAC00 #TODO: Payload values need to been changed after discussion - dg_simulator.cmd_send_dg_general_response(message_id=172, accepted=0, reason=1) + dg_simulator.cmd_send_dg_general_response(message_id=172, accepted=0, reason=1, is_pure_data=False, has_parameters=False, parameters_payload=None) verify_log(msg_id = MsgIds.MSG_ID_DG_SCHEDULED_RUNS_INFO.value, msg = "DG scheduled runs info") #TODO: Msg_Ids need to be update as per patch file. line number 446 should be uncomment after the fix @@ -572,6 +585,7 @@ payload += float_to_bytearray(22.2) payload += float_to_bytearray(22.2) payload += float_to_bytearray(22.2) + payload += float_to_bytearray(22.2) dg_simulator.cmd_send_dg_general_response(message_id=174, accepted=0, reason=1, is_pure_data = False, has_parameters = True, parameters_payload = payload) @@ -634,20 +648,19 @@ #parameter mismatch : expected 1 int but 3 integers are logged hd_simulator.cmd_set_treatment_adjust_ultrafiltration_accepted(state = 1) verify_log(msg_id = MsgIds.MSG_ID_USER_UF_PAUSE_RESUME_RESPONSE.value, msg = "AdjustUFState") - + #0x1300 #TODO: Payload values need to been changed after discussion - payload = unsigned_integer_to_bytearray(4) + payload = unsigned_integer_to_bytearray(1) payload += unsigned_integer_to_bytearray(6) - payload += unsigned_integer_to_bytearray(12) payload += float_to_bytearray(8.4) payload += unsigned_integer_to_bytearray(14) - payload += short_to_bytearray(6) + payload += unsigned_integer_to_bytearray(6) payload += float_to_bytearray(5.2) payload += float_to_bytearray(5.8) payload += float_to_bytearray(2.3) hd_simulator.cmd_send_hd_general_response(message_id=19, accepted=1, reason=1, is_pure_data= False, has_parameters = True,parameters_payload = payload) - verify_log(msg_id=MsgIds.MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE.value, msg="AdjustUFEdit") + verify_log(msg_id=MsgIds.MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE.value, msg="AdjustUFEdit",param = [1, 6, 8.4, 14, 6, 5.2, 5.8, 2.3] ) #0x2E00 #parameter mismatch : expected 1 int but 3 integers are logged @@ -1018,6 +1031,6 @@ payload += float_to_bytearray(11.500) dg_simulator.cmd_send_dg_general_response(message_id=45, accepted=1, reason=1, is_pure_data = False, has_parameters = True, parameters_payload = payload) verify_log(msg_id = MsgIds.MSG_ID_DG_TEMPERATURE_DATA.value, msg = "Temperatures") - + utils.tstDone()