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
8 changes: 8 additions & 0 deletions LoopFollow.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
DD493AE52ACF2383009A6922 /* Treatments.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD493AE42ACF2383009A6922 /* Treatments.swift */; };
DD493AE72ACF23CF009A6922 /* DeviceStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD493AE62ACF23CF009A6922 /* DeviceStatus.swift */; };
DD493AE92ACF2445009A6922 /* BGData.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD493AE82ACF2445009A6922 /* BGData.swift */; };
DD608A082C1F584900F91132 /* DeviceStatusLoop.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD608A072C1F584900F91132 /* DeviceStatusLoop.swift */; };
DD6A935E2BFA6FA2003FFB8E /* DeviceStatusOpenAPS.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6A935D2BFA6FA2003FFB8E /* DeviceStatusOpenAPS.swift */; };
DD7E19842ACDA50C00DBD158 /* Overrides.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7E19832ACDA50C00DBD158 /* Overrides.swift */; };
DD7E19862ACDA59700DBD158 /* BGCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7E19852ACDA59700DBD158 /* BGCheck.swift */; };
DD7E19882ACDA5DA00DBD158 /* Notes.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7E19872ACDA5DA00DBD158 /* Notes.swift */; };
Expand Down Expand Up @@ -211,6 +213,8 @@
DD493AE42ACF2383009A6922 /* Treatments.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Treatments.swift; sourceTree = "<group>"; };
DD493AE62ACF23CF009A6922 /* DeviceStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceStatus.swift; sourceTree = "<group>"; };
DD493AE82ACF2445009A6922 /* BGData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BGData.swift; sourceTree = "<group>"; };
DD608A072C1F584900F91132 /* DeviceStatusLoop.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceStatusLoop.swift; sourceTree = "<group>"; };
DD6A935D2BFA6FA2003FFB8E /* DeviceStatusOpenAPS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceStatusOpenAPS.swift; sourceTree = "<group>"; };
DD7E19832ACDA50C00DBD158 /* Overrides.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Overrides.swift; sourceTree = "<group>"; };
DD7E19852ACDA59700DBD158 /* BGCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BGCheck.swift; sourceTree = "<group>"; };
DD7E19872ACDA5DA00DBD158 /* Notes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notes.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -450,6 +454,8 @@
DD493AE42ACF2383009A6922 /* Treatments.swift */,
DD493AE62ACF23CF009A6922 /* DeviceStatus.swift */,
DD493AE82ACF2445009A6922 /* BGData.swift */,
DD6A935D2BFA6FA2003FFB8E /* DeviceStatusOpenAPS.swift */,
DD608A072C1F584900F91132 /* DeviceStatusLoop.swift */,
);
path = Nightscout;
sourceTree = "<group>";
Expand Down Expand Up @@ -1013,6 +1019,7 @@
DDF9676E2AD08C6E00C5EB95 /* SiteChange.swift in Sources */,
DDCF979C24C14EFB002C9752 /* AdvancedSettingsViewController.swift in Sources */,
FC97881C2485969B00A7906C /* MainViewController.swift in Sources */,
DD6A935E2BFA6FA2003FFB8E /* DeviceStatusOpenAPS.swift in Sources */,
DD493AD52ACF2109009A6922 /* ResumePump.swift in Sources */,
DDCF979624C1443C002C9752 /* GeneralSettingsViewController.swift in Sources */,
FCC0FAC224922A22003E610E /* DictionaryKeyPath.swift in Sources */,
Expand All @@ -1021,6 +1028,7 @@
DD493AD92ACF2171009A6922 /* Carbs.swift in Sources */,
DD493AE92ACF2445009A6922 /* BGData.swift in Sources */,
FCC6886B24898FD800A0279D /* ObservationToken.swift in Sources */,
DD608A082C1F584900F91132 /* DeviceStatusLoop.swift in Sources */,
DD98F54424BCEFEE0007425A /* ShareClientExtension.swift in Sources */,
DD91E4DD2BDEC3F8002D9E97 /* GlucoseConversion.swift in Sources */,
FCC6886D2489909D00A0279D /* AnyConvertible.swift in Sources */,
Expand Down
8 changes: 0 additions & 8 deletions LoopFollow/Application/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
Expand Up @@ -529,14 +529,6 @@
<view key="view" contentMode="scaleToFill" id="ljg-dW-5uR">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6gS-Ff-qPd">
<rect key="frame" x="0.0" y="44" width="414" height="769"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<viewLayoutGuide key="contentLayoutGuide" id="1wh-Gg-Auv"/>
<viewLayoutGuide key="frameLayoutGuide" id="lqA-iJ-wdZ"/>
</scrollView>
</subviews>
<viewLayoutGuide key="safeArea" id="aVb-ap-Pwt"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
Expand Down
237 changes: 229 additions & 8 deletions LoopFollow/Controllers/Graphs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,102 @@ extension MainViewController {
lineNote.axisDependency = YAxis.AxisDependency.right
lineNote.valueFormatter = ChartYDataValueFormatter()
lineNote.drawValuesEnabled = false

// Setup COB Prediction line details
let COBpredictionChartEntry = [ChartDataEntry]()
let COBlinePrediction = LineChartDataSet(entries:COBpredictionChartEntry, label: "")
COBlinePrediction.circleRadius = CGFloat(globalVariables.dotBG)
COBlinePrediction.circleColors = [NSUIColor.systemPurple]
COBlinePrediction.colors = [NSUIColor.systemPurple]
COBlinePrediction.drawCircleHoleEnabled = false
COBlinePrediction.axisDependency = YAxis.AxisDependency.right
COBlinePrediction.highlightEnabled = true
COBlinePrediction.drawValuesEnabled = false

if UserDefaultsRepository.showLines.value {
COBlinePrediction.lineWidth = 2
} else {
COBlinePrediction.lineWidth = 0
}
if UserDefaultsRepository.showDots.value {
COBlinePrediction.drawCirclesEnabled = true
} else {
COBlinePrediction.drawCirclesEnabled = false
}
COBlinePrediction.setDrawHighlightIndicators(false)
COBlinePrediction.valueFont.withSize(50)

// Setup IOB Prediction line details
let IOBpredictionChartEntry = [ChartDataEntry]()
let IOBlinePrediction = LineChartDataSet(entries:IOBpredictionChartEntry, label: "")
IOBlinePrediction.circleRadius = CGFloat(globalVariables.dotBG)
IOBlinePrediction.circleColors = [NSUIColor.systemPurple]
IOBlinePrediction.colors = [NSUIColor.systemPurple]
IOBlinePrediction.drawCircleHoleEnabled = false
IOBlinePrediction.axisDependency = YAxis.AxisDependency.right
IOBlinePrediction.highlightEnabled = true
IOBlinePrediction.drawValuesEnabled = false

if UserDefaultsRepository.showLines.value {
IOBlinePrediction.lineWidth = 2
} else {
IOBlinePrediction.lineWidth = 0
}
if UserDefaultsRepository.showDots.value {
IOBlinePrediction.drawCirclesEnabled = true
} else {
IOBlinePrediction.drawCirclesEnabled = false
}
IOBlinePrediction.setDrawHighlightIndicators(false)
IOBlinePrediction.valueFont.withSize(50)

// Setup UAM Prediction line details
let UAMpredictionChartEntry = [ChartDataEntry]()
let UAMlinePrediction = LineChartDataSet(entries:UAMpredictionChartEntry, label: "")
UAMlinePrediction.circleRadius = CGFloat(globalVariables.dotBG)
UAMlinePrediction.circleColors = [NSUIColor.systemPurple]
UAMlinePrediction.colors = [NSUIColor.systemPurple]
UAMlinePrediction.drawCircleHoleEnabled = false
UAMlinePrediction.axisDependency = YAxis.AxisDependency.right
UAMlinePrediction.highlightEnabled = true
UAMlinePrediction.drawValuesEnabled = false

if UserDefaultsRepository.showLines.value {
UAMlinePrediction.lineWidth = 2
} else {
UAMlinePrediction.lineWidth = 0
}
if UserDefaultsRepository.showDots.value {
UAMlinePrediction.drawCirclesEnabled = true
} else {
UAMlinePrediction.drawCirclesEnabled = false
}
linePrediction.setDrawHighlightIndicators(false)
linePrediction.valueFont.withSize(50)

// Setup ZT Prediction line details
let ZTpredictionChartEntry = [ChartDataEntry]()
let ZTlinePrediction = LineChartDataSet(entries:ZTpredictionChartEntry, label: "")
ZTlinePrediction.circleRadius = CGFloat(globalVariables.dotBG)
ZTlinePrediction.circleColors = [NSUIColor.systemPurple]
ZTlinePrediction.colors = [NSUIColor.systemPurple]
ZTlinePrediction.drawCircleHoleEnabled = false
ZTlinePrediction.axisDependency = YAxis.AxisDependency.right
ZTlinePrediction.highlightEnabled = true
ZTlinePrediction.drawValuesEnabled = false

if UserDefaultsRepository.showLines.value {
ZTlinePrediction.lineWidth = 2
} else {
ZTlinePrediction.lineWidth = 0
}
if UserDefaultsRepository.showDots.value {
ZTlinePrediction.drawCirclesEnabled = true
} else {
ZTlinePrediction.drawCirclesEnabled = false
}
ZTlinePrediction.setDrawHighlightIndicators(false)
ZTlinePrediction.valueFont.withSize(50)

// Setup the chart data of all lines
let data = LineChartData()
Expand All @@ -270,7 +366,11 @@ extension MainViewController {
data.append(lineResume) // Dataset 9
data.append(lineSensor) // Dataset 10
data.append(lineNote) // Dataset 11

data.append(ZTlinePrediction) // Dataset 12
data.append(IOBlinePrediction) // Dataset 13
data.append(COBlinePrediction) // Dataset 14
data.append(UAMlinePrediction) // Dataset 15

data.setValueFont(UIFont.systemFont(ofSize: 12))

// Add marker popups for bolus and carbs
Expand Down Expand Up @@ -1137,6 +1237,58 @@ extension MainViewController {
lineNote.axisDependency = YAxis.AxisDependency.right
lineNote.valueFormatter = ChartYDataValueFormatter()
lineNote.drawValuesEnabled = false

// Setup COB Prediction line details
var COBpredictionChartEntry = [ChartDataEntry]()
let COBlinePrediction = LineChartDataSet(entries:COBpredictionChartEntry, label: "")
COBlinePrediction.drawCirclesEnabled = false
COBlinePrediction.setColor(NSUIColor.systemPurple)
COBlinePrediction.highlightEnabled = true
COBlinePrediction.drawHorizontalHighlightIndicatorEnabled = false
COBlinePrediction.drawVerticalHighlightIndicatorEnabled = false
COBlinePrediction.highlightColor = NSUIColor.label
COBlinePrediction.drawValuesEnabled = false
COBlinePrediction.lineWidth = 1.5
COBlinePrediction.axisDependency = YAxis.AxisDependency.right

// Setup IOB Prediction line details
var IOBpredictionChartEntry = [ChartDataEntry]()
let IOBlinePrediction = LineChartDataSet(entries:IOBpredictionChartEntry, label: "")
IOBlinePrediction.drawCirclesEnabled = false
IOBlinePrediction.setColor(NSUIColor.systemPurple)
IOBlinePrediction.highlightEnabled = true
IOBlinePrediction.drawHorizontalHighlightIndicatorEnabled = false
IOBlinePrediction.drawVerticalHighlightIndicatorEnabled = false
IOBlinePrediction.highlightColor = NSUIColor.label
IOBlinePrediction.drawValuesEnabled = false
IOBlinePrediction.lineWidth = 1.5
IOBlinePrediction.axisDependency = YAxis.AxisDependency.right

// Setup UAM Prediction line details
var UAMpredictionChartEntry = [ChartDataEntry]()
let UAMlinePrediction = LineChartDataSet(entries:UAMpredictionChartEntry, label: "")
UAMlinePrediction.drawCirclesEnabled = false
UAMlinePrediction.setColor(NSUIColor.systemPurple)
UAMlinePrediction.highlightEnabled = true
UAMlinePrediction.drawHorizontalHighlightIndicatorEnabled = false
UAMlinePrediction.drawVerticalHighlightIndicatorEnabled = false
UAMlinePrediction.highlightColor = NSUIColor.label
UAMlinePrediction.drawValuesEnabled = false
UAMlinePrediction.lineWidth = 1.5
UAMlinePrediction.axisDependency = YAxis.AxisDependency.right

// Setup ZT Prediction line details
var ZTpredictionChartEntry = [ChartDataEntry]()
let ZTlinePrediction = LineChartDataSet(entries:ZTpredictionChartEntry, label: "")
ZTlinePrediction.drawCirclesEnabled = false
ZTlinePrediction.setColor(NSUIColor.systemPurple)
ZTlinePrediction.highlightEnabled = true
ZTlinePrediction.drawHorizontalHighlightIndicatorEnabled = false
ZTlinePrediction.drawVerticalHighlightIndicatorEnabled = false
ZTlinePrediction.highlightColor = NSUIColor.label
ZTlinePrediction.drawValuesEnabled = false
ZTlinePrediction.lineWidth = 1.5
ZTlinePrediction.axisDependency = YAxis.AxisDependency.right

// Setup the chart data of all lines
let data = LineChartData()
Expand All @@ -1152,7 +1304,11 @@ extension MainViewController {
data.append(lineResume) // Dataset 9
data.append(lineSensor) // Dataset 10
data.append(lineNote) // Dataset 11

data.append(ZTlinePrediction) // Dataset 12
data.append(IOBlinePrediction) // Dataset 13
data.append(COBlinePrediction) // Dataset 14
data.append(UAMlinePrediction) // Dataset 15

BGChartFull.highlightPerDragEnabled = true
BGChartFull.leftAxis.enabled = false
BGChartFull.leftAxis.axisMaximum = maxBasal
Expand Down Expand Up @@ -1237,21 +1393,86 @@ extension MainViewController {
}
}

func formatPillText(line1: String, time: TimeInterval) -> String {
func formatPillText(line1: String, time: TimeInterval, line2: String? = nil) -> String {
let dateFormatter = DateFormatter()
//let timezoneOffset = TimeZone.current.secondsFromGMT()
//let epochTimezoneOffset = value + Double(timezoneOffset)
if dateTimeUtils.is24Hour() {
dateFormatter.setLocalizedDateFormatFromTemplate("HH:mm")
} else {
dateFormatter.setLocalizedDateFormatFromTemplate("hh:mm")
}

//let date = Date(timeIntervalSince1970: epochTimezoneOffset)
let date = Date(timeIntervalSince1970: time)
let formattedDate = dateFormatter.string(from: date)

return line1 + "\r\n" + formattedDate

if let line2 = line2 {
return line1 + "\r\n" + line2 + "\r\n" + formattedDate
} else {
return line1 + "\r\n" + formattedDate
}
}

func updatePredictionGraphGeneric(
dataIndex: Int,
predictionData: [ShareGlucoseData],
chartLabel: String,
color: UIColor
) {
let mainChart = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
let smallChart = BGChartFull.lineData!.dataSets[dataIndex] as! LineChartDataSet
mainChart.clear()
smallChart.clear()

var colors = [NSUIColor]()
let maxBGOffset: Float = 20

for i in 0..<predictionData.count {
let predictionVal = Double(predictionData[i].sgv)
if Float(predictionVal) > topBG - maxBGOffset {
topBG = Float(predictionVal) + maxBGOffset
}

if i == 0 {
if UserDefaultsRepository.showDots.value {
colors.append((color).withAlphaComponent(0.0))
} else {
colors.append((color).withAlphaComponent(1.0))
}
} else {
colors.append(color)
}

let value = ChartDataEntry(
x: predictionData[i].date,
y: predictionVal,
data: formatPillText(
line1: chartLabel,
time: predictionData[i].date,
line2: bgUnits.toDisplayUnits(String(predictionVal))
)
)
mainChart.addEntry(value)
smallChart.addEntry(value)
}

smallChart.circleColors.removeAll()
smallChart.colors.removeAll()
mainChart.colors.removeAll()
mainChart.circleColors.removeAll()
if colors.count > 0 {
for color in colors {
mainChart.addColor(color)
mainChart.circleColors.append(color)
smallChart.addColor(color)
smallChart.circleColors.append(color)
}
}

BGChart.rightAxis.axisMaximum = Double(topBG)
BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
BGChart.data?.notifyDataChanged()
BGChart.notifyDataSetChanged()
BGChartFull.data?.dataSets[dataIndex].notifyDataSetChanged()
BGChartFull.data?.notifyDataChanged()
BGChartFull.notifyDataSetChanged()
}
}
Loading