NOTES:
- Requires v2.0-a090-ae96c4a or above.
- Uses JSON lib by Coco - Implementation on GitHub didn't support AHK v2 so I am including my slightly modified version below as well.
EDIT: Code updated to handle WM_MOUSEWHEEL messages instead of using Hotkeys to avoid MaxHotkeysPerInterval issue.
Code: Select all
;===========================================================================================
; This script is used to populate a form with values. The form is part of an application that
; is delivered by Citrix and therefore keystrokes are all we can do to populate the fields
; Using the fields1 and fields2 objects, a GUI is populated to look exactly like the form.
; Each field has a default value but has an associated UpDown control for users to change them.
;
; Usage: Open the script, pick which form you are filling out, then click the Insert Data
; button to send the data. It will then wait for the user to hit the Enter key before
; sending the data. For testing, simply open Notepad then switch to this tool and
; click the Insert Data button.
;===========================================================================================
#Include <JSON>
#SingleInstance Force
guiW := 700
guiH := 400
scrollW := SysGet(2)
data := JSON.Load(FileRead("AutoLabs.json"))
;**************************************************************************************************
; Main GUI
;**************************************************************************************************
mainGui := GuiCreate("+Resize", windowTitle)
mainGui.BackColor := "White"
mainGui.MarginX := mainGui.MarginY := 10
mainGui.OnEvent("Close", () => ExitApp())
mainGui.OnEvent("Size", "MainSize")
mainGui.Add("Button", "h30 Default Section", "Insert Data").OnEvent("Click", "InsertData")
mainGui.Add("Text", "ys x+50 Section", "PowerForm Selection:")
mainGui.Add("DropDownList", "xs yp+15 w175 r5 AltSubmit vForm", "Labs Cerner Test Use Only||Cerner Education Use Only").OnEvent("Change", "DDL")
mainGui.Add("Text", "ys-5 x+120", "Log into PowerChart and`nopen the form before`nclicking 'Insert Data'")
mainGui.Add("Text", "ys-5 w1 h40 0x11")
mainGui.Add("Text", "ys-5", "Use the arrow buttons or`nhold Alt and scroll`nto change the values.")
;**************************************************************************************************
; Labs Cerner Test Use Only
;**************************************************************************************************
labsGui := GuiCreate("0x200000 +ToolWindow -Caption -SysMenu +Parent" mainGui.hwnd, "")
labsGui.MarginX := labsGui.MarginY := 10
labsGui.OnEvent("Size", (gObj, minMax, w, h) => UpdateScrollBars(gObj.hwnd, w, h))
labsGui.Add("Checkbox", "Checked0 Section vincludeIcu", "Include ICU Labs?")
; Add controls from first object
newSection := 0
for i, item in data.fields1 {
newSection++
if (item.name = "_DIVIDER") {
labsGui.Add("Text", "xs y+m h20 w" guiW - scrollW - 20 " 0x200 Background3198FF Center Section", item.text).SetFont("bold")
newSection := 0
}
else {
; Make a new row ever 2 "controls"
if (mod(newSection, 2) = 1) {
opts := "xs w125 Section"
}
; Otherwise the next is in a new column
else {
opts := "ys w125"
}
labsGui.Add("Text", opts, item.name)
labsGui.Add("Edit", "ys-3 w75 Limit ReadOnly", item.default)
; Note: The "-2" option is recommended when creating non-unitary UpDown controls, because
; it prevents a glitch that may otherwise occur when the control is greatly solicited
; (e.g. when using the mouse wheel to scroll the value).
; It disables the control's UDS_SETBUDDYINT style flag.
labsGui.Add("UpDown", "-2")
labsGui.Add("Text", "ys w100", item.refRange " " item.units)
}
}
labsGui.Show("x0 y50 h" guiH - 50 " w" guiW - scrollW)
;**************************************************************************************************
; Cerner Education Use Only form
;**************************************************************************************************
eduGui := GuiCreate("0x200000 +ToolWindow -Caption -SysMenu +Parent" mainGui.hwnd, "")
eduGui.MarginX := eduGui.MarginY := 10
eduGui.OnEvent("Size", (gObj, minMax, w, h) => UpdateScrollBars(gObj.hwnd, w, h))
; Add controls from first object
newSection := 0
for i, item in data.fields2 {
newSection++
if (item.name = "_DIVIDER") {
eduGui.Add("Text", "xs y+m h20 w" guiW - scrollW - 20 " 0x200 Background3198FF Center Section", item.text).SetFont("bold")
newSection := 0
}
else {
; This doesn't need xs since it is the first control on this GUI
if (i = 1) {
opts := "w125 Section"
}
; Make a new row ever 2 "controls"
else if (mod(newSection, 2) = 1) {
opts := "xs w125 Section"
}
; Otherwise the next is in a new column
else {
opts := "ys w125"
}
eduGui.Add("Text", opts, item.name)
eduGui.Add("Edit", "ys-3 w75 Limit ReadOnly", item.default)
; Note: The "-2" option is recommended when creating non-unitary UpDown controls, because
; it prevents a glitch that may otherwise occur when the control is greatly solicited
; (e.g. when using the mouse wheel to scroll the value).
; It disables the control's UDS_SETBUDDYINT style flag.
eduGui.Add("UpDown", "-2")
eduGui.Add("Text", "ys w100", item.refRange " " item.units)
}
}
; "Show" the second form GUI but have it hidden initially
eduGui.Show("x0 y50 h" guiH - 50 " w" guiW - scrollW " hide")
;**************************************************************************************************
; Show the main GUI
;**************************************************************************************************
mainGui.Show("h" guiH " w" guiW)
;Scrolling
OnMessage(0x114, "OnScroll") ; WM_HSCROLL
OnMessage(0x115, "OnScroll") ; WM_VSCROLL
OnMessage(0x020A, "OnWheel") ; WM_MOUSEWHEEL
; Used to intercept the UpDown UDN_DELTAPOS notification
OnMessage(0x004E, "WM_NOTIFY") ;WM_NOTIFY
Return ; Auto-execute section
;**************************************************************************************************
; Functions
;**************************************************************************************************
MainSize(guiObj, MinMax, w, h) {
global labsGui, eduGui
SetWinDelay(0)
WinMove(0, 50, w, h - 50, "ahk_id " labsGui.hwnd)
WinMove(0, 50, w, h - 50, "ahk_id " eduGui.hwnd)
}
; Called when the DropDownList of the main GUI is changed.
; This shows/hides the proper child GUIs in response.
DDL(ctrl) {
global labsGui, eduGui, scrollW
baseOpts := "x0 y50 h" ctrl.gui.clientPos.h - 50 " w" ctrl.gui.clientPos.w - scrollW
labsGui.Show(baseOpts (ctrl.value = 1 ? "" : " Hide"))
eduGui.Show(baseOpts (ctrl.value = 2 ? "" : " Hide"))
gui := ctrl.value = 1 ? labsGui : eduGui
UpdateScrollBars(gui.hwnd, gui.clientPos.w, gui.clientPos.h)
Return
}
; Click handler for main GUI's button
InsertData(ctrl) {
global labsGui, eduGui
; Not sure why I am needing this but the key is still read as down in the while loop later on
while (GetKeyState("Enter")) {
sleep(50)
}
; Minimize the button's GUI
ctrl.gui.Minimize()
; Show a new "splash" GUI that is semi-transparent informing the user what to do
splashGui := GuiCreate("+ToolWindow +AlwaysOnTop", "Data Entry")
splashGui.MarginX := 10
splashGui.Add("Text", "Center w300", "Please click in the first cell of the Labs Cerner Test Patient Use Only powerform.`n`nHit Enter when ready to send data.`nHit Escape to cancel.")
splashGui.Show()
WinSetTransparent(200, "ahk_id " splashGui.hwnd)
; Wait for either the Enter or Escape
while (!(GetKeyState("Enter") || GetKeyState("Esc"))) {
sleep(50)
}
; User canceled out of it
if (A_PriorKey = "Escape") {
splashGui.Destroy()
ctrl.gui.Restore()
return
}
; Kill the "splash" GUI
splashGui.Destroy()
Sleep(500)
; Check which item is selected in the DropDownList
If (ctrl.gui.control["Form"].value = 1) {
childGui := labsGui
ICUInd := labsGui.control["includeIcu"].value
}
Else {
childGui := eduGui
}
; Loop over the child GUI's controls
for h, gCtrl in childGui {
; break if we hit the ICU Labs divider and the checkbox is not checked
if (gCtrl.text = "ICU Labs" && !ICUInd) {
Break
}
; Only care about edit controls
if (gCtrl.type = "Edit") {
SendInput(gCtrl.Text "{Enter}")
Sleep(100)
}
}
; restore the main GUI
ctrl.gui.Restore()
Return
}
;Used for scrolling GUIs with controls on it
; Below two functions based heavily on code by Lexikos - https://autohotkey.com/board/topic/26033-scrollable-gui-proof-of-concept/#entry168174
UpdateScrollBars(guihwnd, GuiWidth, GuiHeight) {
static SIF_RANGE := 0x1, SIF_PAGE:= 0x2, SIF_DISABLENOSCROLL := 0x8, SB_HORZ := 0, SB_VERT := 1
; Calculate scrolling area.
Left := Top := 9999
Right := Bottom := 0
for ctlHwnd, ctlObj in GuiFromHwnd(guiHwnd) {
pos := ctlObj.pos
if (pos.x < Left)
Left := pos.x
if (pos.y < Top)
Top := pos.y
if (pos.x + pos.w > Right)
Right := pos.x + pos.w
if (pos.y + pos.h > Bottom)
Bottom := pos.y + pos.h
}
; Is the offset for the GUI's margin?
Left -= 8
Top -= 8
Right += 8
Bottom += 8
ScrollWidth := Right-Left
ScrollHeight := Bottom-Top
; Initialize SCROLLINFO.
VarSetCapacity(si, 28, 0)
NumPut(28, si) ; cbSize
NumPut(SIF_RANGE | SIF_PAGE, si, 4) ; fMask
; Update horizontal scroll bar.
NumPut(ScrollWidth, si, 12) ; nMax
NumPut(GuiWidth, si, 16) ; nPage
DllCall("SetScrollInfo", "ptr", guiHwnd, "uint", SB_HORZ, "ptr", &si, "int", 1)
; Update vertical scroll bar.
; NumPut(SIF_RANGE | SIF_PAGE | SIF_DISABLENOSCROLL, si, 4) ; fMask - causes the scroll bar to be disabled rather than hidden when it is not needed.
NumPut(ScrollHeight, si, 12) ; nMax
NumPut(GuiHeight, si, 16) ; nPage
DllCall("SetScrollInfo", "ptr", guiHwnd, "uint", SB_VERT, "ptr", &si, "int", 1)
if (Left < 0 && Right < GuiWidth)
x := Abs(Left) > GuiWidth-Right ? GuiWidth-Right : Abs(Left)
if (Top < 0 && Bottom < GuiHeight)
y := Abs(Top) > GuiHeight-Bottom ? GuiHeight-Bottom : Abs(Top)
if (x || y)
DllCall("ScrollWindow", "ptr", guiHwnd, "int", x, "int", y, "uint", 0, "uint", 0)
}
; Handles WM_MOUSEWHEEL messages
; Can use the shift key to allow for horizontal scrolling
; Still need to implement WM_MOUSEHWHEEL
; Based on code for just me's Class_ScrollGui - https://github.com/AHK-just-me/Class_ScrollGUI
OnWheel(wParam, lParam, msg, hwnd) {
global labsGui, eduGui
; Only scroll if the mouse is over the child GUIs
if !(hwnd = labsGui.hwnd || hwnd = eduGui.hwnd) {
return false
}
; Determines which direction to scroll, up or down
SB := ((wParam >> 16) > 0x7FFF) || (wParam < 0) ? 1 : 0
; If Shift is held down, send the msg for horizontal scrolling
dir := GetKeyState("Shift") ? 0x114 : 0x115
; Execute the scroll
OnScroll(SB, 0, dir, hwnd)
}
;Used for scrolling GUIs with controls on it
OnScroll(wParam, lParam, msg, hwnd) {
static SIF_ALL := 0x17, SCROLL_STEP := 30
bar := msg = 0x114 ? 0 : 1 ; SB_HORZ=0, SB_VERT=1
VarSetCapacity(si, 28, 0)
NumPut(28, si) ; cbSize
NumPut(SIF_ALL, si, 4) ; fMask
if !DllCall("GetScrollInfo", "ptr", hwnd, "int", bar, "ptr", &si, "UInt") {
return
}
VarSetCapacity(rect, 16)
DllCall("GetClientRect", "ptr", hwnd, "ptr", &rect)
new_pos := NumGet(si, 20, "Int") ; nPos
action := wParam & 0xFFFF
; ToolTip(action)
if (action = 0) ; SB_LINEUP
new_pos -= SCROLL_STEP
else if (action = 1) ; SB_LINEDOWN
new_pos += SCROLL_STEP
else if (action = 2) ; SB_PAGEUP
new_pos -= NumGet(rect, 12, "int") - SCROLL_STEP
else if (action = 3) ; SB_PAGEDOWN
new_pos += NumGet(rect, 12, "int") - SCROLL_STEP
else if (action = 5 || action = 4) ; SB_THUMBTRACK || SB_THUMBPOSITION
new_pos := wParam>>16
else if (action = 6) ; SB_TOP
new_pos := NumGet(si, 8, "int") ; nMin
else if (action = 7) ; SB_BOTTOM
new_pos := NumGet(si, 12, "int") ; nMax
else
return
min := NumGet(si, 8, "int") ; nMin
max := NumGet(si, 12, "int") - NumGet(si, 16, "Int") ; nMax-nPage
new_pos := new_pos > max ? max : new_pos
new_pos := new_pos < min ? min : new_pos
old_pos := NumGet(si, 20, "int") ; nPos
x := y := 0
if (bar = 0) ; SB_HORZ
x := old_pos-new_pos
else
y := old_pos-new_pos
; Scroll contents of window and invalidate uncovered area.
DllCall("ScrollWindow", "ptr", hwnd, "int", x, "int", y, "uint", 0, "uint", 0)
; Update scroll bar.
NumPut(new_pos, si, 20, "int") ; nPos
DllCall("SetScrollInfo", "ptr", hwnd, "int", bar, "ptr", &si, "int", 1)
}
; Adapted from http://numeric.nerim.net/AutoHotkey/Scripts/UpDown%20-%20Non-unitary%20increments.ahk
WM_NOTIFY(wParam, lParam, Msg, hWnd)
{
static UDM_GETBUDDY := 0x046A, UDN_DELTAPOS := 0xFFFFFD2E, ctrls := {}
udHwnd := NumGet(lParam + 0, 0, "UInt")
udCode := NumGet(lParam + 0, A_PtrSize*2, "UInt")
iDelta := NumGet(lParam + 0, A_PtrSize*3 + 4, "Int")
If (udCode = UDN_DELTAPOS) {
If (editHwnd := DllCall("User32\SendMessage", "Ptr", udHwnd, "UInt", UDM_GETBUDDY, "UInt", 0, "UInt", 0)) {
ctrlObj := guictrlfromhwnd(editHwnd)
; Save the controls precision for later retrieval
if (!ctrls.HasKey(editHwnd)) {
ctrls[editHwnd] := StrLen(StrSplit(ctrlObj.text, ".")[2])
}
precision := ctrls[editHwnd]
factor := precision = 0 ? 1 : precision = 1 ? 0.1 : 0.01
min := precision = 0 ? 0 : precision = 1 ? 0.0 : format("{:.2f}", 0.00)
newText := format("{:0." precision "f}", ctrlObj.text + 0)
newText := format("{:0." precision "f}", newText + factor * iDelta)
newText := (newText < min) ? min : newText
ctrlObj.text := newText
; Done; discard proposed change
Return True
}
Else {
; No buddy control
Return False
}
}
Else {
; Not UDN_DELTAPOS, or unit-incremented UpDown control
Return False
}
}
Code: Select all
{
"fields1": [
{
"Name": "PT Level",
"Default": "10.1",
"RefRange": "8.6 - 12.2",
"Units": "sec"
},
{
"Name": "Hgb",
"Default": "14",
"RefRange": "12 - 16",
"Units": "g/dL"
},
{
"Name": "PTT Level",
"Default": "24",
"RefRange": "26 - 36",
"Units": "sec"
},
{
"Name": "HCT",
"Default": "43.7",
"RefRange": "35.4 - 47",
"Units": "%"
},
{
"Name": "INR",
"Default": "1.03",
"RefRange": "0.9 - 1.2",
"Units": ""
},
{
"Name": "Platelet Count",
"Default": "405",
"RefRange": "150 - 400",
"Units": "K/uL"
},
{
"Name": "WBC",
"Default": "8.2",
"RefRange": "3.6 - 10",
"Units": "K/uL"
},
{
"Name": "_DIVIDER",
"Text": ""
},
{
"Name": "Sodium",
"Default": "140",
"RefRange": "136 - 144",
"Units": "mmol/L"
},
{
"Name": "BUN",
"Default": "12",
"RefRange": "10 - 23",
"Units": "mg/dL"
},
{
"Name": "Potassium",
"Default": "4.6",
"RefRange": "3.4 - 5",
"Units": "mmol/L"
},
{
"Name": "Creatinine",
"Default": "1.1",
"RefRange": "0.6 - 1.1",
"Units": "mg/dL"
},
{
"Name": "Chloride",
"Default": "112",
"RefRange": "96 - 100",
"Units": "mmol/L"
},
{
"Name": "Bicarb",
"Default": "23",
"RefRange": "22 - 32",
"Units": "mmol/L"
},
{
"Name": "_DIVIDER",
"Text": ""
},
{
"Name": "Bedside Glucose",
"Default": "89",
"RefRange": "70 - 100",
"Units": "mg/dL"
},
{
"Name": "Glucose Assay",
"Default": "91",
"RefRange": "",
"Units": "mg/dL"
},
{
"Name": "_DIVIDER",
"Text": ""
},
{
"Name": "Troponin I",
"Default": "0.03",
"RefRange": "0.00 - 0.10",
"Units": "ng/mL"
},
{
"Name": "AST/GOT",
"Default": "42",
"RefRange": "8 - 36",
"Units": ""
},
{
"Name": "Digoxin Assay",
"Default": "1.4",
"RefRange": "0.8 - 2.0",
"Units": ""
},
{
"Name": "ALT/SGPT",
"Default": "12",
"RefRange": "7 - 38",
"Units": ""
},
{
"Name": "Calcium",
"Default": "9.1",
"RefRange": "8.5 - 10.1",
"Units": "mg/dL"
},
{
"Name": "Total Bili",
"Default": "0.9",
"RefRange": "0.2 - 1.1",
"Units": ""
},
{
"Name": "Magnesium",
"Default": "1.7",
"RefRange": "1.5 - 2.1",
"Units": "mEq/L"
},
{
"Name": "Bilirubin Direct",
"Default": "0.1",
"RefRange": "0 - 0.5",
"Units": "mg/dL"
},
{
"Name": "_DIVIDER",
"Text": "Arterial Blood Gases"
},
{
"Name": "pH",
"Default": "7.43",
"RefRange": "7.35 - 7.45",
"Units": "unit"
},
{
"Name": "HCO3",
"Default": "29",
"RefRange": "22 - 28",
"Units": "mmol/L"
},
{
"Name": "pCO2",
"Default": "3.8",
"RefRange": "3.5 - 4.5",
"Units": "mmHg"
},
{
"Name": "Base Deficit",
"Default": "2.3",
"RefRange": "0 - 4.0",
"Units": "mmol/L"
},
{
"Name": "pO2",
"Default": "77",
"RefRange": "75 - 100",
"Units": "mmHg"
},
{
"Name": "O2 Saturation, Calc ABG",
"Default": "98",
"RefRange": "94 - 100",
"Units": "%"
},
{
"Name": "O2 Saturation, Meas ABG",
"Default": "98",
"RefRange": "94 - 100",
"Units": "%"
},
{
"Name": "FIO2",
"Default": "97",
"RefRange": "",
"Units": "%"
},
{
"Name": "_DIVIDER",
"Text": "ICU Labs"
},
{
"Name": "CK Total",
"Default": "123",
"RefRange": "38 - 234",
"Units": "U/L"
},
{
"Name": "Total Protein",
"Default": "7.7",
"RefRange": "6.4 - 8.3",
"Units": "g/dL"
},
{
"Name": "Myoglobin",
"Default": "93",
"RefRange": "0 - 88",
"Units": "ng/mL"
},
{
"Name": "Albumin Assay",
"Default": "4.6",
"RefRange": "3.5 - 5",
"Units": "g/dL"
},
{
"Name": "BNP",
"Default": "94",
"RefRange": "< 100",
"Units": "pg/mL"
},
{
"Name": "Ionized Calcium",
"Default": "5.2",
"RefRange": "4.5 - 5.3",
"Units": "mg/dL"
},
{
"Name": "SVO2",
"Default": "67",
"RefRange": "",
"Units": "%"
},
{
"Name": "Osmality Serum",
"Default": "283",
"RefRange": "270 - 300",
"Units": "mOsm/kg"
},
{
"Name": "Lactic Acid",
"Default": "2.1",
"RefRange": "0.9 - 1.7",
"Units": "mmol/L"
},
{
"Name": "Osmality Urine",
"Default": "1234",
"RefRange": "400 - 1300",
"Units": "mOsm/kg"
},
{
"Name": "Phosphorus",
"Default": "3.6",
"RefRange": "3.5 - 4.5",
"Units": "mg/dL"
},
{
"Name": "Cortisol, Random",
"Default": "19",
"RefRange": "",
"Units": "ug/dL"
},
{
"Name": "Alkaline Phos",
"Default": "151",
"RefRange": "38 - 126",
"Units": "U/L"
}
],
"fields2": [
{
"Name": "PT Level",
"Default": "10.1",
"RefRange": "8.6 - 12.2",
"Units": "sec"
},
{
"Name": "Hgb",
"Default": "14",
"RefRange": "12 - 16",
"Units": "g/dL"
},
{
"Name": "PTT Level",
"Default": "24",
"RefRange": "26 - 36",
"Units": "sec"
},
{
"Name": "HCT",
"Default": "43.7",
"RefRange": "35.4 - 47",
"Units": "%"
},
{
"Name": "INR",
"Default": "1.03",
"RefRange": "0.9 - 1.2",
"Units": ""
},
{
"Name": "WBC",
"Default": "8.2",
"RefRange": "3.6 - 10",
"Units": "K/uL"
},
{
"Name": "_DIVIDER",
"Text": ""
},
{
"Name": "Sodium",
"Default": "140",
"RefRange": "136 - 144",
"Units": "mmol/L"
},
{
"Name": "BUN",
"Default": "12",
"RefRange": "10 - 23",
"Units": "mg/dL"
},
{
"Name": "Creatinine",
"Default": "1.1",
"RefRange": "0.6 - 1.1",
"Units": "mg/dL"
},
{
"Name": "Potassium",
"Default": "4.6",
"RefRange": "3.4 - 5",
"Units": "mmol/L"
},
{
"Name": "Lactic Acid",
"Default": "2.1",
"RefRange": "0.9 - 1.7",
"Units": "mmol/L"
},
{
"Name": "Chloride",
"Default": "112",
"RefRange": "96 - 100",
"Units": "mmol/L"
},
{
"Name": "ESR",
"Default": "21",
"RefRange": "0-22 male | 0-29 female",
"Units": ""
},
{
"Name": "Total CO2",
"Default": "23",
"RefRange": "22 - 32",
"Units": "mmol/L"
},
{
"Name": "CRP",
"Default": "3.2",
"RefRange": "< 3.0",
"Units": "mg/L"
},
{
"Name": "_DIVIDER",
"Text": ""
},
{
"Name": "Bedside Glucose",
"Default": "89",
"RefRange": "70 - 100",
"Units": "mg/dL"
},
{
"Name": "Fasting Glucose",
"Default": "91",
"RefRange": "",
"Units": "mg/dL"
},
{
"Name": "_DIVIDER",
"Text": ""
},
{
"Name": "Troponin I",
"Default": "0.03",
"RefRange": "0.00 - 0.10",
"Units": "ng/mL"
},
{
"Name": "AST/GOT",
"Default": "42",
"RefRange": "8 - 36",
"Units": ""
},
{
"Name": "Digoxin Assay",
"Default": "1.4",
"RefRange": "0.8 - 2.0",
"Units": ""
},
{
"Name": "ALT/SGPT",
"Default": "12",
"RefRange": "7 - 38",
"Units": ""
},
{
"Name": "Calcium",
"Default": "9.1",
"RefRange": "8.5 - 10.1",
"Units": "mg/dL"
},
{
"Name": "Total Bili",
"Default": "0.9",
"RefRange": "0.2 - 1.1",
"Units": ""
},
{
"Name": "Magnesium",
"Default": "1.7",
"RefRange": "1.5 - 2.1",
"Units": "mEq/L"
},
{
"Name": "Alk Phos",
"Default": "151",
"RefRange": "38 - 126",
"Units": "U/L"
},
{
"Name": "_DIVIDER",
"Text": ""
},
{
"Name": "pH ABG",
"Default": "7.43",
"RefRange": "7.35 - 7.45",
"Units": "unit"
},
{
"Name": "HCO3",
"Default": "29",
"RefRange": "22 - 28",
"Units": "mmol/L"
},
{
"Name": "pCO2",
"Default": "3.8",
"RefRange": "3.5 - 4.5",
"Units": "mmHg"
},
{
"Name": "FIO2",
"Default": "97",
"RefRange": "",
"Units": "%"
},
{
"Name": "Base Deficit",
"Default": "2.3",
"RefRange": "0 - 4.0",
"Units": "mmol/L"
},
{
"Name": "pO2 ABG",
"Default": "77",
"RefRange": "62 - 78",
"Units": ""
}
]
}