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

Add: lower graph area, overrides from treatments, adjusted startup timers,

Jon Fawcett 5 лет назад
Родитель
Сommit
50ed375f1a

+ 34 - 16
LoopFollow/Controllers/Graphs.swift

@@ -109,11 +109,12 @@ extension MainViewController {
         lineBasal.axisDependency = YAxis.AxisDependency.left
         lineBasal.highlightEnabled = true
         lineBasal.drawValuesEnabled = false
+        lineBasal.fillFormatter = basalFillFormatter()
         
         // Boluses
         var chartEntryBolus = [ChartDataEntry]()
         let lineBolus = LineChartDataSet(entries:chartEntryBolus, label: "")
-        lineBolus.circleRadius = 7
+        lineBolus.circleRadius = 5
         lineBolus.circleColors = [NSUIColor.systemBlue.withAlphaComponent(0.75)]
         lineBolus.drawCircleHoleEnabled = false
         lineBolus.setDrawHighlightIndicators(false)
@@ -130,7 +131,7 @@ extension MainViewController {
         // Carbs
         var chartEntryCarbs = [ChartDataEntry]()
         let lineCarbs = LineChartDataSet(entries:chartEntryCarbs, label: "")
-        lineCarbs.circleRadius = 7
+        lineCarbs.circleRadius = 5
         lineCarbs.circleColors = [NSUIColor.systemOrange.withAlphaComponent(0.75)]
         lineCarbs.drawCircleHoleEnabled = false
         lineCarbs.setDrawHighlightIndicators(false)
@@ -160,9 +161,10 @@ extension MainViewController {
         var chartOverrideEntry = [ChartDataEntry]()
         let lineOverride = LineChartDataSet(entries:chartOverrideEntry, label: "")
         lineOverride.setDrawHighlightIndicators(false)
-        lineOverride.setColor(NSUIColor.systemTeal, alpha: 0.8  )
-        lineOverride.lineWidth = 10
-        lineOverride.drawFilledEnabled = false
+        lineOverride.lineWidth = 0
+        lineOverride.drawFilledEnabled = true
+        lineOverride.fillFormatter = OverrideFillFormatter()
+        lineOverride.fillColor = NSUIColor.systemTeal.withAlphaComponent(0.8)
         lineOverride.drawCirclesEnabled = false
         lineOverride.axisDependency = YAxis.AxisDependency.right
         lineOverride.highlightEnabled = true
@@ -229,7 +231,7 @@ extension MainViewController {
         BGChart.leftAxis.enabled = true
         BGChart.leftAxis.labelPosition = YAxis.LabelPosition.insideChart
         BGChart.leftAxis.axisMaximum = maxBasal
-        BGChart.leftAxis.axisMinimum = 0.0
+        BGChart.leftAxis.axisMinimum = -1
         BGChart.leftAxis.drawGridLinesEnabled = false
         
         BGChart.rightAxis.labelTextColor = NSUIColor.label
@@ -469,7 +471,8 @@ extension MainViewController {
             if UserDefaultsRepository.offsetCarbsBolus.value {
                 offset = 10
             }
-            let value = ChartDataEntry(x: Double(bolusData[i].date), y: Double(bolusData[i].sgv + offset), data: formatter.string(from: NSNumber(value: bolusData[i].value)))
+            //let value = ChartDataEntry(x: Double(bolusData[i].date), y: Double(bolusData[i].sgv + offset), data: formatter.string(from: NSNumber(value: bolusData[i].value)))
+            let value = ChartDataEntry(x: Double(bolusData[i].date), y: -5, data: formatter.string(from: NSNumber(value: bolusData[i].value)))
             BGChart.data?.dataSets[dataIndex].addEntry(value)
 
         }
@@ -491,7 +494,8 @@ extension MainViewController {
             if UserDefaultsRepository.offsetCarbsBolus.value {
                 offset = 30
             }
-             let value = ChartDataEntry(x: Double(carbData[i].date), y: Double(carbData[i].sgv + offset), data: formatter.string(from: NSNumber(value: carbData[i].value)))
+           //  let value = ChartDataEntry(x: Double(carbData[i].date), y: Double(carbData[i].sgv + offset), data: formatter.string(from: NSNumber(value: carbData[i].value)))
+            let value = ChartDataEntry(x: Double(carbData[i].date), y: -25, data: formatter.string(from: NSNumber(value: carbData[i].value)))
             BGChart.data?.dataSets[dataIndex].addEntry(value)
 
         }
@@ -572,19 +576,33 @@ extension MainViewController {
         chart.clear()
         
         var colors = [NSUIColor]()
-        for i in 0..<overrideData.count{
-            let multiplier = overrideData[i].value as! Double * 100.0
-            let labelText = String(format: "%.0f%%", multiplier)
-            //let value = ChartDataEntry(x: Double(overrideData[i].date), y: Double(overrideData[i].sgv), data: overrideData[i].value)
-            let value = ChartDataEntry(x: Double(overrideData[i].date), y: Double(overrideData[i].sgv), data: labelText)
+        for i in 0..<overrideGraphData.count{
+            let multiplier = overrideGraphData[i].insulNeedsScaleFactor as! Double * 100.0
+            //let labelText = String(format: "%.0f%%", multiplier)
+            let labelText = overrideGraphData[i].reason
+            
+            // Start Dot
+            let value = ChartDataEntry(x: Double(overrideGraphData[i].date), y: Double(overrideGraphData[i].sgv), data: labelText)
             BGChart.data?.dataSets[dataIndex].addEntry(value)
             
-            if Double(overrideData[i].value) == 1.0 {
+            if Double(overrideGraphData[i].insulNeedsScaleFactor) == 1.0 {
+                colors.append(NSUIColor.systemGray.withAlphaComponent(0.0))
+            } else if i >= overrideGraphData.count - 2 {
+                colors.append(NSUIColor.systemGreen)
+            } else {
+                colors.append(NSUIColor.systemGray.withAlphaComponent(CGFloat(overrideGraphData[i].insulNeedsScaleFactor / 2)))
+            }
+            
+            // End Dot
+            let endDot = ChartDataEntry(x: Double(overrideGraphData[i].endDate), y: Double(overrideGraphData[i].sgv), data: labelText)
+            BGChart.data?.dataSets[dataIndex].addEntry(endDot)
+            
+            if Double(overrideGraphData[i].insulNeedsScaleFactor) == 1.0 {
                 colors.append(NSUIColor.systemGray.withAlphaComponent(0.0))
-            } else if i >= overrideData.count - 2 {
+            } else if i >= overrideGraphData.count - 2 {
                 colors.append(NSUIColor.systemGreen)
             } else {
-                colors.append(NSUIColor.systemGray.withAlphaComponent(CGFloat(overrideData[i].value / 2)))
+                colors.append(NSUIColor.systemGray.withAlphaComponent(CGFloat(overrideGraphData[i].insulNeedsScaleFactor / 2)))
             }
         }
         

+ 54 - 2
LoopFollow/Controllers/NightScout.swift

@@ -597,7 +597,7 @@ extension MainViewController {
             }
         }
         overrideData.reverse()
-        updateOverrideGraph()
+        //updateOverrideGraph()
         checkOverrideAlarms()
         
         // Start the timer based on the timestamp
@@ -972,6 +972,7 @@ extension MainViewController {
         var suspendPump: [[String:AnyObject]] = []
         var resumePump: [[String:AnyObject]] = []
         var pumpSiteChange: [[String:AnyObject]] = []
+        var cgmSensorStart: [[String:AnyObject]] = []
         
         for i in 0..<entries.count {
             let entry = entries[i] as [String : AnyObject]?
@@ -995,6 +996,8 @@ extension MainViewController {
                     resumePump.append(entry!)
                 case "Pump Site Change":
                     pumpSiteChange.append(entry!)
+                case "CGM Sensor Start":
+                    cgmSensorStart.append(entry!)
                 default:
                     print("No Match: \(String(describing: entry))")
             }
@@ -1005,6 +1008,7 @@ extension MainViewController {
         if bolus.count > 0 { processNSBolus(entries: bolus)}
         if carbs.count > 0 { processNSCarbs(entries: carbs)}
         if bgCheck.count > 0 { processNSBGCheck(entries: bgCheck)}
+        if temporaryOverride.count > 0 { processNSOverrides(entries: temporaryOverride)}
     }
     
     // NS Temp Basal Response Processor
@@ -1181,7 +1185,7 @@ extension MainViewController {
         }
         infoTable.reloadData()
     }
-    
+
     // NS Meal Bolus Response Processor
     func processNSBolus(entries: [[String:AnyObject]]) {
         if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: Bolus") }
@@ -1331,4 +1335,52 @@ extension MainViewController {
         
         
     }
+    
+    // NS Override Response Processor
+    func processNSOverrides(entries: [[String:AnyObject]]) {
+        if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: Overrides") }
+        // because it's a small array, we're going to destroy and reload every time.
+        overrideGraphData.removeAll()
+        for i in 0..<entries.count {
+            let currentEntry = entries[entries.count - 1 - i] as [String : AnyObject]?
+            var date: String
+            if currentEntry?["timestamp"] != nil {
+                date = currentEntry?["timestamp"] as! String
+            } else if currentEntry?["created_at"] != nil {
+                date = currentEntry?["created_at"] as! String
+            } else {
+                return
+            }
+            // Fix for FreeAPS milliseconds in timestamp
+            var strippedZone = String(date.dropLast())
+            strippedZone = strippedZone.components(separatedBy: ".")[0]
+            
+            let dateFormatter = DateFormatter()
+            dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
+            dateFormatter.locale = Locale(identifier: "en_US")
+            dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
+            let dateString = dateFormatter.date(from: strippedZone)
+            let dateTimeStamp = dateString!.timeIntervalSince1970
+            
+            guard let multipler = currentEntry?["insulinNeedsScaleFactor"] as? Double else { continue }
+            guard let duration = currentEntry?["duration"] as? Double else { continue }
+            guard let enteredBy = currentEntry?["enteredBy"] as? String else { continue }
+            guard let reason = currentEntry?["reason"] as? String else { continue }
+            guard let ranges = currentEntry?["correctionRange"] as? [Int] else { continue }
+            guard let low = ranges[0] as? Int else { continue }
+            guard let high = ranges[1] as? Int else { continue }
+            let endDate = dateTimeStamp + (duration * 60)
+            var range: [Int] = []
+            range.append(low)
+            range.append(high)
+           
+            let dot = DataStructs.overrideStruct(insulNeedsScaleFactor: multipler, date: dateTimeStamp, endDate: endDate, duration: duration, correctionRange: range, enteredBy: enteredBy, reason: reason, sgv: -20)
+            overrideGraphData.append(dot)
+            
+            
+        }
+        
+        updateOverrideGraph()
+        
+    }
 }

+ 6 - 8
LoopFollow/Controllers/Timers.swift

@@ -13,11 +13,11 @@ import UIKit
 extension MainViewController {
     
     func restartAllTimers() {
-        if !deviceStatusTimer.isValid { startDeviceStatusTimer(time: 1) }
-        if !profileTimer.isValid { startProfileTimer(time: 1) }
-        if !bgTimer.isValid { startBGTimer(time: 1) }
-        if !treatmentsTimer.isValid { startTreatmentsTimer(time: 1) }
-        if !cageSageTimer.isValid { startCageSageTimer(time: 1) }
+        if !bgTimer.isValid { startBGTimer(time: 2) }
+        if !profileTimer.isValid { startProfileTimer(time: 3) }
+        if !deviceStatusTimer.isValid { startDeviceStatusTimer(time: 4) }
+        if !treatmentsTimer.isValid { startTreatmentsTimer(time: 5) }
+        if !cageSageTimer.isValid { startCageSageTimer(time: 6) }
         if !minAgoTimer.isValid { startMinAgoTimer(time: minAgoTimeInterval) }
         if !calendarTimer.isValid { startCalendarTimer(time: 15) }
         if !alarmTimer.isValid { startAlarmTimer(time: 30) }
@@ -194,12 +194,10 @@ extension MainViewController {
             return
         }
         
-        if !isStaleData() && UserDefaultsRepository.url.value != "" {
-            if UserDefaultsRepository.downloadTreatments.value {
+        if UserDefaultsRepository.url.value != "" && UserDefaultsRepository.downloadTreatments.value {
                 WebLoadNSTreatments()
             }
             startTreatmentsTimer()
-        }
     }
     
     // Profile Timer

+ 7 - 0
LoopFollow/ViewControllers/DebugSettingsViewController.swift

@@ -26,6 +26,13 @@ class DebugSettingsViewController: FormViewController {
         form
             +++ Section("Debug Settings")
 
+            <<< SwitchRow("downloadTreatments"){ row in
+                row.title = "Download Treatments"
+                row.value = UserDefaultsRepository.downloadTreatments.value
+            }.onChange { [weak self] row in
+                        guard let value = row.value else { return }
+                        UserDefaultsRepository.downloadTreatments.value = value
+                }
         <<< SwitchRow("downloadBasal"){ row in
             row.title = "Download Basal"
             row.value = UserDefaultsRepository.downloadBasal.value

+ 1 - 0
LoopFollow/ViewControllers/MainViewController.swift

@@ -106,6 +106,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     var bolusData: [bolusCarbGraphStruct] = []
     var carbData: [bolusCarbGraphStruct] = []
     var overrideData: [DataStructs.overrideGraphStruct] = []
+    var overrideGraphData: [DataStructs.overrideStruct] = []
     var predictionData: [ShareGlucoseData] = []
     var bgCheckData: [ShareGlucoseData] = []
     var chartData = LineChartData()

+ 12 - 0
LoopFollow/helpers/Chart.swift

@@ -9,6 +9,18 @@
 import Foundation
 import Charts
 
+final class OverrideFillFormatter: IFillFormatter {
+    func getFillLinePosition(dataSet: ILineChartDataSet, dataProvider: LineChartDataProvider) -> CGFloat {
+        return -40
+    }
+}
+
+final class basalFillFormatter: IFillFormatter {
+    func getFillLinePosition(dataSet: ILineChartDataSet, dataProvider: LineChartDataProvider) -> CGFloat {
+        return 0
+    }
+}
+
 final class ChartXValueFormatter: IAxisValueFormatter {
     
 

+ 11 - 0
LoopFollow/helpers/DataStructs.swift

@@ -30,5 +30,16 @@ class DataStructs {
         var sgv: Int
     }
     
+    //NS Override Data  Struct
+    struct overrideStruct: Codable {
+        var insulNeedsScaleFactor: Double
+        var date: TimeInterval
+        var endDate: TimeInterval
+        var duration: Double
+        var correctionRange: [Int]
+        var enteredBy: String
+        var reason: String
+        var sgv: Float
+    }
     
 }