AddCarbsStateModel.swift 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import SwiftUI
  2. extension AddCarbs {
  3. final class StateModel: BaseStateModel<Provider> {
  4. @Injected() var carbsStorage: CarbsStorage!
  5. @Injected() var apsManager: APSManager!
  6. @Injected() var settings: SettingsManager!
  7. @Published var carbs: Decimal = 0
  8. @Published var date = Date()
  9. @Published var protein: Decimal = 0
  10. @Published var fat: Decimal = 0
  11. @Published var carbsRequired: Decimal?
  12. @Published var useFPU: Bool = false
  13. override func subscribe() {
  14. carbsRequired = provider.suggestion?.carbsReq
  15. useFPU = settingsManager.settings.useFPUconversion
  16. }
  17. func add() {
  18. guard carbs > 0 || fat > 0 || protein > 0 else {
  19. showModal(for: nil)
  20. return
  21. }
  22. let interval = settings.settings.minuteInterval
  23. let timeCap = settings.settings.timeCap * (60 / Decimal(interval))
  24. let adjustment = settings.settings.individualAdjustmentFactor
  25. let delay = settings.settings.delay
  26. // Convert fat and protein to carb equivalents and store as future carbs
  27. let fpucarb = 0.4 * protein + 0.9 * fat
  28. let fpus = (fat * 9.0 + protein * 4.0) / 100.0
  29. var counter: Decimal = (fpus * 2) - 1.0
  30. counter = max(timeCap, counter)
  31. var roundedCounter: Decimal = 0
  32. NSDecimalRound(&roundedCounter, &counter, 0, .up)
  33. let carbequiv = (fpucarb / roundedCounter) * adjustment
  34. let firstDate = date.addingTimeInterval(delay.minutes.timeInterval)
  35. var previousDate = date
  36. while counter > 0 {
  37. var useDate = date + 1 * Double(interval * 60)
  38. // Fix Interval and Delay
  39. useDate = max(previousDate.addingTimeInterval(interval.minutes.timeInterval), useDate, firstDate)
  40. if useDate > previousDate {
  41. carbsStorage.storeCarbs([
  42. CarbsEntry(
  43. id: UUID().uuidString, createdAt: useDate, carbs: carbequiv,
  44. enteredBy: CarbsEntry.manual
  45. )
  46. ])
  47. }
  48. previousDate = useDate
  49. counter -= 1
  50. }
  51. // Store the real carbs
  52. if carbs > 0 {
  53. carbsStorage
  54. .storeCarbs([CarbsEntry(id: UUID().uuidString, createdAt: date, carbs: carbs, enteredBy: CarbsEntry.manual)])
  55. }
  56. if settingsManager.settings.skipBolusScreenAfterCarbs {
  57. apsManager.determineBasalSync()
  58. showModal(for: nil)
  59. } else {
  60. showModal(for: .bolus(waitForSuggestion: true))
  61. }
  62. }
  63. }
  64. }