Commit 36b76cd7949818ee2bde712d8c48ad97333b8894

Authored by jason
1 parent 6e0a8d81

feat:intensive time now & history data

HDFwear.xcodeproj/project.pbxproj
... ... @@ -286,6 +286,7 @@
286 286 847482762B03793C0004F0C2 /* NewWeatherModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847482752B03793C0004F0C2 /* NewWeatherModel.swift */; };
287 287 847672B82B074E43007DC2DE /* NewBeiDouContactModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847672B72B074E43007DC2DE /* NewBeiDouContactModel.swift */; };
288 288 847AF36E2B4CF35F00E3456E /* NewSleepModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847AF36D2B4CF35F00E3456E /* NewSleepModel.swift */; };
  289 + 847B88EF2B5780CA00851EE7 /* NewIntensiveTimeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 847B88EE2B5780CA00851EE7 /* NewIntensiveTimeModel.swift */; };
289 290 84DA399D2B4D3A5B008D34A9 /* NewGpsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DA399C2B4D3A5B008D34A9 /* NewGpsModel.swift */; };
290 291 B212F1FD2A14CE0400781D59 /* LaunchSetting.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B212F1FF2A14CE0400781D59 /* LaunchSetting.storyboard */; };
291 292 B212F2052A14D28E00781D59 /* LaunchMyBodySettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B212F2042A14D28E00781D59 /* LaunchMyBodySettingVC.swift */; };
... ... @@ -666,6 +667,7 @@
666 667 847482752B03793C0004F0C2 /* NewWeatherModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewWeatherModel.swift; sourceTree = "<group>"; };
667 668 847672B72B074E43007DC2DE /* NewBeiDouContactModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewBeiDouContactModel.swift; sourceTree = "<group>"; };
668 669 847AF36D2B4CF35F00E3456E /* NewSleepModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewSleepModel.swift; sourceTree = "<group>"; };
  670 + 847B88EE2B5780CA00851EE7 /* NewIntensiveTimeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewIntensiveTimeModel.swift; sourceTree = "<group>"; };
669 671 847D1C4A2B009FAC0097A96E /* 20231111ReadMe.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = 20231111ReadMe.md; sourceTree = "<group>"; };
670 672 847D2DE42B3D575F001BA7EF /* 20240110ReadMe.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = 20240110ReadMe.md; sourceTree = "<group>"; };
671 673 84DA399C2B4D3A5B008D34A9 /* NewGpsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewGpsModel.swift; sourceTree = "<group>"; };
... ... @@ -1287,6 +1289,7 @@
1287 1289 847AF36D2B4CF35F00E3456E /* NewSleepModel.swift */,
1288 1290 84DA399C2B4D3A5B008D34A9 /* NewGpsModel.swift */,
1289 1291 845ADEA02B551C8E00C3AD73 /* NewStepModel.swift */,
  1292 + 847B88EE2B5780CA00851EE7 /* NewIntensiveTimeModel.swift */,
1290 1293 );
1291 1294 path = Model;
1292 1295 sourceTree = "<group>";
... ... @@ -1713,6 +1716,7 @@
1713 1716 6C1B7EA427B7976600DB9D1C /* NFCDetailVC.swift in Sources */,
1714 1717 6CD70CFE27D5AAEB00687095 /* PayProcessVC.swift in Sources */,
1715 1718 6C411EE5275DFF37009B2E02 /* Bluetooth+Types.swift in Sources */,
  1719 + 847B88EF2B5780CA00851EE7 /* NewIntensiveTimeModel.swift in Sources */,
