LoopPredictionInput.swift 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // LoopAlgorithmInput.swift
  3. // Learn
  4. //
  5. // Created by Pete Schwamb on 7/29/23.
  6. // Copyright © 2023 LoopKit Authors. All rights reserved.
  7. //
  8. import Foundation
  9. import HealthKit
  10. public struct LoopPredictionInput: GlucosePredictionInput {
  11. // Algorithm input time range: t-10h to t
  12. public var glucoseHistory: [StoredGlucoseSample]
  13. // Algorithm input time range: t-16h to t
  14. public var doses: [DoseEntry]
  15. // Algorithm input time range: t-10h to t
  16. public var carbEntries: [StoredCarbEntry]
  17. public var settings: LoopAlgorithmSettings
  18. public init(
  19. glucoseHistory: [StoredGlucoseSample],
  20. doses: [DoseEntry],
  21. carbEntries: [StoredCarbEntry],
  22. settings: LoopAlgorithmSettings)
  23. {
  24. self.glucoseHistory = glucoseHistory
  25. self.doses = doses
  26. self.carbEntries = carbEntries
  27. self.settings = settings
  28. }
  29. }
  30. extension LoopPredictionInput: Codable {
  31. public init(from decoder: Decoder) throws {
  32. let container = try decoder.container(keyedBy: CodingKeys.self)
  33. self.glucoseHistory = try container.decode([StoredGlucoseSample].self, forKey: .glucoseHistory)
  34. self.doses = try container.decode([DoseEntry].self, forKey: .doses)
  35. self.carbEntries = try container.decode([StoredCarbEntry].self, forKey: .carbEntries)
  36. self.settings = try container.decode(LoopAlgorithmSettings.self, forKey: .settings)
  37. }
  38. public func encode(to encoder: Encoder) throws {
  39. var container = encoder.container(keyedBy: CodingKeys.self)
  40. try container.encode(glucoseHistory, forKey: .glucoseHistory)
  41. try container.encode(doses, forKey: .doses)
  42. try container.encode(carbEntries, forKey: .carbEntries)
  43. try container.encode(settings, forKey: .settings)
  44. }
  45. private enum CodingKeys: String, CodingKey {
  46. case glucoseHistory
  47. case doses
  48. case carbEntries
  49. case settings
  50. }
  51. }
  52. extension LoopPredictionInput {
  53. var simplifiedForFixture: LoopPredictionInput {
  54. return LoopPredictionInput(
  55. glucoseHistory: glucoseHistory.map {
  56. return StoredGlucoseSample(
  57. startDate: $0.startDate,
  58. quantity: $0.quantity,
  59. isDisplayOnly: $0.isDisplayOnly)
  60. },
  61. doses: doses.map {
  62. DoseEntry(type: $0.type, startDate: $0.startDate, endDate: $0.endDate, value: $0.value, unit: $0.unit)
  63. },
  64. carbEntries: carbEntries.map {
  65. StoredCarbEntry(startDate: $0.startDate, quantity: $0.quantity, absorptionTime: $0.absorptionTime)
  66. },
  67. settings: settings.simplifiedForFixture
  68. )
  69. }
  70. public func printFixture() {
  71. let encoder = JSONEncoder()
  72. encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
  73. encoder.dateEncodingStrategy = .iso8601
  74. if let data = try? encoder.encode(self.simplifiedForFixture),
  75. let json = String(data: data, encoding: .utf8)
  76. {
  77. print(json)
  78. }
  79. }
  80. }