NewExerciseModel.swift 12 KB
//
//  NewExerciseModel.swift
//  HDFwear
//
//  Created by admin on 2024/1/19.
//

import Foundation
import UIKit
import HandyJSON
import SwiftDate

var localExerciseModel : NewExerciseModel?

class NewExerciseModel: NSObject {
    required override init() { }
    
    // 每次分7组数据传过来,一定会有7组,不管是否空
    // 第一组
    var starter: UInt32 = 0//谁发起的运动
    var type: UInt32 = 0//运动类型
    var startTimeInterval: TimeInterval = 0
    var startTime: Date?//运动开始时间
    var strength: UInt32 = 0//训练负荷
    var duration: UInt32 = 0//运动时长
    var distance: Float = 0//距离
    var calorie: Float = 0//卡路里
    var avaragePace: Float = 0//平均配速
    var maxPace: Float = 0//最大配速
    var step: UInt32 = 0//步数
    var stepPitch: Float = 0//步距
    var avarageFrequency: Float = 0//平均步频
    var maxFrequency: Float = 0//最大步频
    var climbAltitude: Float = 0//海拔  累计爬升
    var maxAltitude: Float = 0//最大海拔
    var minAltitude: Float = 0//最小海拔
    var maxOxygenUptake: UInt32 = 0//最大摄氧量
    var oxygenUptakeGrade: UInt32 = 0//摄氧量等级
    var maxHr: UInt32 = 0//最大心率
    var minHr: UInt32 = 0//最小心率
    var avarageHr: UInt32 = 0//平均心率
    var hrSectionPercent_warmUp: UInt32 = 0//心率区间百分比 热身
    var hrSectionPercent_fatBurning: UInt32 = 0//心率区间百分比 燃脂
    var hrSectionPercent_cardiopulmonary: UInt32 = 0//心率区间百分比 心肺提高
    var hrSectionPercent_anaerobic: UInt32 = 0//心率区间百分比 无氧
    var masterSwimming: UInt32 = 0//主泳姿
    var strokes: UInt32 = 0//划水次数
    var lap: UInt32 = 0//趟数
    var avarageSwolf: UInt32 = 0//平均swolf
    var maxSwolf: UInt32 = 0//最大swolf
    var hiits: UInt32 = 0//hiit个数
    //第二组
    var altitudeCount: UInt32 = 0//海拔高度个数
    var altitudeArray: [Float] = []//实时海拔
    //第三组
    var frequencyCount: UInt32 = 0//步频个数
    var frequencyArray: [Float] = []//实时步频
    //第四组
    var paceCount: UInt32 = 0//配速个数
    var paceArray: [Float] = []//实时配速
    //第五组
    var speedCount: UInt32 = 0//速度个数
    var speedArray: [Float] = []//实时速度
    //第六组
    var swolfCount: UInt32 = 0//swolf个数
    var swolfArray: [UInt32] = []//实时swolf
    //第七组
    var strokeCount: UInt32 = 0//划水个数
    var strokeArray: [UInt32] = []//划水速度
    
    override var description: String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        dateFormatter.timeZone = TimeZone.current
        
            var desc = "NewExerciseModel\n"
            desc += "Starter: \(starter)\n"
            desc += "Type: \(type)\n"
            desc += "StartTime: \(dateFormatter.string(from:(startTime ?? Date())))\n"
            desc += "Strength: \(strength)\n"
            desc += "Duration: \(duration)\n"
            desc += "Distance: \(distance)\n"
            desc += "Calorie: \(calorie)\n"
            desc += "AveragePace: \(avaragePace)\n"
            desc += "MaxPace: \(maxPace)\n"
            desc += "Step: \(step)\n"
            desc += "StepPitch: \(stepPitch)\n"
            desc += "AverageFrequency: \(avarageFrequency)\n"
            desc += "MaxFrequency: \(maxFrequency)\n"
            desc += "ClimbAltitude: \(climbAltitude)\n"
            desc += "MaxAltitude: \(maxAltitude)\n"
            desc += "MinAltitude: \(minAltitude)\n"
            desc += "MaxOxygenUptake: \(maxOxygenUptake)\n"
            desc += "OxygenUptakeGrade: \(oxygenUptakeGrade)\n"
            desc += "MaxHr: \(maxHr)\n"
            desc += "MinHr: \(minHr)\n"
            desc += "AvarageHr: \(avarageHr)\n"
            desc += "HrSectionPercent_warmUp: \(hrSectionPercent_warmUp)\n"
            desc += "HrSectionPercent_fatBurning: \(hrSectionPercent_fatBurning)\n"
            desc += "HrSectionPercent_cardiopulmonary: \(hrSectionPercent_cardiopulmonary)\n"
            desc += "HrSectionPercent_anaerobic: \(hrSectionPercent_anaerobic)\n"
            desc += "MasterSwimming: \(masterSwimming)\n"
            desc += "Strokes: \(strokes)\n"
            desc += "Lap: \(lap)\n"
            desc += "AvarageSwolf: \(avarageSwolf)\n"
            desc += "MaxSwolf: \(maxSwolf)\n"
            desc += "Hiits: \(hiits)\n"

            // 第二组
            desc += "Altitude Count: \(altitudeCount)\n"
            desc += "Altitude Array: \(altitudeArray)\n"

            // 第三组
            desc += "Frequency Count: \(frequencyCount)\n"
            desc += "Frequency Array: \(frequencyArray)\n"

            // 第四组
            desc += "Pace Count: \(paceCount)\n"
            desc += "Pace Array: \(paceArray)\n"

            // 第五组
            desc += "Speed Count: \(speedCount)\n"
            desc += "Speed Array: \(speedArray)\n"