1716 1720 6C0AE825279151260064D377 /* AppVersionView.swift in Sources */,
1717 1721 6C2EE98E2780265B0051413A /* SleepReportCell.swift in Sources */,
1718 1722 6C1B7EA127B7976600DB9D1C /* NFCProblemsVC.swift in Sources */,
... ...
HDFwear/20240126ReadMe.md
... ... @@ -88,8 +88,17 @@ BluetoothManager+Function
88 88 接收: [237, 126, 0, 1, 128, 37, 0, 1, 0, 169, 1, 101, 133, 64, 133, 0, 0, 0, 20, 13, 84, 138, 254, 0, 1, 134, 160, 67, 167, 168, 250, 0, 1, 134, 160, 13, 84, 142, 230, 0, 1, 134, 160, 67, 167, 172, 226, 0, 1, 134, 160, 13, 84, 146, 206, 0, 1, 134, 160, 67, 167, 176, 202, 0, 1, 134, 160, 13, 84, 142, 230, 0, 1, 134, 160, 67, 167, 172, 226, 0, 1, 134, 160, 13, 84, 138, 254, 0, 1, 134, 160, 67, 167, 168, 250, 0, 1, 134, 160, 13, 84, 135, 22, 0, 1, 134, 160, 67, 167, 161, 42, 0, 1, 134, 160, 13, 84, 131, 46, 0, 1, 134, 160, 67, 167, 157, 66, 0, 1, 134, 160, 13, 84, 123, 94, 0, 1, 134, 160, 67, 167, 153, 90, 0, 1, 134, 160, 13, 84, 119, 118, 0, 1, 134, 160, 67, 167, 149, 114, 0, 1, 134, 160, 13, 84, 115, 142, 0, 1, 134, 160, 67, 167, 141, 162, 0, 1, 134, 160, 68, 78]
89 89 接收: [237, 126, 0, 1, 128, 37, 0, 1, 0, 1, 255, 107, 166]
90 90  
91   -
92   -
93   -
  91 +拉取中高强度时长数据
  92 + func newGetIntensiveTimeData(option: SyncOption = .now, closure: IntensiveTimeClosure? = nil)
  93 + 当前
  94 + 发送: [237, 126, 0, 1, 0, 40, 0, 1, 0, 2, 11, 1, 250, 50]
  95 + 接收: [237, 126, 0, 1, 128, 40, 0, 1, 0, 28, 7, 232, 1, 9, 0, 0, 0, 0, 0, 0, 10, 10, 10, 20, 30, 52, 0, 24, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 123]
  96 + 接收: [237, 126, 0, 1, 128, 40, 0, 1, 0, 1, 255, 37, 229]
  97 + 历史
  98 + 发送: [237, 126, 0, 1, 0, 40, 0, 1, 0, 2, 11, 2, 202, 81]
  99 + 接收: [237, 126, 0, 1, 128, 40, 0, 2, 0, 28, 7, 232, 1, 8, 0, 0, 0, 0, 0, 0, 10, 10, 10, 20, 30, 52, 0, 24, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 149]
  100 + 接收: [237, 126, 0, 1, 128, 40, 0, 2, 0, 28, 7, 232, 1, 8, 0, 0, 0, 0, 0, 0, 10, 10, 10, 20, 30, 52, 0, 24, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 149]
  101 + 接收: [237, 126, 0, 1, 128, 40, 0, 2, 0, 28, 7, 232, 1, 9, 0, 0, 0, 0, 0, 0, 10, 10, 10, 20, 30, 52, 0, 24, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 33]
  102 + 接收: [237, 126, 0, 1, 128, 40, 0, 2, 0, 1, 255, 190, 57]
