Просмотр исходного кода

Add TDD 7 day average and weighted average JSON. Make tdd.json and tdd_averages.json accessible from middleware function.

Jon Mårtensson 4 лет назад
Родитель
Сommit
a77ed4fcf9

+ 4 - 0
FreeAPS.xcodeproj/project.pbxproj

@@ -14,6 +14,7 @@
 		0F7A65FBD2CD8D6477ED4539 /* NotificationsConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E625985B47742D498CB1681A /* NotificationsConfigProvider.swift */; };
 		17A9D0899046B45E87834820 /* CREditorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C8D5F457B5AFF763F8CF3DF /* CREditorProvider.swift */; };
 		1927C8E62744606D00347C69 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1927C8E82744606D00347C69 /* InfoPlist.strings */; };
+		1935364028496F7D001E0B16 /* TDD_averages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1935363F28496F7D001E0B16 /* TDD_averages.swift */; };
 		19795118275953E50044850D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
 		198377D2266BFFF6004DE65E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 198377D4266BFFF6004DE65E /* Localizable.strings */; };
 		199561C1275E61A50077B976 /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 199561C0275E61A50077B976 /* HealthKit.framework */; };
@@ -416,6 +417,7 @@
 		1927C8FA2744612500347C69 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		1927C8FB2744612600347C69 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		1927C8FE274489BA00347C69 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		1935363F28496F7D001E0B16 /* TDD_averages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TDD_averages.swift; sourceTree = "<group>"; };
 		198377D3266BFFF6004DE65E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		198377D5266C0A05004DE65E /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
 		198377D6266C0A0A004DE65E /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -1286,6 +1288,7 @@
 				3811DE8E25C9D80400A708ED /* User.swift */,
 				E0D4F80427513ECF00BDF1FE /* HealthKitSample.swift */,
 				19F79FA8283AE7E000646323 /* TDD.swift */,
+				1935363F28496F7D001E0B16 /* TDD_averages.swift */,
 			);
 			path = Models;
 			sourceTree = "<group>";
@@ -2202,6 +2205,7 @@
 				38C4D33A25E9A1ED00D30B77 /* NSObject+AssociatedValues.swift in Sources */,
 				38DF179027733EAD00B3528F /* SnowScene.swift in Sources */,
 				38AAF8712600C1B0004AF583 /* MainChartView.swift in Sources */,
+				1935364028496F7D001E0B16 /* TDD_averages.swift in Sources */,
 				38E4453A274E411700EC9A94 /* Disk+[UIImage].swift in Sources */,
 				72F1BD388F42FCA6C52E4500 /* ConfigEditorProvider.swift in Sources */,
 				E39E418C56A5A46B61D960EE /* ConfigEditorStateModel.swift in Sources */,

+ 1 - 1
FreeAPS/Resources/javascript/middleware/determine_basal.js

