Index: shared/scripts/configuration/config.py =================================================================== diff -u -rb1f71b788540a259b19ed0ce19a2e8736be88b7a -rf89cb68bee65682b0641dc891dccba1bff5f575b --- shared/scripts/configuration/config.py (.../config.py) (revision b1f71b788540a259b19ed0ce19a2e8736be88b7a) +++ shared/scripts/configuration/config.py (.../config.py) (revision f89cb68bee65682b0641dc891dccba1bff5f575b) @@ -6,29 +6,429 @@ # THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # -# @file utils.py +# @file config.py # -# @author (last) Joseph varghese +# @author (last) LTTS # @date (last) 18-Jan-2022 # ############################################################################ import os from configuration.strings import * + AUT_NAME = "denaliSquish" + +COLOR_CODES = {"Aqua": "#81ffff", "Blue": "#017dea", "Blue 2": "#1090d5", "Green": "#29fd2d", "Grey": "#d3d3d3", + "Lavender": "#db98f5", "Light Blue": "#acd7f1", "Light Teal": "#29f1da","Lime": "#b7fc36", + "Magenta":"#fd28fd", "Orange": "#f2721c", "Peach":"#f1979a", "Red": "#c53b33", "Rose":"#fc178d", + "Slate blue":"#7f7ffa", "Violet": "#6435c9", "White": "#ffffff", "Yellow": "#fcfc4d"} + +TREATMENT_UNHIGHLIGHTED_COLOR = "#000000" +TREATMENT_HIGHLIGHTED_COLOR = "#135088" + COMMON_PATH = os.environ['HOME']+"/Projects" - +#StandBy Mode +BLOOD_PRIMING_DEFAULT_VALUE = "0 mL" + +#instructions_imagelocation +INSTRUCTION_CONF_LOCATION = "/home/denali/Projects/application/resources/settings/Instructions/Instructions.conf" +IMAGE_LOCATION = "file:///home/denali/Projects/application/resources/settings/Instructions/" +EXPECTED_IMAGE_LOCATION = "/home/denali/Projects/application/resources/settings/Instructions/" +SERVICE_CONF_LOCATION = os.environ['HOME']+"/Projects/application/resources/settings/Service.conf" +TREATMENT_LOG_LOCATION = '/home/denali/Desktop/sd-card/treatment/*.log' + +BLOOD_PRIMING_TEXT = "Blood Priming" +SALINE_UNIT = "mL" + + +ACCEPTED = True +REJECTED = False +ENABLED = True +DISABLED = False +CURRENT_COLOR = '#000000' +COMPLETE_COLOR = '#4290ec' +ENABLED_COLOR = '#fcfcfc' +INCOMPLETE_COLOR = '#607a91' +OUT_OF_RANGE_COLOR = "#c53b33" + +#main treatment screen +IN_RANGE_COLOR = "#fcfcfc" +SYSTOLIC_LOWER_LIMIT = 60 +SYSTOLIC_UPPER_LIMIT = 250 +DIASTOLIC_LOWER_LIMIT = 40 +DIASTOLIC_UPPER_LIMIT = 200 +HEART_RATE_LOWER_LIMIT = 40 +HEART_RATE_UPPER_LIMIT = 180 + +KEYBOARD_SWITCH = ["ABC", "&123"] + +HEPARIN_TYPE = "UFH 1,000 IU/mL" +ACID_CONCENTRATE = ["08-1251-1", "08-2251-0", "08-3251-9"] +BICARBONATE_CONCENTRATE = "Fres. Centrisol" +DIALYZER_TYPE = ["BB Diacap Pro 13H", "BB Diacap Pro 16H", "BB Diacap Pro 19H", "F Optiflux F160NRe", "F Optiflux F180NRe"] + COLOR_CODES = {"Aqua": "#81ffff", "Blue": "#017dea", "Blue 2": "#1090d5", "Green": "#29fd2d", "Grey": "#d3d3d3", "Lavender": "#db98f5", "Light Blue": "#acd7f1", "Light Teal": "#29f1da","Lime": "#b7fc36", "Magenta":"#fd28fd", "Orange": "#f2721c", "Peach":"#f1979a", "Red": "#c53b33", "Rose":"#fc178d", "Slate blue":"#7f7ffa", "Violet": "#6435c9", "White": "#ffffff", "Yellow": "#fcfc4d"} + +TREATMENT_UNHIGHLIGHTED_COLOR = "#000000" +TREATMENT_HIGHLIGHTED_COLOR = "#135088" + +#create custom treatment +HIGHER_VALUE_OF_BLOOD_FLOW_RATE = 500 +LOWER_VALUE_OF_BLOOD_FLOW_RATE = 100 +STEP_VALUE_OF_BLOOD_FLOW_RATE = 25 +BUFFER_LOW_AND_HIGH_LIMITS = 30 +ARTERIAL_VALUE_0 = 0 +ARTERIAL_VALUE_NEGATIVE_300 = -300 +ARTERIAL_VALUE_NEGATIVE_20 = -20 +ARTERIAL_VALUE_NEGATIVE_270 = -270 +VENOUS_VALUE_600 = 600 +VENOUS_VALUE_20 = 20 +VENOUS_VALUE_50 = 50 +VENOUS_VALUE_570 = 570 +POSITIVE_BUFFER = 10 +NEGATIVE_BUFFER = -10 + +NUM_OF_ALARM_PRIORITIES = 4 # Total number of alarm priorities + +NUM_OF_MSG_ID = 290 + +ALARM_ID_NO_ALARM = 0 +ALARM_ID_OUT_OF_RANGE = 291 + +# alarm colors +ALARMS_COLORS_HEADER = { + "ALARM_PRIORITY_NONE" : "#438feb", + "ALARM_PRIORITY_LOW" : "#db8f00", + "ALARM_PRIORITY_MEDIUM" : "#db8f00", + "ALARM_PRIORITY_HIGH" : "#831913" +} + +ALARMS_COLORS_BODY = { + "ALARM_PRIORITY_NONE" : "#254670", + "ALARM_PRIORITY_LOW" : "#f5a623", + "ALARM_PRIORITY_MEDIUM" : "#f5a623", + "ALARM_PRIORITY_HIGH" : "#c53b33" +} + +ALARM_MUTE_FLAG = 0B0000001000000000 +ALARM_UNMUTE_FLAG = 0B0000000000000000 + +ALARM_BUTTONS_OK = 0B0000000010111000 + +ALARM_BUTTONS_RESUME = 0B0000000000110000 +ALARM_BUTTONS_RESUME_RINSEBACK = 0B0000000000100000 +ALARM_BUTTONS_RESUME_END = 0B0000000000010000 + +ALARM_BUTTONS_RINSEBACK = 0B0000000000101000 +ALARM_BUTTONS_RINSEBACK_RESUME = ALARM_BUTTONS_RESUME_RINSEBACK +ALARM_BUTTONS_RINSEBACK_END = 0B0000000000001000 + +ALARM_BUTTONS_END = 0B0000000000011000 +ALARM_BUTTONS_END_RESUME = ALARM_BUTTONS_RESUME_END +ALARM_BUTTONS_END_RINSEBACK = ALARM_BUTTONS_RINSEBACK_END + +ALARM_BUTTONS_RESUME_RINSEBACK_END = 0B0000000000000000 +ALARM_BUTTONS_RINSEBACK_RESUME_END = ALARM_BUTTONS_RESUME_RINSEBACK_END +ALARM_BUTTONS_END_RESUME_RINSEBACK = ALARM_BUTTONS_RESUME_RINSEBACK_END + +#standby mode & ultrafiltration +SALINE_BOLUS_CUMULATIVE = 300 +UF_MINIMUM_VALUE = 0 +UF_MAXIMUM_VALUE = 600 + + +#pressure +PRESSURE_STEPS = 10 +ARTERIAL_PRESSURE_MINIMUM = -400 +ARTERIAL_PRESSURE_MAXIMUM = +600 +ARTERIAL_PRESSURE_LOW_MIN = -300 +ARTERIAL_PRESSURE_LOW_DEF = -300 +ARTERIAL_PRESSURE_LOW_MAX = +200 +ARTERIAL_PRESSURE_HIGH_MIN = -300 +ARTERIAL_PRESSURE_HIGH_DEF = +100 +ARTERIAL_PRESSURE_HIGH_MAX = +200 + +VENOUS_PRESSURE_MINIMUM = -100 +VENOUS_PRESSURE_MAXIMUM = +700 +VENOUS_PRESSURE_LOW_MIN = -100 +VENOUS_PRESSURE_LOW_DEF = -100 +VENOUS_PRESSURE_LOW_MAX = +600 +VENOUS_PRESSURE_HIGH_MIN = +100 +VENOUS_PRESSURE_HIGH_DEF = +400 +VENOUS_PRESSURE_HIGH_MAX = +600 + +#main_treatment_flows +BLOOD_FLOW_MINIMUM_VALUE = 100 +BLOOD_FLOW_BUFFER = 25 +FLOW_SLIDER_WIDTH_BUFFER = 37 +BLOOD_FLOW_MAXIMUM_VALUE = 500 +DIALYSATE_FLOW_MINIMUM_VALUE = 0 +DIALYSATE_FLOW_MAXIMUM_VALUE = 0 # Seems to be bug. need change +DIALYSATE_FLOW_BUFFER = 50 +DIALYSATE_FLOW_SLIDER_WIDTH_BUFFER = 60 + +#main treatment screen +OUT_OF_RANGE_COLOR = "#c53b33" +IN_RANGE_COLOR = "#fcfcfc" +SYSTOLIC_LOWER_LIMIT = 60 +SYSTOLIC_UPPER_LIMIT = 250 +DIASTOLIC_LOWER_LIMIT = 40 +DIASTOLIC_UPPER_LIMIT = 200 +HEART_RATE_LOWER_LIMIT = 40 +HEART_RATE_UPPER_LIMIT = 180 +BLOOD_PRIMING_RANGE = 300 +BLOOD_PRIMING_TARGET_MAXIMUM = 300 + +#tst_pretreatment_screens +NUM_OF_PRETREATMENT_BULLETS = len(PRE_TREATMENT_SCREENS) +SALINE_BOLUS_CUMULATIVE = 300 + +#patient id +KEYBOARD_SWITCH = ["ABC", "&123"] +PATIENT_ID_COMBINATION = { + "qwerty" : "qwerty", + "sampleid" : "sampleid", + "abcdefghijklmnop" : "abcdefghijklmnop", + "patientid" : "patientid", + "username" : "username", + "sA@MpLE#123" : "sAMpLE123", + "A@BH&321" : "ABH321", + "5432@qwerty" : "5432qwerty" +} + +#Random selection for operational parameter for custom dta +OPERATIONAL_PARAMETERS = {"Heparin Type": HEPARIN_TYPE, "Acid Concentrate": "08-1251-1", + "Bicarbonate Concentrate": BICARBONATE_CONCENTRATE, "Dialyzer Type": "BB Diacap Pro 16H"} + +#dictionary consist of custom treatment values +CREATE_CUSTOM_TREATMENT = { + "Blood Flow Rate": 250, + "Dialysate Flow Rate": 400, + "Duration": 270, + "Heparin Dispensing Rate": 0.5, + "Heparin Bolus Volume": 1, + "Heparin Stop Time": 100, + "Saline Bolus Volume": 200, + "Dialysate Temperature": 37, + "Blood Pressure Measurement Interval": 40, + "Rinseback Flow Rate": 100, + "Arterial Pressure Limit Low" : -30, + "Arterial Pressure Limit High" : 0, + "Blood Pressure Measure Interval" : 40, + "Rinseback Rate" : 100, + "Venous Pressure Limit High" : 590, + "Venous Pressure Limit Low": 560 +} + +#dictionary consist of slider values of treatment parameters +CREATE_TREATMENT_PARAMETER_RANGE = { + "Blood Flow Rate": [100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500], + "Dialysate Flow Rate": [100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600], + "Duration": [60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 240, 255, 270, 285, 300, 315, 330, 345, 360, 375, 390, 405, 420, 435, 450, 465, 480], + "Heparin Dispensing Rate": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 0], + "Heparin Bolus Volume": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 0], + "Heparin Stop Time": [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 0], + "Saline Bolus Volume": [100, 200, 300], + "Dialysate Temperature": [35.0, 35.5, 36.0, 36.5, 37.0], + "Blood Pressure Measurement Interval": [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 0], + "Rinseback Flow Rate": [50, 75, 100, 125, 150], +} + +#dictionary consist of slider minimum value, slider buffer value, width buffer of slider +CREATE_TREATMENT_SLIDER_VALUES = { + + "blood_flow_rate" : [100, 25, 46], + "dialysate_flow_rate" : [100, 50, 75], + "duration" : [60, 15, 26.6], + "heparin_dispensing_rate" : [0, 0.1, 75], + "heparin_bolus_volume" : [0, 0.1, 37], + "heparin_stop_time" : [0, 10, 15.9], + "saline_bolus" : [100, 100, 375], + "dialysate_temperature" : [35, 0.5, 187.5], + "arterial_pressure_limit_high" : [20, 10, 11.931], + "blood_pressure_measurement_interval" : [0, 5, 62], + "rinseback_flow_rate" : [50, 25, 187], +} + + +#ultrafilteration volume based on flow parameters. Python list contains Rotational speed, Motor speed, +# MC speed, MC current and PWM. +TREATMENT_ULTRAFILTRATION_FLOW_PARAMETERS = { + 0 : [100, 0, 0, 0, 0, 0, 0], + 1 : [220, 1.45, 1.45, 1.45, 1.45, 1.45, 1.45], + } + +#dictionary contains uf maximum and minimum value's to set. +TREATMENT_ULTRAFILTRATION_TESTING_OPTION = { + 0 : {"uf_maximum" : 600, "uf_minimum" : 0}, + 1 : {"uf_maximum" : 480, "uf_minimum" : 250}, + } + +#tst_pretreatment_screens +NUM_OF_PRETREATMENT_BULLETS = len(PRE_TREATMENT_SCREENS) + +#dictionary contains saline cumulative and saline delivered value +#key : saline cumulative value. +#value: saline delivered value +SALINE_BOLUS_VALUES = { + 0 : 0, + 1.0 : 1.0, + 125.56 : 100.56, + 165.87 : 145.87, + 220.65 : 220.65, + 325.25 : 300.25, + 400.86 : 380.86, + 500.00 : 500.25, + 634.76 : 634.76, + 823.65 : 800.65, + 999.99 : 999.99, + 1000 : 1000 +} + +#testing options for main treatment saline +SALINE_BOLUS_TARGET = [0, 1, 150, 155, 299, 300] #Boundary Value Analysis + +# pretreatment_patient_connection +SYSTOLIC_PRESSSURE_120 = 120 +SYSTOLIC_PRESSSURE_113 = 113 +SYSTOLIC_PRESSSURE_150 = 150 +SYSTOLIC_PRESSSURE_175 = 175 +SYSTOLIC_PRESSSURE_200 = 200 +SYSTOLIC_PRESSSURE_200 = 200 +SYSTOLIC_PRESSSURE_251 = 251 +SYSTOLIC_PRESSSURE_59 = 59 +SYSTOLIC_PRESSSURE_15 = 15 +DIASTOLIC_PRESSSURE_25 = 25 +DIASTOLIC_PRESSSURE_39 = 39 +DIASTOLIC_PRESSSURE_74 = 74 +DIASTOLIC_PRESSSURE_80 = 80 +DIASTOLIC_PRESSSURE_85 = 85 +DIASTOLIC_PRESSSURE_60 = 60 +DIASTOLIC_PRESSSURE_150 = 150 +DIASTOLIC_PRESSSURE_200 = 200 +DIASTOLIC_PRESSSURE_201 = 201 +HEART_RATE_VAL_39 = 39 +HEART_RATE_VAL_60 = 60 +HEART_RATE_VAL_70 = 70 +HEART_RATE_VAL_85 = 85 +HEART_RATE_VAL_100 = 100 +HEART_RATE_VAL_101 = 101 +HEART_RATE_VAL_110 = 110 +HEART_RATE_VAL_181 = 181 +HEART_RATE_VAL_200 = 200 +UF_MINIMUM_SLIDER_WIDTH = -2 +UF_MAXIMUM_SLIDER_WIDTH = 638.00 +UF_VALID_RANGE = 700 +TRAINING_INDICATOR_SCREEN = 4 +ULTRAFILTRATION_VOLUME_COMBINATION_FROM_ULTRAFILTRATION_SETUP_SCREEN = { + "OPTION_1" : {"uf_maximum" : 800, "uf_minimum" : 0}, + "OPTION_2" : {"uf_maximum" : 500, "uf_minimum" : 0}, + "OPTION_3" : {"uf_maximum" : 550, "uf_minimum" : 0}, + "OPTION_4" : {"uf_maximum" : 300, "uf_minimum" : 0}, + "OPTION_5" : {"uf_maximum" : 280, "uf_minimum" : 0}, + "OPTION_6" : {"uf_maximum" : 765, "uf_minimum" : 0}, + "OPTION_7" : {"uf_maximum" : 680, "uf_minimum" : 0}, + "OPTION_8" : {"uf_maximum" : 1500, "uf_minimum" : 0}, + "OPTION_9" : {"uf_maximum" : 390, "uf_minimum" : 0}, + "OPTION_10" : {"uf_maximum" : 800, "uf_minimum" : 0}, + "OPTION_11" : {"uf_maximum" : 1000, "uf_minimum" : 0}, + "OPTION_12" : {"uf_maximum" : 1250, "uf_minimum" : 0}, + } + + +#pre-treatment_priming +NOT_VISIBLE = False +VISIBLE = True +FOCUS = True +NOT_IN_FOCUS = False +TIME_OUT_DURATION_300 = 300 +TIME_OUT_DURATION_200 = 200 +TIME_OUT_DURATION_100 = 100 +COUNT_DOWN_TIME_100 = 100 +MINIMUM_COUNTDOWN_TIME = 0 +ENABLED = True +DISABLED = False +CONSUMABLE_SELF_TEST_BICARB_PUMP_CHECK_STATE = 3 + + +#pre-treatment_priming +NOT_VISIBLE = False +VISIBLE = True +FOCUS = True +NOT_IN_FOCUS = False +ACCEPTED = True +REJECTED = False + +#Filter Flush + +MAXIMUM_COUNTDOWN_TIME = 300 +MINIMUM_COUNTDOWN_TIME = 0 +TIME_OUT_DURATION_300 = 300 +TIME_OUT_DURATION_200 = 200 +TIME_OUT_DURATION_100 = 100 +COUNT_DOWN_TIME_100 = 100 +MINIMUM_COUNTDOWN_TIME = 0 +CONSUMABLE_SELF_TEST_BICARB_PUMP_CHECK_STATE = 3 + +VALID = True +INVALID = False + + +#post treatment review +BRIGHTNESS_MIN_VAL = 20 +BRIGHTNESS_MAX_VAL = 100 +VOLUME_MIN_VAL = 20 +VOLUME_MAX_VAL = 100 + +#dictionary consist of review parameters values of post treatment +POST_TREATMENT_REVIEW_PARAMETER_RANGE = { + "Patient ID": ["abcd", "xyz"], + "Heparin Stop": [0, 101], + "Device ID": [1234, 1234], + "Heparin Delivered Volume": [10.1, 10.5], + "Blood Flow Rate": [100, 125], + "Treatment Start DateTime": [1654519251, 1623382321], + "Dialysate Flow Rate": [100, 150], + "Treatment End DateTime": [1654519251, 1623382321], + "Treatment Duration": [70, 75], + "Water Sample Test Result": [0, 1], + "Actual Treatment Duration": [62, 126], + "Dialysate Volume Used": [4.0, 6.0], + "Acid ConcentrateType": [0, 1], + "Prescribed UF Volume": [0.3, 0.5], + "Bicarbonate Concentrate Type": [0, 0], + "Target UF Volume": [10.1, 10.5], + "Potassium Concentration": [60, 75], + "Actual UF Volume": [0.3, 0.5], + "Calcium Concentration": [3, 56], + "Prescribed UF Rate": [0.1, 0.55], + "Bicarbonate Concentration": [14, 50], + "Target UF Rate": [0.2, 0.56], + "Sodium Concentration": [4, 6], + "Actual UF Rate": [0.5, 0.6], + "Dialysate Temperature": [35.0, 35.5], + "Saline Bolus Volume": [300, 250], + "Dialyzer Type": [0, 1], + "Average Blood Flow": [54.3, 67.3], + "Heparin Type": [0, 0], + "Average Dialysate Flow": [0.6, 0.5], + "Average Dialysate Temp": [35.0, 35.5], + "Heparin Bolus Volume": [0.0, 0.1], + "Average Arterial Pressure": [0.0, 11.56], + "Heparin Dispense Rate": [0.0, 0.1], + "Average Venous Pressure": [20.0, 101.45], +} + + #standby mode GOODMORNING_START_TIME_SEC = 0 GOODEVENING_START_TIME_SEC = 43200 +NUM_OF_REQUEST_REJECT_REASONS = 46 #Number of settings change reject codes -#main-treatment heparin -NUM_OF_REQUEST_REJECT_REASONS = 46 Index: shared/scripts/configuration/strings.py =================================================================== diff -u -rb1f71b788540a259b19ed0ce19a2e8736be88b7a -rf89cb68bee65682b0641dc891dccba1bff5f575b --- shared/scripts/configuration/strings.py (.../strings.py) (revision b1f71b788540a259b19ed0ce19a2e8736be88b7a) +++ shared/scripts/configuration/strings.py (.../strings.py) (revision f89cb68bee65682b0641dc891dccba1bff5f575b) @@ -1,4 +1,6 @@ +# -*- coding: utf-8 -*- + ########################################################################### # # Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. @@ -8,19 +10,100 @@ # # @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 +#pretreatment_screen_bullets +PRE_TREATMENT_SCREENS = ["Create" , "Sample" , "Consumables" , "Disposables" , "Prime" , "Ultrafiltration" , "BP/HR" , "Connection" , "Start"] +POST_TREATMENT_SCREENS = ["Disconnection", "Review", "Disposables", "Disinfection"] +BLOOD_PRIMING_UNIT = "mL" +BLOOD_PRIMING_VALUE_0 = "0" +BLOOD_PRIMING_DEFAULT_VALUE = BLOOD_PRIMING_VALUE_0 + " " + BLOOD_PRIMING_UNIT + + +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" + + + +#tst_treatment_saline_data +SALINE_UNIT = "mL" +ACK_REQ_STATUS = 'Ack Req' +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" + 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 #main-treatment heparin +HEPARIN_TEXT = "HEPARIN" HEPARIN_UNIT = "mL" HEPARIN_DELIVERY_TEXT = "HEPARIN DELIVERY" HEPARIN_DELIVERY_OFF_TEXT = "OFF" @@ -31,10 +114,591 @@ 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" +HEPARIN_TYPE = "UFH 1,000 IU/mL" +ACID_CONCENTRATE = ["08-1251-1", "08-2251-0", "08-3251-9", "08-3251-9"] +BICARBONATE_CONCENTRATE = "Fres. Centrisol" +DIALYZER_TYPE = ["BB Diacap Pro 13H", "BB Diacap Pro 16H", "BB Diacap Pro 19H", "F Optiflux F160NRe", "F Optiflux F180NRe"] +TREATMENT_REVIEW_TITLE_TEXT = "Treatment Review" +EXPORT_TEXT = "Export" +CODE_TEXT = "Code: " +CODE_TEXT_AFTER_LOGGING = "Code: ..." + +POST_TREATMENT_REVIEW_SCREEN_UNITS = { + "Patient ID" : "", + "Heparin Bolus Volume": "mL", + "Heparin Stop" : "min", + "Heparin Dispense Rate" : "mL/hr", + "Heparin Bolus Volume" : "mL", + "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" : "", + "Heparin Type" : "", + "Heparin Concentration" : "IU/mL", + } + +#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: "HD RTC battery low.", + 8: "HD accelerometer failed POST.", + 9: "DG accelerometer failed POST." , + 10: "Alarm ID available for use.", + 11: "Alarm ID available for use.", + 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: "HD blood leak self test fault.", + 44: "User interface communication timeout.", + 45: "HD too many bad communications CRC.", + 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 transmit timeout.", + 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: "DG load cells FPGA read error.", + 91: "HD No dialysate flow data receive in the last 3 seconds.", + 92: "DG conductivity sensor bad status.", + 93: "DG outlet primary conductivity out of range.", + 94: "DG pressure out of range.", + 95: "DG watchdog expired.", + 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: "DG heat disinfect temperature gradient out of range.", + 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: "Unused.", + 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 zero command transmit timeout.", + 113: "HD blood leak zero command fault.", + 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 CAN message not acked.", + 118: "DG RTC config error.", + 119: "DG RTC battery low error.", + 120: "HD pre-treatment mode wet self-test prime check failure.", + 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 out of range.", + 144: "Alarm ID available for use.", + 145: "Concentrate conductivity after adding acid out of range alarm.", + 146: "DG RTC or timer accuracy failure.", + 147: "Wait for the DG to produce dialysate.", + 148: "Inlet water temperature too high.", + 149: "HD watchdog expired.", + 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: "Alarm ID available for use.", + 156: "Alarm ID available for use.", + 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: "DG comm too many bad CRCs.", + 162: "DG FPGA clock speed check failure.", + 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 RTC configuration error.", + 174: "HD RTC or timer accuracy failure.", + 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: ".", + 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: "Alarm ID available for use.", + 199: ".", + 200: "DG thermistors/sensors temperature out of range.", + 201: "HD pre-treatment mode wet self-test lc vs FMD failure.", + 202: "HD pre-treatment mode dry pressure normal self-test failure.", + 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: "Alarm ID available for use.", + 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 pressure self-test failure.", + 232: "HD pre-treatment mode wet self-test LC vs LC failure.", + 233: "Alarm ID available for use.", + 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: "HD load cells primary/back up drift out of range.", + 289: "DG dialysate or concentrate caps not closed.", + 290: "DG flow too low while heater is on." + } + +ALARM_PRIORITIES = {1: "LOW", 2: "MEDIUM", 3: "HIGH"} +ALARM_LIST_TITLE = "Alarm list" + +REJECTION_REASON = { 0: "No Active Alarm List", 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 @@ -80,9 +744,44 @@ 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 + 45: "REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN", #Concentrate cap open 46: "NUM_OF_REQUEST_REJECT_REASONS" # Number of settings change reject codes } - - - \ No newline at end of file + +#create custom treatment +PATIENT_ID = "demopatientid" +TREATMENT_TITLE = "Create a Custom Treatment" +HEPARIN_TYPE = "UFH 1,000 IU/mL" +ACID_CONCENTRATE = ["08-1251-1", "08-2251-0", "08-3251-9"] +BICARBONATE_CONCENTRATE = "Fres. Centrisol" +DIALYZER_TYPE = ["BB Diacap Pro 13H", "BB Diacap Pro 16H", "BB Diacap Pro 19H", "F Optiflux F160NRe", "F Optiflux F180NRe"] +CONFIRM_TREATMENT_TITLE = "Confirm Treatment" +PRESCRIPTION_TITLE = "PRESCRIPTION" +OPERATING_PARAMETERS_TITLE = "OPERATING PARAMETERS" +COLOR_CODES = {"Aqua": "#81ffff", "Blue": "#017dea", "Blue 2": "#1090d5", "Green": "#29fd2d", "Grey": "#d3d3d3", + "Lavender": "#db98f5", "Light Blue": "#acd7f1", "Light Teal": "#29f1da","Lime": "#b7fc36", + "Magenta":"#fd28fd", "Orange": "#f2721c", "Peach":"#f1979a", "Red": "#c53b33", "Rose":"#fc178d", + "Slate blue":"#7f7ffa", "Violet": "#6435c9", "White": "#ffffff", "Yellow": "#fcfc4d"} + +CURRENT_COLOR = '#000000' +COMPLETE_COLOR= '#4290ec' +ENABLED_COLOR = '#fcfcfc' +INCOMPLETE_COLOR = '#607a91' +PATIENT_ID_TEXT = "Patient ID" +BLOOD_FLOW_RATE = "Blood Flow Rate" +DIALYSATE_FLOW_RATE = "Dialysate Flow Rate" +DURATION = "Duration" +HEPARIN_DISPENSING_RATE = "Heparin Dispensing Rate" +HEPARIN_BOLUS_VOLUME = "Heparin Bolus Volume" +HEPARIN_STOP_TIME = "Heparin Stop Time" +SALINE_BOLUS_VOLUME = "Saline Bolus Volume" +HEPARIN_TYPE_TITLE = "Heparin Type" +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" + + Index: shared/scripts/configuration/utility.py =================================================================== diff -u -r2383588eef5e87099e1719356276aa5d12a48aeb -rf89cb68bee65682b0641dc891dccba1bff5f575b --- shared/scripts/configuration/utility.py (.../utility.py) (revision 2383588eef5e87099e1719356276aa5d12a48aeb) +++ shared/scripts/configuration/utility.py (.../utility.py) (revision f89cb68bee65682b0641dc891dccba1bff5f575b) @@ -6,48 +6,245 @@ # 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 names -import test +import os +import glob +import math +import object +import sys import squish -from configuration import config +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 + + +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 get_indicators(screen_obj, txt): + """ + 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 + @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(value) + squish.snooze(0.5) + if check_if_object_is_within_the_container(obj=value, container=container): + return True + else: + raise RuntimeError + except RuntimeError: + ScreenObj = squish.waitForObject(container) + screenHeight = pyInt(ScreenObj.height) + screenWidth = pyInt(ScreenObj.width) + 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 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 scroll_to_zone(zone=None, screen_object=None): +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): """ - 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 + 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: @@ -59,19 +256,253 @@ else: raise RuntimeError except RuntimeError: - ScreenObj = squish.waitForObject(screen_object) + ScreenObj = squish.findObject(screen_object) screenHeight = pyInt(ScreenObj.height) screenWidth = pyInt(ScreenObj.width) - squish.mouseWheel(ScreenObj, screenWidth-1000, screenHeight-10, 0, -50, squish.Qt.NoModifier) - + 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 + 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. @@ -81,7 +512,555 @@ 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 expected_heparin_value(val): - names.o_heparin_value["text"] = val - return names.o_heparin_value +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 + """ + try: + if '.' in num: + float(num) + return True + 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 + """ + try: + if num.isdigit(): + return True + 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: + current_date = get_current_date_and_time(date_format = "%Y_%m_%d") + latest_file = '/home/denali/Desktop/sd-card/log/'+current_date+'_denaliSquish.log' + 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. + """ + message = [] + count = 0 + try: + with open(file_name, 'r') as csv_file: + try: + for row in reversed(list(csv.reader(csv_file))): + if row[0].isalpha(): + pass + else: + row_length = sum(1 for values in row) + if row_length >= 4: + if row[3]!= None and row[3] == message_text: + if count == 30: + test.fail("handler unable to find message text from log file.") + message_length = sum(1 for values in row) + for column in range(4, message_length, 1): + message.append(row[column]) + count +=1 + for value in range(len(message)): + float_status = is_float(message[value]) + int_status = is_intiger(message[value]) + if float_status is True: + 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. + @return row[4] - (string) Negative requested acknowledgement value (Sq). + @return message_id - (string) formatted message id from log. + """ + try: + message_id = " ID" + with open(file_name, 'r') as csv_file: + try: + for row in reversed(list(csv.reader(csv_file))): + if row[0].isalpha(): + pass + else: + row_length = sum(1 for values in row) + if row_length == 6 and row[3] != message_text: + if row[5].split(':')[0] == message_id: + extracted_message_id = pyInt(row[5].split(':')[1], 16) + formatted_message_id = format(extracted_message_id, '#0x') + # MSG_ID_HD_DEBUG_EVENT (0xFFF1) and MSG_ID_DG_DEBUG_EVENT (0xFFF2) hex values are reversed in log. + string_format_id = str(formatted_message_id) + first_two_char = string_format_id[2:4] + last_two_char = string_format_id[-2:] + if last_two_char != '00': + return row[3], row[4], ('0x'+last_two_char+first_two_char) + else: + return row[3], row[4], formatted_message_id.replace("00", "") + else: + pass + except: + test.fail("application log data is corrupted - unable to fetch data") + 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. + """ + try: + with open(file_name, 'r') as csv_file: + try: + for row in reversed(list(csv.reader(csv_file))): + if row[0].isalpha(): + pass + else: + row_length = sum(1 for values in row) + if row_length >= 5: + if row[4] == ack_bak_value: + return row[3] + else: + pass + 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_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. + @return content_record - (list) list contains extracted data (ack_req, ack_bak, message, message_id). + """ + content_record = [] + file_name = get_extracted_file() + if message_text != None: + message = get_message_from_log(file_name, message_text) + content_record.append(message) + if message_ack != False: + ack_req_status, ack_req_value, message_id = get_ack_request_details(file_name, message_text) + ack_bak_value = ack_req_value.replace(":-", ":") # getting negative requested ack from positive requested ack + content_record.append(ack_req_status) + content_record.append(message_id.lower()) + if message_ack != False and ack_bak_value != None: + ack_bak_status = get_bak_request_details(file_name, ack_bak_value) + 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_main_treatment_heparin/test.py =================================================================== diff -u -r4dac665c981c03c0fd16b20090c82e6031d6cba2 -rf89cb68bee65682b0641dc891dccba1bff5f575b --- tst_main_treatment_heparin/test.py (.../test.py) (revision 4dac665c981c03c0fd16b20090c82e6031d6cba2) +++ tst_main_treatment_heparin/test.py (.../test.py) (revision f89cb68bee65682b0641dc891dccba1bff5f575b) @@ -11,11 +11,10 @@ from configuration import config, utility from dialin.ui import utils from dialin.ui.hd_simulator import HDSimulator -from configuration.utility import expected_heparin_value, rejection_msg +#from configuration.utility import expected_heparin_value, rejection_msg from dialin.ui.utils import waitForGUI +from dialin.common.hd_defs import PreTreatmentSubModes, HDOpModes, HDOpSubModes, TreatmentStates, HeparinStates - - HIGHER_RANGE = 20 STEP_VALUE = 1 LOWER_RANGE = 0 @@ -30,24 +29,24 @@ "STATE_6_HEPARIN DELIVERY_MESSAGE": "Syringe Empty"} hd_simulator = HDSimulator() -def verification_of_cumulative_value(expected_cumulative_value): +def verify_cumulative_value(expected_cumulative_value): """ - Verifying cumulative values from heparin delivery section. - @param expected_cumulative_value - (str) expected cumulative value. + Method to verify cumulative values from heparin delivery section. + @param expected_cumulative_value - (str) expected cumulative value. """ expected_cumulative_value =str(expected_cumulative_value).replace(".0","") heparin_value = waitForObjectExists(utility.expected_heparin_value(expected_cumulative_value)) - test.compare(heparin_value.text,expected_cumulative_value, utility.msg("Actual heparin cumulative value: {} should be equal to expected heparin cumulative value: {}".format(heparin_value.text, expected_cumulative_value))) + test.compare(heparin_value.text, expected_cumulative_value, utility.msg("Actual heparin cumulative value: {} should be equal to expected heparin cumulative value: {}".format(heparin_value.text, expected_cumulative_value))) def constants_for_cumulative_value(): """ - Method is used to verify the constants for cumulative value. + Method is used to verify the constants for cumulative value. """ test.startSection("Verifying Heparin State 3 HEPARIN_INITIAL_BOLUS values") test.log("Verifying Heparin State 3 -> Heparin bolus is active") - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state= 0, heparin_state= 3, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state= 0, treatment_stop_state=0, dialysis_state= 0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_INITIAL_BOLUS.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) test.compare(str(waitForObjectExists(names.o_state1_heparin_delivery_text).text), config.HEPARIN_DELIVERY_TEXT, utility.msg("Heparin Delivery Text should be {}".format(config.HEPARIN_DELIVERY_TEXT))) test.compare((waitForObjectExists(names.o_state1_heparin_delivery_text)).enabled, False, utility.msg("Heparin Delivery should be disabled")) initial_bolus_text = waitForObjectExists(names.o_state3_heparin_state_initial_bolus_text).text @@ -63,48 +62,46 @@ heparin_cumulative = format(heparin_cumulative/10, ".1f") heparin_cumulative = float(heparin_cumulative) hd_simulator.cmd_set_treatment_heparin_data(heparin_cumulative) - verification_of_cumulative_value(LOWER_RANGE) + verify_cumulative_value(LOWER_RANGE) utils.waitForGUI(1) elif 100 == LOWER_RANGE: verify_rejection_msg_id(False) - utils.waitForGUI(2) + utils.waitForGUI(1) verify_rejection_msg_id(True) test.log("Lower range works") - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state= 0, heparin_state= 3, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state= 0, treatment_stop_state=0, dialysis_state= 0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_INITIAL_BOLUS.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) heparin_cumulative = format(heparin_cumulative/10, ".1f") heparin_cumulative = float(heparin_cumulative) hd_simulator.cmd_set_treatment_heparin_data(heparin_cumulative) - verification_of_cumulative_value(LOWER_RANGE) + verify_cumulative_value(LOWER_RANGE) test.endSection() def heparin_stop_states_in_main_treatment(): """ - Verifying the heparin states when heparin cumulative is '0' at - HEPARIN STATE 0 -> HEPARIN_STATE_OFF - HEPARIN STATE 1 -> HEPARIN_STATE_STOPPED - HEPARIN STATE 5 -> HEPARIN_STATE_COMPLETED - HEPARIN STATE 6 -> HEPARIN_STATE_EMPTY + Method to verify the heparin states when heparin cumulative is '0' at + HEPARIN STATE 0 -> HEPARIN_STATE_OFF + HEPARIN STATE 1 -> HEPARIN_STATE_STOPPED + HEPARIN STATE 5 -> HEPARIN_STATE_COMPLETED + HEPARIN STATE 6 -> HEPARIN_STATE_EMPTY """ test.log("Verifying Heparin State 0 - HEPARIN_STATE_OFF") - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state= 0, heparin_state= 0, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state= 0, treatment_stop_state= 0, dialysis_state= 0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_OFF.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) test.compare(str(waitForObjectExists(names.o_state0_heparin_delivery_Off_text).text), config.HEPARIN_DELIVERY_OFF_TEXT, utility.msg("Heparin Delivery Text should be {}".format(config.HEPARIN_DELIVERY_TEXT))) test.compare((waitForObjectExists(names.o_state0_heparin_delivery_Off_text)).enabled, False, utility.msg("Heparin Delivery should be disabled")) test.log("Verifying Notification Message") test.compare(str(findObject(names.o_state0_heparin_delivery_Off_text).text ), config.HEPARIN_DELIVERY_OFF_TEXT, utility.msg("Notification Message should be {}".format(config.HEPARIN_DELIVERY_OFF_TEXT))) utils.waitForGUI(1) test.log("Verifying Heparin State 1 - HEPARIN_STATE_STOPPED") - - - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state=0, heparin_state= 1, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state=0, treatment_stop_state= 0, dialysis_state= 0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_STOPPED.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) test.compare(str(waitForObjectExists(names.o_state1_heparin_delivery_text).text), config.HEPARIN_DELIVERY_TEXT, utility.msg("Heparin Delivery Text should be {}".format(config.HEPARIN_DELIVERY_TEXT))) test.compare((waitForObjectExists(names.o_state1_heparin_delivery_text)).enabled, False, utility.msg("Heparin Delivery should be disabled")) test.log("Verifying Notification Message") @@ -115,21 +112,19 @@ heparin_pause_resume_states() test.log("Verifying Heparin State 5 - HEPARIN_STATE_COMPLETED") - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state=0, heparin_state= 5, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state=0, treatment_stop_state= 0, dialysis_state= 0) - + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_COMPLETED.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) test.compare(str(waitForObjectExists(names.o_state0_heparin_delivery_Off_text).text), config.HEPARIN_DELIVERY_OFF_TEXT, utility.msg("Heparin Delivery Text should be {}".format(config.HEPARIN_DELIVERY_TEXT))) test.compare((waitForObjectExists(names.o_state0_heparin_delivery_Off_text)).enabled, False, utility.msg("Heparin Delivery should be disabled")) test.log("Verifying Notification Message") test.compare(str(waitForObjectExists(names.o_state5_heparin_state_completed_text).text), config.HEPARIN_MAXIMUM_VOLUME_DELIVERED_TEXT, utility.msg("Notification Message should be {}".format(config.HEPARIN_MAXIMUM_VOLUME_DELIVERED_TEXT))) utils.waitForGUI(1) test.log("Verifying Heparin State 6 - HEPARIN_STATE_EMPTY") - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state=0, heparin_state= 6, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state=0, treatment_stop_state= 0, dialysis_state= 0) - + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_EMPTY.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) test.compare(str(waitForObjectExists(names.o_state6_heparin_state_empty_text).text), config.HEPARIN_SYRINGE_EMPTY_TEXT, utility.msg("Heparin Delivery Text should be {}".format(config.HEPARIN_DELIVERY_TEXT))) test.compare((waitForObjectExists(names.o_state6_heparin_state_empty_text)).enabled, True, utility.msg("Heparin Delivery should be disabled")) test.log("Verifying Notification Message") @@ -138,15 +133,15 @@ def heparin_pause_resume_states(): """ - Verifying pause/resume delivery when HEPARIN DELIVERY button is active or deactive using heparin states + Method to verify pause/resume delivery when HEPARIN DELIVERY button is active or deactive using heparin states HEPARIN STATE 2 -> HEPARIN_STATE_PAUSED HEPARIN STATE 4 -> HEPARIN_STATE_DISPENSING """ test.startSection("Verifying Heparin State ->2 HEPARIN_STATE_PAUSED") - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state=0, heparin_state= 2, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state=0, treatment_stop_state= 0, dialysis_state= 0) - hd_simulator.cmd_set_heparin_pause_resume_response(accepted = 1, reason = 0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_PAUSED.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) + hd_simulator.cmd_set_heparin_pause_resume_response(accepted=1, reason=0) test.compare(str(waitForObjectExists(names.o_state2_heparin_state_paused_text).text),config.HEPARIN_RESUME_DELIVERY_TEXT, utility.msg("Heparin Resume Delivery Text should be {}".format(config.HEPARIN_RESUME_DELIVERY_TEXT))) test.compare( waitForObjectExists(names.o_state2_heparin_state_paused_text).enabled, True, utility.msg("Resume Delivery Button is enabled")) mouseClick(waitForObject(names.o_state2_heparin_state_paused_text)) @@ -156,9 +151,9 @@ test.endSection() test.startSection("Verifying Heparin State ->4 HEPARIN_STATE_DISPENSING") - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state=0, heparin_state= 4, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state=0, treatment_stop_state= 0, dialysis_state= 0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=HeparinStates.HEPARIN_STATE_DISPENSING.value, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) test.compare(str(waitForObjectExists(names.o_state4_heparin_state_dispensing_text).text), config.HEPARIN_PAUSE_DELIVERY_TEXT, utility.msg("Heparin Pause Delivery Text should be {}".format(config.HEPARIN_PAUSE_DELIVERY_TEXT))) test.compare( waitForObjectExists(names.o_state4_heparin_state_dispensing_text).enabled , True, utility.msg("Pause Delivery Button is enabled")) mouseClick(waitForObject(names.o_state4_heparin_state_dispensing_text)) @@ -168,46 +163,43 @@ def verify_the_rejection_msg(reason_id): """ - Method to verify rejection messages - + Method to verify rejection messages """ test.startSection("Verifying Rejection Messages") rejection_msg = waitForObjectExists(utility.rejection_msg(text=config.REJECTION_REASON[reason_id])) test.compare(rejection_msg.text, config.REJECTION_REASON[reason_id], utility.msg("The rejection message should be {}".format(config.REJECTION_REASON[reason_id]))) test.endSection() def verify_rejection_messages_for_heparin_states(): - """ - Method to test current states and rejection messages + Method to test current states and rejection messages """ - test.startSection("Verifying test case scenario for rejection and acceptance in current state") for reason_id in range(1, (config.NUM_OF_REQUEST_REJECT_REASONS)): for state_id, state in HEPARIN_BUTTON_STATES.items(): - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state=0, heparin_state=state_id, - rinseback_state=0, recirculate_state=0, blood_prime_state=0, - treatment_end_state=0, treatment_stop_state=0, dialysis_state=0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=state_id, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) test.compare(str(waitForObjectExists(utility.expected_heparin_value(state)).text), state, utility.msg("{} text should be displayed".format(state))) hd_simulator.cmd_set_heparin_pause_resume_response(accepted=0, reason=reason_id) verify_the_rejection_msg(reason_id) hd_simulator.cmd_set_heparin_pause_resume_response(accepted=1, reason=reason_id) test.log("Verifying rejection message {} is not displayed".format(config.REJECTION_REASON[reason_id])) test.log("Verifying the current state of heparin button") test.compare(str(waitForObjectExists(utility.expected_heparin_value(state)).text), state, utility.msg("{} text should be displayed".format(state))) - msg = HEPARIN_STATE_MSGS["STATE_"+str(state_id)+"_"+state+"_MESSAGE"] + msg = HEPARIN_STATE_MSGS["STATE_" + str(state_id) + "_"+ state + "_MESSAGE"] test.compare(waitForObjectExists(utility.expected_heparin_value(msg)).text, msg, utility.msg("{} text should be displayed".format(msg))) hd_simulator.cmd_set_heparin_pause_resume_response(accepted=0, reason=reason_id+1) verify_the_rejection_msg(reason_id=reason_id+1) #changing the state - hd_simulator.cmd_set_treatment_states_data(sub_mode= 2, uf_state= 0, saline_state=0, heparin_state=state_id+1, - rinseback_state= 0, recirculate_state= 0, blood_prime_state= 0, - treatment_end_state=0, treatment_stop_state= 0, dialysis_state= 0) + hd_simulator.cmd_set_treatment_states_data(sub_mode=TreatmentStates.TREATMENT_DIALYSIS_STATE.value, uf_state=TreatmentStates.TREATMENT_START_STATE.value, saline_state=TreatmentStates.TREATMENT_START_STATE.value, heparin_state=state_id+1, + rinseback_state=TreatmentStates.TREATMENT_START_STATE.value, recirculate_state=TreatmentStates.TREATMENT_START_STATE.value, blood_prime_state=TreatmentStates.TREATMENT_START_STATE.value, + treatment_end_state=TreatmentStates.TREATMENT_START_STATE.value, treatment_stop_state=TreatmentStates.TREATMENT_START_STATE.value, dialysis_state=TreatmentStates.TREATMENT_START_STATE.value) if state_id == 6: break else: test.compare(str(waitForObjectExists(utility.expected_heparin_value(HEPARIN_BUTTON_STATES[state_id+1])).text), HEPARIN_BUTTON_STATES[state_id+1], utility.msg("{} text should be displayed".format(HEPARIN_BUTTON_STATES[state_id+1]))) - msg = HEPARIN_STATE_MSGS["STATE_"+str(state_id+1)+"_"+HEPARIN_BUTTON_STATES[state_id+1]+"_MESSAGE"] + msg = HEPARIN_STATE_MSGS["STATE_" + str(state_id+1) + "_"+ HEPARIN_BUTTON_STATES[state_id+1] + "_MESSAGE"] test.compare(waitForObjectExists(utility.expected_heparin_value(msg)).text, msg, utility.msg("{} text should be displayed".format(msg))) test.endSection()