Commit d559de190f01f09423837aa94d465e859d5b2cb6
1 parent
cbe73597
feat:parse blood oxygen, temperature, pressure
Showing
2 changed files
with
67 additions
and
27 deletions
HDFwear/Home/Model/HealthModel.swift
... | ... | @@ -459,7 +459,6 @@ class HeartRateModel: Object { |
459 | 459 | } |
460 | 460 | |
461 | 461 | //MARK: - 体温 |
462 | -//jtd! | |
463 | 462 | class TemperatureModel: Object { |
464 | 463 | @Persisted var value: Int = -1 |
465 | 464 | @Persisted var date: Date? = nil |
... | ... | @@ -471,14 +470,18 @@ class TemperatureModel: Object { |
471 | 470 | } |
472 | 471 | |
473 | 472 | class func toTemperatureArray(_ bytes: [UInt8]) -> [TemperatureModel] { |
474 | - var hrArray: [TemperatureModel] = [] | |
475 | - let num = bytes.count/7 | |
476 | - for i in 0..<num { | |
477 | - let date = DateInRegion(year: Int(bytes[i*7])+2000, month: Int(bytes[i*7+1]), day: Int(bytes[i*7+2]), hour: Int(bytes[i*7+3]), minute: Int(bytes[i*7+4]), second: Int(bytes[i*7+5])).date | |
478 | - let hr = TemperatureModel(value: Int(bytes[i*7+6]), date: date) | |
479 | - hrArray.append(hr) | |
473 | + var tArray: [TemperatureModel] = [] | |
474 | + // 将数组分成5个一组 | |
475 | + let groupedArray = stride(from: 0, to: bytes.count, by: 5).map { Array(bytes[$0..<min($0 + 5, bytes.count)]) } | |
476 | + // 处理每组的前四个数 | |
477 | + for group in groupedArray { | |
478 | + let hexValue = group.prefix(4).reduce(0) { ($0 << 8) + UInt32($1) } | |
479 | + let timestamp = TimeInterval(hexValue) | |
480 | + let date = Date(timeIntervalSince1970: timestamp) | |
481 | + let hr = TemperatureModel(value: Int(group[4]), date: date) | |
482 | + tArray.append(hr) | |
480 | 483 | } |
481 | - return hrArray | |
484 | + return tArray | |
482 | 485 | } |
483 | 486 | |
484 | 487 | private func add() { |
... | ... | @@ -986,11 +989,15 @@ class BloodOxygenModel: Object { |
986 | 989 | |
987 | 990 | class func toBloodOxygenArray(_ bytes: [UInt8]) -> [BloodOxygenModel] { |
988 | 991 | var boArray: [BloodOxygenModel] = [] |
989 | - let num = bytes.count/7 | |
990 | - for i in 0..<num { | |
991 | - let data = DateInRegion(year: Int(bytes[i*7])+2000, month: Int(bytes[i*7+1]), day: Int(bytes[i*7+2]), hour: Int(bytes[i*7+3]), minute: Int(bytes[i*7+4]), second: Int(bytes[i*7+5])) | |
992 | - let bo = BloodOxygenModel(value: Int(bytes[i*7+6]), date: data.date) | |
993 | - boArray.append(bo) | |
992 | + // 将数组分成5个一组 | |
993 | + let groupedArray = stride(from: 0, to: bytes.count, by: 5).map { Array(bytes[$0..<min($0 + 5, bytes.count)]) } | |
994 | + // 处理每组的前四个数 | |
995 | + for group in groupedArray { | |
996 | + let hexValue = group.prefix(4).reduce(0) { ($0 << 8) + UInt32($1) } | |
997 | + let timestamp = TimeInterval(hexValue) | |
998 | + let date = Date(timeIntervalSince1970: timestamp) | |
999 | + let hr = BloodOxygenModel(value: Int(group[4]), date: date) | |
1000 | + boArray.append(hr) | |
994 | 1001 | } |
995 | 1002 | return boArray |
996 | 1003 | } |
... | ... | @@ -1842,20 +1849,15 @@ class PressureModel: Object { |
1842 | 1849 | |
1843 | 1850 | class func toPressureArray(_ bytes: [UInt8]) -> [PressureModel] { |
1844 | 1851 | var pressureArray: [PressureModel] = [] |
1845 | - if Int(bytes[0]) == 0 && Int(bytes[1]) == 0 { | |
1846 | - return [] | |
1847 | - } | |
1848 | - let date = DateInRegion(year: Int(bytes[0])+2000, month: Int(bytes[1]), day: Int(bytes[2]), hour: 0, minute: 0, second: 0).date | |
1849 | - let pressureBytes: [UInt8] = Array(bytes[4..<bytes.count]) | |
1850 | - let num = min(pressureBytes.count, 24) | |
1851 | - for i in 0..<num { | |
1852 | - let value = Int(pressureBytes[i]) | |
1853 | - if date.isInPast { | |
1854 | - // if !date.isInPast { | |
1855 | - let pressure = PressureModel(value: value, date: date+i.hours) | |
1856 | - pressureArray.append(pressure) | |
1857 | - // } | |
1858 | - } | |
1852 | + // 将数组分成5个一组 | |
1853 | + let groupedArray = stride(from: 0, to: bytes.count, by: 5).map { Array(bytes[$0..<min($0 + 5, bytes.count)]) } | |
1854 | + // 处理每组的前四个数 | |
1855 | + for group in groupedArray { | |
1856 | + let hexValue = group.prefix(4).reduce(0) { ($0 << 8) + UInt32($1) } | |
1857 | + let timestamp = TimeInterval(hexValue) | |
1858 | + let date = Date(timeIntervalSince1970: timestamp) | |
1859 | + let pressure = PressureModel(value: Int(group[4]), date: date) | |
1860 | + pressureArray.append(pressure) | |
1859 | 1861 | } |
1860 | 1862 | return pressureArray |
1861 | 1863 | } | ... | ... |
HDFwear/Tools/BluetoothManager+Function.swift
... | ... | @@ -341,12 +341,18 @@ extension BluetoothManager { |
341 | 341 | parseHeartRateData(content) |
342 | 342 | case 0x8017:// 历史血氧数据上报 |
343 | 343 | print("历史血氧数据上报") |
344 | + let content = parseContentFromBytes(bytes) | |
345 | + parseBlooodOxygenData(content) | |
344 | 346 | case 0x8018:// 历史体温数据上报 |
345 | 347 | print("历史体温数据上报") |
348 | + let content = parseContentFromBytes(bytes) | |
349 | + parseTemperaturData(content) | |
346 | 350 | case 0x8019:// 睡眠数据上报 |
347 | 351 | print("睡眠数据上报") |
348 | 352 | case 0x8020:// 历史压力数据上报 |
349 | 353 | print("历史压力数据上报") |
354 | + let content = parseContentFromBytes(bytes) | |
355 | + parsePressureData(content) | |
350 | 356 | case 0x8021:// 分时段计步数据上报 |
351 | 357 | print("分时段计步数据上报") |
352 | 358 | case 0x8022:// 遥控拍照 |
... | ... | @@ -452,4 +458,36 @@ extension BluetoothManager { |
452 | 458 | HeartRateModel.addArray(hrArray)// 加入数据库 |
453 | 459 | heartRateClosure?(hrArray, nil) |
454 | 460 | } |
461 | + | |
462 | + func parseBlooodOxygenData (_ content: [UInt8]) { | |
463 | + guard content.count > 0 else { | |
464 | + print("无有效的信息") | |
465 | + bloodOxygenClosure?([], nil) | |
466 | + return | |
467 | + } | |
468 | + let array = BloodOxygenModel.toBloodOxygenArray(content) | |
469 | + BloodOxygenModel.addArray(array)// 加入数据库 | |
470 | + bloodOxygenClosure?(array, nil) | |
471 | + } | |
472 | + | |
473 | + func parseTemperaturData (_ content: [UInt8]) { | |
474 | + guard content.count > 0 else { | |
475 | + print("无有效的信息") | |
476 | + return | |
477 | + } | |
478 | + let array = TemperatureModel.toTemperatureArray(content) | |
479 | + TemperatureModel.addArray(array)// 加入数据库 | |
480 | + } | |
481 | + | |
482 | + func parsePressureData (_ content: [UInt8]) { | |
483 | + guard content.count > 0 else { | |
484 | + print("无有效的信息") | |
485 | + pressureClosure?([], nil) | |
486 | + return | |
487 | + } | |
488 | + let array = PressureModel.toPressureArray(content) | |
489 | + PressureModel.addArray(array)// 加入数据库 | |
490 | + pressureClosure?(array, nil) | |
491 | + } | |
492 | + | |
455 | 493 | } | ... | ... |