Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions Loop.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,9 @@
43E344A61B9E1B3300C85C07 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E344A51B9E1B3300C85C07 /* NSBundle.swift */; };
43E344A81B9EAA8400C85C07 /* RemoteSettings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 43E344A71B9EAA8300C85C07 /* RemoteSettings.plist */; };
43EB40861C82646A00472A8C /* StatusChartManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EB40851C82646A00472A8C /* StatusChartManager.swift */; };
43EB40C21C83F84900472A8C /* StatusChartHighlightLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EB40C11C83F84900472A8C /* StatusChartHighlightLayer.swift */; };
43EDDBF31C361C75007D89B5 /* xDripG5.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43EDDBF11C361C75007D89B5 /* xDripG5.framework */; };
43F41C331D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F41C321D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift */; };
43F41C351D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F41C341D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift */; };
43F4EF1D1BA2A57600526CE1 /* DiagnosticLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F4EF1C1BA2A57600526CE1 /* DiagnosticLogger.swift */; };
43F5C2C91B929C09003EB13D /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F5C2C81B929C09003EB13D /* HealthKit.framework */; };
43F5C2DB1B92A5E1003EB13D /* SettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F5C2DA1B92A5E1003EB13D /* SettingsTableViewController.swift */; };
Expand Down Expand Up @@ -331,12 +332,13 @@
43E344A51B9E1B3300C85C07 /* NSBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSBundle.swift; sourceTree = "<group>"; };
43E344A71B9EAA8300C85C07 /* RemoteSettings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = RemoteSettings.plist; sourceTree = "<group>"; };
43EB40851C82646A00472A8C /* StatusChartManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusChartManager.swift; sourceTree = "<group>"; };
43EB40C11C83F84900472A8C /* StatusChartHighlightLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusChartHighlightLayer.swift; sourceTree = "<group>"; };
43EDDBF01C361C75007D89B5 /* CommonCrypto.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CommonCrypto.framework; path = Carthage/Build/iOS/CommonCrypto.framework; sourceTree = "<group>"; };
43EDDBF11C361C75007D89B5 /* xDripG5.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = xDripG5.framework; path = Carthage/Build/iOS/xDripG5.framework; sourceTree = "<group>"; };
43EDDBF51C361D24007D89B5 /* CommonCrypto.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = CommonCrypto.framework.dSYM; path = Carthage/Build/iOS/CommonCrypto.framework.dSYM; sourceTree = "<group>"; };
43EDDBF61C361D24007D89B5 /* xDripG5.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = xDripG5.framework.dSYM; path = Carthage/Build/iOS/xDripG5.framework.dSYM; sourceTree = "<group>"; };
43EDEE6B1CF2E12A00393BE3 /* Loop.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Loop.entitlements; sourceTree = "<group>"; };
43F41C321D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAxisValueDoubleUnit.swift; sourceTree = "<group>"; };
43F41C341D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartPointsTouchHighlightLayerViewCache.swift; sourceTree = "<group>"; };
43F4EF1C1BA2A57600526CE1 /* DiagnosticLogger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiagnosticLogger.swift; sourceTree = "<group>"; };
43F5C2C81B929C09003EB13D /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = System/Library/Frameworks/HealthKit.framework; sourceTree = SDKROOT; };
43F5C2D41B92A4A6003EB13D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
Expand Down Expand Up @@ -434,6 +436,7 @@
43DE92601C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift */,
438849EB1D29EC34003B3F23 /* AmplitudeService.swift */,
4331E0791C85650D00FBE832 /* ChartAxisValueDoubleLog.swift */,
43F41C321D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift */,
434F24CA1CFCB7AB0004498F /* GlucoseRxMessage.swift */,
436FACED1D0BA636004E2427 /* InsulinDataSource.swift */,
436A0DA41D236A2A00104B24 /* LoopError.swift */,
Expand Down Expand Up @@ -611,13 +614,13 @@
437CEEC91CD84DB7003C8C80 /* BatteryLevelHUDView.swift */,
437CCADB1D284B830075D2C3 /* ButtonTableViewCell.swift */,
434F54581D28805E002A9274 /* ButtonTableViewCell.xib */,
43F41C341D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift */,
4346D1E61C77F5FE00ABAFE3 /* ChartTableViewCell.swift */,
437CEEBB1CD6DE6A003C8C80 /* HUDView.swift */,
437CEEBD1CD6E0CB003C8C80 /* LoopCompletionHUDView.swift */,
438DADC71CDE8F8B007697A5 /* LoopStateView.swift */,
437CEEC71CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift */,
436FACEB1D0BA246004E2427 /* SegmentedControlTableViewCell.swift */,
43EB40C11C83F84900472A8C /* StatusChartHighlightLayer.swift */,
43A5676A1C96155700334FAC /* SwitchTableViewCell.swift */,
434F54621D28DD80002A9274 /* ValidatingIndicatorView.swift */,
);
Expand Down Expand Up @@ -953,6 +956,7 @@
43776F901B8022E90074EA36 /* AppDelegate.swift in Sources */,
437CCADA1D284ADF0075D2C3 /* AuthenticationTableViewCell.swift in Sources */,
43CE7CDE1CA8B63E003CC1B0 /* NSDate.swift in Sources */,
43F41C331D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift in Sources */,
43F5C2DB1B92A5E1003EB13D /* SettingsTableViewController.swift in Sources */,
43B371861CE583890013C5A6 /* BasalStateView.swift in Sources */,
434FF1EA1CF26C29000DB779 /* IdentifiableClass.swift in Sources */,
Expand All @@ -972,12 +976,12 @@
436FACEC1D0BA246004E2427 /* SegmentedControlTableViewCell.swift in Sources */,
43DBF0591C93F73800B3C386 /* CarbEntryTableViewController.swift in Sources */,
43DE925C1C547A20001FFDE1 /* WatchContext.swift in Sources */,
43F41C351D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift in Sources */,
43EB40861C82646A00472A8C /* StatusChartManager.swift in Sources */,
437CEEC81CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift in Sources */,
43C0944A1CACCC73001F6403 /* NotificationManager.swift in Sources */,
434FF1EE1CF27EEF000DB779 /* UITableViewCell.swift in Sources */,
438849EA1D297CB6003B3F23 /* NightscoutService.swift in Sources */,
43EB40C21C83F84900472A8C /* StatusChartHighlightLayer.swift in Sources */,
437CCADC1D284B830075D2C3 /* ButtonTableViewCell.swift in Sources */,
4315D2871CA5CC3B00589052 /* CarbEntryEditTableViewController.swift in Sources */,
4331E0781C85302200FBE832 /* CGPoint.swift in Sources */,
Expand Down
53 changes: 36 additions & 17 deletions Loop/Managers/StatusChartManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,23 +73,31 @@ class StatusChartsManager {

var glucoseValues: [GlucoseValue] = [] {
didSet {
glucosePoints = glucoseValues.map({
// TODO: Use the preferred unit
let unit = HKUnit.milligramsPerDeciliterUnit()
let unitString = unit.glucoseUnitDisplayString

glucosePoints = glucoseValues.map {
return ChartPoint(
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
y: ChartAxisValueDouble($0.quantity.doubleValueForUnit(HKUnit.milligramsPerDeciliterUnit()))
y: ChartAxisValueDoubleUnit($0.quantity.doubleValueForUnit(unit), unitString: unitString)
)
})
}
}
}

var predictedGlucoseValues: [GlucoseValue] = [] {
didSet {
predictedGlucosePoints = predictedGlucoseValues.map({
// TODO: Use the preferred unit
let unit = HKUnit.milligramsPerDeciliterUnit()
let unitString = unit.glucoseUnitDisplayString

predictedGlucosePoints = predictedGlucoseValues.map {
return ChartPoint(
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
y: ChartAxisValueDouble($0.quantity.doubleValueForUnit(HKUnit.milligramsPerDeciliterUnit()), formatter: integerFormatter)
y: ChartAxisValueDoubleUnit($0.quantity.doubleValueForUnit(unit), unitString: unitString, formatter: integerFormatter)
)
})
}
}
}

Expand All @@ -98,18 +106,21 @@ class StatusChartsManager {
IOBPoints = IOBValues.map {
return ChartPoint(
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
y: ChartAxisValueDouble($0.value, formatter: decimalFormatter)
y: ChartAxisValueDoubleUnit($0.value, unitString: "U", formatter: decimalFormatter)
)
}
}
}

