Parcourir la source

Merge pull request #434 from nightscout/release/0.2.2

Release v0.2.2
Sjoerd Bozon il y a 1 an
Parent
commit
d97ee5e876

+ 1 - 1
CGMBLEKit

@@ -1 +1 @@
-Subproject commit 15af9cf319bff2ac49c361da254ad667461d4687
+Subproject commit b786e8b5531cb08c259103c472dcd6a6752728f8

+ 1 - 1
CODE_OF_CONDUCT.md

@@ -59,7 +59,7 @@ representative at an online or offline event.
 ## Enforcement
 ## Enforcement
 
 
 Instances of abusive, harassing, or otherwise unacceptable behavior may be
 Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the Discord server admins. Please join our [Discord server](https://discord.gg/dbe5Twav8D) to contact
+reported to the Discord server admins. Please join our [Discord server](http://discord.diy-trio.org) to contact
 them directly for any enforcement issues. All complaints will be reviewed and
 them directly for any enforcement issues. All complaints will be reviewed and
 investigated promptly and fairly.
 investigated promptly and fairly.
 
 

+ 1 - 1
Config.xcconfig

@@ -1,5 +1,5 @@
 APP_DISPLAY_NAME = Trio
 APP_DISPLAY_NAME = Trio
-APP_VERSION = 0.2.1
+APP_VERSION = 0.2.2
 APP_BUILD_NUMBER = 1
 APP_BUILD_NUMBER = 1
 COPYRIGHT_NOTICE =
 COPYRIGHT_NOTICE =
 DEVELOPER_TEAM = ##TEAM_ID##
 DEVELOPER_TEAM = ##TEAM_ID##

+ 11 - 1
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -1,5 +1,6 @@
 import Combine
 import Combine
 import Foundation
 import Foundation
+import HealthKit
 import LoopKit
 import LoopKit
 import LoopKitUI
 import LoopKitUI
 import SwiftDate
 import SwiftDate
@@ -98,6 +99,14 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
         settingsManager.settings.uploadGlucose = cgmM.shouldSyncToRemoteService
         settingsManager.settings.uploadGlucose = cgmM.shouldSyncToRemoteService
     }
     }
 
 
+    private func updateManagerUnits(_ manager: CGMManagerUI?) {
+        let units = settingsManager.settings.units
+        let managerName = cgmManager.map { "\(type(of: $0))" } ?? "nil"
+        let loopkitUnits: HKUnit = units == .mgdL ? .milligramsPerDeciliter : .millimolesPerLiter
+        print("manager: \(managerName) is changing units to: \(loopkitUnits.description) ")
+        manager?.unitDidChange(to: loopkitUnits)
+    }
+
     func updateGlucoseSource(cgmGlucoseSourceType: CGMType, cgmGlucosePluginId: String, newManager: CGMManagerUI?) {
     func updateGlucoseSource(cgmGlucoseSourceType: CGMType, cgmGlucosePluginId: String, newManager: CGMManagerUI?) {
         // if changed, remove all calibrations
         // if changed, remove all calibrations
         if self.cgmGlucoseSourceType != cgmGlucoseSourceType || self.cgmGlucosePluginId != cgmGlucosePluginId {
         if self.cgmGlucoseSourceType != cgmGlucoseSourceType || self.cgmGlucosePluginId != cgmGlucosePluginId {
@@ -120,6 +129,8 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
             removeCalibrations()
             removeCalibrations()
         } else if self.cgmGlucoseSourceType == .plugin, cgmManager == nil, let rawCGMManager = rawCGMManager {
         } else if self.cgmGlucoseSourceType == .plugin, cgmManager == nil, let rawCGMManager = rawCGMManager {
             cgmManager = cgmManagerFromRawValue(rawCGMManager)
             cgmManager = cgmManagerFromRawValue(rawCGMManager)
+            updateManagerUnits(cgmManager)
+
         } else {
         } else {
             saveConfigManager()
             saveConfigManager()
         }
         }
@@ -151,7 +162,6 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
         else {
         else {
             return nil
             return nil
         }
         }
-
         return Manager.init(rawState: rawState)
         return Manager.init(rawState: rawState)
     }
     }
 
 

+ 57 - 3
FreeAPS/Sources/APS/OpenAPS/JavaScriptWorker.swift

@@ -3,10 +3,32 @@ import JavaScriptCore
 
 
 private let contextLock = NSRecursiveLock()
 private let contextLock = NSRecursiveLock()
 
 
