Skip to content

Commit

Permalink
Release 1.5.0 (#27)
Browse files Browse the repository at this point in the history
* Hide target slider when ratio 1

* Filter out missing CGM readings from TIR (when older than 30 minutes)

* Watch App Colour matching. Now same colours as in iPhone app. 

* Waiter's Notepad clean up and enumerate for Meal presets

* Meal presets. Several bug fixes.

* Profile override adaptive UI. Visualise when using extreme overrides. Improve override summation in confirmation  alert.

* Overrides. Bug fixes.

* Info Panel updates.
Improve original TT format in info panel. Less dead space and less code.
Add % for TTs in info panel (currently only for presets or enacted with sliders).
Remove "Perpetual" to avoid clutter in info panel.

* Bug fixes for TTs.

* Remove delay for added variables,  for instance for weighted average.

* Reduce time for compiling with code changes in HomeRootView. Will fix error when building in GitHub. Thank you, @antoinekh

* Use BackgroundContext again for APSManager...

* Bump version
  • Loading branch information
Jon-b-m authored Apr 21, 2023
1 parent 257202c commit 91fc844
Show file tree
Hide file tree
Showing 14 changed files with 408 additions and 353 deletions.
2 changes: 1 addition & 1 deletion Config.xcconfig
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
APP_DISPLAY_NAME = iAPS
APP_VERSION = 1.3.0
APP_VERSION = 1.5.0
APP_BUILD_NUMBER = 1
COPYRIGHT_NOTICE =
DEVELOPER_TEAM = ##TEAM_ID##
Expand Down
2 changes: 1 addition & 1 deletion FreeAPS/Resources/javascript/bundle/determine-basal.js

Large diffs are not rendered by default.

231 changes: 5 additions & 226 deletions FreeAPS/Sources/APS/APSManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ final class BaseAPSManager: APSManager, Injectable {
}
}

// let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext()
let coredataContext = CoreDataStack.shared.persistentContainer.viewContext
let coredataContext = CoreDataStack.shared.persistentContainer.newBackgroundContext()
// let coredataContext = CoreDataStack.shared.persistentContainer.viewContext

private var openAPS: OpenAPS!

Expand Down Expand Up @@ -702,232 +702,10 @@ final class BaseAPSManager: APSManager, Injectable {
}
}
nightscout.uploadStatus()
// Update the TDD value
tdd(enacted_: enacted)
// Update statistics
statistics()
}
}