            // 第六组
            desc += "Swolf Count: \(swolfCount)\n"
            desc += "Swolf Array: \(swolfArray)\n"

            // 第七组
            desc += "Stroke Count: \(strokeCount)\n"
            desc += "Stroke Array: \(strokeArray)\n"

            return desc
        }
    
    class func toExerciseModel(_ data: [UInt8], _ index: Int) {
        if index == 1 {
            guard data.count >= 57 else {
                return
            }
        }else {
            guard data.count >= 1, localExerciseModel != nil else {
                return
            }
        }
        
        switch index {
        case 1:
            localExerciseModel = NewExerciseModel()
            localExerciseModel?.starter = data[0..<1].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.type = data[1..<2].reduce(0) { ($0 << 8) + UInt32($1) }
            let hexValue = data[2..<6].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.startTimeInterval = TimeInterval(hexValue)
            localExerciseModel?.startTime = Date(timeIntervalSince1970: TimeInterval(hexValue))
            localExerciseModel?.strength = data[6..<7].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.duration = data[7..<11].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.distance = Float(data[11..<15].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.calorie = Float(data[15..<19].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.avaragePace = Float(data[19..<21].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.maxPace = Float(data[21..<23].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.step = data[23..<27].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.stepPitch = Float(data[27..<29].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.avarageFrequency = Float(data[29..<31].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.maxFrequency = Float(data[31..<33].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.climbAltitude = Float(data[33..<35].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.maxAltitude = Float(data[35..<37].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.minAltitude = Float(data[37..<39].reduce(0) { ($0 << 8) + UInt32($1) }) / 100
            localExerciseModel?.maxOxygenUptake = data[39..<40].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.oxygenUptakeGrade = data[40..<41].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.maxHr = data[41..<42].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.minHr = data[42..<43].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.avarageHr = data[43..<44].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.hrSectionPercent_warmUp = data[44..<45].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.hrSectionPercent_fatBurning = data[45..<46].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.hrSectionPercent_cardiopulmonary = data[46..<47].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.hrSectionPercent_anaerobic = data[47..<48].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.masterSwimming = data[48..<49].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.strokes = data[49..<50].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.lap = data[50..<51].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.avarageSwolf = data[51..<52].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.maxSwolf = data[52..<53].reduce(0) { ($0 << 8) + UInt32($1) }
            localExerciseModel?.hiits = data[53..<57].reduce(0) { ($0 << 8) + UInt32($1) }
        case 2:
            localExerciseModel!.altitudeCount = data[0..<2].reduce(0) { ($0 << 8) + UInt32($1) }
            if data.count >= 2 * localExerciseModel!.altitudeCount + 2 {
                // 从下标1开始,每次取2个元素,合并为一个数
                localExerciseModel!.altitudeArray = stride(from: 2, to: data.count, by: 2).map { index in
                    let combinedValue = data[index..<index + 2].reduce(0) { ($0 << 8) + UInt32($1) }
                    return Float(combinedValue) / 100
                }
            }
        case 3:
            localExerciseModel!.frequencyCount = data[0..<2].reduce(0) { ($0 << 8) + UInt32($1) }
            if data.count >= 2 * localExerciseModel!.frequencyCount + 2 {
                // 从下标1开始,每次取2个元素,合并为一个数
                localExerciseModel!.frequencyArray = stride(from: 2, to: data.count, by: 2).map { index in
                    let combinedValue = data[index..<index + 2].reduce(0) { ($0 << 8) + UInt32($1) }
                    return Float(combinedValue) / 100
                }
            }
        case 4:
            localExerciseModel!.paceCount = data[0..<2].reduce(0) { ($0 << 8) + UInt32($1) }
            if data.count >= 2 * localExerciseModel!.paceCount + 2 {
                // 从下标1开始,每次取2个元素,合并为一个数
                localExerciseModel!.paceArray = stride(from: 2, to: data.count, by: 2).map { index in
                    let combinedValue = data[index..<index + 2].reduce(0) { ($0 << 8) + UInt32($1) }
                    return Float(combinedValue) / 100
                }
            }
        case 5:
            localExerciseModel!.speedCount = data[0..<2].reduce(0) { ($0 << 8) + UInt32($1) }
            if data.count >= 2 * localExerciseModel!.speedCount + 2 {
                // 从下标1开始,每次取2个元素,合并为一个数
                localExerciseModel!.speedArray = stride(from: 2, to: data.count, by: 2).map { index in
                    let combinedValue = data[index..<index + 2].reduce(0) { ($0 << 8) + UInt32($1) }
                    return Float(combinedValue) / 100
                }
            }
        case 6:
            localExerciseModel!.swolfCount = data[0..<2].reduce(0) { ($0 << 8) + UInt32($1) }
            if data.count >= 2 * localExerciseModel!.swolfCount + 2 {
                // 从下标1开始,每次取2个元素,合并为一个数
                localExerciseModel!.swolfArray = stride(from: 2, to: data.count, by: 2).map { index in
                    let combinedValue = data[index..<index + 2].reduce(0) { ($0 << 8) + UInt32($1) }
                    return combinedValue
                }
            }
        case 7:
            localExerciseModel!.strokeCount = data[0..<2].reduce(0) { ($0 << 8) + UInt32($1) }
            if data.count >= 2 * localExerciseModel!.strokeCount + 2 {
                // 从下标1开始,每次取2个元素,合并为一个数
                localExerciseModel!.strokeArray = stride(from: 2, to: data.count, by: 2).map { index in
                    let combinedValue = data[index..<index + 2].reduce(0) { ($0 << 8) + UInt32($1) }
                    return combinedValue
                }
            }
        default: break
        }
    }
}