Commit d559de190f01f09423837aa94d465e859d5b2cb6

Authored by daifengyi
1 parent cbe73597

feat:parse blood oxygen, temperature, pressure

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 }
... ...