private func tdd(enacted_: Suggestion) {
let tddStartedAt = Date()
let preferences = settingsManager.preferences
let currentTDD = enacted_.tdd ?? 0

var booleanArray = [TempTargetsSlider]()
var overrideArray = [Override]()
var tempTargetsArray = [TempTargets]()
var isPercentageEnabled = false
var useOverride = false
var overridePercentage: Decimal = 100
var duration: Decimal = 0
var unlimited: Bool = false
var newDuration: Decimal = 0
var hbtSetting: Decimal = 160

if currentTDD > 0 {
let tenDaysAgo = Date().addingTimeInterval(-10.days.timeInterval)
let twoHoursAgo = Date().addingTimeInterval(-2.hours.timeInterval)

var uniqEvents = [TDD]()
var total: Decimal = 0
var totalAmount: Decimal = 0
var indeces: Int = 0
var nrOfIndeces: Int = 0

coredataContext.performAndWait {
let requestTDD = TDD.fetchRequest() as NSFetchRequest<TDD>
requestTDD.predicate = NSPredicate(format: "timestamp > %@ AND tdd > 0", tenDaysAgo as NSDate)
let sortTDD = NSSortDescriptor(key: "timestamp", ascending: true)
requestTDD.sortDescriptors = [sortTDD]
try? uniqEvents = coredataContext.fetch(requestTDD)

let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
requestIsEnbled.sortDescriptors = [sortIsEnabled]
// requestIsEnbled.fetchLimit = 1
try? booleanArray = coredataContext.fetch(requestIsEnbled)

let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
let sortOverride = NSSortDescriptor(key: "date", ascending: false)
requestOverrides.sortDescriptors = [sortOverride]
requestOverrides.fetchLimit = 1
try? overrideArray = coredataContext.fetch(requestOverrides)

let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
let sortTT = NSSortDescriptor(key: "date", ascending: false)
requestTempTargets.sortDescriptors = [sortTT]
requestTempTargets.fetchLimit = 1
try? tempTargetsArray = coredataContext.fetch(requestTempTargets)

total = uniqEvents.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
indeces = uniqEvents.count
// Only fetch once. Use same (previous) fetch
let twoHoursArray = uniqEvents.filter({ ($0.timestamp ?? Date()) >= twoHoursAgo })
nrOfIndeces = twoHoursArray.count
totalAmount = twoHoursArray.compactMap({ each in each.tdd as? Decimal ?? 0 }).reduce(0, +)
}

if indeces == 0 {
indeces = 1
}
if nrOfIndeces == 0 {
nrOfIndeces = 1
}

let average2hours = totalAmount / Decimal(nrOfIndeces)
let average14 = total / Decimal(indeces)
let weight = preferences.weightPercentage
let weighted_average = weight * average2hours + (1 - weight) * average14

isPercentageEnabled = booleanArray.first?.enabled ?? false
useOverride = overrideArray.first?.enabled ?? false
overridePercentage = Decimal(overrideArray.first?.percentage ?? 100)
unlimited = overrideArray.first?.indefinite ?? true
hbtSetting = Decimal(booleanArray.first?.hbt ?? 160)

if useOverride {
duration = (overrideArray.first?.duration ?? 0) as Decimal
let addedMinutes = Int(duration)
let date = overrideArray.first?.date ?? Date()
if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
!unlimited
{ useOverride = false }

newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
}

if newDuration < 0 {
newDuration = 0
} else { duration = newDuration }

if !useOverride {
unlimited = true
overridePercentage = 100
duration = 0
}

if tempTargetsArray.first?.active ?? false || booleanArray.first?.enabled ?? false {
var duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
var hbt = tempTargetsArray.first?.hbt ?? 160
if booleanArray.first?.enabled ?? false, !(booleanArray.first?.isPreset ?? false) {
duration_ = Int(truncating: booleanArray.first?.duration ?? 0)
hbt = booleanArray.first?.hbt ?? 160
}
let startDate = tempTargetsArray.first?.startDate ?? Date()
let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
let dd = durationPlusStart.timeIntervalSinceNow.minutes
if dd > 0 {
hbtSetting = Decimal(hbt)
isPercentageEnabled = true
} else { isPercentageEnabled = false }
}

let averages = Oref2_variables(
average_total_data: roundDecimal(average14, 1),
weightedAverage: roundDecimal(weighted_average, 1),
past2hoursAverage: roundDecimal(average2hours, 1),
date: Date(),
isEnabled: isPercentageEnabled,
overridePercentage: overridePercentage,
useOverride: useOverride,
duration: duration,
unlimited: unlimited,
hbt: hbtSetting
)
storage.save(averages, as: OpenAPS.Monitor.oref2_variables)

print("Test time of TDD: \(-1 * tddStartedAt.timeIntervalSinceNow) s")
} else {
coredataContext.performAndWait {
let requestIsEnbled = TempTargetsSlider.fetchRequest() as NSFetchRequest<TempTargetsSlider>
let sortIsEnabled = NSSortDescriptor(key: "date", ascending: false)
requestIsEnbled.sortDescriptors = [sortIsEnabled]
try? booleanArray = coredataContext.fetch(requestIsEnbled)

let requestOverrides = Override.fetchRequest() as NSFetchRequest<Override>
let sortOverride = NSSortDescriptor(key: "date", ascending: false)
requestOverrides.sortDescriptors = [sortOverride]
requestOverrides.fetchLimit = 1
try? overrideArray = coredataContext.fetch(requestOverrides)

let requestTempTargets = TempTargets.fetchRequest() as NSFetchRequest<TempTargets>
let sortTT = NSSortDescriptor(key: "date", ascending: false)
requestTempTargets.sortDescriptors = [sortTT]
requestTempTargets.fetchLimit = 1
try? tempTargetsArray = coredataContext.fetch(requestTempTargets)
}

isPercentageEnabled = booleanArray.first?.enabled ?? false
useOverride = overrideArray.first?.enabled ?? false
overridePercentage = Decimal(overrideArray.first?.percentage ?? 100)
unlimited = overrideArray.first?.indefinite ?? true
hbtSetting = Decimal(booleanArray.first?.hbt ?? 160)

if useOverride {
duration = (overrideArray.first?.duration ?? 0) as Decimal
let addedMinutes = Int(duration)
let date = overrideArray.first?.date ?? Date()
if date.addingTimeInterval(addedMinutes.minutes.timeInterval) < Date(),
!unlimited
{ useOverride = false }

newDuration = Decimal(Date().distance(to: date.addingTimeInterval(addedMinutes.minutes.timeInterval)).minutes)
}

if newDuration < 0 {
newDuration = 0
} else { duration = newDuration }

if !useOverride {
unlimited = true
overridePercentage = 100
duration = 0
}

if tempTargetsArray.first?.active ?? false || booleanArray.first?.enabled ?? false {
var duration_ = Int(truncating: tempTargetsArray.first?.duration ?? 0)
var hbt = tempTargetsArray.first?.hbt ?? 160
if booleanArray.first?.enabled ?? false, !(booleanArray.first?.isPreset ?? false) {
duration_ = Int(truncating: booleanArray.first?.duration ?? 0)
hbt = booleanArray.first?.hbt ?? 160
}
let startDate = tempTargetsArray.first?.startDate ?? Date()
let durationPlusStart = startDate.addingTimeInterval(duration_.minutes.timeInterval)
let dd = durationPlusStart.timeIntervalSinceNow.minutes

if dd > 0 {
hbtSetting = Decimal(hbt)
isPercentageEnabled = true
} else { isPercentageEnabled = false }
}

let averages = Oref2_variables(
average_total_data: 0,
weightedAverage: 1,
past2hoursAverage: 0,
date: Date(),
isEnabled: isPercentageEnabled,
overridePercentage: overridePercentage,
useOverride: useOverride,
duration: duration,
unlimited: unlimited,
hbt: hbtSetting
)
storage.save(averages, as: OpenAPS.Monitor.oref2_variables)
}

coredataContext.performAndWait {
let saveNewUseOverride = Override(context: self.coredataContext)
saveNewUseOverride.date = Date()
saveNewUseOverride.enabled = useOverride
saveNewUseOverride.percentage = Double(overridePercentage)
saveNewUseOverride.duration = newDuration as NSDecimalNumber
saveNewUseOverride.indefinite = unlimited
try? self.coredataContext.save()
}
}

private func roundDecimal(_ decimal: Decimal, _ digits: Double) -> Decimal {
let rounded = round(Double(decimal) * pow(10, digits)) / pow(10, digits)
return Decimal(rounded)
Expand Down Expand Up @@ -1258,9 +1036,10 @@ final class BaseAPSManager: APSManager, Injectable {
lastIndex = true
}
if array[i].bg_ < Double(hypoLimit), !lastIndex {
timeInHypo += (currentTime - previousTime).timeInterval
// Exclude duration between CGM readings which are more than 30 minutes
timeInHypo += min((currentTime - previousTime).timeInterval, 30.minutes.timeInterval)
} else if array[i].bg_ >= Double(hyperLimit), !lastIndex {
timeInHyper += (currentTime - previousTime).timeInterval
timeInHyper += min((currentTime - previousTime).timeInterval, 30.minutes.timeInterval)
}
}
if timeInHypo == 0.0 {
Expand Down
Loading

0 comments on commit 91fc844

Please sign in to comment.