From b0e3c8c6adcd7dab0184e43cd2397c4a2133d310 Mon Sep 17 00:00:00 2001 From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com> Date: Wed, 30 Oct 2024 00:24:10 -0700 Subject: [PATCH 1/5] Add AEDX and PulseOx monitoring for CPR --- .../breathing/functions/fnc_fullHealLocal.sqf | 1 + ...c_treatmentAdvanced_pulseoximeterLocal.sqf | 1 + ..._treatmentAdvanced_removePulseoximeter.sqf | 1 + addons/circulation/RscTitles.hpp | 343 ++++++++++++++++++ addons/circulation/XEH_PREP.hpp | 2 + addons/circulation/config.cpp | 1 + addons/circulation/defines.hpp | 24 +- .../functions/fnc_AEDX_ViewMonitor_CPR.sqf | 269 ++++++++++++++ addons/circulation/functions/fnc_CPRStart.sqf | 67 +++- .../functions/fnc_PulseOx_ViewMonitor.sqf | 34 ++ .../functions/fnc_fullHealLocal.sqf | 3 + addons/circulation/ui/AEDX_Monitor_Dialog.hpp | 4 +- addons/circulation/ui/kat_pulseox.paa | Bin 0 -> 43401 bytes 13 files changed, 745 insertions(+), 5 deletions(-) create mode 100644 addons/circulation/RscTitles.hpp create mode 100644 addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf create mode 100644 addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf create mode 100644 addons/circulation/ui/kat_pulseox.paa diff --git a/addons/breathing/functions/fnc_fullHealLocal.sqf b/addons/breathing/functions/fnc_fullHealLocal.sqf index 9791dd752..a9d16ce03 100644 --- a/addons/breathing/functions/fnc_fullHealLocal.sqf +++ b/addons/breathing/functions/fnc_fullHealLocal.sqf @@ -27,6 +27,7 @@ _patient setVariable [QGVAR(deepPenetratingInjury), false, true]; _patient setVariable [QGVAR(etco2Monitor), [], true]; _patient setVariable [QGVAR(breathRate), 15, true]; _patient setVariable [QGVAR(nasalCannula), false, true]; +_patient setVariable [QGVAR(pulseOxAttached), false, true]; if (ACEGVAR(advanced_fatigue,enabled)) then { ["kat_LSDF"] call ACEFUNC(advanced_fatigue,removeDutyFactor); diff --git a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf index 203156c3a..07c586ba7 100644 --- a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf +++ b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf @@ -29,6 +29,7 @@ _patient setVariable [QGVAR(PulseOximeter_VolumePatient), _medic getVariable QGV private _attachedPulseOximeter = _patient getVariable [QGVAR(PulseOximeter_Attached), [0,0]]; _attachedPulseOximeter set [(ALL_BODY_PARTS find toLower _bodyPart)-2,1]; _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, true]; +_patient setVariable [QGVAR(pulseOxAttached), true, true]; [{ params ["_args", "_idPFH"]; diff --git a/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf b/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf index c7dc09c8f..4a50f050d 100644 --- a/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf +++ b/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf @@ -24,5 +24,6 @@ _medic setVariable [QGVAR(PulseOximeter_Volume), _patient getVariable QGVAR(Puls private _attachedPulseOximeter = _patient getVariable [QGVAR(PulseOximeter_Attached), [0,0]]; _attachedPulseOximeter set [(ALL_BODY_PARTS find toLower _bodyPart)-2,0]; _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, true]; +_patient setVariable [QGVAR(pulseOxAttached), false, true]; [_medic, "kat_Pulseoximeter", 1] call ACEFUNC(common,addToInventory); diff --git a/addons/circulation/RscTitles.hpp b/addons/circulation/RscTitles.hpp new file mode 100644 index 000000000..818c75dac --- /dev/null +++ b/addons/circulation/RscTitles.hpp @@ -0,0 +1,343 @@ +#include "defines.hpp" + +#define pixelW (1 / (getResolution select 2)) +#define pixelH (1 / (getResolution select 3)) +#define pixelScale 0.50 + +// pixel grids macros +#define UI_GRID_W (pixelW * pixelGridBase) +#define UI_GRID_H (pixelH * pixelGridBase) + +#define SAFEZONE_X_RIGHTEDGE ((safeZoneX - 1) * -1) +#define SAFEZONE_Y_LOWEDGE ((safeZoneY - 1) * -1) + +#define FRAME_W(N) ((UI_GRID_W * (N)) * (1.7777 / (getResolution select 4))) +#define FRAME_H(N) ((UI_GRID_H * (N))) + +class RscText; +class RscPicture; +class RscTitles +{ + class CPR_PulseOx + { + idd = 22835; + enableSimulation = 1; + movingEnable = 0; + fadeIn=0; + fadeOut=1; + duration = 10e10; + onLoad = "uiNamespace setVariable ['kat_pulseox', _this select 0];"; + class controls + { + class KatPulseOxIcon: RscPicture + { + idc = 22801; + text = "\x\kat\addons\circulation\UI\kat_pulseox.paa"; + x = QUOTE(0.5 - (FRAME_W(25) / 2)); + y = QUOTE(0.5 - (FRAME_H(45) / 2)); + w = QUOTE(FRAME_W(30)); + h = QUOTE(FRAME_H(30)); + }; + class KatPulseOxSpo2: RscText + { + idc = 22802; + x = QUOTE(0.5 - (FRAME_W(1) / 2)); + y = QUOTE(0.5 - (FRAME_H(25) / 2)); + w = QUOTE(FRAME_W(10)); + h = QUOTE(FRAME_H(10)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 1.7 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.8,0.8,0,1}; + text = "O2"; + }; + class KatPulseOxHR: KatPulseOxSpo2 + { + idc = 22803; + x = QUOTE(0.5 + (FRAME_W(7) / 2)); + text = "HR"; + }; + }; + }; + + class CPR_AED_X + { + idd = IDC_AEDX_MONITOR_TITLE; + movingEnable = 0; + fadeIn=0; + fadeOut=1; + duration = 10e10; + onLoad = "uiNamespace setVariable ['KAT_Circulation_AEDX_Monitor_Display', _this select 0];"; + objects[] = {}; + + class ControlsBackground { + class BlackBackground_Title: RscText { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(450)); + y = QUOTE(KAT_pxToScreen_Y(290)); + w = QUOTE(KAT_pxToScreen_W(1062)); + h = QUOTE(KAT_pxToScreen_H(824)); + type = 0; + style = 80; + colorBackground[] = {0,0,0,1}; + colorText[] = {0,0,0,1}; + text = ""; + }; + class Background: BlackBackground_Title {}; + class EKG_Title: RscPicture { + idc = IDC_EKG_DISPLAY_TITLE; + x = QUOTE(KAT_pxToScreen_X(475)); + y = QUOTE(KAT_pxToScreen_Y(234)); + w = QUOTE(KAT_pxToScreen_W(1024)); + h = QUOTE(KAT_pxToScreen_H(1024)); + type = 0; + style = 48; + size = 0; + colorBackground[] = {0,0,0,1}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\ekg_off.paa); + }; + class EKGSlider_Title: RscPicture { + idc = IDC_EKG_SLIDER_TITLE; + x = QUOTE(KAT_pxToScreen_X(250)); + y = QUOTE(KAT_pxToScreen_Y(426)); + w = QUOTE(KAT_pxToScreen_W(256)); + h = QUOTE(KAT_pxToScreen_H(256)); + type = 0; + style = 48; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\ekg_slider.paa); + }; + class HeartRateVitalsDisplayBackground_Title: RscText { + idc = IDC_DISPLAY_HEARTRATE_TEXT_TITLE; + x = QUOTE(KAT_pxToScreen_X(552)); + y = QUOTE(KAT_pxToScreen_Y(866)); + w = QUOTE(KAT_pxToScreen_W(190)); + h = QUOTE(KAT_pxToScreen_H(30)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 0.6 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0.77,0.96,0.32,1}; + colorText[] = {0,0,0,1}; + text = "HR"; + }; + class HeartRateVitalsDisplayBackgroundText_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "bpm"; + }; + class BloodPressureVitalsDisplayBackground_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(746)); + w = QUOTE(KAT_pxToScreen_W(260)); + colorBackground[] = {0.04,0.96,0.98,1}; + colorText[] = {0,0,0,1}; + text = "NIBP"; + }; + class BloodPressureVitalsDisplayBackgroundText_Title: BloodPressureVitalsDisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "mmHg"; + }; + class BloodPressureVitalsDisplayLine_Title: RscText + { + idc = -1; + style = 2; + x = QUOTE(KAT_pxToScreen_X(760)); + y = QUOTE(KAT_pxToScreen_Y(979)); + w = QUOTE(KAT_pxToScreen_W(120)); + h = QUOTE(KAT_pxToScreen_H(3)); + colorBackground[] = {0.04,0.96,0.98,1}; + colorText[] = {1,1,1,1}; + text = ""; + }; + class RespirationRateDisplayBackground_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(1010)); + colorBackground[] = {0.73,0.02,0.74,1}; + colorText[] = {0,0,0,1}; + text = "Resp"; + }; + class RespirationRateDisplayBackgroundText_Title: RespirationRateDisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "/min"; + }; + class SpO2DisplayBackground_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(1204)); + colorBackground[] = {0.99,0.97,0.02,1}; + colorText[] = {0,0,0,1}; + text = "SpO2"; + }; + class SpO2DisplayBackgroundText_Title: SpO2DisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "%"; + }; + class SpO2PulseRateDisplayBorder_Title: RscText { + idc = IDC_DISPLAY_PULSERATEBORDER_TITLE; + x = QUOTE(KAT_pxToScreen_X(1366)); + y = QUOTE(KAT_pxToScreen_Y(907)); + w = QUOTE(KAT_pxToScreen_W(26)); + h = QUOTE(KAT_pxToScreen_H(80)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 0.6 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0.99,0.97,0.02,1}; + colorText[] = {0,0,0,0}; + text = ""; + show = 0; + }; + class SpO2PulseRateDisplayBackground_Title: SpO2PulseRateDisplayBorder_Title { + idc = IDC_DISPLAY_PULSERATEBG_TITLE; + x = QUOTE(KAT_pxToScreen_X(1368)); + y = QUOTE(KAT_pxToScreen_Y(910)); + w = QUOTE(KAT_pxToScreen_W(20)); + h = QUOTE(KAT_pxToScreen_H(74)); + colorBackground[] = {0,0,0,1}; + }; + class SpO2PulseRateDisplayBar_Title: SpO2PulseRateDisplayBorder_Title { + idc = IDC_DISPLAY_PULSERATEDSPBAR_TITLE; + x = QUOTE(KAT_pxToScreen_X(1370)); + y = QUOTE(KAT_pxToScreen_Y(911)); + w = QUOTE(KAT_pxToScreen_W(17)); + h = QUOTE(KAT_pxToScreen_H(71)); + }; + class SpO2PulseRateDisplayBarB_Title: SpO2PulseRateDisplayBar_Title { + idc = IDC_DISPLAY_PULSERATEBAR_TITLE; + colorBackground[] = {0,0,0,1}; + }; + class HeartRateDisplay_Title: RscText { + idc = IDC_DISPLAY_HEARTRATE_TITLE; + x = QUOTE(KAT_pxToScreen_X(552)); + y = QUOTE(KAT_pxToScreen_Y(896)); + w = QUOTE(KAT_pxToScreen_W(190)); + h = QUOTE(KAT_pxToScreen_H(80)); + type = 0; + style = 2; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 2.5 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.77,0.96,0.32,1}; + text = "---"; + }; + class TopBloodPressureDisplay_Title: HeartRateDisplay_Title { + idc = IDC_DISPLAY_BLOODPRESSURE_T_TITLE; + style = 1; + x = QUOTE(KAT_pxToScreen_X(760)); + w = QUOTE(KAT_pxToScreen_W(120)); + h = QUOTE(KAT_pxToScreen_H(70)); + sizeEx = QUOTE(KAT_GRID_H * 1.8 * (0.55 / (getResolution select 5))); + colorText[] = {0.04,0.96,0.98,1}; + text = "---"; + }; + class BottomBloodPressureDisplay_Title: TopBloodPressureDisplay_Title { + idc = IDC_DISPLAY_BLOODPRESSURE_B_TITLE; + y = QUOTE(KAT_pxToScreen_Y(990)); + colorText[] = {0.04,0.96,0.98,1}; + text = "---"; + }; + class MeanBloodPressureDisplay_Title: TopBloodPressureDisplay_Title { + idc = IDC_DISPLAY_BLOODPRESSURE_M_TITLE; + x = QUOTE(KAT_pxToScreen_X(910)); + w = QUOTE(KAT_pxToScreen_W(100)); + h = QUOTE(KAT_pxToScreen_H(60)); + sizeEx = QUOTE(KAT_GRID_H * 1.1 * (0.55 / (getResolution select 5))); + colorText[] = {0.04,0.96,0.98,1}; + text = ""; + }; + class RespirationRateDisplay_Title: HeartRateDisplay_Title { + idc = IDC_DISPLAY_RESP_TITLE; + x = QUOTE(KAT_pxToScreen_X(1010)); + h = QUOTE(KAT_pxToScreen_H(120)); + sizeEx = QUOTE(KAT_GRID_H * 0.7 * (0.55 / (getResolution select 5))); + colorText[] = {0.73,0.02,0.74,1}; + text = "Resp off"; + }; + class SpO2Display_Title: HeartRateDisplay_Title { + idc = IDC_DISPLAY_SPO2_TITLE; + x = QUOTE(KAT_pxToScreen_X(1200)); + w = QUOTE(KAT_pxToScreen_W(170)); + colorText[] = {0.99,0.97,0.02,1}; + text = "---"; + }; + class DateAndTime_Title: RscText { + idc = IDC_DISPLAY_DATEANDTIME_TITLE; + x = QUOTE(KAT_pxToScreen_X(505)); + y = QUOTE(KAT_pxToScreen_Y(318)); + w = QUOTE(KAT_pxToScreen_W(400)); + h = QUOTE(KAT_pxToScreen_H(40)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 0.8 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = "00/00/0000 00:00"; + }; + class Battery_Title: RscPicture { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(1256)); + y = QUOTE(KAT_pxToScreen_Y(322)); + w = QUOTE(KAT_pxToScreen_W(64)); + h = QUOTE(KAT_pxToScreen_H(64)); + style = 48; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\battery.paa); + }; + class ElapsedTime_Title: DateAndTime_Title { + idc = IDC_DISPLAY_ELAPSEDTIME_TITLE; + x = QUOTE(KAT_pxToScreen_X(1335)); + w = QUOTE(KAT_pxToScreen_W(130)); + style = 2; + text = "00:00:00"; + }; + class AEDBackground_Title: RscPicture { + idc = -1; + x = QUOTE(KAT_GUI_GRID_X); + y = QUOTE(KAT_pxToScreen_Y(-300)); + w = QUOTE(KAT_GUI_GRID_W); + h = QUOTE(KAT_GUI_GRID_H); + type = 0; + style = 48; + font = "TahomaB"; + size = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\zoll.paa); + }; + class ShockButton_Title: RscPicture { + idc = IDC_SHOCKBUTTON; + x = QUOTE(KAT_pxToScreen_X(1487)); + y = QUOTE(KAT_pxToScreen_Y(1080)); + w = QUOTE(KAT_pxToScreen_W(256)); + h = QUOTE(KAT_pxToScreen_H(256)); + style = 48; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\shockbutton.paa); + show = 0; + }; + }; + }; +}; diff --git a/addons/circulation/XEH_PREP.hpp b/addons/circulation/XEH_PREP.hpp index a207e6fc7..46ae44a37 100644 --- a/addons/circulation/XEH_PREP.hpp +++ b/addons/circulation/XEH_PREP.hpp @@ -9,6 +9,7 @@ PREP(AEDX_DisconnectVitalsMonitor); PREP(AEDX_ViewMonitor_AnalyzeFeedback); PREP(AEDX_ViewMonitor_Charging); PREP(AEDX_ViewMonitor_Condition); +PREP(AEDX_ViewMonitor_CPR); PREP(AEDX_ViewMonitor); PREP(AEDX_VitalsMonitor_CheckCondition); PREP(AEDX_VitalsMonitor); @@ -45,6 +46,7 @@ PREP(placeAED); PREP(removeLog); PREP(showBloodGas); PREP(treatmentAdvanced_IV); +PREP(PulseOx_ViewMonitor); PREP(updateBloodPressureChange); PREP(updateHeartRate); PREP(updateInternalBleeding); diff --git a/addons/circulation/config.cpp b/addons/circulation/config.cpp index 9a681577f..20b716de7 100644 --- a/addons/circulation/config.cpp +++ b/addons/circulation/config.cpp @@ -62,6 +62,7 @@ class CfgPatches { }; }; +#include "RscTitles.hpp" #include "CfgFunctions.hpp" #include "CfgMoves.hpp" #include "CfgEventHandlers.hpp" diff --git a/addons/circulation/defines.hpp b/addons/circulation/defines.hpp index af16c3936..f06aede78 100644 --- a/addons/circulation/defines.hpp +++ b/addons/circulation/defines.hpp @@ -60,4 +60,26 @@ #define IDC_CHARGE_BAR_100 70057 #define IDC_CHARGE_BAR_120 70058 #define IDC_CHARGE_BAR_150 70059 -#define IDC_CHARGE_BAR_200 70060 \ No newline at end of file +#define IDC_CHARGE_BAR_200 70060 + +#define IDC_AEDX_MONITOR_TITLE 71000 +#define IDC_EKG_SLIDER_TITLE 71001 +#define IDC_DISPLAY_HEARTRATE_TITLE 71002 +#define IDC_DISPLAY_HEARTRATE_TEXT_TITLE 71003 +#define IDC_DISPLAY_BLOODPRESSURE_T_TITLE 71004 +#define IDC_DISPLAY_BLOODPRESSURE_B_TITLE 71005 +#define IDC_DISPLAY_BLOODPRESSURE_M_TITLE 71006 +#define IDC_DISPLAY_RESP_TITLE 71007 +#define IDC_DISPLAY_SPO2_TITLE 71008 +#define IDC_DISPLAY_PULSERATEBORDER_TITLE 71009 +#define IDC_DISPLAY_PULSERATEBG_TITLE 71010 +#define IDC_DISPLAY_PULSERATEDSPBAR_TITLE 71011 +#define IDC_DISPLAY_PULSERATEBAR_TITLE 71012 +#define IDC_DISPLAY_DATEANDTIME_TITLE 71013 +#define IDC_DISPLAY_ELAPSEDTIME_TITLE 71014 +#define IDC_EKG_DISPLAY_TITLE 71015 +#define IDC_EKG_DISPLAY_MIDTEXT_TITLE 71016 +#define IDC_SHOCKBUTTON_TITLE 71017 +#define IDC_AEDMODE_MSG_BG_TITLE 71018 +#define IDC_AEDMODE_MSG_TOP_TITLE 71019 +#define IDC_AEDMODE_MSG_TITLE 71020 \ No newline at end of file diff --git a/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf b/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf new file mode 100644 index 000000000..ece1083e6 --- /dev/null +++ b/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf @@ -0,0 +1,269 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Blue + * Open AED-X Vitals Monitor dialog + * + * Arguments: + * 0: Medic + * 1: Target + * + * Return Value: + * None + * + * Example: + * [player, cursorTarget, 1] call kat_circulation_fnc_AEDX_ViewMonitor; + * + * Public: No + */ + +params ["_medic", "_target"]; + +GVAR(AEDX_MonitorTarget_Title) = _target; +GVAR(PulseRateReady) = true; + +private _dlg = uiNamespace getVariable ["KAT_Circulation_AEDX_Monitor_Display", displayNull]; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg"]; + + if !(GVAR(CPRDisplayActive)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _slider = _dlg displayCtrl IDC_EKG_SLIDER_TITLE; + + _slider ctrlSetPosition [KAT_pxToScreen_X(250), (ctrlPosition _slider) select 1, (ctrlPosition _slider) select 2, (ctrlPosition _slider) select 3]; + _slider ctrlCommit 0; + + _slider ctrlSetPosition [KAT_pxToScreen_X(1460), (ctrlPosition _slider) select 1, (ctrlPosition _slider) select 2, (ctrlPosition _slider) select 3]; + _slider ctrlCommit 4; +}, 4, [_dlg]] call CBA_fnc_addPerFrameHandler; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg", "_target"]; + + if !(GVAR(CPRDisplayActive)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _pads = false; + + if !(GVAR(AEDX_MonitorTarget_Title) isEqualTo objNull) then { + _pads = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(DefibrillatorPads_Connected), false]; + }; + + if !(_pads) then { + (_dlg displayCtrl IDC_EKG_DISPLAY_MIDTEXT_TITLE) ctrlSetText (LLSTRING(AEDX_Monitor_CheckPads)); + (_dlg displayCtrl IDC_EKG_DISPLAY_TITLE) ctrlSetText (QPATHTOF(ui\ekg_off.paa)); + } else { + (_dlg displayCtrl IDC_EKG_DISPLAY_MIDTEXT_TITLE) ctrlSetText ""; + private _ekgDisplay = QPATHTOF(ui\ekg_off.paa); + + if !(GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,CPR_provider), objNull] isEqualTo objNull) then { + _ekgDisplay = QPATHTOF(ui\ekg_cpr.paa); + } else { + if (!(GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(heartRestart), false]) && alive GVAR(AEDX_MonitorTarget_Title)) then { + switch (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0]) do { + case 4: {_ekgDisplay = QPATHTOF(ui\ekg_vt.paa);}; + case 3: {_ekgDisplay = QPATHTOF(ui\ekg_vf.paa);}; + case 2: {_ekgDisplay = QPATHTOF(ui\ekg_sinus.paa);}; + case 1: {_ekgDisplay = QPATHTOF(ui\ekg_asystole.paa);}; + default { + if ((GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,inCardiacArrest), false] && !(GVAR(AdvRhythm))) || !(alive GVAR(AEDX_MonitorTarget_Title))) then { + _ekgDisplay = QPATHTOF(ui\ekg_asystole.paa); + } else { + private _hr = 0; + if (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0] isEqualTo 2) then { + _hr = GVAR(AEDX_MonitorTarget_Title) call FUNC(getCardiacArrestHeartRate); + } else { + _hr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + }; + + switch (true) do { + case (_hr > 130): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_130.paa);}; + case (_hr > 110 && _hr < 130): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_120.paa);}; + case (_hr > 90 && _hr < 110): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_100.paa);}; + case (_hr > 70 && _hr < 90): {_ekgDisplay = QPATHTOF(ui\ekg_sinus.paa);}; + case (_hr > 50 && _hr < 70): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_60.paa);}; + case (_hr > 0): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_40.paa);}; + default { + _ekgDisplay = QPATHTOF(ui\ekg_asystole.paa); + }; + }; + }; + }; + }; + } else { + _ekgDisplay = QPATHTOF(ui\ekg_asystole.paa); + }; + }; + + (_dlg displayCtrl IDC_EKG_DISPLAY_TITLE) ctrlSetText (_ekgDisplay); + }; + + // Handle date and time display - [year,month,day,hour,min] + + (_dlg displayCtrl IDC_DISPLAY_DATEANDTIME_TITLE) ctrlSetText (format ["%1/%2/%3 %4:%5", (["", "0"] select (date select 2 < 10)) + str (date select 2), (["", "0"] select (date select 1 < 10)) + str (date select 1), date select 0, (["", "0"] select (date select 3 < 10)) + str (date select 3), (["", "0"] select (date select 4 < 10)) + str (date select 4)]); + (_dlg displayCtrl IDC_DISPLAY_ELAPSEDTIME_TITLE) ctrlSetText (format ["%1:%2:%3", (["", "0"] select (floor time / 3600 < 10)) + str (floor(time/3600)), (["", "0"] select (floor time / 3600 - floor time / 3600 * 60 < 10)) + str (floor(((time/3600) - floor(time/3600)) * 60)), (["", "0"] select (floor time / 60 - floor time / 60 * 60 < 10)) + str (floor(((time/60) - floor(time/60)) * 60))]); + + if (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) then { + private _partIndex = ((GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Provider), [-1, -1, -1]]) select 2); + + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBORDER_TITLE) ctrlShow true; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBG_TITLE) ctrlShow true; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEDSPBAR_TITLE) ctrlShow true; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBAR_TITLE) ctrlShow true; + + private _PRBar = _dlg displayCtrl IDC_DISPLAY_PULSERATEBAR_TITLE; + + if (!(HAS_TOURNIQUET_APPLIED_ON(GVAR(AEDX_MonitorTarget_Title),_partIndex))) then { + if (GVAR(PulseRateReady)) then { + GVAR(PulseRateReady) = false; + private _pr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + + if (_pr > 0) then { + private _delay = 60/_pr; + + private _randomHigh = round(random [2, 2, 3]); + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(_randomHigh)]; + _PRBar ctrlCommit (0.2 max (_delay/4)); + + [{ + params ["_PRBar", "_delay"]; + + private _randomMid = round(random [24, 25, 29]); + + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(_randomMid)]; + _PRBar ctrlCommit 0.1; + + [{ + params ["_PRBar", "_delay"]; + + private _randomLow = round(random [67, 68, 70]); + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(_randomLow)]; + _PRBar ctrlCommit (0.2 max (_delay/2)); + }, [_PRBar, _delay], 0.1] call CBA_fnc_waitAndExecute; + }, [_PRBar, _delay], (0.2 max (_delay/3))] call CBA_fnc_waitAndExecute; + + [{ + GVAR(PulseRateReady) = true; + }, [], _delay] call CBA_fnc_waitAndExecute; + } else { + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(71)]; + _PRBar ctrlCommit 0.1; + + [{ + GVAR(PulseRateReady) = true; + }, [], 0.1] call CBA_fnc_waitAndExecute; + }; + }; + } else { + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(71)]; + _PRBar ctrlCommit 0; + }; + } else { + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBORDER_TITLE) ctrlShow false; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBG_TITLE) ctrlShow false; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEDSPBAR_TITLE) ctrlShow false; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBAR_TITLE) ctrlShow false; + }; +}, 0, [_dlg, _target]] call CBA_fnc_addPerFrameHandler; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg"]; + + private _pads = false; + private _vitalsMonitor = false; + + if !(GVAR(AEDX_MonitorTarget_Title) isEqualTo objNull) then { + _pads = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(DefibrillatorPads_Connected), false]; + _vitalsMonitor = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]; + }; + + private _hr = 0; + private _pr = 0; + private _bp = [0,0]; + private _spO2 = 0; + + if !(GVAR(CPRDisplayActive)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + if (!_pads && !_vitalsMonitor) exitWith { + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_T_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_B_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_M_TITLE) ctrlSetText ""; + (_dlg displayCtrl IDC_DISPLAY_SPO2_TITLE) ctrlSetText "---"; + }; + + if !(GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,CPR_provider), objNull] isEqualTo objNull) then { + + private _rhythmHR = 0; + + if(GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0] > 0) then { + _rhythmHR = GVAR(AEDX_MonitorTarget_Title) call FUNC(getCardiacArrestHeartRate); + } else { + _rhythmHR = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + }; + + _hr = random [100, 100 + _rhythmHR / 2, _rhythmHR]; + + if (GVAR(AED_X_VitalsMonitor_BloodPressureInterval) > 0) then { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(StoredBloodPressure), [0,0]]; + } else { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,bloodPressure), [0,0]]; + }; + } else { + if !(GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(heartRestart), false]) then { + if (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0] > 0) then { + _hr = GVAR(AEDX_MonitorTarget_Title) call FUNC(getCardiacArrestHeartRate); + + if (GVAR(AED_X_VitalsMonitor_BloodPressureInterval) > 0) then { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(StoredBloodPressure), [0,0]]; + }; + } else { + _hr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + + if (GVAR(AED_X_VitalsMonitor_BloodPressureInterval) > 0) then { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(StoredBloodPressure), [0,0]]; + } else { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,bloodPressure), [0,0]]; + }; + }; + }; + }; + + private _partIndex = ((GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Provider), [-1, -1, -1]]) select 2); + + if (HAS_TOURNIQUET_APPLIED_ON(GVAR(AEDX_MonitorTarget_Title),_partIndex)) then { + _bp = [0,0]; + } else { + _spO2 = GET_SPO2(GVAR(AEDX_MonitorTarget_Title)); + _pr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + }; + + if (_pads) then { + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TITLE) ctrlSetText (format["%1", round(_hr)]); + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TEXT_TITLE) ctrlSetText (LLSTRING(AEDX_Monitor_HR)); + } else { + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TITLE) ctrlSetText (format["%1", round(_pr)]); + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TEXT_TITLE) ctrlSetText (LLSTRING(AEDX_Monitor_PR)); + }; + + if (_vitalsMonitor) then { + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_T_TITLE) ctrlSetText (format["%1", round(_bp select 1)]); + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_B_TITLE) ctrlSetText (format["%1", round(_bp select 0)]); + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_M_TITLE) ctrlSetText (format["(%1)", round(((_bp select 1) - (_bp select 0))/3 + (_bp select 0))]); + (_dlg displayCtrl IDC_DISPLAY_SPO2_TITLE) ctrlSetText (format["%1", round(_spO2)]); + } else { + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_T_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_B_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_M_TITLE) ctrlSetText ""; + (_dlg displayCtrl IDC_DISPLAY_SPO2_TITLE) ctrlSetText "---"; + }; +}, 1, [_dlg]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/circulation/functions/fnc_CPRStart.sqf b/addons/circulation/functions/fnc_CPRStart.sqf index 4d983776f..64812f858 100644 --- a/addons/circulation/functions/fnc_CPRStart.sqf +++ b/addons/circulation/functions/fnc_CPRStart.sqf @@ -22,6 +22,9 @@ _patient setVariable [QACEGVAR(medical,CPR_provider), _medic, true]; _medic setVariable [QGVAR(isPerformingCPR), true, true]; GVAR(CPRTarget) = _patient; +GVAR(CPRProvider) = _medic; +GVAR(CPRDisplayActive) = false; +GVAR(PulseOxDisplay) = false; GVAR(CPRCancel_EscapeID) = [0x01, [false, false, false], { GVAR(CPRTarget) setVariable [QACEGVAR(medical,CPR_provider), objNull, true]; @@ -31,6 +34,17 @@ GVAR(CPRCancel_MouseID) = [0xF0, [false, false, false], { GVAR(CPRTarget) setVariable [QACEGVAR(medical,CPR_provider), objNull, true]; }, "keydown", "", false, 0] call CBA_fnc_addKeyHandler; +GVAR(CPRDevice_Iterate) = [0xF1, [false, false, false], { + private _deviceCode = GVAR(CPRTarget) getVariable [QGVAR(deviceCode), 0]; + _deviceCode = [(_deviceCode + 1), 1] select (_deviceCode == 3); + private _deviceArray = [true,(GVAR(CPRTarget) getVariable [QEGVAR(breathing,pulseOxAttached), false]),((GVAR(CPRTarget) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (GVAR(CPRTarget) getVariable [QGVAR(DefibrillatorPads_Connected), false])),(GVAR(CPRTarget) getVariable [QGVAR(watchAvailable), false])]; + while { !(_deviceArray select _deviceCode) } do { + _deviceCode = [0, (_deviceCode + 1)] select (_deviceCode < 3); + }; + GVAR(CPRTarget) setVariable [QGVAR(deviceCode), _deviceCode, true]; + true +}, "keydown", "", false, 0] call CBA_fnc_addKeyHandler; + private _CPRStartTime = CBA_missionTime + 2.5; ACEGVAR(medical_gui,pendingReopen) = false; // Prevent medical menu from reopening @@ -47,10 +61,60 @@ if (_notInVehicle) then { loopCPR = true; }; +[{ + params ["_args", "_idPFH"]; + _args params ["_medic", "_patient"]; + + private _deviceCode = _patient getVariable [QGVAR(deviceCode), 0]; + + if ((_patient getVariable [QACEGVAR(medical,CPR_provider), objNull]) isEqualTo objNull) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + GVAR(CPRDisplayActive) = false; + GVAR(PulseOxDisplay) = false; + + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + _patient setVariable [QGVAR(deviceCode), 0, true]; + }; + + switch (true) do { + case (_deviceCode == 3): { + GVAR(CPRDisplayActive) = false; + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + }; + case (_deviceCode == 2): { + if ((_patient getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false])) then { + if !(GVAR(CPRDisplayActive)) then { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + "CPR_MONITOR" cutRsc ["CPR_AED_X", "PLAIN", 0, true]; + GVAR(CPRDisplayActive) = true; + [_medic, GVAR(CPRTarget)] call FUNC(AEDX_ViewMonitor_CPR); + }; + } else { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + GVAR(CPRDisplayActive) = false; + }; + }; + case (_deviceCode == 1): { + if ((_patient getVariable [QEGVAR(breathing,pulseOxAttached), false])) then { + if !(GVAR(PulseOxDisplay)) then { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + "CPR_MONITOR" cutRsc ["CPR_PulseOx", "PLAIN", 0, true]; + GVAR(PulseOxDisplay) = true; + [_medic, GVAR(CPRTarget)] call FUNC(PulseOx_ViewMonitor); + }; + } else { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + GVAR(PulseOxDisplay) = false; + }; + }; + case (_deviceCode == 0): { "CPR_MONITOR" cutText ["", "PLAIN"]; GVAR(PulseOxDisplay) = false; GVAR(CPRDisplayActive) = false;}; + }; +}, 2, [_medic, _patient]] call CBA_fnc_addPerFrameHandler; + [{ params ["_medic", "_patient", "_notInVehicle", "_CPRStartTime"]; - [LLSTRING(StopCPR), "", ""] call ACEFUNC(interaction,showMouseHint); + [LLSTRING(StopCPR), "Change Monitoring Device", ""] call ACEFUNC(interaction,showMouseHint); [LLSTRING(StartCPR), 1.5, _medic] call ACEFUNC(common,displayTextStructured); [{ @@ -74,6 +138,7 @@ if (_notInVehicle) then { [] call ACEFUNC(interaction,hideMouseHint); [GVAR(CPRCancel_EscapeID), "keydown"] call CBA_fnc_removeKeyHandler; [GVAR(CPRCancel_MouseID), "keydown"] call CBA_fnc_removeKeyHandler; + [GVAR(CPRDevice_Iterate), "keydown"] call CBA_fnc_removeKeyHandler; if (_notInVehicle) then { [_medic, "AinvPknlMstpSnonWnonDnon_medicEnd", 2] call ACEFUNC(common,doAnimation); diff --git a/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf b/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf new file mode 100644 index 000000000..13d47f448 --- /dev/null +++ b/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Mazinski + * Open PulseOx View Monitor + * + * Arguments: + * 0: Medic + * 1: Target + * + * Return Value: + * None + * + * Example: + * [player, cursorTarget, 1] call kat_circulation_fnc_PulseOx_ViewMonitor.sqf; + * + * Public: No + */ + +params ["_medic", "_target"]; + +private _dlg = uiNamespace getVariable ["kat_pulseox", displayNull]; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg", "_target"]; + + if !(GVAR(PulseOxDisplay)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + (_dlg displayCtrl 22802) ctrlSetText (format["%1", (GET_SPO2(_target)) toFixed 1]); + (_dlg displayCtrl 22803) ctrlSetText (format["%1", round(GET_HEART_RATE(_target))]); +}, 1, [_dlg, _target]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/circulation/functions/fnc_fullHealLocal.sqf b/addons/circulation/functions/fnc_fullHealLocal.sqf index 6eaf3a2e4..d262bd608 100644 --- a/addons/circulation/functions/fnc_fullHealLocal.sqf +++ b/addons/circulation/functions/fnc_fullHealLocal.sqf @@ -22,6 +22,9 @@ _patient setVariable [QGVAR(cprCount), 2, true]; _patient setVariable [QGVAR(heartRestart), false, true]; _patient setVariable [QGVAR(cardiacArrestType), 0, true]; +_patient setVariable [QGVAR(deviceCode), 0, true]; +_patient setVariable [QGVAR(watchAvailable), false, true]; + _patient setVariable [VAR_BLOODPRESSURE_CHANGE, nil, true]; _patient setVariable [QGVAR(bodyFluid), DEFAULT_BODY_FLUID]; diff --git a/addons/circulation/ui/AEDX_Monitor_Dialog.hpp b/addons/circulation/ui/AEDX_Monitor_Dialog.hpp index 30818e2d6..25024ca21 100644 --- a/addons/circulation/ui/AEDX_Monitor_Dialog.hpp +++ b/addons/circulation/ui/AEDX_Monitor_Dialog.hpp @@ -1,5 +1,3 @@ -#include "..\defines.hpp" - class RscPicture; class RscLine; class RscText; @@ -597,4 +595,4 @@ class GVAR(AEDX_Monitor_Dialog) { tooltip = CSTRING(AEDX_Monitor_MeasureBloodPressure); }; }; -}; +}; \ No newline at end of file diff --git a/addons/circulation/ui/kat_pulseox.paa b/addons/circulation/ui/kat_pulseox.paa new file mode 100644 index 0000000000000000000000000000000000000000..dc540d3e32c2ed1eb4dd467751498c912355e4eb GIT binary patch literal 43401 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 Kh7sw_(Ek7@s$qoy literal 0 HcmV?d00001 From 73e347a4b39e7359bca269e810fd96aa0b329d2b Mon Sep 17 00:00:00 2001 From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com> Date: Wed, 30 Oct 2024 21:51:59 -0700 Subject: [PATCH 2/5] Update AEDX_Monitor_Dialog.hpp --- addons/circulation/ui/AEDX_Monitor_Dialog.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/circulation/ui/AEDX_Monitor_Dialog.hpp b/addons/circulation/ui/AEDX_Monitor_Dialog.hpp index 25024ca21..bd3edf77a 100644 --- a/addons/circulation/ui/AEDX_Monitor_Dialog.hpp +++ b/addons/circulation/ui/AEDX_Monitor_Dialog.hpp @@ -1,6 +1,4 @@ -class RscPicture; class RscLine; -class RscText; class RscBackground; class RscButton; class RscStructuredText; From bc63e153e1c03a1085ea4ebb65333e51db8f05a8 Mon Sep 17 00:00:00 2001 From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:34:35 -0800 Subject: [PATCH 3/5] Review changes --- addons/breathing/functions/fnc_fullHealLocal.sqf | 1 - .../functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf | 2 -- .../functions/fnc_treatmentAdvanced_removePulseoximeter.sqf | 1 - addons/circulation/functions/fnc_CPRStart.sqf | 6 +++--- addons/circulation/functions/fnc_fullHealLocal.sqf | 1 - addons/circulation/functions/fnc_handleRespawn.sqf | 2 ++ addons/circulation/functions/fnc_init.sqf | 4 +++- addons/circulation/stringtable.xml | 3 +++ 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/addons/breathing/functions/fnc_fullHealLocal.sqf b/addons/breathing/functions/fnc_fullHealLocal.sqf index a9d16ce03..9791dd752 100644 --- a/addons/breathing/functions/fnc_fullHealLocal.sqf +++ b/addons/breathing/functions/fnc_fullHealLocal.sqf @@ -27,7 +27,6 @@ _patient setVariable [QGVAR(deepPenetratingInjury), false, true]; _patient setVariable [QGVAR(etco2Monitor), [], true]; _patient setVariable [QGVAR(breathRate), 15, true]; _patient setVariable [QGVAR(nasalCannula), false, true]; -_patient setVariable [QGVAR(pulseOxAttached), false, true]; if (ACEGVAR(advanced_fatigue,enabled)) then { ["kat_LSDF"] call ACEFUNC(advanced_fatigue,removeDutyFactor); diff --git a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf index 07c586ba7..90400fe03 100644 --- a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf +++ b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf @@ -25,11 +25,9 @@ _patient setVariable ["kat_PulseoxiInUse_PFH", true]; _patient setVariable [QGVAR(pulseoximeter), true, true]; _patient setVariable [QGVAR(PulseOximeter_VolumePatient), _medic getVariable QGVAR(PulseOximeter_Volume), true]; - private _attachedPulseOximeter = _patient getVariable [QGVAR(PulseOximeter_Attached), [0,0]]; _attachedPulseOximeter set [(ALL_BODY_PARTS find toLower _bodyPart)-2,1]; _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, true]; -_patient setVariable [QGVAR(pulseOxAttached), true, true]; [{ params ["_args", "_idPFH"]; diff --git a/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf b/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf index 4a50f050d..c7dc09c8f 100644 --- a/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf +++ b/addons/breathing/functions/fnc_treatmentAdvanced_removePulseoximeter.sqf @@ -24,6 +24,5 @@ _medic setVariable [QGVAR(PulseOximeter_Volume), _patient getVariable QGVAR(Puls private _attachedPulseOximeter = _patient getVariable [QGVAR(PulseOximeter_Attached), [0,0]]; _attachedPulseOximeter set [(ALL_BODY_PARTS find toLower _bodyPart)-2,0]; _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, true]; -_patient setVariable [QGVAR(pulseOxAttached), false, true]; [_medic, "kat_Pulseoximeter", 1] call ACEFUNC(common,addToInventory); diff --git a/addons/circulation/functions/fnc_CPRStart.sqf b/addons/circulation/functions/fnc_CPRStart.sqf index 64812f858..91d0094aa 100644 --- a/addons/circulation/functions/fnc_CPRStart.sqf +++ b/addons/circulation/functions/fnc_CPRStart.sqf @@ -37,7 +37,7 @@ GVAR(CPRCancel_MouseID) = [0xF0, [false, false, false], { GVAR(CPRDevice_Iterate) = [0xF1, [false, false, false], { private _deviceCode = GVAR(CPRTarget) getVariable [QGVAR(deviceCode), 0]; _deviceCode = [(_deviceCode + 1), 1] select (_deviceCode == 3); - private _deviceArray = [true,(GVAR(CPRTarget) getVariable [QEGVAR(breathing,pulseOxAttached), false]),((GVAR(CPRTarget) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (GVAR(CPRTarget) getVariable [QGVAR(DefibrillatorPads_Connected), false])),(GVAR(CPRTarget) getVariable [QGVAR(watchAvailable), false])]; + private _deviceArray = [true,(GVAR(CPRTarget) getVariable [QEGVAR(breathing,pulseoximeter), false]),((GVAR(CPRTarget) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (GVAR(CPRTarget) getVariable [QGVAR(DefibrillatorPads_Connected), false])),(GVAR(CPRTarget) getVariable [QGVAR(watchAvailable), false])]; while { !(_deviceArray select _deviceCode) } do { _deviceCode = [0, (_deviceCode + 1)] select (_deviceCode < 3); }; @@ -95,7 +95,7 @@ if (_notInVehicle) then { }; }; case (_deviceCode == 1): { - if ((_patient getVariable [QEGVAR(breathing,pulseOxAttached), false])) then { + if ((_patient getVariable [QEGVAR(breathing,pulseoximeter), false])) then { if !(GVAR(PulseOxDisplay)) then { "CPR_MONITOR" cutText ["", "PLAIN",0,true]; "CPR_MONITOR" cutRsc ["CPR_PulseOx", "PLAIN", 0, true]; @@ -114,7 +114,7 @@ if (_notInVehicle) then { [{ params ["_medic", "_patient", "_notInVehicle", "_CPRStartTime"]; - [LLSTRING(StopCPR), "Change Monitoring Device", ""] call ACEFUNC(interaction,showMouseHint); + [LLSTRING(StopCPR), LLSTRING(ChangeCPRDevice), ""] call ACEFUNC(interaction,showMouseHint); [LLSTRING(StartCPR), 1.5, _medic] call ACEFUNC(common,displayTextStructured); [{ diff --git a/addons/circulation/functions/fnc_fullHealLocal.sqf b/addons/circulation/functions/fnc_fullHealLocal.sqf index d262bd608..56ba05d62 100644 --- a/addons/circulation/functions/fnc_fullHealLocal.sqf +++ b/addons/circulation/functions/fnc_fullHealLocal.sqf @@ -22,7 +22,6 @@ _patient setVariable [QGVAR(cprCount), 2, true]; _patient setVariable [QGVAR(heartRestart), false, true]; _patient setVariable [QGVAR(cardiacArrestType), 0, true]; -_patient setVariable [QGVAR(deviceCode), 0, true]; _patient setVariable [QGVAR(watchAvailable), false, true]; _patient setVariable [VAR_BLOODPRESSURE_CHANGE, nil, true]; diff --git a/addons/circulation/functions/fnc_handleRespawn.sqf b/addons/circulation/functions/fnc_handleRespawn.sqf index 9a77acc69..a05ad3097 100644 --- a/addons/circulation/functions/fnc_handleRespawn.sqf +++ b/addons/circulation/functions/fnc_handleRespawn.sqf @@ -39,4 +39,6 @@ _unit setVariable [QGVAR(bloodtype), [_unit, _dead, true] call FUNC(generateBloo _unit setVariable [QGVAR(internalBleeding), 0, true]; _unit setVariable [QGVAR(StoredBloodPressure), [0,0], true]; +_unit setVariable [QGVAR(deviceCode), 0, true]; + [_unit] call FUNC(fullHealLocal); diff --git a/addons/circulation/functions/fnc_init.sqf b/addons/circulation/functions/fnc_init.sqf index ad79f1a3a..93f3068b4 100644 --- a/addons/circulation/functions/fnc_init.sqf +++ b/addons/circulation/functions/fnc_init.sqf @@ -19,4 +19,6 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; -[_unit] call FUNC(fullHealLocal); \ No newline at end of file +[_unit] call FUNC(fullHealLocal); + +_unit setVariable [QGVAR(deviceCode), 0, true]; \ No newline at end of file diff --git a/addons/circulation/stringtable.xml b/addons/circulation/stringtable.xml index 90b38effd..4f10800fa 100644 --- a/addons/circulation/stringtable.xml +++ b/addons/circulation/stringtable.xml @@ -2509,6 +2509,9 @@ Прекратить СЛР Stop CPR + + Change Monitoring Device + CPR Started CPRを開始した From 81824fee629ad5c7eb682ad3a9ef93230986c36f Mon Sep 17 00:00:00 2001 From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:40:28 -0800 Subject: [PATCH 4/5] Unparsable syntax? --- addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf | 2 +- .../functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf | 4 ++-- addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf | 2 +- addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf | 2 +- addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf | 4 ++-- addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf | 2 +- addons/feedback/functions/fnc_handleEffects.sqf | 2 +- addons/main/script_macros.hpp | 2 +- addons/vitals/functions/fnc_hasStableVitals.sqf | 2 +- addons/watch/functions/fnc_showKWatch.sqf | 2 +- addons/watch/functions/fnc_showSWatch.sqf | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf b/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf index 4b13dc4e6..f17cf75a2 100644 --- a/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf +++ b/addons/breathing/functions/fnc_gui_updateInjuryListPart.sqf @@ -24,7 +24,7 @@ if (GVAR(showCyanosis) && _selectionN in [0,2,3]) then { private _spO2 = 0; if (alive _target) then { - _spO2 = GET_SPO2(_target); + _spO2 = GET_KAT_SPO2(_target); }; if (_spO2 <= GVAR(slightValue) || HAS_TOURNIQUET_APPLIED_ON(_target,_selectionN)) then { diff --git a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf index 90400fe03..329d94ede 100644 --- a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf +++ b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf @@ -39,7 +39,7 @@ _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, tru }; private _HR = GET_HEART_RATE(_patient); - private _SpO2 = GET_SPO2(_patient); + private _SpO2 = GET_KAT_SPO2(_patient); if (([_patient,_bodyPart] call ACEFUNC(medical_treatment,hasTourniquetAppliedTo))) then { _HR = 0; @@ -57,7 +57,7 @@ _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, tru [_idPFH] call CBA_fnc_removePerFrameHandler; }; - private _SpO2 = GET_SPO2(_patient); + private _SpO2 = GET_KAT_SPO2(_patient); if (([_patient,_bodyPart] call ACEFUNC(medical_treatment,hasTourniquetAppliedTo))) then { _SpO2 = 0; diff --git a/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf b/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf index 620cf416c..a770d89b3 100644 --- a/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf +++ b/addons/circulation/functions/fnc_AEDX_ViewMonitor.sqf @@ -277,7 +277,7 @@ GVAR(PulseRateReady) = true; if (HAS_TOURNIQUET_APPLIED_ON(GVAR(AEDX_MonitorTarget),_partIndex)) then { _bp = [0,0]; } else { - _spO2 = GET_SPO2(GVAR(AEDX_MonitorTarget)); + _spO2 = GET_KAT_SPO2(GVAR(AEDX_MonitorTarget)); _pr = GVAR(AEDX_MonitorTarget) getVariable [QACEGVAR(medical,heartRate), 0]; }; diff --git a/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf b/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf index ece1083e6..1e8de9965 100644 --- a/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf +++ b/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf @@ -243,7 +243,7 @@ private _dlg = uiNamespace getVariable ["KAT_Circulation_AEDX_Monitor_Display", if (HAS_TOURNIQUET_APPLIED_ON(GVAR(AEDX_MonitorTarget_Title),_partIndex)) then { _bp = [0,0]; } else { - _spO2 = GET_SPO2(GVAR(AEDX_MonitorTarget_Title)); + _spO2 = GET_KAT_SPO2(GVAR(AEDX_MonitorTarget_Title)); _pr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; }; diff --git a/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf b/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf index 363ae599d..5eddffa25 100644 --- a/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf +++ b/addons/circulation/functions/fnc_AEDX_VitalsMonitor.sqf @@ -92,7 +92,7 @@ if (_patient getVariable ["kat_AEDXPatient_PFH", -1] isEqualTo -1) then { _bp = [0,0]; _pr = 0; } else { - _spO2 = GET_SPO2(_patient); + _spO2 = GET_KAT_SPO2(_patient); _etco2 = GET_ETCO2(_patient); _breathrate = GET_BREATHING_RATE(_patient); @@ -291,7 +291,7 @@ if (_patient getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false] && {(_pat if (_patient getVariable [QGVAR(DefibrillatorInUse), false] || !(_patient getVariable [QGVAR(AED_X_VitalsMonitor_VolumePatient), false])) then { } else { private _hr = _patient getVariable [QACEGVAR(medical,heartRate), 80]; - private _spO2 = GET_SPO2(_patient); + private _spO2 = GET_KAT_SPO2(_patient); if (_spO2 < GVAR(AED_X_Monitor_SpO2Warning) || _tourniquetApplied) then { playSound3D [QPATHTOF_SOUND(sounds\spo2warning.wav), _soundSource, false, getPosASL _soundSource, 5, 1, 15]; }; diff --git a/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf b/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf index 13d47f448..440cfe23e 100644 --- a/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf +++ b/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf @@ -29,6 +29,6 @@ private _dlg = uiNamespace getVariable ["kat_pulseox", displayNull]; [_idPFH] call CBA_fnc_removePerFrameHandler; }; - (_dlg displayCtrl 22802) ctrlSetText (format["%1", (GET_SPO2(_target)) toFixed 1]); + (_dlg displayCtrl 22802) ctrlSetText (format["%1", (GET_KAT_SPO2(_target)) toFixed 1]); (_dlg displayCtrl 22803) ctrlSetText (format["%1", round(GET_HEART_RATE(_target))]); }, 1, [_dlg, _target]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/feedback/functions/fnc_handleEffects.sqf b/addons/feedback/functions/fnc_handleEffects.sqf index a178e9c77..feea1febc 100644 --- a/addons/feedback/functions/fnc_handleEffects.sqf +++ b/addons/feedback/functions/fnc_handleEffects.sqf @@ -25,7 +25,7 @@ BEGIN_COUNTER(handleEffects); // - Current state info ------------------------------------------------------- private _opioid = GET_PP(ACE_player); -private _spO2 = GET_SPO2(ACE_player); +private _spO2 = GET_KAT_SPO2(ACE_player); private _unconscious = IS_UNCONSCIOUS(ACE_player); // - Visual effects ----------------------------------------------------------- diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index d18adf1f7..7007174ec 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -307,7 +307,7 @@ #define GET_BLOOD_GAS(unit) (unit getVariable [VAR_BLOOD_GAS, DEFAULT_BLOOD_GAS]) #define GET_PAO2(unit) ((unit getVariable [VAR_BLOOD_GAS, DEFAULT_BLOOD_GAS]) select 1) -#define GET_SPO2(unit) (((unit getVariable [VAR_BLOOD_GAS, DEFAULT_BLOOD_GAS]) select 2) * 100) +#define GET_KAT_SPO2(unit) (((unit getVariable [VAR_BLOOD_GAS, DEFAULT_BLOOD_GAS]) select 2) * 100) #define GET_PH(unit) ((unit getVariable [VAR_BLOOD_GAS, DEFAULT_BLOOD_GAS]) select 4) #define GET_ETCO2(unit) ((unit getVariable [VAR_BLOOD_GAS, DEFAULT_BLOOD_GAS]) select 5) #define GET_BREATHING_RATE(unit) (unit getVariable [VAR_BREATHING_RATE, 15]) diff --git a/addons/vitals/functions/fnc_hasStableVitals.sqf b/addons/vitals/functions/fnc_hasStableVitals.sqf index 2705db788..58ed2f125 100644 --- a/addons/vitals/functions/fnc_hasStableVitals.sqf +++ b/addons/vitals/functions/fnc_hasStableVitals.sqf @@ -35,7 +35,7 @@ if (_bloodPressureL < 50 || {_bloodPressureH < 60}) exitWith { false }; private _heartRate = GET_HEART_RATE(_unit); if (_heartRate < 40) exitWith { false }; -private _o2 = GET_SPO2(_unit); +private _o2 = GET_KAT_SPO2(_unit); if (_o2 < EGVAR(breathing,Stable_spo2)) exitWith { false }; true diff --git a/addons/watch/functions/fnc_showKWatch.sqf b/addons/watch/functions/fnc_showKWatch.sqf index 5e45ff6f9..dbf4e3020 100644 --- a/addons/watch/functions/fnc_showKWatch.sqf +++ b/addons/watch/functions/fnc_showKWatch.sqf @@ -103,7 +103,7 @@ private _altitude = _display displayCtrl 22007; }; _hr ctrlSetText ([GET_HEART_RATE(_unit), 1, 0] call CBA_fnc_formatNumber); - _o2 ctrlSetText ([GET_SPO2(_unit), 1, 0] call CBA_fnc_formatNumber); + _o2 ctrlSetText ([GET_KAT_SPO2(_unit), 1, 0] call CBA_fnc_formatNumber); switch (true) do { case(rain != 0): { _rain ctrlShow true; _overcast ctrlShow false; _sun ctrlShow false; }; diff --git a/addons/watch/functions/fnc_showSWatch.sqf b/addons/watch/functions/fnc_showSWatch.sqf index 073d06136..356eff061 100644 --- a/addons/watch/functions/fnc_showSWatch.sqf +++ b/addons/watch/functions/fnc_showSWatch.sqf @@ -92,7 +92,7 @@ private _altitudeUnit = GVAR(altitudeUnit); _time ctrlSetText (format ["%1:%2", [_hour, 2] call CBA_fnc_formatNumber, [_minute, 2] call CBA_fnc_formatNumber]); _hr ctrlSetText ([GET_HEART_RATE(_unit), 1, 0] call CBA_fnc_formatNumber); - _o2 ctrlSetText ([GET_SPO2(_unit), 1, 0] call CBA_fnc_formatNumber); + _o2 ctrlSetText ([GET_KAT_SPO2(_unit), 1, 0] call CBA_fnc_formatNumber); private _curTime = CBA_missionTime; private _timeDiff = _curTime - _prevTime; From d1e49e89363facca35639c989b11eb0ad1233c7f Mon Sep 17 00:00:00 2001 From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com> Date: Mon, 2 Dec 2024 10:55:18 -0800 Subject: [PATCH 5/5] Fixes --- addons/circulation/functions/fnc_CPRStart.sqf | 10 +++------- addons/circulation/functions/fnc_fullHealLocal.sqf | 2 -- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/addons/circulation/functions/fnc_CPRStart.sqf b/addons/circulation/functions/fnc_CPRStart.sqf index 91d0094aa..b7129b3cd 100644 --- a/addons/circulation/functions/fnc_CPRStart.sqf +++ b/addons/circulation/functions/fnc_CPRStart.sqf @@ -36,10 +36,10 @@ GVAR(CPRCancel_MouseID) = [0xF0, [false, false, false], { GVAR(CPRDevice_Iterate) = [0xF1, [false, false, false], { private _deviceCode = GVAR(CPRTarget) getVariable [QGVAR(deviceCode), 0]; - _deviceCode = [(_deviceCode + 1), 1] select (_deviceCode == 3); - private _deviceArray = [true,(GVAR(CPRTarget) getVariable [QEGVAR(breathing,pulseoximeter), false]),((GVAR(CPRTarget) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (GVAR(CPRTarget) getVariable [QGVAR(DefibrillatorPads_Connected), false])),(GVAR(CPRTarget) getVariable [QGVAR(watchAvailable), false])]; + _deviceCode = [(_deviceCode + 1), 1] select (_deviceCode == 2); + private _deviceArray = [true,(GVAR(CPRTarget) getVariable [QEGVAR(breathing,pulseoximeter), false]),((GVAR(CPRTarget) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (GVAR(CPRTarget) getVariable [QGVAR(DefibrillatorPads_Connected), false]))]; while { !(_deviceArray select _deviceCode) } do { - _deviceCode = [0, (_deviceCode + 1)] select (_deviceCode < 3); + _deviceCode = [0, (_deviceCode + 1)] select (_deviceCode < 2); }; GVAR(CPRTarget) setVariable [QGVAR(deviceCode), _deviceCode, true]; true @@ -77,10 +77,6 @@ if (_notInVehicle) then { }; switch (true) do { - case (_deviceCode == 3): { - GVAR(CPRDisplayActive) = false; - "CPR_MONITOR" cutText ["", "PLAIN",0,true]; - }; case (_deviceCode == 2): { if ((_patient getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false])) then { if !(GVAR(CPRDisplayActive)) then { diff --git a/addons/circulation/functions/fnc_fullHealLocal.sqf b/addons/circulation/functions/fnc_fullHealLocal.sqf index 56ba05d62..6eaf3a2e4 100644 --- a/addons/circulation/functions/fnc_fullHealLocal.sqf +++ b/addons/circulation/functions/fnc_fullHealLocal.sqf @@ -22,8 +22,6 @@ _patient setVariable [QGVAR(cprCount), 2, true]; _patient setVariable [QGVAR(heartRestart), false, true]; _patient setVariable [QGVAR(cardiacArrestType), 0, true]; -_patient setVariable [QGVAR(watchAvailable), false, true]; - _patient setVariable [VAR_BLOODPRESSURE_CHANGE, nil, true]; _patient setVariable [QGVAR(bodyFluid), DEFAULT_BODY_FLUID];