ATG Garmin Vitals

An ACE Medical vitals screen on RHS's Garmin wrist watch, and an alert that gets a casualty noticed.

What the mod does

ATG Garmin Vitals adds a vitals screen to RHS’s Garmin wrist watch, showing the wearer’s heart rate and blood pressure as ACE Medical models them. It then uses those numbers for the thing that actually matters on a server: getting a casualty noticed, by themselves and by the people around them.

The screen sits in the watch’s existing mode cycle alongside time, altitude, compass and position, and is reached the same way.

Requirements

RHS, for the watch itself, and ACE Medical, for the vitals to read. The mod adds a screen to somebody else’s watch and reads somebody else’s medical model — without both it has nothing to show.

ATG Core is optional. Loaded before this mod it adds the per-server JSON settings layer described below; without it the mod runs on its own settings.

The vitals screen

Heart rate and blood pressure are not replicated by ACE — only a coarse vital-state is — so while the screen is open the watch asks the server to resend the wearer’s values on each refresh.

That cost is worth knowing about because it is the only cost: it is one message per wearer with the screen actually open, and a watch showing the time costs nothing at all. m_iVitalsUpdatePeriodMs is the dial if that traffic ever becomes a problem on a full server.

Bringing itself up

When the wearer’s heart rate or systolic pressure leaves the configured bounds, the watch switches to the vitals screen on its own and hands the previous screen back once they recover.

The comparison runs on the server, where the values already live, so nothing is polled: one registration when the watch goes on, then one push per bound crossing. A wearer whose vitals are fine generates no traffic.

Two behaviours are deliberate:

  • Being unconscious holds the screen up. ACE tends to have somebody back within bounds by the time they come round, so without the hold they would wake looking at a screen that had quietly switched away. It releases only once they can read it.
  • A deliberate choice outranks it. Cycle to the compass while still hurt and you keep the compass — recovering later will not move you off it.

The buddy alert

Off by default. With it on, your watch beeps and flashes when a nearby friendly’s vitals cross those same bounds.

It exists for the casualty nobody notices: somebody goes down and does not call it out — playing it in character, or on a server with voice disabled while unconscious — and their squad walks off and leaves them.

  • Both parties need a Garmin. The casualty’s watch reports the distress and yours tells you about it. Think of it as the two watches being paired.
  • It does not change your screen. The vitals screen shows your numbers, which say nothing about the person in trouble, so the alert is a beep and an overlay on whatever you were already looking at.
  • One beep per casualty per time they come into range. A hysteresis band means loitering on the edge of range cannot make it beep repeatedly.
  • Walking into range counts. The server re-checks who is nearby while anyone is down, so you are alerted for somebody who went down before you arrived, not only for one who drops in front of you.
  • Distress means the same bounds as the auto-switch, so there is no second set of thresholds to keep in step. That works because ACE’s heart rate has no exertion term — it is driven by pain and medication, so a sprinting teammate cannot set it off.
  • The dead do not alert. Unconsciousness and cardiac arrest do, both being survivable with help; actual death clears it.
  • AI are not involved in either direction.

It is opt-in because, unlike the wearer’s own auto-switch, it adds a periodic proximity check and a second class of server-to-client message. The system switches itself off entirely whenever nobody is in distress, so an unhurt server does no work for it, but it is still a cost you should choose.

The beep is heard only by the wearer. There is no version audible to bystanders — in PvP one casualty would give away the position of everyone near them, so it is a gameplay decision rather than a missing feature.

Range is straight 3D distance: walls and terrain do not block it, on the grounds that a radio would not either.

Which watches get it

RHS’s Garmin models are retextures sharing one wrist watch component and one layout, so the screen and the alert arrive on every model carrying that component at once. A watch without it gets neither. There is no in-between, and nothing to configure per model.

Settings

SettingDefaultMeaning
m_bAutoSwitchOnUnhealthytrueSwitch to the vitals screen when the wearer leaves the bounds below.
m_iVitalsUpdatePeriodMs1000How often the open vitals screen redraws and re-asks the server [ms].
m_iHeartRateLowBPM50Below this is out of bounds [bpm]. This is the one that catches the crash.
m_iHeartRateHighBPM120Above this is out of bounds [bpm].
m_iSystolicLowMMHG100Below this is out of bounds [mmHg]. The one that fires under blood loss.
m_iSystolicHighMMHG160Above this is out of bounds [mmHg]. A backstop for pain-driven spikes.
m_bBuddyAlertEnabledfalseMaster switch for the buddy alert.
m_fBuddyAlertRangeM40How close a distressed friendly must be to alert you [m].
m_fBuddyAlertRangeHysteresisM10How far past that range you must move before it clears and can fire again.
m_iBuddyAlertSweepPeriodMs3000How often the server re-checks who is near a casualty [ms].
m_bBuddyAlertIncludeFriendlyFactionsfalseAlso alert for friendly factions, not only your own.
m_sBuddyAlertSoundEventSOUND_HUD_NOTIFICATIONThe beep. Point it at a custom event to change it; empty is silent.

The systolic bounds are compared against pressure derived the way ACE derives it for display, converted to mmHg to match the units above.

The low systolic bound is set at the onset of hypotension rather than at the shock line, to give a little more warning before the wearer collapses. Lower it towards 90 if it trips too eagerly on your server.

Changing them on your server

Load ATG Core ahead of this mod and every setting above can be set from $profile:ATG/atg-garmin-vitals.json, with no Workbench and no mod of your own. Name only what you want to change; anything you leave out keeps its shipped value.

Booleans are written true and false — a 1 is ignored, and the setting silently keeps the value it already had.

{
  "m_bAutoSwitchOnUnhealthy": true,
  "m_iVitalsUpdatePeriodMs": 1000,
  "m_iHeartRateLowBPM": 50,
  "m_iHeartRateHighBPM": 120,
  "m_iSystolicLowMMHG": 100,
  "m_iSystolicHighMMHG": 160,
  "m_bBuddyAlertEnabled": false,
  "m_fBuddyAlertRangeM": 40,
  "m_fBuddyAlertRangeHysteresisM": 10,
  "m_iBuddyAlertSweepPeriodMs": 3000,
  "m_bBuddyAlertIncludeFriendlyFactions": false,
  "m_sBuddyAlertSoundEvent": "SOUND_HUD_NOTIFICATION"
}

There are no list settings here, so nothing on this page has the replaced-whole behaviour lists have.

Without ATG Core, the settings can still be changed the ordinary Arma way — override this mod’s settings file from a mod of your own, in Workbench.