WatchSharedModels.swift
6.72 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
import Foundation
import SwiftUI
import HealthKit
extension WatchThemeModel{
func description(for state: HRVStressState) -> (title: String?, image: Image?){
switch state {
case .wait:
return (state.name, state.defaultThemeImage)
case .stressful:
var image: Image?
if let imageUrl = stressfulImageURL,
let imageData = AppGroupConstants.defaults?.data(forKey: imageUrl),
let uiImage = UIImage(data: imageData){
image = Image(uiImage: uiImage)
}
return (stressfulTitle, image)
case .slightStress:
var image: Image?
if let imageUrl = slightStressImageURL,
let imageData = AppGroupConstants.defaults?.data(forKey: imageUrl),
let uiImage = UIImage(data: imageData){
image = Image(uiImage: uiImage)
}
return (slightStressTitle, image)
case .normal:
var image: Image?
if let imageUrl = normalImageURL,
let imageData = AppGroupConstants.defaults?.data(forKey: imageUrl),
let uiImage = UIImage(data: imageData){
image = Image(uiImage: uiImage)
}
return (normalTitle, image)
case .energetic:
var image: Image?
if let imageUrl = energeticImageURL,
let imageData = AppGroupConstants.defaults?.data(forKey: imageUrl),
let uiImage = UIImage(data: imageData){
image = Image(uiImage: uiImage)
}
return (energeticTitle, image)
}
}
}
enum HRVStressState: Int, Codable, CaseIterable{
case wait
case stressful
case slightStress
case normal
case energetic
var name: String{
switch self {
case .wait:
return "等待数据"
case .stressful:
return "压力过载"
case .slightStress:
return "注意压力"
case .normal:
return "状态正常"
case .energetic:
return "活力满满"
}
}
var themeColor: Color{
switch self {
case .energetic:
return DFWatchFigmaColor.green
case .normal:
return DFWatchFigmaColor.blue
case .slightStress:
return DFWatchFigmaColor.orange
case .stressful:
return DFWatchFigmaColor.red
case .wait:
return DFWatchFigmaColor.grayBar
}
}
var defaultThemeImage: Image{
switch self {
case .energetic:
return Image(.themeDefaultLevel1)
case .normal:
return Image(.themeDefaultLevel2)
case .slightStress:
return Image(.themeDefaultLevel3)
case .stressful:
return Image(.themeDefaultLevel4)
case .wait:
return Image(.themeDefaultNoData)
}
}
}
struct WatchHRVData: Codable {
var latest_hrv_time: Int?
/// 最新的hrv
var latest_hrv: Double?
var hrv_state: HRVStressState?
var latest_stress_time: Int?
/// 直接加百分号
var latest_stress_value: Double?
var stress_state: HRVStressState?
var friend_latest_hrv_time: Int?
var friend_latest_hrv: Double?
var friend_hrv_state: HRVStressState?
var friend_latest_stress_time: Int?
var friend_latest_stress_value: Double?
var friend_stress_state: HRVStressState?
var myHRVData: WatchHRVPersonalData{
return WatchHRVPersonalData(isMe: true,
latest_hrv: latest_hrv,
latest_hrv_time: latest_hrv_time,
hrv_state: hrv_state,
latest_stress_time: latest_stress_time,
latest_stress_value: latest_stress_value,
stress_state: stress_state
)
}
var otherHRVData: WatchHRVPersonalData{
return WatchHRVPersonalData(isMe: false,
latest_hrv: friend_latest_hrv,
latest_hrv_time: friend_latest_hrv_time,
hrv_state: friend_hrv_state,
latest_stress_time: friend_latest_stress_time,
latest_stress_value: friend_latest_stress_value,
stress_state: friend_stress_state
)
}
}
struct WatchHRVPersonalData{
var isMe: Bool
var latest_hrv: Double?
var latest_hrv_time: Int?
var hrv_state: HRVStressState?
var latest_stress_time: Int?
var latest_stress_value: Double?
var stress_state: HRVStressState?
}
struct ActivityTarget: Codable {
var id: Int?
var create_time: Int?
var update_time: Int?
var user_id: Int?
var move: Int?
var step: Int?
var stand: Int?
var exercise: Int?
var activity_move_mode: Int?
var active_energy_burned: Double?
var active_energy_burned_goal: Double?
var apple_move_time: Double?
var apple_move_time_goal: Double?
var apple_exercise_time: Double?
var exercise_time_goal: Double?
var apple_stand_hours: Double?
var stand_hours_goal: Double?
}
extension String {
var url: URL? {
URL(string: self)
}
var int: Int? {
Int(self)
}
}
extension Int {
var string: String {
String(self)
}
var double: Double {
Double(self)
}
}
extension Double {
var int: Int {
Int(self)
}
}
extension Array where Element == Double {
func average() -> Double {
guard !isEmpty else { return 0 }
return reduce(0, +) / Double(count)
}
}
struct SleepStage {
let stage: HKCategoryValueSleepAnalysis
let startTime: Date
let endTime: Date
let duration: TimeInterval
}
struct SleepData {
let startTime: Date
let endTime: Date
let duration: TimeInterval
let sleepStages: [SleepStage]
let totalSleepTime: TimeInterval
let sleepEfficiency: Double?
}
enum HealthDataType: Int {
case hrv = 1
case heartRate = 2
case spo2 = 3
case move = 4
case exercise = 5
case stand = 6
case steps = 7
case walkingHeartRate = 8
case restingHeartRate = 9
case sleepingHeartRate = 10
case sleepingWristTemperature = 11
case respiratoryRate = 12
case irregularHeartRhythm = 13
}
private struct DynamicCodingKey: CodingKey {
var stringValue: String
var intValue: Int?
init?(stringValue: String) {
self.stringValue = stringValue
}
init?(intValue: Int) {
self.stringValue = "\(intValue)"
self.intValue = intValue
}
}