94 103  
95 104 接受数据类
... ...
HDFwear/Home/Model/NewIntensiveTimeModel.swift 0 → 100644
  1 +//
  2 +// NewIntensiveTimeModel.swift
  3 +// HDFwear
  4 +//
  5 +// Created by admin on 2024/1/17.
  6 +//
  7 +
  8 +import Foundation
  9 +import UIKit
  10 +import HandyJSON
  11 +import SwiftDate
  12 +
  13 +class NewIntensiveTimeModel: NSObject {
  14 + required override init() { }
  15 +
  16 + var year: UInt32 = 0
  17 + var month: UInt32 = 0
  18 + var day: UInt32 = 0
  19 + var intensiveFragments : [UInt8] = []
  20 +
  21 +
  22 + override var description: String {
  23 + let dateFormatter = DateFormatter()
  24 + dateFormatter.dateFormat = "yyyy-MM-dd"
  25 + let dateString = dateFormatter.string(from: DateComponents(calendar: Calendar.current, year: Int(year), month: Int(month), day: Int(day)).date!)
  26 +
  27 + let fragmentsString = intensiveFragments.map { String(format: "%d", $0) }.joined(separator: " ")
  28 +
  29 + return "NewIntensiveTimeModel\n" +
  30 + "Date: \(dateString)\n" +
  31 + "Intensive Fragments: \(fragmentsString)"
  32 + }
  33 +
  34 + class func toIntensiveTimeModel(_ data: [UInt8]) -> NewIntensiveTimeModel {
  35 + let s = NewIntensiveTimeModel()
  36 + guard data.count >= 28 else {
  37 + return s
  38 + }
  39 +
  40 + s.year = data[0..<2].reduce(0) { ($0 << 8) + UInt32($1) }
  41 + s.month = data[2..<3].reduce(0) { ($0 << 8) + UInt32($1) }
  42 + s.day = data[3..<4].reduce(0) { ($0 << 8) + UInt32($1) }
  43 + s.intensiveFragments = Array(data[4..<28])
  44 + return s;
  45 + }
  46 +}
... ...
HDFwear/Mine/MineViewController.swift
... ... @@ -590,6 +590,27 @@ extension MineViewController: UITableViewDataSource, UITableViewDelegate {
590 590 }
591 591 }
592 592  
  593 + let archiveAction102a = UIAlertAction(title: "newGetIntensiveTimeData now", style: .default) {[weak self] action in
  594 + BluetoothManager.shared.newGetIntensiveTimeData(option: .now) {intensiveTimeModel, error in
  595 + if error != nil {
  596 + print("newGetIntensiveTimeData" + (error?.description ?? ""))
  597 + }else {
  598 + self?.showDetailAlert(msg: intensiveTimeModel?.description)
  599 + print("newGetIntensiveTimeData success")
  600 + }
  601 + }
  602 + }
  603 + let archiveAction102b = UIAlertAction(title: "newGetIntensiveTimeData history", style: .default) {[weak self] action in
  604 + BluetoothManager.shared.newGetIntensiveTimeData(option: .history) {intensiveTimeModel, error in
  605 + if error != nil {
  606 + print("newGetIntensiveTimeData" + (error?.description ?? ""))
  607 + }else {
  608 + self?.showDetailAlert(msg: intensiveTimeModel?.description)
  609 + print("newGetIntensiveTimeData success")
  610 + }
  611 + }
  612 + }
  613 +