var COBValues: [CarbValue] = [] {
didSet {
let unit = HKUnit.gramUnit()
let unitString = unit.unitString

COBPoints = COBValues.map {
ChartPoint(
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
y: ChartAxisValueDouble($0.quantity.doubleValueForUnit(HKUnit.gramUnit()), formatter: integerFormatter)
y: ChartAxisValueDoubleUnit($0.quantity.doubleValueForUnit(unit), unitString: unitString, formatter: integerFormatter)
)
}
}
Expand All @@ -122,7 +133,7 @@ class StatusChartsManager {
let startX = ChartAxisValueDate(date: entry.startDate, formatter: dateFormatter)
let endX = ChartAxisValueDate(date: entry.endDate, formatter: dateFormatter)
let zero = ChartAxisValueInt(0)
let value = ChartAxisValueDoubleLog(actualDouble: entry.value, formatter: decimalFormatter)
let value = ChartAxisValueDoubleLog(actualDouble: entry.value, unitString: "U/hour", formatter: decimalFormatter)

let newPoints = [
ChartPoint(x: startX, y: zero),
Expand Down Expand Up @@ -214,6 +225,14 @@ class StatusChartsManager {

private var doseChart: Chart?

private var glucoseChartCache: ChartPointsTouchHighlightLayerViewCache?

private var IOBChartCache: ChartPointsTouchHighlightLayerViewCache?

private var COBChartCache: ChartPointsTouchHighlightLayerViewCache?

private var doseChartCache: ChartPointsTouchHighlightLayerViewCache?

// MARK: - Generators

func glucoseChartWithFrame(frame: CGRect) -> Chart? {
Expand Down Expand Up @@ -275,7 +294,7 @@ class StatusChartsManager {
prediction = ChartPointsScatterCirclesLayer(xAxis: xAxis, yAxis: yAxis, innerFrame: innerFrame, chartPoints: predictedGlucosePoints, displayDelay: 0, itemSize: CGSize(width: 2, height: 2), itemFillColor: UIColor.glucoseTintColor.colorWithAlphaComponent(0.75))
}

let highlightLayer = StatusChartHighlightLayer(
glucoseChartCache = ChartPointsTouchHighlightLayerViewCache(
xAxis: xAxis,
yAxis: yAxis,
innerFrame: innerFrame,
Expand All @@ -292,7 +311,7 @@ class StatusChartsManager {
targetOverrideDurationLayer,
xAxis,
yAxis,
highlightLayer,
glucoseChartCache?.highlightLayer,
prediction,
circles
]
Expand Down Expand Up @@ -356,7 +375,7 @@ class StatusChartsManager {
return v
})

let highlightLayer = StatusChartHighlightLayer(
IOBChartCache = ChartPointsTouchHighlightLayerViewCache(
xAxis: xAxis,
yAxis: yAxis,
innerFrame: innerFrame,
Expand All @@ -371,7 +390,7 @@ class StatusChartsManager {
xAxis,
yAxis,
zeroGuidelineLayer,
highlightLayer,
IOBChartCache?.highlightLayer,
IOBArea,
IOBLine,
]
Expand Down Expand Up @@ -425,7 +444,7 @@ class StatusChartsManager {
let gridLayer = ChartGuideLinesLayer(xAxis: xAxis, yAxis: yAxis, innerFrame: innerFrame, axis: .XAndY, settings: guideLinesLayerSettings, onlyVisibleX: true, onlyVisibleY: false)


let highlightLayer = StatusChartHighlightLayer(
COBChartCache = ChartPointsTouchHighlightLayerViewCache(
xAxis: xAxis,
yAxis: yAxis,
innerFrame: innerFrame,
Expand All @@ -439,7 +458,7 @@ class StatusChartsManager {
gridLayer,
xAxis,
yAxis,
highlightLayer,
COBChartCache?.highlightLayer,
COBArea,
COBLine
]
Expand Down Expand Up @@ -492,7 +511,7 @@ class StatusChartsManager {
return v
})

let highlightLayer = StatusChartHighlightLayer(
doseChartCache = ChartPointsTouchHighlightLayerViewCache(
xAxis: xAxis,
yAxis: yAxis,
innerFrame: innerFrame,
Expand All @@ -507,7 +526,7 @@ class StatusChartsManager {
xAxis,
yAxis,
zeroGuidelineLayer,
highlightLayer,
doseChartCache?.highlightLayer,
doseArea,
doseLine
]
Expand Down
13 changes: 12 additions & 1 deletion Loop/Models/ChartAxisValueDoubleLog.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import SwiftCharts

class ChartAxisValueDoubleLog: ChartAxisValueDoubleScreenLoc {

init(actualDouble: Double, formatter: NSNumberFormatter, labelSettings: ChartLabelSettings = ChartLabelSettings()) {
let unitString: String?

init(actualDouble: Double, unitString: String? = nil, formatter: NSNumberFormatter, labelSettings: ChartLabelSettings = ChartLabelSettings()) {
let screenLocDouble: Double

switch actualDouble {
Expand All @@ -24,6 +26,8 @@ class ChartAxisValueDoubleLog: ChartAxisValueDoubleScreenLoc {
screenLocDouble = 0
}

self.unitString = unitString

super.init(screenLocDouble: screenLocDouble, actualDouble: actualDouble, formatter: formatter, labelSettings: labelSettings)
}

Expand All @@ -39,7 +43,14 @@ class ChartAxisValueDoubleLog: ChartAxisValueDoubleScreenLoc {
actualDouble = 0
}

self.unitString = nil

super.init(screenLocDouble: screenLocDouble, actualDouble: actualDouble, formatter: formatter, labelSettings: labelSettings)
}

override var description: String {
let suffix = unitString != nil ? " \(unitString!)" : ""

return super.description + suffix
}
}
31 changes: 31 additions & 0 deletions Loop/Models/ChartAxisValueDoubleUnit.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// ChartAxisValueDoubleUnit.swift
// Loop
//
// Created by Nate Racklyeft on 7/16/16.
// Copyright © 2016 Nathan Racklyeft. All rights reserved.
//

import UIKit
import SwiftCharts


class ChartAxisValueDoubleUnit: ChartAxisValueDouble {
let unitString: String

init(_ double: Double, unitString: String, formatter: NSNumberFormatter) {
self.unitString = unitString

super.init(double, formatter: formatter)
}

init(_ double: Double, unitString: String) {
self.unitString = unitString

super.init(double)
}

override var description: String {
return "\(super.description) \(unitString)"
}
}
Loading