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..= 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.. [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.. [NapFragment] { // 解析 NapFragment 数组 var napFragments = [NapFragment]() // 将数组分成12个一组 for index in stride(from: 0, to: data.count, by: 12) { let startCombinedUInt32 = data[index + 0..