NewSleepModel.swift
6.49 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
import UIKit
import HandyJSON
import SwiftDate
enum NewSleepType: UInt8 {
case nightSleep = 1
case shortNap = 2
case nightSleepAndNap = 3
}
enum NewSleepStatus: UInt8 {
case awake = 7
case rapidEyeMovement = 8
case lightSleep = 9
case deepSleep = 10
}
class NewSleepModel: NSObject {
required override init() { }
struct SleepFragment {
var sleepStatus: NewSleepStatus
var startTimeInterval: TimeInterval
var startTime: Date?
var endTimeInterval: TimeInterval
var endTime: Date?
var duration: UInt32
}
struct NapFragment {
var startTimeInterval: TimeInterval
var startTime: Date?
var endTimeInterval: TimeInterval
var endTime: Date?
var duration: UInt32
}
var sleepType: NewSleepType = .nightSleep
var sleepFragmentCount: Int = 0
var sleepFragments: [SleepFragment] = []
var napFragments: [NapFragment] = []
override var description: String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone.current
var description = "NewSleepModel\n"
description += "Sleep Type: \(sleepType)\n"
description += "Sleep Fragment Count: \(sleepFragmentCount)\n"
if !sleepFragments.isEmpty {
description += "Sleep Fragments:\n"
for (index, fragment) in sleepFragments.enumerated() {
description += " Fragment \(index + 1):\n"
description += " Status: \(fragment.sleepStatus)\n"
description += " Start TimeInterval: \(fragment.startTimeInterval)\n"
description += " Start Time: \(dateFormatter.string(from: fragment.startTime ?? Date()))\n"
description += " End TimeInterval: \(fragment.endTimeInterval)\n"
description += " End Time: \(dateFormatter.string(from: fragment.endTime ?? Date()))\n"
description += " Duration: \(fragment.duration) seconds\n"
}
}
if !napFragments.isEmpty {
description += "Nap Fragments:\n"
for (index, fragment) in napFragments.enumerated() {
description += " Fragment \(index + 1):\n"
description += " Start TimeInterval: \(fragment.startTimeInterval)\n"
description += " Start Time: \(dateFormatter.string(from:fragment.startTime ?? Date()))\n"
description += " End TimeInterval: \(fragment.endTimeInterval)\n"
description += " End Time: \(dateFormatter.string(from:fragment.endTime ?? Date()))\n"
description += " Duration: \(fragment.duration) seconds\n"
}
}
return description
}
init(sleepType: NewSleepType, sleepFragmentCount: Int, sleepFragments: [SleepFragment], napFragments: [NapFragment]) {
self.sleepType = sleepType
self.sleepFragmentCount = sleepFragmentCount
self.sleepFragments = sleepFragments
self.napFragments = napFragments
}
class func toSleepModel(_ data: [UInt8]) -> NewSleepModel {
let sleepModel = NewSleepModel()
guard data.count >= 1 else {
return sleepModel // 数据长度不够
}
sleepModel.sleepType = NewSleepType(rawValue:data[0]) ?? .nightSleep
switch sleepModel.sleepType {
case .nightSleep:
sleepModel.sleepFragmentCount = Int(data[1])
guard data.count >= 2 + 9 * sleepModel.sleepFragmentCount else {
return sleepModel
}
sleepModel.sleepFragments = sleepModel.parseNightSleepData(data: Array(data[2..<2 + 9 * sleepModel.sleepFragmentCount]))
case .shortNap:
sleepModel.napFragments = sleepModel.parseNapData(data: Array(data[1..<data.count]))
case .nightSleepAndNap:
sleepModel.sleepFragmentCount = Int(data[1])
guard data.count >= 2 + 9 * sleepModel.sleepFragmentCount else {
return sleepModel
}
sleepModel.sleepFragments = sleepModel.parseNightSleepData(data: Array(data[2..<2 + 9 * sleepModel.sleepFragmentCount]))
sleepModel.napFragments = sleepModel.parseNapData(data: Array(data[2 + 9 * sleepModel.sleepFragmentCount..<data.count]))
default:
break
}
return sleepModel
}
func parseNightSleepData(data: [UInt8]) -> [SleepFragment] {
// 解析 SleepFragment 数组
var sleepFragments = [SleepFragment]()
// 将数组分成9个一组
for index in stride(from: 0, to: data.count, by: 9) {
let sleepStatus = NewSleepStatus(rawValue: data[index]) ?? .awake
let combinedUInt32 = data[index + 1..<index + 5].reduce(0) { ($0 << 8) + UInt32($1) }
let startTime = Date(timeIntervalSince1970: TimeInterval(combinedUInt32))
let duration = UInt32(data[index + 5..<index + 9].reduce(0) { ($0 << 8) + UInt32($1) })
let endTimeInterval = TimeInterval(combinedUInt32 + duration)
let endTime = Date(timeIntervalSince1970: endTimeInterval)
let fragment = SleepFragment(sleepStatus: sleepStatus,startTimeInterval: TimeInterval(combinedUInt32), startTime: startTime, endTimeInterval: endTimeInterval, endTime: endTime, duration: duration)
sleepFragments.append(fragment)
}
return sleepFragments
}
func parseNapData(data: [UInt8]) -> [NapFragment] {
// 解析 NapFragment 数组
var napFragments = [NapFragment]()
// 将数组分成12个一组
for index in stride(from: 0, to: data.count, by: 12) {
let startCombinedUInt32 = data[index + 0..<index + 4].reduce(0) { ($0 << 8) + UInt32($1) }
let startTime = Date(timeIntervalSince1970: TimeInterval(startCombinedUInt32))
let endCombinedUInt32 = data[index + 4..<index + 8].reduce(0) { ($0 << 8) + UInt32($1) }
let endTime = Date(timeIntervalSince1970: TimeInterval(endCombinedUInt32))
let duration = data[index + 8..<index + 12].reduce(0) { ($0 << 8) + UInt32($1) }
let napFragment = NapFragment(startTimeInterval: TimeInterval(startCombinedUInt32),startTime: startTime, endTimeInterval: TimeInterval(endCombinedUInt32), endTime: endTime, duration: duration)
napFragments.append(napFragment)
}
return napFragments
}
}