@@ -1,4 +1,4 @@
-function middleware(iob, currenttemp, glucose, profile, autosens, meal, reservoir, clock) {
+function middleware(iob, currenttemp, glucose, profile, autosens, meal, reservoir, clock, pumphistory, preferences, basalprofile, tdd, tdd_averages) {
     // modify anything
     // return any reason what has changed.
     return "Nothing changed";

+ 13 - 3
FreeAPS/Resources/javascript/prepare/determine-basal.js

@@ -1,10 +1,10 @@
 //для enact/smb-suggested.json параметры: monitor/iob.json monitor/temp_basal.json monitor/glucose.json settings/profile.json settings/autosens.json --meal monitor/meal.json --microbolus --reservoir monitor/reservoir.json
 
-function generate(iob, currenttemp, glucose, profile, autosens = null, meal = null, microbolusAllowed = false, reservoir = null, clock = new Date(), pump_history, preferences, basalProfile) {
+function generate(iob, currenttemp, glucose, profile, autosens = null, meal = null, microbolusAllowed = false, reservoir = null, clock = new Date(), pump_history, preferences, basalProfile, tdd, tdd_averages) {
 
     try {
         console.log("Pumphistory: %o", pump_history);
-        var middlewareReason = middleware(iob, currenttemp, glucose, profile, autosens, meal, reservoir, clock, pump_history, preferences, basalProfile);
+        var middlewareReason = middleware(iob, currenttemp, glucose, profile, autosens, meal, reservoir, clock, pump_history, preferences, basalProfile, tdd, tdd_averages);
         console.log("Middleware reason: " + (middlewareReason || "Nothing changed"));
     } catch (error) {
         console.log("Invalid middleware: " + error);
@@ -38,6 +38,16 @@ function generate(iob, currenttemp, glucose, profile, autosens = null, meal = nu
         basalprofile = basalProfile;
     }
     
+    var tdd_ = {};
+    if (tdd) {
+        tdd_ = tdd
+    }
+    
+    var tdd_averages_ = {};
+    if (tdd_averages) {
+        tdd_averages_ = tdd_averages
+    }
+    
     
-    return freeaps_determineBasal(glucose_status, currenttemp, iob, profile, autosens_data, meal_data, freeaps_basalSetTemp, microbolusAllowed, reservoir_data, clock, pumphistory, preferences, basalprofile);
+    return freeaps_determineBasal(glucose_status, currenttemp, iob, profile, autosens_data, meal_data, freeaps_basalSetTemp, microbolusAllowed, reservoir_data, clock, pumphistory, preferences, basalprofile, tdd_, tdd_averages_);
 }

+ 22 - 3
FreeAPS/Sources/APS/APSManager.swift

@@ -589,11 +589,13 @@ final class BaseAPSManager: APSManager, Injectable {
 
             storage.save(enacted, as: OpenAPS.Enact.enacted)
 
+            let currentTDD = enacted.tdd ?? 0
+
             // Add to tdd.json
             let file = OpenAPS.Monitor.tdd
-            
+
             let tdd = TDD(
-                TDD: enacted.tdd ?? 0,
+                TDD: currentTDD,
                 timestamp: Date(),
                 id: UUID().uuidString
             )
@@ -604,10 +606,27 @@ final class BaseAPSManager: APSManager, Injectable {
                 uniqEvents = storage.retrieve(file, as: [TDD].self)?
                     .filter { $0.timestamp.addingTimeInterval(7.days.timeInterval) > Date() }
                     .sorted { $0.timestamp > $1.timestamp } ?? []
+
+                var total: Decimal = 0
+                var indeces: Decimal = 0
+
+                for uniqEvent in uniqEvents {
+                    total += uniqEvent.TDD
+                    indeces += 1
+                }
+
+                let average7 = total / indeces
+                let weighted_average = 0.65 * currentTDD + 0.35 * average7
+                let averages = TDD_averages(
+                    average_7days: average7,
+                    weightedAverage: weighted_average,
+                    date: Date()
+                )
+
+                storage.save(averages, as: OpenAPS.Monitor.tdd_averages)
                 storage.save(Array(uniqEvents), as: file)
             }
 
-
             debug(.apsManager, "Suggestion enacted. Received: \(received)")
             DispatchQueue.main.async {
                 self.broadcaster.notify(EnactedSuggestionObserver.self, on: .main) {

+ 1 - 0
FreeAPS/Sources/APS/OpenAPS/Constants.swift

@@ -55,6 +55,7 @@ extension OpenAPS {
         static let cgmState = "monitor/cgm-state.json"
         static let podAge = "monitor/pod-age.json"
         static let tdd = "monitor/tdd.json"
+        static let tdd_averages = "monitor/tdd_averages.json"
     }
 
     enum Enact {

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

@@ -41,6 +41,9 @@ final class OpenAPS {
 
                 self.storage.save(meal, as: Monitor.meal)
 
+                let tdd = self.loadFileFromStorage(name: OpenAPS.Monitor.tdd)
+                let tdd_averages = self.loadFileFromStorage(name: OpenAPS.Monitor.tdd_averages)
+
                 // iob
                 let autosens = self.loadFileFromStorage(name: Settings.autosense)
                 let iob = self.iob(
@@ -68,7 +71,9 @@ final class OpenAPS {
                     reservoir: reservoir,
                     pumpHistory: pumpHistory,
                     preferences: preferences,
-                    basalProfile: basalProfile
+                    basalProfile: basalProfile,
+                    tdd: tdd,
+                    tdd_averages: tdd_averages
                 )
                 debug(.openAPS, "SUGGESTED: \(suggested)")
 
@@ -299,7 +304,9 @@ final class OpenAPS {
         reservoir: JSON,
         pumpHistory: JSON,
         preferences: JSON,
-        basalProfile: JSON
+        basalProfile: JSON,
+        tdd: JSON,
+        tdd_averages: JSON
     ) -> RawJSON {
         dispatchPrecondition(condition: .onQueue(processQueue))
         return jsWorker.inCommonContext { worker in
@@ -327,7 +334,9 @@ final class OpenAPS {
                     false, // clock
                     pumpHistory,
                     preferences,
-                    basalProfile
+                    basalProfile,
+                    tdd,
+                    tdd_averages
                 ]
             )
         }

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

@@ -14,7 +14,6 @@ struct TDD: JSON, Equatable {
         self.timestamp = timestamp
         self.id = id
     }
-    
 }
 
 extension TDD {

+ 25 - 0
FreeAPS/Sources/Models/TDD_averages.swift

@@ -0,0 +1,25 @@
+import Foundation
+
+struct TDD_averages: JSON, Equatable {
+    var average_7days: Decimal
+    var weightedAverage: Decimal
+    var date: Date
+
+    init(
+        average_7days: Decimal,
+        weightedAverage: Decimal,
+        date: Date
+    ) {
+        self.average_7days = average_7days
+        self.weightedAverage = weightedAverage
+        self.date = date
+    }
+}
+
+extension TDD_averages {
+    private enum CodingKeys: String, CodingKey {
+        case average_7days
+        case weightedAverage
+        case date
+    }
+}

+ 2 - 0
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -110,6 +110,8 @@ extension Settings {
                                 .navigationLink(to: .configEditor(file: OpenAPS.Middleware.determineBasal), from: self)
                             Text("TDD")
                                 .navigationLink(to: .configEditor(file: OpenAPS.Monitor.tdd), from: self)
+                            Text("TDD Averages (7 days and weighted)")
+                                .navigationLink(to: .configEditor(file: OpenAPS.Monitor.tdd_averages), from: self)
                             Text("Edit settings json")
                                 .navigationLink(to: .configEditor(file: OpenAPS.FreeAPS.settings), from: self)
                         }