forked from LoopKit/Loop
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWatchContext.swift
More file actions
124 lines (98 loc) · 3.86 KB
/
Copy pathWatchContext.swift
File metadata and controls
124 lines (98 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// WatchContext.swift
// Naterade
//
// Created by Nathan Racklyeft on 11/25/15.
// Copyright © 2015 Nathan Racklyeft. All rights reserved.
//
import Foundation
import HealthKit
final class WatchContext: NSObject, RawRepresentable {
typealias RawValue = [String: Any]
private let version = 3
var preferredGlucoseUnit: HKUnit?
var maxBolus: Double?
var glucose: HKQuantity?
var glucoseTrendRawValue: Int?
var eventualGlucose: HKQuantity?
var glucoseDate: Date?
var glucoseRangeScheduleOverride: GlucoseRangeScheduleOverrideUserInfo?
var configuredOverrideContexts: [GlucoseRangeScheduleOverrideUserInfo.Context] = []
var loopLastRunDate: Date?
var lastNetTempBasalDose: Double?
var lastNetTempBasalDate: Date?
var recommendedBolusDose: Double?
var bolusSuggestion: BolusSuggestionUserInfo? {
guard let recommended = recommendedBolusDose else { return nil }
return BolusSuggestionUserInfo(recommendedBolus: recommended, maxBolus: maxBolus)
}
var COB: Double?
var IOB: Double?
var reservoir: Double?
var reservoirPercentage: Double?
var batteryPercentage: Double?
override init() {
super.init()
}
required init?(rawValue: RawValue) {
super.init()
guard rawValue["v"] as? Int == version else {
return nil
}
if let unitString = rawValue["gu"] as? String {
let unit = HKUnit(from: unitString)
preferredGlucoseUnit = unit
if let glucoseValue = rawValue["gv"] as? Double {
glucose = HKQuantity(unit: unit, doubleValue: glucoseValue)
}
if let glucoseValue = rawValue["egv"] as? Double {
eventualGlucose = HKQuantity(unit: unit, doubleValue: glucoseValue)
}
}
glucoseTrendRawValue = rawValue["gt"] as? Int
glucoseDate = rawValue["gd"] as? Date
if let overrideUserInfoRawValue = rawValue["grsoc"] as? GlucoseRangeScheduleOverrideUserInfo.RawValue,
let overrideUserInfo = GlucoseRangeScheduleOverrideUserInfo(rawValue: overrideUserInfoRawValue)
{
glucoseRangeScheduleOverride = overrideUserInfo
}
if let configuredOverrideContextsRawValues = rawValue["coc"] as? [GlucoseRangeScheduleOverrideUserInfo.Context.RawValue] {
configuredOverrideContexts = configuredOverrideContextsRawValues.compactMap(GlucoseRangeScheduleOverrideUserInfo.Context.init(rawValue:))
}
IOB = rawValue["iob"] as? Double
reservoir = rawValue["r"] as? Double
reservoirPercentage = rawValue["rp"] as? Double
batteryPercentage = rawValue["bp"] as? Double
loopLastRunDate = rawValue["ld"] as? Date
lastNetTempBasalDose = rawValue["ba"] as? Double
lastNetTempBasalDate = rawValue["bad"] as? Date
recommendedBolusDose = rawValue["rbo"] as? Double
COB = rawValue["cob"] as? Double
maxBolus = rawValue["mb"] as? Double
}
var rawValue: RawValue {
var raw: [String: Any] = [
"v": version
]
raw["ba"] = lastNetTempBasalDose
raw["bad"] = lastNetTempBasalDate
raw["bp"] = batteryPercentage
raw["cob"] = COB
if let unit = preferredGlucoseUnit {
raw["egv"] = eventualGlucose?.doubleValue(for: unit)
raw["gu"] = unit.unitString
raw["gv"] = glucose?.doubleValue(for: unit)
}
raw["gt"] = glucoseTrendRawValue
raw["gd"] = glucoseDate
raw["grsoc"] = glucoseRangeScheduleOverride?.rawValue
raw["coc"] = configuredOverrideContexts.map { $0.rawValue }
raw["iob"] = IOB
raw["ld"] = loopLastRunDate
raw["mb"] = maxBolus
raw["r"] = reservoir
raw["rbo"] = recommendedBolusDose
raw["rp"] = reservoirPercentage
return raw
}
}