AddCarbsStateModel.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. let adjustment = settings.settings.individualAdjustmentFactor
  30. var counter: Decimal = (fpus * 2) - 1.0
  31. counter = min(timeCap, counter)
  32. var roundedCounter: Decimal = 0
  33. NSDecimalRound(&roundedCounter, &counter, 0, .up)
  34. let carbequiv = (fpucarb / roundedCounter) * adjustment
  35. while counter > 0, counter <= timeCap {
  36. let newdate = 1.0 + trunc(Double(truncating: counter as NSNumber))
  37. carbsStorage.storeCarbs([
  38. CarbsEntry(
  39. id: UUID(), createdAt: date + (newdate * Double(timeInterval)), carbs: carbequiv,
  40. enteredBy: CarbsEntry.manual
  41. )
  42. ])
  43. counter -= 1
  44. }
  45. // Store the real carbs
  46. if carbs > 0 {
  47. carbsStorage.storeCarbs([CarbsEntry(id: UUID(), createdAt: date, carbs: carbs, enteredBy: CarbsEntry.manual)])
  48. }
  49. if settingsManager.settings.skipBolusScreenAfterCarbs {
  50. apsManager.determineBasalSync()
  51. showModal(for: nil)
  52. } else {
  53. showModal(for: .bolus(waitForSuggestion: true))
  54. }
  55. }
  56. }
  57. }