593 614  
594 615 alert.addAction(archiveAction9a)
595 616 alert.addAction(archiveAction9b)
... ... @@ -605,6 +626,8 @@ extension MineViewController: UITableViewDataSource, UITableViewDelegate {
605 626 alert.addAction(archiveAction22)
606 627 alert.addAction(archiveAction101a)
607 628 alert.addAction(archiveAction101b)
  629 + alert.addAction(archiveAction102a)
  630 + alert.addAction(archiveAction102b)
608 631  
609 632 alert.addAction(UIAlertAction(title: "取消", style: .destructive, handler: nil))
610 633 present(alert, animated: true, completion: nil)
... ...
HDFwear/Tools/Bluetooth+Types.swift
... ... @@ -176,6 +176,8 @@ enum SyncType: UInt8 {
176 176 case step = 0x08
177 177 case battery = 0x09
178 178 case gps = 0x0A
  179 + case intensiveTime = 0x0B
  180 + case beidouCard = 0x0C
179 181 case other = 0xff
180 182 }
181 183  
... ...
HDFwear/Tools/BluetoothManager+Function.swift
... ... @@ -238,6 +238,12 @@ extension BluetoothManager {
238 238 newStartSyncHealthData(closure: closure, data: data, synType: .gps)
239 239 }
240 240  
  241 + // 拉取中高强度时长
  242 + func newGetIntensiveTimeData(option: SyncOption = .now, closure: IntensiveTimeClosure? = nil) {
  243 + let data = BleMessage.shared.getSyncCmd(.intensiveTime, option)
  244 + newStartSyncHealthData(closure: closure, data: data, synType: .intensiveTime)
  245 + }
  246 +
241 247 //MARK: - old code
242 248 // 拉取睡眠数据
243 249 func getSleepData(option: SyncOption = .now, closure: SleepClosure? = nil) {
... ... @@ -342,6 +348,12 @@ extension BluetoothManager {
342 348 gpsClosure?(nil, -1002)
343 349 gpsClosure = nil
344 350 }
  351 + case is IntensiveTimeClosure:
  352 + if intensiveTimeClosure == nil {
  353 + intensiveTimeClosure = closure as? IntensiveTimeClosure
  354 + intensiveTimeClosure?(nil, -1002)
  355 + intensiveTimeClosure = nil
  356 + }
345 357 default:
346 358 break
347 359 }
... ... @@ -534,6 +546,16 @@ extension BluetoothManager {
534 546 }else {
535 547 parseGpsData(content)
536 548 }
  549 + case 0x8028://中高强度时长
  550 + print("中高强度时长")
  551 + let content = parseContentFromBytes(bytes)
  552 + if (content.count == 1 && content.first == 0xff) {
  553 + for delegate in syncDelegateList {
  554 + delegate.didReceiveFinishCommand(0x8028)
  555 + }
  556 + }else {
  557 + parseIntensiveTimeData(content)
  558 + }
537 559 default:
538 560 break
539 561 }
... ... @@ -718,4 +740,15 @@ extension BluetoothManager {
718 740 let gpsModel = NewGpsModel.toGpsModel(content)
719 741 gpsClosure?(gpsModel, nil)
720 742 }
  743 +
  744 + // 中高强度时长数据
  745 + func parseIntensiveTimeData(_ content: [UInt8]) {
  746 + guard content.count > 0 else {
  747 + print("无有效的信息")
  748 + intensiveTimeClosure?(nil, nil)
  749 + return
  750 + }
  751 + let gpsModel = NewIntensiveTimeModel.toIntensiveTimeModel(content)
  752 + intensiveTimeClosure?(gpsModel, nil)
  753 + }
721 754 }
... ...
HDFwear/Tools/BluetoothManager.swift
... ... @@ -95,6 +95,8 @@ class BluetoothManager: NSObject {
95 95 var mettClosure: MettClosure?
96 96 typealias GpsClosure = (_ gps: NewGpsModel?, _ error: Int?) -> Void
97 97 var gpsClosure: GpsClosure?
  98 + typealias IntensiveTimeClosure = (_ intensiveTime:NewIntensiveTimeModel?, _ error: Int?) -> Void
  99 + var intensiveTimeClosure: IntensiveTimeClosure?
98 100  
99 101 typealias DialProgressClosure = (_ progress: Int) -> Void
100 102 var dialProgressClosure: DialProgressClosure?
... ... @@ -1291,6 +1293,8 @@ class BluetoothManager: NSObject {
1291 1293 trainClosure = nil
1292 1294 pressureClosure = nil
1293 1295 mettClosure = nil
  1296 + gpsClosure = nil
  1297 + intensiveTimeClosure = nil
1294 1298 switch closure {
1295 1299 case is BloodPressureClosure:
1296 1300 bloodPressureClosure = closure as? BloodPressureClosure
... ... @@ -1310,6 +1314,8 @@ class BluetoothManager: NSObject {
1310 1314 mettClosure = closure as? MettClosure
1311 1315 case is GpsClosure:
1312 1316 gpsClosure = closure as? GpsClosure
  1317 + case is IntensiveTimeClosure:
  1318 + intensiveTimeClosure = closure as? IntensiveTimeClosure
1313 1319 default:
1314 1320 break
1315 1321 }
... ...