Commit b20a10e85d387c01720cbee713264b353a189918
1 parent
547d2db2
feat:temperature model
Showing
1 changed file
with
180 additions
and
0 deletions
HDFwear/Home/Model/HealthModel.swift
... | ... | @@ -454,6 +454,186 @@ class HeartRateModel: Object { |
454 | 454 | |
455 | 455 | } |
456 | 456 | |
457 | +//MARK: - 体温 | |
458 | +//jtd! | |
459 | +class TemperatureModel: Object { | |
460 | + @Persisted var value: Int = -1 | |
461 | + @Persisted var date: Date? = nil | |
462 | + | |
463 | + convenience init(value: Int, date: Date?) { | |
464 | + self.init() | |
465 | + self.value = value | |
466 | + self.date = date | |
467 | + } | |
468 | + | |
469 | + class func toTemperatureArray(_ bytes: [UInt8]) -> [TemperatureModel] { | |
470 | + var hrArray: [TemperatureModel] = [] | |
471 | + let num = bytes.count/7 | |
472 | + for i in 0..<num { | |
473 | + 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 | |
474 | + let hr = TemperatureModel(value: Int(bytes[i*7+6]), date: date) | |
475 | + hrArray.append(hr) | |
476 | + } | |
477 | + return hrArray | |
478 | + } | |
479 | + | |
480 | + private func add() { | |
481 | + if let a = RealmTools.queryObjects(TemperatureModel.self, filter: "date = %@", [self.date ?? Date()]) as? [TemperatureModel] { | |
482 | + RealmTools.deleteList(a) | |
483 | + } | |
484 | + RealmTools.add(self) | |
485 | + } | |
486 | + private func isEqual(_ hr: TemperatureModel) -> Bool { | |
487 | + if self.value == hr.value { | |
488 | + if self.date!.isInside(date: hr.date!, granularity: .minute) { | |
489 | + return true | |
490 | + } | |
491 | + } | |
492 | + return false | |
493 | + } | |
494 | + | |
495 | + func realTimeAdd() { | |
496 | + if let hrArray = RealmTools.queryObjects(TemperatureModel.self) as? [TemperatureModel], let hr = hrArray.last { | |
497 | + if !self.isEqual(hr) { | |
498 | + RealmTools.add(self) | |
499 | + } | |
500 | + } else { | |
501 | + RealmTools.add(self) | |
502 | + } | |
503 | + } | |
504 | + | |
505 | + class func addArray(_ array: [TemperatureModel]) { | |
506 | + if array.count == 0 { | |
507 | + return | |
508 | + } | |
509 | + for (i, hr) in array.enumerated() { | |
510 | + if hr == array.first { | |
511 | + hr.add() | |
512 | + } else { | |
513 | + if !hr.isEqual(array[i-1]) { | |
514 | + hr.add() | |
515 | + } | |
516 | + } | |
517 | + } | |
518 | + } | |
519 | + | |
520 | + | |
521 | + class func getRecentData(count: Int = 31) -> [TemperatureModel] { | |
522 | + guard let array = RealmTools.objectsWithPredicateAndSortedForPages(object: self, sortedKey: "date", isAssending: false, pageSize: count) as? [TemperatureModel], array.count > 0 else { | |
523 | + return [] | |
524 | + } | |
525 | + return array.reversed() | |
526 | + } | |
527 | + | |
528 | + class func getTemperatureByDay(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) { | |
529 | + var hrArray: [TemperatureModel] = [] | |
530 | + var minArray: [Int] = [] | |
531 | + var maxArray: [Int] = [] | |
532 | + | |
533 | + for h in 0..<24 { | |
534 | + let hourArray = getHistoryTemperature(startTime: date.dateAtStartOf(.day)+h.hours, endTime: date.dateAtStartOf(.day)+(h+1).hours) | |
535 | + for m in 0..<60 { | |
536 | + var minuteArray: [TemperatureModel] = [] | |
537 | + for hr in hourArray { | |
538 | + if hr.date!.minute == m { | |
539 | + minuteArray.append(hr) | |
540 | + } | |
541 | + } | |
542 | + if minuteArray.count > 0 { | |
543 | + hrArray.append(TemperatureModel(value: minuteArray.last!.value, date: date.dateAtStartOf(.day)+h.hours+m.minutes)) | |
544 | + // hrArray.append(HeartRateModel(value: minuteArray.average(\.value), date: date.dateAtStartOf(.day)+h.hours+m.minutes)) | |
545 | + minArray.append(minuteArray.min(\.value)?.value ?? -1) | |
546 | + maxArray.append(minuteArray.max(\.value)?.value ?? -1) | |
547 | + } | |
548 | + } | |
549 | + } | |
550 | + /* | |
551 | + for i in 0..<24 { | |
552 | + for m in 0..<60 { | |
553 | + rec += 1 | |
554 | + let minuteArray = getHistoryHeartRate(startTime: date.dateAtStartOf(.day)+i.hours+m.minutes, endTime: date.dateAtStartOf(.day)+i.hours+(m+1).minutes) | |
555 | + if minuteArray.count > 0 { | |
556 | + hrArray.append(HeartRateModel(value: minuteArray.average(\.value), date: date.dateAtStartOf(.day)+i.hours+m.minutes)) | |
557 | + minArray.append(minuteArray.min(\.value)?.value ?? -1) | |
558 | + maxArray.append(minuteArray.max(\.value)?.value ?? -1) | |
559 | + } | |
560 | + } | |
561 | + } | |
562 | + */ | |
563 | + | |
564 | + // if hrArray.count > 1 { | |
565 | + // minArray.insert(hrArray[0].value, at: 0) | |
566 | + // maxArray.insert(hrArray[0].value, at: 0) | |
567 | + // } | |
568 | + return (hrArray, minArray, maxArray) | |
569 | + } | |
570 | + | |
571 | + class func getAverageByDay(_ date: Date) -> (hr: TemperatureModel, minHr: Int, maxHr: Int) { | |
572 | + let startDate = date.dateAt(.startOfDay) | |
573 | + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.days-1.seconds) | |
574 | + return (TemperatureModel(value: array.average(\.value), date: startDate), array.min(\.value)?.value ?? -1, array.max(\.value)?.value ?? -1) | |
575 | + // return BloodPressureModel(dbp: array.average(\.dbp), sbp: array.average(\.sbp), date: startDate) | |
576 | + } | |
577 | + | |
578 | + class func getTemperatureByWeek(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) { | |
579 | + var hrArray: [TemperatureModel] = [] | |
580 | + var minArray: [Int] = [] | |
581 | + var maxArray: [Int] = [] | |
582 | + let weekDays = date.compare(.isThisWeek) ? (DateInRegion()-1.days).weekday : 7 | |
583 | + for i in 0..<weekDays { | |
584 | + let startDate = (date-1.days).dateAt(.startOfWeek)+(i+1).days | |
585 | + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.days-1.seconds) | |
586 | + if array.count > 0 { | |
587 | + hrArray.append(TemperatureModel(value: array.average(\.value), date: startDate)) | |
588 | + minArray.append(array.min(\.value)?.value ?? -1) | |
589 | + maxArray.append(array.max(\.value)?.value ?? -1) | |
590 | + } | |
591 | + } | |
592 | + return (hrArray, minArray, maxArray) | |
593 | + } | |
594 | + | |
595 | + class func getTemperatureByMonth(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) { | |
596 | + var hrArray: [TemperatureModel] = [] | |
597 | + var minArray: [Int] = [] | |
598 | + var maxArray: [Int] = [] | |
599 | + let monthDays = date.compare(.isThisMonth) ? DateInRegion().day : date.monthDays | |
600 | + for i in 0..<monthDays { | |
601 | + let startDate = date.dateAt(.startOfMonth)+i.days | |
602 | + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.days-1.seconds) | |
603 | + if array.count > 0 { | |
604 | + hrArray.append(TemperatureModel(value: array.average(\.value), date: startDate)) | |
605 | + minArray.append(array.min(\.value)?.value ?? -1) | |
606 | + maxArray.append(array.max(\.value)?.value ?? -1) | |
607 | + } | |
608 | + } | |
609 | + return (hrArray, minArray, maxArray) | |
610 | + } | |
611 | + | |
612 | + class func getTemperatureByYear(_ date: Date) -> (hrArray: [TemperatureModel], minHr: [Int], maxHr: [Int]) { | |
613 | + var hrArray: [TemperatureModel] = [] | |
614 | + var minArray: [Int] = [] | |
615 | + var maxArray: [Int] = [] | |
616 | + let yearMonths = date.compare(.isThisYear) ? DateInRegion().month : 12 | |
617 | + for i in 0..<yearMonths { | |
618 | + let startDate = date.dateAtStartOf(.year)+i.months | |
619 | + let array = getHistoryTemperature(startTime: startDate, endTime: startDate+1.months-1.seconds) | |
620 | + if array.count > 0 { | |
621 | + hrArray.append(TemperatureModel(value: array.average(\.value), date: startDate)) | |
622 | + minArray.append(array.min(\.value)?.value ?? -1) | |
623 | + maxArray.append(array.max(\.value)?.value ?? -1) | |
624 | + } | |
625 | + } | |
626 | + return (hrArray, minArray, maxArray) | |
627 | + } | |
628 | + | |
629 | + private class func getHistoryTemperature(startTime: Date, endTime: Date) -> [TemperatureModel] { | |
630 | + guard let array = RealmTools.objectsWithPredicateAndSorted(object: self, predicate: NSPredicate(format: "date >= %@ AND date <= %@", argumentArray:[startTime, endTime]), sortedKey: "date") as? Array<TemperatureModel>, array.count > 0 else { | |
631 | + return [] | |
632 | + } | |
633 | + return array | |
634 | + } | |
635 | + | |
636 | +} | |
457 | 637 | |
458 | 638 | |
459 | 639 | ... | ... |