Skip to content

Commit e1f19f3

Browse files
authored
Merge pull request #15 from loopandlearn/remove_negative_iob
version of cto with negative iob removed
2 parents 4db9ebb + bc5cf2c commit e1f19f3

File tree

1 file changed

+386
-0
lines changed

1 file changed

+386
-0
lines changed
Lines changed: 386 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,386 @@
1+
diff --git a/Loop/Loop.xcodeproj/project.pbxproj b/Loop/Loop.xcodeproj/project.pbxproj
2+
index 0cb02fb9..655c6686 100644
3+
--- a/Loop/Loop.xcodeproj/project.pbxproj
4+
+++ b/Loop/Loop.xcodeproj/project.pbxproj
5+
@@ -424,6 +424,7 @@
6+
B4E96D5D248A82A2002DABAD /* StatusBarHUDView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B4E96D5C248A82A2002DABAD /* StatusBarHUDView.xib */; };
7+
B4F3D25124AF890C0095CE44 /* BluetoothStateManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4F3D25024AF890C0095CE44 /* BluetoothStateManager.swift */; };
8+
B4FEEF7D24B8A71F00A8DF9B /* DeviceDataManager+DeviceStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4FEEF7C24B8A71F00A8DF9B /* DeviceDataManager+DeviceStatus.swift */; };
9+
+ B633A70E291011EE00A39E1D /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B633A70D291011EE00A39E1D /* Settings.bundle */; };
10+
C1004DF22981F5B700B8CF94 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF02981F5B700B8CF94 /* InfoPlist.strings */; };
11+
C1004DF52981F5B700B8CF94 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF32981F5B700B8CF94 /* Localizable.strings */; };
12+
C1004DF82981F5B700B8CF94 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF62981F5B700B8CF94 /* InfoPlist.strings */; };
13+
@@ -1402,6 +1403,7 @@
14+
B4E96D5C248A82A2002DABAD /* StatusBarHUDView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = StatusBarHUDView.xib; sourceTree = "<group>"; };
15+
B4F3D25024AF890C0095CE44 /* BluetoothStateManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothStateManager.swift; sourceTree = "<group>"; };
16+
B4FEEF7C24B8A71F00A8DF9B /* DeviceDataManager+DeviceStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DeviceDataManager+DeviceStatus.swift"; sourceTree = "<group>"; };
17+
+ B633A70D291011EE00A39E1D /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
18+
C1004DEF2981F5B700B8CF94 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = "<group>"; };
19+
C1004DF12981F5B700B8CF94 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = "<group>"; };
20+
C1004DF42981F5B700B8CF94 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
21+
@@ -2058,6 +2060,7 @@
22+
43776F831B8022E90074EA36 = {
23+
isa = PBXGroup;
24+
children = (
25+
+ B633A70D291011EE00A39E1D /* Settings.bundle */,
26+
C18A491122FCC20B00FDA733 /* Scripts */,
27+
4FF4D0FA1E1834BD00846527 /* Common */,
28+
43776F8E1B8022E90074EA36 /* Loop */,
29+
@@ -3497,6 +3500,7 @@
30+
A966152723EA5A26005D8B29 /* DerivedAssets.xcassets in Resources */,
31+
7D70764F1FE06EE1004AC8EA /* InfoPlist.strings in Resources */,
32+
7D7076631FE06EE4004AC8EA /* Localizable.strings in Resources */,
33+
+ B633A70E291011EE00A39E1D /* Settings.bundle in Resources */,
34+
43776F971B8022E90074EA36 /* Main.storyboard in Resources */,
35+
);
36+
runOnlyForDeploymentPostprocessing = 0;
37+
diff --git a/Loop/Loop/Models/ConstantApplicationFactorStrategy.swift b/Loop/Loop/Models/ConstantApplicationFactorStrategy.swift
38+
index 5084108e..0e01cea3 100644
39+
--- a/Loop/Loop/Models/ConstantApplicationFactorStrategy.swift
40+
+++ b/Loop/Loop/Models/ConstantApplicationFactorStrategy.swift
41+
@@ -17,7 +17,16 @@ struct ConstantApplicationFactorStrategy: ApplicationFactorStrategy {
42+
correctionRangeSchedule: GlucoseRangeSchedule,
43+
settings: LoopSettings
44+
) -> Double {
45+
+ // Modify Bolus Application Factor for modified CustomTypeOne LoopPatches
46+
+ // only effective for ConstantApplicationFactorStrategy
47+
+ var constantBolusApplicationFactor = LoopConstants.bolusPartialApplicationFactor
48+
+ let alternatePAFEnabled = UserDefaults.standard.bool(forKey: "alternatePAFEnabled")
49+
+ let alternatePAFSetting = UserDefaults.standard.double(forKey: "alternatePAFSetting")
50+
+ if (alternatePAFEnabled && alternatePAFSetting != 0) {
51+
+ constantBolusApplicationFactor = alternatePAFSetting
52+
+ }
53+
+
54+
// The original strategy uses a constant dosing factor.
55+
- return LoopConstants.bolusPartialApplicationFactor
56+
+ return constantBolusApplicationFactor
57+
}
58+
}
59+
diff --git a/LoopKit/LoopKit/DoseMath.swift b/LoopKit/LoopKit/DoseMath.swift
60+
index e13a3613..009c23e8 100644
61+
--- a/LoopKit/LoopKit/DoseMath.swift
62+
+++ b/LoopKit/LoopKit/DoseMath.swift
63+
@@ -398,13 +398,30 @@ extension Collection where Element: GlucoseValue {
64+
maxBasalRate = Swift.min(maxThirtyMinuteRateToKeepIOBBelowLimit, maxBasalRate)
65+
}
66+
67+
- let temp = correction?.asTempBasal(
68+
+ var temp = correction?.asTempBasal(
69+
scheduledBasalRate: scheduledBasalRate,
70+
maxBasalRate: maxBasalRate,
71+
duration: duration,
72+
rateRounder: rateRounder
73+
)
74+
75+
+ // Basal Lock threshold - Jon Fawcett
76+
+ let basalLockEnabled = UserDefaults.standard.bool(forKey: "basalLockEnabled")
77+
+ let basalLockThreshold = UserDefaults.standard.double(forKey: "basalLockThreshold")
78+
+ let glucoseUnit = UserDefaults.standard.string(forKey: "settingsGlucoseUnit")
79+
+ let hkUnit = glucoseUnit == HKUnit.millimolesPerLiter.unitString ? HKUnit.millimolesPerLiter : HKUnit.milligramsPerDeciliter
80+
+
81+
+ if (basalLockEnabled && basalLockThreshold != 0) {
82+
+ if (( temp?.unitsPerHour ?? scheduledBasalRate < scheduledBasalRate ||
83+
+ lastTempBasal?.unitsPerHour ?? scheduledBasalRate < scheduledBasalRate
84+
+ ) &&
85+
+ self[0 as! Self.Index].quantity > HKQuantity(unit : hkUnit, doubleValue: basalLockThreshold))
86+
+ {
87+
+ print("####### Temp Basal Lock On #########")
88+
+ temp = TempBasalRecommendation(unitsPerHour: scheduledBasalRate, duration: 1800)
89+
+ }
90+
+ }
91+
+
92+
return temp?.ifNecessary(
93+
at: date,
94+
scheduledBasalRate: scheduledBasalRate,
95+
@@ -488,6 +505,23 @@ extension Collection where Element: GlucoseValue {
96+
volumeRounder: volumeRounder
97+
)
98+
99+
+ // Basal Lock threshold - Jon Fawcett
100+
+ let basalLockEnabled = UserDefaults.standard.bool(forKey: "basalLockEnabled")
101+
+ let basalLockThreshold = UserDefaults.standard.double(forKey: "basalLockThreshold")
102+
+ let glucoseUnit = UserDefaults.standard.string(forKey: "settingsGlucoseUnit")
103+
+ let hkUnit = glucoseUnit == HKUnit.millimolesPerLiter.unitString ? HKUnit.millimolesPerLiter : HKUnit.milligramsPerDeciliter
104+
+
105+
+ if (basalLockEnabled && basalLockThreshold != 0) {
106+
+ if ( (temp?.unitsPerHour ?? scheduledBasalRate < scheduledBasalRate ||
107+
+ lastTempBasal?.unitsPerHour ?? scheduledBasalRate < scheduledBasalRate
108+
+ ) &&
109+
+ self[0 as! Self.Index].quantity > HKQuantity(unit : hkUnit, doubleValue: basalLockThreshold))
110+
+ {
111+
+ temp = TempBasalRecommendation(unitsPerHour: scheduledBasalRate, duration: 1800)
112+
+ print("####### Temp Basal Lock On #########")
113+
+ }
114+
+ }
115+
+
116+
if temp != nil || bolusUnits > 0 {
117+
return AutomaticDoseRecommendation(basalAdjustment: temp, bolusUnits: bolusUnits)
118+
}
119+
Submodule LoopKit 6b12dba..394262a:
120+
diff --git a/LoopKit/LoopKitUI/Charts/COBChart.swift b/LoopKit/LoopKitUI/Charts/COBChart.swift
121+
index 22cdf3b9..6fdbd950 100644
122+
--- a/LoopKit/LoopKitUI/Charts/COBChart.swift
123+
+++ b/LoopKit/LoopKitUI/Charts/COBChart.swift
124+
@@ -62,6 +62,16 @@ public extension COBChart {
125+
// Grid lines
126+
let gridLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: guideLinesLayerSettings, axisValuesX: Array(xAxisValues.dropFirst().dropLast()), axisValuesY: yAxisValues)
127+
128+
+ // read from Settings->Loop, restart required
129+
+ let addNowMarker = UserDefaults.standard.bool(forKey: "addNowMarkerToCharts")
130+
+
131+
+ var currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.carbTint, linesWidth: 0.0)
132+
+ let currentTimeValue = ChartAxisValueDate(date: Date(), formatter: { _ in "" })
133+
+ if addNowMarker {
134+
+ currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.carbTint, linesWidth: 1.0)
135+
+ }
136+
+ let currentTimeLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: currentTimeSettings, axisValuesX: [currentTimeValue], axisValuesY: [])
137+
+
138+
if gestureRecognizer != nil {
139+
cobChartCache = ChartPointsTouchHighlightLayerViewCache(
140+
xAxisLayer: xAxisLayer,
141+
@@ -75,6 +85,7 @@ public extension COBChart {
142+
143+
let layers: [ChartLayer?] = [
144+
gridLayer,
145+
+ currentTimeLayer,
146+
xAxisLayer,
147+
yAxisLayer,
148+
cobChartCache?.highlightLayer,
149+
diff --git a/LoopKit/LoopKitUI/Charts/DoseChart.swift b/LoopKit/LoopKitUI/Charts/DoseChart.swift
150+
index f0e45db8..31a8af44 100644
151+
--- a/LoopKit/LoopKitUI/Charts/DoseChart.swift
152+
+++ b/LoopKit/LoopKitUI/Charts/DoseChart.swift
153+
@@ -105,6 +105,16 @@ public extension DoseChart {
154+
// Grid lines
155+
let gridLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: guideLinesLayerSettings, axisValuesX: Array(xAxisValues.dropFirst().dropLast()), axisValuesY: yAxisValues)
156+
157+
+ // read from Settings->Loop, restart required
158+
+ let addNowMarker = UserDefaults.standard.bool(forKey: "addNowMarkerToCharts")
159+
+
160+
+ let currentTimeValue = ChartAxisValueDate(date: Date(), formatter: { _ in "" })
161+
+ var currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.insulinTint, linesWidth: 0.0)
162+
+ if addNowMarker {
163+
+ currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.insulinTint, linesWidth: 1.0)
164+
+ }
165+
+ let currentTimeLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: currentTimeSettings, axisValuesX: [currentTimeValue], axisValuesY: [])
166+
+
167+
// 0-line
168+
let dummyZeroChartPoint = ChartPoint(x: ChartAxisValueDouble(0), y: ChartAxisValueDouble(0))
169+
let zeroGuidelineLayer = ChartPointsViewsLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, chartPoints: [dummyZeroChartPoint], viewGenerator: {(chartPointModel, layer, chart) -> UIView? in
170+
@@ -129,6 +139,7 @@ public extension DoseChart {
171+
172+
let layers: [ChartLayer?] = [
173+
gridLayer,
174+
+ currentTimeLayer,
175+
xAxisLayer,
176+
yAxisLayer,
177+
zeroGuidelineLayer,
178+
diff --git a/LoopKit/LoopKitUI/Charts/IOBChart.swift b/LoopKit/LoopKitUI/Charts/IOBChart.swift
179+
index 47fe8f2a..cdf75864 100644
180+
--- a/LoopKit/LoopKitUI/Charts/IOBChart.swift
181+
+++ b/LoopKit/LoopKitUI/Charts/IOBChart.swift
182+
@@ -65,6 +65,16 @@ public extension IOBChart {
183+
// Grid lines
184+
let gridLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: guideLinesLayerSettings, axisValuesX: Array(xAxisValues.dropFirst().dropLast()), axisValuesY: yAxisValues)
185+
186+
+ // read from Settings->Loop, restart required
187+
+ let addNowMarker = UserDefaults.standard.bool(forKey: "addNowMarkerToCharts")
188+
+
189+
+ let currentTimeValue = ChartAxisValueDate(date: Date(), formatter: { _ in "" })
190+
+ var currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.insulinTint, linesWidth: 0.0)
191+
+ if addNowMarker {
192+
+ currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.insulinTint, linesWidth: 1.0)
193+
+ }
194+
+ let currentTimeLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: currentTimeSettings, axisValuesX: [currentTimeValue], axisValuesY: [])
195+
+
196+
// 0-line
197+
let dummyZeroChartPoint = ChartPoint(x: ChartAxisValueDouble(0), y: ChartAxisValueDouble(0))
198+
let zeroGuidelineLayer = ChartPointsViewsLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, chartPoints: [dummyZeroChartPoint], viewGenerator: {(chartPointModel, layer, chart) -> UIView? in
199+
@@ -89,6 +99,7 @@ public extension IOBChart {
200+
201+
let layers: [ChartLayer?] = [
202+
gridLayer,
203+
+ currentTimeLayer,
204+
xAxisLayer,
205+
yAxisLayer,
206+
zeroGuidelineLayer,
207+
diff --git a/LoopKit/LoopKitUI/Charts/PredictedGlucoseChart.swift b/LoopKit/LoopKitUI/Charts/PredictedGlucoseChart.swift
208+
index 9b00048b..e69f5af6 100644
209+
--- a/LoopKit/LoopKitUI/Charts/PredictedGlucoseChart.swift
210+
+++ b/LoopKit/LoopKitUI/Charts/PredictedGlucoseChart.swift
211+
@@ -169,6 +169,16 @@ extension PredictedGlucoseChart {
212+
// Grid lines
213+
let gridLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: guideLinesLayerSettings, axisValuesX: Array(xAxisValues.dropFirst().dropLast()), axisValuesY: yAxisValues)
214+
215+
+ // read from Settings->Loop, restart required
216+
+ let addNowMarker = UserDefaults.standard.bool(forKey: "addNowMarkerToCharts")
217+
+
218+
+ let currentTimeValue = ChartAxisValueDate(date: Date(), formatter: { _ in "" })
219+
+ var currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.glucoseTint, linesWidth: 0.0)
220+
+ if addNowMarker {
221+
+ currentTimeSettings = ChartGuideLinesLayerSettings(linesColor: colors.glucoseTint, linesWidth: 1.0)
222+
+ }
223+
+ let currentTimeLayer = ChartGuideLinesForValuesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, settings: currentTimeSettings, axisValuesX: [currentTimeValue], axisValuesY: [])
224+
+
225+
let circles = ChartPointsScatterCirclesLayer(xAxis: xAxisLayer.axis, yAxis: yAxisLayer.axis, chartPoints: glucosePoints, displayDelay: 0, itemSize: CGSize(width: 4, height: 4), itemFillColor: colors.glucoseTint, optimized: true)
226+
227+
var alternatePrediction: ChartLayer?
228+
@@ -207,6 +217,7 @@ extension PredictedGlucoseChart {
229+
230+
let layers: [ChartLayer?] = [
231+
gridLayer,
232+
+ currentTimeLayer,
233+
targetsLayer,
234+
xAxisLayer,
235+
yAxisLayer,
236+
diff --git a/Loop/Settings.bundle/Root.plist b/Loop/Settings.bundle/Root.plist
237+
new file mode 100644
238+
index 00000000..b61e8ddb
239+
--- /dev/null
240+
+++ b/Loop/Settings.bundle/Root.plist
241+
@@ -0,0 +1,145 @@
242+
+<?xml version="1.0" encoding="UTF-8"?>
243+
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
244+
+<plist version="1.0">
245+
+<dict>
246+
+ <key>StringsTable</key>
247+
+ <string>Root</string>
248+
+ <key>PreferenceSpecifiers</key>
249+
+ <array>
250+
+ <dict>
251+
+ <key>Type</key>
252+
+ <string>PSGroupSpecifier</string>
253+
+ <key>Title</key>
254+
+ <string>SWITCHER PATCH REPLACED - USE GLUCOSE BASED PARTIAL APPLICATION IN LOOP, SETTINGS</string>
255+
+ </dict>
256+
+ <dict>
257+
+ <key>Type</key>
258+
+ <string>PSGroupSpecifier</string>
259+
+ <key>Title</key>
260+
+ <string>NEGATIVE IOB PATCH REMOVED</string>
261+
+ </dict>
262+
+ <dict>
263+
+ <key>Type</key>
264+
+ <string>PSGroupSpecifier</string>
265+
+ <key>Title</key>
266+
+ <string>Add Now Marker, Main Charts</string>
267+
+ </dict>
268+
+ <dict>
269+
+ <key>Type</key>
270+
+ <string>PSToggleSwitchSpecifier</string>
271+
+ <key>Title</key>
272+
+ <string>Enabled</string>
273+
+ <key>Key</key>
274+
+ <string>addNowMarkerToCharts</string>
275+
+ <key>DefaultValue</key>
276+
+ <false/>
277+
+ <key>TrueValue</key>
278+
+ <true/>
279+
+ <key>FalseValue</key>
280+
+ <false/>
281+
+ </dict>
282+
+ <dict>
283+
+ <key>Type</key>
284+
+ <string>PSGroupSpecifier</string>
285+
+ <key>Title</key>
286+
+ <string>VALID ONLY WHEN GLUCOSE BASED PARTIAL APPLICATION NOT ENABLED - CONSTANT PARTIAL APPLICATION</string>
287+
+ </dict>
288+
+ <dict>
289+
+ <key>Type</key>
290+
+ <string>PSToggleSwitchSpecifier</string>
291+
+ <key>Title</key>
292+
+ <string>Enabled</string>
293+
+ <key>Key</key>
294+
+ <string>alternatePAFEnabled</string>
295+
+ <key>DefaultValue</key>
296+
+ <false/>
297+
+ <key>TrueValue</key>
298+
+ <true/>
299+
+ <key>FalseValue</key>
300+
+ <false/>
301+
+ </dict>
302+
+ <dict>
303+
+ <key>Type</key>
304+
+ <string>PSMultiValueSpecifier</string>
305+
+ <key>Title</key>
306+
+ <string>Alternate Application Factor</string>
307+
+ <key>Key</key>
308+
+ <string>alternatePAFSetting</string>
309+
+ <key>DefaultValue</key>
310+
+ <string>0.4</string>
311+
+ <key>Values</key>
312+
+ <array>
313+
+ <real>0.15</real>
314+
+ <real>0.2</real>
315+
+ <real>0.25</real>
316+
+ <real>0.3</real>
317+
+ <real>0.35</real>
318+
+ <real>0.4</real>
319+
+ <real>0.45</real>
320+
+ <real>0.5</real>
321+
+ <real>0.55</real>
322+
+ <real>0.6</real>
323+
+ <real>0.65</real>
324+
+ <real>0.7</real>
325+
+ <real>0.75</real>
326+
+ <real>0.8</real>
327+
+ <real>0.85</real>
328+
+ <real>0.9</real>
329+
+ <real>0.95</real>
330+
+ <real>1</real>
331+
+ </array>
332+
+ <key>Titles</key>
333+
+ <array>
334+
+ <string>15%</string>
335+
+ <string>20%</string>
336+
+ <string>25%</string>
337+
+ <string>30%</string>
338+
+ <string>35%</string>
339+
+ <string>40%</string>
340+
+ <string>45%</string>
341+
+ <string>50%</string>
342+
+ <string>55%</string>
343+
+ <string>60%</string>
344+
+ <string>65%</string>
345+
+ <string>70%</string>
346+
+ <string>75%</string>
347+
+ <string>80%</string>
348+
+ <string>85%</string>
349+
+ <string>90%</string>
350+
+ <string>95%</string>
351+
+ <string>100%</string>
352+
+ </array>
353+
+ </dict>
354+
+ <dict>
355+
+ <key>Type</key>
356+
+ <string>PSGroupSpecifier</string>
357+
+ <key>Title</key>
358+
+ <string>Basal Lock</string>
359+
+ </dict>
360+
+ <dict>
361+
+ <key>Type</key>
362+
+ <string>PSToggleSwitchSpecifier</string>
363+
+ <key>Title</key>
364+
+ <string>Enabled</string>
365+
+ <key>Key</key>
366+
+ <string>basalLockEnabled</string>
367+
+ <key>DefaultValue</key>
368+
+ <false/>
369+
+ <key>TrueValue</key>
370+
+ <true/>
371+
+ <key>FalseValue</key>
372+
+ <false/>
373+
+ </dict>
374+
+ <dict>
375+
+ <key>Type</key>
376+
+ <string>PSTextFieldSpecifier</string>
377+
+ <key>Title</key>
378+
+ <string>Basal Lock Threshold</string>
379+
+ <key>Key</key>
380+
+ <string>basalLockThreshold</string>
381+
+ <key>KeyboardType</key>
382+
+ <string>NumbersAndPunctuation</string>
383+
+ </dict>
384+
+ </array>
385+
+</dict>
386+
+</plist>

0 commit comments

Comments
 (0)