| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import SwiftUI
- import Swinject
- extension Bolus {
- final class StateModel: BaseStateModel<Provider> {
- @Injected() var unlockmanager: UnlockManager!
- @Injected() var apsManager: APSManager!
- @Injected() var broadcaster: Broadcaster!
- @Injected() var pumpHistoryStorage: PumpHistoryStorage!
- @Published var amount: Decimal = 0
- @Published var insulinRecommended: Decimal = 0
- @Published var insulinRequired: Decimal = 0
- @Published var waitForSuggestion: Bool = false
- @Published var manual: Bool = false
- @Published var error: Bool = false
- @Published var errorString: String = ""
- @Published var evBG: Int = 0
- @Published var insulin: Decimal = 0
- @Published var target: Decimal = 0
- @Published var isf: Decimal = 0
- @Published var percentage: Decimal = 0
- @Published var units: GlucoseUnits = .mmolL
- var waitForSuggestionInitial: Bool = false
- override func subscribe() {
- setupInsulinRequired()
- broadcaster.register(SuggestionObserver.self, observer: self)
- units = settingsManager.settings.units
- percentage = settingsManager.settings.insulinReqPercentage
- if waitForSuggestionInitial {
- apsManager.determineBasal()
- .receive(on: DispatchQueue.main)
- .sink { [weak self] ok in
- guard let self = self else { return }
- if !ok {
- self.waitForSuggestion = false
- self.insulinRequired = 0
- self.insulinRecommended = 0
- }
- }.store(in: &lifetime)
- }
- }
- func add() {
- guard amount > 0 else {
- showModal(for: nil)
- return
- }
- let maxAmount = Double(min(amount, provider.pumpSettings().maxBolus))
- unlockmanager.unlock()
- .sink { _ in } receiveValue: { [weak self] _ in
- guard let self = self else { return }
- self.apsManager.enactBolus(amount: maxAmount, isSMB: false)
- self.showModal(for: nil)
- }
- .store(in: &lifetime)
- }
- func addWithoutBolus() {
- guard amount > 0 else {
- showModal(for: nil)
- return
- }
- pumpHistoryStorage.storeEvents(
- [
- PumpHistoryEvent(
- id: UUID().uuidString,
- type: .bolus,
- timestamp: Date(),
- amount: amount,
- duration: nil,
- durationMin: nil,
- rate: nil,
- temp: nil,
- carbInput: nil
- )
- ]
- )
- showModal(for: nil)
- }
- func setupInsulinRequired() {
- DispatchQueue.main.async {
- self.insulinRequired = self.provider.suggestion?.insulinReq ?? 0
- // Manual Bolus recommendation screen after a carb entry (normally) yields a higher amount than the insulin reqiured amount computed for SMBs (auto boluses). Carbs combined with a manual bolus threfore now (test) uses the Eventual BG for glucose prediction, whereas the insulinReg for SMBs uses the minPredBG for glucose prediction (typically lower than Eventual BG).
- self.evBG = self.provider.suggestion?.eventualBG ?? 0
- self.insulin = self.provider.suggestion?.insulinForManualBolus ?? 0
- self.target = self.provider.suggestion?.current_target ?? 0
- self.isf = self.provider.suggestion?.isf ?? 0
- if self.settingsManager.settings.insulinReqPercentage != 100 {
- self.insulinRecommended = self.insulin * (self.settingsManager.settings.insulinReqPercentage / 100)
- } else { self.insulinRecommended = self.insulin }
- self.errorString = self.provider.suggestion?.manualBolusErrorString ?? ""
- if self.errorString.count > 8 { self.error = true }
- self.insulinRecommended = self.apsManager
- .roundBolus(amount: max(self.insulinRecommended, 0))
- }
- }
- }
- }
- extension Bolus.StateModel: SuggestionObserver {
- func suggestionDidUpdate(_: Suggestion) {
- DispatchQueue.main.async {
- self.waitForSuggestion = false
- }
- setupInsulinRequired()
- }
- }
|