AddCarbsStateModel.swift 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. // Convert fat and protein to carb equivalents and store as future carbs
  23. let fpucarb = (0.4 * protein) + (0.9 * fat)
  24. let fpus = ((fat * 9.0) + (protein * 4.0)) / 100.0
  25. // Default is 1 hour (60 minutes)
  26. let timeInterval = 60 * settings.settings.minuteInterval
  27. // Deffault is 8 hours
  28. let timeCap = settings.settings.timeCap
  29. var counter: Decimal = (fpus * 2) - 1.0
  30. counter = min(timeCap, counter)
  31. var roundedCounter: Decimal = 0
  32. NSDecimalRound(&roundedCounter, &counter, 0, .up)
  33. let carbequiv = fpucarb / roundedCounter
  34. while counter > 0, counter <= timeCap {
  35. let newdate = 1.0 + trunc(Double(truncating: counter as NSNumber))
  36. carbsStorage.storeCarbs([
  37. CarbsEntry(
  38. id: UUID(), createdAt: date + (newdate * Double(timeInterval)), carbs: carbequiv,
  39. enteredBy: CarbsEntry.manual
  40. )
  41. ])
  42. counter -= 1
  43. }
  44. // Store the real carbs
  45. if carbs > 0 {
  46. carbsStorage.storeCarbs([CarbsEntry(id: UUID(), createdAt: date, carbs: carbs, enteredBy: CarbsEntry.manual)])
  47. }
  48. if settingsManager.settings.skipBolusScreenAfterCarbs {
  49. apsManager.determineBasalSync()
  50. showModal(for: nil)
  51. } else {
  52. showModal(for: .bolus(waitForSuggestion: true))
  53. }
  54. }
  55. }
  56. }