Ivan Valkou 5 лет назад
Родитель
Сommit
801452b209

+ 1 - 1
FreeAPS/Resources/javascript/prepare/autosens.js

@@ -23,5 +23,5 @@ function generate(glucose_data, pumphistory_data, basalprofile, profile_data, ca
     detection_inputs.deviations = 288;
     var ratio24h = freeaps_autosens(detection_inputs);
     var lowestRatio = ratio8h.ratio < ratio24h.ratio ? ratio8h : ratio24h;
-    return {"ratio": lowestRatio};
+    return lowestRatio;
 }

+ 13 - 5
FreeAPS/Sources/APS/APSManager.swift

@@ -6,7 +6,6 @@ import Swinject
 
 protocol APSManager {
     func fetchAndLoop()
-    func autosense()
     func autotune()
     func enactBolus(amount: Double)
     var pumpManager: PumpManagerUI? { get set }
@@ -85,6 +84,7 @@ final class BaseAPSManager: APSManager, Injectable {
             nightscout.fetchCarbs(),
             nightscout.fetchTempTargets()
         )
+        .flatMap { _ in self.autosens() }
         .flatMap { _ in self.determineBasal() }
         .sink { _ in } receiveValue: { [weak self] ok in
             guard let self = self else { return }
@@ -112,6 +112,18 @@ final class BaseAPSManager: APSManager, Injectable {
         return true
     }
 
+    private func autosens() -> AnyPublisher<Bool, Never> {
+        guard let autosens = try? storage.retrieve(OpenAPS.Settings.autosense, as: Autosens.self),
+              (autosens.timestamp ?? .distantPast).addingTimeInterval(30.minutes.timeInterval) > Date()
+        else {
+            return openAPS.autosense()
+                .map { $0 != nil }
+                .eraseToAnyPublisher()
+        }
+
+        return Just(true).eraseToAnyPublisher()
+    }
+
     private func determineBasal() -> AnyPublisher<Bool, Never> {
         guard let glucose = try? storage.retrieve(OpenAPS.Monitor.glucose, as: [BloodGlucose].self), glucose.count >= 36 else {
             debug(.apsManager, "Not enough glucose data")
@@ -172,10 +184,6 @@ final class BaseAPSManager: APSManager, Injectable {
         }
     }
 
-    func autosense() {
-        openAPS.autosense().sink {}.store(in: &lifetime)
-    }
-
     func autotune() {
         openAPS.autotune().sink {}.store(in: &lifetime)
     }

+ 8 - 3
FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift

@@ -77,7 +77,7 @@ final class OpenAPS {
         }
     }
 
-    func autosense() -> Future<Void, Never> {
+    func autosense() -> Future<Autosens?, Never> {
         Future { promise in
             self.processQueue.async {
                 let pumpHistory = self.loadFileFromStorage(name: OpenAPS.Monitor.pumpHistory)
@@ -96,8 +96,13 @@ final class OpenAPS {
                 )
 
                 debug(.openAPS, "AUTOSENS: \(autosensResult)")
-                try? self.storage.save(autosensResult, as: Settings.autosense)
-                promise(.success(()))
+                if var autosens = Autosens(from: autosensResult) {
+                    autosens.timestamp = Date()
+                    try? self.storage.save(autosens, as: Settings.autosense)
+                    promise(.success(autosens))
+                } else {
+                    promise(.success(nil))
+                }
             }
         }
     }

+ 1 - 0
FreeAPS/Sources/Models/Autosens.swift

@@ -2,4 +2,5 @@ import Foundation
 
 struct Autosens: JSON {
     let ratio: Decimal
+    var timestamp: Date?
 }