| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- //
- // G7CGMManager+UI.swift
- // CGMBLEKitUI
- //
- // Created by Pete Schwamb on 9/24/22.
- // Copyright © 2022 LoopKit Authors. All rights reserved.
- //
- import Foundation
- import G7SensorKit
- import LoopKitUI
- import LoopKit
- public struct G7DeviceStatusHighlight: DeviceStatusHighlight, Equatable {
- public let localizedMessage: String
- public let imageName: String
- public let state: DeviceStatusHighlightState
- init(localizedMessage: String, imageName: String, state: DeviceStatusHighlightState) {
- self.localizedMessage = localizedMessage
- self.imageName = imageName
- self.state = state
- }
- }
- extension G7CGMManager: CGMManagerUI {
- public static var onboardingImage: UIImage? {
- return nil
- }
- public static func setupViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) -> SetupUIResult<CGMManagerViewController, CGMManagerUI> {
- let vc = G7UICoordinator(colorPalette: colorPalette, displayGlucoseUnitObservable: displayGlucoseUnitObservable, allowDebugFeatures: allowDebugFeatures)
- return .userInteractionRequired(vc)
- }
- public func settingsViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) ->CGMManagerViewController {
- return G7UICoordinator(cgmManager: self, colorPalette: colorPalette, displayGlucoseUnitObservable: displayGlucoseUnitObservable, allowDebugFeatures: allowDebugFeatures)
- }
- public var smallImage: UIImage? {
- UIImage(named: "g7", in: Bundle(for: G7SettingsViewModel.self), compatibleWith: nil)!
- }
- // TODO Placeholder.
- public var cgmStatusHighlight: DeviceStatusHighlight? {
- if lifecycleState == .searching {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Searching for\nSensor", comment: "G7 Status highlight text for searching for sensor"),
- imageName: "dot.radiowaves.left.and.right",
- state: .normalCGM)
- }
- if lifecycleState == .expired {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nExpired", comment: "G7 Status highlight text for sensor expired"),
- imageName: "clock",
- state: .normalCGM)
- }
- if lifecycleState == .failed {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nFailed", comment: "G7 Status highlight text for sensor failed"),
- imageName: "exclamationmark.circle.fill",
- state: .critical)
- }
- if let latestReadingReceivedAt = state.latestReadingTimestamp, latestReadingReceivedAt.timeIntervalSinceNow < -.minutes(15) {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Signal\nLoss", comment: "G7 Status highlight text for signal loss"),
- imageName: "exclamationmark.circle.fill",
- state: .warning)
- }
- if let latestReading = latestReading, latestReading.algorithmState.isInSensorError {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nIssue", comment: "G7 Status highlight text for sensor error"),
- imageName: "exclamationmark.circle.fill",
- state: .warning)
- }
- if lifecycleState == .warmup {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nWarmup", comment: "G7 Status highlight text for sensor warmup"),
- imageName: "clock",
- state: .normalCGM)
- }
- return nil
- }
- // TODO Placeholder.
- public var cgmStatusBadge: DeviceStatusBadge? {
- if lifecycleState == .gracePeriod {
- return G7DeviceStatusBadge(image: UIImage(systemName: "clock"), state: .critical)
- }
- return nil
- }
- // TODO Placeholder.
- public var cgmLifecycleProgress: DeviceLifecycleProgress? {
- switch lifecycleState {
- case .ok:
- // show remaining lifetime, if < 24 hours
- guard let expiration = sensorExpiresAt else {
- return nil
- }
- let remaining = max(0, expiration.timeIntervalSinceNow)
- if remaining < .hours(24) {
- return G7LifecycleProgress(percentComplete: 1-(remaining/G7Sensor.lifetime), progressState: .warning)
- }
- return nil
- case .gracePeriod:
- guard let endTime = sensorEndsAt else {
- return nil
- }
- let remaining = max(0, endTime.timeIntervalSinceNow)
- return G7LifecycleProgress(percentComplete: 1-(remaining/G7Sensor.gracePeriod), progressState: .critical)
- case .expired:
- return G7LifecycleProgress(percentComplete: 1, progressState: .critical)
- default:
- return nil
- }
- }
- }
- struct G7DeviceStatusBadge: DeviceStatusBadge {
- var image: UIImage?
- var state: LoopKitUI.DeviceStatusBadgeState
- }
- struct G7LifecycleProgress: DeviceLifecycleProgress {
- var percentComplete: Double
- var progressState: LoopKit.DeviceLifecycleProgressState
- }
|