+extension String {
+    var lowercasingFirst: String { prefix(1).lowercased() + dropFirst() }
+    var uppercasingFirst: String { prefix(1).uppercased() + dropFirst() }
+    var camelCased: String {
+        guard !isEmpty else { return "" }
+        let parts = components(separatedBy: .alphanumerics.inverted)
+        let first = parts.first!.lowercasingFirst
+        let rest = parts.dropFirst().map(\.uppercasingFirst)
+        return ([first] + rest).joined()
+    }
+
+    var pascalCased: String {
+        guard !isEmpty else { return "" }
+        let parts = components(separatedBy: .alphanumerics.inverted)
+        let first = parts.first!.uppercasingFirst
+        let rest = parts.dropFirst().map(\.uppercasingFirst)
+        return ([first] + rest).joined()
+    }
+}
+
 final class JavaScriptWorker {
 final class JavaScriptWorker {
     private let processQueue = DispatchQueue(label: "DispatchQueue.JavaScriptWorker")
     private let processQueue = DispatchQueue(label: "DispatchQueue.JavaScriptWorker")
     private let virtualMachine: JSVirtualMachine
     private let virtualMachine: JSVirtualMachine
     @SyncAccess(lock: contextLock) private var commonContext: JSContext? = nil
     @SyncAccess(lock: contextLock) private var commonContext: JSContext? = nil
+    private var consoleLogs: [String] = []
+    private var logContext: String = ""
 
 
     init() {
     init() {
         virtualMachine = processQueue.sync { JSVirtualMachine()! }
         virtualMachine = processQueue.sync { JSVirtualMachine()! }
@@ -20,9 +42,11 @@ final class JavaScriptWorker {
             }
             }
         }
         }
         let consoleLog: @convention(block) (String) -> Void = { message in
         let consoleLog: @convention(block) (String) -> Void = { message in
-            debug(.openAPS, "JavaScript log: \(message)")
+            let trimmedMessage = message.trimmingCharacters(in: .whitespacesAndNewlines)
+            if !trimmedMessage.isEmpty {
+                self.consoleLogs.append("\(trimmedMessage)")
+            }
         }
         }
-
         context.setObject(
         context.setObject(
             consoleLog,
             consoleLog,
             forKeyedSubscript: "_consoleLog" as NSString
             forKeyedSubscript: "_consoleLog" as NSString
@@ -30,8 +54,37 @@ final class JavaScriptWorker {
         return context
         return context
     }
     }
 
 
+    // New method to flush aggregated logs
+    private func outputLogs() {
+        var outputLogs = consoleLogs.joined(separator: "\n").trimmingCharacters(in: .whitespacesAndNewlines)
+        consoleLogs.removeAll()
+
+        if outputLogs.isEmpty { return }
+
+        if logContext == "autosens.js" {
+            outputLogs = outputLogs.split(separator: "\n").map { logLine in
+                logLine.replacingOccurrences(
+                    of: "^[-+=x!]|u\\(|\\)|\\d{1,2}h$",
+                    with: "",
+                    options: .regularExpression
+                )
+            }.joined(separator: "\n")
+        }
+
+        if !outputLogs.isEmpty {
+            outputLogs.split(separator: "\n").forEach { logLine in
+                if !"\(logLine)".trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
+                    debug(.openAPS, "\(logContext): \(logLine)")
+                }
+            }
+        }
+    }
+
     @discardableResult func evaluate(script: Script) -> JSValue! {
     @discardableResult func evaluate(script: Script) -> JSValue! {
-        evaluate(string: script.body)
+        logContext = URL(fileURLWithPath: script.name).lastPathComponent
+        let result = evaluate(string: script.body)
+        outputLogs()
+        return result
     }
     }
 
 
     private func evaluate(string: String) -> JSValue! {
     private func evaluate(string: String) -> JSValue! {
@@ -52,6 +105,7 @@ final class JavaScriptWorker {
         commonContext = createContext()
         commonContext = createContext()
         defer {
         defer {
             commonContext = nil
             commonContext = nil
+            outputLogs()
         }
         }
         return execute(self)
         return execute(self)
     }
     }

+ 2 - 2
FreeAPS/Sources/APS/OpenAPS/OpenAPS.swift

@@ -635,11 +635,11 @@ final class OpenAPS {
 
 
     private func middlewareScript(name: String) -> Script? {
     private func middlewareScript(name: String) -> Script? {
         if let body = storage.retrieveRaw(name) {
         if let body = storage.retrieveRaw(name) {
-            return Script(name: "Middleware", body: body)
+            return Script(name: name, body: body)
         }
         }
 
 
         if let url = Foundation.Bundle.main.url(forResource: "javascript/\(name)", withExtension: "") {
         if let url = Foundation.Bundle.main.url(forResource: "javascript/\(name)", withExtension: "") {
-            return Script(name: "Middleware", body: try! String(contentsOf: url))
+            return Script(name: name, body: try! String(contentsOf: url))
         }
         }
 
 
         return nil
         return nil

+ 1 - 1
FreeAPS/Sources/Modules/DataTable/View/DataTableRootView.swift

@@ -45,7 +45,7 @@ extension DataTable {
                 formatter.minimumFractionDigits = 0
                 formatter.minimumFractionDigits = 0
                 formatter.maximumFractionDigits = 1
                 formatter.maximumFractionDigits = 1
             }
             }
-            formatter.roundingMode = .down
+            formatter.roundingMode = .halfUp
             return formatter
             return formatter
         }
         }
 
 

+ 1 - 0
FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorDataFlow.swift

@@ -109,6 +109,7 @@ protocol PreferencesEditorProvider: Provider {
     var preferences: Preferences { get }
     var preferences: Preferences { get }
     func savePreferences(_ preferences: Preferences)
     func savePreferences(_ preferences: Preferences)
     func migrateUnits()
     func migrateUnits()
+    func updateManagerUnits()
 }
 }
 
 
 protocol PreferencesSettable: AnyObject {
 protocol PreferencesSettable: AnyObject {

+ 11 - 0
FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorProvider.swift

@@ -1,8 +1,10 @@
 import Foundation
 import Foundation
+import HealthKit
 
 
 extension PreferencesEditor {
 extension PreferencesEditor {
     final class Provider: BaseProvider, PreferencesEditorProvider {
     final class Provider: BaseProvider, PreferencesEditorProvider {
         @Injected() private var settingsManager: SettingsManager!
         @Injected() private var settingsManager: SettingsManager!
+        @Injected() var fetchGlucoseManager: FetchGlucoseManager!
         private let processQueue = DispatchQueue(label: "PreferencesEditorProvider.processQueue")
         private let processQueue = DispatchQueue(label: "PreferencesEditorProvider.processQueue")
 
 
         var preferences: Preferences {
         var preferences: Preferences {
@@ -17,6 +19,15 @@ extension PreferencesEditor {
             }
             }
         }
         }
 
 
+        func updateManagerUnits() {
+            var manager = fetchGlucoseManager.cgmManager
+            let managerName = manager.map { "\(type(of: $0))" } ?? "nil"
+            let units = settingsManager.settings.units
+            let loopkitUnits: HKUnit = units == .mgdL ? .milligramsPerDeciliter : .millimolesPerLiter
+            print("manager: \(managerName) is changing units to: \(loopkitUnits.description) ")
+            manager?.unitDidChange(to: loopkitUnits)
+        }
+
         func migrateUnits() {
         func migrateUnits() {
             migrateTargets()
             migrateTargets()
             migrateISF()
             migrateISF()

+ 1 - 0
FreeAPS/Sources/Modules/PreferencesEditor/PreferencesEditorStateModel.swift

@@ -16,6 +16,7 @@ extension PreferencesEditor {
             subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) {
             subscribeSetting(\.units, on: $unitsIndex.map { $0 == 0 ? GlucoseUnits.mgdL : .mmolL }) {
                 unitsIndex = $0 == .mgdL ? 0 : 1
                 unitsIndex = $0 == .mgdL ? 0 : 1
             } didSet: { [weak self] _ in
             } didSet: { [weak self] _ in
+                self?.provider.updateManagerUnits()
                 self?.provider.migrateUnits()
                 self?.provider.migrateUnits()
             }
             }
 
 

+ 1 - 1
G7SensorKit

@@ -1 +1 @@
-Subproject commit b5e992e211d2ac6224acb105dd97fb484767da72
+Subproject commit 2be3eb29b0a18aa89f8b60281341e46e07d024e5

+ 1 - 1
LibreTransmitter

@@ -1 +1 @@
-Subproject commit c01eba63e94e9f6f2841a8835680c4e39c61b18d
+Subproject commit a230b91a3d30c7b0d4ffbd240234b34cbaf354b1

+ 1 - 1
LoopKit

@@ -1 +1 @@
-Subproject commit 6d9b19ab7e9f749d573fd42f6bcd2ce4c302cf66
+Subproject commit edb69560cb921a8848ea0a450c89bd26cbe54046

+ 1 - 1
OmniBLE

@@ -1 +1 @@
-Subproject commit eacf06f7873e73d6cb8ccd0556b35f734b90df40
+Subproject commit 4ad811774c09cae208678552dbc20ee6cc9d4f59

+ 1 - 1
OmniKit

@@ -1 +1 @@
-Subproject commit 03d3a1db5a4da9b218a60254fa1b0ea72ee808ed
+Subproject commit 01bc59889b9216737942ea3f0cab22f6a6c4a0e8

+ 1 - 1
README.md

@@ -63,7 +63,7 @@ Instructions in greater detail, but not Trio-specific:
 
 
 # Documentation
 # Documentation
 
 
-[Discord Trio - Server ](https://discord.gg/KepAG6RdYZ)
+[Discord Trio - Server ](http://discord.diy-trio.org)
 
 
 [Trio documentation](https://docs.diy-trio.org/en/latest/)
 [Trio documentation](https://docs.diy-trio.org/en/latest/)
 
 

+ 1 - 1
TidepoolService

@@ -1 +1 @@
-Subproject commit a2ccad72a55600c28549ab86ab1964c0d6558868
+Subproject commit b28625628e181b96f0db7ec3739d920a3c92465b