You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
9.8 KiB
212 lines
9.8 KiB
![]()
2 years ago
|
//
|
||
![]()
2 years ago
|
// HealthHomeViewModels.swift
|
||
![]()
1 year ago
|
// FireBoltt
|
||
![]()
2 years ago
|
//
|
||
|
// Created by Sheldon on 2021/9/19.
|
||
|
// Copyright © 2021 Sheldon. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import UIKit
|
||
|
|
||
![]()
2 years ago
|
class HealthHomeViewModels: ViewModel {
|
||
![]()
2 years ago
|
|
||
|
// 用户信息
|
||
![]()
1 year ago
|
let userIcon = BehaviorRelay<UIImage?>(value: R.image.user_Icon_header())
|
||
![]()
2 years ago
|
let userNickname = BehaviorRelay<String?>(value: nil)
|
||
|
|
||
|
// 健康数据
|
||
|
let relay = BehaviorRelay<[HealthSection]>(value: [])
|
||
|
/// 用户信息
|
||
|
private var userInfo = BehaviorRelay<UserInfo?>(value: nil)
|
||
![]()
2 years ago
|
private var sleepHeartCellVM: SleepHeartCellViewModels?
|
||
![]()
2 years ago
|
|
||
|
/// 发现DFU设备,自动升级
|
||
![]()
2 years ago
|
let dfuDeviceUpgrate = PublishSubject<FirmwareUpdateViewModels>()
|
||
![]()
2 years ago
|
|
||
|
private var tempDisposeBag = DisposeBag()
|
||
|
|
||
|
override init() {
|
||
|
super.init()
|
||
|
// 监听系统时间改变
|
||
|
var currenDay = DateClass.todayString()
|
||
|
kNotificationCenter.rx.notification(UIApplication.significantTimeChangeNotification)
|
||
|
.subscribe(onNext: { notication in
|
||
|
// 日期改变了
|
||
|
let newDay = DateClass.todayString()
|
||
|
if currenDay != newDay {
|
||
|
currenDay = newDay
|
||
![]()
1 year ago
|
kNotificationCenter.post(name: NSNotification.Name(rawValue: DateChangeFireBoltt), object: nil)
|
||
![]()
2 years ago
|
}
|
||
|
})
|
||
|
.disposed(by: rx.disposeBag)
|
||
![]()
1 year ago
|
fbloadDefaultData()
|
||
|
fbloadHealthData()
|
||
![]()
2 years ago
|
monitor()
|
||
|
}
|
||
|
|
||
![]()
1 year ago
|
private func fbloadDefaultData() {
|
||
|
userInfo.accept(UserDefaultsManagerFrieBoltt.getUserInfo())
|
||
![]()
2 years ago
|
userInfo.flatMapLatest({ (userInfo) -> Observable<UIImage?> in
|
||
|
return Observable.just(userInfo?.avatarImg)
|
||
|
})
|
||
|
.filter { $0 != nil }
|
||
|
.bind(to: userIcon)
|
||
|
.disposed(by: rx.disposeBag)
|
||
|
userInfo.flatMapLatest({ (userInfo) -> Observable<String?> in
|
||
|
return Observable.just(userInfo?.nickname)
|
||
|
})
|
||
|
.bind(to: userNickname)
|
||
|
.disposed(by: rx.disposeBag)
|
||
|
}
|
||
|
|
||
![]()
1 year ago
|
private func fbloadHealthData() {
|
||
![]()
2 years ago
|
tempDisposeBag = DisposeBag()
|
||
|
var items: [HealthSectionItem] = []
|
||
|
// 功能适配
|
||
|
var defaultTypes: [HealthType] = [.step, .heartRate]
|
||
![]()
1 year ago
|
if let adapterInfo = UserDefaultsManagerFrieBoltt.getDeviceInfo()?.adapterInfo {
|
||
![]()
2 years ago
|
if adapterInfo.sleep { defaultTypes.insert(.sleep, at: 1) }
|
||
|
if adapterInfo.bodyTemperature { defaultTypes.append(.temperature) }
|
||
|
if adapterInfo.bloodPressure { defaultTypes.append(.bloodPressure) }
|
||
|
if adapterInfo.bloodOxygen { defaultTypes.append(.bloodOxygen) }
|
||
|
// defaultTypes.append(.temperature)
|
||
|
// defaultTypes.append(.bloodPressure)
|
||
|
// defaultTypes.append(.bloodOxygen)
|
||
|
}
|
||
|
// 数据拼接
|
||
|
defaultTypes.forEach { type in
|
||
|
var item: HealthSectionItem
|
||
|
if type == .step {
|
||
![]()
2 years ago
|
let stepCellVM = StepCellViewModels()
|
||
![]()
2 years ago
|
let stepItem = HealthSectionItem.stepItem(viewModel: stepCellVM)
|
||
|
item = stepItem
|
||
|
// 数据绑定
|
||
|
BluetoothService.shared.realStep
|
||
|
.bind(to: stepCellVM.realStepModel)
|
||
|
.disposed(by: tempDisposeBag)
|
||
|
}else {
|
||
![]()
2 years ago
|
let healthItemCellVM = HealthCellViewModels(type: type)
|
||
![]()
2 years ago
|
let healthItem = HealthSectionItem.healthItem(viewModel: healthItemCellVM)
|
||
|
item = healthItem
|
||
|
// 数据绑定
|
||
|
switch type {
|
||
|
case .sleep:
|
||
|
BluetoothService.shared.sleepUpdate
|
||
|
.subscribe(onNext: { _ in
|
||
![]()
1 year ago
|
DataBaseManagerFireBoltt.shared.fbquerySleepModel(dataDate: DateClass.todayString(), queryType: .day) { [weak self] (model) in
|
||
![]()
2 years ago
|
guard let sleepModel = model.first as? SleepModel else { return }
|
||
|
let sleep = String(format: "%.1f", Float(sleepModel.totalSleepDuration) / 60.0)
|
||
|
let progress = Float(sleepModel.totalSleepDuration) / Float(self?.userInfo.value?.sleepTarget ?? 480)
|
||
|
healthItemCellVM.value.accept(sleep)
|
||
|
healthItemCellVM.progress.accept(progress)
|
||
|
}
|
||
|
})
|
||
|
.disposed(by: tempDisposeBag)
|
||
|
userInfo.flatMapLatest { (userInfo) -> Observable<String> in
|
||
|
let sleepTarget = String(format: "%.1f", Float(userInfo?.sleepTarget ?? 480) / 60.0)
|
||
![]()
1 year ago
|
let value = MultiLanguageKey_FB.sleepTargetFB.localized + ":" + sleepTarget
|
||
![]()
2 years ago
|
return Observable.just(value)
|
||
|
}.bind(to: healthItemCellVM.target)
|
||
|
.disposed(by: tempDisposeBag)
|
||
|
case .heartRate:
|
||
|
BluetoothService.shared.realHeartRate
|
||
|
.flatMapLatest { (heartRate) -> Observable<String> in
|
||
|
let value = heartRate.heartRate == 0 ? "--" : String(heartRate.heartRate)
|
||
|
return Observable.just(value)
|
||
|
}
|
||
|
.bind(to: healthItemCellVM.value)
|
||
|
.disposed(by: tempDisposeBag)
|
||
|
case .temperature:
|
||
|
BluetoothService.shared.realTemperature
|
||
|
.flatMapLatest { (temperature) -> Observable<String> in
|
||
|
let value = temperature.temperature == 0 ? "--" : String(format: "%.1f", temperature.temperature)
|
||
|
return Observable.just(value)
|
||
|
}
|
||
|
.bind(to: healthItemCellVM.value)
|
||
|
.disposed(by: tempDisposeBag)
|
||
|
case .bloodPressure:
|
||
|
BluetoothService.shared.realBloodPressure
|
||
|
.flatMapLatest { (model) -> Observable<String> in
|
||
|
let value = model.sbp == 0 ? "--" : String(format: "%ld/%ld", model.sbp, model.dbp)
|
||
|
return Observable.just(value)
|
||
|
}
|
||
|
.bind(to: healthItemCellVM.value)
|
||
|
.disposed(by: tempDisposeBag)
|
||
|
case .bloodOxygen:
|
||
|
BluetoothService.shared.realBloodOxygen
|
||
|
.flatMapLatest { (model) -> Observable<String> in
|
||
|
let value = model.bloodOxygen == 0 ? "--" : String(model.bloodOxygen) + "%"
|
||
|
return Observable.just(value)
|
||
|
}
|
||
|
.bind(to: healthItemCellVM.value)
|
||
|
.disposed(by: tempDisposeBag)
|
||
|
default: break
|
||
|
}
|
||
|
}
|
||
|
items.append(item)
|
||
|
}
|
||
|
// 插入空Item(一行四个Item,每行第一个最后一个插入)
|
||
|
let tempItems = items[1...items.count - 1]
|
||
|
let totalRow = tempItems.count/2 + tempItems.count%2
|
||
|
for i in (0..<totalRow) {
|
||
|
items.insert(HealthSectionItem.blankItem, at: 1 + i * 4)
|
||
|
var endIndex = 4 + i * 4
|
||
|
if endIndex > items.count {
|
||
|
endIndex = items.count
|
||
|
}
|
||
|
items.insert(HealthSectionItem.blankItem, at: endIndex)
|
||
|
}
|
||
|
let section = HealthSection.health(title: "", items: items)
|
||
|
relay.accept([section])
|
||
|
}
|
||
|
|
||
|
private func monitor() {
|
||
|
// 用户信息更新
|
||
![]()
1 year ago
|
kNotificationCenter.rx.notification(Notification.Name(rawValue: UserInfoUpdateFireBoltt))
|
||
![]()
2 years ago
|
.flatMapLatest({ _ -> Observable<UserInfo?> in
|
||
![]()
1 year ago
|
return Observable.just(UserDefaultsManagerFrieBoltt.getUserInfo())
|
||
![]()
2 years ago
|
})
|
||
|
.bind(to: userInfo)
|
||
|
.disposed(by: rx.disposeBag)
|
||
|
// 数据同步完成刷新睡眠
|
||
|
BluetoothService.shared.syncState.skip(1)
|
||
|
.subscribe(onNext: { [weak self] (syncState) in
|
||
|
guard let `self` = self else { return }
|
||
|
switch syncState {
|
||
|
case .normal:
|
||
![]()
1 year ago
|
DataBaseManagerFireBoltt.shared.fbquerySleepModel(dataDate: DateClass.getCurrentTimeStr(formatStr: "yyyy-MM-dd"), queryType: .day) { (model) in
|
||
![]()
2 years ago
|
guard let sleepModel = model.first as? SleepModel else { return }
|
||
|
let sleep = String(format: "%.1f", Float(sleepModel.totalSleepDuration) / 60.0)
|
||
|
let progress = Float(sleepModel.totalSleepDuration) / Float(self.userInfo.value?.sleepTarget ?? 480)
|
||
|
self.sleepHeartCellVM?.sleep.accept(sleep)
|
||
|
self.sleepHeartCellVM?.sleepProgress.accept(progress)
|
||
|
}
|
||
|
default: break
|
||
|
}
|
||
|
})
|
||
|
.disposed(by: rx.disposeBag)
|
||
|
// 日期改变
|
||
![]()
1 year ago
|
kNotificationCenter.rx.notification(Notification.Name(rawValue: DateChangeFireBoltt))
|
||
![]()
2 years ago
|
.subscribe(onNext: { [weak self] notication in
|
||
|
guard let `self` = self else { return }
|
||
![]()
1 year ago
|
self.fbloadHealthData()
|
||
![]()
2 years ago
|
})
|
||
|
.disposed(by: rx.disposeBag)
|
||
|
// 功能适配
|
||
|
BluetoothService.shared.adapterInfoUpdate
|
||
|
.subscribe(onNext: { [weak self] _ in
|
||
|
guard let `self` = self else { return }
|
||
![]()
1 year ago
|
self.fbloadHealthData()
|
||
![]()
2 years ago
|
})
|
||
|
.disposed(by: rx.disposeBag)
|
||
|
// DFU设备
|
||
|
kNotificationCenter.rx.notification(Notification.Name(rawValue: BluetoothNotificationAtDFUConnectSuccess))
|
||
|
.subscribe(onNext: { [weak self] _ in
|
||
|
guard let `self` = self else { return }
|
||
![]()
2 years ago
|
let viewModel = FirmwareUpdateViewModels(isDFU: true)
|
||
![]()
2 years ago
|
self.dfuDeviceUpgrate.onNext(viewModel)
|
||
|
})
|
||
|
.disposed(by: rx.disposeBag)
|
||
|
}
|
||
|
}
|