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,7 +459,6 @@ class HeartRateModel: Object { | ||
459 | } | 459 | } |
460 | 460 | ||
461 | //MARK: - 体温 | 461 | //MARK: - 体温 |
462 | -//jtd! | ||
463 | class TemperatureModel: Object { | 462 | class TemperatureModel: Object { |
464 | @Persisted var value: Int = -1 | 463 | @Persisted var value: Int = -1 |
465 | @Persisted var date: Date? = nil | 464 | @Persisted var date: Date? = nil |
@@ -471,14 +470,18 @@ class TemperatureModel: Object { | @@ -471,14 +470,18 @@ class TemperatureModel: Object { | ||
471 | } | 470 | } |
472 | 471 | ||
473 | class func toTemperatureArray(_ bytes: [UInt8]) -> [TemperatureModel] { | 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 | private func add() { | 487 | private func add() { |
@@ -986,11 +989,15 @@ class BloodOxygenModel: Object { | @@ -986,11 +989,15 @@ class BloodOxygenModel: Object { | ||
986 | 989 | ||
987 | class func toBloodOxygenArray(_ bytes: [UInt8]) -> [BloodOxygenModel] { | 990 | class func toBloodOxygenArray(_ bytes: [UInt8]) -> [BloodOxygenModel] { |
988 | var boArray: [BloodOxygenModel] = [] | 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 | return boArray | 1002 | return boArray |
996 | } | 1003 | } |
@@ -1842,20 +1849,15 @@ class PressureModel: Object { | @@ -1842,20 +1849,15 @@ class PressureModel: Object { | ||
1842 | 1849 | ||
1843 | class func toPressureArray(_ bytes: [UInt8]) -> [PressureModel] { | 1850 | class func toPressureArray(_ bytes: [UInt8]) -> [PressureModel] { |
1844 | var pressureArray: [PressureModel] = [] | 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 | return pressureArray | 1862 | return pressureArray |
1861 | } | 1863 | } |
HDFwear/Tools/BluetoothManager+Function.swift
@@ -341,12 +341,18 @@ extension BluetoothManager { | @@ -341,12 +341,18 @@ extension BluetoothManager { | ||
341 | parseHeartRateData(content) | 341 | parseHeartRateData(content) |
342 | case 0x8017:// 历史血氧数据上报 | 342 | case 0x8017:// 历史血氧数据上报 |
343 | print("历史血氧数据上报") | 343 | print("历史血氧数据上报") |
344 | + let content = parseContentFromBytes(bytes) | ||
345 | + parseBlooodOxygenData(content) | ||
344 | case 0x8018:// 历史体温数据上报 | 346 | case 0x8018:// 历史体温数据上报 |
345 | print("历史体温数据上报") | 347 | print("历史体温数据上报") |
348 | + let content = parseContentFromBytes(bytes) | ||
349 | + parseTemperaturData(content) | ||
346 | case 0x8019:// 睡眠数据上报 | 350 | case 0x8019:// 睡眠数据上报 |
347 | print("睡眠数据上报") | 351 | print("睡眠数据上报") |
348 | case 0x8020:// 历史压力数据上报 | 352 | case 0x8020:// 历史压力数据上报 |
349 | print("历史压力数据上报") | 353 | print("历史压力数据上报") |
354 | + let content = parseContentFromBytes(bytes) | ||
355 | + parsePressureData(content) | ||
350 | case 0x8021:// 分时段计步数据上报 | 356 | case 0x8021:// 分时段计步数据上报 |
351 | print("分时段计步数据上报") | 357 | print("分时段计步数据上报") |
352 | case 0x8022:// 遥控拍照 | 358 | case 0x8022:// 遥控拍照 |
@@ -452,4 +458,36 @@ extension BluetoothManager { | @@ -452,4 +458,36 @@ extension BluetoothManager { | ||
452 | HeartRateModel.addArray(hrArray)// 加入数据库 | 458 | HeartRateModel.addArray(hrArray)// 加入数据库 |
453 | heartRateClosure?(hrArray, nil) | 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 | } |