| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- // LoopFollow
- // HighBGCondition.swift
- import Foundation
- /// Fires when the latest BG – and, if requested, every BG in a persistent-window – is **≥ aboveBG**.
- struct HighBGCondition: AlarmCondition {
- static let type: AlarmType = .high
- init() {}
- func evaluate(alarm: Alarm, data: AlarmData, now _: Date) -> Bool {
- // ────────────────────────────────
- // 0. get the limit
- // ────────────────────────────────
- guard let high = alarm.aboveBG else { return false }
- func isHigh(_ g: GlucoseValue) -> Bool {
- g.sgv > 0 && Double(g.sgv) >= high
- }
- // we already know from `passesBGLimits` that the **latest** reading is ≥ high,
- // but we still need to honour the “persistent for N minutes” option.
- var persistentOK = true
- if let persistentMinutes = alarm.persistentMinutes,
- persistentMinutes > 0
- {
- let window = Int(ceil(Double(persistentMinutes) / 5.0))
- if data.bgReadings.count >= window {
- let recent = data.bgReadings.suffix(window)
- persistentOK = recent.allSatisfy(isHigh)
- } else {
- // not enough samples yet ⇒ don’t alarm
- persistentOK = false
- }
- }
- // Optional: stay silent while the latest reading is below the previous one;
- // only alarm when BG is flat or still rising.
- if alarm.suppressIfFalling, data.bgReadings.count >= 2 {
- let last = data.bgReadings[data.bgReadings.count - 1]
- let previous = data.bgReadings[data.bgReadings.count - 2]
- if last.sgv > 0, previous.sgv > 0, last.sgv < previous.sgv {
- return false
- }
- }
- return persistentOK
- }
- }
|