MainChartHelper.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import Foundation
  2. enum MainChartHelper {
  3. /// calculates the glucose value thats the nearest to parameter 'time'
  4. static func timeToNearestGlucose(glucoseValues: [GlucoseStored], time: TimeInterval) -> GlucoseStored? {
  5. guard !glucoseValues.isEmpty else {
  6. return nil
  7. }
  8. var low = 0
  9. var high = glucoseValues.count - 1
  10. var closestGlucose: GlucoseStored?
  11. // binary search to find next glucose
  12. while low <= high {
  13. let mid = low + (high - low) / 2
  14. let midTime = glucoseValues[mid].date?.timeIntervalSince1970 ?? 0
  15. if midTime == time {
  16. return glucoseValues[mid]
  17. } else if midTime < time {
  18. low = mid + 1
  19. } else {
  20. high = mid - 1
  21. }
  22. // update if necessary
  23. if closestGlucose == nil || abs(midTime - time) < abs(closestGlucose!.date?.timeIntervalSince1970 ?? 0 - time) {
  24. closestGlucose = glucoseValues[mid]
  25. }
  26. }
  27. return closestGlucose
  28. }
  29. enum Config {
  30. static let bolusSize: CGFloat = 5
  31. static let bolusScale: CGFloat = 1
  32. static let carbsSize: CGFloat = 5
  33. static let carbsScale: CGFloat = 0.3
  34. static let fpuSize: CGFloat = 10
  35. static let maxGlucose = 270
  36. static let minGlucose = 45
  37. }
  38. static var bolusFormatter: NumberFormatter {
  39. let formatter = NumberFormatter()
  40. formatter.numberStyle = .decimal
  41. formatter.minimumIntegerDigits = 0
  42. formatter.maximumFractionDigits = 2
  43. formatter.decimalSeparator = "."
  44. return formatter
  45. }
  46. static var carbsFormatter: NumberFormatter {
  47. let formatter = NumberFormatter()
  48. formatter.numberStyle = .decimal
  49. formatter.maximumFractionDigits = 0
  50. return formatter
  51. }
  52. static func bolusOffset(units: GlucoseUnits) -> Decimal {
  53. units == .mgdL ? 30 : 1.66
  54. }
  55. }