diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000..5e724b4e0
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,36 @@
+[submodule "LoopKit"]
+ path = LoopKit
+ url = https://github.com/LoopKit/LoopKit.git
+ branch = dev
+[submodule "CGMBLEKit"]
+ path = CGMBLEKit
+ url = https://github.com/LoopKit/CGMBLEKit.git
+ branch = dev
+[submodule "dexcom-share-client-swift"]
+ path = dexcom-share-client-swift
+ url = https://github.com/LoopKit/dexcom-share-client-swift.git
+ branch = dev
+[submodule "RileyLinkKit"]
+ path = RileyLinkKit
+ url = https://github.com/LoopKit/RileyLinkKit
+ branch = dev
+[submodule "OmniBLE"]
+ path = OmniBLE
+ url = https://github.com/LoopKit/OmniBLE.git
+ branch = dev
+[submodule "G7SensorKit"]
+ path = G7SensorKit
+ url = https://github.com/LoopKit/G7SensorKit.git
+ branch = main
+[submodule "OmniKit"]
+ path = OmniKit
+ url = https://github.com/LoopKit/OmniKit.git
+ branch = main
+[submodule "MinimedKit"]
+ path = MinimedKit
+ url = https://github.com/LoopKit/MinimedKit.git
+ branch = main
+[submodule "LibreTransmitter"]
+ path = LibreTransmitter
+ url = https://github.com/LoopKit/LibreTransmitter.git
+ branch = main
diff --git a/CGMBLEKit b/CGMBLEKit
new file mode 160000
index 000000000..4eb3c940b
--- /dev/null
+++ b/CGMBLEKit
@@ -0,0 +1 @@
+Subproject commit 4eb3c940b0e99ae2715fc6462babd2597d46a845
diff --git a/Dependencies/CGMBLEKit/.gitignore b/Dependencies/CGMBLEKit/.gitignore
deleted file mode 100644
index 5c13bfd07..000000000
--- a/Dependencies/CGMBLEKit/.gitignore
+++ /dev/null
@@ -1,36 +0,0 @@
-# OS X
-.DS_Store
-
-# Xcode
-build/
-*.pbxuser
-!default.pbxuser
-*.mode1v3
-!default.mode1v3
-*.mode2v3
-!default.mode2v3
-*.perspectivev3
-!default.perspectivev3
-xcuserdata
-*.xccheckout
-profile
-*.moved-aside
-DerivedData
-*.hmap
-*.ipa
-
-# Bundler
-.bundle
-
-Carthage
-# We recommend against adding the Pods directory to your .gitignore. However
-# you should judge for yourself, the pros and cons are mentioned at:
-# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
-#
-# Note: if you ignore the Pods directory, make sure to uncomment
-# `pod install` in .travis.yml
-#
-
-Pods/
-Carthage/
-.gitmodules
diff --git a/Dependencies/CGMBLEKit/.travis.yml b/Dependencies/CGMBLEKit/.travis.yml
deleted file mode 100644
index a3bec9909..000000000
--- a/Dependencies/CGMBLEKit/.travis.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-language: objective-c
-osx_image: xcode12.2
-
-before_script:
- - ./Scripts/carthage.sh bootstrap
-
-script:
- # Build frameworks and run tests
- - travis_wait 25 xcodebuild -project CGMBLEKit.xcodeproj -scheme Shared build -destination name="iPhone 8" test | xcpretty
- # Build apps
- - xcodebuild -project CGMBLEKit.xcodeproj -scheme "CGMBLEKit Example" build -destination name="iPhone 8" | xcpretty
- - xcodebuild -project CGMBLEKit.xcodeproj -scheme ResetTransmitter build -destination name="iPhone 8"
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/AppDelegate.swift b/Dependencies/CGMBLEKit/CGMBLEKit Example/AppDelegate.swift
deleted file mode 100644
index aec716519..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/AppDelegate.swift
+++ /dev/null
@@ -1,140 +0,0 @@
-//
-// AppDelegate.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 10/1/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import UIKit
-import CGMBLEKit
-import CoreBluetooth
-
-@UIApplicationMain
-class AppDelegate: UIResponder, UIApplicationDelegate, TransmitterDelegate, TransmitterCommandSource {
-
- var window: UIWindow?
-
- static var sharedDelegate: AppDelegate {
- return UIApplication.shared.delegate as! AppDelegate
- }
-
- var transmitterID: String? {
- didSet {
- if let id = transmitterID {
- transmitter = Transmitter(
- id: id,
- passiveModeEnabled: UserDefaults.standard.passiveModeEnabled
- )
- transmitter?.stayConnected = UserDefaults.standard.stayConnected
- transmitter?.delegate = self
- transmitter?.commandSource = self
-
- UserDefaults.standard.transmitterID = id
- }
- glucose = nil
- }
- }
-
- var transmitter: Transmitter?
-
- let commandQueue = CommandQueue()
-
- var glucose: Glucose?
-
- func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
-
- transmitterID = UserDefaults.standard.transmitterID
-
- return true
- }
-
- func applicationWillResignActive(_ application: UIApplication) {
- // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
- // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
- }
-
- func applicationDidEnterBackground(_ application: UIApplication) {
- // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
- // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
-
- if let transmitter = transmitter, !transmitter.stayConnected {
- transmitter.stopScanning()
- }
- }
-
- func applicationWillEnterForeground(_ application: UIApplication) {
- // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
- }
-
- func applicationDidBecomeActive(_ application: UIApplication) {
- // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
-
- transmitter?.resumeScanning()
- }
-
- func applicationWillTerminate(_ application: UIApplication) {
- // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
- }
-
- // MARK: - TransmitterDelegate
-
- private let dateFormatter: DateFormatter = {
- let dateFormatter = DateFormatter()
-
- dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
- dateFormatter.locale = Locale(identifier: "en_US_POSIX")
-
- return dateFormatter
- }()
-
- func dequeuePendingCommand(for transmitter: Transmitter) -> Command? {
- return commandQueue.dequeue()
- }
-
- func transmitter(_ transmitter: Transmitter, didFail command: Command, with error: Error) {
- // TODO: implement
- }
-
- func transmitter(_ transmitter: Transmitter, didComplete command: Command) {
- // TODO: implement
- }
-
- func transmitter(_ transmitter: Transmitter, didError error: Error) {
- DispatchQueue.main.async {
- if let vc = self.window?.rootViewController as? TransmitterDelegate {
- vc.transmitter(transmitter, didError: error)
- }
- }
- }
-
- func transmitter(_ transmitter: Transmitter, didRead glucose: Glucose) {
- self.glucose = glucose
- DispatchQueue.main.async {
- if let vc = self.window?.rootViewController as? TransmitterDelegate {
- vc.transmitter(transmitter, didRead: glucose)
- }
- }
- }
-
- func transmitter(_ transmitter: Transmitter, didReadUnknownData data: Data) {
- DispatchQueue.main.async {
- if let vc = self.window?.rootViewController as? TransmitterDelegate {
- vc.transmitter(transmitter, didReadUnknownData: data)
- }
- }
- }
-
- func transmitter(_ transmitter: Transmitter, didReadBackfill glucose: [Glucose]) {
- DispatchQueue.main.async {
- if let vc = self.window?.rootViewController as? TransmitterDelegate {
- vc.transmitter(transmitter, didReadBackfill: glucose)
- }
- }
- }
-
- func transmitterDidConnect(_ transmitter: Transmitter) {
- // Ignore
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/Dependencies/CGMBLEKit/CGMBLEKit Example/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index d8db8d65f..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "iphone",
- "size" : "20x20",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "20x20",
- "scale" : "3x"
- },
- {
- "idiom" : "iphone",
- "size" : "29x29",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "29x29",
- "scale" : "3x"
- },
- {
- "idiom" : "iphone",
- "size" : "40x40",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "40x40",
- "scale" : "3x"
- },
- {
- "idiom" : "iphone",
- "size" : "60x60",
- "scale" : "2x"
- },
- {
- "idiom" : "iphone",
- "size" : "60x60",
- "scale" : "3x"
- },
- {
- "idiom" : "ipad",
- "size" : "20x20",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "20x20",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "29x29",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "29x29",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "40x40",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "40x40",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "76x76",
- "scale" : "1x"
- },
- {
- "idiom" : "ipad",
- "size" : "76x76",
- "scale" : "2x"
- },
- {
- "idiom" : "ipad",
- "size" : "83.5x83.5",
- "scale" : "2x"
- },
- {
- "idiom" : "ios-marketing",
- "size" : "1024x1024",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/Base.lproj/LaunchScreen.storyboard b/Dependencies/CGMBLEKit/CGMBLEKit Example/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index f83f6fd58..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/Base.lproj/Main.storyboard b/Dependencies/CGMBLEKit/CGMBLEKit Example/Base.lproj/Main.storyboard
deleted file mode 100644
index be42d9a18..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,172 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/CommandQueue.swift b/Dependencies/CGMBLEKit/CGMBLEKit Example/CommandQueue.swift
deleted file mode 100644
index b1aab75f3..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/CommandQueue.swift
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// CommandQueue.swift
-// CGMBLEKit Example
-//
-// Created by Paul Dickens on 25/03/2018.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import CGMBLEKit
-
-
-class CommandQueue {
- private var list = Array()
- private var lock = os_unfair_lock()
-
- func enqueue(_ element: Command) {
- os_unfair_lock_lock(&lock)
- list.append(element)
- os_unfair_lock_unlock(&lock)
- }
-
- func dequeue() -> Command? {
- os_unfair_lock_lock(&lock)
- defer {
- os_unfair_lock_unlock(&lock)
- }
- if !list.isEmpty {
- return list.removeFirst()
- } else {
- return nil
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/Info.plist b/Dependencies/CGMBLEKit/CGMBLEKit Example/Info.plist
deleted file mode 100644
index ac35d2b38..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/Info.plist
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- 3.2
- CFBundleVersion
- 1
- LSRequiresIPhoneOS
-
- UIBackgroundModes
-
- bluetooth-central
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UIRequiredDeviceCapabilities
-
- armv7
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/NSUserDefaults.swift b/Dependencies/CGMBLEKit/CGMBLEKit Example/NSUserDefaults.swift
deleted file mode 100644
index f9bd3a623..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/NSUserDefaults.swift
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// NSUserDefaults.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 11/24/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-extension UserDefaults {
- var passiveModeEnabled: Bool {
- get {
- return bool(forKey: "passiveModeEnabled")
- }
- set {
- set(newValue, forKey: "passiveModeEnabled")
- }
- }
-
- var stayConnected: Bool {
- get {
- return object(forKey: "stayConnected") != nil ? bool(forKey: "stayConnected") : true
- }
- set {
- set(newValue, forKey: "stayConnected")
- }
- }
-
- var transmitterID: String {
- get {
- return string(forKey: "transmitterID") ?? "500000"
- }
- set {
- set(newValue, forKey: "transmitterID")
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit Example/ViewController.swift b/Dependencies/CGMBLEKit/CGMBLEKit Example/ViewController.swift
deleted file mode 100644
index f1d276699..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit Example/ViewController.swift
+++ /dev/null
@@ -1,200 +0,0 @@
-//
-// ViewController.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 10/1/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import UIKit
-import HealthKit
-import CGMBLEKit
-
-class ViewController: UIViewController, TransmitterDelegate, UITextFieldDelegate {
-
- @IBOutlet weak var titleLabel: UILabel!
-
- @IBOutlet weak var subtitleLabel: UILabel!
-
- @IBOutlet weak var passiveModeEnabledSwitch: UISwitch!
-
- @IBOutlet weak var stayConnectedSwitch: UISwitch!
-
- @IBOutlet weak var transmitterIDField: UITextField!
-
- @IBOutlet weak var scanningIndicatorView: UIActivityIndicatorView!
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- passiveModeEnabledSwitch.isOn = AppDelegate.sharedDelegate.transmitter?.passiveModeEnabled ?? false
-
- stayConnectedSwitch.isOn = AppDelegate.sharedDelegate.transmitter?.stayConnected ?? false
-
- transmitterIDField.text = AppDelegate.sharedDelegate.transmitter?.ID
- }
-
- override func viewDidAppear(_ animated: Bool) {
- super.viewDidAppear(animated)
-
- updateIndicatorViewDisplay()
- }
-
- // MARK: - Actions
-
- func updateIndicatorViewDisplay() {
- if let transmitter = AppDelegate.sharedDelegate.transmitter, transmitter.isScanning {
- scanningIndicatorView.startAnimating()
- } else {
- scanningIndicatorView.stopAnimating()
- }
- }
-
- @IBAction func toggleStayConnected(_ sender: UISwitch) {
- AppDelegate.sharedDelegate.transmitter?.stayConnected = sender.isOn
- UserDefaults.standard.stayConnected = sender.isOn
-
- updateIndicatorViewDisplay()
- }
-
- @IBAction func togglePassiveMode(_ sender: UISwitch) {
- AppDelegate.sharedDelegate.transmitter?.passiveModeEnabled = sender.isOn
- UserDefaults.standard.passiveModeEnabled = sender.isOn
- }
-
- @IBAction func start(_ sender: UIButton) {
- let dialog = UIAlertController(title: "Confirm", message: "Start sensor session.", preferredStyle: .alert)
-
- dialog.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action: UIAlertAction!) in
- AppDelegate.sharedDelegate.commandQueue.enqueue(.startSensor(at: Date()))
- }))
-
- dialog.addAction(UIAlertAction(title: "Cancel", style: .cancel))
-
- present(dialog, animated: true, completion: nil)
- }
-
- @IBAction func calibrate(_ sender: UIButton) {
- let dialog = UIAlertController(title: "Enter BG", message: "Calibrate sensor.", preferredStyle: .alert)
-
- let unit = HKUnit.milligramsPerDeciliter
-
- dialog.addTextField { (textField : UITextField!) in
- textField.placeholder = unit.unitString
- textField.keyboardType = .numberPad
- }
-
- dialog.addAction(UIAlertAction(title: "Calibrate", style: .default, handler: { (action: UIAlertAction!) in
- let textField = dialog.textFields![0] as UITextField
- let minGlucose = HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 40)
- let maxGlucose = HKQuantity(unit: HKUnit.milligramsPerDeciliter, doubleValue: 400)
-
- if let text = textField.text, let entry = Double(text) {
- guard entry >= minGlucose.doubleValue(for: unit) && entry <= maxGlucose.doubleValue(for: unit) else {
- // TODO: notify the user if the glucose is not in range
- return
- }
- let glucose = HKQuantity(unit: unit, doubleValue: Double(entry))
- AppDelegate.sharedDelegate.commandQueue.enqueue(.calibrateSensor(to: glucose, at: Date()))
- }
- }))
-
- dialog.addAction(UIAlertAction(title: "Cancel", style: .cancel))
-
- present(dialog, animated: true, completion: nil)
- }
-
- @IBAction func stop(_ sender: UIButton) {
- let dialog = UIAlertController(title: "Confirm", message: "Stop sensor session.", preferredStyle: .alert)
-
- dialog.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action: UIAlertAction!) in
- AppDelegate.sharedDelegate.commandQueue.enqueue(.stopSensor(at: Date()))
- }))
-
- dialog.addAction(UIAlertAction(title: "Cancel", style: .cancel))
-
- present(dialog, animated: true, completion: nil)
- }
-
- // MARK: - UITextFieldDelegate
-
- func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
- if let text = textField.text {
- let newString = text.replacingCharacters(in: range.rangeOfString(text), with: string)
-
- if newString.count > 6 {
- return false
- } else if newString.count == 6 {
- AppDelegate.sharedDelegate.transmitterID = newString
- textField.text = newString
-
- textField.resignFirstResponder()
-
- return false
- }
- }
-
- return true
- }
-
- func textFieldDidEndEditing(_ textField: UITextField) {
- if textField.text?.count != 6 {
- textField.text = UserDefaults.standard.transmitterID
- }
- }
-
- func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
- return true
- }
-
- func textFieldShouldReturn(_ textField: UITextField) -> Bool {
- return true
- }
-
- // MARK: - TransmitterDelegate
-
- func transmitter(_ transmitter: Transmitter, didError error: Error) {
- print("Transmitter Error: \(error)")
- titleLabel.text = NSLocalizedString("Error", comment: "Title displayed during error response")
-
- subtitleLabel.text = "\(error)"
- }
-
- func transmitter(_ transmitter: Transmitter, didRead glucose: Glucose) {
- let unit = HKUnit.milligramsPerDeciliter
- if let value = glucose.glucose?.doubleValue(for: unit) {
- titleLabel.text = "\(value) \(unit.unitString)"
- } else {
- titleLabel.text = String(describing: glucose.state)
- }
-
-
- let date = glucose.readDate
- subtitleLabel.text = DateFormatter.localizedString(from: date, dateStyle: .none, timeStyle: .long)
- }
-
- func transmitter(_ transmitter: Transmitter, didReadUnknownData data: Data) {
- titleLabel.text = NSLocalizedString("Unknown Data", comment: "Title displayed during unknown data response")
- subtitleLabel.text = data.hexadecimalString
- }
-
- func transmitter(_ transmitter: Transmitter, didReadBackfill glucose: [Glucose]) {
- titleLabel.text = NSLocalizedString("Backfill", comment: "Title displayed during backfill response")
- subtitleLabel.text = String(describing: glucose.map { $0.glucose })
- }
-
- func transmitterDidConnect(_ transmitter: Transmitter) {
- // Ignore
- }
-
-}
-
-
-private extension NSRange {
- func rangeOfString(_ string: String) -> Range {
- let startIndex = string.index(string.startIndex, offsetBy: location)
- let endIndex = string.index(startIndex, offsetBy: length)
- return startIndex..
-
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644
index 08de0be8d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/AESCrypt.h b/Dependencies/CGMBLEKit/CGMBLEKit/AESCrypt.h
deleted file mode 100644
index 357420d60..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/AESCrypt.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// AESCrypt.h
-// xDripG5
-//
-// Created by Nate Racklyeft on 6/17/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-#import
-
-@interface AESCrypt : NSObject
-
-NS_ASSUME_NONNULL_BEGIN
-
-+ (nullable NSData *)encryptData:(NSData *)data usingKey:(NSData *)key error:(NSError **)error;
-
-NS_ASSUME_NONNULL_END
-
-@end
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/AESCrypt.m b/Dependencies/CGMBLEKit/CGMBLEKit/AESCrypt.m
deleted file mode 100644
index 1a0df4a1b..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/AESCrypt.m
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// AESCrypt.m
-// xDripG5
-//
-// Created by Nate Racklyeft on 6/17/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-#import "AESCrypt.h"
-#import
-
-@implementation AESCrypt
-
-+ (NSData *)encryptData:(NSData *)data usingKey:(NSData *)key error:(NSError * _Nullable __autoreleasing *)error
-{
- NSMutableData *dataOut = [NSMutableData dataWithLength: data.length + kCCBlockSizeAES128];
-
- CCCryptorStatus status = CCCrypt(kCCEncrypt,
- kCCAlgorithmAES,
- kCCOptionECBMode,
- key.bytes,
- key.length,
- NULL,
- data.bytes,
- data.length,
- dataOut.mutableBytes,
- dataOut.length,
- NULL);
-
- return status == kCCSuccess ? dataOut : nil;
-}
-
-@end
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Base.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/Base.lproj/Localizable.strings
deleted file mode 100644
index 864a138e0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Base.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* Describes a low battery */
-"Low Battery" = "Low Battery";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Peripheral did not respond in time";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Peripheral isnʼt connected";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensor calibration is OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor needs calibration";
-
-/* Error description */
-"Unknown characteristic" = "Unknown characteristic";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/BluetoothManager.swift b/Dependencies/CGMBLEKit/CGMBLEKit/BluetoothManager.swift
deleted file mode 100644
index 556bd2e39..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/BluetoothManager.swift
+++ /dev/null
@@ -1,350 +0,0 @@
-//
-// BluetoothManager.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 10/1/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import os.log
-
-
-protocol BluetoothManagerDelegate: AnyObject {
-
- /**
- Tells the delegate that the bluetooth manager has finished connecting to and discovering all required services of its peripheral, or that it failed to do so
-
- - parameter manager: The bluetooth manager
- - parameter peripheralManager: The peripheral manager
- - parameter error: An error describing why bluetooth setup failed
- */
- func bluetoothManager(_ manager: BluetoothManager, peripheralManager: PeripheralManager, isReadyWithError error: Error?)
-
- /**
- Asks the delegate whether the discovered or restored peripheral should be connected
-
- - parameter manager: The bluetooth manager
- - parameter peripheral: The found peripheral
-
- - returns: True if the peripheral should connect
- */
- func bluetoothManager(_ manager: BluetoothManager, shouldConnectPeripheral peripheral: CBPeripheral) -> Bool
-
- /// Informs the delegate that the bluetooth manager received new data in the control characteristic
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- /// - peripheralManager: The peripheral manager
- /// - response: The data received on the control characteristic
- func bluetoothManager(_ manager: BluetoothManager, peripheralManager: PeripheralManager, didReceiveControlResponse response: Data)
-
- /// Informs the delegate that the bluetooth manager received new data in the backfill characteristic
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- /// - response: The data received on the backfill characteristic
- func bluetoothManager(_ manager: BluetoothManager, didReceiveBackfillResponse response: Data)
-
- /// Informs the delegate that the bluetooth manager received new data in the authentication characteristic
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- /// - peripheralManager: The peripheral manager
- /// - response: The data received on the authentication characteristic
- func bluetoothManager(_ manager: BluetoothManager, peripheralManager: PeripheralManager, didReceiveAuthenticationResponse response: Data)
-}
-
-
-class BluetoothManager: NSObject {
-
- var stayConnected: Bool {
- get {
- return lockedStayConnected.value
- }
- set {
- lockedStayConnected.value = newValue
- }
- }
- private let lockedStayConnected: Locked = Locked(true)
-
- weak var delegate: BluetoothManagerDelegate?
-
- private let log = OSLog(category: "BluetoothManager")
-
- /// Isolated to `managerQueue`
- private var manager: CBCentralManager! = nil
-
- /// Isolated to `managerQueue`
- private var peripheral: CBPeripheral? {
- get {
- return peripheralManager?.peripheral
- }
- set {
- guard let peripheral = newValue else {
- peripheralManager = nil
- return
- }
-
- if let peripheralManager = peripheralManager {
- peripheralManager.peripheral = peripheral
- } else {
- peripheralManager = PeripheralManager(
- peripheral: peripheral,
- configuration: .dexcomG5,
- centralManager: manager
- )
- }
- }
- }
-
- var peripheralIdentifier: UUID? {
- get {
- return lockedPeripheralIdentifier.value
- }
- set {
- lockedPeripheralIdentifier.value = newValue
- }
- }
- private let lockedPeripheralIdentifier: Locked = Locked(nil)
-
- /// Isolated to `managerQueue`
- private var peripheralManager: PeripheralManager? {
- didSet {
- oldValue?.delegate = nil
- peripheralManager?.delegate = self
-
- peripheralIdentifier = peripheralManager?.peripheral.identifier
- }
- }
-
- // MARK: - Synchronization
-
- private let managerQueue = DispatchQueue(label: "com.loudnate.CGMBLEKit.bluetoothManagerQueue", qos: .unspecified)
-
- override init() {
- super.init()
-
- managerQueue.sync {
- self.manager = CBCentralManager(delegate: self, queue: managerQueue, options: [CBCentralManagerOptionRestoreIdentifierKey: "com.loudnate.CGMBLEKit"])
- }
- }
-
- // MARK: - Actions
-
- func scanForPeripheral() {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
-
- managerQueue.sync {
- self.managerQueue_scanForPeripheral()
- }
- }
-
- func disconnect() {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
-
- managerQueue.sync {
- if manager.isScanning {
- manager.stopScan()
- }
-
- if let peripheral = peripheral {
- manager.cancelPeripheralConnection(peripheral)
- }
- }
- }
-
- private func managerQueue_scanForPeripheral() {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- guard manager.state == .poweredOn else {
- return
- }
-
- let currentState = peripheral?.state ?? .disconnected
- guard currentState != .connected else {
- return
- }
-
- if let peripheralID = peripheralIdentifier, let peripheral = manager.retrievePeripherals(withIdentifiers: [peripheralID]).first {
- log.debug("Re-connecting to known peripheral %{public}@", peripheral.identifier.uuidString)
- self.peripheral = peripheral
- self.manager.connect(peripheral)
- } else if let peripheral = manager.retrieveConnectedPeripherals(withServices: [
- TransmitterServiceUUID.advertisement.cbUUID,
- TransmitterServiceUUID.cgmService.cbUUID
- ]).first,
- delegate == nil || delegate!.bluetoothManager(self, shouldConnectPeripheral: peripheral)
- {
- log.debug("Found system-connected peripheral: %{public}@", peripheral.identifier.uuidString)
- self.peripheral = peripheral
- self.manager.connect(peripheral)
- } else {
- log.debug("Scanning for peripherals")
- manager.scanForPeripherals(withServices: [
- TransmitterServiceUUID.advertisement.cbUUID
- ],
- options: nil
- )
- }
- }
-
- /**
-
- Persistent connections don't seem to work with the transmitter shutoff: The OS won't re-wake the
- app unless it's scanning.
-
- The sleep gives the transmitter time to shut down, but keeps the app running.
-
- */
- fileprivate func scanAfterDelay() {
- DispatchQueue.global(qos: .utility).async {
- Thread.sleep(forTimeInterval: 2)
-
- self.scanForPeripheral()
- }
- }
-
- // MARK: - Accessors
-
- var isScanning: Bool {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
-
- var isScanning = false
- managerQueue.sync {
- isScanning = manager.isScanning
- }
- return isScanning
- }
-
- override var debugDescription: String {
- return [
- "## BluetoothManager",
- peripheralManager.map(String.init(reflecting:)) ?? "No peripheral",
- ].joined(separator: "\n")
- }
-}
-
-
-extension BluetoothManager: CBCentralManagerDelegate {
- func centralManagerDidUpdateState(_ central: CBCentralManager) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- peripheralManager?.centralManagerDidUpdateState(central)
- log.default("%{public}@: %{public}@", #function, String(describing: central.state.rawValue))
-
- switch central.state {
- case .poweredOn:
- managerQueue_scanForPeripheral()
- case .resetting, .poweredOff, .unauthorized, .unknown, .unsupported:
- fallthrough
- @unknown default:
- if central.isScanning {
- central.stopScan()
- }
- }
- }
-
- func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- if let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey] as? [CBPeripheral] {
- for peripheral in peripherals {
- if delegate == nil || delegate!.bluetoothManager(self, shouldConnectPeripheral: peripheral) {
- log.default("Restoring peripheral from state: %{public}@", peripheral.identifier.uuidString)
- self.peripheral = peripheral
- }
- }
- }
- }
-
- func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- log.info("%{public}@: %{public}@", #function, peripheral)
- if delegate == nil || delegate!.bluetoothManager(self, shouldConnectPeripheral: peripheral) {
- self.peripheral = peripheral
-
- central.connect(peripheral, options: nil)
-
- central.stopScan()
- }
- }
-
- func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- log.default("%{public}@: %{public}@", #function, peripheral)
- if central.isScanning {
- central.stopScan()
- }
-
- peripheralManager?.centralManager(central, didConnect: peripheral)
-
- if case .poweredOn = manager.state, case .connected = peripheral.state, let peripheralManager = peripheralManager {
- self.delegate?.bluetoothManager(self, peripheralManager: peripheralManager, isReadyWithError: nil)
- }
- }
-
- func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- log.default("%{public}@: %{public}@", #function, peripheral)
- // Ignore errors indicating the peripheral disconnected remotely, as that's expected behavior
- if let error = error as NSError?, CBError(_nsError: error).code != .peripheralDisconnected {
- log.error("%{public}@: %{public}@", #function, error)
- if let peripheralManager = peripheralManager {
- self.delegate?.bluetoothManager(self, peripheralManager: peripheralManager, isReadyWithError: error)
- }
- }
-
- if stayConnected {
- scanAfterDelay()
- }
- }
-
- func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- log.error("%{public}@: %{public}@", #function, String(describing: error))
- if let error = error, let peripheralManager = peripheralManager {
- self.delegate?.bluetoothManager(self, peripheralManager: peripheralManager, isReadyWithError: error)
- }
-
- if stayConnected {
- scanAfterDelay()
- }
- }
-}
-
-
-extension BluetoothManager: PeripheralManagerDelegate {
- func peripheralManager(_ manager: PeripheralManager, didReadRSSI RSSI: NSNumber, error: Error?) {
-
- }
-
- func peripheralManagerDidUpdateName(_ manager: PeripheralManager) {
-
- }
-
- func completeConfiguration(for manager: PeripheralManager) throws {
-
- }
-
- func peripheralManager(_ manager: PeripheralManager, didUpdateValueFor characteristic: CBCharacteristic) {
- guard let value = characteristic.value else {
- return
- }
-
- switch CGMServiceCharacteristicUUID(rawValue: characteristic.uuid.uuidString.uppercased()) {
- case .none, .communication?:
- return
- case .control?:
- self.delegate?.bluetoothManager(self, peripheralManager: manager, didReceiveControlResponse: value)
- case .backfill?:
- self.delegate?.bluetoothManager(self, didReceiveBackfillResponse: value)
- case .authentication?:
- self.delegate?.bluetoothManager(self, peripheralManager: manager, didReceiveAuthenticationResponse: value)
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/BluetoothServices.swift b/Dependencies/CGMBLEKit/CGMBLEKit/BluetoothServices.swift
deleted file mode 100644
index 85cce9cc7..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/BluetoothServices.swift
+++ /dev/null
@@ -1,87 +0,0 @@
-//
-// BluetoothServices.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 10/16/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import CoreBluetooth
-
-/*
-G5 BLE attributes, retrieved using LightBlue on 2015-10-01
-
-These are the G4 details, for reference:
-https://github.com/StephenBlackWasAlreadyTaken/xDrip/blob/af20e32652d19aa40becc1a39f6276cad187fdce/app/src/main/java/com/eveningoutpost/dexdrip/UtilityModels/DexShareAttributes.java
-*/
-
-protocol CBUUIDRawValue: RawRepresentable {}
-extension CBUUIDRawValue where RawValue == String {
- var cbUUID: CBUUID {
- return CBUUID(string: rawValue)
- }
-}
-
-
-enum TransmitterServiceUUID: String, CBUUIDRawValue {
- case deviceInfo = "180A"
- case advertisement = "FEBC"
- case cgmService = "F8083532-849E-531C-C594-30F1F86A4EA5"
-
- case serviceB = "F8084532-849E-531C-C594-30F1F86A4EA5"
-}
-
-
-enum DeviceInfoCharacteristicUUID: String, CBUUIDRawValue {
- // Read
- // "DexcomUN"
- case manufacturerNameString = "2A29"
-}
-
-
-enum CGMServiceCharacteristicUUID: String, CBUUIDRawValue {
-
- // Read/Notify
- case communication = "F8083533-849E-531C-C594-30F1F86A4EA5"
-
- // Write/Indicate
- case control = "F8083534-849E-531C-C594-30F1F86A4EA5"
-
- // Write/Indicate
- case authentication = "F8083535-849E-531C-C594-30F1F86A4EA5"
-
- // Read/Write/Notify
- case backfill = "F8083536-849E-531C-C594-30F1F86A4EA5"
-
-// // Unknown attribute present on older G6 transmitters
-// case unknown1 = "F8083537-849E-531C-C594-30F1F86A4EA5"
-//
-// // Updated G6 characteristic (read/notify)
-// case unknown2 = "F8083538-849E-531C-C594-30F1F86A4EA5"
-}
-
-
-enum ServiceBCharacteristicUUID: String, CBUUIDRawValue {
- // Write/Indicate
- case characteristicE = "F8084533-849E-531C-C594-30F1F86A4EA5"
- // Read/Write/Notify
- case characteristicF = "F8084534-849E-531C-C594-30F1F86A4EA5"
-}
-
-
-extension PeripheralManager.Configuration {
- static var dexcomG5: PeripheralManager.Configuration {
- return PeripheralManager.Configuration(
- serviceCharacteristics: [
- TransmitterServiceUUID.cgmService.cbUUID: [
- CGMServiceCharacteristicUUID.communication.cbUUID,
- CGMServiceCharacteristicUUID.authentication.cbUUID,
- CGMServiceCharacteristicUUID.control.cbUUID,
- CGMServiceCharacteristicUUID.backfill.cbUUID,
- ]
- ],
- notifyingCharacteristics: [:],
- valueUpdateMacros: [:]
- )
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/CBPeripheral.swift b/Dependencies/CGMBLEKit/CGMBLEKit/CBPeripheral.swift
deleted file mode 100644
index f64494c4a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/CBPeripheral.swift
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// CBPeripheral.swift
-// xDripG5
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import CoreBluetooth
-
-
-// MARK: - Discovery helpers.
-extension CBPeripheral {
- func servicesToDiscover(from serviceUUIDs: [CBUUID]) -> [CBUUID] {
- let knownServiceUUIDs = services?.compactMap({ $0.uuid }) ?? []
- return serviceUUIDs.filter({ !knownServiceUUIDs.contains($0) })
- }
-
- func characteristicsToDiscover(from characteristicUUIDs: [CBUUID], for service: CBService) -> [CBUUID] {
- let knownCharacteristicUUIDs = service.characteristics?.compactMap({ $0.uuid }) ?? []
- return characteristicUUIDs.filter({ !knownCharacteristicUUIDs.contains($0) })
- }
-}
-
-
-extension Collection where Element: CBAttribute {
- func itemWithUUID(_ uuid: CBUUID) -> Element? {
- for attribute in self {
- if attribute.uuid == uuid {
- return attribute
- }
- }
-
- return nil
- }
-
- func itemWithUUIDString(_ uuidString: String) -> Element? {
- for attribute in self {
- if attribute.uuid.uuidString == uuidString {
- return attribute
- }
- }
-
- return nil
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/CGMBLEKit.h b/Dependencies/CGMBLEKit/CGMBLEKit/CGMBLEKit.h
deleted file mode 100644
index 49882cc8e..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/CGMBLEKit.h
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// CGMBLEKit.h
-// xDripG5
-//
-// Created by Nathan Racklyeft on 12/30/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-#import
-#import
-
-//! Project version number for CGMBLEKIt.
-FOUNDATION_EXPORT double CGMBLEKitVersionNumber;
-
-//! Project version string for CGMBLEKit.
-FOUNDATION_EXPORT const unsigned char CGMBLEKitVersionString[];
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Calibration.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Calibration.swift
deleted file mode 100644
index fd05c906d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Calibration.swift
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Calibration.swift
-// xDripG5
-//
-// Created by Paul Dickens on 17/03/2018.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-
-public struct Calibration {
- init?(calibrationMessage: CalibrationDataRxMessage, activationDate: Date) {
- guard calibrationMessage.glucose > 0 else {
- return nil
- }
-
- let unit = HKUnit.milligramsPerDeciliter
-
- glucose = HKQuantity(unit: unit, doubleValue: Double(calibrationMessage.glucose))
- date = activationDate.addingTimeInterval(TimeInterval(calibrationMessage.timestamp))
- }
-
- public let glucose: HKQuantity
- public let date: Date
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/CalibrationState.swift b/Dependencies/CGMBLEKit/CGMBLEKit/CalibrationState.swift
deleted file mode 100644
index 97ef0bc70..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/CalibrationState.swift
+++ /dev/null
@@ -1,106 +0,0 @@
-//
-// CalibrationState.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 8/6/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-public enum CalibrationState: RawRepresentable {
- public typealias RawValue = UInt8
-
- public enum State: RawValue {
- case stopped = 1
- case warmup = 2
-
- case needFirstInitialCalibration = 4
- case needSecondInitialCalibration = 5
- case ok = 6
- case needCalibration7 = 7
- case calibrationError8 = 8
- case calibrationError9 = 9
- case calibrationError10 = 10
- case sensorFailure11 = 11
- case sensorFailure12 = 12
- case calibrationError13 = 13
- case needCalibration14 = 14
- case sessionFailure15 = 15
- case sessionFailure16 = 16
- case sessionFailure17 = 17
- case questionMarks = 18
- }
-
- case known(State)
- case unknown(RawValue)
-
- public init(rawValue: RawValue) {
- guard let state = State(rawValue: rawValue) else {
- self = .unknown(rawValue)
- return
- }
-
- self = .known(state)
- }
-
- public var rawValue: RawValue {
- switch self {
- case .known(let state):
- return state.rawValue
- case .unknown(let rawValue):
- return rawValue
- }
- }
-
- public var hasReliableGlucose: Bool {
- guard case .known(let state) = self else {
- return false
- }
-
- switch state {
- case .stopped,
- .warmup,
- .needFirstInitialCalibration,
- .needSecondInitialCalibration,
- .calibrationError8,
- .calibrationError9,
- .calibrationError10,
- .sensorFailure11,
- .sensorFailure12,
- .calibrationError13,
- .sessionFailure15,
- .sessionFailure16,
- .sessionFailure17,
- .questionMarks:
- return false
- case .ok, .needCalibration7, .needCalibration14:
- return true
- }
- }
-}
-
-extension CalibrationState: Equatable {
- public static func ==(lhs: CalibrationState, rhs: CalibrationState) -> Bool {
- switch (lhs, rhs) {
- case (.known(let lhs), .known(let rhs)):
- return lhs == rhs
- case (.unknown(let lhs), .unknown(let rhs)):
- return lhs == rhs
- default:
- return false
- }
- }
-}
-
-extension CalibrationState: CustomStringConvertible {
- public var description: String {
- switch self {
- case .known(let state):
- return String(describing: state)
- case .unknown(let value):
- return ".unknown(\(value))"
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Command.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Command.swift
deleted file mode 100644
index c9d0e2beb..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Command.swift
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// Command.swift
-// xDripG5
-//
-// Created by Paul Dickens on 22/03/2018.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-
-public enum Command: RawRepresentable {
- public typealias RawValue = [String: Any]
-
- case startSensor(at: Date)
- case stopSensor(at: Date)
- case calibrateSensor(to: HKQuantity, at: Date)
- case resetTransmitter
-
- public init?(rawValue: RawValue) {
- guard let action = rawValue["action"] as? Action.RawValue else {
- return nil
- }
-
- let date = rawValue["date"] as? Date
-
- switch Action(rawValue: action) {
- case .startSensor?:
- guard let date = date else {
- return nil
- }
- self = .startSensor(at: date)
- case .stopSensor?:
- guard let date = date else {
- return nil
- }
- self = .stopSensor(at: date)
- case .calibrateSensor?:
- guard let date = date, let glucose = rawValue["glucose"] as? HKQuantity else {
- return nil
- }
- self = .calibrateSensor(to: glucose, at: date)
- case .resetTransmitter?:
- self = .resetTransmitter
- case .none:
- return nil
- }
- }
-
- private enum Action: Int {
- case startSensor, stopSensor, calibrateSensor, resetTransmitter
- }
-
- public var rawValue: RawValue {
- switch self {
- case .startSensor(let date):
- return [
- "action": Action.startSensor.rawValue,
- "date": date
- ]
- case .stopSensor(let date):
- return [
- "action": Action.stopSensor.rawValue,
- "date": date
- ]
- case .calibrateSensor(let glucose, let date):
- return [
- "action": Action.calibrateSensor.rawValue,
- "date": date,
- "glucose": glucose
- ]
- case .resetTransmitter:
- return [
- "action": Action.resetTransmitter.rawValue
- ]
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Glucose+SensorDisplayable.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Glucose+SensorDisplayable.swift
deleted file mode 100644
index e37feaa4d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Glucose+SensorDisplayable.swift
+++ /dev/null
@@ -1,85 +0,0 @@
-//
-// GlucoseRxMessage.swift
-// Loop
-//
-// Created by Nathan Racklyeft on 5/30/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-import LoopKit
-
-
-extension Glucose: GlucoseDisplayable {
- public var isStateValid: Bool {
- return state == .known(.ok) && status == .ok
- }
-
- public var stateDescription: String {
- var messages = [String]()
-
- switch state {
- case .known(.ok):
- break // Suppress the "OK" message
- default:
- messages.append(state.localizedDescription)
- }
-
- switch self.status {
- case .ok:
- if messages.isEmpty {
- messages.append(status.localizedDescription)
- } else {
- break // Suppress the "OK" message
- }
- case .lowBattery, .unknown:
- messages.append(status.localizedDescription)
- }
-
- return messages.joined(separator: ". ")
- }
-
- public var trendType: GlucoseTrend? {
- guard trend < Int(Int8.max) else {
- return nil
- }
-
- switch trend {
- case let x where x <= -30:
- return .downDownDown
- case let x where x <= -20:
- return .downDown
- case let x where x <= -10:
- return .down
- case let x where x < 10:
- return .flat
- case let x where x < 20:
- return .up
- case let x where x < 30:
- return .upUp
- default:
- return .upUpUp
- }
- }
-
- public var isLocal: Bool {
- return true
- }
-
- // TODO Placeholders. This functionality will come with LOOP-1311
- public var glucoseRangeCategory: GlucoseRangeCategory? {
- return nil
- }
-}
-
-extension Glucose {
- public var condition: GlucoseCondition? {
- if glucoseMessage.glucose < GlucoseLimits.minimum {
- return .belowRange
- } else if glucoseMessage.glucose > GlucoseLimits.maximum {
- return .aboveRange
- } else {
- return nil
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Glucose.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Glucose.swift
deleted file mode 100644
index 20decf45f..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Glucose.swift
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// Glucose.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 8/6/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-enum GlucoseLimits {
- static var minimum: UInt16 = 40
- static var maximum: UInt16 = 400
-}
-
-public struct Glucose {
- let glucoseMessage: GlucoseSubMessage
- let timeMessage: TransmitterTimeRxMessage
-
- init(
- transmitterID: String,
- glucoseMessage: GlucoseRxMessage,
- timeMessage: TransmitterTimeRxMessage,
- calibrationMessage: CalibrationDataRxMessage? = nil,
- activationDate: Date
- ) {
- self.init(
- transmitterID: transmitterID,
- status: glucoseMessage.status,
- glucoseMessage: glucoseMessage.glucose,
- timeMessage: timeMessage,
- calibrationMessage: calibrationMessage,
- activationDate: activationDate
- )
- }
-
- init(
- transmitterID: String,
- status: UInt8,
- glucoseMessage: GlucoseSubMessage,
- timeMessage: TransmitterTimeRxMessage,
- calibrationMessage: CalibrationDataRxMessage? = nil,
- activationDate: Date
- ) {
- self.transmitterID = transmitterID
- self.glucoseMessage = glucoseMessage
- self.timeMessage = timeMessage
- self.status = TransmitterStatus(rawValue: status)
- self.activationDate = activationDate
-
- sessionStartDate = activationDate.addingTimeInterval(TimeInterval(timeMessage.sessionStartTime))
- sessionExpDate = activationDate.addingTimeInterval(TimeInterval(timeMessage.sessionStartTime) + (10*24*60*60))
- readDate = activationDate.addingTimeInterval(TimeInterval(glucoseMessage.timestamp))
- lastCalibration = calibrationMessage != nil ? Calibration(calibrationMessage: calibrationMessage!, activationDate: activationDate) : nil
- }
-
- // MARK: - Transmitter Info
- public let transmitterID: String
- public let status: TransmitterStatus
- public let activationDate: Date
- public let sessionStartDate: Date
- public let sessionExpDate: Date
-
- // MARK: - Glucose Info
- public let lastCalibration: Calibration?
- public let readDate: Date
-
- public var isDisplayOnly: Bool {
- return glucoseMessage.glucoseIsDisplayOnly
- }
-
- public var glucose: HKQuantity? {
- guard state.hasReliableGlucose && glucoseMessage.glucose >= 39 else {
- return nil
- }
-
- let unit = HKUnit.milligramsPerDeciliter
-
- return HKQuantity(unit: unit, doubleValue: Double(min(max(glucoseMessage.glucose, GlucoseLimits.minimum), GlucoseLimits.maximum)))
- }
-
- public var state: CalibrationState {
- return CalibrationState(rawValue: glucoseMessage.state)
- }
-
- public var trend: Int {
- return Int(glucoseMessage.trend)
- }
-
- public var trendRate: HKQuantity? {
- guard glucoseMessage.trend < Int8.max && glucoseMessage.trend > Int8.min else {
- return nil
- }
-
- let unit = HKUnit.milligramsPerDeciliterPerMinute
- return HKQuantity(unit: unit, doubleValue: Double(glucoseMessage.trend) / 10)
- }
-
- // An identifier for this reading thatʼs consistent between backfill/live data
- public var syncIdentifier: String {
- return "\(transmitterID) \(glucoseMessage.timestamp)"
- }
-}
-
-
-extension Glucose: Equatable {
- public static func ==(lhs: Glucose, rhs: Glucose) -> Bool {
- return lhs.glucoseMessage == rhs.glucoseMessage && lhs.syncIdentifier == rhs.syncIdentifier
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Info.plist b/Dependencies/CGMBLEKit/CGMBLEKit/Info.plist
deleted file mode 100644
index 1635817ed..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Info.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 3.2
- CFBundleSignature
- ????
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
- NSPrincipalClass
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthChallengeRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthChallengeRxMessage.swift
deleted file mode 100644
index 40904d7f0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthChallengeRxMessage.swift
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// AuthChallengeRxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/22/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct AuthChallengeRxMessage: TransmitterRxMessage {
- let isAuthenticated: Bool
- let isBonded: Bool
-
- init?(data: Data) {
- guard data.count >= 3 else {
- return nil
- }
-
- guard data.starts(with: .authChallengeRx) else {
- return nil
- }
-
- isAuthenticated = data[1] == 0x1
- isBonded = data[2] == 0x1
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthChallengeTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthChallengeTxMessage.swift
deleted file mode 100644
index 6ce551cc0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthChallengeTxMessage.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// AuthChallengeTxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/22/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct AuthChallengeTxMessage: TransmitterTxMessage {
- let challengeHash: Data
-
- var data: Data {
- var data = Data(for: .authChallengeTx)
- data.append(challengeHash)
- return data
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthRequestRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthRequestRxMessage.swift
deleted file mode 100644
index 3843891ac..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthRequestRxMessage.swift
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// AuthRequestRxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/22/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct AuthRequestRxMessage: TransmitterRxMessage {
- let tokenHash: Data
- let challenge: Data
-
- init?(data: Data) {
- guard data.count >= 17 else {
- return nil
- }
-
- guard data.starts(with: .authRequestRx) else {
- return nil
- }
-
- tokenHash = data.subdata(in: 1..<9)
- challenge = data.subdata(in: 9..<17)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthRequestTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthRequestTxMessage.swift
deleted file mode 100644
index 9aaf9d585..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/AuthRequestTxMessage.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// AuthRequestTxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/22/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct AuthRequestTxMessage: TransmitterTxMessage {
- let singleUseToken: Data
- let endByte: UInt8 = 0x2
-
- init() {
- let uuid = UUID().uuid
-
- singleUseToken = Data([uuid.0, uuid.1, uuid.2, uuid.3,
- uuid.4, uuid.5, uuid.6, uuid.7])
- }
-
- var data: Data {
- var data = Data(for: .authRequestTx)
- data.append(singleUseToken)
- data.append(endByte)
- return data
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/BatteryStatusTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/BatteryStatusTxMessage.swift
deleted file mode 100644
index 8cabbe897..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/BatteryStatusTxMessage.swift
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-// BatteryStatusTxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct BatteryStatusTxMessage {
- let opcode: Opcode = .batteryStatusTx
-
- // Response: 23003c012f01cd021f247bae
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/BondRequestTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/BondRequestTxMessage.swift
deleted file mode 100644
index 70601d976..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/BondRequestTxMessage.swift
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// BondRequestTxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/23/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-/// Initiates a bond with the central
-struct BondRequestTxMessage: TransmitterTxMessage {
- var data: Data {
- return Data(for: .bondRequest)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrateGlucoseRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrateGlucoseRxMessage.swift
deleted file mode 100644
index aaa6d8c4a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrateGlucoseRxMessage.swift
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// CalibrateGlucoseRxMessage.swift
-// xDripG5
-//
-// Created by Paul Dickens on 25/02/2018.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-
-public struct CalibrateGlucoseRxMessage: TransmitterRxMessage {
- init?(data: Data) {
- guard data.count == 5 && data.isCRCValid else {
- return nil
- }
-
- guard data.starts(with: .calibrateGlucoseRx) else {
- return nil
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrateGlucoseTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrateGlucoseTxMessage.swift
deleted file mode 100644
index 3b318689b..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrateGlucoseTxMessage.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// CalibrateGlucoseTxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct CalibrateGlucoseTxMessage: RespondableMessage {
- typealias Response = CalibrateGlucoseRxMessage
-
- let time: UInt32
- let glucose: UInt16
-
- var data: Data {
- var data = Data(for: .calibrateGlucoseTx)
- data.append(glucose)
- data.append(time)
- return data.appendingCRC()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrationDataRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrationDataRxMessage.swift
deleted file mode 100644
index 1f77efe87..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrationDataRxMessage.swift
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// CalibrationDataRxMessage.swift
-// Pods
-//
-// Created by Nate Racklyeft on 9/18/16.
-//
-//
-
-import Foundation
-
-
-struct CalibrationDataRxMessage: TransmitterRxMessage {
- let glucose: UInt16
- let timestamp: UInt32
-
- init?(data: Data) {
- guard data.count == 19 && data.isCRCValid else {
- return nil
- }
-
- guard data.starts(with: .calibrationDataRx) else {
- return nil
- }
-
- glucose = data[11..<13].toInt() & 0xfff
- timestamp = data[13..<17].toInt()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrationDataTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrationDataTxMessage.swift
deleted file mode 100644
index 89e42af55..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/CalibrationDataTxMessage.swift
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// CalibrationDataTxMessage.swift
-// xDripG5
-//
-// Created by Paul Dickens on 17/03/2018.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-
-struct CalibrationDataTxMessage: RespondableMessage {
- typealias Response = CalibrationDataRxMessage
-
- var data: Data {
- return Data(for: .calibrationDataTx).appendingCRC()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/DisconnectTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/DisconnectTxMessage.swift
deleted file mode 100644
index 856a7319a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/DisconnectTxMessage.swift
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-// DisconnectTxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/23/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct DisconnectTxMessage: TransmitterTxMessage {
- var data: Data {
- return Data(for: .disconnectTx)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/FirmwareVersionTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/FirmwareVersionTxMessage.swift
deleted file mode 100644
index 7578177da..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/FirmwareVersionTxMessage.swift
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// FirmwareVersionTxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct FirmwareVersionTxMessage {
- let opcode: Opcode = .firmwareVersionTx
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseBackfillMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseBackfillMessage.swift
deleted file mode 100644
index 9030caf78..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseBackfillMessage.swift
+++ /dev/null
@@ -1,122 +0,0 @@
-//
-// GlucoseBackfillMessage.swift
-// xDripG5
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-// 50 05 02 00 b7ff5200 66045300 00000000 0000 7138
-
-struct GlucoseBackfillTxMessage: RespondableMessage {
- typealias Response = GlucoseBackfillRxMessage
-
- let byte1: UInt8
- let byte2: UInt8
- let identifier: UInt8
-
- let startTime: UInt32
- let endTime: UInt32
-
- let length: UInt32 = 0
- let backfillCRC: UInt16 = 0
-
- var data: Data {
- var data = Data(for: .glucoseBackfillTx)
- data.append(contentsOf: [byte1, byte2, identifier])
- data.append(startTime)
- data.append(endTime)
- data.append(length)
- data.append(backfillCRC)
-
- return data.appendingCRC()
- }
-}
-
-// 51 00 01 00 b7ff5200 66045300 32000000 e6cb 9805
-
-struct GlucoseBackfillRxMessage: TransmitterRxMessage {
- let status: UInt8
- let backfillStatus: UInt8
- let identifier: UInt8
- let startTime: UInt32
- let endTime: UInt32
- let bufferLength: UInt32
- let bufferCRC: UInt16
-
- init?(data: Data) {
- guard data.count == 20,
- data.isCRCValid,
- data.starts(with: .glucoseBackfillRx)
- else {
- return nil
- }
-
- status = data[1]
- backfillStatus = data[2]
- identifier = data[3]
- startTime = data[4..<8].toInt()
- endTime = data[8..<12].toInt()
- bufferLength = data[12..<16].toInt()
- bufferCRC = data[16..<18].toInt()
- }
-}
-
-// 0100bc460000b7ff52008b0006eee30053008500
-// 020006eb0f025300800006ee3a0353007e0006f5
-// 030066045300790006f8
-
-struct GlucoseBackfillFrameBuffer {
- let identifier: UInt8
- private var frames: [Data] = []
-
- init(identifier: UInt8) {
- self.identifier = identifier
- }
-
- mutating func append(_ frame: Data) {
- // Byte 0 is the frame index
- // Byte 1 is the identifier
- guard frame.count > 2,
- frame[0] == frames.count + 1,
- frame[1] == identifier else {
- return
- }
-
- frames.append(frame)
- }
-
- var count: Int {
- return frames.reduce(0, { $0 + $1.count })
- }
-
- var crc16: UInt16 {
- return frames.reduce(into: Data(), { $0.append($1) }).crc16
- }
-
- var glucose: [GlucoseSubMessage] {
- // Drop the first 2 bytes from each frame
- let data = frames.reduce(into: Data(), { $0.append($1.dropFirst(2)) })
-
- // Drop the first 4 bytes from the combined message
- // Byte 0: ??
- // Byte 1: ??
- // Byte 2: ?? (only seen 0 so far)
- // Byte 3: ?? (only seen 0 so far)
- let glucoseData = data.dropFirst(4)
-
- return stride(
- from: glucoseData.startIndex,
- to: glucoseData.endIndex,
- by: GlucoseSubMessage.size
- ).compactMap {
- let range = $0..<$0.advanced(by: GlucoseSubMessage.size)
- guard glucoseData.endIndex >= range.endIndex else {
- return nil
- }
-
- return GlucoseSubMessage(data: glucoseData[range])
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseHistoryTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseHistoryTxMessage.swift
deleted file mode 100644
index 44abfdd05..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseHistoryTxMessage.swift
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// GlucoseHistoryTxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct GlucoseHistoryTxMessage {
- let opcode: Opcode = .glucoseHistoryTx
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseRxMessage.swift
deleted file mode 100644
index f945d2213..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseRxMessage.swift
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// GlucoseRxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/23/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-public struct GlucoseSubMessage: TransmitterRxMessage {
- static let size = 8
-
- public let timestamp: UInt32
- public let glucoseIsDisplayOnly: Bool
- public let glucose: UInt16
- public let state: UInt8
- public let trend: Int8
-
- init?(data: Data) {
- guard data.count >= GlucoseSubMessage.size else {
- return nil
- }
-
- var start = data.startIndex
- var end = start.advanced(by: 4)
- timestamp = data[start.. 0
- glucose = glucoseBytes & 0xfff
-
- start = end
- end = start.advanced(by: 1)
- state = data[start]
-
- start = end
- end = start.advanced(by: 1)
- trend = Int8(bitPattern: data[start])
- }
-}
-
-
-public struct GlucoseRxMessage: TransmitterRxMessage {
- public let status: UInt8
- public let sequence: UInt32
- public let glucose: GlucoseSubMessage
-
- init?(data: Data) {
- guard data.count >= 16 && data.isCRCValid else {
- return nil
- }
-
- guard data.starts(with: .glucoseRx) || data.starts(with: .glucoseG6Rx) else {
- return nil
- }
-
- status = data[1]
- sequence = data[2..<6].toInt()
-
- guard let glucose = GlucoseSubMessage(data: data[6...]) else {
- return nil
- }
- self.glucose = glucose
- }
-}
-
-extension GlucoseSubMessage: Equatable {
- public static func ==(lhs: GlucoseSubMessage, rhs: GlucoseSubMessage) -> Bool {
- return lhs.timestamp == rhs.timestamp &&
- lhs.glucoseIsDisplayOnly == rhs.glucoseIsDisplayOnly &&
- lhs.glucose == rhs.glucose &&
- lhs.state == rhs.state &&
- lhs.trend == rhs.trend
- }
-}
-
-
-extension GlucoseRxMessage: Equatable {
- public static func ==(lhs: GlucoseRxMessage, rhs: GlucoseRxMessage) -> Bool {
- return lhs.status == rhs.status &&
- lhs.sequence == rhs.sequence &&
- lhs.glucose == rhs.glucose
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseTxMessage.swift
deleted file mode 100644
index f20f6fa66..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/GlucoseTxMessage.swift
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// GlucoseTxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/23/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct GlucoseTxMessage: RespondableMessage {
- typealias Response = GlucoseRxMessage
-
- var data: Data {
- return Data(for: .glucoseTx).appendingCRC()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/KeepAliveTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/KeepAliveTxMessage.swift
deleted file mode 100644
index 67e33c55a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/KeepAliveTxMessage.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// KeepAliveTxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/23/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct KeepAliveTxMessage: TransmitterTxMessage {
- let time: UInt8
-
- var data: Data {
- var data = Data(for: .keepAlive)
- data.append(time)
- return data
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/ResetMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/ResetMessage.swift
deleted file mode 100644
index acaaf5d23..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/ResetMessage.swift
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// ResetMessage.swift
-// xDripG5
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-
-struct ResetTxMessage: RespondableMessage {
- typealias Response = ResetRxMessage
-
- var data: Data {
- return Data(for: .resetTx).appendingCRC()
- }
-}
-
-
-struct ResetRxMessage: TransmitterRxMessage {
- let status: UInt8
-
- init?(data: Data) {
- guard data.count >= 2, data.starts(with: .resetRx) else {
- return nil
- }
-
- status = data[1]
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStartRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStartRxMessage.swift
deleted file mode 100644
index f38ca5f04..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStartRxMessage.swift
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// SessionStartRxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 6/4/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct SessionStartRxMessage: TransmitterRxMessage {
- let status: UInt8
- let received: UInt8
-
- // I've only seen examples of these 2 values matching
- let requestedStartTime: UInt32
- let sessionStartTime: UInt32
-
- let transmitterTime: UInt32
-
- init?(data: Data) {
- guard data.count == 17 && data.isCRCValid else {
- return nil
- }
-
- guard data.starts(with: .sessionStartRx) else {
- return nil
- }
-
- status = data[1]
- received = data[2]
- requestedStartTime = data[3..<7].toInt()
- sessionStartTime = data[7..<11].toInt()
- transmitterTime = data[11..<15].toInt()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStartTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStartTxMessage.swift
deleted file mode 100644
index faa2c1513..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStartTxMessage.swift
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// SessionStartTxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct SessionStartTxMessage: RespondableMessage {
- typealias Response = SessionStartRxMessage
-
- /// Time since activation in Dex seconds
- let startTime: UInt32
-
- /// Time in seconds since Unix Epoch
- let secondsSince1970: UInt32
-
- var data: Data {
- var data = Data(for: .sessionStartTx)
- data.append(startTime)
- data.append(secondsSince1970)
- return data.appendingCRC()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStopRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStopRxMessage.swift
deleted file mode 100644
index a2f86792f..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStopRxMessage.swift
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// SessionStopRxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 6/4/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct SessionStopRxMessage: TransmitterRxMessage {
- let status: UInt8
- let received: UInt8
- let sessionStopTime: UInt32
- let sessionStartTime: UInt32
- let transmitterTime: UInt32
-
- init?(data: Data) {
- guard data.count == 17 && data.isCRCValid else {
- return nil
- }
-
- guard data.starts(with: .sessionStopRx) else {
- return nil
- }
-
- status = data[1]
- received = data[2]
- sessionStopTime = data[3..<7].toInt()
- sessionStartTime = data[7..<11].toInt()
- transmitterTime = data[11..<15].toInt()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStopTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStopTxMessage.swift
deleted file mode 100644
index 0c320a576..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/SessionStopTxMessage.swift
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// SessionStopTxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct SessionStopTxMessage: RespondableMessage {
- typealias Response = SessionStopRxMessage
-
- let stopTime: UInt32
-
- var data: Data {
- var data = Data(for: .sessionStopTx)
- data.append(stopTime)
- return data.appendingCRC()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterMessage.swift
deleted file mode 100644
index f6c9908f8..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterMessage.swift
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// TransmitterCommand.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/22/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-/// A data sequence written to the transmitter
-protocol TransmitterTxMessage {
-
- /// The data to write
- var data: Data { get }
-
-}
-
-
-protocol RespondableMessage: TransmitterTxMessage {
- associatedtype Response: TransmitterRxMessage
-}
-
-
-/// A data sequence received by the transmitter
-protocol TransmitterRxMessage {
-
-
- init?(data: Data)
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterTimeRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterTimeRxMessage.swift
deleted file mode 100644
index 837eab755..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterTimeRxMessage.swift
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// TransmitterTimeRxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/23/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct TransmitterTimeRxMessage: TransmitterRxMessage {
- let status: UInt8
- let currentTime: UInt32
- let sessionStartTime: UInt32
-
- init?(data: Data) {
- guard data.count == 16 && data.isCRCValid else {
- return nil
- }
-
- guard data.starts(with: .transmitterTimeRx) else {
- return nil
- }
-
- status = data[1]
- currentTime = data[2..<6].toInt()
- sessionStartTime = data[6..<10].toInt()
-
- }
-}
-
-extension TransmitterTimeRxMessage: Equatable { }
-
-func ==(lhs: TransmitterTimeRxMessage, rhs: TransmitterTimeRxMessage) -> Bool {
- return lhs.currentTime == rhs.currentTime
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterTimeTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterTimeTxMessage.swift
deleted file mode 100644
index 5f2e29e6a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterTimeTxMessage.swift
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// TransmitterTimeTxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/23/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct TransmitterTimeTxMessage: RespondableMessage {
- typealias Response = TransmitterTimeRxMessage
-
- var data: Data {
- return Data(for: .transmitterTimeTx).appendingCRC()
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterVersionRxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterVersionRxMessage.swift
deleted file mode 100644
index 4854385b5..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterVersionRxMessage.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// TransmitterVersionRxMessage.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 9/29/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct TransmitterVersionRxMessage: TransmitterRxMessage {
- let status: UInt8
- let firmwareVersion: [UInt8]
-
- init?(data: Data) {
- guard data.count == 19 && data.isCRCValid else {
- return nil
- }
-
- guard data.starts(with: .transmitterVersionRx) else {
- return nil
- }
-
- status = data[1]
- firmwareVersion = data[2..<6].map { $0 }
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterVersionTxMessage.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterVersionTxMessage.swift
deleted file mode 100644
index 60df2c7fd..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Messages/TransmitterVersionTxMessage.swift
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-// TransmitterVersionTxMessage.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-struct TransmitterVersionTxMessage {
- typealias Response = TransmitterVersionRxMessage
-
- let opcode: Opcode = .transmitterVersionTx
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/NSData+CRC.swift b/Dependencies/CGMBLEKit/CGMBLEKit/NSData+CRC.swift
deleted file mode 100644
index b635a1168..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/NSData+CRC.swift
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-// NSData+CRC.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 4/7/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-/**
- CRC-CCITT (XModem)
-
- [http://www.lammertbies.nl/comm/info/crc-calculation.html]()
-
- [http://web.mit.edu/6.115/www/amulet/xmodem.htm]()
- */
-extension Collection where Element == UInt8 {
- private var crcCCITTXModem: UInt16 {
- var crc: UInt16 = 0
-
- for byte in self {
- crc ^= UInt16(byte) << 8
-
- for _ in 0..<8 {
- if crc & 0x8000 != 0 {
- crc = crc << 1 ^ 0x1021
- } else {
- crc = crc << 1
- }
- }
- }
-
- return crc
- }
-
- var crc16: UInt16 {
- return crcCCITTXModem
- }
-}
-
-
-extension UInt8 {
- var crc16: UInt16 {
- return [self].crc16
- }
-}
-
-
-extension Data {
- var isCRCValid: Bool {
- return dropLast(2).crc16 == suffix(2).toInt()
- }
-
- func appendingCRC() -> Data {
- var data = self
- data.append(crc16)
- return data
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/OSLog.swift b/Dependencies/CGMBLEKit/CGMBLEKit/OSLog.swift
deleted file mode 100644
index 67e76120e..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/OSLog.swift
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// OSLog.swift
-// Loop
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import os.log
-
-
-extension OSLog {
- convenience init(category: String) {
- self.init(subsystem: "com.loopkit.CGMBLEKit", category: category)
- }
-
- func debug(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .debug, args)
- }
-
- func info(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .info, args)
- }
-
- func `default`(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .default, args)
- }
-
- func error(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .error, args)
- }
-
- private func log(_ message: StaticString, type: OSLogType, _ args: [CVarArg]) {
- switch args.count {
- case 0:
- os_log(message, log: self, type: type)
- case 1:
- os_log(message, log: self, type: type, args[0])
- case 2:
- os_log(message, log: self, type: type, args[0], args[1])
- case 3:
- os_log(message, log: self, type: type, args[0], args[1], args[2])
- case 4:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3])
- case 5:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3], args[4])
- default:
- os_log(message, log: self, type: type, args)
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Opcode.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Opcode.swift
deleted file mode 100644
index 233c2382f..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Opcode.swift
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// Opcode.swift
-// xDripG5
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-enum Opcode: UInt8 {
- // Auth
- case authRequestTx = 0x01
-
- case authRequestRx = 0x03
- case authChallengeTx = 0x04
- case authChallengeRx = 0x05
- case keepAlive = 0x06 // auth; setAdvertisementParametersTx for control
- case bondRequest = 0x07
-
- // Control
- case disconnectTx = 0x09
-
- case setAdvertisementParametersRx = 0x1c
-
- case firmwareVersionTx = 0x20
- case firmwareVersionRx = 0x21
- case batteryStatusTx = 0x22
- case batteryStatusRx = 0x23
- case transmitterTimeTx = 0x24
- case transmitterTimeRx = 0x25
- case sessionStartTx = 0x26
- case sessionStartRx = 0x27
- case sessionStopTx = 0x28
- case sessionStopRx = 0x29
-
- case glucoseTx = 0x30
- case glucoseRx = 0x31
- case calibrationDataTx = 0x32
- case calibrationDataRx = 0x33
- case calibrateGlucoseTx = 0x34
- case calibrateGlucoseRx = 0x35
-
- case glucoseHistoryTx = 0x3e
-
- case resetTx = 0x42
- case resetRx = 0x43
-
- case transmitterVersionTx = 0x4a
- case transmitterVersionRx = 0x4b
-
- case glucoseG6Tx = 0x4e
- case glucoseG6Rx = 0x4f
-
- case glucoseBackfillTx = 0x50
- case glucoseBackfillRx = 0x51
-}
-
-
-extension Data {
- init(for opcode: Opcode) {
- self.init([opcode.rawValue])
- }
-
- func starts(with opcode: Opcode) -> Bool {
- guard count > 0 else {
- return false
- }
-
- return self[startIndex] == opcode.rawValue
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManager+G5.swift b/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManager+G5.swift
deleted file mode 100644
index b0114529b..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManager+G5.swift
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-// PeripheralManager+G5.swift
-// xDripG5
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import CoreBluetooth
-import os.log
-
-
-private let log = OSLog(category: "PeripheralManager+G5")
-
-
-extension PeripheralManager {
- private func getCharacteristicWithUUID(_ uuid: CGMServiceCharacteristicUUID) -> CBCharacteristic? {
- return peripheral.getCharacteristicWithUUID(uuid)
- }
-
- func setNotifyValue(_ enabled: Bool,
- for characteristicUUID: CGMServiceCharacteristicUUID,
- timeout: TimeInterval = 2) throws
- {
- guard let characteristic = getCharacteristicWithUUID(characteristicUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- try setNotifyValue(enabled, for: characteristic, timeout: timeout)
- }
-
- func readMessage(
- for characteristicUUID: CGMServiceCharacteristicUUID,
- timeout: TimeInterval = 2
- ) throws -> R
- {
- guard let characteristic = getCharacteristicWithUUID(characteristicUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- var capturedResponse: R?
-
- try runCommand(timeout: timeout) {
- addCondition(.valueUpdate(characteristic: characteristic, matching: { (data) -> Bool in
- guard let value = data else {
- return false
- }
-
- guard let response = R(data: value) else {
- // We don't recognize the contents. Keep listening.
- return false
- }
-
- capturedResponse = response
- return true
- }))
-
- peripheral.readValue(for: characteristic)
- }
-
- guard let response = capturedResponse else {
- // TODO: This is an "unknown value" issue, not a timeout
- if let value = characteristic.value {
- log.error("Unknown response data: %{public}@", value.hexadecimalString)
- }
- throw PeripheralManagerError.timeout
- }
-
- return response
- }
-
- /// - Throws: PeripheralManagerError
- func writeMessage(_ message: T,
- for characteristicUUID: CGMServiceCharacteristicUUID,
- type: CBCharacteristicWriteType = .withResponse,
- timeout: TimeInterval = 2
- ) throws -> T.Response
- {
- guard let characteristic = getCharacteristicWithUUID(characteristicUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- var capturedResponse: T.Response?
-
- try runCommand(timeout: timeout) {
- if case .withResponse = type {
- addCondition(.write(characteristic: characteristic))
- }
-
- if characteristic.isNotifying {
- addCondition(.valueUpdate(characteristic: characteristic, matching: { (data) -> Bool in
- guard let value = data else {
- return false
- }
-
- guard let response = T.Response(data: value) else {
- // We don't recognize the contents. Keep listening.
- return false
- }
-
- capturedResponse = response
- return true
- }))
- }
-
- peripheral.writeValue(message.data, for: characteristic, type: type)
- }
-
- guard let response = capturedResponse else {
- // TODO: This is an "unknown value" issue, not a timeout
- if let value = characteristic.value {
- log.error("Unknown response data: %{public}@", value.hexadecimalString)
- }
- throw PeripheralManagerError.timeout
- }
-
- return response
- }
-
- /// - Throws: PeripheralManagerError
- func writeMessage(_ message: TransmitterTxMessage,
- for characteristicUUID: CGMServiceCharacteristicUUID,
- type: CBCharacteristicWriteType = .withResponse,
- timeout: TimeInterval = 2) throws
- {
- guard let characteristic = getCharacteristicWithUUID(characteristicUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- try writeValue(message.data, for: characteristic, type: type, timeout: timeout)
- }
-}
-
-
-fileprivate extension CBPeripheral {
- func getServiceWithUUID(_ uuid: TransmitterServiceUUID) -> CBService? {
- return services?.itemWithUUIDString(uuid.rawValue)
- }
-
- func getCharacteristicForServiceUUID(_ serviceUUID: TransmitterServiceUUID, withUUIDString UUIDString: String) -> CBCharacteristic? {
- guard let characteristics = getServiceWithUUID(serviceUUID)?.characteristics else {
- return nil
- }
-
- return characteristics.itemWithUUIDString(UUIDString)
- }
-
- func getCharacteristicWithUUID(_ uuid: CGMServiceCharacteristicUUID) -> CBCharacteristic? {
- return getCharacteristicForServiceUUID(.cgmService, withUUIDString: uuid.rawValue)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManager.swift b/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManager.swift
deleted file mode 100644
index 8239e101c..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManager.swift
+++ /dev/null
@@ -1,471 +0,0 @@
-//
-// PeripheralManager.swift
-// xDripG5
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import os.log
-
-
-class PeripheralManager: NSObject {
-
- private let log = OSLog(category: "PeripheralManager")
-
- ///
- /// This is mutable, because CBPeripheral instances can seemingly become invalid, and need to be periodically re-fetched from CBCentralManager
- var peripheral: CBPeripheral {
- didSet {
- guard oldValue !== peripheral else {
- return
- }
-
- log.error("Replacing peripheral reference %{public}@ -> %{public}@", oldValue, peripheral)
-
- oldValue.delegate = nil
- peripheral.delegate = self
-
- queue.sync {
- self.needsConfiguration = true
- }
- }
- }
-
- /// The dispatch queue used to serialize operations on the peripheral
- let queue = DispatchQueue(label: "com.loopkit.PeripheralManager.queue", qos: .unspecified)
-
- /// The condition used to signal command completion
- private let commandLock = NSCondition()
-
- /// The required conditions for the operation to complete
- private var commandConditions = [CommandCondition]()
-
- /// Any error surfaced during the active operation
- private var commandError: Error?
-
- private(set) weak var central: CBCentralManager?
-
- let configuration: Configuration
-
- // Confined to `queue`
- private var needsConfiguration = true
-
- weak var delegate: PeripheralManagerDelegate? {
- didSet {
- queue.sync {
- needsConfiguration = true
- }
- }
- }
-
- init(peripheral: CBPeripheral, configuration: Configuration, centralManager: CBCentralManager) {
- self.peripheral = peripheral
- self.central = centralManager
- self.configuration = configuration
-
- super.init()
-
- peripheral.delegate = self
-
- assertConfiguration()
- }
-}
-
-
-// MARK: - Nested types
-extension PeripheralManager {
- struct Configuration {
- var serviceCharacteristics: [CBUUID: [CBUUID]] = [:]
- var notifyingCharacteristics: [CBUUID: [CBUUID]] = [:]
- var valueUpdateMacros: [CBUUID: (_ manager: PeripheralManager) -> Void] = [:]
- }
-
- enum CommandCondition {
- case notificationStateUpdate(characteristicUUID: CBUUID, enabled: Bool)
- case valueUpdate(characteristic: CBCharacteristic, matching: ((Data?) -> Bool)?)
- case write(characteristic: CBCharacteristic)
- case discoverServices
- case discoverCharacteristicsForService(serviceUUID: CBUUID)
- }
-}
-
-protocol PeripheralManagerDelegate: AnyObject {
- func peripheralManager(_ manager: PeripheralManager, didUpdateValueFor characteristic: CBCharacteristic)
-
- func peripheralManager(_ manager: PeripheralManager, didReadRSSI RSSI: NSNumber, error: Error?)
-
- func peripheralManagerDidUpdateName(_ manager: PeripheralManager)
-
- func completeConfiguration(for manager: PeripheralManager) throws
-}
-
-
-// MARK: - Operation sequence management
-extension PeripheralManager {
- func configureAndRun(_ block: @escaping (_ manager: PeripheralManager) -> Void) -> (() -> Void) {
- return {
- if !self.needsConfiguration && self.peripheral.services == nil {
- self.log.error("Configured peripheral has no services. Reconfiguring…")
- }
-
- if self.needsConfiguration || self.peripheral.services == nil {
- do {
- try self.applyConfiguration()
- self.log.default("Peripheral configuration completed")
- } catch let error {
- self.log.error("Error applying peripheral configuration: %@", String(describing: error))
- // Will retry
- }
-
- do {
- if let delegate = self.delegate {
- try delegate.completeConfiguration(for: self)
- self.log.default("Delegate configuration completed")
- self.needsConfiguration = false
- } else {
- self.log.error("No delegate set configured")
- }
- } catch let error {
- self.log.error("Error applying delegate configuration: %@", String(describing: error))
- // Will retry
- }
- }
-
- block(self)
- }
- }
-
- func perform(_ block: @escaping (_ manager: PeripheralManager) -> Void) {
- queue.async(execute: configureAndRun(block))
- }
-
- private func assertConfiguration() {
- perform { (_) in
- // Intentionally empty to trigger configuration if necessary
- }
- }
-
- private func applyConfiguration(discoveryTimeout: TimeInterval = 2) throws {
- try discoverServices(configuration.serviceCharacteristics.keys.map { $0 }, timeout: discoveryTimeout)
-
- for service in peripheral.services ?? [] {
- guard let characteristics = configuration.serviceCharacteristics[service.uuid] else {
- // Not all services may have characteristics
- continue
- }
-
- try discoverCharacteristics(characteristics, for: service, timeout: discoveryTimeout)
- }
-
- for (serviceUUID, characteristicUUIDs) in configuration.notifyingCharacteristics {
- guard let service = peripheral.services?.itemWithUUID(serviceUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- for characteristicUUID in characteristicUUIDs {
- guard let characteristic = service.characteristics?.itemWithUUID(characteristicUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- guard !characteristic.isNotifying else {
- continue
- }
-
- try setNotifyValue(true, for: characteristic, timeout: discoveryTimeout)
- }
- }
- }
-}
-
-
-// MARK: - Synchronous Commands
-extension PeripheralManager {
- /// - Throws: PeripheralManagerError
- func runCommand(timeout: TimeInterval, command: () -> Void) throws {
- // Prelude
- dispatchPrecondition(condition: .onQueue(queue))
- guard central?.state == .poweredOn && peripheral.state == .connected else {
- throw PeripheralManagerError.notReady
- }
-
- commandLock.lock()
-
- defer {
- commandLock.unlock()
- }
-
- guard commandConditions.isEmpty else {
- throw PeripheralManagerError.invalidConfiguration
- }
-
- // Run
- command()
-
- guard !commandConditions.isEmpty else {
- // If the command didn't add any conditions, then finish immediately
- return
- }
-
- // Postlude
- let signaled = commandLock.wait(until: Date(timeIntervalSinceNow: timeout))
-
- defer {
- commandError = nil
- commandConditions = []
- }
-
- guard signaled else {
- throw PeripheralManagerError.timeout
- }
-
- if let error = commandError {
- throw PeripheralManagerError.cbPeripheralError(error)
- }
- }
-
- /// It's illegal to call this without first acquiring the commandLock
- ///
- /// - Parameter condition: The condition to add
- func addCondition(_ condition: CommandCondition) {
- dispatchPrecondition(condition: .onQueue(queue))
- commandConditions.append(condition)
- }
-
- func discoverServices(_ serviceUUIDs: [CBUUID], timeout: TimeInterval) throws {
- let servicesToDiscover = peripheral.servicesToDiscover(from: serviceUUIDs)
-
- guard servicesToDiscover.count > 0 else {
- return
- }
-
- try runCommand(timeout: timeout) {
- addCondition(.discoverServices)
-
- peripheral.discoverServices(serviceUUIDs)
- }
- }
-
- func discoverCharacteristics(_ characteristicUUIDs: [CBUUID], for service: CBService, timeout: TimeInterval) throws {
- let characteristicsToDiscover = peripheral.characteristicsToDiscover(from: characteristicUUIDs, for: service)
-
- guard characteristicsToDiscover.count > 0 else {
- return
- }
-
- try runCommand(timeout: timeout) {
- addCondition(.discoverCharacteristicsForService(serviceUUID: service.uuid))
-
- peripheral.discoverCharacteristics(characteristicsToDiscover, for: service)
- }
- }
-
- /// - Throws: PeripheralManagerError
- func setNotifyValue(_ enabled: Bool, for characteristic: CBCharacteristic, timeout: TimeInterval) throws {
- try runCommand(timeout: timeout) {
- addCondition(.notificationStateUpdate(characteristicUUID: characteristic.uuid, enabled: enabled))
-
- peripheral.setNotifyValue(enabled, for: characteristic)
- }
- }
-
- /// - Throws: PeripheralManagerError
- func readValue(for characteristic: CBCharacteristic, timeout: TimeInterval) throws -> Data? {
- try runCommand(timeout: timeout) {
- addCondition(.valueUpdate(characteristic: characteristic, matching: nil))
-
- peripheral.readValue(for: characteristic)
- }
-
- return characteristic.value
- }
-
- /// - Throws: PeripheralManagerError
- func wait(for characteristic: CBCharacteristic, timeout: TimeInterval) throws -> Data {
- try runCommand(timeout: timeout) {
- addCondition(.valueUpdate(characteristic: characteristic, matching: nil))
- }
-
- guard let value = characteristic.value else {
- throw PeripheralManagerError.timeout
- }
-
- return value
- }
-
- /// - Throws: PeripheralManagerError
- func writeValue(_ value: Data, for characteristic: CBCharacteristic, type: CBCharacteristicWriteType, timeout: TimeInterval) throws {
- try runCommand(timeout: timeout) {
- if case .withResponse = type {
- addCondition(.write(characteristic: characteristic))
- }
-
- peripheral.writeValue(value, for: characteristic, type: type)
- }
- }
-}
-
-
-// MARK: - Delegate methods executed on the central's queue
-extension PeripheralManager: CBPeripheralDelegate {
-
- func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .discoverServices = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .discoverCharacteristicsForService(serviceUUID: service.uuid) = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .notificationStateUpdate(characteristicUUID: characteristic.uuid, enabled: characteristic.isNotifying) = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .write(characteristic: characteristic) = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
- commandLock.lock()
-
- var notifyDelegate = false
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .valueUpdate(characteristic: characteristic, matching: let matching) = condition {
- return matching?(characteristic.value) ?? true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- } else if let macro = configuration.valueUpdateMacros[characteristic.uuid] {
- macro(self)
- } else if commandConditions.isEmpty {
- notifyDelegate = true // execute after the unlock
- }
-
- commandLock.unlock()
-
- if notifyDelegate {
- // If we weren't expecting this notification, pass it along to the delegate
- delegate?.peripheralManager(self, didUpdateValueFor: characteristic)
- }
- }
-
- func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) {
- delegate?.peripheralManager(self, didReadRSSI: RSSI, error: error)
- }
-
- func peripheralDidUpdateName(_ peripheral: CBPeripheral) {
- delegate?.peripheralManagerDidUpdateName(self)
- }
-}
-
-
-extension PeripheralManager: CBCentralManagerDelegate {
- func centralManagerDidUpdateState(_ central: CBCentralManager) {
- switch central.state {
- case .poweredOn:
- assertConfiguration()
- default:
- break
- }
- }
-
- func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
- switch peripheral.state {
- case .connected:
- assertConfiguration()
- default:
- break
- }
- }
-}
-
-
-extension PeripheralManager {
- public override var debugDescription: String {
- var items = [
- "## PeripheralManager",
- "peripheral: \(peripheral)",
- ]
- queue.sync {
- items.append("needsConfiguration: \(needsConfiguration)")
- }
- return items.joined(separator: "\n")
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManagerError.swift b/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManagerError.swift
deleted file mode 100644
index 6c599eca4..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/PeripheralManagerError.swift
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// PeripheralManagerError.swift
-// xDripG5
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import CoreBluetooth
-
-
-enum PeripheralManagerError: Error {
- case cbPeripheralError(Error)
- case notReady
- case invalidConfiguration
- case timeout
- case unknownCharacteristic
-}
-
-
-extension PeripheralManagerError: LocalizedError {
- var errorDescription: String? {
- switch self {
- case .cbPeripheralError(let error):
- return error.localizedDescription
- case .notReady:
- return LocalizedString("Peripheral isnʼt connected", comment: "Not ready error description")
- case .invalidConfiguration:
- return LocalizedString("Peripheral command was invalid", comment: "invlid config error description")
- case .timeout:
- return LocalizedString("Peripheral did not respond in time", comment: "Timeout error description")
- case .unknownCharacteristic:
- return LocalizedString("Unknown characteristic", comment: "Error description")
- }
- }
-
- var failureReason: String? {
- switch self {
- case .cbPeripheralError(let error as NSError):
- return error.localizedFailureReason
- default:
- return errorDescription
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/Transmitter.swift b/Dependencies/CGMBLEKit/CGMBLEKit/Transmitter.swift
deleted file mode 100644
index 4484e1ecc..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/Transmitter.swift
+++ /dev/null
@@ -1,576 +0,0 @@
-//
-// Transmitter.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 11/22/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-import CoreBluetooth
-import HealthKit
-import os.log
-
-
-public protocol TransmitterDelegate: AnyObject {
- func transmitterDidConnect(_ transmitter: Transmitter)
-
- func transmitter(_ transmitter: Transmitter, didError error: Error)
-
- func transmitter(_ transmitter: Transmitter, didRead glucose: Glucose)
-
- func transmitter(_ transmitter: Transmitter, didReadBackfill glucose: [Glucose])
-
- func transmitter(_ transmitter: Transmitter, didReadUnknownData data: Data)
-}
-
-/// These methods are called on a private background queue. It is the responsibility of the client to ensure thread-safety.
-public protocol TransmitterCommandSource: AnyObject {
- func dequeuePendingCommand(for transmitter: Transmitter) -> Command?
-
- func transmitter(_ transmitter: Transmitter, didFail command: Command, with error: Error)
-
- func transmitter(_ transmitter: Transmitter, didComplete command: Command)
-}
-
-public enum TransmitterError: Error {
- case authenticationError(String)
- case controlError(String)
- case observationError(String)
-}
-
-extension TransmitterError: CustomStringConvertible {
- public var description: String {
- switch self {
- case .authenticationError(let description):
- return description
- case .controlError(let description):
- return description
- case .observationError(let description):
- return description
- }
- }
-}
-
-
-public final class Transmitter: BluetoothManagerDelegate {
-
- /// The ID of the transmitter to connect to
- public var ID: String {
- return id.id
- }
-
- private var id: TransmitterID
-
- public var passiveModeEnabled: Bool
-
- public weak var delegate: TransmitterDelegate?
-
- public weak var commandSource: TransmitterCommandSource?
-
- // MARK: - Passive observation state, confined to `bluetoothManager.managerQueue`
-
- /// The initial activation date of the transmitter
- private var activationDate: Date?
-
- /// The last-observed time message
- private var lastTimeMessage: TransmitterTimeRxMessage? {
- didSet {
- if let time = lastTimeMessage {
- activationDate = Date(timeIntervalSinceNow: -TimeInterval(time.currentTime))
- } else {
- activationDate = nil
- }
- }
- }
-
- /// The last-observed calibration message
- private var lastCalibrationMessage: CalibrationDataRxMessage?
-
- /// The backfill data buffer
- private var backfillBuffer: GlucoseBackfillFrameBuffer?
-
- // MARK: -
-
- private let log = OSLog(category: "Transmitter")
-
- private let bluetoothManager = BluetoothManager()
-
- private let delegateQueue = DispatchQueue(label: "com.loudnate.CGMBLEKit.delegateQueue", qos: .unspecified)
-
- public init(id: String, peripheralIdentifier: UUID? = nil, passiveModeEnabled: Bool = false) {
- self.id = TransmitterID(id: id)
- self.passiveModeEnabled = passiveModeEnabled
-
- bluetoothManager.peripheralIdentifier = peripheralIdentifier
- bluetoothManager.delegate = self
- }
-
- public func resumeScanning() {
- if stayConnected {
- bluetoothManager.scanForPeripheral()
- }
- }
-
- public func stopScanning() {
- bluetoothManager.disconnect()
- }
-
- public var isScanning: Bool {
- return bluetoothManager.isScanning
- }
-
- public var peripheralIdentifier: UUID? {
- get {
- return bluetoothManager.peripheralIdentifier
- }
- set {
- bluetoothManager.peripheralIdentifier = newValue
- }
- }
-
- public var stayConnected: Bool {
- get {
- return bluetoothManager.stayConnected
- }
- set {
- bluetoothManager.stayConnected = newValue
-
- if newValue {
- bluetoothManager.scanForPeripheral()
- }
- }
- }
-
- // MARK: - BluetoothManagerDelegate
-
- func bluetoothManager(_ manager: BluetoothManager, peripheralManager: PeripheralManager, isReadyWithError error: Error?) {
- if let error = error {
- delegateQueue.async {
- self.delegate?.transmitter(self, didError: error)
- }
- return
- }
-
- delegateQueue.async {
- self.delegate?.transmitterDidConnect(self)
- }
-
- peripheralManager.perform { (peripheral) in
- if self.passiveModeEnabled {
- self.log.debug("Listening for authentication responses in passive mode")
- do {
- try peripheral.listenToCharacteristic(.authentication)
- } catch let error {
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: error)
- }
- }
- } else {
- do {
- self.log.debug("Authenticating with transmitter")
- let status = try peripheral.authenticate(id: self.id)
-
- if !status.isBonded {
- self.log.debug("Requesting bond")
- try peripheral.requestBond()
-
- self.log.debug("Bonding request sent. Waiting user to respond.")
- }
-
- try peripheral.enableNotify(shouldWaitForBond: !status.isBonded)
- defer {
- self.log.debug("Initiating a disconnect")
- peripheral.disconnect()
- }
-
- self.log.debug("Reading time")
- let timeMessage = try peripheral.readTimeMessage()
-
- let activationDate = Date(timeIntervalSinceNow: -TimeInterval(timeMessage.currentTime))
- self.log.debug("Determined activation date: %@", String(describing: activationDate))
-
- while let command = self.commandSource?.dequeuePendingCommand(for: self) {
- self.log.debug("Sending command: %@", String(describing: command))
- do {
- _ = try peripheral.sendCommand(command, activationDate: activationDate)
- self.commandSource?.transmitter(self, didComplete: command)
- } catch let error {
- self.commandSource?.transmitter(self, didFail: command, with: error)
- }
- }
-
- self.log.debug("Reading glucose")
- let glucoseMessage = try peripheral.readGlucose()
- self.log.debug("Reading calibration data")
- let calibrationMessage = try? peripheral.readCalibrationData()
-
- let glucose = Glucose(
- transmitterID: self.id.id,
- glucoseMessage: glucoseMessage,
- timeMessage: timeMessage,
- calibrationMessage: calibrationMessage,
- activationDate: activationDate
- )
-
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didRead: glucose)
- }
- } catch let error {
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: error)
- }
- }
- }
- }
- }
-
- func bluetoothManager(_ manager: BluetoothManager, shouldConnectPeripheral peripheral: CBPeripheral) -> Bool {
- /// The Dexcom G5 advertises a peripheral name of "DexcomXX"
- /// where "XX" is the last-two characters of the transmitter ID.
- if let name = peripheral.name, name.suffix(2) == id.id.suffix(2) {
- return true
- } else {
- self.log.info("Not connecting to peripheral: %{public}@", peripheral.name ?? String(describing: peripheral))
- return false
- }
- }
-
- func bluetoothManager(_ manager: BluetoothManager, peripheralManager: PeripheralManager, didReceiveControlResponse response: Data) {
- guard passiveModeEnabled else { return }
-
- guard response.count > 0 else { return }
-
- switch Opcode(rawValue: response[0]) {
- case .glucoseRx?, .glucoseG6Rx?:
- if let glucoseMessage = GlucoseRxMessage(data: response),
- let timeMessage = lastTimeMessage,
- let activationDate = activationDate
- {
- delegateQueue.async {
- self.delegate?.transmitter(self, didRead: Glucose(transmitterID: self.id.id, glucoseMessage: glucoseMessage, timeMessage: timeMessage, calibrationMessage: self.lastCalibrationMessage, activationDate: activationDate))
- }
- } else {
- delegateQueue.async {
- self.delegate?.transmitter(self, didError: TransmitterError.observationError("Unable to handle glucose control response"))
- }
- }
-
- peripheralManager.perform { (peripheral) in
- // Subscribe to backfill updates
- do {
- try peripheral.listenToCharacteristic(.backfill)
- } catch let error {
- self.log.error("Error trying to enable notifications on backfill characteristic: %{public}@", String(describing: error))
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: error)
- }
- }
- }
- case .transmitterTimeRx?:
- if let timeMessage = TransmitterTimeRxMessage(data: response) {
- self.lastTimeMessage = timeMessage
- }
- case .glucoseBackfillRx?:
- guard let backfillMessage = GlucoseBackfillRxMessage(data: response) else {
- break
- }
-
- guard let backfillBuffer = backfillBuffer else {
- log.error("Received GlucoseBackfillRxMessage %{public}@ but backfillBuffer is nil", String(describing: backfillMessage))
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: TransmitterError.observationError("Received GlucoseBackfillRxMessage but backfillBuffer is nil"))
- }
- break
- }
-
- guard let timeMessage = lastTimeMessage, let activationDate = activationDate else {
- log.error("Received GlucoseBackfillRxMessage %{public}@ but activationDate is unknown", String(describing: backfillMessage))
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: TransmitterError.observationError("Received GlucoseBackfillRxMessage but activationDate is unknown"))
- }
- break
- }
-
- guard backfillMessage.bufferLength == backfillBuffer.count else {
- log.error("GlucoseBackfillRxMessage expected buffer length %d, but was %d", backfillMessage.bufferLength, backfillBuffer.count)
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: TransmitterError.observationError("GlucoseBackfillRxMessage expected buffer length \(backfillMessage.bufferLength), but was \(backfillBuffer.count): \(response.hexadecimalString) "))
- }
- break
- }
-
- guard backfillMessage.bufferCRC == backfillBuffer.crc16 else {
- log.error("GlucoseBackfillRxMessage expected CRC %04x, but was %04x", backfillMessage.bufferCRC, backfillBuffer.crc16)
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: TransmitterError.observationError("GlucoseBackfillRxMessage expected CRC \(backfillMessage.bufferCRC), but was \(backfillBuffer.crc16)"))
- }
- break
- }
-
- let glucose = backfillBuffer.glucose.map {
- Glucose(transmitterID: id.id, status: backfillMessage.status, glucoseMessage: $0, timeMessage: timeMessage, activationDate: activationDate)
- }
-
- guard glucose.count > 0 else {
- break
- }
-
- guard glucose.first!.glucoseMessage.timestamp == backfillMessage.startTime,
- glucose.last!.glucoseMessage.timestamp == backfillMessage.endTime,
- glucose.first!.glucoseMessage.timestamp <= glucose.last!.glucoseMessage.timestamp
- else {
- log.error("GlucoseBackfillRxMessage time interval not reflected in glucose: %{public}@, buffer: %{public}@", response.hexadecimalString, String(reflecting: backfillBuffer))
-
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: TransmitterError.observationError("GlucoseBackfillRxMessage time interval not reflected in glucose: \(backfillMessage.startTime) - \(backfillMessage.endTime), buffer: \(glucose.first!.glucoseMessage.timestamp) - \(glucose.last!.glucoseMessage.timestamp)"))
- }
- break
- }
-
- delegateQueue.async {
- self.delegate?.transmitter(self, didReadBackfill: glucose)
- }
- case .calibrationDataRx?:
- guard let calibrationDataMessage = CalibrationDataRxMessage(data: response) else {
- break
- }
-
- lastCalibrationMessage = calibrationDataMessage
- case .none:
- delegateQueue.async {
- self.delegate?.transmitter(self, didReadUnknownData: response)
- }
- default:
- // We ignore all other known opcodes
- break
- }
- }
-
- func bluetoothManager(_ manager: BluetoothManager, didReceiveBackfillResponse response: Data) {
- guard response.count > 2 else {
- return
- }
-
- if response[0] == 1 {
- log.info("Starting new backfill buffer with ID %d", response[1])
-
- self.backfillBuffer = GlucoseBackfillFrameBuffer(identifier: response[1])
- }
-
- log.info("appending to backfillBuffer: %@", response.hexadecimalString)
-
- self.backfillBuffer?.append(response)
- }
-
- func bluetoothManager(_ manager: BluetoothManager, peripheralManager: PeripheralManager, didReceiveAuthenticationResponse response: Data) {
-
- if let message = AuthChallengeRxMessage(data: response), message.isBonded, message.isAuthenticated {
- self.log.debug("Observed authenticated session. enabling notifications for control characteristic.")
- peripheralManager.perform { (peripheral) in
- // Stopping updates from authentication simultaneously with Dexcom's app causes CoreBluetooth to get into a weird state.
- /*
- do {
- try peripheral.stopListeningToCharacteristic(.authentication)
- } catch let error {
- self.log.error("Error trying to disable notifications on authentication characteristic: %{public}@", String(describing: error))
- }
- */
-
- do {
- try peripheral.listenToCharacteristic(.control)
- } catch let error {
- self.log.error("Error trying to enable notifications on control characteristic: %{public}@", String(describing: error))
- self.delegateQueue.async {
- self.delegate?.transmitter(self, didError: error)
- }
- }
- }
- } else {
- self.log.debug("Ignoring authentication response: %{public}@", response.hexadecimalString)
- }
- }
-}
-
-extension Transmitter: CustomDebugStringConvertible {
- public var debugDescription: String {
- return [
- "## Transmitter",
- String(reflecting: bluetoothManager),
- ].joined(separator: "\n")
- }
-}
-
-
-struct TransmitterID {
- let id: String
-
- init(id: String) {
- self.id = id
- }
-
- private var cryptKey: Data? {
- return "00\(id)00\(id)".data(using: .utf8)
- }
-
- func computeHash(of data: Data) -> Data? {
- guard data.count == 8, let key = cryptKey else {
- return nil
- }
-
- var doubleData = Data(capacity: data.count * 2)
- doubleData.append(data)
- doubleData.append(data)
-
- guard let outData = try? AESCrypt.encryptData(doubleData, usingKey: key) else {
- return nil
- }
-
- return outData[0..<8]
- }
-}
-
-
-// MARK: - Helpers
-fileprivate extension PeripheralManager {
- func authenticate(id: TransmitterID) throws -> AuthChallengeRxMessage {
- let authMessage = AuthRequestTxMessage()
-
- do {
- try writeMessage(authMessage, for: .authentication)
- } catch let error {
- throw TransmitterError.authenticationError("Error writing transmitter challenge: \(error)")
- }
-
- let authResponse: AuthRequestRxMessage
- do {
- authResponse = try readMessage(for: .authentication)
- } catch let error {
- throw TransmitterError.authenticationError("Unable to parse auth challenge: \(error)")
- }
-
- guard authResponse.tokenHash == id.computeHash(of: authMessage.singleUseToken) else {
- throw TransmitterError.authenticationError("Transmitter failed auth challenge")
- }
-
- guard let challengeHash = id.computeHash(of: authResponse.challenge) else {
- throw TransmitterError.authenticationError("Failed to compute challenge hash for transmitter ID")
- }
-
- do {
- try writeMessage(AuthChallengeTxMessage(challengeHash: challengeHash), for: .authentication)
- } catch let error {
- throw TransmitterError.authenticationError("Error writing challenge response: \(error)")
- }
-
- let challengeResponse: AuthChallengeRxMessage
- do {
- challengeResponse = try readMessage(for: .authentication)
- } catch let error {
- throw TransmitterError.authenticationError("Unable to parse auth status: \(error)")
- }
-
- guard challengeResponse.isAuthenticated else {
- throw TransmitterError.authenticationError("Transmitter rejected auth challenge")
- }
-
- return challengeResponse
- }
-
- func requestBond() throws {
- do {
- try writeMessage(KeepAliveTxMessage(time: 25), for: .authentication)
- } catch let error {
- throw TransmitterError.authenticationError("Error writing keep-alive for bond: \(error)")
- }
-
- do {
- try writeMessage(BondRequestTxMessage(), for: .authentication)
- } catch let error {
- throw TransmitterError.authenticationError("Error writing bond request: \(error)")
- }
- }
-
- func enableNotify(shouldWaitForBond: Bool = false) throws {
- do {
- if shouldWaitForBond {
- try setNotifyValue(true, for: .control, timeout: 15)
- } else {
- try setNotifyValue(true, for: .control)
- }
- } catch let error {
- throw TransmitterError.controlError("Error enabling notification: \(error)")
- }
- }
-
- func readTimeMessage() throws -> TransmitterTimeRxMessage {
- do {
- return try writeMessage(TransmitterTimeTxMessage(), for: .control)
- } catch let error {
- throw TransmitterError.controlError("Error getting time: \(error)")
- }
- }
-
- /// - Throws: TransmitterError.controlError
- func sendCommand(_ command: Command, activationDate: Date) throws -> TransmitterRxMessage {
- do {
- switch command {
- case .startSensor(let date):
- let startTime = UInt32(date.timeIntervalSince(activationDate))
- let secondsSince1970 = UInt32(date.timeIntervalSince1970)
- return try writeMessage(SessionStartTxMessage(startTime: startTime, secondsSince1970: secondsSince1970), for: .control)
- case .stopSensor(let date):
- let stopTime = UInt32(date.timeIntervalSince(activationDate))
- return try writeMessage(SessionStopTxMessage(stopTime: stopTime), for: .control)
- case .calibrateSensor(let glucose, let date):
- let glucoseValue = UInt16(glucose.doubleValue(for: .milligramsPerDeciliter).rounded())
- let time = UInt32(date.timeIntervalSince(activationDate))
- return try writeMessage(CalibrateGlucoseTxMessage(time: time, glucose: glucoseValue), for: .control)
- case .resetTransmitter:
- return try writeMessage(ResetTxMessage(), for: .control)
- }
- } catch let error {
- throw TransmitterError.controlError("Error during \(command): \(error)")
- }
- }
-
- func readGlucose() throws -> GlucoseRxMessage {
- do {
- return try writeMessage(GlucoseTxMessage(), for: .control)
- } catch let error {
- throw TransmitterError.controlError("Error getting glucose: \(error)")
- }
- }
-
- func readCalibrationData() throws -> CalibrationDataRxMessage {
- do {
- return try writeMessage(CalibrationDataTxMessage(), for: .control)
- } catch let error {
- throw TransmitterError.controlError("Error getting calibration data: \(error)")
- }
- }
-
- func disconnect() {
- do {
- try setNotifyValue(false, for: .control)
- try writeMessage(DisconnectTxMessage(), for: .control)
- } catch {
- }
- }
-
- func listenToCharacteristic(_ characteristic: CGMServiceCharacteristicUUID) throws {
- do {
- try setNotifyValue(true, for: characteristic)
- } catch let error {
- throw TransmitterError.controlError("Error enabling notification for \(characteristic): \(error)")
- }
- }
-
- func stopListeningToCharacteristic(_ characteristic: CGMServiceCharacteristicUUID) throws {
- do {
- try setNotifyValue(false, for: characteristic)
- } catch let error {
- throw TransmitterError.controlError("Error disabling notification for \(characteristic): \(error)")
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/TransmitterManager.swift b/Dependencies/CGMBLEKit/CGMBLEKit/TransmitterManager.swift
deleted file mode 100644
index 4942087c2..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/TransmitterManager.swift
+++ /dev/null
@@ -1,523 +0,0 @@
-//
-// TransmitterManager.swift
-// Loop
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import HealthKit
-import LoopKit
-import ShareClient
-import os.log
-
-
-public struct TransmitterManagerState: RawRepresentable, Equatable {
- public typealias RawValue = CGMManager.RawStateValue
-
- public static let version = 1
-
- public var transmitterID: String
-
- public var passiveModeEnabled: Bool = true
-
- public var shouldSyncToRemoteService: Bool
-
- public init(transmitterID: String, shouldSyncToRemoteService: Bool = false) {
- self.transmitterID = transmitterID
- self.shouldSyncToRemoteService = shouldSyncToRemoteService
- }
-
- public init?(rawValue: RawValue) {
- guard let transmitterID = rawValue["transmitterID"] as? String
- else {
- return nil
- }
-
- let shouldSyncToRemoteService = rawValue["shouldSyncToRemoteService"] as? Bool ?? false
-
- self.init(transmitterID: transmitterID, shouldSyncToRemoteService: shouldSyncToRemoteService)
- }
-
- public var rawValue: RawValue {
- return [
- "transmitterID": transmitterID,
- "shouldSyncToRemoteService": shouldSyncToRemoteService,
- ]
- }
-}
-
-
-public protocol TransmitterManagerObserver: AnyObject {
- func transmitterManagerDidUpdateLatestReading(_ manager: TransmitterManager)
-}
-
-
-public class TransmitterManager: TransmitterDelegate {
- private var state: TransmitterManagerState
-
- private let observers = WeakSynchronizedSet()
-
-
- public var hasValidSensorSession: Bool {
- // TODO: we should decode and persist transmitter session state
- return !state.transmitterID.isEmpty
- }
-
- public var cgmManagerStatus: CGMManagerStatus {
- return CGMManagerStatus(hasValidSensorSession: hasValidSensorSession, device: device)
- }
-
- public required init(state: TransmitterManagerState) {
- self.state = state
- self.transmitter = Transmitter(id: state.transmitterID, passiveModeEnabled: state.passiveModeEnabled)
- self.shareManager = ShareClientManager()
-
- self.transmitter.delegate = self
-
- #if targetEnvironment(simulator)
- setupSimulatedSampleGenerator()
- #endif
-
- }
-
- #if targetEnvironment(simulator)
- var simulatedSampleGeneratorTimer: DispatchSourceTimer?
-
- private func setupSimulatedSampleGenerator() {
-
- let timer = DispatchSource.makeTimerSource(queue: DispatchQueue(label: "com.loopkit.simulatedSampleGenerator"))
- timer.schedule(deadline: .now() + .seconds(10), repeating: .minutes(5))
- timer.setEventHandler(handler: { [weak self] in
- self?.generateSimulatedSample()
- })
- self.simulatedSampleGeneratorTimer = timer
- timer.resume()
- }
-
- private func generateSimulatedSample() {
- let timestamp = Date()
- let syncIdentifier = "\(self.state.transmitterID) \(timestamp)"
- let period = TimeInterval(hours: 3)
- func glucoseValueFunc(timestamp: Date, period: Double) -> Double {
- return 100 + 20 * cos(timestamp.timeIntervalSinceReferenceDate.remainder(dividingBy: period) / period * Double.pi * 2)
- }
- let glucoseValue = glucoseValueFunc(timestamp: timestamp, period: period)
- let prevGlucoseValue = glucoseValueFunc(timestamp: timestamp - period, period: period)
- let trendRateValue = glucoseValue - prevGlucoseValue
- let trend: GlucoseTrend? = {
- switch trendRateValue {
- case -0.01...0.01:
- return .flat
- case -2 ..< -0.01:
- return .down
- case -5 ..< -2:
- return .downDown
- case -Double.greatestFiniteMagnitude ..< -5:
- return .downDownDown
- case 0.01...2:
- return .up
- case 2...5:
- return .upUp
- case 5...Double.greatestFiniteMagnitude:
- return .upUpUp
- default:
- return nil
- }
- }()
-
- let quantity = HKQuantity(unit: .milligramsPerDeciliter, doubleValue: glucoseValue)
- let trendRate = HKQuantity(unit: .milligramsPerDeciliterPerMinute, doubleValue: trendRateValue)
- let sample = NewGlucoseSample(date: timestamp, quantity: quantity, condition: nil, trend: trend, trendRate: trendRate, isDisplayOnly: false, wasUserEntered: false, syncIdentifier: syncIdentifier)
- self.updateDelegate(with: .newData([sample]))
- }
- #endif
-
- required convenience public init?(rawState: CGMManager.RawStateValue) {
- guard let state = TransmitterManagerState(rawValue: rawState) else {
- return nil
- }
-
- self.init(state: state)
- }
-
- public var rawState: CGMManager.RawStateValue {
- return state.rawValue
- }
-
- func logDeviceCommunication(_ message: String, type: DeviceLogEntryType = .send) {
- }
-
- public var shouldSyncToRemoteService: Bool {
- get {
- return state.shouldSyncToRemoteService
- }
- set {
- self.state.shouldSyncToRemoteService = newValue
- notifyDelegateOfStateChange()
- }
- }
-
- public var cgmManagerDelegate: CGMManagerDelegate? {
- get {
- return shareManager.cgmManagerDelegate
- }
- set {
- shareManager.cgmManagerDelegate = newValue
- }
- }
-
- public var delegateQueue: DispatchQueue! {
- get {
- return shareManager.delegateQueue
- }
- set {
- shareManager.delegateQueue = newValue
- }
- }
-
- private(set) public var latestConnection: Date? {
- get {
- return lockedLatestConnection.value
- }
- set {
- lockedLatestConnection.value = newValue
- }
- }
- private let lockedLatestConnection: Locked = Locked(nil)
-
- public let shareManager: ShareClientManager
-
- public let transmitter: Transmitter
- let log = OSLog(category: "TransmitterManager")
-
- public var providesBLEHeartbeat: Bool {
- return dataIsFresh
- }
-
- public var glucoseDisplay: GlucoseDisplayable? {
- let transmitterDate = latestReading?.readDate ?? .distantPast
- let shareDate = shareManager.latestBackfill?.startDate ?? .distantPast
-
- if transmitterDate >= shareDate {
- return latestReading
- } else {
- return shareManager.glucoseDisplay
- }
- }
-
- public var managedDataInterval: TimeInterval? {
- if transmitter.passiveModeEnabled {
- return .hours(3)
- }
-
- return shareManager.managedDataInterval
- }
-
- private(set) public var latestReading: Glucose? {
- get {
- return lockedLatestReading.value
- }
- set {
- lockedLatestReading.value = newValue
- }
- }
- private let lockedLatestReading: Locked = Locked(nil)
-
- private var dataIsFresh: Bool {
- guard let latestGlucose = latestReading,
- latestGlucose.readDate > Date(timeIntervalSinceNow: .minutes(-4.5)) else {
- return false
- }
-
- return true
- }
-
- public func fetchNewDataIfNeeded(_ completion: @escaping (CGMReadingResult) -> Void) {
- // Ensure our transmitter connection is active
- transmitter.resumeScanning()
-
- // If our last glucose was less than 4.5 minutes ago, don't fetch.
- guard !dataIsFresh else {
- completion(.noData)
- return
- }
-
- if let latestReading = latestReading {
- log.default("Fetching new glucose from Share because last reading is %{public}.1f minutes old", latestReading.readDate.timeIntervalSinceNow.minutes)
- } else {
- log.default("Fetching new glucose from Share because we don't have a previous reading")
- }
-
- shareManager.fetchNewDataIfNeeded(completion)
- }
-
- public var device: HKDevice? {
- return nil
- }
-
- public var debugDescription: String {
- return [
- "## \(String(describing: type(of: self)))",
- "latestReading: \(String(describing: latestReading))",
- "latestConnection: \(String(describing: latestConnection))",
- "dataIsFresh: \(dataIsFresh)",
- "providesBLEHeartbeat: \(providesBLEHeartbeat)",
- shareManager.debugDescription,
- "observers.count: \(observers.cleanupDeallocatedElements().count)",
- String(reflecting: transmitter),
- ].joined(separator: "\n")
- }
-
- private func updateDelegate(with result: CGMReadingResult) {
- if let manager = self as? CGMManager {
- shareManager.delegate.notify { (delegate) in
- delegate?.cgmManager(manager, hasNew: result)
- }
- }
-
- notifyObserversOfLatestReading()
- }
-
- private func notifyDelegateOfStateChange() {
- if let manager = self as? CGMManager {
- shareManager.delegate.notify { (delegate) in
- delegate?.cgmManagerDidUpdateState(manager)
- }
- }
- }
-
-
- // MARK: - TransmitterDelegate
-
- public func transmitterDidConnect(_ transmitter: Transmitter) {
- log.default("%{public}@", #function)
- latestConnection = Date()
- logDeviceCommunication("Connected", type: .connection)
- }
-
- public func transmitter(_ transmitter: Transmitter, didError error: Error) {
- log.error("%{public}@: %{public}@", #function, String(describing: error))
- updateDelegate(with: .error(error))
- logDeviceCommunication("Error: \(error)", type: .error)
- }
-
- public func transmitter(_ transmitter: Transmitter, didRead glucose: Glucose) {
- guard glucose != latestReading else {
- updateDelegate(with: .noData)
- return
- }
-
- latestReading = glucose
-
- logDeviceCommunication("New reading: \(glucose.readDate)", type: .receive)
-
- guard glucose.state.hasReliableGlucose else {
- log.default("%{public}@: Unreliable glucose: %{public}@", #function, String(describing: glucose.state))
- updateDelegate(with: .error(CalibrationError.unreliableState(glucose.state)))
- return
- }
-
- guard let quantity = glucose.glucose else {
- updateDelegate(with: .noData)
- return
- }
-
- log.default("%{public}@: New glucose", #function)
-
- updateDelegate(with: .newData([
- NewGlucoseSample(
- date: glucose.readDate,
- quantity: quantity,
- condition: glucose.condition,
- trend: glucose.trendType,
- trendRate: glucose.trendRate,
- isDisplayOnly: glucose.isDisplayOnly,
- wasUserEntered: glucose.isDisplayOnly,
- syncIdentifier: glucose.syncIdentifier,
- device: device
- )
- ]))
- }
-
- public func transmitter(_ transmitter: Transmitter, didReadBackfill glucose: [Glucose]) {
- let samples = glucose.compactMap { (glucose) -> NewGlucoseSample? in
- guard glucose != latestReading, glucose.state.hasReliableGlucose, let quantity = glucose.glucose else {
- return nil
- }
-
- return NewGlucoseSample(
- date: glucose.readDate,
- quantity: quantity,
- condition: glucose.condition,
- trend: glucose.trendType,
- trendRate: glucose.trendRate,
- isDisplayOnly: glucose.isDisplayOnly,
- wasUserEntered: glucose.isDisplayOnly,
- syncIdentifier: glucose.syncIdentifier,
- device: device
- )
- }
-
- guard samples.count > 0 else {
- return
- }
-
- updateDelegate(with: .newData(samples))
-
- logDeviceCommunication("New backfill: \(String(describing: samples.first?.date))", type: .receive)
- }
-
- public func transmitter(_ transmitter: Transmitter, didReadUnknownData data: Data) {
- log.error("Unknown sensor data: %{public}@", data.hexadecimalString)
- // This can be used for protocol discovery, but isn't necessary for normal operation
-
- logDeviceCommunication("Unknown sensor data: \(data.hexadecimalString)", type: .error)
- }
-}
-
-
-// MARK: - Observer management
-extension TransmitterManager {
- public func addObserver(_ observer: TransmitterManagerObserver, queue: DispatchQueue) {
- observers.insert(observer, queue: queue)
- }
-
- public func removeObserver(_ observer: TransmitterManagerObserver) {
- observers.removeElement(observer)
- }
-
- private func notifyObserversOfLatestReading() {
- observers.forEach { (observer) in
- observer.transmitterManagerDidUpdateLatestReading(self)
- }
- }
-}
-
-
-public class G5CGMManager: TransmitterManager, CGMManager {
- public let managerIdentifier: String = "DexG5Transmitter"
-
- public let localizedTitle = LocalizedString("Dexcom G5", comment: "CGM display title")
-
- public let isOnboarded = true // No distinction between created and onboarded
-
- public var appURL: URL? {
- return URL(string: "dexcomcgm://")
- }
-
- public override var device: HKDevice? {
- return HKDevice(
- name: "CGMBLEKit",
- manufacturer: "Dexcom",
- model: "G5 Mobile",
- hardwareVersion: nil,
- firmwareVersion: nil,
- softwareVersion: String(CGMBLEKitVersionNumber),
- localIdentifier: nil,
- udiDeviceIdentifier: "00386270000002"
- )
- }
-
- override func logDeviceCommunication(_ message: String, type: DeviceLogEntryType = .send) {
- self.cgmManagerDelegate?.deviceManager(self, logEventForDeviceIdentifier: transmitter.ID, type: type, message: message, completion: nil)
- }
-
-}
-
-
-public class G6CGMManager: TransmitterManager, CGMManager {
- public let managerIdentifier: String = "DexG6Transmitter"
-
- public let localizedTitle = LocalizedString("Dexcom G6", comment: "CGM display title")
-
- public let isOnboarded = true // No distinction between created and onboarded
-
- public var appURL: URL? {
- return nil
- }
-
- public override var device: HKDevice? {
- return HKDevice(
- name: "CGMBLEKit",
- manufacturer: "Dexcom",
- model: "G6",
- hardwareVersion: nil,
- firmwareVersion: nil,
- softwareVersion: String(CGMBLEKitVersionNumber),
- localIdentifier: nil,
- udiDeviceIdentifier: "00386270000385"
- )
- }
-
- override func logDeviceCommunication(_ message: String, type: DeviceLogEntryType = .send) {
- self.cgmManagerDelegate?.deviceManager(self, logEventForDeviceIdentifier: transmitter.ID, type: type, message: message, completion: nil)
- }
-}
-
-
-enum CalibrationError: Error {
- case unreliableState(CalibrationState)
-}
-
-extension CalibrationError: LocalizedError {
- var errorDescription: String? {
- switch self {
- case .unreliableState:
- return LocalizedString("Glucose data is unavailable", comment: "Error description for unreliable state")
- }
- }
-
- var failureReason: String? {
- switch self {
- case .unreliableState(let state):
- return state.localizedDescription
- }
- }
-}
-
-extension CalibrationState {
- public var localizedDescription: String {
- switch self {
- case .known(let state):
- switch state {
- case .needCalibration7, .needCalibration14, .needFirstInitialCalibration, .needSecondInitialCalibration, .calibrationError8, .calibrationError9, .calibrationError10, .calibrationError13:
- return LocalizedString("Sensor needs calibration", comment: "The description of sensor calibration state when sensor needs calibration.")
- case .ok:
- return LocalizedString("Sensor calibration is OK", comment: "The description of sensor calibration state when sensor calibration is ok.")
- case .stopped, .sensorFailure11, .sensorFailure12, .sessionFailure15, .sessionFailure16, .sessionFailure17:
- return LocalizedString("Sensor is stopped", comment: "The description of sensor calibration state when sensor sensor is stopped.")
- case .warmup, .questionMarks:
- return LocalizedString("Sensor is warming up", comment: "The description of sensor calibration state when sensor sensor is warming up.")
- }
- case .unknown(let rawValue):
- return String(format: LocalizedString("Sensor is in unknown state %1$d", comment: "The description of sensor calibration state when raw value is unknown. (1: missing data details)"), rawValue)
- }
- }
-}
-
-// MARK: - AlertResponder implementation
-extension G5CGMManager {
- public func acknowledgeAlert(alertIdentifier: Alert.AlertIdentifier, completion: @escaping (Error?) -> Void) {
- completion(nil)
- }
-}
-
-// MARK: - AlertSoundVendor implementation
-extension G5CGMManager {
- public func getSoundBaseURL() -> URL? { return nil }
- public func getSounds() -> [Alert.Sound] { return [] }
-}
-
-// MARK: - AlertResponder implementation
-extension G6CGMManager {
- public func acknowledgeAlert(alertIdentifier: Alert.AlertIdentifier, completion: @escaping (Error?) -> Void) {
- completion(nil)
- }
-}
-
-// MARK: - AlertSoundVendor implementation
-extension G6CGMManager {
- public func getSoundBaseURL() -> URL? { return nil }
- public func getSounds() -> [Alert.Sound] { return [] }
-}
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/TransmitterStatus.swift b/Dependencies/CGMBLEKit/CGMBLEKit/TransmitterStatus.swift
deleted file mode 100644
index f2792f990..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/TransmitterStatus.swift
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// TransmitterStatus.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/26/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-public enum TransmitterStatus {
- public typealias RawValue = UInt8
-
- case ok
- case lowBattery
- case unknown(RawValue)
-
- init(rawValue: RawValue) {
- switch rawValue {
- case 0:
- self = .ok
- case 0x81:
- self = .lowBattery
- default:
- self = .unknown(rawValue)
- }
- }
-}
-
-
-extension TransmitterStatus: Equatable { }
-
-public func ==(lhs: TransmitterStatus, rhs: TransmitterStatus) -> Bool {
- switch (lhs, rhs) {
- case (.ok, .ok), (.lowBattery, .lowBattery):
- return true
- case (.unknown(let left), .unknown(let right)) where left == right:
- return true
- default:
- return false
- }
-}
-
-
-extension TransmitterStatus {
- public var localizedDescription: String {
- switch self {
- case .ok:
- return LocalizedString("OK", comment: "Describes a functioning transmitter")
- case .lowBattery:
- return LocalizedString("Low Battery", comment: "Describes a low battery")
- case .unknown(let value):
- return "TransmitterStatus.unknown(\(value))"
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/ar.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/ar.lproj/Localizable.strings
deleted file mode 100644
index c1182284f..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/ar.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* Describes a low battery */
-"Low Battery" = "Low Battery";
-
-/* Describes a functioning transmitter */
-"OK" = "موافق";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Peripheral did not respond in time";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Peripheral isnʼt connected";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensor calibration is OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor needs calibration";
-
-/* Error description */
-"Unknown characteristic" = "Unknown characteristic";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/ca.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/ca.lproj/Localizable.strings
deleted file mode 100644
index 864a138e0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/ca.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* Describes a low battery */
-"Low Battery" = "Low Battery";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Peripheral did not respond in time";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Peripheral isnʼt connected";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensor calibration is OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor needs calibration";
-
-/* Error description */
-"Unknown characteristic" = "Unknown characteristic";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/cs.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/cs.lproj/Localizable.strings
deleted file mode 100644
index e62935a3d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/cs.lproj/Localizable.strings
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Údaje o glukóze nejsou k dispozici";
-
-/* Describes a low battery */
-"Low Battery" = "Vybitá baterie";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Periferní zařízení nereagovalo včas";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Senzor je zastaven";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Senzor se zahřívá";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/da.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/da.lproj/Localizable.strings
deleted file mode 100644
index 58183ae30..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/da.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukosedata ikke tilgængeligt";
-
-/* Describes a low battery */
-"Low Battery" = "lavt batteri";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Kommando for ekstern enhed var ugyldig";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Ekstern enhed svarede ikke i tide";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Ekstern enhed er ikke forbundet";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensorkalibrering er OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor i ukendt tilstand %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor er stoppet";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor varmer op";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensoren har brug for kalibrering";
-
-/* Error description */
-"Unknown characteristic" = "Ukendt karakteristik";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/de.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/de.lproj/Localizable.strings
deleted file mode 100644
index 79b76dae0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/de.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukosedaten nicht verfügbar";
-
-/* Describes a low battery */
-"Low Battery" = "Batterie schwach";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheriebefehl war ungültig";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Peripherie antwortet nicht rechtzeitig";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Peripherie ist nicht verbunden";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensorkalibrierung OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor befindet sich in unbekanntem Zustand %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor gestoppt";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor befindet sich in der Aufwärmphase";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor benötigt Kalibrierung";
-
-/* Error description */
-"Unknown characteristic" = "Unbekannte Charakteristik";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/es.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/es.lproj/Localizable.strings
deleted file mode 100644
index ff8a32114..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/es.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Los datos de glucosa no están disponibles";
-
-/* Describes a low battery */
-"Low Battery" = "Batería Baja";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "El comando del dispositivo periférico no es válido";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "El dispositivo periférico no respondió a tiempo";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "El dispositivo periférico no está conectado";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Calibración de sensor está OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "El sensor está en estado desconocido %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "El sensor está en pausa";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "El sensor se está calentando";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor se necesita de calibración";
-
-/* Error description */
-"Unknown characteristic" = "Característica desconocida";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/fi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/fi.lproj/Localizable.strings
deleted file mode 100644
index 4bea17df0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/fi.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukoositietoja ei ole saatavilla";
-
-/* Describes a low battery */
-"Low Battery" = "Akku lähes tyhjä";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Oheislaitekomento oli virheellinen";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Ulkoinen laite ei vastannut ajoissa";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Ulkoinen laite ei ole yhdistetty";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Anturin kalibrointi onnistui";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Anturi on tuntemattomassa tilassa %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Anturi on pysäytetty";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Anturi lämpenee";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Anturi tarvitsee kalibroinnin";
-
-/* Error description */
-"Unknown characteristic" = "Tuntematon ominaisuus";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/fr.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/fr.lproj/Localizable.strings
deleted file mode 100644
index 4546ce581..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/fr.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Les données de glycémie ne sont pas disponibles";
-
-/* Describes a low battery */
-"Low Battery" = "Batterie faible";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "La commande périphérique a retourné une commande invalide";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Le périphérique n’a pas répondu à temps";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Le périphérique n’est pas connecté";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Étalonnage de capteur OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Le capteur est dans un état inconnu %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Le capteur est arrêté";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Le capteur est en préchauffage";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Capteur doit être étalonné";
-
-/* Error description */
-"Unknown characteristic" = "Caractéristique inconnue";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/he.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/he.lproj/Localizable.strings
deleted file mode 100644
index 41fce61a7..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/he.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* Describes a low battery */
-"Low Battery" = "סוללה חלשה";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Peripheral did not respond in time";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Peripheral isnʼt connected";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensor calibration is OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "מצב החישן אינו ידוע %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "חיישן נעצר";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "חיישן מתחמם";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor needs calibration";
-
-/* Error description */
-"Unknown characteristic" = "מאפיין לא ידוע";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/hi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/hi.lproj/Localizable.strings
deleted file mode 100644
index aeef608c0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/hi.lproj/Localizable.strings
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "ग्लूकोस डेटा उपलब्ध नहीं है";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "सेन्सर समाप्त हो गया";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "सेन्सर अपने शुरुआती समय में है";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/hu.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/hu.lproj/Localizable.strings
deleted file mode 100644
index 864a138e0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/hu.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* Describes a low battery */
-"Low Battery" = "Low Battery";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Peripheral did not respond in time";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Peripheral isnʼt connected";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensor calibration is OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor needs calibration";
-
-/* Error description */
-"Unknown characteristic" = "Unknown characteristic";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/it.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/it.lproj/Localizable.strings
deleted file mode 100644
index ae5c809c0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/it.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "I dati della glicemia non sono disponibili";
-
-/* Describes a low battery */
-"Low Battery" = "Batteria Bassa";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Il comando della periferica non era valido";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "La periferica non ha risposto entro il tempo limite";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "La periferica non è connessa";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "La calibrazione del sensore è valida";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Il Sensore è in un stato %1$d sconosciuto";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Il Sensore è fermo";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Il sensore è in fase di avvio";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Il sensore necessita di calibrazione";
-
-/* Error description */
-"Unknown characteristic" = "Caratteristica sconosciuta";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/ja.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/ja.lproj/Localizable.strings
deleted file mode 100644
index 171184016..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/ja.lproj/Localizable.strings
+++ /dev/null
@@ -1,39 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "グルコースデータがありません";
-
-/* Describes a low battery */
-"Low Battery" = "電池残量低下";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "危機が時間内に反応しませんでした";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "危機が接続されていません";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "センサーの較正はできています";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "センサーの状態が不明です %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "センサーが停止しています";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "センサーが準備中です";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "センサーの較正が必要です";
-
-/* Error description */
-"Unknown characteristic" = "エラー不明";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/nb.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/nb.lproj/Localizable.strings
deleted file mode 100644
index cadb73a83..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/nb.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Blodsukker er utilgjengelig";
-
-/* Describes a low battery */
-"Low Battery" = "Lavt batterinivå";
-
-/* Describes a functioning transmitter */
-"OK" = "Ok";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Perifer kommando var ugyldig";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Tilbehøret svarte ikke i tide";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Tilbehøret er ikke tilkoblet";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensorkalibrering er OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor er i ukjent tilstand %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor er stoppet";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor varmer opp";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor trenger kalibrering";
-
-/* Error description */
-"Unknown characteristic" = "Ukjent karakteristikk";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/nl.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/nl.lproj/Localizable.strings
deleted file mode 100644
index 781d48264..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/nl.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucosegegevens zijn niet beschikbaar";
-
-/* Describes a low battery */
-"Low Battery" = "Batterij bijna leeg";
-
-/* Describes a functioning transmitter */
-"OK" = "Ok";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Apparaat commando was ongeldig";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Apparaat reageerde niet op tijd";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Apparaat is niet verbonden";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensorkalibratie is OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Onbekende sensorstatus %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor gestopt";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor aan het opwarmen";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor moet worden gekalibreerd";
-
-/* Error description */
-"Unknown characteristic" = "Onbekende eigenschap";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/pl.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/pl.lproj/Localizable.strings
deleted file mode 100644
index f2bc41430..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/pl.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Dane o poziomie glukozy są niedostępne";
-
-/* Describes a low battery */
-"Low Battery" = "Słaba bateria";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Polecenie urządzenia peryferyjnego było nieprawidłowe";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Urz. peryferyjne nie odpowiada";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Urz. peryferyjne jest niepodłączone";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Kalibracja sensora powiodła się";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor jest w nieznanym stanie %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor został zatrzymany";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor jest w fazie rozruchu";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor wymaga kalibracji";
-
-/* Error description */
-"Unknown characteristic" = "Nieznany błąd";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/pt-BR.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/pt-BR.lproj/Localizable.strings
deleted file mode 100644
index f9ced47e3..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/pt-BR.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Os dados de glicose não estão disponíveis";
-
-/* Describes a low battery */
-"Low Battery" = "Bateria Fraca";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Acessório não respondeu a tempo";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Acessório não está conectado";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "A calibração do sensor está OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "O sensor está em um estado desconhecido %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "O sensor está parado";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "O sensor está aquecendo";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "O sensor precisa de calibração";
-
-/* Error description */
-"Unknown characteristic" = "Característica Desconhecida";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/pt-PT.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/pt-PT.lproj/Localizable.strings
deleted file mode 100644
index 864a138e0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/pt-PT.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* Describes a low battery */
-"Low Battery" = "Low Battery";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Peripheral did not respond in time";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Peripheral isnʼt connected";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensor calibration is OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensor needs calibration";
-
-/* Error description */
-"Unknown characteristic" = "Unknown characteristic";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/ro.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/ro.lproj/Localizable.strings
deleted file mode 100644
index 93e588a28..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/ro.lproj/Localizable.strings
+++ /dev/null
@@ -1,42 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Datele despre glucoză nu sunt disponibile";
-
-/* Describes a low battery */
-"Low Battery" = "Baterie descărcată";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Comanda dispozitivului este nevalidă";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Dispozitivul periferic nu a răspuns în timp util";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Dispozitivul periferic nu este conectat";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Calibrarea senzorului este OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Starea senzorului este necunoscută";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Senzorul e oprit";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Senzorul se pregătește";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Senzorul are nevoie de calibrare";
-
-/* Error description */
-"Unknown characteristic" = "Caracteristică necunoscută";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/ru.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/ru.lproj/Localizable.strings
deleted file mode 100644
index ca294360d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/ru.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Данные глюкозы недоступны";
-
-/* Describes a low battery */
-"Low Battery" = "Батарейка садится";
-
-/* Describes a functioning transmitter */
-"OK" = "ОК";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Неправильно сформирован запрос.";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Периферийное устройство не отозвалось вовремя";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Соединение с периферийным устройством не установлено";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Калибровка сенсора ОК";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Неизвестное состояние сенсора%1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Сенсор остановлен";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Сенсор прогревается";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Сенсор требует калибровки";
-
-/* Error description */
-"Unknown characteristic" = "Неизвестная характеристика";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/sk.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/sk.lproj/Localizable.strings
deleted file mode 100644
index 88ec60590..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/sk.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Údaje o glykémii nie sú k dispozícii";
-
-/* Describes a low battery */
-"Low Battery" = "Slabá batéria";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Periférny príkaz bol neplatný";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Periférne zariadenie nereagovalo načas";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Periférne zariadenie nie je pripojené";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Kalibrácia senzora je vporiadku";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Senzor je v neznámom stave %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Senzor je zastavený";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Senzor sa zahrieva";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Senzor potrebuje kalibráciu";
-
-/* Error description */
-"Unknown characteristic" = "Neznáma charakteristika";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/sv.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/sv.lproj/Localizable.strings
deleted file mode 100644
index 7ee7bf9a8..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/sv.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukosvärden är inte tillgängliga";
-
-/* Describes a low battery */
-"Low Battery" = "Lågt batteri";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Enhetskommando var ogiltigt";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Enheten svarade inte inom utsatt tid";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Enheten är inte ansluten";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensorkalibrering lyckades";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensorns status är okänd %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensorn har stoppats";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensorn värmer upp";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensorn behöver kalibreras";
-
-/* Error description */
-"Unknown characteristic" = "Okänd data";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/tr.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/tr.lproj/Localizable.strings
deleted file mode 100644
index 492f87b77..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/tr.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "KŞ verileri mevcut değil";
-
-/* Describes a low battery */
-"Low Battery" = "Düşük Pil";
-
-/* Describes a functioning transmitter */
-"OK" = "Tamam";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Çevre birimi komutu geçersiz";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Çevre birimi zamanında yanıt vermedi";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Çevre birimi bağlı değil";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Sensör kalibrasyonu tamam";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensör bilinmeyen durumda %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Sensör durdu";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Sensör ısınıyor";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Sensörün kalibrasyona ihtiyacı var";
-
-/* Error description */
-"Unknown characteristic" = "Bilinmeyen karakteristik";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/uk.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/uk.lproj/Localizable.strings
deleted file mode 100644
index 7660749e3..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/uk.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Дані глюкози недоступні";
-
-/* Describes a low battery */
-"Low Battery" = "Низький заряд батареї";
-
-/* Describes a functioning transmitter */
-"OK" = "ОК";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Неправильно сформовано запит.";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Периферійний пристрій не озвався вчасно";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "З'єднання з периферійним пристроєм не встановлено";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Калібрування сенсора ОК";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Сенсор знаходиться в невідомому стані%1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Сенсор зупинений";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Сенсор прогрівається";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Сенсор вимагає калібрування";
-
-/* Error description */
-"Unknown characteristic" = "Невідома характеристика";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/vi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/vi.lproj/Localizable.strings
deleted file mode 100644
index 329ab73b3..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/vi.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Dữ liệu glucose không có sẵn";
-
-/* Describes a low battery */
-"Low Battery" = "pin yếu";
-
-/* Describes a functioning transmitter */
-"OK" = "OK";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Câu lệnh không hợp lệ";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "Ngoại vi không đáp ứng kịp thời";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "Ngoại vi không được kết nối";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "Hiệu chuẩn cảm biến là OK";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Cảm biến ở trạng thái không xác định %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "Cảm biến bị dừng";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "Cảm biến đang nóng lên";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "Cảm biến cần hiệu chuẩn";
-
-/* Error description */
-"Unknown characteristic" = "Đặc điểm không xác định";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKit/zh-Hans.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKit/zh-Hans.lproj/Localizable.strings
deleted file mode 100644
index 5a6ae3671..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKit/zh-Hans.lproj/Localizable.strings
+++ /dev/null
@@ -1,41 +0,0 @@
-/* CGM display title */
-"Dexcom G5" = "Dexcom G 5";
-
-/* CGM display title */
-"Dexcom G6" = "Dexcom G6";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "葡萄糖数据不可用";
-
-/* Describes a low battery */
-"Low Battery" = "电量低";
-
-/* Describes a functioning transmitter */
-"OK" = "Ok";
-
-/* invlid config error description */
-"Peripheral command was invalid" = "Peripheral command was invalid";
-
-/* Timeout error description */
-"Peripheral did not respond in time" = "外设没有及时响应";
-
-/* Not ready error description */
-"Peripheral isnʼt connected" = "外围设备未连接";
-
-/* The description of sensor calibration state when sensor calibration is ok. */
-"Sensor calibration is OK" = "传感器校准成功";
-
-/* The description of sensor calibration state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "传感器处于未知状态 %1$d";
-
-/* The description of sensor calibration state when sensor sensor is stopped. */
-"Sensor is stopped" = "传感器停止";
-
-/* The description of sensor calibration state when sensor sensor is warming up. */
-"Sensor is warming up" = "传感器在启动中";
-
-/* The description of sensor calibration state when sensor needs calibration. */
-"Sensor needs calibration" = "传感器需要校准";
-
-/* Error description */
-"Unknown characteristic" = "未知特性";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/CGMBLEKitG5Plugin-Bridging-Header.h b/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/CGMBLEKitG5Plugin-Bridging-Header.h
deleted file mode 100644
index 1b2cb5d6d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/CGMBLEKitG5Plugin-Bridging-Header.h
+++ /dev/null
@@ -1,4 +0,0 @@
-//
-// Use this file to import your target's public headers that you would like to expose to Swift.
-//
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/CGMBLEKitG5Plugin.swift b/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/CGMBLEKitG5Plugin.swift
deleted file mode 100644
index 9cc6d70dd..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/CGMBLEKitG5Plugin.swift
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// CGMBLEKitG5Plugin.swift
-// CGMBLEKitG5Plugin
-//
-// Created by Nathaniel Hamming on 2019-12-19.
-// Copyright © 2019 LoopKit Authors. All rights reserved.
-//
-
-import os.log
-import LoopKitUI
-import CGMBLEKit
-import CGMBLEKitUI
-
-class CGMBLEKitG5Plugin: NSObject, CGMManagerUIPlugin {
- private let log = OSLog(category: "CGMBLEKitG5Plugin")
-
- public var cgmManagerType: CGMManagerUI.Type? {
- return G5CGMManager.self
- }
-
- override init() {
- super.init()
- log.default("Instantiated")
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/Info.plist b/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/Info.plist
deleted file mode 100644
index 844749bbc..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitG5Plugin/Info.plist
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleVersion
- 1
- NSHumanReadableCopyright
- Copyright © 2019 LoopKit Authors. All rights reserved.
- NSPrincipalClass
- CGMBLEKitG5Plugin
- com.loopkit.Loop.CGMManagerDisplayName
- Dexcom G5
- com.loopkit.Loop.CGMManagerIdentifier
- DexG5Transmitter
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/CGMBLEKitG6Plugin-Bridging-Header.h b/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/CGMBLEKitG6Plugin-Bridging-Header.h
deleted file mode 100644
index 1b2cb5d6d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/CGMBLEKitG6Plugin-Bridging-Header.h
+++ /dev/null
@@ -1,4 +0,0 @@
-//
-// Use this file to import your target's public headers that you would like to expose to Swift.
-//
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/CGMBLEKitG6Plugin.swift b/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/CGMBLEKitG6Plugin.swift
deleted file mode 100644
index 8b8ceef4a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/CGMBLEKitG6Plugin.swift
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// CGMBLEKitG6Plugin.swift
-// CGMBLEKitG6Plugin
-//
-// Created by Nathaniel Hamming on 2019-12-13.
-// Copyright © 2019 LoopKit Authors. All rights reserved.
-//
-
-import os.log
-import LoopKitUI
-import CGMBLEKit
-import CGMBLEKitUI
-
-class CGMBLEKitG6Plugin: NSObject, CGMManagerUIPlugin {
- private let log = OSLog(category: "CGMBLEKitG6Plugin")
-
- public var cgmManagerType: CGMManagerUI.Type? {
- return G6CGMManager.self
- }
-
- override init() {
- super.init()
- log.default("Instantiated")
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/Info.plist b/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/Info.plist
deleted file mode 100644
index 50536dbb7..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitG6Plugin/Info.plist
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleVersion
- 1
- NSHumanReadableCopyright
- Copyright © 2019 LoopKit Authors. All rights reserved.
- NSPrincipalClass
- CGMBLEKitG6Plugin
- com.loopkit.Loop.CGMManagerDisplayName
- Dexcom G6
- com.loopkit.Loop.CGMManagerIdentifier
- DexG6Transmitter
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/CalibrationDataRxMessageTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/CalibrationDataRxMessageTests.swift
deleted file mode 100644
index bae53c139..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/CalibrationDataRxMessageTests.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// CalibrationDataRxMessageTests.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 9/18/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-
-class CalibrationDataRxMessageTests: XCTestCase {
-
- func testMessage() {
- let data = Data(hexadecimalString: "33002b290090012900ae00800050e929001225")!
- XCTAssertNotNil(CalibrationDataRxMessage(data: data))
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseBackfillMessageTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseBackfillMessageTests.swift
deleted file mode 100644
index 99671ac53..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseBackfillMessageTests.swift
+++ /dev/null
@@ -1,433 +0,0 @@
-//
-// GlucoseBackfillMessageTests.swift
-// xDripG5Tests
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-class GlucoseBackfillMessageTests: XCTestCase {
-
- func testTxMessage() {
- let message = GlucoseBackfillTxMessage(byte1: 5, byte2: 2, identifier: 0, startTime: 5439415, endTime: 5440614) // 20 minutes
-
- XCTAssertEqual(Data(hexadecimalString: "50050200b7ff5200660453000000000000007138")!, message.data)
- }
-
- func testRxMessage() {
- let message = GlucoseBackfillRxMessage(data: Data(hexadecimalString: "51000100b7ff52006604530032000000e6cb9805")!)!
-
- XCTAssertEqual(.ok, TransmitterStatus(rawValue: message.status))
- XCTAssertEqual(1, message.backfillStatus)
- XCTAssertEqual(0, message.identifier)
- XCTAssertEqual(5439415, message.startTime)
- XCTAssertEqual(5440614, message.endTime)
- XCTAssertEqual(50, message.bufferLength)
- XCTAssertEqual(0xcbe6, message.bufferCRC)
-
- // 0xbc46
- // 0b10111100 01000110
- var buffer = GlucoseBackfillFrameBuffer(identifier: message.identifier)
- buffer.append(Data(hexadecimalString: "0100bc460000b7ff52008b0006eee30053008500")!)
- buffer.append(Data(hexadecimalString: "020006eb0f025300800006ee3a0353007e0006f5")!)
- buffer.append(Data(hexadecimalString: "030066045300790006f8")!)
-
- XCTAssertEqual(Int(message.bufferLength), buffer.count)
- XCTAssertEqual(message.bufferCRC, buffer.crc16)
-
- let messages = buffer.glucose
-
- XCTAssertEqual(139, messages[0].glucose)
- XCTAssertEqual(5439415, messages[0].timestamp)
- XCTAssertEqual(.known(.ok), CalibrationState(rawValue: messages[0].state))
- XCTAssertEqual(-18, messages[0].trend)
-
- XCTAssertEqual(133, messages[1].glucose)
- XCTAssertEqual(5439715, messages[1].timestamp)
- XCTAssertEqual(.known(.ok), CalibrationState(rawValue: messages[1].state))
- XCTAssertEqual(-21, messages[1].trend)
-
- XCTAssertEqual(128, messages[2].glucose)
- XCTAssertEqual(5440015, messages[2].timestamp)
- XCTAssertEqual(.known(.ok), CalibrationState(rawValue: messages[2].state))
- XCTAssertEqual(-18, messages[2].trend)
-
- XCTAssertEqual(126, messages[3].glucose)
- XCTAssertEqual(5440314, messages[3].timestamp)
- XCTAssertEqual(.known(.ok), CalibrationState(rawValue: messages[3].state))
- XCTAssertEqual(-11, messages[3].trend)
-
- XCTAssertEqual(121, messages[4].glucose)
- XCTAssertEqual(5440614, messages[4].timestamp)
- XCTAssertEqual(.known(.ok), CalibrationState(rawValue: messages[4].state))
- XCTAssertEqual(-08, messages[4].trend)
-
- XCTAssertEqual(message.startTime, messages.first!.timestamp)
- XCTAssertEqual(message.endTime, messages.last!.timestamp)
-
- XCTAssertTrue(messages.first!.timestamp <= messages.last!.timestamp)
- }
-
- func testGlucoseBackfill2() {
- let message = GlucoseBackfillTxMessage(byte1: 5, byte2: 2, identifier: 0, startTime: 4648682, endTime: 4650182) // 25 minutes
-
- XCTAssertEqual(Data(hexadecimalString: "50050200eaee4600c6f446000000000000009f6d")!, message.data, message.data.hexadecimalString)
-
- let response = GlucoseBackfillRxMessage(data: Data(hexadecimalString: "51000103eaee4600c6f446003a0000004f3ac9e6")!)!
-
- XCTAssertEqual(.ok, TransmitterStatus(rawValue: response.status))
- XCTAssertEqual(1, response.backfillStatus)
- XCTAssertEqual(3, response.identifier)
- XCTAssertEqual(4648682, response.startTime)
- XCTAssertEqual(4650182, response.endTime)
- XCTAssertEqual(58, response.bufferLength)
- XCTAssertEqual(0x3a4f, response.bufferCRC)
-
- // 0x6e3c
- // 0b01101110 00111100
- var buffer = GlucoseBackfillFrameBuffer(identifier: 0xc0)
- buffer.append(Data(hexadecimalString: "01c06e3c0000eaee4600920007fd16f046009500")!)
- buffer.append(Data(hexadecimalString: "02c0070042f14600960007026ef2460099000704")!)
- buffer.append(Data(hexadecimalString: "03c09af3460093000700c6f44600900007fc")!)
-
- XCTAssertEqual(Int(response.bufferLength), buffer.count)
- XCTAssertEqual(response.bufferCRC, buffer.crc16)
-
- let messages = buffer.glucose
-
- XCTAssertEqual(response.startTime, messages.first!.timestamp)
- XCTAssertEqual(response.endTime, messages.last!.timestamp)
-
- XCTAssertTrue(messages.first!.timestamp <= messages.last!.timestamp)
-
- XCTAssertEqual(6, messages.count)
- }
-
- func testMalformedBackfill() {
- var buffer = GlucoseBackfillFrameBuffer(identifier: 0)
- buffer.append(Data(hexadecimalString: "0100bc460000b7ff52008b0006eee30053008500")!)
- buffer.append(Data(hexadecimalString: "020006eb0f025300800006ee3a0353007e0006")!)
-
- XCTAssertEqual(3, buffer.glucose.count)
- }
-
- func testGlucoseBackfill3() {
- let response = GlucoseBackfillRxMessage(data: Data(hexadecimalString: "510001023d6a0e00c16d0e00280000005b1a9154")!)!
-
- XCTAssertEqual(.ok, TransmitterStatus(rawValue: response.status))
- XCTAssertEqual(1, response.backfillStatus)
- XCTAssertEqual(2, response.identifier)
- XCTAssertEqual(944701, response.startTime)
- XCTAssertEqual(945601, response.endTime)
- XCTAssertEqual(40, response.bufferLength)
- XCTAssertEqual(0x1A5B, response.bufferCRC)
-
- // 0x440c
- // 0b01000100 00001100
- var buffer = GlucoseBackfillFrameBuffer(identifier: 0x80)
- buffer.append(Data(hexadecimalString: "0180440c00003d6a0e005c0007fe696b0e005d00")!)
- buffer.append(Data(hexadecimalString: "028007ff956c0e005e000700c16d0e005d000700")!)
-
- XCTAssertEqual(Int(response.bufferLength), buffer.count)
- XCTAssertEqual(response.bufferCRC, buffer.crc16)
-
- let messages = buffer.glucose
-
- XCTAssertEqual(response.startTime, messages.first!.timestamp)
- XCTAssertEqual(response.endTime, messages.last!.timestamp)
-
- XCTAssertTrue(messages.first!.timestamp <= messages.last!.timestamp)
-
- XCTAssertEqual(4, messages.count)
- }
-
- func testGlucoseBackfill4() {
- let response = GlucoseBackfillRxMessage(data: Data(hexadecimalString: "51000103c9740e004d780e0028000000235bd94c")!)!
-
- XCTAssertEqual(.ok, TransmitterStatus(rawValue: response.status))
- XCTAssertEqual(1, response.backfillStatus)
- XCTAssertEqual(3, response.identifier)
- XCTAssertEqual(947401, response.startTime)
- XCTAssertEqual(948301, response.endTime)
- XCTAssertEqual(40, response.bufferLength)
- XCTAssertEqual(0x5B23, response.bufferCRC)
-
- // 0x04d0
- // 0b00000100 11010000
- var buffer = GlucoseBackfillFrameBuffer(identifier: 0xc0)
- buffer.append(Data(hexadecimalString: "01c04d0c0000c9740e005a000700f5750e005800")!)
- buffer.append(Data(hexadecimalString: "02c007ff21770e00590007ff4d780e0059000700")!)
-
- XCTAssertEqual(Int(response.bufferLength), buffer.count)
- XCTAssertEqual(response.bufferCRC, buffer.crc16)
-
- let messages = buffer.glucose
-
- XCTAssertEqual(response.startTime, messages.first!.timestamp)
- XCTAssertEqual(response.endTime, messages.last!.timestamp)
-
- XCTAssertTrue(messages.first!.timestamp <= messages.last!.timestamp)
-
- XCTAssertEqual(4, messages.count)
- }
-
- func testNotGlucoseBackfill1() {
- let response = GlucoseBackfillRxMessage(data: Data(hexadecimalString: "5100010339410e0085a90e00ac06000070ca9143")!)!
-
- XCTAssertEqual(.ok, TransmitterStatus(rawValue: response.status))
- XCTAssertEqual(1, response.backfillStatus)
- XCTAssertEqual(3, response.identifier)
- XCTAssertEqual(934201, response.startTime)
- XCTAssertEqual(960901, response.endTime)
- XCTAssertEqual(1708, response.bufferLength)
- XCTAssertEqual(0xCA70, response.bufferCRC)
-
- // 0x4a4f
- // 0b01001010 01001111
- var buffer = GlucoseBackfillFrameBuffer(identifier: 0xc0)
- buffer.append(Data(hexadecimalString: "01c04a4f4a5558ef554453b7392a0df008571a7f")!)
- buffer.append(Data(hexadecimalString: "02c0451e0d74bdec596b633cf2b03d511ef3d048")!)
- buffer.append(Data(hexadecimalString: "03c009145e959ca51f7a1663ca31676b175d7bc7")!)
- buffer.append(Data(hexadecimalString: "04c0de00c954fcd3281d5163ed873cdc136fca3e")!)
- buffer.append(Data(hexadecimalString: "05c0c7da188dd5fbb8997206da1cc8d0c22f8434")!)
- buffer.append(Data(hexadecimalString: "06c04d50b29df06b12e7162f2d73fd553e44e469")!)
- buffer.append(Data(hexadecimalString: "07c02b4bb61d66cf6e949ee0f07dbe0cc12127ae")!)
- buffer.append(Data(hexadecimalString: "08c03bf887be09ece7595adfee494b25368103b4")!)
- buffer.append(Data(hexadecimalString: "09c07eefb9b5398468a53f00355341d19b50c8b1")!)
- buffer.append(Data(hexadecimalString: "0ac028f0ddb4dc09a2c74deedf7fdff13fcd6b0e")!)
- buffer.append(Data(hexadecimalString: "0bc0ad2d7311ac9ec1908fb7ee5557c463ea4fea")!)
- buffer.append(Data(hexadecimalString: "0cc0bf3c62d9aa62d7c3d447c959b51d31fd016d")!)
- buffer.append(Data(hexadecimalString: "0dc0278116abd1252ad66c894a39ed7c6d72086e")!)
- buffer.append(Data(hexadecimalString: "0ec0aaee3bf9b05ccb7b23e1c27d777173c4d9fd")!)
- buffer.append(Data(hexadecimalString: "0fc044048720d76a696249737f999f944995e44e")!)
- buffer.append(Data(hexadecimalString: "10c0495e4cb7f22327a920a843de1b4522a68108")!)
- buffer.append(Data(hexadecimalString: "11c058c482389192ed920e322b71900d747a9492")!)
- buffer.append(Data(hexadecimalString: "12c0eac06906ff4863f0e8da07d1ead29fc15bd3")!)
- buffer.append(Data(hexadecimalString: "13c0c0be38548fe9e229c64c9c0f3e9b4c4c1d83")!)
- buffer.append(Data(hexadecimalString: "14c018a936bdde548e4244093e77c87adda0a1cf")!)
- buffer.append(Data(hexadecimalString: "15c0fb97d1d147dd0bc6552faa4d62ab553e1682")!)
- buffer.append(Data(hexadecimalString: "16c0f15f8cb77decb934bfe0c711a026dd4bf36b")!)
- buffer.append(Data(hexadecimalString: "17c0bd268b0eee07ed20a0f3856ea449b1503708")!)
- buffer.append(Data(hexadecimalString: "18c00872ed5a996a13480b81fc82b6ca1e7dd379")!)
- buffer.append(Data(hexadecimalString: "19c06fb4c5bc84e63688b0a77edbab85bfb61b45")!)
- buffer.append(Data(hexadecimalString: "1ac071d29d30edb43db6b8e114bbbcd67f9dd3a9")!)
- buffer.append(Data(hexadecimalString: "1bc0569e17a8a80c015def11ddce1b8f194ff6e2")!)
- buffer.append(Data(hexadecimalString: "1cc0df79ffbc1e077fe249b47550feb5dcd53044")!)
- buffer.append(Data(hexadecimalString: "1dc0b557e2ba03caed61de30221b0330e1cc49b1")!)
- buffer.append(Data(hexadecimalString: "1ec006f05e739d737939baf8b14a8b7a6faae96e")!)
- buffer.append(Data(hexadecimalString: "1fc00b82d430e9e75fb8e7e2affbdd292a41fad2")!)
- buffer.append(Data(hexadecimalString: "20c0fbf8e8f2686aaaf19d2809eecd3bd4f63516")!)
- buffer.append(Data(hexadecimalString: "21c0a7df809e73538e459c1a9cd27a566f636e22")!)
- buffer.append(Data(hexadecimalString: "22c0dbb3c23d7d7847dee77311287e6c6b192eb4")!)
- buffer.append(Data(hexadecimalString: "23c0d30038d70241a80b9e390778a897dd1632cc")!)
- buffer.append(Data(hexadecimalString: "24c0177b23127b464c07a499abeff05f13e40998")!)
- buffer.append(Data(hexadecimalString: "25c0855350c7c4a335e95d2e569996639e8341b4")!)
- buffer.append(Data(hexadecimalString: "26c0d42874475710a50764d4a4166c0e420aff7f")!)
- buffer.append(Data(hexadecimalString: "27c0facb1d61cb8057de64546fc9f24f93603093")!)
- buffer.append(Data(hexadecimalString: "28c080befb84f22c60d398f017dde114d0557b27")!)
- buffer.append(Data(hexadecimalString: "29c07555e92425342c0674b62fa517b13ba0e3b0")!)
- buffer.append(Data(hexadecimalString: "2ac0923624bce36c89fade1f66bd7ae1e8e7d598")!)
- buffer.append(Data(hexadecimalString: "2bc0d345ceea668373d31f95b03a6ee7fff1a3b5")!)
- buffer.append(Data(hexadecimalString: "2cc045e409b8d31dd53ae9d353f35738819fbb79")!)
- buffer.append(Data(hexadecimalString: "2dc0a5d31fd3c3b7b217d3f79b245d3714b0523d")!)
- buffer.append(Data(hexadecimalString: "2ec0eb576e0193584bff8ecada0dc54e4ebde86c")!)
- buffer.append(Data(hexadecimalString: "2fc092b8ef52003f8b76e90d920ca738c998bb70")!)
- buffer.append(Data(hexadecimalString: "30c07cfa0f7a69d14b79f605d254a164fd67c658")!)
- buffer.append(Data(hexadecimalString: "31c049a329162e03f41c12db845b73301f5bbb81")!)
- buffer.append(Data(hexadecimalString: "32c08a21ca0995b5aa413897ea9e2b7c563ced07")!)
- buffer.append(Data(hexadecimalString: "33c05d51a18e19209f1c55054bd2f74677c71070")!)
- buffer.append(Data(hexadecimalString: "34c0299e29ae5576a220b0b767fc4e898aaf2df1")!)
- buffer.append(Data(hexadecimalString: "35c0bbb554546b69c53b4b3a63bd524bfbe728e6")!)
- buffer.append(Data(hexadecimalString: "36c0cd4e8c6e10e72950e66bfa0d23b954a7aede")!)
- buffer.append(Data(hexadecimalString: "37c0ea5df836af737298d44b4b156ced47727920")!)
- buffer.append(Data(hexadecimalString: "38c02303edefc4916cfdba55829426c153d0d30c")!)
- buffer.append(Data(hexadecimalString: "39c0dfee091fea60c2da239c9aabef8eddbe49b5")!)
- buffer.append(Data(hexadecimalString: "3ac02788f23fb030e7606329ed24cbee10bc20eb")!)
- buffer.append(Data(hexadecimalString: "3bc00a601d46c10bab8cdf04513a47550b0e4fe5")!)
- buffer.append(Data(hexadecimalString: "3cc072ea5e514432c81e325464e1ac2d659378d2")!)
- buffer.append(Data(hexadecimalString: "3dc0f050e994caa508fdea7202ed70a4acc6e8ab")!)
- buffer.append(Data(hexadecimalString: "3ec069ab0d13863943415b492569db29b9594dbe")!)
- buffer.append(Data(hexadecimalString: "3fc02c37277a98b88956f0def9ad866f44ca6d9f")!)
- buffer.append(Data(hexadecimalString: "40c0e5bd6aa2dbd835fab2ec238de4a635a3f6cb")!)
- buffer.append(Data(hexadecimalString: "41c0aafa8812d94d5fe722b3ecfb74eb4c12c622")!)
- buffer.append(Data(hexadecimalString: "42c08c5b4bb2f28069fc6f9dcb26bc84c0cc01c7")!)
- buffer.append(Data(hexadecimalString: "43c04ad95cefa1f62a18fa2c5a05bac208685cdb")!)
- buffer.append(Data(hexadecimalString: "44c0ffe910ddc010b30f457578ab24a866b8a94d")!)
- buffer.append(Data(hexadecimalString: "45c01b0bb36e58f401eb15da2e6710721e39c573")!)
- buffer.append(Data(hexadecimalString: "46c06165075618fc9626c53acdd9cb8bcfb0719f")!)
- buffer.append(Data(hexadecimalString: "47c081599f76725e30d4de39cdcc7f7c0c918d68")!)
- buffer.append(Data(hexadecimalString: "48c0563b99dce4913105b793f4d539fe668feef6")!)
- buffer.append(Data(hexadecimalString: "49c04ebaaf9f4dfda6cac4d617cd07098fec39f0")!)
- buffer.append(Data(hexadecimalString: "4ac04c1ae961bc4f3e2cd395396dc8098bbf4bd5")!)
- buffer.append(Data(hexadecimalString: "4bc0d95ed88f296e8d68c35085af86e5ef8d8bf0")!)
- buffer.append(Data(hexadecimalString: "4cc0658ccce111259ce8ac5cbedfc46deda77433")!)
- buffer.append(Data(hexadecimalString: "4dc05fda2f8d2885082db4b1356c5e2a0e830471")!)
- buffer.append(Data(hexadecimalString: "4ec066c7813ff84a9da11fe343e5a95bbfa3082c")!)
- buffer.append(Data(hexadecimalString: "4fc03bcfd6fe6d9657d04f06ed7bc461ebe18d47")!)
- buffer.append(Data(hexadecimalString: "50c035bbe880ba24d7c84f73ae061b33d62a1845")!)
- buffer.append(Data(hexadecimalString: "51c0650f0a6bbc91b2771549cf49a5a4faf8b278")!)
- buffer.append(Data(hexadecimalString: "52c07ac551477e6cd10fe6a3b43d62b02569d110")!)
- buffer.append(Data(hexadecimalString: "53c005f79d6de0ec017e7a0c98961ce6770f885d")!)
- buffer.append(Data(hexadecimalString: "54c0d05fee0b5f5bf9de8c61b58f8634ecbf3347")!)
- buffer.append(Data(hexadecimalString: "55c0e0c7d345fbc40f35aed12e82f8ccb0ed9335")!)
- buffer.append(Data(hexadecimalString: "56c0b1c8b263179e")!)
-
- XCTAssertEqual(Int(response.bufferLength), buffer.count)
- XCTAssertEqual(response.bufferCRC, buffer.crc16)
-
- let messages = buffer.glucose
-
- XCTAssertNotEqual(response.startTime, messages.first!.timestamp)
- XCTAssertNotEqual(response.endTime, messages.last!.timestamp)
-
- XCTAssertEqual(191, messages.count)
- }
-
- func testNotGlucoseBackfill2() {
- let response = GlucoseBackfillRxMessage(data: Data(hexadecimalString: "51000102b1aa0e00e5b20e00a000000020a39b7e")!)!
-
- XCTAssertEqual(.ok, TransmitterStatus(rawValue: response.status))
- XCTAssertEqual(1, response.backfillStatus)
- XCTAssertEqual(2, response.identifier)
- XCTAssertEqual(961201, response.startTime)
- XCTAssertEqual(963301, response.endTime)
- XCTAssertEqual(160, response.bufferLength)
- XCTAssertEqual(0xA320, response.bufferCRC)
-
- // 0xcde3
- // 0b11001101 11100011
- var buffer = GlucoseBackfillFrameBuffer(identifier: 0x80)
- buffer.append(Data(hexadecimalString: "0180cde3fd48248e37a7bf6c2d9d78d4bfef6d5b")!)
- buffer.append(Data(hexadecimalString: "02809f074c9039b6d3b841f422cf36398338f98c")!)
- buffer.append(Data(hexadecimalString: "038004160a5a1ad37c382f3ca23ea215c644f7b6")!)
- buffer.append(Data(hexadecimalString: "04802ed7376fa7c83c3ecf0b645233f9b3c80238")!)
- buffer.append(Data(hexadecimalString: "05805692724e630a703f01b0a942250f725553d2")!)
- buffer.append(Data(hexadecimalString: "06804ca2727a4051033a550da80905caf77c735d")!)
- buffer.append(Data(hexadecimalString: "07808f937b4b9602c5dd6fa13ae983e00783b28e")!)
- buffer.append(Data(hexadecimalString: "088069846e672c106b339159ead9ee1c08e1a159")!)
-
- XCTAssertEqual(Int(response.bufferLength), buffer.count)
- XCTAssertEqual(response.bufferCRC, buffer.crc16)
-
- let messages = buffer.glucose
-
- XCTAssertNotEqual(response.startTime, messages.first!.timestamp)
- XCTAssertNotEqual(response.endTime, messages.last!.timestamp)
- XCTAssertFalse(messages.first!.timestamp <= messages.last!.timestamp)
-
- XCTAssertEqual(17, messages.count)
- }
-
- func testNotGlucoseBackfill3() {
- let response = GlucoseBackfillRxMessage(data: Data(hexadecimalString: "51000102b6a36500010c6600ac0600000147db0a")!)!
-
- XCTAssertEqual(.ok, TransmitterStatus(rawValue: response.status))
- XCTAssertEqual(1, response.backfillStatus)
- XCTAssertEqual(2, response.identifier)
- XCTAssertEqual(6661046, response.startTime)
- XCTAssertEqual(6687745, response.endTime)
- XCTAssertEqual(1708, response.bufferLength)
- XCTAssertEqual(0x4701, response.bufferCRC)
-
- var buffer = GlucoseBackfillFrameBuffer(identifier: 0x80)
- buffer.append(Data(hexadecimalString: "0180e1234bdf92845cec52822a8894854582b2b2")!)
- buffer.append(Data(hexadecimalString: "02800f8a38cc876ad33ae0acdc25921132cc6f0d")!)
- buffer.append(Data(hexadecimalString: "038032a6cd9e6d447916dd0b9699e499ae79b8d1")!)
- buffer.append(Data(hexadecimalString: "048045f4b95e0ad80955d3a899d6083bd142f863")!)
- buffer.append(Data(hexadecimalString: "05809cf9c189744ab66f6ca5c2833ef27442fa71")!)
- buffer.append(Data(hexadecimalString: "068053694b279275f0d23eb826681e20e5ebb79d")!)
- buffer.append(Data(hexadecimalString: "078098b921155eb5aed63119d5faec3ef3e53a37")!)
- buffer.append(Data(hexadecimalString: "08807c87277557a0828e8dc81ff76f1a6e197103")!)
- buffer.append(Data(hexadecimalString: "0980b8378b133898ce73f7989d67360123e9fdd8")!)
- buffer.append(Data(hexadecimalString: "0a80383ce19d943a38796b594ff95a2dc93bd6a2")!)
- buffer.append(Data(hexadecimalString: "0b806b548c5997dc67ed4fe07bcf236d59dd7f94")!)
- buffer.append(Data(hexadecimalString: "0c802cb2382f40a06fde5f2dff3f0b8226a11f12")!)
- buffer.append(Data(hexadecimalString: "0d8029800ae513c5b7bc8ea733544b7da84ded17")!)
- buffer.append(Data(hexadecimalString: "0e80a95b6c3d36183e4409f916a6f1f775af338e")!)
- buffer.append(Data(hexadecimalString: "0f80d098732f2abcf4a90628f321a048349142ff")!)
- buffer.append(Data(hexadecimalString: "108077294e9d029bdc0602c76671d88ff4a87596")!)
- buffer.append(Data(hexadecimalString: "1180bac50f8d705f6732c34b935a0b06545d6d8f")!)
- buffer.append(Data(hexadecimalString: "1280cf6b9eb0d2f0059c1a7b5c65acb83eb43836")!)
- buffer.append(Data(hexadecimalString: "13802f408f68fc7e48858daecf64d01f3f61827e")!)
- buffer.append(Data(hexadecimalString: "1480cd5975c1062ed45311a2602c0bbc9c78cf21")!)
- buffer.append(Data(hexadecimalString: "1580b6e27f3350bc7d4eb908313710931cbd4f23")!)
- buffer.append(Data(hexadecimalString: "168061f70e5e27e8b72faecfbb58b6b6ff65cbf0")!)
- buffer.append(Data(hexadecimalString: "178066bdd3a0b1e1ed0af8b2af88dcb1f4b1c3a4")!)
- buffer.append(Data(hexadecimalString: "18801eb9326019bca25b74804d196c04d079e495")!)
- buffer.append(Data(hexadecimalString: "1980a29097393f81aaef79ef421af54ccd3c35ed")!)
- buffer.append(Data(hexadecimalString: "1a80a3039b0372ddd79ef65293e4e99484573ab3")!)
- buffer.append(Data(hexadecimalString: "1b807e755140ea79b1913a7c491e606b7d1e4542")!)
- buffer.append(Data(hexadecimalString: "1c800c968daf03958bd8784e1cf8cea4fa903a80")!)
- buffer.append(Data(hexadecimalString: "1d8044c5c7baebadbf8e6877d725ab84484e6755")!)
- buffer.append(Data(hexadecimalString: "1e8036be160e8a03d2c07552fc513c8869170528")!)
- buffer.append(Data(hexadecimalString: "1f8038483ab634e7707e9ab8c8e3f87dd67f423f")!)
- buffer.append(Data(hexadecimalString: "2080f184e4457558d9b7944f21d6421b717ddfb1")!)
- buffer.append(Data(hexadecimalString: "2180bb4da6197852102a3a04b8acccea3c54f0f9")!)
- buffer.append(Data(hexadecimalString: "2280da93975f3ea1c39d2aff5dbbc4b183b66044")!)
- buffer.append(Data(hexadecimalString: "23804678951cdc83923fe5a88bda66221a48360b")!)
- buffer.append(Data(hexadecimalString: "2480aa9dc3fee16106bd551754d896da72ff772c")!)
- buffer.append(Data(hexadecimalString: "2580b825bb4eba580b57caadda1b90b449a8f2c5")!)
- buffer.append(Data(hexadecimalString: "2680117b62c286b395d2bf016848c65953595f19")!)
- buffer.append(Data(hexadecimalString: "27806d524b2b191bd9582f47fd3956ab851207af")!)
- buffer.append(Data(hexadecimalString: "2880c7df85c2ee5e9b3f5ae68ffba44a86e237e8")!)
- buffer.append(Data(hexadecimalString: "2980947fec3646851a510c8a61c0b3b7d90e410b")!)
- buffer.append(Data(hexadecimalString: "2a8014b04b3ff32e4d9d16f46880533cf4562af4")!)
- buffer.append(Data(hexadecimalString: "2b80c754e48edfa84f2f3b29976ce59cc110747d")!)
- buffer.append(Data(hexadecimalString: "2c8095a3ab4b66254954a51ca5e5c92d07be80fc")!)
- buffer.append(Data(hexadecimalString: "2d80bc4afa73d7f222f1b9e56083171057e32ca3")!)
- buffer.append(Data(hexadecimalString: "2e80c88dbe9a052d7ffd29d2f665bdd66811712f")!)
- buffer.append(Data(hexadecimalString: "2f804d2f9ee36fd6f3f48c30429c1629e39bbe3f")!)
- buffer.append(Data(hexadecimalString: "30808b01f598fc6420d85b3190d15f8d55f43faf")!)
- buffer.append(Data(hexadecimalString: "31801c171908c8ded10e81123f453c571c8f5199")!)
- buffer.append(Data(hexadecimalString: "32806275a5652f2447f63f1ab5d0dac84387d80c")!)
- buffer.append(Data(hexadecimalString: "3380f095361816ab06f0209a6ec3411c8f0c6ce1")!)
- buffer.append(Data(hexadecimalString: "3480a99ac0dae0c87f6a1d4ee4fe4e19671c29ba")!)
- buffer.append(Data(hexadecimalString: "3580811db50e1625a3b88305ea5c34b53e20700e")!)
- buffer.append(Data(hexadecimalString: "36800fbf211b6a454c788aa17b0cf14db76695a9")!)
- buffer.append(Data(hexadecimalString: "3780dfc186d1c189114f182709efc464f48c6b2f")!)
- buffer.append(Data(hexadecimalString: "38805e629e8e6457b1ec149897210cb6336b123f")!)
- buffer.append(Data(hexadecimalString: "398045d4dc9f4c074ec0e926a8d1768ae92b4866")!)
- buffer.append(Data(hexadecimalString: "3a801edf0d5d1c1a86c90c5eeef69e115fdd513a")!)
- buffer.append(Data(hexadecimalString: "3b8084223228b158081b465c74454450ec19a4c1")!)
- buffer.append(Data(hexadecimalString: "3c80fa306d71fc211bd9b9e55aeb16c582d21ec2")!)
- buffer.append(Data(hexadecimalString: "3d8072d8bbec74f1436958db431a92fc66cf5dd2")!)
- buffer.append(Data(hexadecimalString: "3e80888ef69a91f8dbb0ce70b6e5ec9289245878")!)
- buffer.append(Data(hexadecimalString: "3f8069c0d6d14e580be92f87a3255e124b25b451")!)
- buffer.append(Data(hexadecimalString: "4080b3cbae3d50ea52720bf5029243a4a9fea906")!)
- buffer.append(Data(hexadecimalString: "4180384321d07a4b5378aa272c9a7247830624b8")!)
- buffer.append(Data(hexadecimalString: "4280acf0b265dd82b68aeec5114161a34135b30e")!)
- buffer.append(Data(hexadecimalString: "43802d709c604266db64a4b5a5e6f6d8cfd7ece1")!)
- buffer.append(Data(hexadecimalString: "44807b48711b0630cd919dbf9ea7bf81efa1e8f1")!)
- buffer.append(Data(hexadecimalString: "4580c0282b679f9746ece875482d5e9a5ed59cb8")!)
- buffer.append(Data(hexadecimalString: "46808c7b718de4299f081449cce9aa9afadfcea9")!)
- buffer.append(Data(hexadecimalString: "478066cd4c36d6e816413b15955c958da4d8e866")!)
- buffer.append(Data(hexadecimalString: "48809b5170078157c542236bc7a09c96bc559069")!)
- buffer.append(Data(hexadecimalString: "49800be65a0bce639c69cd3d64db0fa22570756f")!)
- buffer.append(Data(hexadecimalString: "4a80e5ebd5381b077a8ac56e952b631256a076cc")!)
- buffer.append(Data(hexadecimalString: "4b80fb32d28e39021d49dc7b7ee65272ca1f28c1")!)
- buffer.append(Data(hexadecimalString: "4c8004486cc3dcad9f39c602d3ed9030e327cec3")!)
- buffer.append(Data(hexadecimalString: "4d809a5800c6d647c5f99e40a15327957745dce1")!)
- buffer.append(Data(hexadecimalString: "4e80d03a0b5368fda78b28d3975500ab160ac693")!)
- buffer.append(Data(hexadecimalString: "4f80dbc5ea65f540933f858a425ecdb378f62990")!)
- buffer.append(Data(hexadecimalString: "50802e7980ce9365ad4e434308fb2a8102dc9f6a")!)
- buffer.append(Data(hexadecimalString: "5180b71311e183ad9feecfd43b68072d5a9ad4af")!)
- buffer.append(Data(hexadecimalString: "5280e721c37d2b57f95cbf5f51025fb22b6ca60c")!)
- buffer.append(Data(hexadecimalString: "53805749eb01f070a5b015dcd0f68f5fea0b40c6")!)
- buffer.append(Data(hexadecimalString: "5480fae4ee747357e4d73265ad9411c565c41865")!)
- buffer.append(Data(hexadecimalString: "5580b75e9c62c7c2aa3ea3f94d219ef7330077d7")!)
- buffer.append(Data(hexadecimalString: "5680f2c59ee6b54a")!)
-
- XCTAssertEqual(Int(response.bufferLength), buffer.count)
- XCTAssertEqual(response.bufferCRC, buffer.crc16)
-
- let messages = buffer.glucose
-
- XCTAssertNotEqual(response.startTime, messages.first!.timestamp)
- XCTAssertNotEqual(response.endTime, messages.last!.timestamp)
- XCTAssertFalse(messages.first!.timestamp <= messages.last!.timestamp)
-
- XCTAssertEqual(191, messages.count)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseRxMessageTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseRxMessageTests.swift
deleted file mode 100644
index a966dba6d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseRxMessageTests.swift
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// GlucoseRxMessageTests.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/5/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-
-class GlucoseRxMessageTests: XCTestCase {
-
- func testMessageData() {
- let data = Data(hexadecimalString: "3100680a00008a715700cc0006ffc42a")!
- let message = GlucoseRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(2664, message.sequence)
- XCTAssertEqual(5730698, message.glucose.timestamp)
- XCTAssertFalse(message.glucose.glucoseIsDisplayOnly)
- XCTAssertEqual(204, message.glucose.glucose)
- XCTAssertEqual(6, message.glucose.state)
- XCTAssertEqual(-1, message.glucose.trend)
- }
-
- func testNegativeTrend() {
- let data = Data(hexadecimalString: "31006f0a0000be7957007a0006e4818d")!
- let message = GlucoseRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(2671, message.sequence)
- XCTAssertEqual(5732798, message.glucose.timestamp)
- XCTAssertFalse(message.glucose.glucoseIsDisplayOnly)
- XCTAssertEqual(122, message.glucose.glucose)
- XCTAssertEqual(6, message.glucose.state)
- XCTAssertEqual(-28, message.glucose.trend)
- }
-
- func testDisplayOnly() {
- let data = Data(hexadecimalString: "3100700a0000f17a5700584006e3cee9")!
- let message = GlucoseRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(2672, message.sequence)
- XCTAssertEqual(5733105, message.glucose.timestamp)
- XCTAssertTrue(message.glucose.glucoseIsDisplayOnly)
- XCTAssertEqual(88, message.glucose.glucose)
- XCTAssertEqual(6, message.glucose.state)
- XCTAssertEqual(-29, message.glucose.trend)
- }
-
- func testOldTransmitter() {
- let data = Data(hexadecimalString: "3100aa00000095a078008b00060a8b34")!
- let message = GlucoseRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(170, message.sequence)
- XCTAssertEqual(7905429, message.glucose.timestamp) // 90 days, status is still OK
- XCTAssertFalse(message.glucose.glucoseIsDisplayOnly)
- XCTAssertEqual(139, message.glucose.glucose)
- XCTAssertEqual(6, message.glucose.state)
- XCTAssertEqual(10, message.glucose.trend)
- }
-
- func testZeroSequence() {
- let data = Data(hexadecimalString: "3100000000008eb14d00820006f6a038")!
- let message = GlucoseRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(0, message.sequence)
- XCTAssertEqual(5091726, message.glucose.timestamp)
- XCTAssertFalse(message.glucose.glucoseIsDisplayOnly)
- XCTAssertEqual(130, message.glucose.glucose)
- XCTAssertEqual(6, message.glucose.state)
- XCTAssertEqual(-10, message.glucose.trend)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseTests.swift
deleted file mode 100644
index 119136a66..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/GlucoseTests.swift
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// GlucoseTests.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 8/6/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import XCTest
-import HealthKit
-@testable import CGMBLEKit
-
-class GlucoseTests: XCTestCase {
-
- var timeMessage: TransmitterTimeRxMessage!
- var calendar = Calendar(identifier: .gregorian)
- var activationDate: Date!
-
- override func setUp() {
- super.setUp()
-
- let data = Data(hexadecimalString: "2500470272007cff710001000000fa1d")!
- timeMessage = TransmitterTimeRxMessage(data: data)!
-
- calendar.timeZone = TimeZone(identifier: "UTC")!
-
- activationDate = calendar.date(from: DateComponents(year: 2016, month: 10, day: 1))!
- }
-
- func testMessageData() {
- let data = Data(hexadecimalString: "3100680a00008a715700cc0006ffc42a")!
- let message = GlucoseRxMessage(data: data)!
- let glucose = Glucose(transmitterID: "123456", glucoseMessage: message, timeMessage: timeMessage, activationDate: activationDate)
-
- XCTAssertEqual(TransmitterStatus.ok, glucose.status)
- XCTAssertEqual(calendar.date(from: DateComponents(year: 2016, month: 12, day: 6, hour: 7, minute: 51, second: 38))!, glucose.readDate)
- XCTAssertEqual(calendar.date(from: DateComponents(year: 2016, month: 12, day: 26, hour: 11, minute: 16, second: 12))!, glucose.sessionStartDate)
- XCTAssertFalse(glucose.isDisplayOnly)
- XCTAssertEqual(204, glucose.glucose?.doubleValue(for: .milligramsPerDeciliter))
- XCTAssertEqual(.known(.ok), glucose.state)
- XCTAssertEqual(-1, glucose.trend)
- }
-
- func testNegativeTrend() {
- let data = Data(hexadecimalString: "31006f0a0000be7957007a0006e4818d")!
- let message = GlucoseRxMessage(data: data)!
- let glucose = Glucose(transmitterID: "123456", glucoseMessage: message, timeMessage: timeMessage, activationDate: activationDate)
-
- XCTAssertEqual(TransmitterStatus.ok, glucose.status)
- XCTAssertEqual(calendar.date(from: DateComponents(year: 2016, month: 12, day: 6, hour: 8, minute: 26, second: 38))!, glucose.readDate)
- XCTAssertFalse(glucose.isDisplayOnly)
- XCTAssertEqual(122, glucose.glucose?.doubleValue(for: .milligramsPerDeciliter))
- XCTAssertEqual(.known(.ok), glucose.state)
- XCTAssertEqual(-28, glucose.trend)
- }
-
- func testDisplayOnly() {
- let data = Data(hexadecimalString: "3100700a0000f17a5700584006e3cee9")!
- let message = GlucoseRxMessage(data: data)!
- let glucose = Glucose(transmitterID: "123456", glucoseMessage: message, timeMessage: timeMessage, activationDate: activationDate)
-
- XCTAssertEqual(TransmitterStatus.ok, glucose.status)
- XCTAssertEqual(calendar.date(from: DateComponents(year: 2016, month: 12, day: 6, hour: 8, minute: 31, second: 45))!, glucose.readDate)
- XCTAssertTrue(glucose.isDisplayOnly)
- XCTAssertEqual(88, glucose.glucose?.doubleValue(for: .milligramsPerDeciliter))
- XCTAssertEqual(.known(.ok), glucose.state)
- XCTAssertEqual(-29, message.glucose.trend)
- }
-
- func testOldTransmitter() {
- let data = Data(hexadecimalString: "3100aa00000095a078008b00060a8b34")!
- let message = GlucoseRxMessage(data: data)!
- let glucose = Glucose(transmitterID: "123456", glucoseMessage: message, timeMessage: timeMessage, activationDate: activationDate)
-
- XCTAssertEqual(TransmitterStatus.ok, glucose.status)
- XCTAssertEqual(calendar.date(from: DateComponents(year: 2016, month: 12, day: 31, hour: 11, minute: 57, second: 09))!, glucose.readDate) // 90 days, status is still OK
- XCTAssertFalse(glucose.isDisplayOnly)
- XCTAssertEqual(139, glucose.glucose?.doubleValue(for: .milligramsPerDeciliter))
- XCTAssertEqual(.known(.ok), glucose.state)
- XCTAssertEqual(10, message.glucose.trend)
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/Info.plist b/Dependencies/CGMBLEKit/CGMBLEKitTests/Info.plist
deleted file mode 100644
index 6a4169050..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- en
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- BNDL
- CFBundleShortVersionString
- 3.2
- CFBundleSignature
- ????
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/SessionStartRxMessageTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/SessionStartRxMessageTests.swift
deleted file mode 100644
index f261a996c..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/SessionStartRxMessageTests.swift
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// SessionStartRxMessageTests.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 6/4/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-/// Thanks to https://github.com/mthatcher for the fixtures!
-class SessionStartRxMessageTests: XCTestCase {
-
- func testSuccessfulStart() {
- var data = Data(hexadecimalString: "2700014bf871004bf87100e9f8710095d9")!
- var message = SessionStartRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(1, message.received)
- XCTAssertEqual(7469131, message.requestedStartTime)
- XCTAssertEqual(7469131, message.sessionStartTime)
- XCTAssertEqual(7469289, message.transmitterTime)
-
- data = Data(hexadecimalString: "2700012bfd71002bfd710096fd71000f6a")!
- message = SessionStartRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(1, message.received)
- XCTAssertEqual(7470379, message.requestedStartTime)
- XCTAssertEqual(7470379, message.sessionStartTime)
- XCTAssertEqual(7470486, message.transmitterTime)
-
- data = Data(hexadecimalString: "2700017cff71007cff7100eeff7100aeed")!
- message = SessionStartRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(1, message.received)
- XCTAssertEqual(7470972, message.requestedStartTime)
- XCTAssertEqual(7470972, message.sessionStartTime)
- XCTAssertEqual(7471086, message.transmitterTime)
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/SessionStopRxMessageTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/SessionStopRxMessageTests.swift
deleted file mode 100644
index 3812e2f43..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/SessionStopRxMessageTests.swift
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// SessionStopRxMessageTests.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 6/4/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-/// Thanks to https://github.com/mthatcher for the fixtures!
-class SessionStopRxMessageTests: XCTestCase {
-
- func testSuccessfulStop() {
- var data = Data(hexadecimalString: "29000128027200ffffffff47027200ba85")!
- var message = SessionStopRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(1, message.received)
- XCTAssertEqual(7471656, message.sessionStopTime)
- XCTAssertEqual(0xffffffff, message.sessionStartTime)
- XCTAssertEqual(7471687, message.transmitterTime)
-
- data = Data(hexadecimalString: "2900013ffe7100ffffffffc2fe71008268")!
- message = SessionStopRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(1, message.received)
- XCTAssertEqual(7470655, message.sessionStopTime)
- XCTAssertEqual(0xffffffff, message.sessionStartTime)
- XCTAssertEqual(7470786, message.transmitterTime)
-
- data = Data(hexadecimalString: "290001f5fb7100ffffffff6afc7100fa8a")!
- message = SessionStopRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(1, message.received)
- XCTAssertEqual(7470069, message.sessionStopTime)
- XCTAssertEqual(0xffffffff, message.sessionStartTime)
- XCTAssertEqual(7470186, message.transmitterTime)
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterIDTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterIDTests.swift
deleted file mode 100644
index 7fffe4bf2..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterIDTests.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// TransmitterIDTests.swift
-// xDripG5Tests
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-class TransmitterIDTests: XCTestCase {
-
- /// Sanity check the hash computation path
- func testComputeHash() {
- let id = TransmitterID(id: "123456")
-
- XCTAssertEqual("e60d4a7999b0fbb2", id.computeHash(of: Data(hexadecimalString: "0123456789abcdef")!)!.hexadecimalString)
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterTimeRxMessageTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterTimeRxMessageTests.swift
deleted file mode 100644
index 1106ceea5..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterTimeRxMessageTests.swift
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// TransmitterTimeRxMessageTests.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 6/4/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-/// Thanks to https://github.com/mthatcher for the fixtures!
-class TransmitterTimeRxMessageTests: XCTestCase {
-
- func testNoSession() {
- var data = Data(hexadecimalString: "2500e8f87100ffffffff010000000a70")!
- var message = TransmitterTimeRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(7469288, message.currentTime)
- XCTAssertEqual(0xffffffff, message.sessionStartTime)
-
- data = Data(hexadecimalString: "250096fd7100ffffffff01000000226d")!
- message = TransmitterTimeRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(7470486, message.currentTime)
- XCTAssertEqual(0xffffffff, message.sessionStartTime)
-
- data = Data(hexadecimalString: "2500eeff7100ffffffff010000008952")!
- message = TransmitterTimeRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(7471086, message.currentTime)
- XCTAssertEqual(0xffffffff, message.sessionStartTime)
- }
-
- func testInSession() {
- var data = Data(hexadecimalString: "2500470272007cff710001000000fa1d")!
- var message = TransmitterTimeRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(7471687, message.currentTime)
- XCTAssertEqual(7470972, message.sessionStartTime)
-
- data = Data(hexadecimalString: "2500beb24d00f22d4d000100000083c0")!
- message = TransmitterTimeRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual(5092030, message.currentTime)
- XCTAssertEqual(5058034, message.sessionStartTime)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterVersionRxMessageTests.swift b/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterVersionRxMessageTests.swift
deleted file mode 100644
index d7ab08497..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitTests/TransmitterVersionRxMessageTests.swift
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// TransmitterVersionRxMessageTests.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 9/29/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import XCTest
-@testable import CGMBLEKit
-
-class TransmitterVersionRxMessageTests: XCTestCase {
-
- func testRxMessage() {
- let data = Data(hexadecimalString: "4b0001000011df2900005100037000f00009b6")!
- let message = TransmitterVersionRxMessage(data: data)!
-
- XCTAssertEqual(0, message.status)
- XCTAssertEqual([1, 0, 0, 17], message.firmwareVersion)
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/Contents.json b/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/Contents.json
deleted file mode 100644
index 73c00596a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/Contents.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/g6.imageset/Contents.json b/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/g6.imageset/Contents.json
deleted file mode 100644
index 691ef107b..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/g6.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "filename" : "g6.png",
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/g6.imageset/g6.png b/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/g6.imageset/g6.png
deleted file mode 100644
index babfdfeb3..000000000
Binary files a/Dependencies/CGMBLEKit/CGMBLEKitUI/Assets.xcassets/g6.imageset/g6.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/Base.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/Base.lproj/Localizable.strings
deleted file mode 100644
index 8ed9ea571..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/Base.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Cancel";
-
-/* Title describing glucose date */
-"Date" = "Date";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Delete CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glucose";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Adjusted)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Latest Calibration";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Latest Reading";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Latest Connection";
-
-/* Button title to open CGM app */
-"Open App" = "Open App";
-
-/* Title describing sensor session age */
-"Session Age" = "Session Age";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Data Synchronization";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Transmitter Age";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Transmitter ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/Base.lproj/TransmitterManagerSetup.storyboard b/Dependencies/CGMBLEKit/CGMBLEKitUI/Base.lproj/TransmitterManagerSetup.storyboard
deleted file mode 100644
index 57ddeefaf..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/Base.lproj/TransmitterManagerSetup.storyboard
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/CGMBLEKitUI.h b/Dependencies/CGMBLEKit/CGMBLEKitUI/CGMBLEKitUI.h
deleted file mode 100644
index ce5764e08..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/CGMBLEKitUI.h
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// CGMBLEKitUI.h
-// CGMBLEKitUI
-//
-// Created by Nathan Racklyeft on 7/28/18.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-#import
-
-//! Project version number for CGMBLEKitUI.
-FOUNDATION_EXPORT double CGMBLEKitUIVersionNumber;
-
-//! Project version string for CGMBLEKitUI.
-FOUNDATION_EXPORT const unsigned char CGMBLEKitUIVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/IdentifiableClass.swift b/Dependencies/CGMBLEKit/CGMBLEKitUI/IdentifiableClass.swift
deleted file mode 100644
index 4f3c5f308..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/IdentifiableClass.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// IdentifiableClass.swift
-// Naterade
-//
-// Created by Nathan Racklyeft on 5/22/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-protocol IdentifiableClass: AnyObject {
- static var className: String { get }
-}
-
-
-extension IdentifiableClass {
- static var className: String {
- return NSStringFromClass(self).components(separatedBy: ".").last!
- }
-}
-
-
-extension UITableViewCell: IdentifiableClass { }
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/Info.plist b/Dependencies/CGMBLEKit/CGMBLEKitUI/Info.plist
deleted file mode 100644
index 506539df6..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 3.2
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
- NSPrincipalClass
-
-
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterIDSetupViewController.swift b/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterIDSetupViewController.swift
deleted file mode 100644
index fc3cd5a47..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterIDSetupViewController.swift
+++ /dev/null
@@ -1,151 +0,0 @@
-//
-// TransmitterIDSetupViewController.swift
-// CGMBLEKitUI
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-import LoopKit
-import LoopKitUI
-import CGMBLEKit
-import ShareClient
-
-class TransmitterIDSetupViewController: SetupTableViewController {
-
- lazy private(set) var shareManager = ShareClientManager()
-
- private func updateShareUsername() {
- shareUsernameLabel.text = shareManager.shareService.username ?? SettingsTableViewCell.TapToSetString
- }
-
- private(set) var transmitterID: String? {
- get {
- return transmitterIDTextField.text
- }
- set {
- transmitterIDTextField.text = newValue
- }
- }
-
- private func updateStateForSettings() {
- let isReadyToRead = transmitterID?.count == 6
-
- if isReadyToRead {
- continueState = .completed
- } else {
- continueState = .inputSettings
- }
- }
-
- private enum State {
- case loadingView
- case inputSettings
- case completed
- }
-
- private var continueState: State = .loadingView {
- didSet {
- switch continueState {
- case .loadingView:
- updateStateForSettings()
- case .inputSettings:
- footerView.primaryButton.isEnabled = false
- case .completed:
- footerView.primaryButton.isEnabled = true
- }
- }
- }
-
- override func continueButtonPressed(_ sender: Any) {
- if continueState == .completed,
- let setupViewController = navigationController as? TransmitterSetupViewController,
- let transmitterID = transmitterID
- {
- setupViewController.completeSetup(state: TransmitterManagerState(transmitterID: transmitterID))
- }
- }
-
- override func cancelButtonPressed(_ sender: Any) {
- if transmitterIDTextField.isFirstResponder {
- transmitterIDTextField.resignFirstResponder()
- } else {
- super.cancelButtonPressed(sender)
- }
- }
-
- override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
- return continueState == .completed
- }
-
- // MARK: -
-
- @IBOutlet private var shareUsernameLabel: UILabel!
-
- @IBOutlet private var transmitterIDTextField: UITextField!
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- updateShareUsername()
-
- continueState = .inputSettings
- }
-
- // MARK: - UITableViewDelegate
-
- private enum Section: Int {
- case transmitterID
- case share
- }
-
- override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- switch Section(rawValue: indexPath.section)! {
- case .transmitterID:
- tableView.deselectRow(at: indexPath, animated: false)
- case .share:
- let authVC = AuthenticationViewController(authentication: shareManager.shareService)
- authVC.authenticationObserver = { [weak self] (service) in
- self?.shareManager.shareService = service
- self?.updateShareUsername()
- }
-
- show(authVC, sender: nil)
- }
- }
-}
-
-
-extension TransmitterIDSetupViewController: UITextFieldDelegate {
- func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
- guard let text = textField.text, let stringRange = Range(range, in: text) else {
- updateStateForSettings()
- return true
- }
-
- let newText = text.replacingCharacters(in: stringRange, with: string)
-
- if newText.count >= 6 {
- if newText.count == 6 {
- textField.text = newText
- textField.resignFirstResponder()
- }
-
- updateStateForSettings()
- return false
- }
-
- textField.text = newText
- updateStateForSettings()
- return false
- }
-
- func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
- return true
- }
-
- func textFieldShouldReturn(_ textField: UITextField) -> Bool {
- textField.resignFirstResponder()
- return true
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterManager+UI.swift b/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterManager+UI.swift
deleted file mode 100644
index bbe0fe353..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterManager+UI.swift
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// TransmitterManager+UI.swift
-// Loop
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import SwiftUI
-import LoopKit
-import LoopKitUI
-import HealthKit
-import CGMBLEKit
-
-
-extension G5CGMManager: CGMManagerUI {
- public static var onboardingImage: UIImage? {
- return nil
- }
-
- public static func setupViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) -> SetupUIResult {
- let setupVC = TransmitterSetupViewController.instantiateFromStoryboard()
- setupVC.cgmManagerType = self
- return .userInteractionRequired(setupVC)
- }
-
- public func settingsViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) ->CGMManagerViewController {
- let settings = TransmitterSettingsViewController(cgmManager: self, displayGlucoseUnitObservable: displayGlucoseUnitObservable)
- let nav = CGMManagerSettingsNavigationViewController(rootViewController: settings)
- return nav
- }
-
- public var smallImage: UIImage? {
- return nil
- }
-
- // TODO Placeholder.
- public var cgmStatusHighlight: DeviceStatusHighlight? {
- return nil
- }
-
- // TODO Placeholder.
- public var cgmStatusBadge: DeviceStatusBadge? {
- return nil
- }
-
- // TODO Placeholder.
- public var cgmLifecycleProgress: DeviceLifecycleProgress? {
- return nil
- }
-}
-
-
-extension G6CGMManager: CGMManagerUI {
- public static var onboardingImage: UIImage? {
- return nil
- }
-
- public static func setupViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) -> SetupUIResult {
- let setupVC = TransmitterSetupViewController.instantiateFromStoryboard()
- setupVC.cgmManagerType = self
- return .userInteractionRequired(setupVC)
- }
-
- public func settingsViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) ->CGMManagerViewController {
- let settings = TransmitterSettingsViewController(cgmManager: self, displayGlucoseUnitObservable: displayGlucoseUnitObservable)
- let nav = CGMManagerSettingsNavigationViewController(rootViewController: settings)
- return nav
- }
-
- public var smallImage: UIImage? {
- UIImage(named: "g6", in: Bundle(for: TransmitterSetupViewController.self), compatibleWith: nil)!
- }
-
- // TODO Placeholder.
- public var cgmStatusHighlight: DeviceStatusHighlight? {
- return nil
- }
-
- // TODO Placeholder.
- public var cgmStatusBadge: DeviceStatusBadge? {
- return nil
- }
-
- // TODO Placeholder.
- public var cgmLifecycleProgress: DeviceLifecycleProgress? {
- return nil
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterSettingsViewController.swift b/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterSettingsViewController.swift
deleted file mode 100644
index 94d7f385c..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterSettingsViewController.swift
+++ /dev/null
@@ -1,558 +0,0 @@
-//
-// TransmitterSettingsViewController.swift
-// Loop
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-import Combine
-import HealthKit
-import LoopKit
-import LoopKitUI
-import CGMBLEKit
-import ShareClientUI
-
-class TransmitterSettingsViewController: UITableViewController {
-
- let cgmManager: TransmitterManager & CGMManagerUI
-
- private let displayGlucoseUnitObservable: DisplayGlucoseUnitObservable
-
- private lazy var cancellables = Set()
-
- private var glucoseUnit: HKUnit {
- displayGlucoseUnitObservable.displayGlucoseUnit
- }
-
- init(cgmManager: TransmitterManager & CGMManagerUI, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable) {
- self.cgmManager = cgmManager
- self.displayGlucoseUnitObservable = displayGlucoseUnitObservable
-
- super.init(style: .grouped)
-
- cgmManager.addObserver(self, queue: .main)
-
- displayGlucoseUnitObservable.$displayGlucoseUnit
- .sink { [weak self] _ in self?.tableView.reloadData() }
- .store(in: &cancellables)
- }
-
- required init?(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- title = cgmManager.localizedTitle
-
- tableView.rowHeight = UITableView.automaticDimension
- tableView.estimatedRowHeight = 44
-
- tableView.sectionHeaderHeight = UITableView.automaticDimension
- tableView.estimatedSectionHeaderHeight = 55
-
- tableView.register(SettingsTableViewCell.self, forCellReuseIdentifier: SettingsTableViewCell.className)
- tableView.register(TextButtonTableViewCell.self, forCellReuseIdentifier: TextButtonTableViewCell.className)
- tableView.register(SwitchTableViewCell.self, forCellReuseIdentifier: SwitchTableViewCell.className)
- let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneTapped(_:)))
- self.navigationItem.setRightBarButton(button, animated: false)
- }
-
- @objc func doneTapped(_ sender: Any) {
- complete()
- }
-
- private func complete() {
- if let nav = navigationController as? SettingsNavigationViewController {
- nav.notifyComplete()
- }
- }
-
- override func viewWillAppear(_ animated: Bool) {
- if clearsSelectionOnViewWillAppear {
- // Manually invoke the delegate for rows deselecting on appear
- for indexPath in tableView.indexPathsForSelectedRows ?? [] {
- _ = tableView(tableView, willDeselectRowAt: indexPath)
- }
- }
-
- super.viewWillAppear(animated)
- }
-
- // MARK: - UITableViewDataSource
-
- private enum Section: Int, CaseIterable {
- case transmitterID
- case remoteDataSync
- case latestReading
- case latestCalibration
- case latestConnection
- case ages
- case share
- case delete
- }
-
- override func numberOfSections(in tableView: UITableView) -> Int {
- return Section.allCases.count
- }
-
- private enum LatestReadingRow: Int, CaseIterable {
- case glucose
- case date
- case trend
- case status
- }
-
- private enum LatestCalibrationRow: Int, CaseIterable {
- case glucose
- case date
- }
-
- private enum LatestConnectionRow: Int, CaseIterable {
- case date
- }
-
- private enum AgeRow: Int, CaseIterable {
- case sensorAge
- case sensorCountdown
- case sensorExpirationDate
- case transmitter
- }
-
- private enum ShareRow: Int, CaseIterable {
- case settings
- case openApp
- }
-
- override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
- switch Section(rawValue: section)! {
- case .transmitterID:
- return 1
- case .remoteDataSync:
- return 1
- case .latestReading:
- return LatestReadingRow.allCases.count
- case .latestCalibration:
- return LatestCalibrationRow.allCases.count
- case .latestConnection:
- return LatestConnectionRow.allCases.count
- case .ages:
- return AgeRow.allCases.count
- case .share:
- return ShareRow.allCases.count
- case .delete:
- return 1
- }
- }
-
- private lazy var glucoseFormatter: QuantityFormatter = {
- let formatter = QuantityFormatter()
- formatter.setPreferredNumberFormatter(for: glucoseUnit)
- return formatter
- }()
-
- private lazy var dateFormatter: DateFormatter = {
- let formatter = DateFormatter()
- formatter.dateStyle = .long
- formatter.timeStyle = .long
- formatter.doesRelativeDateFormatting = true
- return formatter
- }()
-
- private lazy var sensorExpirationFullFormatter: DateFormatter = {
- let formatter = DateFormatter()
- formatter.dateStyle = .full
- formatter.timeStyle = .short
- formatter.doesRelativeDateFormatting = true
- //formatter.dateFormat = "E, MMM d 'at' h:mm a"
- return formatter
- }()
-
- private lazy var sensorExpirationRelativeFormatter: DateFormatter = {
- let formatter = DateFormatter()
- formatter.dateStyle = .long
- formatter.timeStyle = .short
- formatter.doesRelativeDateFormatting = true
- return formatter
- }()
-
- private lazy var sensorExpAbsFormatter: DateFormatter = {
- let formatter = DateFormatter()
- formatter.dateStyle = .long
- formatter.timeStyle = .short
- formatter.doesRelativeDateFormatting = false
- return formatter
- }()
-
- private lazy var sessionLengthFormatter: DateComponentsFormatter = {
- let formatter = DateComponentsFormatter()
- formatter.allowedUnits = [.day, .hour, .minute]
- formatter.unitsStyle = .full
- formatter.maximumUnitCount = 2
- return formatter
- }()
-
- private lazy var transmitterLengthFormatter: DateComponentsFormatter = {
- let formatter = DateComponentsFormatter()
- formatter.allowedUnits = [.day]
- formatter.unitsStyle = .full
- return formatter
- }()
-
- override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
- switch Section(rawValue: indexPath.section)! {
- case .transmitterID:
- let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
-
- cell.textLabel?.text = LocalizedString("Transmitter ID", comment: "The title text for the Dexcom G5/G6 transmitter ID config value")
-
- cell.detailTextLabel?.text = cgmManager.transmitter.ID
-
- return cell
- case .remoteDataSync:
- let switchCell = tableView.dequeueReusableCell(withIdentifier: SwitchTableViewCell.className, for: indexPath) as! SwitchTableViewCell
-
- switchCell.selectionStyle = .none
- switchCell.switch?.isOn = cgmManager.shouldSyncToRemoteService
- switchCell.textLabel?.text = LocalizedString("Upload Readings", comment: "The title text for the upload glucose switch cell")
-
- switchCell.switch?.addTarget(self, action: #selector(uploadEnabledChanged(_:)), for: .valueChanged)
-
- return switchCell
- case .latestReading:
- let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
- let glucose = cgmManager.latestReading
-
- switch LatestReadingRow(rawValue: indexPath.row)! {
- case .glucose:
- cell.setGlucose(glucose?.glucose, unit: glucoseUnit, formatter: glucoseFormatter, isDisplayOnly: glucose?.isDisplayOnly ?? false)
- case .date:
- cell.setGlucoseDate(glucose?.readDate, formatter: dateFormatter)
- case .trend:
- cell.textLabel?.text = LocalizedString("Trend", comment: "Title describing glucose trend")
-
- if let trendRate = glucose?.trendRate {
- let glucoseUnitPerMinute = glucoseUnit.unitDivided(by: .minute())
- let trendPerMinute = HKQuantity(unit: glucoseUnit, doubleValue: trendRate.doubleValue(for: glucoseUnitPerMinute))
-
- if let formatted = glucoseFormatter.string(from: trendPerMinute, for: glucoseUnit) {
- cell.detailTextLabel?.text = String(format: LocalizedString("%@/min", comment: "Format string for glucose trend per minute. (1: glucose value and unit)"), formatted)
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- case .status:
- cell.textLabel?.text = LocalizedString("Status", comment: "Title describing CGM calibration and battery state")
-
- if let stateDescription = glucose?.stateDescription, !stateDescription.isEmpty {
- cell.detailTextLabel?.text = stateDescription
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- }
-
- return cell
- case .latestCalibration:
- let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
- let calibration = cgmManager.latestReading?.lastCalibration
-
- switch LatestCalibrationRow(rawValue: indexPath.row)! {
- case .glucose:
- cell.setGlucose(calibration?.glucose, unit: glucoseUnit, formatter: glucoseFormatter, isDisplayOnly: false)
- case .date:
- cell.setGlucoseDate(calibration?.date, formatter: dateFormatter)
- }
-
- return cell
- case .latestConnection:
- let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
- let connection = cgmManager.latestConnection
-
- switch LatestConnectionRow(rawValue: indexPath.row)! {
- case .date:
- cell.setGlucoseDate(connection, formatter: dateFormatter)
- cell.accessoryType = .disclosureIndicator
- }
-
- return cell
- case .ages:
- let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
- let glucose = cgmManager.latestReading
-
- switch AgeRow(rawValue: indexPath.row)! {
- case .sensorAge:
- cell.textLabel?.text = LocalizedString("Session Age", comment: "Title describing sensor session age")
-
- if let stateDescription = glucose?.stateDescription, !stateDescription.isEmpty && !stateDescription.contains("stopped") {
- if let sessionStart = cgmManager.latestReading?.sessionStartDate {
- cell.detailTextLabel?.text = sessionLengthFormatter.string(from: Date().timeIntervalSince(sessionStart))
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
-
- case .sensorCountdown:
- cell.textLabel?.text = LocalizedString("Sensor Expires", comment: "Title describing sensor sensor expiration")
-
- if let stateDescription = glucose?.stateDescription, !stateDescription.isEmpty && !stateDescription.contains("stopped") {
- if let sessionExp = cgmManager.latestReading?.sessionExpDate {
- let sessionCountDown = sessionExp.timeIntervalSince(Date())
- if sessionCountDown < 0 {
- cell.textLabel?.text = LocalizedString("Sensor Expired", comment: "Title describing past sensor sensor expiration")
- cell.detailTextLabel?.text = (sessionLengthFormatter.string(from: sessionCountDown * -1) ?? "") + " ago"
- } else {
- cell.detailTextLabel?.text = sessionLengthFormatter.string(from: sessionCountDown)
- }
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
-
- case .sensorExpirationDate:
- cell.textLabel?.text = ""
- if let stateDescription = glucose?.stateDescription, !stateDescription.isEmpty && !stateDescription.contains("stopped") {
- if let sessionExp = cgmManager.latestReading?.sessionExpDate {
- if sensorExpirationRelativeFormatter.string(from: sessionExp) == sensorExpAbsFormatter.string(from: sessionExp) {
- cell.detailTextLabel?.text = sensorExpirationFullFormatter.string(from: sessionExp)
- } else {
- cell.detailTextLabel?.text = sensorExpirationRelativeFormatter.string(from: sessionExp)
- }
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
-
- case .transmitter:
- cell.textLabel?.text = LocalizedString("Transmitter Age", comment: "Title describing transmitter session age")
-
- if let activation = cgmManager.latestReading?.activationDate {
- cell.detailTextLabel?.text = transmitterLengthFormatter.string(from: Date().timeIntervalSince(activation))
- } else {
- cell.detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- }
-
- return cell
- case .share:
- switch ShareRow(rawValue: indexPath.row)! {
- case .settings:
- let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCell.className, for: indexPath) as! SettingsTableViewCell
- let service = cgmManager.shareManager.shareService
-
- cell.textLabel?.text = service.title
- cell.detailTextLabel?.text = service.username ?? SettingsTableViewCell.TapToSetString
- cell.accessoryType = .disclosureIndicator
-
- return cell
- case .openApp:
- let cell = tableView.dequeueReusableCell(withIdentifier: TextButtonTableViewCell.className, for: indexPath)
-
- cell.textLabel?.text = LocalizedString("Open App", comment: "Button title to open CGM app")
-
- return cell
- }
- case .delete:
- let cell = tableView.dequeueReusableCell(withIdentifier: TextButtonTableViewCell.className, for: indexPath) as! TextButtonTableViewCell
-
- cell.textLabel?.text = LocalizedString("Delete CGM", comment: "Title text for the button to remove a CGM from Loop")
- cell.textLabel?.textAlignment = .center
- cell.tintColor = .delete
- cell.isEnabled = true
- return cell
- }
- }
-
- override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
- switch Section(rawValue: section)! {
- case .transmitterID:
- return nil
- case .remoteDataSync:
- return LocalizedString("Remote Data Synchronization", comment: "Section title for remote data synchronization")
- case .latestReading:
- return LocalizedString("Latest Reading", comment: "Section title for latest glucose reading")
- case .latestCalibration:
- return LocalizedString("Latest Calibration", comment: "Section title for latest glucose calibration")
- case .latestConnection:
- return LocalizedString("Latest Connection", comment: "Section title for latest connection date")
- case .ages:
- return nil
- case .share:
- return nil
- case .delete:
- return " " // Use an empty string for more dramatic spacing
- }
- }
-
- override func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
- switch Section(rawValue: indexPath.section)! {
- case .transmitterID:
- return false
- case .remoteDataSync:
- return false
- case .latestReading:
- return false
- case .latestCalibration:
- return false
- case .latestConnection:
- return true
- case .ages:
- return false
- case .share:
- return true
- case .delete:
- return true
- }
- }
-
- override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
- if self.tableView(tableView, shouldHighlightRowAt: indexPath) {
- return indexPath
- } else {
- return nil
- }
- }
-
- override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- switch Section(rawValue: indexPath.section)! {
- case .transmitterID:
- break
- case .remoteDataSync:
- break
- case .latestReading:
- break
- case .latestCalibration:
- break
- case .latestConnection:
- let vc = CommandResponseViewController(command: { (completionHandler) -> String in
- return String(reflecting: self.cgmManager)
- })
- vc.title = self.title
- show(vc, sender: nil)
- case .ages:
- break
- case .share:
- switch ShareRow(rawValue: indexPath.row)! {
- case .settings:
- let vc = ShareClientSettingsViewController(cgmManager: cgmManager.shareManager, displayGlucoseUnitObservable: displayGlucoseUnitObservable, allowsDeletion: false)
- show(vc, sender: nil)
- return // Don't deselect
- case .openApp:
- if let appURL = URL(string: "dexcomg6://") {
- UIApplication.shared.open(appURL)
- }
- }
- case .delete:
- let confirmVC = UIAlertController(cgmDeletionHandler: {
- self.cgmManager.notifyDelegateOfDeletion {
- DispatchQueue.main.async {
- self.complete()
- }
- }
- })
-
- present(confirmVC, animated: true) {
- tableView.deselectRow(at: indexPath, animated: true)
- }
- }
-
- tableView.deselectRow(at: indexPath, animated: true)
- }
-
- override func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath? {
- switch Section(rawValue: indexPath.section)! {
- case .transmitterID:
- break
- case .remoteDataSync:
- break
- case .latestReading:
- break
- case .latestCalibration:
- break
- case .latestConnection:
- break
- case .ages:
- break
- case .share:
- switch ShareRow(rawValue: indexPath.row)! {
- case .settings:
- tableView.reloadRows(at: [indexPath], with: .fade)
- case .openApp:
- break
- }
- case .delete:
- break
- }
-
- return indexPath
- }
-
- @objc private func uploadEnabledChanged(_ sender: UISwitch) {
- cgmManager.shouldSyncToRemoteService = sender.isOn
- }
-}
-
-
-extension TransmitterSettingsViewController: TransmitterManagerObserver {
- func transmitterManagerDidUpdateLatestReading(_ manager: TransmitterManager) {
- tableView.reloadData()
- }
-}
-
-
-private extension UIAlertController {
- convenience init(cgmDeletionHandler handler: @escaping () -> Void) {
- self.init(
- title: nil,
- message: LocalizedString("Are you sure you want to delete this CGM?", comment: "Confirmation message for deleting a CGM"),
- preferredStyle: .actionSheet
- )
-
- addAction(UIAlertAction(
- title: LocalizedString("Delete CGM", comment: "Button title to delete CGM"),
- style: .destructive,
- handler: { (_) in
- handler()
- }
- ))
-
- let cancel = LocalizedString("Cancel", comment: "The title of the cancel action in an action sheet")
- addAction(UIAlertAction(title: cancel, style: .cancel, handler: nil))
- }
-}
-
-
-private extension SettingsTableViewCell {
- func setGlucose(_ glucose: HKQuantity?, unit: HKUnit, formatter: QuantityFormatter, isDisplayOnly: Bool) {
- if isDisplayOnly {
- textLabel?.text = LocalizedString("Glucose (Adjusted)", comment: "Describes a glucose value adjusted to reflect a recent calibration")
- } else {
- textLabel?.text = LocalizedString("Glucose", comment: "Title describing glucose value")
- }
-
- if let quantity = glucose, let formatted = formatter.string(from: quantity, for: unit) {
- detailTextLabel?.text = formatted
- } else {
- detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- }
-
- func setGlucoseDate(_ date: Date?, formatter: DateFormatter) {
- textLabel?.text = LocalizedString("Date", comment: "Title describing glucose date")
-
- if let date = date {
- detailTextLabel?.text = formatter.string(from: date)
- } else {
- detailTextLabel?.text = SettingsTableViewCell.NoValueString
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterSetupViewController.swift b/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterSetupViewController.swift
deleted file mode 100644
index 8ab4c2fdd..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/TransmitterSetupViewController.swift
+++ /dev/null
@@ -1,96 +0,0 @@
-//
-// TransmitterSetupViewController.swift
-// CGMBLEKitUI
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-import LoopKit
-import LoopKitUI
-import CGMBLEKit
-import ShareClient
-
-class TransmitterSetupViewController: UINavigationController, CGMManagerOnboarding, UINavigationControllerDelegate, CompletionNotifying {
- class func instantiateFromStoryboard() -> TransmitterSetupViewController {
- return UIStoryboard(name: "TransmitterManagerSetup", bundle: Bundle(for: TransmitterSetupViewController.self)).instantiateInitialViewController() as! TransmitterSetupViewController
- }
-
- weak var cgmManagerOnboardingDelegate: CGMManagerOnboardingDelegate?
- weak var completionDelegate: CompletionDelegate?
-
- var cgmManagerType: TransmitterManager.Type!
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- delegate = self
- view.backgroundColor = .systemGroupedBackground
- navigationBar.shadowImage = UIImage()
- }
-
- func completeSetup(state: TransmitterManagerState) {
- if let manager = cgmManagerType.init(state: state) as? CGMManagerUI {
- cgmManagerOnboardingDelegate?.cgmManagerOnboarding(didCreateCGMManager: manager)
- cgmManagerOnboardingDelegate?.cgmManagerOnboarding(didOnboardCGMManager: manager)
- completionDelegate?.completionNotifyingDidComplete(self)
- }
- }
-
- // MARK: - UINavigationControllerDelegate
-
- func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
- // Read state values
- let viewControllers = navigationController.viewControllers
- let count = navigationController.viewControllers.count
-
- if count >= 2 {
- switch viewControllers[count - 2] {
- case _ as TransmitterIDSetupViewController:
- break
- default:
- break
- }
- }
-
- if let setupViewController = viewController as? SetupTableViewController {
- setupViewController.delegate = self
- }
-
- // Set state values
- switch viewController {
- case _ as TransmitterIDSetupViewController:
- break
- default:
- break
- }
-
- // Adjust the appearance for the main setup view controllers only
- if viewController is SetupTableViewController {
- navigationBar.isTranslucent = false
- navigationBar.shadowImage = UIImage()
- } else {
- navigationBar.isTranslucent = true
- navigationBar.shadowImage = nil
- viewController.navigationItem.largeTitleDisplayMode = .never
- }
- }
-
- func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
-
- // Adjust the appearance for the main setup view controllers only
- if viewController is SetupTableViewController {
- navigationBar.isTranslucent = false
- navigationBar.shadowImage = UIImage()
- } else {
- navigationBar.isTranslucent = true
- navigationBar.shadowImage = nil
- }
- }
-}
-
-extension TransmitterSetupViewController: SetupTableViewControllerDelegate {
- public func setupTableViewControllerCancelButtonPressed(_ viewController: SetupTableViewController) {
- completionDelegate?.completionNotifyingDidComplete(self)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/UIColor.swift b/Dependencies/CGMBLEKit/CGMBLEKitUI/UIColor.swift
deleted file mode 100644
index 0095c6b71..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/UIColor.swift
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// UIColor.swift
-// LoopKitUI
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-
-
-extension UIColor {
- static let delete = UIColor.higRed()
-}
-
-
-// MARK: - HIG colors
-// See: https://developer.apple.com/ios/human-interface-guidelines/visual-design/color/
-extension UIColor {
- private static func higRed() -> UIColor {
- return UIColor(red: 1, green: 59 / 255, blue: 48 / 255, alpha: 1)
- }
-}
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ar.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ar.lproj/Localizable.strings
deleted file mode 100644
index a0e15f3cd..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ar.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "هل أنت متأكد أنك تريد حذف هذا CGM؟";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "إلغاء";
-
-/* Title describing glucose date */
-"Date" = "Date";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "حذف CGM";
-
-/* Title describing glucose value */
-"Glucose" = "قراءات السكر";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Adjusted)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Latest Calibration";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Latest Reading";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Latest Connection";
-
-/* Button title to open CGM app */
-"Open App" = "Open App";
-
-/* Title describing sensor session age */
-"Session Age" = "Session Age";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Data Synchronization";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "الحالة";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Transmitter Age";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Transmitter ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ar.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ar.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index e019c4c51..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ar.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credentials";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Transmitter Setup";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "تفاصيل";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Transmitter ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Enter the 6-digit transmitter ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ca.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ca.lproj/Localizable.strings
deleted file mode 100644
index 8ed9ea571..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ca.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Cancel";
-
-/* Title describing glucose date */
-"Date" = "Date";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Delete CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glucose";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Adjusted)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Latest Calibration";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Latest Reading";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Latest Connection";
-
-/* Button title to open CGM app */
-"Open App" = "Open App";
-
-/* Title describing sensor session age */
-"Session Age" = "Session Age";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Data Synchronization";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Transmitter Age";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Transmitter ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ca.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ca.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index d35f2a677..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ca.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credentials";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Transmitter Setup";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Transmitter ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Enter the 6-digit transmitter ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/cs.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/cs.lproj/Localizable.strings
deleted file mode 100644
index ea9199eee..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/cs.lproj/Localizable.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Zrušit";
-
-/* Title describing glucose value */
-"Glucose" = "Glukóza";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/da.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/da.lproj/Localizable.strings
deleted file mode 100644
index 60cb50e5b..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/da.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Er du sikker på, at du vil slette denne CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Annuller";
-
-/* Title describing glucose date */
-"Date" = "Dato";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Slet CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glukose";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Blodsukker (justeret)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Seneste kalibrering";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Seneste aflæsning";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Seneste forbindelse";
-
-/* Button title to open CGM app */
-"Open App" = "Åben app";
-
-/* Title describing sensor session age */
-"Session Age" = "Session-alder";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Synkronisering af fjerndata";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor udløber";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor udløbet";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Sender alder";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Sender ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload aflæsninger";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/da.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/da.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 8c2011431..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/da.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Legitimationsoplysninger";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Senderopsætning";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detalje";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Sender-ID'et kan findes trykt på bagsiden af enheden, på den side af boksen, den kom i, og fra indstillingsmenuerne på modtageren og mobilappen.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Sender ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data kan downloades over internettet fra Share, når transmitterforbindelsen mislykkes.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Indtast det 6-cifrede sender-ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings
deleted file mode 100644
index 99cf84b4d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Sind Sie sicher, dass Sie dieses CGM löschen wollen?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Abbrechen";
-
-/* Title describing glucose date */
-"Date" = "Datum";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "CGM löschen";
-
-/* Title describing glucose value */
-"Glucose" = "Blutzucker";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "BZ-Wert (angepasst)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Letzte Kalibrierung";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Letzter Wert";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Letzte Verbindung";
-
-/* Button title to open CGM app */
-"Open App" = "App öffnen";
-
-/* Title describing sensor session age */
-"Session Age" = "Sitzungsalter";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Daten Synchronisation";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor läuft ab";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor abgelaufen";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Transmitteralter";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Transmitter-ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Werte hochladen";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 1cd9ff533..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/de.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Logindaten";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Transmitter-Setup";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Die Transmitter-ID befindet sich auf der Rückseite des Transmitters, an der Seite der Verpackung und in den Einstellungsmenüs des Empfängers sowie der Dexcom-App.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Transmitter-ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Daten können über das Internet von Share heruntergeladen werden, wenn die Verbindung zum Transmitter unterbrochen ist.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Geben Sie die 6-stellige Transmitter-ID ein";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/en.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/en.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 41859f853..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/en.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credentials";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Transmitter Setup";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Transmitter ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Enter the 6-digit transmitter ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/es.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/es.lproj/Localizable.strings
deleted file mode 100644
index e421c7212..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/es.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "¿Está seguro de que quiere eliminar este MCG?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Cancelar";
-
-/* Title describing glucose date */
-"Date" = "Fecha";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Eliminar MCG";
-
-/* Title describing glucose value */
-"Glucose" = "Glucosa";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Adjusted)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Calibración más reciente";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Dato más reciente";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Conexión más reciente";
-
-/* Button title to open CGM app */
-"Open App" = "Abrir App";
-
-/* Title describing sensor session age */
-"Session Age" = "Tiempo de sesión del sensor";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Sincronización remota de datos";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "El sensor caduca";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor caducado";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Estado";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Edad del transmisor";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Identificación del transmisor";
-
-/* Title describing glucose trend */
-"Trend" = "Tendencia";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Subir Datos";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/es.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/es.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index d58d85944..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/es.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credenciales";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Configuración del transmisor";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detalle";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "La identificación del transmisor puede encontrarse en la parte trasera del dispositivo, en el lateral de la caja en la que venía, o en los menús de ajustes del receptor y la app del teléfono móvil. ";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Identificación del transmisor";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Los datos pueden descargarse, vía internet, desde el Share cuando la conexión del transmisor falla.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Introduzca la identificación de 6 cifras del transmisor";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/fi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/fi.lproj/Localizable.strings
deleted file mode 100644
index f29f7366e..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/fi.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Haluatko varmasti poistaa CGM:n?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Kumoa";
-
-/* Title describing glucose date */
-"Date" = "Aika";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Poista CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glukoosi";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glukoosi (säädetty)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Viimeisin kalibrointi";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Viimeisin lukema";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Viimeisin yhteys";
-
-/* Button title to open CGM app */
-"Open App" = "Avaa sovellus";
-
-/* Title describing sensor session age */
-"Session Age" = "Session ikä";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Etätietojen synkronointi";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Tila";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Lähettimen ikä";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Lähettimen tunniste";
-
-/* Title describing glucose trend */
-"Trend" = "Suunta";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Lataa lukemat";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/fi.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/fi.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 61a0e9075..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/fi.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Tunnukset";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Lähettimen asennus";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Lähettimen tunniste on painettu lähettimen pohjaan ja tuotepakkauksen sivulle. Se löytyy myös vastaanottimen ja mobiilisovelluksen asetusvalikosta.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Lähettimen tunniste";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Tiedot voidaan ladata Internetistä Share-palvelimelta, kun yhteys lähettimeen epäonnistuu.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Syötä 6-numeroinen lähettimen tunniste";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/Localizable.strings
deleted file mode 100644
index e7ec3a113..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Voulez-vous vraiment supprimer ce CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Annuler";
-
-/* Title describing glucose date */
-"Date" = "Date";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Effacer le CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glycémie";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glycémie (ajustée)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Dernier étalonnage";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Dernière mesure";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Dernière connexion";
-
-/* Button title to open CGM app */
-"Open App" = "Ouvrir l’application";
-
-/* Title describing sensor session age */
-"Session Age" = "L’âge de la session";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Synchronisation des données à distance";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Le capteur expire";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Capteur expiré";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Statut";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "L’âge du transmetteur";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID du transmetteur";
-
-/* Title describing glucose trend */
-"Trend" = "Tendance";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Envoyer les données";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index dcb51c6b7..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/fr.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Identifiant";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Configuration du transmetteur";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Détail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "L’ID du transmetteur se trouve sur le dos de l’appareil, sur la boîte dans laquelle il est fourni, et depuis les menus de réglages du récepteur et de l’application mobile.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID du transmetteur";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Les données peuvent être téléchargées depuis Internet avec Share quand la connexion au transmetteur échoue.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Entrez l’ID du transmetteur, composé de 6 lettres et chiffres";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/he.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/he.lproj/Localizable.strings
deleted file mode 100644
index 1a2dc0123..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/he.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Cancel";
-
-/* Title describing glucose date */
-"Date" = "Date";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Delete CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glucose";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Adjusted)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Latest Calibration";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Latest Reading";
-
-/* Section title for latest connection date */
-"Latest Connection" = "חיבור אחרון";
-
-/* Button title to open CGM app */
-"Open App" = "Open App";
-
-/* Title describing sensor session age */
-"Session Age" = "Session Age";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Data Synchronization";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Transmitter Age";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Transmitter ID";
-
-/* Title describing glucose trend */
-"Trend" = "מגמה";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/he.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/he.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index d35f2a677..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/he.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credentials";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Transmitter Setup";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Transmitter ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Enter the 6-digit transmitter ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/hi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/hi.lproj/Localizable.strings
deleted file mode 100644
index 82f4a5b2e..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/hi.lproj/Localizable.strings
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/मिनट";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "निरस्त";
-
-/* Title describing glucose value */
-"Glucose" = "शुगर";
-
-/* Title describing glucose trend */
-"Trend" = "ट्रेंड";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "अपलोड रीडिंग्स";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings
deleted file mode 100644
index a38f99d48..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Mégse";
-
-/* Title describing glucose date */
-"Date" = "Dátum";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "CGM kitörlése";
-
-/* Title describing glucose value */
-"Glucose" = "Glükóz";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Adjusted)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Latest Calibration";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Latest Reading";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Latest Connection";
-
-/* Button title to open CGM app */
-"Open App" = "Open App";
-
-/* Title describing sensor session age */
-"Session Age" = "Session Age";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Data Synchronization";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Transmitter Age";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Jeladó ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index a71c1f12a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/hu.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credentials";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Transmitter Setup";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Jeladó ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Enter the 6-digit transmitter ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/Localizable.strings
deleted file mode 100644
index b21240f0c..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Sei sicuro di voler eliminare questo CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Annulla";
-
-/* Title describing glucose date */
-"Date" = "Data";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Elimina CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glicemia";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glicemie (Corrette)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Ultima calibrazione";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Ultima lettura";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Ultima connessione";
-
-/* Button title to open CGM app */
-"Open App" = "Apri app";
-
-/* Title describing sensor session age */
-"Session Age" = "Età sessione";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Sincronizzazione dei dati remoti";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Scadenza sensore";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensore scaduto";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Stato";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Età trasmettitore";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID trasmettitore";
-
-/* Title describing glucose trend */
-"Trend" = "Tendenza";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Carica letture";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 8d0cf342a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/it.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credenziali";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Configurazione trasmettitore";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Dettaglio";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "L'ID del trasmettitore è riportato sul retro del dispositivo, ai lati della confezione di imballaggio e nel menù impostazioni del ricevitore dell’app per dispositivi mobili.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID trasmettitore";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "In caso di problemi di connessione del trasmettitore, puoi scaricare i dati da Internet grazie alla funzionalità Share.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Inserisci ID a 6 cifre del trasmettitore";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ja.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ja.lproj/Localizable.strings
deleted file mode 100644
index 056dbceb2..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ja.lproj/Localizable.strings
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/分";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "このCGMを削除しますか?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "キャンセル";
-
-/* Title describing glucose date */
-"Date" = "日付";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "CGMを削除";
-
-/* Title describing glucose value */
-"Glucose" = "血糖値";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "グルコース (調整後)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "直近の較正";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "最新の読み取り";
-
-/* Button title to open CGM app */
-"Open App" = "アプリを開く";
-
-/* Title describing sensor session age */
-"Session Age" = "セッション経過時間";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "ステータス";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "トランスミッター経過時間";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "トランスミッタ ID";
-
-/* Title describing glucose trend */
-"Trend" = "トレンド";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ja.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ja.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index ece0fced0..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ja.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "証明";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "トランスミッター設定";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "トランスミッターの接続ができないときに、インターネットでShareからデータをダウンロードできます。";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "6桁のトランスミッタIDを入力";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "トランスミッターIDは、トランスミッタ―の底面、パッケージの側面、またはレシーバとモバイルアプリの設定メニューで確認できます。";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "トランスミッタ ID";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/nb.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/nb.lproj/Localizable.strings
deleted file mode 100644
index 96ca0c89f..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/nb.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Er du sikker på at du vil slette CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Avbryt";
-
-/* Title describing glucose date */
-"Date" = "Dato";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Slett CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Blodsukker";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Blodsukker (Justert)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Siste kalibrering";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Siste måling";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Siste forbindelse";
-
-/* Button title to open CGM app */
-"Open App" = "Åpne app";
-
-/* Title describing sensor session age */
-"Session Age" = "Alder på økt";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Synkronisering av eksterne data";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor utløper";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor utløpt";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Alder på sender";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Sender ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Last opp avlesninger";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/nb.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/nb.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 16ee36585..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/nb.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Påloggingsinformasjon";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Sett opp sender";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detalj";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Sender ID finner du på baksiden av senderen, eller på siden av esken den kom i, eller under innstillinger i appen til senderen.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Sender ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data kan lastes ned over internett fra Share-server om tilkobling til sender ikke fungerer.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Skriv 6-siffret sender ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/nl.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/nl.lproj/Localizable.strings
deleted file mode 100644
index 06e70a8fc..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/nl.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Weet je zeker dat je deze CGM wilt verwijderen";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Annuleer";
-
-/* Title describing glucose date */
-"Date" = "Datum";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Verwijder CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glucosewaarde";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Aangepast)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Laatste kalibratie";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Laatste meting";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Laatste verbinding";
-
-/* Button title to open CGM app */
-"Open App" = "App openen";
-
-/* Title describing sensor session age */
-"Session Age" = "Sessieduur";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Synchronisatie van gegevens op afstand";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor verloopt";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor verlopen";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Zenderleeftijd";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Zenderserienummer";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload metingen";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/nl.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/nl.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index de9b65084..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/nl.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Toegangsgegevens";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Zender instellen";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Het serienummer van de zender staat achter op het apparaat, op de zijkant van de verpakking en in het instellingenmenu van de ontvanger en de app.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Serienummer van de zender";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Gegevens kunnen via het internet van Share gedownload worden wanneer de verbinding met de zender uitvalt.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Vul het 6 cijferige serienummer van de zender in";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/pl.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/pl.lproj/Localizable.strings
deleted file mode 100644
index 0cf8c4034..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/pl.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Czy na pewno chcesz usunąć ten CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Anuluj";
-
-/* Title describing glucose date */
-"Date" = "Data";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Usuń CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glukoza";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glukoza (skorygowana)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Ostatnia kalibracja";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Ostatni odczyt";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Ostatnie połączenie";
-
-/* Button title to open CGM app */
-"Open App" = "Otwórz aplikację";
-
-/* Title describing sensor session age */
-"Session Age" = "Wiek sesji";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Zdalna synchronizacja danych";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Wygasa";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor wygasł";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Wiek nadajnika";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID nadajnika";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Wysyłaj odczyty";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/pl.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/pl.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index b5d9b207a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/pl.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Dane uwierzytelniające";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Konfiguracja nadajnika";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "ID nadajnika jest nadrukowany z tyłu urządzenia, z boku opakowania, w którym go dostarczono oraz jest dostępny w menu ustawień odbiornika i w aplikacji mobilnej.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID nadajnika";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Dane można pobrać przez internet z Share, kiedy połączenie nadajnika się nie powiedzie.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Wprowadź 6-cyfrowy ID nadajnika";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-BR.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-BR.lproj/Localizable.strings
deleted file mode 100644
index 998d78c7d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-BR.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Você está certo que quer remover este CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Cancelar";
-
-/* Title describing glucose date */
-"Date" = "Data";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Remover CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glicose";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glicose (Ajustada)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Última Calibração";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Leitura mais Recente";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Latest Connection";
-
-/* Button title to open CGM app */
-"Open App" = "Abrir App";
-
-/* Title describing sensor session age */
-"Session Age" = "Idade da Sessão";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Data Synchronization";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Estado";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Idade do Transmissor";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID do Transmissor";
-
-/* Title describing glucose trend */
-"Trend" = "Tendência";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-BR.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-BR.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index abc113fad..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-BR.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credenciais";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Configuração do Transmissor";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "O ID do transmissor pode ser encontrado impresso na parte traseira do dispositivo, na parte lateral da caixa em que ele veio e nos menus de configurações do receptor e do aplicativo móvel.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID do Transmissor";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Os dados podem ser baixados pela Internet a partir do compartilhamento quando a conexão do transmissor falhar.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Digite o ID do transmissor de 6 dígitos";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-PT.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-PT.lproj/Localizable.strings
deleted file mode 100644
index f4938cd39..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-PT.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Cancelar";
-
-/* Title describing glucose date */
-"Date" = "Data";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Delete CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glucose";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucose (Adjusted)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Latest Calibration";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Latest Reading";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Latest Connection";
-
-/* Button title to open CGM app */
-"Open App" = "Open App";
-
-/* Title describing sensor session age */
-"Session Age" = "Session Age";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Remote Data Synchronization";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor Expired";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Transmitter Age";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID do transmissor";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-PT.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-PT.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index d2e12ca3c..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/pt-PT.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Credentials";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Transmitter Setup";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID do transmissor";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data can be downloaded over the Internet from Share when the transmitter connection fails.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Enter the 6-digit transmitter ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ro.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ro.lproj/Localizable.strings
deleted file mode 100644
index b1b86fb0a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ro.lproj/Localizable.strings
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "/min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Sunteți sigur că doriți să ștergeți acest CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Renunță";
-
-/* Title describing glucose date */
-"Date" = "Data";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Ștergeți CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glucoza";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glucoză (ajustată)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Ultima calibrare";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Ultima conexiune";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Ultima citire";
-
-/* Button title to open CGM app */
-"Open App" = "Deschide aplicația";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Sincronizarea datelor";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Senzorul a expirat";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Senzorul expiră";
-
-/* Title describing sensor session age */
-"Session Age" = "Vechime sesiune";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Stare";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Vechime transmițător";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID transmițător";
-
-/* Title describing glucose trend */
-"Trend" = "Tendinţă";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Urcă citirile de glicemie";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ro.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ro.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index e7b353c4a..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ro.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Autentificare";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Setare transmițător";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detail";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Pot fi transferate date prin Internet din Share atunci când eșuează conexiunea cu transmițătorul";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Introduceți ID-ul din 6 cifre al transmițătorului";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "ID-ul transmițătorului poate fi găsit fie pe pe spatele dispozitivului sau pe cutia cu care a venit sau poate fi văzut în setările receiver-ului sau a aplicației mobile.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID transmițător";
-
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ru.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ru.lproj/Localizable.strings
deleted file mode 100644
index 04528f042..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ru.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/мин";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Вы уверены, что хотите удалить этот CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Отмена";
-
-/* Title describing glucose date */
-"Date" = "Дата";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Удалить CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Глюкоза";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "ГК (корректированная)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Последняя калибровка";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Последние данные";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Последнее подключение";
-
-/* Button title to open CGM app */
-"Open App" = "Открыть приложение";
-
-/* Title describing sensor session age */
-"Session Age" = "Сенсор отработал";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Удаленная синхронизация данных";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Сенсор истекает";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Сенсор истек";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Статус";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Трансмиттер отработал";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID трансмиттера";
-
-/* Title describing glucose trend */
-"Trend" = "Тенденция";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Загрузить показания";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/ru.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/ru.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 9bda4bb2c..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/ru.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Учетные данные";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Настройка трансмиттера";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Подробности";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Номер трансмиттера находится на обратной стороне устройства, сбоку кпаковочной коробки, в настройках ресивера и мобильного приложения.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID трансмиттера";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Данные могут быть загружены с серверов Share если не произойдет соединение трансмиттера.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Введите шестизначный идентификатор трансмиттера";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/Localizable.strings
deleted file mode 100644
index 937e98dc2..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@ /min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Naozaj chcete odstrániť toto CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Zrušiť";
-
-/* Title describing glucose date */
-"Date" = "Dátum";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Odstrániť CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glykémia";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glykémia (upravená)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Posledná kalibrácia";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Posledné čítanie";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Posledné pripojenie";
-
-/* Button title to open CGM app */
-"Open App" = "Otvoriť aplikáciu";
-
-/* Title describing sensor session age */
-"Session Age" = "Dĺžka relácie";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Diaľková sychronizácia dát";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Platnosť senzora vyprší";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Platnosť senzora vypršala";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Stav";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Vek vysielača";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID vysielača";
-
-/* Title describing glucose trend */
-"Trend" = "Vývoj";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Načítať údaje";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 04704c918..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/sk.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Poverenia";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Nastavenie vysielača";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Podrobnosti";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "ID vysielača nájdete vytlačené na zadnej strane zariadenia, na boku škatule, v ktorej bol dodaný, a v ponuke nastavení prijímača a mobilnej aplikácie.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID vysielača";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Údaje je možné stiahnuť cez internet zo Share, keď zlyhá pripojenie vysielača.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Zadajte 6-miestne ID vysielača";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/Localizable.strings
deleted file mode 100644
index 001306638..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@ min";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Är du säker på att du vill radera denna CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Avbryt";
-
-/* Title describing glucose date */
-"Date" = "Tid";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Radera CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Glukos";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Glukos (justerad)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Senaste kalibrering";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Senaste avläsning";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Senaste anslutning";
-
-/* Button title to open CGM app */
-"Open App" = "Öppna appen";
-
-/* Title describing sensor session age */
-"Session Age" = "Sessionsålder";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Synkronisering av fjärrlagrad data";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor går ut";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensor har gått ut";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Status";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Ålder på sändare";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Sändar-ID";
-
-/* Title describing glucose trend */
-"Trend" = "Trend";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Ladda upp avläsningar";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index fd047db6f..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/sv.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Inloggningsuppgifter";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Sändarinställningar";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detalj";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Sändar-ID kan hittas tryckt på baksidan av enheten, på sidan av lådan den kom i, samt från inställningsmenyn för mottagaren och mobilappen.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Sändar-ID";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Data kan laddas ned från Dexcom Share (via Internet) om sändaranslutningen skulle misslyckas.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Ange 6-siffrigt sändar-ID";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/tr.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/tr.lproj/Localizable.strings
deleted file mode 100644
index e36520bfb..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/tr.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/dk";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Bu CGM'i silmek istediğinizden emin misiniz?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "İptal";
-
-/* Title describing glucose date */
-"Date" = "Tarih";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "CGM Sil";
-
-/* Title describing glucose value */
-"Glucose" = "Kan şekeri";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "KŞ (Düzeltilmiş)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Son Kalibrasyon";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Son Okuma";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Son Bağlantı";
-
-/* Button title to open CGM app */
-"Open App" = "Uygulamayı aç";
-
-/* Title describing sensor session age */
-"Session Age" = "Sensör Yaşı";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Uzaktan Veri Senkronizasyonu";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensörün Süresi Doluyor";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Sensörün Süresi Doldu";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Durum";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Verici Yaşı";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Verici Kimliği";
-
-/* Title describing glucose trend */
-"Trend" = "Eğilim";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Okumaları Yükle";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/tr.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/tr.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 08a70c9fa..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/tr.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Kimlik bilgileri";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Verici Kurulumu";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Detay";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Verici kimliğini, cihazın arkasında, geldiği kutunun yan tarafında, alıcının mobil uygulamasının ayarlar menüsünde bulabilirsiniz.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Verici Kimliği";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Verici bağlantısı başarısız olduğunda Dexcom Share üzerinden veriler indirilebilir.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "6 basamaklı verici kimliğini girin";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/uk.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/uk.lproj/Localizable.strings
deleted file mode 100644
index a3e72e51e..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/uk.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/хв";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Ви впевнені, що хочете видалити цей CGM?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Відмінити";
-
-/* Title describing glucose date */
-"Date" = "Дата";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Видалити CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Глюкоза";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Глюкоза (коригована)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Остання калібровка";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Останнє читання";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Останнє підключення";
-
-/* Button title to open CGM app */
-"Open App" = "Відкрити додаток";
-
-/* Title describing sensor session age */
-"Session Age" = "Вік Сенсору";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Віддалена синхронізація даних";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Сенсор закінчується";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Сенсор минув";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Статус";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Трансмітер відпрацював";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "ID передавача";
-
-/* Title describing glucose trend */
-"Trend" = "Тренди";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Вивантажити читання";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/uk.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/uk.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index db7351553..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/uk.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Облікові дані";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Налаштування Трасмітера";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Детальніше";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "ID Трансмітера вказано на зворотній стороні девайса, на бічній стороні упаковки, а також в меню налаштувань ресивера та мобільного додатку.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "ID трансмітера";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Дані можуть бути завантажені по мережі через Sharе, у разі помилки зʼєднання трансмітера.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Введіть 6-значний ID трансмітера";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings
deleted file mode 100644
index e2071ad2d..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/phút";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "Bạn có chắc sẽ xóa CGM này?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "Hủy bỏ";
-
-/* Title describing glucose date */
-"Date" = "Ngày";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "Xóa CGM";
-
-/* Title describing glucose value */
-"Glucose" = "Đường huyết";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "Đường huyết (Được điều chỉnh)";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "Lần hiệu chỉnh gần nhất";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "Kết quả đọc mới nhất";
-
-/* Section title for latest connection date */
-"Latest Connection" = "Kết nối gần đây nhất";
-
-/* Button title to open CGM app */
-"Open App" = "Mở ứng dụng";
-
-/* Title describing sensor session age */
-"Session Age" = "Thời gian sử dụng sensor";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "Đồng bộ hoá dữ liệu từ xa";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Cảm biến hết hạn";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "Cảm biến đã hết hạn";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "Tình trạng";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "Thời gian sử dụng Transmitter";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "Số ID của Transmitter";
-
-/* Title describing glucose trend */
-"Trend" = "Xu hướng";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Glucose đang tải lên";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index f05016023..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/vi.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "Thông tin xác thực";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "Cài đặt Transmitter";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "Chi tiết";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "Số ID của Transmitter có thể được tìm thấy trên vỏ hộp hoặc bên hông hộp và trong phần Menu cài đặt cũng như trên ứng dụng của điện thoại.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "Số ID của Transmitter";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "Dữ liệu có thể được tải xuống qua đường truyền Internet trên ứng dụng Share khi kết nối với transmitter bị đứt.";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dữ liệu từ Dexcom Share";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "Nhập 6 số ID của Transmitter";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/Localizable.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/Localizable.strings
deleted file mode 100644
index 7606ebf3c..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/Localizable.strings
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/分钟";
-
-/* Confirmation message for deleting a CGM */
-"Are you sure you want to delete this CGM?" = "确认要删除该CGM吗?";
-
-/* The title of the cancel action in an action sheet */
-"Cancel" = "取消";
-
-/* Title describing glucose date */
-"Date" = "日期";
-
-/* Button title to delete CGM
-Title text for the button to remove a CGM from Loop */
-"Delete CGM" = "删除CGM";
-
-/* Title describing glucose value */
-"Glucose" = "葡萄糖";
-
-/* Describes a glucose value adjusted to reflect a recent calibration */
-"Glucose (Adjusted)" = "血糖";
-
-/* Section title for latest glucose calibration */
-"Latest Calibration" = "最近一次较准";
-
-/* Section title for latest glucose reading */
-"Latest Reading" = "最新血糖值";
-
-/* Section title for latest connection date */
-"Latest Connection" = "上一次连接";
-
-/* Button title to open CGM app */
-"Open App" = "打开软件";
-
-/* Title describing sensor session age */
-"Session Age" = "传感器启动天数";
-
-/* Section title for remote data synchronization */
-"Remote Data Synchronization" = "远程数据同步";
-
-/* Title describing sensor expiration */
-"Sensor Expires" = "Sensor Expires";
-
-/* Title describing past sensor expiration */
-"Sensor Expired" = "传感器已过期";
-
-/* Title describing CGM calibration and battery state */
-"Status" = "状态";
-
-/* Title describing transmitter session age */
-"Transmitter Age" = "发射器使用天数";
-
-/* The title text for the Dexcom G5/G6 transmitter ID config value */
-"Transmitter ID" = "发射器编号";
-
-/* Title describing glucose trend */
-"Trend" = "趋势";
-
-/* The title text for the upload glucose switch cell */
-"Upload Readings" = "Upload Readings";
diff --git a/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/TransmitterManagerSetup.strings b/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/TransmitterManagerSetup.strings
deleted file mode 100644
index 73e7ebb50..000000000
--- a/Dependencies/CGMBLEKit/CGMBLEKitUI/zh-Hans.lproj/TransmitterManagerSetup.strings
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Class = "UILabel"; text = "Credentials"; ObjectID = "5oU-vK-JHQ"; */
-"5oU-vK-JHQ.text" = "密钥";
-
-/* Class = "UITableViewController"; title = "Transmitter Setup"; ObjectID = "Dds-49-o7G"; */
-"Dds-49-o7G.title" = "设置发射器";
-
-/* Class = "UILabel"; text = "Detail"; ObjectID = "GOT-KQ-cEh"; */
-"GOT-KQ-cEh.text" = "详情";
-
-/* Class = "UITableViewSection"; footerTitle = "The transmitter ID can be found printed on the back of the device, on the side of the box it came in, and from within the settings menus of the receiver and mobile app."; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.footerTitle" = "发射器编号可在发射器包装盒背面找到,或者可在Dexcom Moblie软件及接受器的“setting”-“Transmitter”中找到";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "Qub-6B-0aB"; */
-"Qub-6B-0aB.headerTitle" = "发射器编号";
-
-/* Class = "UITableViewSection"; footerTitle = "Data can be downloaded over the Internet from Share when the transmitter connection fails."; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.footerTitle" = "当无法连接发射器时,可通过网络从Dexcom远程下载数据";
-
-/* Class = "UITableViewSection"; headerTitle = "Dexcom Share"; ObjectID = "k1N-Rg-XDy"; */
-"k1N-Rg-XDy.headerTitle" = "Dexcom远程";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit transmitter ID"; ObjectID = "nKX-TW-GhD"; */
-"nKX-TW-GhD.placeholder" = "请输入6位发射器编号";
diff --git a/Dependencies/CGMBLEKit/CODE_OF_CONDUCT.md b/Dependencies/CGMBLEKit/CODE_OF_CONDUCT.md
deleted file mode 100644
index 8079e4550..000000000
--- a/Dependencies/CGMBLEKit/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# Code of Conduct
-
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, gender identity and expression, level of experience,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment
-include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or
-advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the maintaner [via email](mailto:loudnate@gmail.com). All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at [http://contributor-covenant.org/version/1/4][version]
-
-[homepage]: http://contributor-covenant.org
-[version]: http://contributor-covenant.org/version/1/4/
\ No newline at end of file
diff --git a/Dependencies/CGMBLEKit/Common/Data.swift b/Dependencies/CGMBLEKit/Common/Data.swift
deleted file mode 100644
index a7587d651..000000000
--- a/Dependencies/CGMBLEKit/Common/Data.swift
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// NSData.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/5/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-extension Data {
- private func toDefaultEndian(_: T.Type) -> T {
- return self.withUnsafeBytes({ (rawBufferPointer: UnsafeRawBufferPointer) -> T in
- let bufferPointer = rawBufferPointer.bindMemory(to: T.self)
- guard let pointer = bufferPointer.baseAddress else {
- return 0
- }
- return T(pointer.pointee)
- })
- }
-
- func to(_ type: T.Type) -> T {
- return T(littleEndian: toDefaultEndian(type))
- }
-
- func toInt() -> T {
- return to(T.self)
- }
-
- func toBigEndian(_ type: T.Type) -> T {
- return T(bigEndian: toDefaultEndian(type))
- }
-
- mutating func append(_ newElement: T) {
- withUnsafePointer(to: newElement.littleEndian) { (ptr: UnsafePointer) in
- append(UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-
- mutating func appendBigEndian(_ newElement: T) {
- withUnsafePointer(to: newElement.bigEndian) { (ptr: UnsafePointer) in
- append(UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-
- init(_ value: T) {
- self = withUnsafePointer(to: value.littleEndian) { (ptr: UnsafePointer) -> Data in
- return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-
- init(bigEndian value: T) {
- self = withUnsafePointer(to: value.bigEndian) { (ptr: UnsafePointer) -> Data in
- return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-}
-
-
-// String conversion methods, adapted from https://stackoverflow.com/questions/40276322/hex-binary-string-conversion-in-swift/40278391#40278391
-extension Data {
- init?(hexadecimalString: String) {
- self.init(capacity: hexadecimalString.utf16.count / 2)
-
- // Convert 0 ... 9, a ... f, A ...F to their decimal value,
- // return nil for all other input characters
- func decodeNibble(u: UInt16) -> UInt8? {
- switch u {
- case 0x30 ... 0x39: // '0'-'9'
- return UInt8(u - 0x30)
- case 0x41 ... 0x46: // 'A'-'F'
- return UInt8(u - 0x41 + 10) // 10 since 'A' is 10, not 0
- case 0x61 ... 0x66: // 'a'-'f'
- return UInt8(u - 0x61 + 10) // 10 since 'a' is 10, not 0
- default:
- return nil
- }
- }
-
- var even = true
- var byte: UInt8 = 0
- for c in hexadecimalString.utf16 {
- guard let val = decodeNibble(u: c) else { return nil }
- if even {
- byte = val << 4
- } else {
- byte += val
- self.append(byte)
- }
- even = !even
- }
- guard even else { return nil }
- }
-
- var hexadecimalString: String {
- return map { String(format: "%02hhx", $0) }.joined()
- }
-}
diff --git a/Dependencies/CGMBLEKit/Common/HKUnit.swift b/Dependencies/CGMBLEKit/Common/HKUnit.swift
deleted file mode 100644
index 69e6f9aed..000000000
--- a/Dependencies/CGMBLEKit/Common/HKUnit.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// HKUnit.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 8/6/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import HealthKit
-
-
-extension HKUnit {
- static let milligramsPerDeciliter: HKUnit = {
- return HKUnit.gramUnit(with: .milli).unitDivided(by: HKUnit.literUnit(with: .deci))
- }()
-
- static let milligramsPerDeciliterPerMinute: HKUnit = {
- return HKUnit.milligramsPerDeciliter.unitDivided(by: .minute())
- }()
-}
diff --git a/Dependencies/CGMBLEKit/Common/LocalizedString.swift b/Dependencies/CGMBLEKit/Common/LocalizedString.swift
deleted file mode 100644
index 831ab950f..000000000
--- a/Dependencies/CGMBLEKit/Common/LocalizedString.swift
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// LocalizedString.swift
-// LoopUI
-//
-// Created by Kathryn DiSimone on 8/15/18.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-internal class FrameworkBundle {
- static let main = Bundle(for: FrameworkBundle.self)
-}
-
-func LocalizedString(_ key: String, tableName: String? = nil, value: String? = nil, comment: String) -> String {
- if let value = value {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, value: value, comment: comment)
- } else {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, comment: comment)
- }
-}
diff --git a/Dependencies/CGMBLEKit/Common/Locked.swift b/Dependencies/CGMBLEKit/Common/Locked.swift
deleted file mode 100644
index fd6e35b10..000000000
--- a/Dependencies/CGMBLEKit/Common/Locked.swift
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Locked.swift
-// LoopKit
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import os.lock
-
-
-internal class Locked {
- private var lock = os_unfair_lock()
- private var _value: T
-
- init(_ value: T) {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- _value = value
- }
-
- var value: T {
- get {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- return _value
- }
- set {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- _value = newValue
- }
- }
-
- func mutate(_ changes: (_ value: inout T) -> Void) -> T {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- changes(&_value)
- return _value
- }
-}
diff --git a/Dependencies/CGMBLEKit/Common/TimeInterval.swift b/Dependencies/CGMBLEKit/Common/TimeInterval.swift
deleted file mode 100644
index 5a8046a6c..000000000
--- a/Dependencies/CGMBLEKit/Common/TimeInterval.swift
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-// NSTimeInterval.swift
-// Naterade
-//
-// Created by Nathan Racklyeft on 1/9/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-extension TimeInterval {
- static func hours(_ hours: Double) -> TimeInterval {
- return self.init(hours: hours)
- }
-
- static func minutes(_ minutes: Int) -> TimeInterval {
- return self.init(minutes: Double(minutes))
- }
-
- static func minutes(_ minutes: Double) -> TimeInterval {
- return self.init(minutes: minutes)
- }
-
- static func seconds(_ seconds: Double) -> TimeInterval {
- return self.init(seconds)
- }
-
- static func milliseconds(_ milliseconds: Double) -> TimeInterval {
- return self.init(milliseconds / 1000)
- }
-
- init(minutes: Double) {
- self.init(minutes * 60)
- }
-
- init(hours: Double) {
- self.init(minutes: hours * 60)
- }
-
- init(seconds: Double) {
- self.init(seconds)
- }
-
- init(milliseconds: Double) {
- self.init(milliseconds / 1000)
- }
-
- var milliseconds: Double {
- return self * 1000
- }
-
- var minutes: Double {
- return self / 60.0
- }
-
- var hours: Double {
- return minutes / 60.0
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/LICENSE b/Dependencies/CGMBLEKit/LICENSE
deleted file mode 100644
index b1adb5791..000000000
--- a/Dependencies/CGMBLEKit/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Nathan Racklyeft
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
diff --git a/Dependencies/CGMBLEKit/Pod/CGMBLEKit.h b/Dependencies/CGMBLEKit/Pod/CGMBLEKit.h
deleted file mode 100644
index a28840359..000000000
--- a/Dependencies/CGMBLEKit/Pod/CGMBLEKit.h
+++ /dev/null
@@ -1,10 +0,0 @@
-//
-// CGMBLEKit.h
-// xDripG5
-//
-// Created by Nathan Racklyeft on 12/31/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-
-#import
\ No newline at end of file
diff --git a/Dependencies/CGMBLEKit/README.md b/Dependencies/CGMBLEKit/README.md
deleted file mode 100644
index 370d086ea..000000000
--- a/Dependencies/CGMBLEKit/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# CGMBLEKit
-
-[![CI Status](http://img.shields.io/travis/LoopKit/CGMBLEKit.svg?style=flat)](https://travis-ci.org/LoopKit/CGMBLEKit)
-[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
-
-A iOS framework providing an interface for communicating with the G5 and G6 glucose transmitters over Bluetooth.
-
-*Please note this project is neither created nor backed by Dexcom, Inc. This software is not intended for use in therapy.*
-
-## Requirements
-
-This framework connects to a G5 or G6 Mobile Transmitter via Bluetooth LE. It does not connect to the G4 Share Receiver or any earlier CGM products.
-
-## Frameworks Installation
-
-### Carthage
-
-CGMBLEKit is available through [Carthage](https://github.com/Carthage/Carthage). To install it, add the following line to your Cartfile:
-
-```ruby
-github "LoopKit/CGMBLEKit"
-```
-
-Note that you'll need to confgure your target to link against `CommonCrypto.framework` in addition to `CGMBLEKit.framework`
-
-## Usage
-
-If you plan to run your app alongside the G5 Mobile application, make sure to set `passiveModeEnabled` to true.
-
-### Examples
-
-[glucose-badge](https://github.com/dennisgove/glucose-badge) – Display the latest glucose values as an app icon badge
-
-## ResetTransmitter App Installation
-
-Download the CGMBLEKit code by clicking on the green `Clone or Download` button (scroll up on this page and you'll find it), then select `Download Zip`
-
-![ResetTransmitter help](https://github.com/Kdisimone/images/blob/master/resetTransmitter-first.png)
-
-Then navigate to the `CGMBLEKit` folder that just downloaded to your computer. Double-click on the `CGMBLEKit.xcodeproj` file to open the project in Xcode.
-
-![ResetTransmitter help](https://github.com/Kdisimone/images/blob/master/resetTransmitter-download.png)
-
-To install the ResetTransmitter App on your iPhone, simply make sure to sign the ResetTransmitter target and then select just the `ResetTransmitter` scheme in the build area. Make sure your iPhone is plugged into the computer, select your iPhone from the top of the `Devices` in the 4th circled area, screenshot below. Note: You do not have to change bundle IDs or anything beyond the steps listed.
-
-![ResetTransmitter help](https://github.com/Kdisimone/images/blob/master/resetTransmitter.png)
-
-
-## Code of Conduct
-
-Please note that this project is released with a [Contributor Code of Conduct](https://github.com/LoopKit/LoopKit/blob/master/CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
-
-## License
-
-CGMBLEKit is available under the MIT license. See the LICENSE file for more info.
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/AppDelegate.swift b/Dependencies/CGMBLEKit/ResetTransmitter/AppDelegate.swift
deleted file mode 100644
index 548924db7..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/AppDelegate.swift
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// AppDelegate.swift
-// ResetTransmitter
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-
-@UIApplicationMain
-class AppDelegate: UIResponder, UIApplicationDelegate {
-
- var window: UIWindow?
-
-
- func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
- // Override point for customization after application launch.
- return true
- }
-
- func applicationWillResignActive(_ application: UIApplication) {
- // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
- // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
- }
-
- func applicationDidEnterBackground(_ application: UIApplication) {
- // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
- // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
- }
-
- func applicationWillEnterForeground(_ application: UIApplication) {
- // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
- }
-
- func applicationDidBecomeActive(_ application: UIApplication) {
- // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
- }
-
- func applicationWillTerminate(_ application: UIApplication) {
- // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
- }
-
-
-}
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Contents.json b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 2a71258dd..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,200 +0,0 @@
-{
- "images" : [
- {
- "filename" : "Icon-App-20x20@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "filename" : "Icon-App-20x20@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "20x20"
- },
- {
- "filename" : "Icon-App-29x29@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "filename" : "Icon-App-29x29@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "29x29"
- },
- {
- "filename" : "Icon-App-40x40@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "filename" : "Icon-App-40x40@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "40x40"
- },
- {
- "filename" : "Icon-App-60x60@2x.png",
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "60x60"
- },
- {
- "filename" : "Icon-App-60x60@3x.png",
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "60x60"
- },
- {
- "filename" : "Icon-App-20x20@1x.png",
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "20x20"
- },
- {
- "filename" : "Icon-App-20x20@2x-1.png",
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "filename" : "Icon-App-29x29@1x.png",
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "29x29"
- },
- {
- "filename" : "Icon-App-29x29@2x-1.png",
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "filename" : "Icon-App-40x40@1x.png",
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "40x40"
- },
- {
- "filename" : "Icon-App-40x40@2x-1.png",
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "filename" : "Icon-App-76x76@1x.png",
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "76x76"
- },
- {
- "filename" : "Icon-App-76x76@2x.png",
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "76x76"
- },
- {
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "83.5x83.5"
- },
- {
- "filename" : "ItunesArtwork@2x.png",
- "idiom" : "ios-marketing",
- "scale" : "1x",
- "size" : "1024x1024"
- },
- {
- "filename" : "Icon-24@2x.png",
- "idiom" : "watch",
- "role" : "notificationCenter",
- "scale" : "2x",
- "size" : "24x24",
- "subtype" : "38mm"
- },
- {
- "filename" : "Icon-27.5@2x.png",
- "idiom" : "watch",
- "role" : "notificationCenter",
- "scale" : "2x",
- "size" : "27.5x27.5",
- "subtype" : "42mm"
- },
- {
- "filename" : "Icon-29@2x.png",
- "idiom" : "watch",
- "role" : "companionSettings",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "filename" : "Icon-29@3x.png",
- "idiom" : "watch",
- "role" : "companionSettings",
- "scale" : "3x",
- "size" : "29x29"
- },
- {
- "filename" : "Icon-40@2x.png",
- "idiom" : "watch",
- "role" : "appLauncher",
- "scale" : "2x",
- "size" : "40x40",
- "subtype" : "38mm"
- },
- {
- "filename" : "Icon-44@2x.png",
- "idiom" : "watch",
- "role" : "appLauncher",
- "scale" : "2x",
- "size" : "44x44",
- "subtype" : "40mm"
- },
- {
- "idiom" : "watch",
- "role" : "appLauncher",
- "scale" : "2x",
- "size" : "50x50",
- "subtype" : "44mm"
- },
- {
- "filename" : "Icon-86@2x.png",
- "idiom" : "watch",
- "role" : "quickLook",
- "scale" : "2x",
- "size" : "86x86",
- "subtype" : "38mm"
- },
- {
- "filename" : "Icon-98@2x.png",
- "idiom" : "watch",
- "role" : "quickLook",
- "scale" : "2x",
- "size" : "98x98",
- "subtype" : "42mm"
- },
- {
- "idiom" : "watch",
- "role" : "quickLook",
- "scale" : "2x",
- "size" : "108x108",
- "subtype" : "44mm"
- },
- {
- "idiom" : "watch-marketing",
- "scale" : "1x",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- },
- "properties" : {
- "pre-rendered" : true
- }
-}
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-24@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-24@2x.png
deleted file mode 100644
index 4cfc34bb3..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-24@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-27.5@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-27.5@2x.png
deleted file mode 100644
index fac9f63d5..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-27.5@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png
deleted file mode 100644
index bfb19c6c9..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png
deleted file mode 100644
index bc77717c2..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png
deleted file mode 100644
index 4611f6119..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-44@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-44@2x.png
deleted file mode 100644
index 8c9c491f7..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-44@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-86@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-86@2x.png
deleted file mode 100644
index 7382fd4ec..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-86@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-98@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-98@2x.png
deleted file mode 100644
index 53651595c..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-98@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 4235ba2ee..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png
deleted file mode 100644
index f76b80973..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x-1.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index f76b80973..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index 3b386794f..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
deleted file mode 100644
index d8c8bf64c..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png
deleted file mode 100644
index bfb19c6c9..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
deleted file mode 100644
index bfb19c6c9..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
deleted file mode 100644
index bc77717c2..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
deleted file mode 100644
index f76b80973..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png
deleted file mode 100644
index 4611f6119..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
deleted file mode 100644
index 4611f6119..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
deleted file mode 100644
index 2b0077e73..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
deleted file mode 100644
index 2b0077e73..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
deleted file mode 100644
index 3316556cf..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
deleted file mode 100644
index eb05243fb..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
deleted file mode 100644
index 3118eea32..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
deleted file mode 100644
index f491307c1..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png
deleted file mode 100644
index 43214e1a7..000000000
Binary files a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png and /dev/null differ
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/Contents.json b/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/Contents.json
deleted file mode 100644
index da4a164c9..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Assets.xcassets/Contents.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
\ No newline at end of file
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Base.lproj/LaunchScreen.storyboard b/Dependencies/CGMBLEKit/ResetTransmitter/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index 94b34243e..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Base.lproj/Main.storyboard b/Dependencies/CGMBLEKit/ResetTransmitter/Base.lproj/Main.storyboard
deleted file mode 100644
index 4211c49dc..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,272 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.
-This may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.
-Resetting cannot be undone.
-Use at your own risk.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/CompletionViewController.swift b/Dependencies/CGMBLEKit/ResetTransmitter/CompletionViewController.swift
deleted file mode 100644
index dd8bff906..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/CompletionViewController.swift
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// CompletionViewController.swift
-// ResetTransmitter
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-import UserNotifications
-
-class CompletionViewController: UITableViewController {
-
- @IBOutlet weak var textView: UITextView!
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- if UIApplication.shared.applicationState == .background {
- let content = UNMutableNotificationContent()
- content.badge = 1
- content.title = NSLocalizedString("Transmitter Reset Complete", comment: "Notification title for background completion notification")
- content.body = textView.text
- content.sound = .default
-
- let request = UNNotificationRequest(identifier: "Completion", content: content, trigger: nil)
-
- UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
- }
- }
-
- override func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
- return false
- }
-
- override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
- return nil
- }
-}
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Info.plist b/Dependencies/CGMBLEKit/ResetTransmitter/Info.plist
deleted file mode 100644
index 1917f1cb1..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Info.plist
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Reset
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- 3.2
- CFBundleVersion
- 1
- LSRequiresIPhoneOS
-
- NSBluetoothAlwaysUsageDescription
- Bluetooth is used to communicate with continuous glucose monitor devices
- NSBluetoothPeripheralUsageDescription
- Bluetooth is used to communicate with continuous glucose monitor devices
- UIBackgroundModes
-
- bluetooth-central
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UIRequiredDeviceCapabilities
-
- armv7
-
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
-
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ResetManager.swift b/Dependencies/CGMBLEKit/ResetTransmitter/ResetManager.swift
deleted file mode 100644
index 5acfabfa8..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ResetManager.swift
+++ /dev/null
@@ -1,145 +0,0 @@
-//
-// ResetManager.swift
-// ResetTransmitter
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import CGMBLEKit
-import os.log
-
-
-class ResetManager {
- enum State {
- case initialized
- case resetting(transmitter: Transmitter)
- case completed
- }
-
- private(set) var state: State {
- get {
- return lockedState.value
- }
- set {
- let oldValue = state
-
- if case .resetting(let transmitter) = oldValue {
- transmitter.stayConnected = false
- transmitter.stopScanning()
- transmitter.delegate = nil
- transmitter.commandSource = nil
- }
-
- lockedState.value = newValue
-
- if case .resetting(let transmitter) = newValue {
- transmitter.delegate = self
- transmitter.commandSource = self
- transmitter.resumeScanning()
- }
-
- os_log("State changed: %{public}@ -> %{public}@", log: log, type: .debug, String(describing: oldValue), String(describing: newValue))
- delegate?.resetManager(self, didChangeStateFrom: oldValue)
- }
- }
- private let lockedState = Locked(State.initialized)
-
- private let log = OSLog(subsystem: "com.loopkit.CGMBLEKit", category: "ResetManager")
-
- weak var delegate: ResetManagerDelegate?
-}
-
-
-protocol ResetManagerDelegate: class {
- func resetManager(_ manager: ResetManager, didError error: Error)
-
- func resetManager(_ manager: ResetManager, didChangeStateFrom oldState: ResetManager.State)
-}
-
-
-extension ResetManager {
- func cancel() {
- guard case .resetting = state else {
- return
- }
-
- state = .initialized
- }
-
- func resetTransmitter(withID id: String) {
- guard id.count == 6 else {
- return
- }
-
- switch state {
- case .initialized, .completed:
- break
- case .resetting(transmitter: let transmitter):
- guard transmitter.ID != id else {
- return
- }
- }
-
- state = .resetting(transmitter: Transmitter(id: id, passiveModeEnabled: false))
-
- #if targetEnvironment(simulator)
- DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) {
- self.delegate?.resetManager(self, didError: TransmitterError.controlError("Simulated Error"))
-
- DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) {
- if case .resetting = self.state {
- self.state = .completed
- }
- }
- }
- #endif
- }
-}
-
-
-extension ResetManager: TransmitterDelegate {
-
- func transmitter(_ transmitter: Transmitter, didError error: Error) {
- os_log("Transmitter error: %{public}@", log: log, type: .error, String(describing: error))
- delegate?.resetManager(self, didError: error)
- }
-
- func transmitter(_ transmitter: Transmitter, didRead glucose: Glucose) {
- // Not interested
- }
-
- func transmitter(_ transmitter: Transmitter, didReadBackfill glucose: [Glucose]) {
- // Not interested
- }
-
- func transmitter(_ transmitter: Transmitter, didReadUnknownData data: Data) {
- // Not interested
- }
-
- func transmitterDidConnect(_ transmitter: Transmitter) {
- // Not interested
- }
-
-}
-
-
-extension ResetManager: TransmitterCommandSource {
- func dequeuePendingCommand(for transmitter: Transmitter) -> Command? {
- if case .resetting = state {
- return .resetTransmitter
- }
-
- return nil
- }
-
- func transmitter(_ transmitter: Transmitter, didFail command: Command, with error: Error) {
- os_log("Command error: %{public}@", log: log, type: .error, String(describing: error))
- delegate?.resetManager(self, didError: error)
- }
-
- func transmitter(_ transmitter: Transmitter, didComplete command: Command) {
- if case .resetTransmitter = command {
- state = .completed
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ResetViewController.swift b/Dependencies/CGMBLEKit/ResetTransmitter/ResetViewController.swift
deleted file mode 100644
index 8d16d5ea3..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ResetViewController.swift
+++ /dev/null
@@ -1,269 +0,0 @@
-//
-// ResetViewController.swift
-// ResetTransmitter
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-import UserNotifications
-
-
-class ResetViewController: UITableViewController {
-
- @IBOutlet public weak var aboutText: UITextView!
-
-
- private enum State {
- case empty
- case needsConfiguration
- case configured
- case resetting
- case completed
- }
-
- private var state: State = .empty {
- didSet {
- guard oldValue != state else {
- return
- }
-
- lastError = nil
- updateButtonState()
- updateTransmitterIDFieldState()
- updateStatusIndicatorState()
-
- if state == .completed {
- performSegue(withIdentifier: "CompletionViewController", sender: self)
- }
- }
- }
-
- @IBOutlet var hairlines: [UIView]!
-
- @IBOutlet weak var resetButton: Button!
-
- @IBOutlet weak var transmitterIDField: TextField!
-
- @IBOutlet weak var spinner: UIActivityIndicatorView!
-
- @IBOutlet weak var errorLabel: UILabel!
-
- @IBOutlet weak var buttonTopSpace: NSLayoutConstraint!
-
- private var needsButtonTopSpaceUpdate = true
-
- private var lastError: Error?
-
- private lazy var resetManager: ResetManager = {
- let manager = ResetManager()
- manager.delegate = self
- return manager
- }()
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- for hairline in hairlines {
- for constraint in hairline.constraints {
- constraint.constant = 1 / UIScreen.main.scale
- }
- }
-
- self.navigationController?.delegate = self
- self.navigationController?.navigationBar.shadowImage = UIImage()
-
- state = .needsConfiguration
-
- // Setting this color in code because the nib isn't being applied correctly
- if #available(iOS 13.0, *) {
- aboutText.textColor = .secondaryLabel
- }
- }
-
- override func viewDidAppear(_ animated: Bool) {
- super.viewDidAppear(animated)
-
- UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { (success, error) in
- //
- }
- }
-
- override func viewDidDisappear(_ animated: Bool) {
- super.viewDidDisappear(animated)
-
- state = .needsConfiguration
- }
-
- override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
- // Update the constraint once to fit the height of the screen
- if indexPath.section == tableView.numberOfSections - 1 && needsButtonTopSpaceUpdate {
- needsButtonTopSpaceUpdate = false
- let currentValue = buttonTopSpace.constant
- let suggestedValue = max(0, tableView.bounds.size.height - tableView.contentSize.height - tableView.safeAreaInsets.bottom - tableView.safeAreaInsets.top)
-
- if abs(currentValue - suggestedValue) > .ulpOfOne {
- buttonTopSpace.constant = suggestedValue
- }
- }
-
- return UITableView.automaticDimension
- }
-
- override func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
- return false
- }
-
- override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
- return nil
- }
-
- // MARK: - Actions
-
- @IBAction func performAction(_ sender: Any) {
- switch state {
- case .empty, .needsConfiguration:
- // Actions are not allowed
- break
- case .configured:
- // Begin reset
- resetTransmitter(withID: transmitterIDField.text ?? "")
- case .resetting:
- // Cancel pending reset
- resetManager.cancel()
- case .completed:
- // Ignore actions here
- break
- }
- }
-
- private func resetTransmitter(withID id: String) {
- let controller = UIAlertController(
- title: NSLocalizedString("Are you sure you want to reset this transmitter?", comment: "Title of the reset confirmation sheet"),
- message: NSLocalizedString("It will take up to 10 minutes to complete.", comment: "Message of the reset confirmation sheet"), preferredStyle: .actionSheet
- )
-
- controller.addAction(UIAlertAction(
- title: NSLocalizedString("Reset", comment: "Reset button title"),
- style: .destructive,
- handler: { (action) in
- self.resetManager.resetTransmitter(withID: id)
- }
- ))
-
- controller.addAction(UIAlertAction(
- title: NSLocalizedString("Cancel", comment: "Title of button to cancel reset"),
- style: .cancel,
- handler: nil
- ))
-
- present(controller, animated: true, completion: nil)
- }
-}
-
-
-// MARK: - UI state management
-extension ResetViewController {
- private func updateButtonState() {
- switch state {
- case .empty, .needsConfiguration:
- resetButton.isEnabled = false
- case .configured, .resetting, .completed:
- resetButton.isEnabled = true
- }
-
- switch state {
- case .empty, .needsConfiguration, .configured:
- resetButton.setTitle(NSLocalizedString("Reset", comment: "Title of button to begin reset"), for: .normal)
- resetButton.tintColor = .red
- case .resetting, .completed:
- resetButton.setTitle(NSLocalizedString("Cancel", comment: "Title of button to cancel reset"), for: .normal)
- resetButton.tintColor = .darkGray
- }
- }
-
- private func updateTransmitterIDFieldState() {
- switch state {
- case .empty, .needsConfiguration:
- transmitterIDField.text = ""
- transmitterIDField.isEnabled = true
- case .configured:
- transmitterIDField.isEnabled = true
- case .resetting, .completed:
- transmitterIDField.isEnabled = false
- }
- }
-
- private func updateStatusIndicatorState() {
- switch self.state {
- case .empty, .needsConfiguration, .configured, .completed:
- self.spinner.stopAnimating()
- self.errorLabel.superview?.isHidden = true
- case .resetting:
- self.spinner.startAnimating()
- if let error = lastError {
- self.errorLabel.text = String(describing: error)
- }
- self.errorLabel.superview?.isHidden =
- (self.lastError == nil)
- }
- }
-}
-
-
-extension ResetViewController: ResetManagerDelegate {
- func resetManager(_ manager: ResetManager, didError error: Error) {
- DispatchQueue.main.async {
- self.lastError = error
- self.updateStatusIndicatorState()
- }
- }
-
- func resetManager(_ manager: ResetManager, didChangeStateFrom oldState: ResetManager.State) {
- DispatchQueue.main.async {
- switch manager.state {
- case .initialized:
- self.state = .configured
- case .resetting:
- self.state = .resetting
- case .completed:
- self.state = .completed
- }
- }
- }
-}
-
-extension ResetViewController: UINavigationControllerDelegate {
- func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
- return .portrait
- }
-}
-
-extension ResetViewController: UITextFieldDelegate {
- func textFieldShouldReturn(_ textField: UITextField) -> Bool {
- textField.resignFirstResponder()
- return false
- }
-
- func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
- guard let text = textField.text, let stringRange = Range(range, in: text) else {
- state = .needsConfiguration
- return true
- }
-
- let newText = text.replacingCharacters(in: stringRange, with: string)
-
- if newText.count >= 6 {
- if newText.count == 6 {
- textField.text = newText
- textField.resignFirstResponder()
- }
-
- state = .configured
- return false
- }
-
- state = .needsConfiguration
- return true
- }
-}
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Views/Button.swift b/Dependencies/CGMBLEKit/ResetTransmitter/Views/Button.swift
deleted file mode 100644
index c5a09ad22..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Views/Button.swift
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Button.swift
-// ResetTransmitter
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-
-
-class Button: UIButton {
-
- required init?(coder aDecoder: NSCoder) {
- super.init(coder: aDecoder)
- }
-
- override func awakeFromNib() {
- super.awakeFromNib()
-
- backgroundColor = tintColor
- layer.cornerRadius = 6
-
- titleLabel?.adjustsFontForContentSizeCategory = true
- contentEdgeInsets.top = 14
- contentEdgeInsets.bottom = 14
- setTitleColor(.white, for: .normal)
- }
-
- override func tintColorDidChange() {
- super.tintColorDidChange()
-
- backgroundColor = tintColor
- }
-
- override func prepareForInterfaceBuilder() {
- super.prepareForInterfaceBuilder()
-
- tintColor = .blue
- tintColorDidChange()
- }
-
- override var isHighlighted: Bool {
- didSet {
- alpha = isHighlighted ? 0.5 : 1
- }
- }
-
- override var isEnabled: Bool {
- didSet {
- tintAdjustmentMode = isEnabled ? .automatic : .dimmed
- }
- }
-}
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Views/ParagraphView.swift b/Dependencies/CGMBLEKit/ResetTransmitter/Views/ParagraphView.swift
deleted file mode 100644
index d51a6818c..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Views/ParagraphView.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// ParagraphView.swift
-// ResetTransmitter
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-
-class ParagraphView: UITextView {
-
- override func awakeFromNib() {
- super.awakeFromNib()
-
- textContainer.lineFragmentPadding = 0
-
- let paragraphStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
- paragraphStyle.paragraphSpacing = 10
-
- attributedText = NSAttributedString(
- string: text,
- attributes: [
- .paragraphStyle: paragraphStyle,
- .font: UIFont.preferredFont(forTextStyle: .body)
- ]
- )
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/Views/TextField.swift b/Dependencies/CGMBLEKit/ResetTransmitter/Views/TextField.swift
deleted file mode 100644
index f57695efb..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/Views/TextField.swift
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// TextField.swift
-// ResetTransmitter
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import UIKit
-
-class TextField: UITextField {
-
- private let textInset = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
-
- override func editingRect(forBounds bounds: CGRect) -> CGRect {
- return bounds.inset(by: textInset)
- }
-
- override func textRect(forBounds bounds: CGRect) -> CGRect {
- return bounds.inset(by: textInset)
- }
-
- override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
- return bounds.inset(by: textInset)
- }
-
-}
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ar.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ar.lproj/Localizable.strings
deleted file mode 100644
index 3bff73093..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ar.lproj/Localizable.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Title of button to cancel reset */
-"Cancel" = "إلغاء";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/cs.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/cs.lproj/Localizable.strings
deleted file mode 100644
index d510fc10d..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/cs.lproj/Localizable.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Title of button to cancel reset */
-"Cancel" = "Zrušit";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/InfoPlist.strings
deleted file mode 100644
index 9f338c04f..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Nulstil";
-
-/* Bundle name */
-"CFBundleName" = "NulstilSender";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth bliver brugt til at kommunikere med din insulinpumpe og din blodsukkermonitor";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth bliver brugt til at kommunikere med din insulinpumpe og din blodsukkermonitor";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/Localizable.strings
deleted file mode 100644
index 3a231b53c..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Er du sikker på, at du vil nulstille denne sender?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Annuller";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Det vil tage op til 10 minutter at gennemføre.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Nulstil";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Nulstilling af senderen er fuldført";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/Main.strings
deleted file mode 100644
index bc5b2196d..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/da.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Nulstil fuldført";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Nulstil senderen";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Dette værktøj kan nulstille uret på en sender, der har nået sin udløbsdato, så det kan starte nye sensorsessioner.\nDette kan have utilsigtede konsekvenser for datatjenester, som f.eks. Dexcom Clarity og Dexcom Share, især når du bruger en nulstillet sender med det samme konto.\nGenindstilling kan ikke fortrydes.\nBenyttes på egen risiko.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Indtast det 6-cifrede ID";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Fejl optræder her. Og det kan blive meget langt, og det er OK]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Nulstil";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Senderen er nulstillet. Tilslut til appen for at begynde en ny sensorsession.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Sender ID";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/InfoPlist.strings
deleted file mode 100644
index 97ceaac90..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Reset";
-
-/* Bundle name */
-"CFBundleName" = "ResetTransmitter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth wird verwendet für die Kommunikation mit CGM-Geräten";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth wird verwendet für die Kommunikation mit CGM-Geräten";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/Localizable.strings
deleted file mode 100644
index 04be07ed8..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Möchten Sie das CGM wirklich löschen?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Abbrechen";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Der Vorgang kann bis zu 10 Minuten dauern.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Reset";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "TZurücksetzen des Transmitters abgeschlossen";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/Main.strings
deleted file mode 100644
index 81a8b84de..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/de.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Zurücksetzen abgeschlossen";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Transmitter zurücksetzen";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "TMit diesem Tool kann ein Transmitter, dessen Ablaufdatum erreicht ist, zurückgesetzt werden, sodass Sensorsitzungen erneut gestartet werden können.\nDies kann unbeabsichtigte Konsequenzen für Datendienste wie Clarity und Share haben, insbesondere wenn ein zurückgesetzter Transmitter mit demselben Konto verwendet wird.\nDas Zurücksetzen kann nicht rückgängig gemacht werden.\nBenutzung auf eigene Gefahr!";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Geben Sie die 6-stellige ID ein";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Error goes here. And it can get very long and that's OK]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Reset";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Der Transmitter wurde erfolgreich zurückgesetzt. Verbinden Sie ihn mit der App, um eine neue Sensorsitzung zu starten.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Transmitter-ID";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/en.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/en.lproj/Localizable.strings
deleted file mode 100644
index db64ce8a9..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/en.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Are you sure you want to reset this transmitter?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Cancel";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "It will take up to 10 minutes to complete.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Reset";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Transmitter Reset Complete";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/en.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/en.lproj/Main.strings
deleted file mode 100644
index 67b6c4e60..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/en.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Reset Complete";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Reset Transmitter";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Enter the 6-digit ID";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Reset";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session.";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk.";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Error goes here. And it can get very long and that's OK]";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Transmitter ID";
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/InfoPlist.strings
deleted file mode 100644
index 22d32822b..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Reiniciar";
-
-/* Bundle name */
-"CFBundleName" = "Resetear Transmisor";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "El bluetooth se utiliza para la comunicación con dispositivos de monitoreo continuo de glucosa";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "El bluetooth se utiliza para la comunicación con dispositivos de monitoreo continuo de glucosa";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/Localizable.strings
deleted file mode 100644
index f02454953..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "¿Está usted seguro de querer reiniciar este transmisor?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Cancelar";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Puede tardar en completarse hasta 10 minutos.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Reiniciar";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Reinicio del transmisor completado";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/Main.strings
deleted file mode 100644
index 37f955b03..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/es.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Reinicio completado";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Reiniciar el transmisor";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Esta herramienta puede reiniciar el reloj de un transmisor que ha caducado y permite comenzar una nueva sesión de funcionamiento en el sensor.\nEsto puede tener consecuencias inintencionadas con los servidores de datos como Clarity o Share, especialmente si se usa un transmisor reiniciado con la misma cuenta.\nUna vez reiniciado, no se puede volver atrás.\nÚselo bajo su propio riesgo.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Introduzca la identificación de 6 cifras";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[El error se localiza aquí. Puede ser muy largo, pero no importa]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Reiniciar";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "El transmisor se ha reiniciado con éxito. Conéctelo a la app para empezar una sesión nueva del sensor.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Identificación del transmisor";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/InfoPlist.strings
deleted file mode 100644
index 6b1c385c4..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Nollaa";
-
-/* Bundle name */
-"CFBundleName" = "ResetTransmitter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetoothia käytetään kommunikointiin glukoosinseurantalaitteiden kanssa.";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetoothia käytetään kommunikointiin glukoosinseurantalaitteiden kanssa.";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/Localizable.strings
deleted file mode 100644
index b296ca434..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Haluatko varmasti nollata lähettimen?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Kumoa";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Valmistuminen voi kestää 10 minuuttia.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Nollaa";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Lähettimen nollaus valmis";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/Main.strings
deleted file mode 100644
index 211e31662..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/fi.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Nollaus valmis";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Nollaa lähetin";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Tämä työkalu nollaa kellon vanhentuneessa lähettimessä mahdollistaen lähettimen käytön jatkamisen.\n \n Nollauksella voi olla odottamattomia seurauksia esimerkiksi Clarity- ja Share-palveluihin, erityisesti, kun nollattua lähetintä käytetään samalla käyttäjätilillä.\n Nollausta ei voi perua.\n Käytä omalla vastuullasi.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Syötä 6-numeroinen tunniste";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Virhe tulee tähän. Se voi olla hyvin pitkä ja se on OK]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Nollaa";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Lähettimen nollaus onnistui. Yhdistä se sovellukseen ja aloita uusi sensorin sessio.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Lähettimen tunniste";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/InfoPlist.strings
deleted file mode 100644
index e00546126..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Réinitialiser";
-
-/* Bundle name */
-"CFBundleName" = "ResetTransmitter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth est utilisé pour communiquer avec les dispositifs de surveillance continue du glucose.";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth est utilisé pour communiquer avec les dispositifs de surveillance continue du glucose.";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/Localizable.strings
deleted file mode 100644
index d911e447a..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Voulez-vous vraiment réinitialiser ce transmetteur?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Annuler";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Cela prendra jusqu’à 10 minutes pour terminer.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Réinitialiser";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Réinitialisation du transmetteur terminée";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/Main.strings
deleted file mode 100644
index 9c503d994..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/fr.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Réinitialisation terminée";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Réinitialiser le transmetteur";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Cet outil peut réinitialiser l’horloge interne d’un transmetteur qui a atteint sa date de péremption, permettant de l’utiliser à nouveau.\nCeci pourrait avoir des conséquences involontaires pour des services de données, comme Clarity et Share, surtout en utilisant un transmetteur réinitialisé avec le même compte.\nLa réinitialisation est définitive.\nVous utilisez cette fonctionnalité à vos propres risques..";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Entrez l’ID, composé de 6 lettres et chiffres";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[L’erreur se place ici. Elle peut être très longue, ce n’est pas embêtant.]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Réinitialiser";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "La réinitialisation du transmetteur a réussi. Connectez-le à l’application mobile pour commencer une nouvelle session de capteur.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "ID du transmetteur";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/InfoPlist.strings
deleted file mode 100644
index a9bface77..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Reset";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/LaunchScreen.strings b/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/LaunchScreen.strings
deleted file mode 100644
index 8b1378917..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/LaunchScreen.strings
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/Localizable.strings
deleted file mode 100644
index db64ce8a9..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Are you sure you want to reset this transmitter?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Cancel";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "It will take up to 10 minutes to complete.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Reset";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Transmitter Reset Complete";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/Main.strings
deleted file mode 100644
index dfdc8bd60..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/he.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Reset Complete";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Reset Transmitter";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Enter the 6-digit ID";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Error goes here. And it can get very long and that's OK]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Reset";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Transmitter ID";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/hi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/hi.lproj/Localizable.strings
deleted file mode 100644
index bc1817c5d..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/hi.lproj/Localizable.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Title of button to cancel reset */
-"Cancel" = "निरस्त";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/InfoPlist.strings
deleted file mode 100644
index 38df0d9c8..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Ripristina";
-
-/* Bundle name */
-"CFBundleName" = "Resetta trasmettitore";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Il Bluetooth viene utilizzato per comunicare con i dispositivi di monitoraggio continuo del glucosio";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Il Bluetooth viene utilizzato per comunicare con i dispositivi di monitoraggio continuo del glucosio";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/Localizable.strings
deleted file mode 100644
index 4d6ff62e3..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Sei sicuro di voler resettare questo trasmettitore?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Annulla";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "L’operazione richiederà circa 10 minuti.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Ripristina";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Ripristino trasmettitore completato";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/Main.strings
deleted file mode 100644
index 85c6d672c..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/it.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Ripristino completato";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Ripristina trasmettitore";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Questo strumento può ripristinare l'orologio di un trasmettitore che ha raggiunto la data di scadenza, consentendo di avviare nuove sessioni del sensore. Questo può avere effetti indesiderati su servizi di dati come Clarity e Share, soprattutto se il ripristino avviene con lo stesso account. Il ripristino non può essere annullato. Effettualo a tuo rischio e pericolo.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Inserisci ID a 6 cifre";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[L'errore va qui. Può essere molto lungo, ma va bene]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Ripristina";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Il trasmettitore è stato ripristinato. Collegalo all’app per avviare una nuova sessione di misurazione.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "ID trasmettitore";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/InfoPlist.strings
deleted file mode 100644
index 82343093e..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "リセット";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/Localizable.strings
deleted file mode 100644
index 79ca0f80e..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "この送信機をリセットしてもよろしいですか?";
-
-/* Title of button to cancel reset */
-"Cancel" = "キャンセル";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "完了するまでに最大10分かかります。";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "リセット";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "リセット完了";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/Main.strings
deleted file mode 100644
index 5ec5e4f65..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ja.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "リセット完了";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "トランスミッターをリセットする";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "このツールは、使用期限に達したトランスミッターの時刻をリセットし、新たにセンサーのセッションを始められるようにします。\nリセットされたトランスミッターを同じアカウントで使うときは特に、ClarityやShareなどのデータサービスに意図しない影響を及ぼすことがあります。\nリセットは元に戻すことができません。\nご自身の責任で使用してください。";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "6桁のトランスミッタIDを入力";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Error goes here. And it can get very long and that's OK]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "リセット";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "トランスミッターのリセットが完了しました。新たにセンサーのセッションを始めるにはアプリを接続してください。";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "トランスミッタ ID";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/InfoPlist.strings
deleted file mode 100644
index 0673c068b..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Nullstille";
-
-/* Bundle name */
-"CFBundleName" = "ResetTransmitter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth brukes til å kommunisere med kontinuerlige blodsukker monitorenheter";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth brukes til å kommunisere med kontinuerlige blodsukker monitorenheter";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/Localizable.strings
deleted file mode 100644
index 512d4b918..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Er du sikker på at du vil nullstille denne senderen?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Avbryt";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Det kan ta opptil 10 minutter å gjennomføre.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Nullstille";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Nullstilling av sender er ferdig";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/Main.strings
deleted file mode 100644
index 4cd87cf6f..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/nb.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Nullstilling Ferdig";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Nullstill Sender";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Dette verktøyet kan nullstille klokken på en sender som har gått ut på dato, slik at senderen kan brukes på nytt. Dette kan ha uante konsekvenser for eksterne data-tjenester, som Clarity og Share, og spesielt om sender brukes igjen med samme konto. Nullstilling kan ikke angres. Bruk på egen risiko.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Skriv inn 6-siffret ID";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Feil skrives her. Den kan være veldig lang, og det er helt greit]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Nullstille";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Sender er nå nullstillt. Koble den til appen for å starte en ny sensorøkt.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Sender ID";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/InfoPlist.strings
deleted file mode 100644
index d422d5cdf..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Reset";
-
-/* Bundle name */
-"CFBundleName" = "ResetZender";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth wordt gebruikt om te communiceren met continue glucosemeters";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth wordt gebruikt om te communiceren met continue glucosemeters";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/Localizable.strings
deleted file mode 100644
index 1ef84da95..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Weet je zeker dat je deze zender wilt resetten?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Annuleer";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Voltooiing kan tot 10 minuten duren.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Reset";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Reset Zender Compleet";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/Main.strings
deleted file mode 100644
index edd6a6494..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/nl.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Reset Compleet";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Reset Zender";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Deze methode kan de klok van de zender resetten als de vervaldatum is bereikt, zodat een nieuwe sensorsessie gestart kan worden.\nDit heeft mogelijk onbedoelde gevolgen voor services als Clarity en Share. Met name als hetzelfde account wordt gebruikt om een zender te resetten.\nResetten kan niet ongedaan gemaakt worden.\nGebruik op eigen risico";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Vul de 6 cijferige ID in";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Hier komt de foutmelding. Deze kan erg lang zijn en dat is OK]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Reset";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "De zender is succesvol gereset. Verbind de zender met de app om een nieuwe sensorsessie te beginnen.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Zenderserienummer";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/InfoPlist.strings
deleted file mode 100644
index 14730691c..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Resetuj";
-
-/* Bundle name */
-"CFBundleName" = "Zresetuj transmiter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth służy do komunikacji z urządzeniami do ciągłego monitorowania glukozy";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth służy do komunikacji z urządzeniami do ciągłego monitorowania glukozy";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/Localizable.strings
deleted file mode 100644
index be844db5a..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Czy na pewno chcesz zresetować ten nadajnik?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Anuluj";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Procedura zajmie do 10 minut.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Resetuj";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Resetowanie nadajnika zakończone";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/Main.strings
deleted file mode 100644
index 130fae1f7..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/pl.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Resetowanie zakończone";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Zresetuj nadajnik";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "To narzędzie może zresetować zegar nadajnika, który osiągnął termin ważności, umożliwiając ponowne rozpoczęcie sesji sensora. Może to mieć niepożądane konsekwencje dla usług danych, takich jak Clarity i Share, zwłaszcza w przypadku użytkowania zresetowanego nadajnika z tym samym kontem. Resetowania nie można cofnąć. Wykonujesz je na własne ryzyko.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Wprowadź 6-cyfrowy ID";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Oto błąd. Jego treść może być bardzo długa i to normalne]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Resetuj";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Nadajnik został skutecznie zresetowany. Podłącz go do apliakcji, aby rozpocząć nową sesję sensora.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "ID nadajnika";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/InfoPlist.strings
deleted file mode 100644
index 8c502bc76..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Restabelecer";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/Localizable.strings
deleted file mode 100644
index 66afc957a..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Tem certeza de que deseja redefinir este transmissor?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Cancelar";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Levará 10 minutos para concluir.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Restabelecer";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Redefinição do Transmissor Concluída";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/Main.strings
deleted file mode 100644
index 367b469f8..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/pt-BR.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Redefinição Concluída";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Redefinir Transmissor";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Esta ferramenta pode redefinir o relógio em um transmissor que atingiu sua data de validade, permitindo que novas sessões de sensor sejam iniciadas novamente.\n Isso pode ter consequências indesejadas para serviços de dados, como Clarity e Share, especialmente ao usar um transmissor redefinido com a mesmo conta.\n A redefinição não pode ser desfeita.\n Use por sua conta e risco.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Digite o ID de 6 dígitos";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Erro aqui. E pode demorar muito mas tudo bem]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Restabelecer";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "O transmissor foi redefinido com sucesso. Conecte-o ao aplicativo para iniciar uma nova sessão de sensor.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "ID do Transmissor";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/InfoPlist.strings
deleted file mode 100644
index e828ab423..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Resetare";
-
-/* Bundle name */
-"CFBundleName" = "ResetTransmitter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth este utilizat pentru a comunica cu dispozitivele de monitorizare continuă a glicemiei";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth este utilizat pentru a comunica cu dispozitivele de monitorizare continuă a glicemiei";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/Localizable.strings
deleted file mode 100644
index 0cfa490ee..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Sigur doriți să resetați acest transmițător?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Renunță";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Vor fi necesare maxim 10 minute pentru finalizare";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Resetare";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Resetare transmițător finalizată";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/Main.strings
deleted file mode 100644
index 03476dc05..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ro.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Resetare finalizată";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Resetare transmițător";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Acest utilitar poate reseta ceasul dintr-un transmițător ce a depășit data de expirare, permițând pornirea unor noi sesiuni de senzor.\nResetarea poate cauza consecințe nedorite pentru serviciile care colectează date, cum ar fi Clarity sau Share, în special când utilizați un transmițător resetat cu același cont.\nResetarea nu poate fi anulată.\nA se utiliza pe proprie răspundere.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Introduceți ID-ul din 6 cifre";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Eroarea apare aici. Și poate fi foarte lungă și suntem OK cu asta]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Resetare";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Transmițătorul a fost resetat cu succes. Conectați-l la aplicație pentru a porni o nouă sesiune de senzor.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "ID transmițător";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/InfoPlist.strings
deleted file mode 100644
index 7146f1d88..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Сброс";
-
-/* Bundle name */
-"CFBundleName" = "ResetTransmitter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth используется для связи с устройствами непрерывного мониторинга глюкозы";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth используется для связи с устройствами непрерывного мониторинга глюкозы";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/Localizable.strings
deleted file mode 100644
index d2e7cb8f2..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Вы уверены, что хотите сбросить этот трансмиттер?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Отмена";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Может занять до десяти минут.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Сброс";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Сброс данных трансмиттера завершен";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/Main.strings
deleted file mode 100644
index 42ec97366..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/ru.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Сброс завершен";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Сбросить трансмиттер";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Этот инструмент поможет сбросить счетчик времени на трансмиттере, достигшем окончания срока работы. Может повлечь непреднамеренные последствия в службах сбора данных Clarity и Share, особенно при использовании трансмиттера с той же учетной записью. Сброс отменить невозможно. Пользуйтесь на свой риск.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Введите шестизначный идентификатор";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Ошибка здесь. И это может быть очень долго, и это нормально]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Сброс";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Трансмиттер успешно сброшен. Подключите его к родному приложению, чтобы запустить новый сенсор.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "ID трансмиттера";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/InfoPlist.strings
deleted file mode 100644
index 8b22dfaf2..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Resetovať";
-
-/* Bundle name */
-"CFBundleName" = "ResetovaťVysielač";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth sa používa na komunikáciu so zariadeniami pre kontinuálne snímanie glykémie.";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth sa používa na komunikáciu so zariadeniami pre kontinuálne snímanie glykémie.";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/Localizable.strings
deleted file mode 100644
index 9c38268df..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Naozaj chcete resetovať tento vysielač?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Zrušiť";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Dokončenie bude trvať do 10 minút.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Resetovať";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Resetovanie vysielača je dokončené";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/Main.strings
deleted file mode 100644
index d3a973ef6..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/sk.lproj/Main.strings
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Obnovenie dokončené";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Resetovať vysielač";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Tento nástroj môže resetovať hodiny na vysielači, ktorý dosiahol dátum vypršania platnosti, čo umožňuje opätovné spustenie nových relácií senzora.\nTo môže mať neželané dôsledky pre dátové služby, ako je Clarity a Share, najmä ak používate resetovaný vysielač s rovnakým účtom.\nResetovanie sa nedá vrátiť späť.\nPoužitie na vlastné riziko.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Zadajte 6-miestne ID";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Resetovať";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Vysielač bol úspešne resetovaný. Pripojte ho k aplikácii a začnite novú reláciu senzora.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "ID vysielača";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/InfoPlist.strings
deleted file mode 100644
index c4012d222..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Återställ";
-
-/* Bundle name */
-"CFBundleName" = "ResetTransmitter";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth används för kommunikation med kontinuerliga blodglukosmätare";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth används för kommunikation med kontinuerliga blodglukosmätare";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/Localizable.strings
deleted file mode 100644
index c0790a14f..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Är du säker på att du vill återställa denna sändare?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Avbryt";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Det kan ta upp till 10 minuter innan allt är återställt.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Återställ";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Återställning av sändaren är nu genomförd";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/Main.strings
deleted file mode 100644
index 592c3df1c..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/sv.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Återställning färdig";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Återställ sändare";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Detta verktyg kan återställa klockan på en sändare som har nått sitt utgångsdatum, därigenom tillåta att en ny sensor kan startas. Detta kan få oväntade följder för tjänster som hanterar datan, t.ex. Clarity och Share, speciellt när man använder en återställd sändare med samma konto. Återställning kan inte ångras.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Ange ditt 6-siffriga sändar-ID";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Här står felen. Och det kan bli väldigt långt, vilket är OK]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Återställ";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Sändaren har blivit återställd. Anslut den till appen för att börja ny session.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Sändari-ID";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/InfoPlist.strings
deleted file mode 100644
index 099a9ff65..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Sıfırla";
-
-/* Bundle name */
-"CFBundleName" = "Vericiyi Sıfırla";
-
-/* Privacy - Bluetooth Always Usage Description */
-"NSBluetoothAlwaysUsageDescription" = "Bluetooth, sürekli glikoz izleme cihazlarıyla iletişim kurmak için kullanılır";
-
-/* Privacy - Bluetooth Peripheral Usage Description */
-"NSBluetoothPeripheralUsageDescription" = "Bluetooth, sürekli glikoz izleme cihazlarıyla iletişim kurmak için kullanılır";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/LaunchScreen.strings b/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/LaunchScreen.strings
deleted file mode 100644
index 8b1378917..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/LaunchScreen.strings
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/Localizable.strings
deleted file mode 100644
index f986051c5..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Bu vericiyi sıfırlamak istediğinizden emin misiniz?";
-
-/* Title of button to cancel reset */
-"Cancel" = "İptal";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Tamamlanması 10 dakika kadar sürecektir.";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Sıfırla";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Verici Sıfırlama Tamamlandı";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/Main.strings
deleted file mode 100644
index e3b51e152..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/tr.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Sıfırlama Tamamlandı";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Vericiyi Sıfırla";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Bu araç, son kullanma tarihine ulaşmış bir vericideki saati sıfırlayarak yeni sensör oturumlarının yeniden başlatılmasını sağlayabilir.\nÖzellikle aynı hesapla, sıfırlanan bir verici kullanıldığında, Clarity ve Share gibi veri hizmetleri için istenmeyen sonuçları olabilir.\nSıfırlama geri alınamaz.\nKullanımı kendi sorumluluğunuzdadır.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "6 basamaklı kimliği girin";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Hata buraya gider. Ve çok uzun olabilir ve sorun değil]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Sıfırla";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Verici başarıyla sıfırlandı. Yeni bir sensör oturumu başlatmak için uygulamaya bağlayın.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Verici Kimliği";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/InfoPlist.strings b/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/InfoPlist.strings
deleted file mode 100644
index 887b25478..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Bundle display name */
-"CFBundleDisplayName" = "Khôi phục lại";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/Localizable.strings
deleted file mode 100644
index ac0eb33d1..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "Bạn có chắc muốn cài lại transmitter này không?";
-
-/* Title of button to cancel reset */
-"Cancel" = "Hủy bỏ";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "Cần 10 phút để hoàn thành công việc";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "Khôi phục lại";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "Cài lại Transmitter hoàn tất";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/Main.strings
deleted file mode 100644
index 326e317ad..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/vi.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "Cài lại hoàn tất";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "Cài lại Transmitter";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "Tác vụ này có thể đảo ngược đồng hồ trên transmitter khi đến ngày hết hạn và cho phép tiếp tục sử dụng sensor mới.\nĐiều này có thể có hậu quả không lường được đối với các dịch vụ về dữ liệu ví dụ như trên ứng dụng Clarity và Share, đặc biệt là khi thực hiện việc cài lại transmitter mà sử dụng cùng một tài khoản.\nViệc cài đặt không thể được thực hiện.\nBạn tự chịu mọi rủi ro.";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "Nhập 6 số ID";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[Lỗi ở đây. Và có thể mất nhiều thời gian nhưng sẽ ổn thôi]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "Khôi phục lại";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "Việc cài lại Transmitter đã hoàn tất. Kết nối với ứng dụng để bắt đầu khởi động sensor.";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "Số ID của Transmitter";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/zh-Hans.lproj/Localizable.strings b/Dependencies/CGMBLEKit/ResetTransmitter/zh-Hans.lproj/Localizable.strings
deleted file mode 100644
index 770ca160c..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/zh-Hans.lproj/Localizable.strings
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Title of the reset confirmation sheet */
-"Are you sure you want to reset this transmitter?" = "确定要重置发射器么";
-
-/* Title of button to cancel reset */
-"Cancel" = "取消";
-
-/* Message of the reset confirmation sheet */
-"It will take up to 10 minutes to complete." = "该操作可能需要10分钟";
-
-/* Reset button title
- Title of button to begin reset */
-"Reset" = "重置";
-
-/* Notification title for background completion notification */
-"Transmitter Reset Complete" = "发射器已重置";
-
diff --git a/Dependencies/CGMBLEKit/ResetTransmitter/zh-Hans.lproj/Main.strings b/Dependencies/CGMBLEKit/ResetTransmitter/zh-Hans.lproj/Main.strings
deleted file mode 100644
index e4a62c671..000000000
--- a/Dependencies/CGMBLEKit/ResetTransmitter/zh-Hans.lproj/Main.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Class = "UINavigationItem"; title = "Reset Complete"; ObjectID = "3SD-s3-7OM"; */
-"3SD-s3-7OM.title" = "重置已完成";
-
-/* Class = "UINavigationItem"; title = "Reset Transmitter"; ObjectID = "7nc-6t-4hZ"; */
-"7nc-6t-4hZ.title" = "重置发射器";
-
-/* Class = "UITextView"; text = "This tool can reset the clock on a transmitter that has reached its expiration date, allowing new sensor sessions to again be started.\nThis may have unintended consequences for data services, such as Clarity and Share, especially when using a reset transmitter with the same account.\nResetting cannot be undone.\nUse at your own risk."; ObjectID = "cJ3-Gc-pnc"; */
-"cJ3-Gc-pnc.text" = "该操作将会把发射器使用时间清零,此后可以继续重新启动传感器.这可能会导致Dexcom远程数据故障,尤其是使用同一个Dexcom账户上传数据.重置可能会失败,请自行承担相关风险";
-
-/* Class = "UITextField"; placeholder = "Enter the 6-digit ID"; ObjectID = "G4a-ia-wQC"; */
-"G4a-ia-wQC.placeholder" = "输入6位数字编号";
-
-/* Class = "UILabel"; text = "[Error goes here. And it can get very long and that's OK]"; ObjectID = "gYy-Zz-y12"; */
-"gYy-Zz-y12.text" = "[发生错误,请耐心等待]";
-
-/* Class = "UIButton"; normalTitle = "Reset"; ObjectID = "LBC-6R-q79"; */
-"LBC-6R-q79.normalTitle" = "重置";
-
-/* Class = "UITextView"; text = "The transmitter has been successfully reset. Connect it to the app to begin a new sensor session."; ObjectID = "MbK-kj-ejl"; */
-"MbK-kj-ejl.text" = "发射器已重置,请重新连接,并启动传感器";
-
-/* Class = "UITableViewSection"; headerTitle = "Transmitter ID"; ObjectID = "vNG-r7-RbP"; */
-"vNG-r7-RbP.headerTitle" = "发射器编号";
-
diff --git a/Dependencies/G7SensorKit/.gitignore b/Dependencies/G7SensorKit/.gitignore
deleted file mode 100644
index 72baa4591..000000000
--- a/Dependencies/G7SensorKit/.gitignore
+++ /dev/null
@@ -1,91 +0,0 @@
-# Xcode
-#
-# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
-.DS_Store
-
-## User settings
-xcuserdata/
-
-## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
-*.xcscmblueprint
-*.xccheckout
-
-## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
-build/
-DerivedData/
-*.moved-aside
-*.pbxuser
-!default.pbxuser
-*.mode1v3
-!default.mode1v3
-*.mode2v3
-!default.mode2v3
-*.perspectivev3
-!default.perspectivev3
-
-## Obj-C/Swift specific
-*.hmap
-
-## App packaging
-*.ipa
-*.dSYM.zip
-*.dSYM
-
-## Playgrounds
-timeline.xctimeline
-playground.xcworkspace
-
-# Swift Package Manager
-#
-# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
-# Packages/
-# Package.pins
-# Package.resolved
-# *.xcodeproj
-#
-# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
-# hence it is not needed unless you have added a package configuration file to your project
-# .swiftpm
-
-.build/
-
-# CocoaPods
-#
-# We recommend against adding the Pods directory to your .gitignore. However
-# you should judge for yourself, the pros and cons are mentioned at:
-# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
-#
-# Pods/
-#
-# Add this line if you want to avoid checking in source code from the Xcode workspace
-# *.xcworkspace
-
-# Carthage
-#
-# Add this line if you want to avoid checking in source code from Carthage dependencies.
-# Carthage/Checkouts
-
-Carthage/Build/
-
-# Accio dependency management
-Dependencies/
-.accio/
-
-# fastlane
-#
-# It is recommended to not store the screenshots in the git repo.
-# Instead, use fastlane to re-generate the screenshots whenever they are needed.
-# For more information about the recommended setup visit:
-# https://docs.fastlane.tools/best-practices/source-control/#source-control
-
-fastlane/report.xml
-fastlane/Preview.html
-fastlane/screenshots/**/*.png
-fastlane/test_output
-
-# Code Injection
-#
-# After new code Injection tools there's a generated folder /iOSInjectionProject
-# https://github.com/johnno1962/injectionforxcode
-
-iOSInjectionProject/
diff --git a/Dependencies/G7SensorKit/Common/Data.swift b/Dependencies/G7SensorKit/Common/Data.swift
deleted file mode 100644
index a7587d651..000000000
--- a/Dependencies/G7SensorKit/Common/Data.swift
+++ /dev/null
@@ -1,99 +0,0 @@
-//
-// NSData.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 3/5/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-extension Data {
- private func toDefaultEndian(_: T.Type) -> T {
- return self.withUnsafeBytes({ (rawBufferPointer: UnsafeRawBufferPointer) -> T in
- let bufferPointer = rawBufferPointer.bindMemory(to: T.self)
- guard let pointer = bufferPointer.baseAddress else {
- return 0
- }
- return T(pointer.pointee)
- })
- }
-
- func to(_ type: T.Type) -> T {
- return T(littleEndian: toDefaultEndian(type))
- }
-
- func toInt() -> T {
- return to(T.self)
- }
-
- func toBigEndian(_ type: T.Type) -> T {
- return T(bigEndian: toDefaultEndian(type))
- }
-
- mutating func append(_ newElement: T) {
- withUnsafePointer(to: newElement.littleEndian) { (ptr: UnsafePointer) in
- append(UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-
- mutating func appendBigEndian(_ newElement: T) {
- withUnsafePointer(to: newElement.bigEndian) { (ptr: UnsafePointer) in
- append(UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-
- init(_ value: T) {
- self = withUnsafePointer(to: value.littleEndian) { (ptr: UnsafePointer) -> Data in
- return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-
- init(bigEndian value: T) {
- self = withUnsafePointer(to: value.bigEndian) { (ptr: UnsafePointer) -> Data in
- return Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
- }
- }
-}
-
-
-// String conversion methods, adapted from https://stackoverflow.com/questions/40276322/hex-binary-string-conversion-in-swift/40278391#40278391
-extension Data {
- init?(hexadecimalString: String) {
- self.init(capacity: hexadecimalString.utf16.count / 2)
-
- // Convert 0 ... 9, a ... f, A ...F to their decimal value,
- // return nil for all other input characters
- func decodeNibble(u: UInt16) -> UInt8? {
- switch u {
- case 0x30 ... 0x39: // '0'-'9'
- return UInt8(u - 0x30)
- case 0x41 ... 0x46: // 'A'-'F'
- return UInt8(u - 0x41 + 10) // 10 since 'A' is 10, not 0
- case 0x61 ... 0x66: // 'a'-'f'
- return UInt8(u - 0x61 + 10) // 10 since 'a' is 10, not 0
- default:
- return nil
- }
- }
-
- var even = true
- var byte: UInt8 = 0
- for c in hexadecimalString.utf16 {
- guard let val = decodeNibble(u: c) else { return nil }
- if even {
- byte = val << 4
- } else {
- byte += val
- self.append(byte)
- }
- even = !even
- }
- guard even else { return nil }
- }
-
- var hexadecimalString: String {
- return map { String(format: "%02hhx", $0) }.joined()
- }
-}
diff --git a/Dependencies/G7SensorKit/Common/HKUnit.swift b/Dependencies/G7SensorKit/Common/HKUnit.swift
deleted file mode 100644
index 69e6f9aed..000000000
--- a/Dependencies/G7SensorKit/Common/HKUnit.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// HKUnit.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 8/6/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import HealthKit
-
-
-extension HKUnit {
- static let milligramsPerDeciliter: HKUnit = {
- return HKUnit.gramUnit(with: .milli).unitDivided(by: HKUnit.literUnit(with: .deci))
- }()
-
- static let milligramsPerDeciliterPerMinute: HKUnit = {
- return HKUnit.milligramsPerDeciliter.unitDivided(by: .minute())
- }()
-}
diff --git a/Dependencies/G7SensorKit/Common/LocalizedString.swift b/Dependencies/G7SensorKit/Common/LocalizedString.swift
deleted file mode 100644
index 831ab950f..000000000
--- a/Dependencies/G7SensorKit/Common/LocalizedString.swift
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// LocalizedString.swift
-// LoopUI
-//
-// Created by Kathryn DiSimone on 8/15/18.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-internal class FrameworkBundle {
- static let main = Bundle(for: FrameworkBundle.self)
-}
-
-func LocalizedString(_ key: String, tableName: String? = nil, value: String? = nil, comment: String) -> String {
- if let value = value {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, value: value, comment: comment)
- } else {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, comment: comment)
- }
-}
diff --git a/Dependencies/G7SensorKit/Common/Locked.swift b/Dependencies/G7SensorKit/Common/Locked.swift
deleted file mode 100644
index fd6e35b10..000000000
--- a/Dependencies/G7SensorKit/Common/Locked.swift
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Locked.swift
-// LoopKit
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import os.lock
-
-
-internal class Locked {
- private var lock = os_unfair_lock()
- private var _value: T
-
- init(_ value: T) {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- _value = value
- }
-
- var value: T {
- get {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- return _value
- }
- set {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- _value = newValue
- }
- }
-
- func mutate(_ changes: (_ value: inout T) -> Void) -> T {
- os_unfair_lock_lock(&lock)
- defer { os_unfair_lock_unlock(&lock) }
- changes(&_value)
- return _value
- }
-}
diff --git a/Dependencies/G7SensorKit/Common/TimeInterval.swift b/Dependencies/G7SensorKit/Common/TimeInterval.swift
deleted file mode 100644
index 5a8046a6c..000000000
--- a/Dependencies/G7SensorKit/Common/TimeInterval.swift
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-// NSTimeInterval.swift
-// Naterade
-//
-// Created by Nathan Racklyeft on 1/9/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-extension TimeInterval {
- static func hours(_ hours: Double) -> TimeInterval {
- return self.init(hours: hours)
- }
-
- static func minutes(_ minutes: Int) -> TimeInterval {
- return self.init(minutes: Double(minutes))
- }
-
- static func minutes(_ minutes: Double) -> TimeInterval {
- return self.init(minutes: minutes)
- }
-
- static func seconds(_ seconds: Double) -> TimeInterval {
- return self.init(seconds)
- }
-
- static func milliseconds(_ milliseconds: Double) -> TimeInterval {
- return self.init(milliseconds / 1000)
- }
-
- init(minutes: Double) {
- self.init(minutes * 60)
- }
-
- init(hours: Double) {
- self.init(minutes: hours * 60)
- }
-
- init(seconds: Double) {
- self.init(seconds)
- }
-
- init(milliseconds: Double) {
- self.init(milliseconds / 1000)
- }
-
- var milliseconds: Double {
- return self * 1000
- }
-
- var minutes: Double {
- return self / 60.0
- }
-
- var hours: Double {
- return minutes / 60.0
- }
-
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.pbxproj b/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.pbxproj
deleted file mode 100644
index 73d3df64d..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,1193 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 56;
- objects = {
-
-/* Begin PBXBuildFile section */
- C109F14A291ECCE2008EA5B6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C109F149291ECCE2008EA5B6 /* Assets.xcassets */; };
- C109F14C291ED66F008EA5B6 /* G7GlucoseMessageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C109F14B291ED66F008EA5B6 /* G7GlucoseMessageTests.swift */; };
- C139829829295D7D0047DB5F /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F514A291EB6F000555EB5 /* HKUnit.swift */; };
- C1409A07291EC21C006BE8D0 /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5126291EAF2F00555EB5 /* OSLog.swift */; };
- C1409A09291EC22F006BE8D0 /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1409A08291EC22F006BE8D0 /* OSLog.swift */; };
- C1409A0B291EC258006BE8D0 /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1409A0A291EC258006BE8D0 /* OSLog.swift */; };
- C1409A0C291EC2F8006BE8D0 /* G7SensorKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C17F50C6291EAC3800555EB5 /* G7SensorKit.framework */; };
- C1409A0D291EC2F8006BE8D0 /* G7SensorKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C17F50C6291EAC3800555EB5 /* G7SensorKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- C1409A0F291EC2FB006BE8D0 /* G7SensorKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C17F50F8291EAC9100555EB5 /* G7SensorKitUI.framework */; };
- C1409A10291EC2FB006BE8D0 /* G7SensorKitUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C17F50F8291EAC9100555EB5 /* G7SensorKitUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- C17F50CF291EAC3800555EB5 /* G7SensorKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C17F50C6291EAC3800555EB5 /* G7SensorKit.framework */; };
- C17F50D4291EAC3800555EB5 /* G7SensorKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50D3291EAC3800555EB5 /* G7SensorKitTests.swift */; };
- C17F50D5291EAC3800555EB5 /* G7SensorKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C17F50C9291EAC3800555EB5 /* G7SensorKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C17F50E9291EAC6500555EB5 /* G7BackfillMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50DF291EAC6500555EB5 /* G7BackfillMessage.swift */; };
- C17F50EA291EAC6500555EB5 /* G7DeviceStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E0291EAC6500555EB5 /* G7DeviceStatus.swift */; };
- C17F50EB291EAC6500555EB5 /* G7Sensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E1291EAC6500555EB5 /* G7Sensor.swift */; };
- C17F50EC291EAC6500555EB5 /* G7LastReading.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E2291EAC6500555EB5 /* G7LastReading.swift */; };
- C17F50ED291EAC6500555EB5 /* G7Opcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E3291EAC6500555EB5 /* G7Opcode.swift */; };
- C17F50EE291EAC6500555EB5 /* G7PeripheralManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E4291EAC6500555EB5 /* G7PeripheralManager.swift */; };
- C17F50EF291EAC6500555EB5 /* G7CGMManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E5291EAC6500555EB5 /* G7CGMManager.swift */; };
- C17F50F0291EAC6500555EB5 /* G7CGMManagerState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E6291EAC6500555EB5 /* G7CGMManagerState.swift */; };
- C17F50F1291EAC6500555EB5 /* G7BluetoothManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E7291EAC6500555EB5 /* G7BluetoothManager.swift */; };
- C17F50F2291EAC6500555EB5 /* G7GlucoseMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F50E8291EAC6500555EB5 /* G7GlucoseMessage.swift */; };
- C17F50FB291EAC9100555EB5 /* G7SensorKitUI.h in Headers */ = {isa = PBXBuildFile; fileRef = C17F50FA291EAC9100555EB5 /* G7SensorKitUI.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C17F5106291EAC9D00555EB5 /* G7SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5100291EAC9D00555EB5 /* G7SettingsViewModel.swift */; };
- C17F5107291EAC9D00555EB5 /* G7StartupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5101291EAC9D00555EB5 /* G7StartupView.swift */; };
- C17F5108291EAC9D00555EB5 /* G7SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5102291EAC9D00555EB5 /* G7SettingsView.swift */; };
- C17F5109291EAC9D00555EB5 /* G7CGMManager+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5103291EAC9D00555EB5 /* G7CGMManager+UI.swift */; };
- C17F510A291EAC9D00555EB5 /* G7UICoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5104291EAC9D00555EB5 /* G7UICoordinator.swift */; };
- C17F5120291EACCD00555EB5 /* G7SensorPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = C17F511F291EACCD00555EB5 /* G7SensorPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; };
- C17F5125291EACE400555EB5 /* G7SensorPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5124291EACE400555EB5 /* G7SensorPlugin.swift */; };
- C17F5135291EB06A00555EB5 /* AlgorithmState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5134291EB06A00555EB5 /* AlgorithmState.swift */; };
- C17F5138291EB0A800555EB5 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5137291EB0A800555EB5 /* Data.swift */; };
- C17F513A291EB0D900555EB5 /* GlucoseLimits.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5139291EB0D900555EB5 /* GlucoseLimits.swift */; };
- C17F513C291EB13D00555EB5 /* Locked.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F513B291EB13D00555EB5 /* Locked.swift */; };
- C17F513E291EB1A500555EB5 /* BluetoothServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F513D291EB1A500555EB5 /* BluetoothServices.swift */; };
- C17F5140291EB27D00555EB5 /* TimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F513F291EB27D00555EB5 /* TimeInterval.swift */; };
- C17F5143291EB36700555EB5 /* AuthChallengeRxMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5142291EB36700555EB5 /* AuthChallengeRxMessage.swift */; };
- C17F5145291EB45900555EB5 /* CBPeripheral.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5144291EB45900555EB5 /* CBPeripheral.swift */; };
- C17F5147291EB57700555EB5 /* SensorMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5146291EB57700555EB5 /* SensorMessage.swift */; };
- C17F5149291EB6B600555EB5 /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5148291EB6B600555EB5 /* LocalizedString.swift */; };
- C17F514B291EB6F000555EB5 /* HKUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F514A291EB6F000555EB5 /* HKUnit.swift */; };
- C17F514D291EB79E00555EB5 /* AlgorithmError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F514C291EB79E00555EB5 /* AlgorithmError.swift */; };
- C17F514F291EB87600555EB5 /* G7SensorKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C17F50C6291EAC3800555EB5 /* G7SensorKit.framework */; };
- C17F5156291EBD8600555EB5 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F5155291EBD8600555EB5 /* Image.swift */; };
- C17F5157291EBD9900555EB5 /* TimeInterval.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17F513F291EB27D00555EB5 /* TimeInterval.swift */; };
- C19C9F4529C9115B00A6D3D0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C19C9F4729C9115B00A6D3D0 /* Localizable.strings */; };
- C19C9F4A29C9117500A6D3D0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C19C9F4C29C9117500A6D3D0 /* Localizable.strings */; };
- C19C9F4E29C91C4C00A6D3D0 /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C19C9F4D29C91C4C00A6D3D0 /* LocalizedString.swift */; };
- C1E71720292D84FE00DA646F /* G7ProgressBarState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1E7171F292D84FE00DA646F /* G7ProgressBarState.swift */; };
- CEC751E129D8837D006E9D24 /* LoopKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEC751E029D8837D006E9D24 /* LoopKitUI.framework */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- C17F50D0291EAC3800555EB5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = C17F50BD291EAC3800555EB5 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C17F50C5291EAC3800555EB5;
- remoteInfo = G7SensorKit;
- };
- C17F512B291EAFA100555EB5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = C17F50BD291EAC3800555EB5 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C17F50C5291EAC3800555EB5;
- remoteInfo = G7SensorKit;
- };
- C17F512F291EAFA100555EB5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = C17F50BD291EAC3800555EB5 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C17F50F7291EAC9100555EB5;
- remoteInfo = G7SensorKitUI;
- };
- C17F5151291EB87600555EB5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = C17F50BD291EAC3800555EB5 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C17F50C5291EAC3800555EB5;
- remoteInfo = G7SensorKit;
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- C1409A0E291EC2F8006BE8D0 /* Embed Frameworks */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- C1409A0D291EC2F8006BE8D0 /* G7SensorKit.framework in Embed Frameworks */,
- C1409A10291EC2FB006BE8D0 /* G7SensorKitUI.framework in Embed Frameworks */,
- );
- name = "Embed Frameworks";
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 193F1E3D2B44C18000525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; };
- 193F1E3E2B44C18100525770 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; };
- C1086B0E29C9169100D46E65 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
- C1086B0F29C9169100D46E65 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
- C109F149291ECCE2008EA5B6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
- C109F14B291ED66F008EA5B6 /* G7GlucoseMessageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7GlucoseMessageTests.swift; sourceTree = ""; };
- C10A0FE529C91688006F4CD8 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
- C10A0FE629C91688006F4CD8 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; };
- C10A851B29C916A200EAE6B3 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; };
- C10A851C29C916A200EAE6B3 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; };
- C110930529C9169800AD9503 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = ""; };
- C110930629C9169800AD9503 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = ""; };
- C125E0C029C9168100AB13C5 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
- C125E0C129C9168100AB13C5 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
- C12E6F0729C9166900E6FDBE /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
- C12E6F0829C9166900E6FDBE /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; };
- C13C056529C916AA00ED3803 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
- C13C056629C916AA00ED3803 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
- C14091FA29C9167100ADD112 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
- C14091FB29C9167100ADD112 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
- C1409A08291EC22F006BE8D0 /* OSLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; };
- C1409A0A291EC258006BE8D0 /* OSLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; };
- C149257929C916B200F94598 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
- C149257A29C916B200F94598 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
- C14BF96629C916560055FA98 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; };
- C158585E29C916BA00EA08EA /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; };
- C158585F29C916BA00EA08EA /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; };
- C17F50C6291EAC3800555EB5 /* G7SensorKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = G7SensorKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- C17F50C9291EAC3800555EB5 /* G7SensorKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = G7SensorKit.h; sourceTree = ""; };
- C17F50CE291EAC3800555EB5 /* G7SensorKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = G7SensorKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- C17F50D3291EAC3800555EB5 /* G7SensorKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = G7SensorKitTests.swift; sourceTree = ""; };
- C17F50DF291EAC6500555EB5 /* G7BackfillMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7BackfillMessage.swift; sourceTree = ""; };
- C17F50E0291EAC6500555EB5 /* G7DeviceStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7DeviceStatus.swift; sourceTree = ""; };
- C17F50E1291EAC6500555EB5 /* G7Sensor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7Sensor.swift; sourceTree = ""; };
- C17F50E2291EAC6500555EB5 /* G7LastReading.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7LastReading.swift; sourceTree = ""; };
- C17F50E3291EAC6500555EB5 /* G7Opcode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7Opcode.swift; sourceTree = ""; };
- C17F50E4291EAC6500555EB5 /* G7PeripheralManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7PeripheralManager.swift; sourceTree = ""; };
- C17F50E5291EAC6500555EB5 /* G7CGMManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7CGMManager.swift; sourceTree = ""; };
- C17F50E6291EAC6500555EB5 /* G7CGMManagerState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7CGMManagerState.swift; sourceTree = ""; };
- C17F50E7291EAC6500555EB5 /* G7BluetoothManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7BluetoothManager.swift; sourceTree = ""; };
- C17F50E8291EAC6500555EB5 /* G7GlucoseMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7GlucoseMessage.swift; sourceTree = ""; };
- C17F50F8291EAC9100555EB5 /* G7SensorKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = G7SensorKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- C17F50FA291EAC9100555EB5 /* G7SensorKitUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = G7SensorKitUI.h; sourceTree = ""; };
- C17F5100291EAC9D00555EB5 /* G7SettingsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7SettingsViewModel.swift; sourceTree = ""; };
- C17F5101291EAC9D00555EB5 /* G7StartupView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7StartupView.swift; sourceTree = ""; };
- C17F5102291EAC9D00555EB5 /* G7SettingsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7SettingsView.swift; sourceTree = ""; };
- C17F5103291EAC9D00555EB5 /* G7CGMManager+UI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "G7CGMManager+UI.swift"; sourceTree = ""; };
- C17F5104291EAC9D00555EB5 /* G7UICoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7UICoordinator.swift; sourceTree = ""; };
- C17F511D291EACCD00555EB5 /* G7SensorPlugin.loopplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = G7SensorPlugin.loopplugin; sourceTree = BUILT_PRODUCTS_DIR; };
- C17F511F291EACCD00555EB5 /* G7SensorPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = G7SensorPlugin.h; sourceTree = ""; };
- C17F5124291EACE400555EB5 /* G7SensorPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = G7SensorPlugin.swift; sourceTree = ""; };
- C17F5126291EAF2F00555EB5 /* OSLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; };
- C17F5134291EB06A00555EB5 /* AlgorithmState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlgorithmState.swift; sourceTree = ""; };
- C17F5137291EB0A800555EB5 /* Data.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = ""; };
- C17F5139291EB0D900555EB5 /* GlucoseLimits.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucoseLimits.swift; sourceTree = ""; };
- C17F513B291EB13D00555EB5 /* Locked.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Locked.swift; sourceTree = ""; };
- C17F513D291EB1A500555EB5 /* BluetoothServices.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BluetoothServices.swift; sourceTree = ""; };
- C17F513F291EB27D00555EB5 /* TimeInterval.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeInterval.swift; sourceTree = ""; };
- C17F5142291EB36700555EB5 /* AuthChallengeRxMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthChallengeRxMessage.swift; sourceTree = ""; };
- C17F5144291EB45900555EB5 /* CBPeripheral.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CBPeripheral.swift; sourceTree = ""; };
- C17F5146291EB57700555EB5 /* SensorMessage.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; path = SensorMessage.swift; sourceTree = ""; };
- C17F5148291EB6B600555EB5 /* LocalizedString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalizedString.swift; sourceTree = ""; };
- C17F514A291EB6F000555EB5 /* HKUnit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HKUnit.swift; sourceTree = ""; };
- C17F514C291EB79E00555EB5 /* AlgorithmError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlgorithmError.swift; sourceTree = ""; };
- C17F5155291EBD8600555EB5 /* Image.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Image.swift; sourceTree = ""; };
- C17F5158291EBE7500555EB5 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- C19277AE29C916C200311AB7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
- C19277AF29C916C200311AB7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; };
- C19C9F4629C9115B00A6D3D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
- C19C9F4D29C91C4C00A6D3D0 /* LocalizedString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedString.swift; sourceTree = ""; };
- C19C9F4F29C91ED400A6D3D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
- C1AEF8AF29C916CA001F6F41 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
- C1AEF8B029C916CA001F6F41 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
- C1B6638F29C916EC001556A8 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; };
- C1B6639029C916EC001556A8 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; };
- C1C140DE29C916D20051AFF1 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
- C1C140DF29C916D20051AFF1 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; };
- C1C86C0A29C916DC0060D000 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
- C1C86C0B29C916DC0060D000 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; };
- C1CCD81429C916F600A1158E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
- C1CCD81529C916F600A1158E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; };
- C1CDA74429C916E400DDC69C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
- C1CDA74529C916E400DDC69C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
- C1CE705E29C916FE00E70F9D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; };
- C1CE705F29C916FE00E70F9D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; };
- C1E3B2FF29C9170800A06681 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
- C1E3B30029C9170800A06681 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; };
- C1E7171F292D84FE00DA646F /* G7ProgressBarState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = G7ProgressBarState.swift; sourceTree = ""; };
- C1E9A8EB29C9170F00478AA9 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; };
- C1F6C1FA29C9166000C74579 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; };
- C1F6C1FB29C9166000C74579 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; };
- CEC751E029D8837D006E9D24 /* LoopKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = LoopKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- C17F50C3291EAC3800555EB5 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEC751E129D8837D006E9D24 /* LoopKitUI.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F50CB291EAC3800555EB5 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C17F50CF291EAC3800555EB5 /* G7SensorKit.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F50F5291EAC9100555EB5 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C17F514F291EB87600555EB5 /* G7SensorKit.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F511A291EACCD00555EB5 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C1409A0C291EC2F8006BE8D0 /* G7SensorKit.framework in Frameworks */,
- C1409A0F291EC2FB006BE8D0 /* G7SensorKitUI.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- C17F50BC291EAC3800555EB5 = {
- isa = PBXGroup;
- children = (
- C17F5136291EB07F00555EB5 /* Common */,
- C17F50C8291EAC3800555EB5 /* G7SensorKit */,
- C17F50D2291EAC3800555EB5 /* G7SensorKitTests */,
- C17F50F9291EAC9100555EB5 /* G7SensorKitUI */,
- C17F511E291EACCD00555EB5 /* G7SensorPlugin */,
- C17F50C7291EAC3800555EB5 /* Products */,
- C17F5128291EAFA100555EB5 /* Frameworks */,
- );
- sourceTree = "";
- };
- C17F50C7291EAC3800555EB5 /* Products */ = {
- isa = PBXGroup;
- children = (
- C17F50C6291EAC3800555EB5 /* G7SensorKit.framework */,
- C17F50CE291EAC3800555EB5 /* G7SensorKitTests.xctest */,
- C17F50F8291EAC9100555EB5 /* G7SensorKitUI.framework */,
- C17F511D291EACCD00555EB5 /* G7SensorPlugin.loopplugin */,
- );
- name = Products;
- sourceTree = "";
- };
- C17F50C8291EAC3800555EB5 /* G7SensorKit */ = {
- isa = PBXGroup;
- children = (
- C19C9F4729C9115B00A6D3D0 /* Localizable.strings */,
- C17F513D291EB1A500555EB5 /* BluetoothServices.swift */,
- C17F514C291EB79E00555EB5 /* AlgorithmError.swift */,
- C17F5134291EB06A00555EB5 /* AlgorithmState.swift */,
- C17F5144291EB45900555EB5 /* CBPeripheral.swift */,
- C17F50DE291EAC6500555EB5 /* G7CGMManager */,
- C17F50C9291EAC3800555EB5 /* G7SensorKit.h */,
- C17F5139291EB0D900555EB5 /* GlucoseLimits.swift */,
- C17F5141291EB34800555EB5 /* Messages */,
- C1409A08291EC22F006BE8D0 /* OSLog.swift */,
- );
- path = G7SensorKit;
- sourceTree = "";
- };
- C17F50D2291EAC3800555EB5 /* G7SensorKitTests */ = {
- isa = PBXGroup;
- children = (
- C17F50D3291EAC3800555EB5 /* G7SensorKitTests.swift */,
- C109F14B291ED66F008EA5B6 /* G7GlucoseMessageTests.swift */,
- );
- path = G7SensorKitTests;
- sourceTree = "";
- };
- C17F50DE291EAC6500555EB5 /* G7CGMManager */ = {
- isa = PBXGroup;
- children = (
- C17F50DF291EAC6500555EB5 /* G7BackfillMessage.swift */,
- C17F50E7291EAC6500555EB5 /* G7BluetoothManager.swift */,
- C17F50E5291EAC6500555EB5 /* G7CGMManager.swift */,
- C17F50E6291EAC6500555EB5 /* G7CGMManagerState.swift */,
- C17F50E0291EAC6500555EB5 /* G7DeviceStatus.swift */,
- C17F50E2291EAC6500555EB5 /* G7LastReading.swift */,
- C17F50E4291EAC6500555EB5 /* G7PeripheralManager.swift */,
- C17F50E1291EAC6500555EB5 /* G7Sensor.swift */,
- );
- path = G7CGMManager;
- sourceTree = "";
- };
- C17F50F9291EAC9100555EB5 /* G7SensorKitUI */ = {
- isa = PBXGroup;
- children = (
- C19C9F4C29C9117500A6D3D0 /* Localizable.strings */,
- C1E7171E292D84B500DA646F /* Views */,
- C109F149291ECCE2008EA5B6 /* Assets.xcassets */,
- C17F5154291EBD7100555EB5 /* Extensions */,
- C17F50FF291EAC9D00555EB5 /* G7CGMManager */,
- C17F50FA291EAC9100555EB5 /* G7SensorKitUI.h */,
- C17F5126291EAF2F00555EB5 /* OSLog.swift */,
- C19C9F4D29C91C4C00A6D3D0 /* LocalizedString.swift */,
- );
- path = G7SensorKitUI;
- sourceTree = "";
- };
- C17F50FF291EAC9D00555EB5 /* G7CGMManager */ = {
- isa = PBXGroup;
- children = (
- C17F5103291EAC9D00555EB5 /* G7CGMManager+UI.swift */,
- C17F5104291EAC9D00555EB5 /* G7UICoordinator.swift */,
- );
- path = G7CGMManager;
- sourceTree = "";
- };
- C17F511E291EACCD00555EB5 /* G7SensorPlugin */ = {
- isa = PBXGroup;
- children = (
- C17F511F291EACCD00555EB5 /* G7SensorPlugin.h */,
- C17F5124291EACE400555EB5 /* G7SensorPlugin.swift */,
- C17F5158291EBE7500555EB5 /* Info.plist */,
- C1409A0A291EC258006BE8D0 /* OSLog.swift */,
- );
- path = G7SensorPlugin;
- sourceTree = "";
- };
- C17F5128291EAFA100555EB5 /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- CEC751E029D8837D006E9D24 /* LoopKitUI.framework */,
- );
- name = Frameworks;
- sourceTree = "";
- };
- C17F5136291EB07F00555EB5 /* Common */ = {
- isa = PBXGroup;
- children = (
- C17F5137291EB0A800555EB5 /* Data.swift */,
- C17F5148291EB6B600555EB5 /* LocalizedString.swift */,
- C17F513B291EB13D00555EB5 /* Locked.swift */,
- C17F514A291EB6F000555EB5 /* HKUnit.swift */,
- C17F513F291EB27D00555EB5 /* TimeInterval.swift */,
- );
- path = Common;
- sourceTree = "";
- };
- C17F5141291EB34800555EB5 /* Messages */ = {
- isa = PBXGroup;
- children = (
- C17F50E3291EAC6500555EB5 /* G7Opcode.swift */,
- C17F5146291EB57700555EB5 /* SensorMessage.swift */,
- C17F50E8291EAC6500555EB5 /* G7GlucoseMessage.swift */,
- C17F5142291EB36700555EB5 /* AuthChallengeRxMessage.swift */,
- );
- path = Messages;
- sourceTree = "";
- };
- C17F5154291EBD7100555EB5 /* Extensions */ = {
- isa = PBXGroup;
- children = (
- C17F5155291EBD8600555EB5 /* Image.swift */,
- );
- path = Extensions;
- sourceTree = "";
- };
- C1E7171E292D84B500DA646F /* Views */ = {
- isa = PBXGroup;
- children = (
- C17F5102291EAC9D00555EB5 /* G7SettingsView.swift */,
- C17F5100291EAC9D00555EB5 /* G7SettingsViewModel.swift */,
- C17F5101291EAC9D00555EB5 /* G7StartupView.swift */,
- C1E7171F292D84FE00DA646F /* G7ProgressBarState.swift */,
- );
- path = Views;
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
- C17F50C1291EAC3800555EB5 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C17F50D5291EAC3800555EB5 /* G7SensorKit.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F50F3291EAC9100555EB5 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C17F50FB291EAC9100555EB5 /* G7SensorKitUI.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F5118291EACCD00555EB5 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C17F5120291EACCD00555EB5 /* G7SensorPlugin.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
- C17F50C5291EAC3800555EB5 /* G7SensorKit */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C17F50D8291EAC3800555EB5 /* Build configuration list for PBXNativeTarget "G7SensorKit" */;
- buildPhases = (
- C17F50C1291EAC3800555EB5 /* Headers */,
- C17F50C2291EAC3800555EB5 /* Sources */,
- C17F50C3291EAC3800555EB5 /* Frameworks */,
- C17F50C4291EAC3800555EB5 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = G7SensorKit;
- productName = G7SensorKit;
- productReference = C17F50C6291EAC3800555EB5 /* G7SensorKit.framework */;
- productType = "com.apple.product-type.framework";
- };
- C17F50CD291EAC3800555EB5 /* G7SensorKitTests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C17F50DB291EAC3800555EB5 /* Build configuration list for PBXNativeTarget "G7SensorKitTests" */;
- buildPhases = (
- C17F50CA291EAC3800555EB5 /* Sources */,
- C17F50CB291EAC3800555EB5 /* Frameworks */,
- C17F50CC291EAC3800555EB5 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- C17F50D1291EAC3800555EB5 /* PBXTargetDependency */,
- );
- name = G7SensorKitTests;
- productName = G7SensorKitTests;
- productReference = C17F50CE291EAC3800555EB5 /* G7SensorKitTests.xctest */;
- productType = "com.apple.product-type.bundle.unit-test";
- };
- C17F50F7291EAC9100555EB5 /* G7SensorKitUI */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C17F50FC291EAC9100555EB5 /* Build configuration list for PBXNativeTarget "G7SensorKitUI" */;
- buildPhases = (
- C17F50F3291EAC9100555EB5 /* Headers */,
- C17F50F4291EAC9100555EB5 /* Sources */,
- C17F50F5291EAC9100555EB5 /* Frameworks */,
- C17F50F6291EAC9100555EB5 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- C17F5152291EB87600555EB5 /* PBXTargetDependency */,
- );
- name = G7SensorKitUI;
- productName = G7SensorKitUI;
- productReference = C17F50F8291EAC9100555EB5 /* G7SensorKitUI.framework */;
- productType = "com.apple.product-type.framework";
- };
- C17F511C291EACCD00555EB5 /* G7SensorPlugin */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C17F5121291EACCD00555EB5 /* Build configuration list for PBXNativeTarget "G7SensorPlugin" */;
- buildPhases = (
- C17F5118291EACCD00555EB5 /* Headers */,
- C17F5119291EACCD00555EB5 /* Sources */,
- C17F511A291EACCD00555EB5 /* Frameworks */,
- C17F511B291EACCD00555EB5 /* Resources */,
- C1409A0E291EC2F8006BE8D0 /* Embed Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- C17F512C291EAFA100555EB5 /* PBXTargetDependency */,
- C17F5130291EAFA100555EB5 /* PBXTargetDependency */,
- );
- name = G7SensorPlugin;
- productName = G7SensorPlugin;
- productReference = C17F511D291EACCD00555EB5 /* G7SensorPlugin.loopplugin */;
- productType = "com.apple.product-type.framework";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- C17F50BD291EAC3800555EB5 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- BuildIndependentTargetsInParallel = 1;
- LastSwiftUpdateCheck = 1410;
- LastUpgradeCheck = 1410;
- ORGANIZATIONNAME = "LoopKit Authors";
- TargetAttributes = {
- C17F50C5291EAC3800555EB5 = {
- CreatedOnToolsVersion = 14.1;
- };
- C17F50CD291EAC3800555EB5 = {
- CreatedOnToolsVersion = 14.1;
- };
- C17F50F7291EAC9100555EB5 = {
- CreatedOnToolsVersion = 14.1;
- };
- C17F511C291EACCD00555EB5 = {
- CreatedOnToolsVersion = 14.1;
- LastSwiftMigration = 1410;
- };
- };
- };
- buildConfigurationList = C17F50C0291EAC3800555EB5 /* Build configuration list for PBXProject "G7SensorKit" */;
- compatibilityVersion = "Xcode 14.0";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- es,
- nb,
- it,
- fr,
- nl,
- de,
- ar,
- "zh-Hans",
- da,
- fi,
- he,
- ja,
- pl,
- "pt-BR",
- ro,
- ru,
- sv,
- tr,
- vi,
- sk,
- hi,
- cs,
- uk,
- "pt-PT",
- ca,
- hu,
- );
- mainGroup = C17F50BC291EAC3800555EB5;
- productRefGroup = C17F50C7291EAC3800555EB5 /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- C17F50C5291EAC3800555EB5 /* G7SensorKit */,
- C17F50CD291EAC3800555EB5 /* G7SensorKitTests */,
- C17F50F7291EAC9100555EB5 /* G7SensorKitUI */,
- C17F511C291EACCD00555EB5 /* G7SensorPlugin */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- C17F50C4291EAC3800555EB5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C19C9F4529C9115B00A6D3D0 /* Localizable.strings in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F50CC291EAC3800555EB5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F50F6291EAC9100555EB5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C109F14A291ECCE2008EA5B6 /* Assets.xcassets in Resources */,
- C19C9F4A29C9117500A6D3D0 /* Localizable.strings in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F511B291EACCD00555EB5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- C17F50C2291EAC3800555EB5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C17F50EF291EAC6500555EB5 /* G7CGMManager.swift in Sources */,
- C17F5147291EB57700555EB5 /* SensorMessage.swift in Sources */,
- C17F50E9291EAC6500555EB5 /* G7BackfillMessage.swift in Sources */,
- C17F50ED291EAC6500555EB5 /* G7Opcode.swift in Sources */,
- C17F5140291EB27D00555EB5 /* TimeInterval.swift in Sources */,
- C17F50F0291EAC6500555EB5 /* G7CGMManagerState.swift in Sources */,
- C17F5145291EB45900555EB5 /* CBPeripheral.swift in Sources */,
- C17F513A291EB0D900555EB5 /* GlucoseLimits.swift in Sources */,
- C17F5143291EB36700555EB5 /* AuthChallengeRxMessage.swift in Sources */,
- C17F50EA291EAC6500555EB5 /* G7DeviceStatus.swift in Sources */,
- C1409A09291EC22F006BE8D0 /* OSLog.swift in Sources */,
- C17F5135291EB06A00555EB5 /* AlgorithmState.swift in Sources */,
- C17F50F1291EAC6500555EB5 /* G7BluetoothManager.swift in Sources */,
- C17F5138291EB0A800555EB5 /* Data.swift in Sources */,
- C17F514B291EB6F000555EB5 /* HKUnit.swift in Sources */,
- C17F50EC291EAC6500555EB5 /* G7LastReading.swift in Sources */,
- C17F513C291EB13D00555EB5 /* Locked.swift in Sources */,
- C17F513E291EB1A500555EB5 /* BluetoothServices.swift in Sources */,
- C17F5149291EB6B600555EB5 /* LocalizedString.swift in Sources */,
- C17F514D291EB79E00555EB5 /* AlgorithmError.swift in Sources */,
- C17F50EB291EAC6500555EB5 /* G7Sensor.swift in Sources */,
- C17F50F2291EAC6500555EB5 /* G7GlucoseMessage.swift in Sources */,
- C17F50EE291EAC6500555EB5 /* G7PeripheralManager.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F50CA291EAC3800555EB5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C109F14C291ED66F008EA5B6 /* G7GlucoseMessageTests.swift in Sources */,
- C17F50D4291EAC3800555EB5 /* G7SensorKitTests.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F50F4291EAC9100555EB5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C17F5108291EAC9D00555EB5 /* G7SettingsView.swift in Sources */,
- C17F5157291EBD9900555EB5 /* TimeInterval.swift in Sources */,
- C19C9F4E29C91C4C00A6D3D0 /* LocalizedString.swift in Sources */,
- C17F5156291EBD8600555EB5 /* Image.swift in Sources */,
- C139829829295D7D0047DB5F /* HKUnit.swift in Sources */,
- C1409A07291EC21C006BE8D0 /* OSLog.swift in Sources */,
- C17F510A291EAC9D00555EB5 /* G7UICoordinator.swift in Sources */,
- C17F5109291EAC9D00555EB5 /* G7CGMManager+UI.swift in Sources */,
- C17F5107291EAC9D00555EB5 /* G7StartupView.swift in Sources */,
- C1E71720292D84FE00DA646F /* G7ProgressBarState.swift in Sources */,
- C17F5106291EAC9D00555EB5 /* G7SettingsViewModel.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C17F5119291EACCD00555EB5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C1409A0B291EC258006BE8D0 /* OSLog.swift in Sources */,
- C17F5125291EACE400555EB5 /* G7SensorPlugin.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- C17F50D1291EAC3800555EB5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C17F50C5291EAC3800555EB5 /* G7SensorKit */;
- targetProxy = C17F50D0291EAC3800555EB5 /* PBXContainerItemProxy */;
- };
- C17F512C291EAFA100555EB5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C17F50C5291EAC3800555EB5 /* G7SensorKit */;
- targetProxy = C17F512B291EAFA100555EB5 /* PBXContainerItemProxy */;
- };
- C17F5130291EAFA100555EB5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C17F50F7291EAC9100555EB5 /* G7SensorKitUI */;
- targetProxy = C17F512F291EAFA100555EB5 /* PBXContainerItemProxy */;
- };
- C17F5152291EB87600555EB5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C17F50C5291EAC3800555EB5 /* G7SensorKit */;
- targetProxy = C17F5151291EB87600555EB5 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin PBXVariantGroup section */
- C19C9F4729C9115B00A6D3D0 /* Localizable.strings */ = {
- isa = PBXVariantGroup;
- children = (
- C19C9F4629C9115B00A6D3D0 /* en */,
- C1F6C1FA29C9166000C74579 /* cs */,
- C12E6F0729C9166900E6FDBE /* da */,
- C14091FA29C9167100ADD112 /* de */,
- C125E0C029C9168100AB13C5 /* es */,
- C10A0FE529C91688006F4CD8 /* fi */,
- C1086B0E29C9169100D46E65 /* fr */,
- C110930529C9169800AD9503 /* he */,
- C10A851B29C916A200EAE6B3 /* hi */,
- C13C056529C916AA00ED3803 /* it */,
- C149257929C916B200F94598 /* ja */,
- C158585E29C916BA00EA08EA /* nb */,
- C19277AE29C916C200311AB7 /* nl */,
- C1AEF8AF29C916CA001F6F41 /* pl */,
- C1C140DE29C916D20051AFF1 /* pt-BR */,
- C1C86C0A29C916DC0060D000 /* ro */,
- C1CDA74429C916E400DDC69C /* ru */,
- C1B6638F29C916EC001556A8 /* sk */,
- C1CCD81429C916F600A1158E /* sv */,
- C1CE705E29C916FE00E70F9D /* tr */,
- C1E3B2FF29C9170800A06681 /* vi */,
- 193F1E3D2B44C18000525770 /* hu */,
- );
- name = Localizable.strings;
- sourceTree = "";
- };
- C19C9F4C29C9117500A6D3D0 /* Localizable.strings */ = {
- isa = PBXVariantGroup;
- children = (
- C14BF96629C916560055FA98 /* ar */,
- C1F6C1FB29C9166000C74579 /* cs */,
- C12E6F0829C9166900E6FDBE /* da */,
- C14091FB29C9167100ADD112 /* de */,
- C125E0C129C9168100AB13C5 /* es */,
- C10A0FE629C91688006F4CD8 /* fi */,
- C1086B0F29C9169100D46E65 /* fr */,
- C110930629C9169800AD9503 /* he */,
- C10A851C29C916A200EAE6B3 /* hi */,
- C13C056629C916AA00ED3803 /* it */,
- C149257A29C916B200F94598 /* ja */,
- C158585F29C916BA00EA08EA /* nb */,
- C19277AF29C916C200311AB7 /* nl */,
- C1AEF8B029C916CA001F6F41 /* pl */,
- C1C140DF29C916D20051AFF1 /* pt-BR */,
- C1C86C0B29C916DC0060D000 /* ro */,
- C1CDA74529C916E400DDC69C /* ru */,
- C1B6639029C916EC001556A8 /* sk */,
- C1CCD81529C916F600A1158E /* sv */,
- C1CE705F29C916FE00E70F9D /* tr */,
- C1E3B30029C9170800A06681 /* vi */,
- C1E9A8EB29C9170F00478AA9 /* zh-Hans */,
- C19C9F4F29C91ED400A6D3D0 /* en */,
- 193F1E3E2B44C18100525770 /* hu */,
- );
- name = Localizable.strings;
- sourceTree = "";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- C17F50D6291EAC3800555EB5 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 1;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 15.1;
- LOCALIZED_STRING_MACRO_NAMES = (
- NSLocalizedString,
- CFCopyLocalizedString,
- LocalizedString,
- );
- MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
- MTL_FAST_MATH = YES;
- ONLY_ACTIVE_ARCH = YES;
- SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- VERSIONING_SYSTEM = "apple-generic";
- VERSION_INFO_PREFIX = "";
- };
- name = Debug;
- };
- C17F50D7291EAC3800555EB5 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- CURRENT_PROJECT_VERSION = 1;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 15.1;
- LOCALIZED_STRING_MACRO_NAMES = (
- NSLocalizedString,
- CFCopyLocalizedString,
- LocalizedString,
- );
- MTL_ENABLE_DEBUG_INFO = NO;
- MTL_FAST_MATH = YES;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- VERSIONING_SYSTEM = "apple-generic";
- VERSION_INFO_PREFIX = "";
- };
- name = Release;
- };
- C17F50D9291EAC3800555EB5 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = (
- "@executable_path/../Frameworks",
- "@loader_path/Frameworks",
- );
- MACOSX_DEPLOYMENT_TARGET = 12.6;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorKit;
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SDKROOT = auto;
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- };
- name = Debug;
- };
- C17F50DA291EAC3800555EB5 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = (
- "@executable_path/../Frameworks",
- "@loader_path/Frameworks",
- );
- MACOSX_DEPLOYMENT_TARGET = 12.6;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorKit;
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SDKROOT = auto;
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- };
- name = Release;
- };
- C17F50DC291EAC3800555EB5 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = "";
- GENERATE_INFOPLIST_FILE = YES;
- MACOSX_DEPLOYMENT_TARGET = 12.6;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorKitTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SDKROOT = auto;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- };
- name = Debug;
- };
- C17F50DD291EAC3800555EB5 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = "";
- GENERATE_INFOPLIST_FILE = YES;
- MACOSX_DEPLOYMENT_TARGET = 12.6;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorKitTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SDKROOT = auto;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- };
- name = Release;
- };
- C17F50FD291EAC9100555EB5 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorKitUI;
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SDKROOT = iphoneos;
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- };
- name = Debug;
- };
- C17F50FE291EAC9100555EB5 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = YES;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorKitUI;
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SDKROOT = iphoneos;
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- C17F5122291EACCD00555EB5 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = NO;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_FILE = G7SensorPlugin/Info.plist;
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_DYLIB_INSTALL_NAME = "";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorPlugin;
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SDKROOT = iphoneos;
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- WRAPPER_EXTENSION = loopplugin;
- };
- name = Debug;
- };
- C17F5123291EACCD00555EB5 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEFINES_MODULE = NO;
- DEVELOPMENT_TEAM = "";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- DYLIB_INSTALL_NAME_BASE = "@rpath";
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_FILE = G7SensorPlugin/Info.plist;
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
- LD_DYLIB_INSTALL_NAME = "";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- "@loader_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = org.loopkit.G7SensorPlugin;
- PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
- SDKROOT = iphoneos;
- SKIP_INSTALL = YES;
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- VALIDATE_PRODUCT = YES;
- WRAPPER_EXTENSION = loopplugin;
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- C17F50C0291EAC3800555EB5 /* Build configuration list for PBXProject "G7SensorKit" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C17F50D6291EAC3800555EB5 /* Debug */,
- C17F50D7291EAC3800555EB5 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C17F50D8291EAC3800555EB5 /* Build configuration list for PBXNativeTarget "G7SensorKit" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C17F50D9291EAC3800555EB5 /* Debug */,
- C17F50DA291EAC3800555EB5 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C17F50DB291EAC3800555EB5 /* Build configuration list for PBXNativeTarget "G7SensorKitTests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C17F50DC291EAC3800555EB5 /* Debug */,
- C17F50DD291EAC3800555EB5 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C17F50FC291EAC9100555EB5 /* Build configuration list for PBXNativeTarget "G7SensorKitUI" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C17F50FD291EAC9100555EB5 /* Debug */,
- C17F50FE291EAC9100555EB5 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C17F5121291EACCD00555EB5 /* Build configuration list for PBXNativeTarget "G7SensorPlugin" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C17F5122291EACCD00555EB5 /* Debug */,
- C17F5123291EACCD00555EB5 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = C17F50BD291EAC3800555EB5 /* Project object */;
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 919434a62..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/AlgorithmError.swift b/Dependencies/G7SensorKit/G7SensorKit/AlgorithmError.swift
deleted file mode 100644
index e46f2beaf..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/AlgorithmError.swift
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// AlgorithmError.swift
-// G7SensorKit
-//
-// Created by Pete Schwamb on 11/11/22.
-//
-
-import Foundation
-
-enum AlgorithmError: Error {
- case unreliableState(AlgorithmState)
-}
-
-extension AlgorithmError: LocalizedError {
- var errorDescription: String? {
- switch self {
- case .unreliableState:
- return LocalizedString("Glucose data is unavailable", comment: "Error description for unreliable state")
- }
- }
-
- var failureReason: String? {
- switch self {
- case .unreliableState(let state):
- return state.localizedDescription
- }
- }
-}
-
-
-extension AlgorithmState {
- public var localizedDescription: String {
- switch self {
- case .known(let state):
- switch state {
- case .ok:
- return LocalizedString("Sensor is OK", comment: "The description of sensor algorithm state when sensor is ok.")
- case .stopped:
- return LocalizedString("Sensor is stopped", comment: "The description of sensor algorithm state when sensor is stopped.")
- case .warmup, .questionMarks:
- return LocalizedString("Sensor is warming up", comment: "The description of sensor algorithm state when sensor is warming up.")
- case .expired:
- return LocalizedString("Sensor expired", comment: "The description of sensor algorithm state when sensor is expired.")
- case .sensorFailed:
- return LocalizedString("Sensor failed", comment: "The description of sensor algorithm state when sensor failed.")
- }
- case .unknown(let rawValue):
- return String(format: LocalizedString("Sensor is in unknown state %1$d", comment: "The description of sensor algorithm state when raw value is unknown. (1: missing data details)"), rawValue)
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/AlgorithmState.swift b/Dependencies/G7SensorKit/G7SensorKit/AlgorithmState.swift
deleted file mode 100644
index 93e5c404b..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/AlgorithmState.swift
+++ /dev/null
@@ -1,125 +0,0 @@
-//
-// CalibrationState.swift
-// xDripG5
-//
-// Created by Nate Racklyeft on 8/6/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-
-public enum AlgorithmState: RawRepresentable {
- public typealias RawValue = UInt8
-
- public enum State: RawValue {
- case stopped = 1
- case warmup = 2
- case ok = 6
- case questionMarks = 18
- case expired = 24
- case sensorFailed = 25
- }
-
- case known(State)
- case unknown(RawValue)
-
- public init(rawValue: RawValue) {
- guard let state = State(rawValue: rawValue) else {
- self = .unknown(rawValue)
- return
- }
-
- self = .known(state)
- }
-
- public var rawValue: RawValue {
- switch self {
- case .known(let state):
- return state.rawValue
- case .unknown(let rawValue):
- return rawValue
- }
- }
-
- public var sensorFailed: Bool {
- guard case .known(let state) = self else {
- return false
- }
-
- switch state {
- case .sensorFailed:
- return true
- default:
- return false
- }
- }
-
- public var isInWarmup: Bool {
- guard case .known(let state) = self else {
- return false
- }
-
- switch state {
- case .warmup:
- return true
- default:
- return false
- }
- }
-
- public var isInSensorError: Bool {
- guard case .known(let state) = self else {
- return false
- }
-
- switch state {
- case .questionMarks:
- return true
- default:
- return false
- }
- }
-
-
- public var hasReliableGlucose: Bool {
- guard case .known(let state) = self else {
- return false
- }
-
- switch state {
- case .stopped,
- .warmup,
- .questionMarks,
- .expired,
- .sensorFailed:
- return false
- case .ok:
- return true
- }
- }
-}
-
-extension AlgorithmState: Equatable {
- public static func ==(lhs: AlgorithmState, rhs: AlgorithmState) -> Bool {
- switch (lhs, rhs) {
- case (.known(let lhs), .known(let rhs)):
- return lhs == rhs
- case (.unknown(let lhs), .unknown(let rhs)):
- return lhs == rhs
- default:
- return false
- }
- }
-}
-
-extension AlgorithmState: CustomStringConvertible {
- public var description: String {
- switch self {
- case .known(let state):
- return String(describing: state)
- case .unknown(let value):
- return ".unknown(\(value))"
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/BluetoothServices.swift b/Dependencies/G7SensorKit/G7SensorKit/BluetoothServices.swift
deleted file mode 100644
index cf35cb79e..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/BluetoothServices.swift
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-// BluetoothServices.swift
-// xDripG5
-//
-// Created by Nathan Racklyeft on 10/16/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import CoreBluetooth
-
-protocol CBUUIDRawValue: RawRepresentable {}
-extension CBUUIDRawValue where RawValue == String {
- var cbUUID: CBUUID {
- return CBUUID(string: rawValue)
- }
-}
-
-
-enum SensorServiceUUID: String, CBUUIDRawValue {
- case deviceInfo = "180A"
- case advertisement = "FEBC"
- case cgmService = "F8083532-849E-531C-C594-30F1F86A4EA5"
-
- case serviceB = "F8084532-849E-531C-C594-30F1F86A4EA5"
-}
-
-
-enum DeviceInfoCharacteristicUUID: String, CBUUIDRawValue {
- // Read
- // "DexcomUN"
- case manufacturerNameString = "2A29"
-}
-
-
-enum CGMServiceCharacteristicUUID: String, CBUUIDRawValue {
-
- // Read/Notify
- case communication = "F8083533-849E-531C-C594-30F1F86A4EA5"
-
- // Write/Indicate
- case control = "F8083534-849E-531C-C594-30F1F86A4EA5"
-
- // Write/Indicate
- case authentication = "F8083535-849E-531C-C594-30F1F86A4EA5"
-
- // Read/Write/Notify
- case backfill = "F8083536-849E-531C-C594-30F1F86A4EA5"
-}
-
-
-enum ServiceBCharacteristicUUID: String, CBUUIDRawValue {
- // Write/Indicate
- case characteristicE = "F8084533-849E-531C-C594-30F1F86A4EA5"
- // Read/Write/Notify
- case characteristicF = "F8084534-849E-531C-C594-30F1F86A4EA5"
-}
-
-
-extension G7PeripheralManager.Configuration {
- static var dexcomG7: G7PeripheralManager.Configuration {
- return G7PeripheralManager.Configuration(
- serviceCharacteristics: [
- SensorServiceUUID.cgmService.cbUUID: [
- //CGMServiceCharacteristicUUID.communication.cbUUID, // Unused for now
- CGMServiceCharacteristicUUID.authentication.cbUUID,
- CGMServiceCharacteristicUUID.control.cbUUID,
- CGMServiceCharacteristicUUID.backfill.cbUUID,
- ]
- ],
- notifyingCharacteristics: [:],
- valueUpdateMacros: [:]
- )
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/CBPeripheral.swift b/Dependencies/G7SensorKit/G7SensorKit/CBPeripheral.swift
deleted file mode 100644
index f64494c4a..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/CBPeripheral.swift
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// CBPeripheral.swift
-// xDripG5
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import CoreBluetooth
-
-
-// MARK: - Discovery helpers.
-extension CBPeripheral {
- func servicesToDiscover(from serviceUUIDs: [CBUUID]) -> [CBUUID] {
- let knownServiceUUIDs = services?.compactMap({ $0.uuid }) ?? []
- return serviceUUIDs.filter({ !knownServiceUUIDs.contains($0) })
- }
-
- func characteristicsToDiscover(from characteristicUUIDs: [CBUUID], for service: CBService) -> [CBUUID] {
- let knownCharacteristicUUIDs = service.characteristics?.compactMap({ $0.uuid }) ?? []
- return characteristicUUIDs.filter({ !knownCharacteristicUUIDs.contains($0) })
- }
-}
-
-
-extension Collection where Element: CBAttribute {
- func itemWithUUID(_ uuid: CBUUID) -> Element? {
- for attribute in self {
- if attribute.uuid == uuid {
- return attribute
- }
- }
-
- return nil
- }
-
- func itemWithUUIDString(_ uuidString: String) -> Element? {
- for attribute in self {
- if attribute.uuid.uuidString == uuidString {
- return attribute
- }
- }
-
- return nil
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7BackfillMessage.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7BackfillMessage.swift
deleted file mode 100644
index 2658cb4dc..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7BackfillMessage.swift
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// G7BackfillMessage.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 9/25/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import LoopKit
-
-public struct G7BackfillMessage: Equatable {
-
- public let timestamp: UInt32 // Seconds since pairing
- public let glucose: UInt16?
- public let glucoseIsDisplayOnly: Bool
- public let algorithmState: AlgorithmState
- public let trend: Double?
-
- public let data: Data
-
- public var hasReliableGlucose: Bool {
- return algorithmState.hasReliableGlucose
- }
-
- init?(data: Data) {
- // 0 1 2 3 4 5 6 7 8
- // TTTTTT BGBG SS TR
- // 45a100 00 9600 06 0f fc
-
- guard data.count == 9 else {
- return nil
- }
-
- timestamp = data[0..<4].toInt()
-
- let glucoseBytes = data[4..<6].to(UInt16.self)
-
- if glucoseBytes != 0xffff {
- glucose = glucoseBytes & 0xfff
- glucoseIsDisplayOnly = (glucoseBytes & 0xf000) > 0
- } else {
- glucose = nil
- glucoseIsDisplayOnly = false
- }
-
- algorithmState = AlgorithmState(rawValue: data[6])
-
- if data[8] == 0x7f {
- trend = nil
- } else {
- trend = Double(Int8(bitPattern: data[8])) / 10
- }
-
- self.data = data
- }
-
- public var trendType: LoopKit.GlucoseTrend? {
- guard let trend = trend else {
- return nil
- }
-
- switch trend {
- case let x where x <= -3.0:
- return .downDownDown
- case let x where x <= -2.0:
- return .downDown
- case let x where x <= -1.0:
- return .down
- case let x where x < 1.0:
- return .flat
- case let x where x < 2.0:
- return .up
- case let x where x < 3.0:
- return .upUp
- default:
- return .upUpUp
- }
- }
-
- public var condition: GlucoseCondition? {
- guard let glucose = glucose else {
- return nil
- }
-
- if glucose < GlucoseLimits.minimum {
- return .belowRange
- } else if glucose > GlucoseLimits.maximum {
- return .aboveRange
- } else {
- return nil
- }
- }
-}
-
-extension G7BackfillMessage: CustomDebugStringConvertible {
- public var debugDescription: String {
- return "G7BackfillMessage(glucose:\(String(describing: glucose)), glucoseIsDisplayOnly:\(glucoseIsDisplayOnly) timestamp:\(timestamp), data:\(data.hexadecimalString))"
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7BluetoothManager.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7BluetoothManager.swift
deleted file mode 100644
index 62ab5fc8b..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7BluetoothManager.swift
+++ /dev/null
@@ -1,433 +0,0 @@
-//
-// G7BluetoothManager.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 11/11/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import os.log
-
-
-enum PeripheralConnectionCommand {
- case connect
- case makeActive
- case ignore
-}
-
-protocol G7BluetoothManagerDelegate: AnyObject {
-
- /**
- Tells the delegate that the bluetooth manager has finished connecting to and discovering all required services of its peripheral
-
- - parameter manager: The bluetooth manager
- - parameter peripheralManager: The peripheral manager
- - parameter error: An error describing why bluetooth setup failed
-
- - returns: True if scanning should stop
- */
- func bluetoothManager(_ manager: G7BluetoothManager, readied peripheralManager: G7PeripheralManager) -> Bool
-
- /**
- Tells the delegate that the bluetooth manager encountered an error while connecting to and discovering required services of a peripheral
-
- - parameter manager: The bluetooth manager
- - parameter peripheralManager: The peripheral manager
- - parameter error: An error describing why bluetooth setup failed
- */
- func bluetoothManager(_ manager: G7BluetoothManager, readyingFailed peripheralManager: G7PeripheralManager, with error: Error)
-
- /**
- Asks the delegate if the discovered or restored peripheral is active or should be connected to
-
- - parameter manager: The bluetooth manager
- - parameter peripheral: The found peripheral
-
- - returns: PeripheralConnectionCommand indicating what should be done with this peripheral
- */
- func bluetoothManager(_ manager: G7BluetoothManager, shouldConnectPeripheral peripheral: CBPeripheral) -> PeripheralConnectionCommand
-
- /// Informs the delegate that the bluetooth manager received new data in the control characteristic
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- /// - peripheralManager: The peripheral manager
- /// - response: The data received on the control characteristic
- func bluetoothManager(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, didReceiveControlResponse response: Data)
-
- /// Informs the delegate that the bluetooth manager received new data in the backfill characteristic
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- /// - response: The data received on the backfill characteristic
- func bluetoothManager(_ manager: G7BluetoothManager, didReceiveBackfillResponse response: Data)
-
- /// Informs the delegate that the bluetooth manager received new data in the authentication characteristic
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- /// - peripheralManager: The peripheral manager
- /// - response: The data received on the authentication characteristic
- func bluetoothManager(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, didReceiveAuthenticationResponse response: Data)
-
- /// Informs the delegate that the bluetooth manager started or stopped scanning
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- func bluetoothManagerScanningStatusDidChange(_ manager: G7BluetoothManager)
-
- /// Informs the delegate that a peripheral disconnected
- ///
- /// - Parameters:
- /// - manager: The bluetooth manager
- func peripheralDidDisconnect(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, wasRemoteDisconnect: Bool)
-}
-
-
-class G7BluetoothManager: NSObject {
-
- weak var delegate: G7BluetoothManagerDelegate?
-
- private let log = OSLog(category: "G7BluetoothManager")
-
- /// Isolated to `managerQueue`
- private var centralManager: CBCentralManager! = nil
-
- /// Isolated to `managerQueue`
- private var activePeripheral: CBPeripheral? {
- get {
- return activePeripheralManager?.peripheral
- }
- }
-
- /// Isolated to `managerQueue`
- private var managedPeripherals: [UUID:G7PeripheralManager] = [:]
-
- var activePeripheralIdentifier: UUID? {
- get {
- return lockedPeripheralIdentifier.value
- }
- }
- private let lockedPeripheralIdentifier: Locked = Locked(nil)
-
- /// Isolated to `managerQueue`
- private var activePeripheralManager: G7PeripheralManager? {
- didSet {
- oldValue?.delegate = nil
- lockedPeripheralIdentifier.value = activePeripheralManager?.peripheral.identifier
- }
- }
-
- // MARK: - Synchronization
-
- private let managerQueue = DispatchQueue(label: "com.loudnate.CGMBLEKit.bluetoothManagerQueue", qos: .unspecified)
-
- override init() {
- super.init()
-
- managerQueue.sync {
- self.centralManager = CBCentralManager(delegate: self, queue: managerQueue, options: [CBCentralManagerOptionRestoreIdentifierKey: "com.loudnate.CGMBLEKit"])
- }
- }
-
- // MARK: - Actions
-
- func scanForPeripheral() {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
-
- managerQueue.sync {
- self.managerQueue_scanForPeripheral()
- }
- }
-
- func forgetPeripheral() {
- managerQueue.sync {
- self.activePeripheralManager = nil
- }
- }
-
- func stopScanning() {
- managerQueue.sync {
- managerQueue_stopScanning()
- }
- }
-
- private func managerQueue_stopScanning() {
- if centralManager.isScanning {
- log.debug("Stopping scan")
- centralManager.stopScan()
- delegate?.bluetoothManagerScanningStatusDidChange(self)
- }
- }
-
- func disconnect() {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
-
- managerQueue.sync {
- if centralManager.isScanning {
- log.debug("Stopping scan on disconnect")
- centralManager.stopScan()
- delegate?.bluetoothManagerScanningStatusDidChange(self)
- }
-
- if let peripheral = activePeripheral {
- centralManager.cancelPeripheralConnection(peripheral)
- }
- }
- }
-
- private func managerQueue_scanForPeripheral() {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- guard centralManager.state == .poweredOn else {
- return
- }
-
- let currentState = activePeripheral?.state ?? .disconnected
- guard currentState != .connected else {
- return
- }
-
- if let peripheralID = activePeripheralIdentifier, let peripheral = centralManager.retrievePeripherals(withIdentifiers: [peripheralID]).first {
- log.debug("Retrieved peripheral %{public}@", peripheral.identifier.uuidString)
- handleDiscoveredPeripheral(peripheral)
- } else {
- for peripheral in centralManager.retrieveConnectedPeripherals(withServices: [
- SensorServiceUUID.advertisement.cbUUID,
- SensorServiceUUID.cgmService.cbUUID
- ]) {
- handleDiscoveredPeripheral(peripheral)
- }
- }
-
- if activePeripheral == nil {
- log.debug("Scanning for peripherals")
- centralManager.scanForPeripherals(withServices: [
- SensorServiceUUID.advertisement.cbUUID
- ],
- options: nil
- )
- delegate?.bluetoothManagerScanningStatusDidChange(self)
- }
- }
-
- /**
-
- Persistent connections don't seem to work with the transmitter shutoff: The OS won't re-wake the
- app unless it's scanning.
-
- The sleep gives the transmitter time to shut down, but keeps the app running.
-
- */
- fileprivate func scanAfterDelay() {
- DispatchQueue.global(qos: .utility).async {
- Thread.sleep(forTimeInterval: 2)
-
- self.scanForPeripheral()
- }
- }
-
- // MARK: - Accessors
-
- var isScanning: Bool {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
-
- var isScanning = false
- managerQueue.sync {
- isScanning = centralManager.isScanning
- }
- return isScanning
- }
-
- var isConnected: Bool {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
-
- var isConnected = false
- managerQueue.sync {
- isConnected = activePeripheral?.state == .connected
- }
- return isConnected
- }
-
- private func handleDiscoveredPeripheral(_ peripheral: CBPeripheral) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- if let delegate = delegate {
- switch delegate.bluetoothManager(self, shouldConnectPeripheral: peripheral) {
- case .makeActive:
- log.debug("Making peripheral active: %{public}@", peripheral.identifier.uuidString)
-
- if let peripheralManager = activePeripheralManager {
- peripheralManager.peripheral = peripheral
- } else {
- activePeripheralManager = G7PeripheralManager(
- peripheral: peripheral,
- configuration: .dexcomG7,
- centralManager: centralManager
- )
- activePeripheralManager?.delegate = self
- }
- self.managedPeripherals[peripheral.identifier] = activePeripheralManager
- self.centralManager.connect(peripheral)
-
- case .connect:
- log.debug("Connecting to peripheral: %{public}@", peripheral.identifier.uuidString)
- self.centralManager.connect(peripheral)
- let peripheralManager = G7PeripheralManager(
- peripheral: peripheral,
- configuration: .dexcomG7,
- centralManager: centralManager
- )
- peripheralManager.delegate = self
- self.managedPeripherals[peripheral.identifier] = peripheralManager
- case .ignore:
- break
- }
- }
- }
-
- override var debugDescription: String {
- return [
- "## BluetoothManager",
- activePeripheralManager.map(String.init(reflecting:)) ?? "No peripheral",
- ].joined(separator: "\n")
- }
-}
-
-
-extension G7BluetoothManager: CBCentralManagerDelegate {
- func centralManagerDidUpdateState(_ central: CBCentralManager) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- activePeripheralManager?.centralManagerDidUpdateState(central)
- log.default("%{public}@: %{public}@", #function, String(describing: central.state.rawValue))
-
- switch central.state {
- case .poweredOn:
- managerQueue_scanForPeripheral()
- case .resetting, .poweredOff, .unauthorized, .unknown, .unsupported:
- fallthrough
- @unknown default:
- if central.isScanning {
- log.debug("Stopping scan on central not powered on")
- central.stopScan()
- delegate?.bluetoothManagerScanningStatusDidChange(self)
- }
- }
- }
-
- func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- if let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey] as? [CBPeripheral] {
- for peripheral in peripherals {
- log.default("Restoring peripheral from state: %{public}@", peripheral.identifier.uuidString)
- handleDiscoveredPeripheral(peripheral)
- }
- }
- }
-
- func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- log.info("%{public}@: %{public}@, data = %{public}@", #function, peripheral, String(describing: advertisementData))
-
- managerQueue.async {
- self.handleDiscoveredPeripheral(peripheral)
- }
- }
-
- func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- log.default("%{public}@: %{public}@", #function, peripheral)
-
- if let peripheralManager = managedPeripherals[peripheral.identifier] {
- peripheralManager.centralManager(central, didConnect: peripheral)
-
- if let delegate = delegate, case .poweredOn = centralManager.state, case .connected = peripheral.state {
- if delegate.bluetoothManager(self, readied: peripheralManager) {
- managerQueue_stopScanning()
- }
- }
- }
- }
-
- func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- log.default("%{public}@: %{public}@", #function, peripheral)
- // Ignore errors indicating the peripheral disconnected remotely, as that's expected behavior
- if let error = error as NSError?, CBError(_nsError: error).code != .peripheralDisconnected {
- log.error("%{public}@: %{public}@", #function, error)
- if let peripheralManager = activePeripheralManager {
- self.delegate?.bluetoothManager(self, readyingFailed: peripheralManager, with: error)
- }
- }
-
- if let peripheralManager = managedPeripherals[peripheral.identifier] {
- let remoteDisconnect: Bool
- if let error = error as NSError?, CBError(_nsError: error).code == .peripheralDisconnected {
- remoteDisconnect = true
- } else {
- remoteDisconnect = false
- }
- self.delegate?.peripheralDidDisconnect(self, peripheralManager: peripheralManager, wasRemoteDisconnect: remoteDisconnect)
- }
-
- if peripheral != activePeripheral {
- managedPeripherals.removeValue(forKey: peripheral.identifier)
- }
-
- scanAfterDelay()
- }
-
- func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- log.error("%{public}@: %{public}@", #function, String(describing: error))
- if let error = error, let peripheralManager = activePeripheralManager {
- self.delegate?.bluetoothManager(self, readyingFailed: peripheralManager, with: error)
- }
-
- if peripheral != activePeripheral {
- managedPeripherals.removeValue(forKey: peripheral.identifier)
- }
-
- scanAfterDelay()
- }
-}
-
-
-extension G7BluetoothManager: G7PeripheralManagerDelegate {
- func peripheralManager(_ manager: G7PeripheralManager, didReadRSSI RSSI: NSNumber, error: Error?) {
-
- }
-
- func peripheralManagerDidUpdateName(_ manager: G7PeripheralManager) {
- }
-
- func peripheralManagerDidConnect(_ manager: G7PeripheralManager) {
- }
-
- func completeConfiguration(for manager: G7PeripheralManager) throws {
- }
-
- func peripheralManager(_ manager: G7PeripheralManager, didUpdateValueFor characteristic: CBCharacteristic) {
- guard let value = characteristic.value else {
- return
- }
-
- switch CGMServiceCharacteristicUUID(rawValue: characteristic.uuid.uuidString.uppercased()) {
- case .none, .communication?:
- return
- case .control?:
- self.delegate?.bluetoothManager(self, peripheralManager: manager, didReceiveControlResponse: value)
- case .backfill?:
- self.delegate?.bluetoothManager(self, didReceiveBackfillResponse: value)
- case .authentication?:
- self.delegate?.bluetoothManager(self, peripheralManager: manager, didReceiveAuthenticationResponse: value)
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7CGMManager.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7CGMManager.swift
deleted file mode 100644
index 267438b8f..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7CGMManager.swift
+++ /dev/null
@@ -1,470 +0,0 @@
-//
-// G7CGMManager.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import LoopKit
-import os.log
-import HealthKit
-
-
-
-public protocol G7StateObserver: AnyObject {
- func g7StateDidUpdate(_ state: G7CGMManagerState?)
- func g7ConnectionStatusDidChange()
-}
-
-public class G7CGMManager: CGMManager {
- private let log = OSLog(category: "G7CGMManager")
-
- public var state: G7CGMManagerState {
- return lockedState.value
- }
-
- private func setState(_ changes: (_ state: inout G7CGMManagerState) -> Void) -> Void {
- return setStateWithResult(changes)
- }
-
- @discardableResult
- private func mutateState(_ changes: (_ state: inout G7CGMManagerState) -> Void) -> G7CGMManagerState {
- return setStateWithResult({ (state) -> G7CGMManagerState in
- changes(&state)
- return state
- })
- }
-
- private func setStateWithResult(_ changes: (_ state: inout G7CGMManagerState) -> ReturnType) -> ReturnType {
- var oldValue: G7CGMManagerState!
- var returnType: ReturnType!
- let newValue = lockedState.mutate { (state) in
- oldValue = state
- returnType = changes(&state)
- }
-
- if oldValue != newValue {
- delegate.notify { delegate in
- delegate?.cgmManagerDidUpdateState(self)
- delegate?.cgmManager(self, didUpdate: self.cgmManagerStatus)
- }
-
- g7StateObservers.forEach { (observer) in
- observer.g7StateDidUpdate(newValue)
- }
- }
-
- return returnType
- }
- private let lockedState: Locked
-
- private let g7StateObservers = WeakSynchronizedSet()
-
- public weak var cgmManagerDelegate: CGMManagerDelegate? {
- get {
- return delegate.delegate
- }
- set {
- delegate.delegate = newValue
- }
- }
-
- public var delegateQueue: DispatchQueue! {
- get {
- return delegate.queue
- }
- set {
- delegate.queue = newValue
- }
- }
-
- private let delegate = WeakSynchronizedDelegate()
-
- public var providesBLEHeartbeat: Bool = true
-
- public var managedDataInterval: TimeInterval? {
- return .hours(3)
- }
-
- public var shouldSyncToRemoteService: Bool {
- return state.uploadReadings
- }
-
- public var glucoseDisplay: GlucoseDisplayable? {
- return latestReading
- }
-
- public var isScanning: Bool {
- return sensor.isScanning
- }
-
- public var isConnected: Bool {
- return sensor.isConnected
- }
-
- public var sensorName: String? {
- return state.sensorID
- }
-
- public var sensorActivatedAt: Date? {
- return state.activatedAt
- }
-
- public var sensorExpiresAt: Date? {
- guard let activatedAt = sensorActivatedAt else {
- return nil
- }
- return activatedAt.addingTimeInterval(G7Sensor.lifetime)
- }
-
- public var sensorEndsAt: Date? {
- guard let activatedAt = sensorActivatedAt else {
- return nil
- }
- return activatedAt.addingTimeInterval(G7Sensor.lifetime + G7Sensor.gracePeriod)
- }
-
-
- public var sensorFinishesWarmupAt: Date? {
- guard let activatedAt = sensorActivatedAt else {
- return nil
- }
- return activatedAt.addingTimeInterval(G7Sensor.warmupDuration)
- }
-
- public var latestReading: G7GlucoseMessage? {
- return state.latestReading
- }
-
- public var lastConnect: Date? {
- return state.latestConnect
- }
-
- public var latestReadingTimestamp: Date? {
- return state.latestReadingTimestamp
- }
-
- public var uploadReadings: Bool {
- get {
- return state.uploadReadings
- }
- set {
- mutateState { state in
- state.uploadReadings = newValue
- }
- }
- }
-
- public let sensor: G7Sensor
-
- public var cgmManagerStatus: LoopKit.CGMManagerStatus {
- return CGMManagerStatus(hasValidSensorSession: true, device: device)
- }
-
- public var lifecycleState: G7SensorLifecycleState {
- if state.sensorID == nil {
- return .searching
- }
- if let sensorEndsAt = sensorEndsAt, sensorEndsAt.timeIntervalSinceNow < 0 {
- return .expired
- }
- if let algorithmState = latestReading?.algorithmState {
- if algorithmState.isInWarmup {
- return .warmup
- }
- if algorithmState.sensorFailed {
- return .failed
- }
- }
- if let sensorExpiresAt = sensorExpiresAt, sensorExpiresAt.timeIntervalSinceNow < 0 {
- return .gracePeriod
- }
- return .ok
- }
-
-
- public func fetchNewDataIfNeeded(_ completion: @escaping (LoopKit.CGMReadingResult) -> Void) {
- sensor.resumeScanning()
- completion(.noData)
- }
-
- public init() {
- lockedState = Locked(G7CGMManagerState())
- sensor = G7Sensor(sensorID: nil)
- sensor.delegate = self
- }
-
- public required init?(rawState: RawStateValue) {
- let state = G7CGMManagerState(rawValue: rawState)
- lockedState = Locked(state)
- sensor = G7Sensor(sensorID: state.sensorID)
- sensor.delegate = self
- }
-
- public var rawState: RawStateValue {
- return state.rawValue
- }
-
- public var debugDescription: String {
- let lines = [
- "## G7CGMManager",
- "sensorID: \(String(describing: state.sensorID))",
- "activatedAt: \(String(describing: state.activatedAt))",
- "latestReading: \(String(describing: state.latestReading))",
- "latestReadingTimestamp: \(String(describing: state.latestReadingTimestamp))",
- "latestConnect: \(String(describing: state.latestConnect))",
- "uploadReadings: \(String(describing: state.uploadReadings))",
- ]
- return lines.joined(separator: "\n")
- }
-
- public func acknowledgeAlert(alertIdentifier: LoopKit.Alert.AlertIdentifier, completion: @escaping (Error?) -> Void) {
- completion(nil)
- }
-
- public func getSoundBaseURL() -> URL? { return nil }
- public func getSounds() -> [Alert.Sound] { return [] }
-
- public let managerIdentifier: String = "G7CGMManager"
-
- public let localizedTitle = LocalizedString("Dexcom G7", comment: "CGM display title")
-
- public let isOnboarded = true // No distinction between created and onboarded
-
- public var appURL: URL? {
- return nil
- }
-
- public func scanForNewSensor() {
- logDeviceCommunication("Forgetting existing sensor and starting scan for new sensor.", type: .connection)
-
- mutateState { state in
- state.sensorID = nil
- state.activatedAt = nil
- }
- sensor.scanForNewSensor()
- }
-
- public var device: HKDevice? {
- return HKDevice(
- name: "CGMBLEKit",
- manufacturer: "Dexcom",
- model: "G7",
- hardwareVersion: nil,
- firmwareVersion: nil,
- softwareVersion: String(G7SensorKitVersionNumber),
- localIdentifier: nil,
- udiDeviceIdentifier: "00386270001863"
- )
- }
-
- func logDeviceCommunication(_ message: String, type: DeviceLogEntryType = .send) {
- self.cgmManagerDelegate?.deviceManager(self, logEventForDeviceIdentifier: state.sensorID, type: type, message: message, completion: nil)
- }
-
- private func updateDelegate(with result: CGMReadingResult) {
- delegateQueue?.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: result)
- }
- }
-}
-
-extension G7CGMManager {
- // MARK: - G7StateObserver
-
- public func addStateObserver(_ observer: G7StateObserver, queue: DispatchQueue) {
- g7StateObservers.insert(observer, queue: queue)
- }
-
- public func removeStateObserver(_ observer: G7StateObserver) {
- g7StateObservers.removeElement(observer)
- }
-}
-
-extension G7CGMManager: G7SensorDelegate {
- public func sensor(_ sensor: G7Sensor, didDiscoverNewSensor name: String, activatedAt: Date) -> Bool {
- logDeviceCommunication("New sensor \(name) discovered, activated at \(activatedAt)", type: .connection)
-
- let shouldSwitchToNewSensor = true
-
- if shouldSwitchToNewSensor {
- mutateState { state in
- state.sensorID = name
- state.activatedAt = activatedAt
- }
- }
-
- return shouldSwitchToNewSensor
- }
-
- public func sensorDidConnect(_ sensor: G7Sensor, name: String) {
- mutateState { state in
- state.latestConnect = Date()
- }
- logDeviceCommunication("Sensor connected", type: .connection)
- }
-
- public func sensorDisconnected(_ sensor: G7Sensor, suspectedEndOfSession: Bool) {
- logDeviceCommunication("Sensor disconnected: suspectedEndOfSession=\(suspectedEndOfSession)", type: .connection)
- if suspectedEndOfSession {
- scanForNewSensor()
- }
- }
-
- public func sensor(_ sensor: G7Sensor, didError error: Error) {
- logDeviceCommunication("Sensor error \(error)", type: .error)
- }
-
- public func sensor(_ sensor: G7Sensor, didRead message: G7GlucoseMessage) {
-
- guard message != latestReading else {
- logDeviceCommunication("Sensor reading duplicate: \(message)", type: .error)
- updateDelegate(with: .noData)
- return
- }
-
- guard let activationDate = sensor.activationDate else {
- logDeviceCommunication("Unable to process sensor reading without activation date.", type: .error)
- return
- }
-
- logDeviceCommunication("Sensor didRead \(message)", type: .receive)
-
- let latestReadingTimestamp = activationDate.addingTimeInterval(TimeInterval(message.glucoseTimestamp))
-
- mutateState { state in
- state.latestReading = message
- state.latestReadingTimestamp = latestReadingTimestamp
- }
-
- guard let glucose = message.glucose else {
- updateDelegate(with: .noData)
- return
- }
-
- guard message.hasReliableGlucose else {
- updateDelegate(with: .error(AlgorithmError.unreliableState(message.algorithmState)))
- return
- }
-
- let unit = HKUnit.milligramsPerDeciliter
- let quantity = HKQuantity(unit: unit, doubleValue: Double(min(max(glucose, GlucoseLimits.minimum), GlucoseLimits.maximum)))
-
- updateDelegate(with: .newData([
- NewGlucoseSample(
- date: latestReadingTimestamp,
- quantity: quantity,
- condition: message.condition,
- trend: message.trendType,
- trendRate: message.trendRate,
- isDisplayOnly: message.glucoseIsDisplayOnly,
- wasUserEntered: message.glucoseIsDisplayOnly,
- syncIdentifier: generateSyncIdentifier(timestamp: message.glucoseTimestamp),
- device: device
- )
- ]))
- }
-
- private func generateSyncIdentifier(timestamp: UInt32) -> String {
- guard let activatedAt = state.activatedAt, let sensorID = state.sensorID else {
- return "invalid"
- }
-
- return "\(activatedAt.timeIntervalSince1970.hours) \(sensorID) \(timestamp)"
- }
-
- public func sensor(_ sensor: G7Sensor, didReadBackfill backfill: [G7BackfillMessage]) {
- for msg in backfill {
- logDeviceCommunication("Sensor didReadBackfill \(msg)", type: .receive)
- }
-
- guard let activationDate = sensor.activationDate else {
- log.error("Unable to process backfill without activation date.")
- return
- }
-
- let unit = HKUnit.milligramsPerDeciliter
-
- let samples = backfill.compactMap { entry -> NewGlucoseSample? in
- guard let glucose = entry.glucose else {
- return nil
- }
-
- guard entry.hasReliableGlucose else {
- logDeviceCommunication("Backfill reading unreliable: \(entry)", type: .receive)
- return nil
- }
-
- let quantity = HKQuantity(unit: unit, doubleValue: Double(min(max(glucose, GlucoseLimits.minimum), GlucoseLimits.maximum)))
-
- return NewGlucoseSample(
- date: activationDate.addingTimeInterval(TimeInterval(entry.timestamp)),
- quantity: quantity,
- condition: entry.condition,
- trend: entry.trendType,
- trendRate: entry.trendRate,
- isDisplayOnly: entry.glucoseIsDisplayOnly,
- wasUserEntered: entry.glucoseIsDisplayOnly,
- syncIdentifier: generateSyncIdentifier(timestamp: entry.timestamp),
- device: device
- )
- }
-
- updateDelegate(with: .newData(samples))
- }
-
- public func sensorConnectionStatusDidUpdate(_ sensor: G7Sensor) {
- g7StateObservers.forEach { (observer) in
- observer.g7ConnectionStatusDidChange()
- }
- }
-}
-
-extension G7BackfillMessage {
- public var trendRate: HKQuantity? {
- guard let trend = trend else {
- return nil
- }
- return HKQuantity(unit: .milligramsPerDeciliterPerMinute, doubleValue: trend)
- }
-}
-
-extension G7GlucoseMessage: GlucoseDisplayable {
- public var isStateValid: Bool {
- return hasReliableGlucose
- }
-
- public var trendRate: HKQuantity? {
- guard let trend = trend else {
- return nil
- }
- return HKQuantity(unit: .milligramsPerDeciliterPerMinute, doubleValue: trend)
- }
-
- public var glucoseQuantity: HKQuantity? {
- guard let glucose = glucose else {
- return nil
- }
- return HKQuantity(unit: .milligramsPerDeciliter, doubleValue: Double(glucose))
- }
-
- public var isLocal: Bool {
- return true
- }
-
- public var glucoseRangeCategory: LoopKit.GlucoseRangeCategory? {
- guard let glucose = glucose else {
- return nil
- }
-
- if glucose < GlucoseLimits.minimum {
- return .belowRange
- } else if glucose > GlucoseLimits.maximum {
- return .aboveRange
- } else {
- return nil
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7CGMManagerState.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7CGMManagerState.swift
deleted file mode 100644
index 948b02f78..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7CGMManagerState.swift
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// G7CGMManagerState.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 9/26/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import LoopKit
-
-
-public struct G7CGMManagerState: RawRepresentable, Equatable {
- public typealias RawValue = CGMManager.RawStateValue
-
- public var sensorID: String?
- public var activatedAt: Date?
- public var latestReading: G7GlucoseMessage?
- public var latestReadingTimestamp: Date?
- public var latestConnect: Date?
- public var uploadReadings: Bool = false
-
- init() {
- }
-
- public init(rawValue: RawValue) {
- self.sensorID = rawValue["sensorID"] as? String
- self.activatedAt = rawValue["activatedAt"] as? Date
- if let readingData = rawValue["latestReading"] as? Data {
- latestReading = G7GlucoseMessage(data: readingData)
- }
- self.latestReadingTimestamp = rawValue["latestReadingTimestamp"] as? Date
- self.latestConnect = rawValue["latestConnect"] as? Date
- self.uploadReadings = rawValue["uploadReadings"] as? Bool ?? false
- }
-
- public var rawValue: RawValue {
- var rawValue: RawValue = [:]
- rawValue["sensorID"] = sensorID
- rawValue["activatedAt"] = activatedAt
- rawValue["latestReading"] = latestReading?.data
- rawValue["latestReadingTimestamp"] = latestReadingTimestamp
- rawValue["latestConnect"] = latestConnect
- rawValue["uploadReadings"] = uploadReadings
- return rawValue
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7DeviceStatus.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7DeviceStatus.swift
deleted file mode 100644
index 2cbfaaff9..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7DeviceStatus.swift
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// G7DeviceStatus.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 10/23/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import LoopKit
-import LoopKitUI
-
-public struct G7DeviceStatusHighlight: DeviceStatusHighlight, Equatable {
- public let localizedMessage: String
- public let imageName: String
- public let state: DeviceStatusHighlightState
- init(localizedMessage: String, imageName: String, state: DeviceStatusHighlightState) {
- self.localizedMessage = localizedMessage
- self.imageName = imageName
- self.state = state
- }
-}
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7LastReading.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7LastReading.swift
deleted file mode 100644
index f77efb212..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7LastReading.swift
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// G7LastReading.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 10/4/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-struct G7LastReading {
- let glucose: Int?
- let timestamp: Date
- let sensorTimestamp: Date
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7PeripheralManager.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7PeripheralManager.swift
deleted file mode 100644
index fcef3b72a..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7PeripheralManager.swift
+++ /dev/null
@@ -1,567 +0,0 @@
-//
-// G7PeripheralManager.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 11/11/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import os.log
-
-
-enum PeripheralManagerError: Error {
- case cbPeripheralError(Error)
- case notReady
- case invalidConfiguration
- case timeout
- case unknownCharacteristic
-}
-
-class G7PeripheralManager: NSObject {
-
- private let log = OSLog(category: "G7PeripheralManager")
-
- ///
- /// This is mutable, because CBPeripheral instances can seemingly become invalid, and need to be periodically re-fetched from CBCentralManager
- var peripheral: CBPeripheral {
- didSet {
- guard oldValue !== peripheral else {
- return
- }
-
- log.error("Replacing peripheral reference %{public}@ -> %{public}@", oldValue, peripheral)
-
- oldValue.delegate = nil
- peripheral.delegate = self
-
- queue.sync {
- self.needsConfiguration = true
- }
- }
- }
-
- /// The dispatch queue used to serialize operations on the peripheral
- let queue = DispatchQueue(label: "com.loopkit.PeripheralManager.queue", qos: .unspecified)
-
- /// The condition used to signal command completion
- private let commandLock = NSCondition()
-
- /// The required conditions for the operation to complete
- private var commandConditions = [CommandCondition]()
-
- /// Any error surfaced during the active operation
- private var commandError: Error?
-
- private(set) weak var central: CBCentralManager?
-
- let configuration: Configuration
-
- // Confined to `queue`
- private var needsConfiguration = true
-
- weak var delegate: G7PeripheralManagerDelegate? {
- didSet {
- queue.sync {
- needsConfiguration = true
- }
- }
- }
-
- init(peripheral: CBPeripheral, configuration: Configuration, centralManager: CBCentralManager) {
- self.peripheral = peripheral
- self.central = centralManager
- self.configuration = configuration
-
- super.init()
-
- peripheral.delegate = self
-
- assertConfiguration()
- }
-}
-
-
-// MARK: - Nested types
-extension G7PeripheralManager {
- struct Configuration {
- var serviceCharacteristics: [CBUUID: [CBUUID]] = [:]
- var notifyingCharacteristics: [CBUUID: [CBUUID]] = [:]
- var valueUpdateMacros: [CBUUID: (_ manager: G7PeripheralManager) -> Void] = [:]
- }
-
- enum CommandCondition {
- case notificationStateUpdate(characteristicUUID: CBUUID, enabled: Bool)
- case valueUpdate(characteristic: CBCharacteristic, matching: ((Data?) -> Bool)?)
- case write(characteristic: CBCharacteristic)
- case discoverServices
- case discoverCharacteristicsForService(serviceUUID: CBUUID)
- }
-}
-
-protocol G7PeripheralManagerDelegate: AnyObject {
- func peripheralManager(_ manager: G7PeripheralManager, didUpdateValueFor characteristic: CBCharacteristic)
-
- func peripheralManager(_ manager: G7PeripheralManager, didReadRSSI RSSI: NSNumber, error: Error?)
-
- func peripheralManagerDidUpdateName(_ manager: G7PeripheralManager)
-
- func completeConfiguration(for manager: G7PeripheralManager) throws
-}
-
-
-// MARK: - Operation sequence management
-extension G7PeripheralManager {
- func configureAndRun(_ block: @escaping (_ manager: G7PeripheralManager) -> Void) -> (() -> Void) {
- return {
- if !self.needsConfiguration && self.peripheral.services == nil {
- self.log.error("Configured peripheral has no services. Reconfiguring…")
- }
-
- if self.needsConfiguration || self.peripheral.services == nil {
- do {
- try self.applyConfiguration()
- self.log.default("Peripheral configuration completed")
- if let delegate = self.delegate {
- try delegate.completeConfiguration(for: self)
- self.log.default("Delegate configuration completed")
- self.needsConfiguration = false
- } else {
- self.log.error("No delegate set configured")
- }
- } catch let error {
- self.log.error("Error applying peripheral configuration: %@", String(describing: error))
- // Will retry
- }
-
- }
-
- block(self)
- }
- }
-
- func perform(_ block: @escaping (_ manager: G7PeripheralManager) -> Void) {
- queue.async(execute: configureAndRun(block))
- }
-
- private func assertConfiguration() {
- log.debug("assertConfiguration")
- perform { (_) in
- // Intentionally empty to trigger configuration if necessary
- }
- }
-
- private func applyConfiguration(discoveryTimeout: TimeInterval = 2) throws {
- try discoverServices(configuration.serviceCharacteristics.keys.map { $0 }, timeout: discoveryTimeout)
-
- for service in peripheral.services ?? [] {
- guard let characteristics = configuration.serviceCharacteristics[service.uuid] else {
- // Not all services may have characteristics
- continue
- }
-
- try discoverCharacteristics(characteristics, for: service, timeout: discoveryTimeout)
- }
-
- for (serviceUUID, characteristicUUIDs) in configuration.notifyingCharacteristics {
- guard let service = peripheral.services?.itemWithUUID(serviceUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- for characteristicUUID in characteristicUUIDs {
- guard let characteristic = service.characteristics?.itemWithUUID(characteristicUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- guard !characteristic.isNotifying else {
- continue
- }
-
- try setNotifyValue(true, for: characteristic, timeout: discoveryTimeout)
- }
- }
- }
-}
-
-extension CBManagerState {
- var description: String {
- switch self {
- case .poweredOff:
- return "poweredOff"
- case .poweredOn:
- return "poweredOff"
- case .resetting:
- return "resetting"
- case .unauthorized:
- return "unauthorized"
- case .unknown:
- return "unknown"
- case .unsupported:
- return "unsupported"
- @unknown default:
- return "unknown(\(rawValue))"
- }
- }
-}
-
-extension CBPeripheralState {
- var description: String {
- switch self {
- case .connected:
- return "connected"
- case .disconnected:
- return "disconnected"
- case .connecting:
- return "connecting"
- case .disconnecting:
- return "disconnecting"
- @unknown default:
- return "unknown(\(rawValue))"
- }
- }
-}
-
-
-// MARK: - Synchronous Commands
-extension G7PeripheralManager {
- /// - Throws: PeripheralManagerError
- func runCommand(timeout: TimeInterval, command: () -> Void) throws {
- // Prelude
- dispatchPrecondition(condition: .onQueue(queue))
- guard central?.state == .poweredOn && peripheral.state == .connected else {
- log.debug("Unable to run command: central state = %{public}@, peripheral state = %{public}@", String(describing: central?.state.description), String(describing: peripheral.state))
- throw PeripheralManagerError.notReady
- }
-
- commandLock.lock()
-
- defer {
- commandLock.unlock()
- }
-
- guard commandConditions.isEmpty else {
- throw PeripheralManagerError.invalidConfiguration
- }
-
- // Run
- command()
-
- guard !commandConditions.isEmpty else {
- // If the command didn't add any conditions, then finish immediately
- return
- }
-
- // Postlude
- let signaled = commandLock.wait(until: Date(timeIntervalSinceNow: timeout))
-
- defer {
- commandError = nil
- commandConditions = []
- }
-
- guard signaled else {
- throw PeripheralManagerError.timeout
- }
-
- if let error = commandError {
- throw PeripheralManagerError.cbPeripheralError(error)
- }
- }
-
- /// It's illegal to call this without first acquiring the commandLock
- ///
- /// - Parameter condition: The condition to add
- func addCondition(_ condition: CommandCondition) {
- dispatchPrecondition(condition: .onQueue(queue))
- commandConditions.append(condition)
- }
-
- func discoverServices(_ serviceUUIDs: [CBUUID], timeout: TimeInterval) throws {
- let servicesToDiscover = peripheral.servicesToDiscover(from: serviceUUIDs)
-
- log.debug("Discovering servicesToDiscover %@", String(describing: servicesToDiscover))
-
- guard servicesToDiscover.count > 0 else {
- return
- }
-
- try runCommand(timeout: timeout) {
- addCondition(.discoverServices)
-
- log.debug("discoverServices %@", String(describing: serviceUUIDs))
-
- peripheral.discoverServices(serviceUUIDs)
- }
- }
-
- func discoverCharacteristics(_ characteristicUUIDs: [CBUUID], for service: CBService, timeout: TimeInterval) throws {
-
- log.debug("all uuids: %@", String(describing: characteristicUUIDs))
-
- let knownCharacteristicUUIDs = service.characteristics?.compactMap({ $0.uuid }) ?? []
- log.debug("knownCharacteristicUUIDs: %@", String(describing: knownCharacteristicUUIDs))
-
- let characteristicsToDiscover = peripheral.characteristicsToDiscover(from: characteristicUUIDs, for: service)
-
- log.debug("characteristicsToDiscover: %@", String(describing: characteristicsToDiscover))
-
- guard characteristicsToDiscover.count > 0 else {
- return
- }
-
- try runCommand(timeout: timeout) {
- addCondition(.discoverCharacteristicsForService(serviceUUID: service.uuid))
-
- log.debug("Discovering characteristics %@ for %@", String(describing: characteristicsToDiscover), String(describing: peripheral))
- peripheral.discoverCharacteristics(characteristicsToDiscover, for: service)
- }
- }
-
- /// - Throws: PeripheralManagerError
- func setNotifyValue(_ enabled: Bool, for characteristic: CBCharacteristic, timeout: TimeInterval) throws {
- try runCommand(timeout: timeout) {
- addCondition(.notificationStateUpdate(characteristicUUID: characteristic.uuid, enabled: enabled))
- log.debug("Set notify %@ for %@", String(describing: enabled), String(describing: peripheral))
- peripheral.setNotifyValue(enabled, for: characteristic)
- }
- }
-
- /// - Throws: PeripheralManagerError
- func readValue(for characteristic: CBCharacteristic, timeout: TimeInterval) throws -> Data? {
- try runCommand(timeout: timeout) {
- addCondition(.valueUpdate(characteristic: characteristic, matching: nil))
-
- peripheral.readValue(for: characteristic)
- }
-
- return characteristic.value
- }
-
- /// - Throws: PeripheralManagerError
- func wait(for characteristic: CBCharacteristic, timeout: TimeInterval) throws -> Data {
- try runCommand(timeout: timeout) {
- addCondition(.valueUpdate(characteristic: characteristic, matching: nil))
- }
-
- guard let value = characteristic.value else {
- throw PeripheralManagerError.timeout
- }
-
- return value
- }
-
- /// - Throws: PeripheralManagerError
- func writeValue(_ value: Data, for characteristic: CBCharacteristic, type: CBCharacteristicWriteType, timeout: TimeInterval) throws {
- try runCommand(timeout: timeout) {
- if case .withResponse = type {
- addCondition(.write(characteristic: characteristic))
- }
-
- peripheral.writeValue(value, for: characteristic, type: type)
- }
- }
-}
-
-
-// MARK: - Delegate methods executed on the central's queue
-extension G7PeripheralManager: CBPeripheralDelegate {
-
- func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .discoverServices = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .discoverCharacteristicsForService(serviceUUID: service.uuid) = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .notificationStateUpdate(characteristicUUID: characteristic.uuid, enabled: characteristic.isNotifying) = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
- commandLock.lock()
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .write(characteristic: characteristic) = condition {
- return true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- }
-
- commandLock.unlock()
- }
-
- func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
- commandLock.lock()
-
- var notifyDelegate = false
-
- if let index = commandConditions.firstIndex(where: { (condition) -> Bool in
- if case .valueUpdate(characteristic: characteristic, matching: let matching) = condition {
- return matching?(characteristic.value) ?? true
- } else {
- return false
- }
- }) {
- commandConditions.remove(at: index)
- commandError = error
-
- if commandConditions.isEmpty {
- commandLock.broadcast()
- }
- } else if let macro = configuration.valueUpdateMacros[characteristic.uuid] {
- macro(self)
- } else if commandConditions.isEmpty {
- notifyDelegate = true // execute after the unlock
- }
-
- commandLock.unlock()
-
- if notifyDelegate {
- // If we weren't expecting this notification, pass it along to the delegate
- delegate?.peripheralManager(self, didUpdateValueFor: characteristic)
- }
- }
-
- func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) {
- delegate?.peripheralManager(self, didReadRSSI: RSSI, error: error)
- }
-
- func peripheralDidUpdateName(_ peripheral: CBPeripheral) {
- delegate?.peripheralManagerDidUpdateName(self)
- }
-}
-
-
-extension G7PeripheralManager: CBCentralManagerDelegate {
- func centralManagerDidUpdateState(_ central: CBCentralManager) {
- switch central.state {
- case .poweredOn:
- log.debug("centralManagerDidUpdateState to poweredOn")
- assertConfiguration()
- default:
- break
- }
- }
-
- func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
- log.debug("didConnect to %{public}@", peripheral.identifier.uuidString)
- switch peripheral.state {
- case .connected:
- assertConfiguration()
- default:
- break
- }
- }
-}
-
-
-extension G7PeripheralManager {
- public override var debugDescription: String {
- var items = [
- "## G7PeripheralManager",
- "peripheral: \(peripheral)",
- ]
- queue.sync {
- items.append("needsConfiguration: \(needsConfiguration)")
- }
- return items.joined(separator: "\n")
- }
-}
-
-extension G7PeripheralManager {
- private func getCharacteristicWithUUID(_ uuid: CGMServiceCharacteristicUUID) -> CBCharacteristic? {
- return peripheral.getCharacteristicWithUUID(uuid)
- }
-
- func setNotifyValue(_ enabled: Bool,
- for characteristicUUID: CGMServiceCharacteristicUUID,
- timeout: TimeInterval = 2) throws
- {
- guard let characteristic = getCharacteristicWithUUID(characteristicUUID) else {
- throw PeripheralManagerError.unknownCharacteristic
- }
-
- try setNotifyValue(enabled, for: characteristic, timeout: timeout)
- }
-
-}
-
-
-fileprivate extension CBPeripheral {
- func getServiceWithUUID(_ uuid: SensorServiceUUID) -> CBService? {
- return services?.itemWithUUIDString(uuid.rawValue)
- }
-
- func getCharacteristicForServiceUUID(_ serviceUUID: SensorServiceUUID, withUUIDString UUIDString: String) -> CBCharacteristic? {
- guard let characteristics = getServiceWithUUID(serviceUUID)?.characteristics else {
- return nil
- }
-
- return characteristics.itemWithUUIDString(UUIDString)
- }
-
- func getCharacteristicWithUUID(_ uuid: CGMServiceCharacteristicUUID) -> CBCharacteristic? {
- return getCharacteristicForServiceUUID(.cgmService, withUUIDString: uuid.rawValue)
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7Sensor.swift b/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7Sensor.swift
deleted file mode 100644
index 20667e9f0..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7CGMManager/G7Sensor.swift
+++ /dev/null
@@ -1,311 +0,0 @@
-//
-// G7Sensor.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import CoreBluetooth
-import HealthKit
-import os.log
-
-
-public protocol G7SensorDelegate: AnyObject {
- func sensorDidConnect(_ sensor: G7Sensor, name: String)
-
- func sensorDisconnected(_ sensor: G7Sensor, suspectedEndOfSession: Bool)
-
- func sensor(_ sensor: G7Sensor, didError error: Error)
-
- func sensor(_ sensor: G7Sensor, didRead glucose: G7GlucoseMessage)
-
- func sensor(_ sensor: G7Sensor, didReadBackfill backfill: [G7BackfillMessage])
-
- // If this returns true, then start following this sensor
- func sensor(_ sensor: G7Sensor, didDiscoverNewSensor name: String, activatedAt: Date) -> Bool
-
- // This is triggered for connection/disconnection events, and enabling/disabling scan
- func sensorConnectionStatusDidUpdate(_ sensor: G7Sensor)
-}
-
-public enum G7SensorError: Error {
- case authenticationError(String)
- case controlError(String)
- case observationError(String)
-}
-
-extension G7SensorError: CustomStringConvertible {
- public var description: String {
- switch self {
- case .authenticationError(let description):
- return description
- case .controlError(let description):
- return description
- case .observationError(let description):
- return description
- }
- }
-}
-
-public enum G7SensorLifecycleState {
- case searching
- case warmup
- case ok
- case failed
- case gracePeriod
- case expired
-}
-
-
-public final class G7Sensor: G7BluetoothManagerDelegate {
- public static let lifetime = TimeInterval(hours: 10 * 24)
- public static let warmupDuration = TimeInterval(minutes: 25)
- public static let gracePeriod = TimeInterval(hours: 12)
-
- public weak var delegate: G7SensorDelegate?
-
- // MARK: - Passive observation state, confined to `bluetoothManager.managerQueue`
-
- /// The initial activation date of the sensor
- var activationDate: Date?
-
- /// The date of last connection
- private var lastConnection: Date?
-
- /// Used to detect connections that do not authenticate, signalling possible sensor switchover
- private var pendingAuth: Bool = false
-
- /// The backfill data buffer
- private var backfillBuffer: [G7BackfillMessage] = []
-
- // MARK: -
-
- private let log = OSLog(category: "G7Sensor")
-
- private let bluetoothManager = G7BluetoothManager()
-
- private let delegateQueue = DispatchQueue(label: "com.loopkit.G7Sensor.delegateQueue", qos: .unspecified)
-
- private var sensorID: String?
-
- public func setSensorId(_ newId: String) {
- self.sensorID = newId
- }
-
- public init(sensorID: String?) {
- self.sensorID = sensorID
- bluetoothManager.delegate = self
- }
-
- public func scanForNewSensor() {
- self.sensorID = nil
- bluetoothManager.disconnect()
- bluetoothManager.forgetPeripheral()
- bluetoothManager.scanForPeripheral()
- }
-
- public func resumeScanning() {
- bluetoothManager.scanForPeripheral()
- }
-
- public func stopScanning() {
- bluetoothManager.disconnect()
- }
-
- public var isScanning: Bool {
- return bluetoothManager.isScanning
- }
-
- public var isConnected: Bool {
- return bluetoothManager.isConnected
- }
-
- private func handleGlucoseMessage(message: G7GlucoseMessage, peripheralManager: G7PeripheralManager) {
- activationDate = Date().addingTimeInterval(-TimeInterval(message.glucoseTimestamp))
- peripheralManager.perform { (peripheral) in
- self.log.debug("Listening for backfill responses")
- // Subscribe to backfill updates
- do {
- try peripheral.listenToCharacteristic(.backfill)
- } catch let error {
- self.log.error("Error trying to enable notifications on backfill characteristic: %{public}@", String(describing: error))
- self.delegateQueue.async {
- self.delegate?.sensor(self, didError: error)
- }
- }
- }
- if sensorID == nil, let name = peripheralManager.peripheral.name, let activationDate = activationDate {
- delegateQueue.async {
- guard let delegate = self.delegate else {
- return
- }
-
- if delegate.sensor(self, didDiscoverNewSensor: name, activatedAt: activationDate) {
- self.sensorID = name
- self.activationDate = activationDate
- self.delegate?.sensor(self, didRead: message)
- self.bluetoothManager.stopScanning()
- }
- }
- } else if sensorID != nil {
- delegateQueue.async {
- self.delegate?.sensor(self, didRead: message)
- }
- } else {
- self.log.error("Dropping unhandled glucose message: %{public}@", String(describing: message))
- }
- }
-
- // MARK: - BluetoothManagerDelegate
-
- func bluetoothManager(_ manager: G7BluetoothManager, readied peripheralManager: G7PeripheralManager) -> Bool {
- var shouldStopScanning = false;
-
- if let sensorID = sensorID, sensorID == peripheralManager.peripheral.name {
- shouldStopScanning = true
- delegateQueue.async {
- self.delegate?.sensorDidConnect(self, name: sensorID)
- }
- }
-
- peripheralManager.perform { (peripheral) in
- self.log.info("Listening for authentication responses for %{public}@", String(describing: peripheralManager.peripheral.name))
- do {
- try peripheral.listenToCharacteristic(.authentication)
- self.pendingAuth = true
- } catch let error {
- self.delegateQueue.async {
- self.delegate?.sensor(self, didError: error)
- }
- }
- }
- return shouldStopScanning
- }
-
- func bluetoothManager(_ manager: G7BluetoothManager, readyingFailed peripheralManager: G7PeripheralManager, with error: Error) {
- delegateQueue.async {
- self.delegate?.sensor(self, didError: error)
- }
- }
-
- func peripheralDidDisconnect(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, wasRemoteDisconnect: Bool) {
- if let sensorID = sensorID, sensorID == peripheralManager.peripheral.name {
-
- let suspectedEndOfSession: Bool
- if pendingAuth && wasRemoteDisconnect {
- suspectedEndOfSession = true // Normal disconnect without auth is likely that G7 app stopped this session
- } else {
- suspectedEndOfSession = false
- }
- pendingAuth = false
-
- delegateQueue.async {
- self.delegate?.sensorDisconnected(self, suspectedEndOfSession: suspectedEndOfSession)
- }
- }
- }
-
- func bluetoothManager(_ manager: G7BluetoothManager, shouldConnectPeripheral peripheral: CBPeripheral) -> PeripheralConnectionCommand {
-
- guard let name = peripheral.name else {
- log.debug("Not connecting to unnamed peripheral: %{public}@", String(describing: peripheral))
- return .ignore
- }
-
- /// The Dexcom G7 advertises a peripheral name of "DXCMxx", and later reports a full name of "Dexcomxx"
- /// Dexcom One+ peripheral name start with "DX02"
- if name.hasPrefix("DXCM") || name.hasPrefix("DX02"){
- // If we're following this name or if we're scanning, connect
- if let sensorName = sensorID, name.suffix(2) == sensorName.suffix(2) {
- return .makeActive
- } else if sensorID == nil {
- return .connect
- }
- }
-
- log.info("Not connecting to peripheral: %{public}@", name)
- return .ignore
- }
-
- func bluetoothManager(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, didReceiveControlResponse response: Data) {
-
- guard response.count > 0 else { return }
-
- log.debug("Received control response: %{public}@", response.hexadecimalString)
-
- switch G7Opcode(rawValue: response[0]) {
- case .glucoseTx?:
- if let glucoseMessage = G7GlucoseMessage(data: response) {
- handleGlucoseMessage(message: glucoseMessage, peripheralManager: peripheralManager)
- } else {
- delegateQueue.async {
- self.delegate?.sensor(self, didError: G7SensorError.observationError("Unable to handle glucose control response"))
- }
- }
- case .backfillFinished:
- if backfillBuffer.count > 0 {
- delegateQueue.async {
- self.delegate?.sensor(self, didReadBackfill: self.backfillBuffer)
- self.backfillBuffer = []
- }
- }
- default:
- // We ignore all other known opcodes
- break
- }
- }
-
- func bluetoothManager(_ manager: G7BluetoothManager, didReceiveBackfillResponse response: Data) {
-
- log.debug("Received backfill response: %{public}@", response.hexadecimalString)
-
- guard response.count == 9 else {
- return
- }
-
- if let msg = G7BackfillMessage(data: response) {
- backfillBuffer.append(msg)
- }
- }
-
- func bluetoothManager(_ manager: G7BluetoothManager, peripheralManager: G7PeripheralManager, didReceiveAuthenticationResponse response: Data) {
-
- if let message = AuthChallengeRxMessage(data: response), message.isBonded, message.isAuthenticated {
- log.debug("Observed authenticated session. enabling notifications for control characteristic.")
- pendingAuth = false
- peripheralManager.perform { (peripheral) in
- do {
- try peripheral.listenToCharacteristic(.control)
- } catch let error {
- self.log.error("Error trying to enable notifications on control characteristic: %{public}@", String(describing: error))
- self.delegateQueue.async {
- self.delegate?.sensor(self, didError: error)
- }
- }
- }
- } else {
- log.debug("Ignoring authentication response: %{public}@", response.hexadecimalString)
- }
- }
-
- func bluetoothManagerScanningStatusDidChange(_ manager: G7BluetoothManager) {
- self.delegateQueue.async {
- self.delegate?.sensorConnectionStatusDidUpdate(self)
- }
- }
-}
-
-
-// MARK: - Helpers
-fileprivate extension G7PeripheralManager {
-
- func listenToCharacteristic(_ characteristic: CGMServiceCharacteristicUUID) throws {
- do {
- try setNotifyValue(true, for: characteristic)
- } catch let error {
- throw G7SensorError.controlError("Error enabling notification for \(characteristic): \(error)")
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/G7SensorKit.h b/Dependencies/G7SensorKit/G7SensorKit/G7SensorKit.h
deleted file mode 100644
index a1e44ad8e..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/G7SensorKit.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// G7SensorKit.h
-// G7SensorKit
-//
-// Created by Pete Schwamb on 11/11/22.
-//
-
-#import
-
-//! Project version number for G7SensorKit.
-FOUNDATION_EXPORT double G7SensorKitVersionNumber;
-
-//! Project version string for G7SensorKit.
-FOUNDATION_EXPORT const unsigned char G7SensorKitVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import
-
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/GlucoseLimits.swift b/Dependencies/G7SensorKit/G7SensorKit/GlucoseLimits.swift
deleted file mode 100644
index b9e7bff6e..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/GlucoseLimits.swift
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// GlucoseLimits.swift
-// G7SensorKit
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-enum GlucoseLimits {
- static var minimum: UInt16 = 40
- static var maximum: UInt16 = 400
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/Messages/AuthChallengeRxMessage.swift b/Dependencies/G7SensorKit/G7SensorKit/Messages/AuthChallengeRxMessage.swift
deleted file mode 100644
index 3968f77c5..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/Messages/AuthChallengeRxMessage.swift
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// AuthChallengeRxMessage.swift
-// xDrip5
-//
-// Created by Nathan Racklyeft on 11/22/15.
-// Copyright © 2015 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-struct AuthChallengeRxMessage: SensorMessage {
- let isAuthenticated: Bool
- let isBonded: Bool
-
- init?(data: Data) {
- guard data.count >= 3 else {
- return nil
- }
-
- guard data.starts(with: .authChallengeRx) else {
- return nil
- }
-
- isAuthenticated = data[1] == 0x1
- isBonded = data[2] == 0x1
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/Messages/G7GlucoseMessage.swift b/Dependencies/G7SensorKit/G7SensorKit/Messages/G7GlucoseMessage.swift
deleted file mode 100644
index c67d40552..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/Messages/G7GlucoseMessage.swift
+++ /dev/null
@@ -1,130 +0,0 @@
-//
-// G7GlucoseMessage.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import LoopKit
-
-public struct G7GlucoseMessage: SensorMessage, Equatable {
- //public let status: UInt8
- //public let sequence: UInt32
- public let glucose: UInt16?
- public let predicted: UInt16?
- public let glucoseIsDisplayOnly: Bool
- public let messageTimestamp: UInt32 // Seconds since pairing of the *message*. Subtract age to get timestamp of glucose
- public let algorithmState: AlgorithmState
- public let sequence: UInt16
- public let trend: Double?
- public let data: Data
- public let age: UInt8 // Amount of time elapsed (seconds) from sensor reading to BLE comms
-
- public var hasReliableGlucose: Bool {
- return algorithmState.hasReliableGlucose
- }
-
- public var glucoseTimestamp: UInt32 {
- return messageTimestamp - UInt32(age)
- }
-
- public var trendType: LoopKit.GlucoseTrend? {
- guard let trend = trend else {
- return nil
- }
-
- switch trend {
- case let x where x <= -3.0:
- return .downDownDown
- case let x where x <= -2.0:
- return .downDown
- case let x where x <= -1.0:
- return .down
- case let x where x < 1.0:
- return .flat
- case let x where x < 2.0:
- return .up
- case let x where x < 3.0:
- return .upUp
- default:
- return .upUpUp
- }
- }
-
- public var condition: GlucoseCondition? {
- guard let glucose = glucose else {
- return nil
- }
-
- if glucose < GlucoseLimits.minimum {
- return .belowRange
- } else if glucose > GlucoseLimits.maximum {
- return .aboveRange
- } else {
- return nil
- }
- }
-
- init?(data: Data) {
- // 0 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 1617 18
- // TTTTTTTT SQSQ AG BGBG SS TR PRPR C
- // 0x4e 00 d5070000 0900 00 01 05 00 6100 06 01 ffff 0e
- // TTTTTTTT = timestamp
- // SQSQ = sequence
- // AG = age
- // BGBG = glucose
- // SS = algorithm state
- // TR = trend
- // PRPR = predicted
- // C = calibration
-
- guard data.count >= 19 else {
- return nil
- }
-
- guard data[1] == 00 else {
- return nil
- }
-
- messageTimestamp = data[2..<6].toInt()
-
- sequence = data[6..<8].to(UInt16.self)
-
- age = data[10]
-
- let glucoseData = data[12..<14].to(UInt16.self)
- if glucoseData != 0xffff {
- glucose = glucoseData & 0xfff
- glucoseIsDisplayOnly = (data[18] & 0x10) > 0
- } else {
- glucose = nil
- glucoseIsDisplayOnly = false
- }
-
- let predictionData = data[16..<18].to(UInt16.self)
- if predictionData != 0xffff {
- predicted = predictionData & 0xfff
- } else {
- predicted = nil
- }
-
- algorithmState = AlgorithmState(rawValue: data[14])
-
- if data[15] == 0x7f {
- trend = nil
- } else {
- trend = Double(Int8(bitPattern: data[15])) / 10
- }
-
- self.data = data
- }
-
-}
-
-extension G7GlucoseMessage: CustomDebugStringConvertible {
- public var debugDescription: String {
- return "G7GlucoseMessage(glucose:\(String(describing: glucose)), sequence:\(sequence) glucoseIsDisplayOnly:\(glucoseIsDisplayOnly) state:\(String(describing: algorithmState)) messageTimestamp:\(messageTimestamp) age:\(age), data:\(data.hexadecimalString))"
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/Messages/G7Opcode.swift b/Dependencies/G7SensorKit/G7SensorKit/Messages/G7Opcode.swift
deleted file mode 100644
index 3f4272f60..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/Messages/G7Opcode.swift
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// G7Opcode.swift
-// CGMBLEKit
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-enum G7Opcode: UInt8 {
- case authChallengeRx = 0x05
- case glucoseTx = 0x4e
- case backfillFinished = 0x59
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/Messages/SensorMessage.swift b/Dependencies/G7SensorKit/G7SensorKit/Messages/SensorMessage.swift
deleted file mode 100644
index 1e3cef6ff..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/Messages/SensorMessage.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// SensorMessage.swift
-// G7SensorKit
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-extension Data {
- func starts(with opcode: G7Opcode) -> Bool {
- guard count > 0 else {
- return false
- }
-
- return self[startIndex] == opcode.rawValue
- }
-}
-
-/// A data sequence received by the sensor
-protocol SensorMessage {
- init?(data: Data)
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/OSLog.swift b/Dependencies/G7SensorKit/G7SensorKit/OSLog.swift
deleted file mode 100644
index 25f8f4922..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/OSLog.swift
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// OSLog.swift
-// Loop
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import os.log
-
-
-extension OSLog {
- convenience init(category: String) {
- self.init(subsystem: "org.loopkit.G7SensorKit", category: category)
- }
-
- func debug(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .debug, args)
- }
-
- func info(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .info, args)
- }
-
- func `default`(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .default, args)
- }
-
- func error(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .error, args)
- }
-
- private func log(_ message: StaticString, type: OSLogType, _ args: [CVarArg]) {
- switch args.count {
- case 0:
- os_log(message, log: self, type: type)
- case 1:
- os_log(message, log: self, type: type, args[0])
- case 2:
- os_log(message, log: self, type: type, args[0], args[1])
- case 3:
- os_log(message, log: self, type: type, args[0], args[1], args[2])
- case 4:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3])
- case 5:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3], args[4])
- default:
- os_log(message, log: self, type: type, args)
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKit/cs.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/cs.lproj/Localizable.strings
deleted file mode 100644
index 2545fb307..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/cs.lproj/Localizable.strings
+++ /dev/null
@@ -1,21 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Údaje o glukóze nejsou k dispozici";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Platnost senzoru vypršela";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Senzor selhal";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Senzor je v pořádku";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Senzor je zastaven";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Senzor se zahřívá";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/da.lproj/Localizable.strings
deleted file mode 100644
index 7e7f79204..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/da.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukosedata ikke tilgængeligt";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor udløbet";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensorfejl";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor i ukendt tilstand %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor er OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Sensor er stoppet";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor varmer op";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/de.lproj/Localizable.strings
deleted file mode 100644
index ec8749479..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/de.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Blutzuckerdaten sind nicht verfügbar";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor abgelaufen";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensorfehler";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor befindet sich in unbekanntem Zustand %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor ist OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Sensor ist gestoppt";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor befindet sich in der Aufwärmphase";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/en.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/en.lproj/Localizable.strings
deleted file mode 100644
index 233b32c18..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/en.lproj/Localizable.strings
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- Localizable.strings
- G7SensorKit
-
- Created by Pete Schwamb on 3/20/23.
-
-*/
diff --git a/Dependencies/G7SensorKit/G7SensorKit/es.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/es.lproj/Localizable.strings
deleted file mode 100644
index b52e36f89..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/es.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Los datos de glucosa no están disponibles";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor caducado";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Fallo del sensor";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "El sensor está en estado desconocido %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "El sensor está bien";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "El sensor está en pausa";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "El sensor se está calentando";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/fi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/fi.lproj/Localizable.strings
deleted file mode 100644
index d3d114f90..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/fi.lproj/Localizable.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukoositietoja ei ole saatavilla";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Anturi on tuntemattomassa tilassa %1$d";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Anturi on pysäytetty";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Anturi lämpenee";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/fr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/fr.lproj/Localizable.strings
deleted file mode 100644
index 7b655b0e0..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/fr.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Les données de glycémie ne sont pas disponibles";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Capteur expiré";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Erreur de capteur";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Le capteur est dans un état inconnu %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Le capteur est OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Le capteur est arrêté";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Le capteur est en préchauffage";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/he.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/he.lproj/Localizable.strings
deleted file mode 100644
index 6232d3755..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/he.lproj/Localizable.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "חיישן נעצר";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "חיישן מתחמם";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/hi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/hi.lproj/Localizable.strings
deleted file mode 100644
index 966b632aa..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/hi.lproj/Localizable.strings
+++ /dev/null
@@ -1,21 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "ग्लूकोस डेटा उपलब्ध नहीं है";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "सेन्सर समाप्त हो गया";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "सेन्सर ख़राब हो गया है";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "सेन्सर सही है";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "सेन्सर समाप्त हो गया";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "सेन्सर अपने शुरुआती समय में है";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/hu.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/hu.lproj/Localizable.strings
deleted file mode 100644
index 233b32c18..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/hu.lproj/Localizable.strings
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- Localizable.strings
- G7SensorKit
-
- Created by Pete Schwamb on 3/20/23.
-
-*/
diff --git a/Dependencies/G7SensorKit/G7SensorKit/it.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/it.lproj/Localizable.strings
deleted file mode 100644
index d24f3b1fa..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/it.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "I dati della glicemia non sono disponibili";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensore scaduto";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensore Fallito";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Il Sensore e' in un stato%1$d sconosciuto";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensore è OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Il Sensore e' fermato";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Il Sensore si sta riscaldando";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/ja.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/ja.lproj/Localizable.strings
deleted file mode 100644
index 5e068ee72..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/ja.lproj/Localizable.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "グルコースデータがありません";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "センサーの状態が不明です %1$d";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "センサーが停止しています";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "センサーが準備中です";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/nb.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/nb.lproj/Localizable.strings
deleted file mode 100644
index a09c40602..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/nb.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Blodsukker er utilgjengelig";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor utløpt";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor feilet";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor er i ukjent tilstand %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor er OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Sensor er stoppet";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor varmer opp";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/nl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/nl.lproj/Localizable.strings
deleted file mode 100644
index c04a5ea12..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/nl.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucosegegevens zijn niet beschikbaar";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor verlopen";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor mislukt";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Onbekende sensorstatus %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Sensor gestopt";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor aan het opwarmen";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/pl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/pl.lproj/Localizable.strings
deleted file mode 100644
index ee07e274c..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/pl.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Dane o poziomie glukozy są niedostępne";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor stracił ważność";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Błąd sensora";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor jest w nieznanym stanie %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor jest OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Sensor został zatrzymany";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor jest w fazie rozruchu";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/pt-BR.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/pt-BR.lproj/Localizable.strings
deleted file mode 100644
index cb6222931..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/pt-BR.lproj/Localizable.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Os dados de glicose não estão disponíveis";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "O sensor está em um estado desconhecido %1$d";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "O sensor está parado";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "O sensor está aquecendo";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/ro.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/ro.lproj/Localizable.strings
deleted file mode 100644
index 47fdefeef..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/ro.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Datele despre glucoză nu sunt disponibile";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Senzorul a expirat";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Senzorul a eșuat";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Starea senzorului este necunoscută";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Senzorul este OK";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Senzorul e oprit";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Senzorul se pregătește";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/ru.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/ru.lproj/Localizable.strings
deleted file mode 100644
index e19db179b..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/ru.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Данные глюкозы недоступны";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Сенсор истек";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Ошибка сенсора";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Неизвестное состояние сенсора%1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Сенсор ОК";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Сенсор остановлен";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Сенсор прогревается";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/sk.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/sk.lproj/Localizable.strings
deleted file mode 100644
index 4972ecebe..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/sk.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Údaje o glykémii nie sú k dispozícii";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Platnosť senzora vypršala";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Senzor zlyhal";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Senzor je v neznámom stave %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Senzor je v poriadku";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Senzor je zastavený";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Senzor sa zahrieva";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/sv.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/sv.lproj/Localizable.strings
deleted file mode 100644
index 7eb4c335f..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/sv.lproj/Localizable.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukosvärden är inte tillgängliga";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensorns status är okänd %1$d";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Sensorn har stoppats";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensorn värmer upp";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/tr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/tr.lproj/Localizable.strings
deleted file mode 100644
index f7f296ac7..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/tr.lproj/Localizable.strings
+++ /dev/null
@@ -1,24 +0,0 @@
-/* CGM display title */
-"Dexcom G7" = "Dexcom G7";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "KŞ verileri mevcut değil";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensörün süresi doldu";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensör hatası";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensör bilinmeyen durumda %1$d";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensör iyi durumda";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Sensör durdu";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensör ısınıyor";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKit/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKit/vi.lproj/Localizable.strings
deleted file mode 100644
index 71e436ce2..000000000
--- a/Dependencies/G7SensorKit/G7SensorKit/vi.lproj/Localizable.strings
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Dữ liệu glucose không có sẵn";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Cảm biến ở trạng thái không xác định %1$d";
-
-/* The description of sensor algorithm state when sensor is stopped. */
-"Sensor is stopped" = "Cảm biến bị dừng";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Cảm biến đang nóng lên";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKitTests/G7GlucoseMessageTests.swift b/Dependencies/G7SensorKit/G7SensorKitTests/G7GlucoseMessageTests.swift
deleted file mode 100644
index bd6c9040c..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitTests/G7GlucoseMessageTests.swift
+++ /dev/null
@@ -1,160 +0,0 @@
-//
-// G7GlucoseMessageTests.swift
-// CGMBLEKitTests
-//
-// Created by Pete Schwamb on 9/25/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import XCTest
-@testable import G7SensorKit
-
-final class G7GlucoseMessageTests: XCTestCase {
-
- func testG7MessageData() {
- let data = Data(hexadecimalString: "4e00c35501002601000106008a00060187000f")!
- let message = G7GlucoseMessage(data: data)!
-
- XCTAssertEqual(138, message.glucose)
- XCTAssertEqual(87485, message.glucoseTimestamp)
- XCTAssert(!message.glucoseIsDisplayOnly)
- }
-
- func testG7MessageDataWithCalibration() {
- let data = Data(hexadecimalString: "4e000ec10d00c00b00010000680006fe63001f")!
- let message = G7GlucoseMessage(data: data)!
-
- XCTAssertEqual(104, message.glucose)
- XCTAssertEqual(901390, message.glucoseTimestamp)
- XCTAssert(message.glucoseIsDisplayOnly)
- }
-
- func testG7MessageDataLifecycle() {
- let startupMessagesHex = [
- "4e00b6000000010000006600ffff017fffff00", // 0
- "4e00cd000000030000010500ffff027fffff01", // 1
- "4e00f90100000400000105009100027effff02", // 2
- "4e00250300000500000105007d00027effff02", // 3
- "4e0051040000060000010500650002dfffff02", // 4
- "4e007d0500000700000105004e0002e7ffff02", // 5
- "4e00ab060000080000010700540006f5ffff0e", // 6
- "4e00d507000009000001050061000601ffff0e", // 7
- "4e004d440e00d40b0001d46b650018036a000e", // 8
- ]
- let messages = startupMessagesHex.map { G7GlucoseMessage(data: Data(hexadecimalString: $0)!)! }
-
- XCTAssertNil(messages[0].glucose)
- XCTAssertNil(messages[1].glucose)
- XCTAssertEqual(145, messages[2].glucose)
-
- XCTAssertEqual(.known(.stopped), messages[0].algorithmState)
- XCTAssertEqual(.known(.warmup), messages[1].algorithmState)
- XCTAssertEqual(.known(.warmup), messages[2].algorithmState)
- XCTAssertEqual(.known(.warmup), messages[3].algorithmState)
- XCTAssertEqual(.known(.warmup), messages[4].algorithmState)
- XCTAssertEqual(.known(.warmup), messages[5].algorithmState)
- XCTAssertEqual(.known(.ok), messages[6].algorithmState)
- XCTAssertEqual(.known(.ok), messages[7].algorithmState)
- XCTAssertEqual(.known(.expired), messages[8].algorithmState)
-
- XCTAssertEqual(1, messages[0].sequence)
- XCTAssertEqual(3, messages[1].sequence)
- XCTAssertEqual(4, messages[2].sequence)
- XCTAssertEqual(5, messages[3].sequence)
- XCTAssertEqual(6, messages[4].sequence)
- XCTAssertEqual(7, messages[5].sequence)
- XCTAssertEqual(8, messages[6].sequence)
- XCTAssertEqual(9, messages[7].sequence)
- XCTAssertEqual(3028, messages[8].sequence)
-
-
- XCTAssertEqual(80, messages[0].glucoseTimestamp)
- XCTAssertEqual(200, messages[1].glucoseTimestamp)
- XCTAssertEqual(500, messages[2].glucoseTimestamp)
- XCTAssertEqual(800, messages[3].glucoseTimestamp)
- XCTAssertEqual(1100, messages[4].glucoseTimestamp)
- XCTAssertEqual(1400, messages[5].glucoseTimestamp)
- XCTAssertEqual(1700, messages[6].glucoseTimestamp)
- XCTAssertEqual(2000, messages[7].glucoseTimestamp)
- XCTAssertEqual(934777, messages[8].glucoseTimestamp)
- }
-
- func testG7MessageDataDetails() {
- // 0 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 18
- // TTTTTTTT SQSQ AG BGBG SS C
- // 4e 00 a89c0000 8800 00 01 04 00 8d00 06 03 8a 00 0f
-
- //2022-09-12 09:18:06.821253 readEGV(txTime=40104,seq=136,session=1,age=4,value=141,pred=138,algo=6,subAlgo=15,rate=3)
- let data = Data(hexadecimalString: "4e00a89c00008800000104008d0006038a000f")!
- let message = G7GlucoseMessage(data: data)!
-
- XCTAssertEqual(141, message.glucose)
- XCTAssertEqual(40100, message.glucoseTimestamp)
- XCTAssertEqual(136, message.sequence)
- XCTAssertEqual(4, message.age)
- XCTAssertEqual(138, message.predicted)
- XCTAssertEqual(0.3, message.trend)
- XCTAssertEqual(.known(.ok), message.algorithmState)
-
- XCTAssert(!message.glucoseIsDisplayOnly)
- }
-
- func testG7MessageDataNegativeRate() {
- let data = Data(hexadecimalString: "4e00c6cc0d00ca0b00010500610006fe5b000f")!
- let message = G7GlucoseMessage(data: data)!
- XCTAssertEqual(-0.2, message.trend)
- }
-
- func testG7MessageDataMissingRate() {
- let data = Data(hexadecimalString: "4e00c6cc0d00ca0b000105006100067f5b000f")!
- let message = G7GlucoseMessage(data: data)!
- XCTAssertNil(message.trend)
- }
-}
-
-
-
-// Activated 2022-09-24 17:39:31 +0000
-
-// 0 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 18
-// TTTTTTTT BGBG SS C
-// 2022-09-24 17:47:23 4e 00 ea010000 04 00 00 01 05 00 6c00 02 7e ff ff 02
-// 2022-09-24 17:52:27 4e 00 1a030000 05 00 00 01 09 00 5300 02 7e ff ff 02
-// 2022-09-24 17:57:25 4e 00 44040000 06 00 00 01 07 00 4500 02 e7 ff ff 02
-// 2022-09-24 18:02:27 4e 00 73050000 07 00 00 01 0a 00 3a00 02 f4 ff ff 02
-// 2022-09-24 18:07:21 4e 00 99060000 08 00 00 01 04 00 4800 06 02 ff ff 0e
-// 2022-09-24 18:22:26 4e 00 220a0000 0b 00 00 01 09 00 4f00 06 fe ff ff 0e
-
-// 2022-09-24 18:27:22 4e 00 4a0b0000 0c 00 00 01 05 00 4900 06 f9 37 00 0f
-// 2022-09-24 18:27:23 (txInfo: 7815(379013053518), SW13354, 73 mg/dL, Predictive: 55 mg/dL, Rate: -0.7 @ 2022-09-24T13:27:17-05:00, sessionInfo: Optional(Start: 2022-09-24T12:40:17-05:00, End: 2022-10-05T00:40:17-05:00)), isTimeCertain: true
-
-// 2022-09-24 22:32:24 4e 00 b7440000 3d 00 00 01 06 00 7f00 06 03 83 00 0f
-//2022-09-24 17:32:27.248461 -0500 info 388 Dexcom G7 DisplayState: displayingGlucose(txInfo: 7815(379013053518), SW13354, 127 mg/dL, Predictive: 131 mg/dL, Rate: 0.3 @ 2022-09-24T17:32:18-05:00, sessionInfo: Optional(Start: 2022-09-24T12:40:18-05:00, End: 2022-10-05T00:40:18-05:00)), isTimeCertain: true
-
-
-
-
-// 0 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 18
-// TTTTTTTT BGBG SS C
-// 2022-10-04 23:27:39 106 timestamp:902888 4e 00 e8c60d00 c5 0b 00 01 03 00 6a00 06 01 6a 00 0f
-// 2022-10-04 23:32:40 101 timestamp:903189 4e 00 15c80d00 c6 0b 00 01 04 00 6500 06 fe 61 00 0f
-// 2022-10-04 23:37:39 98 timestamp:903488 4e 00 40c90d00 c7 0b 00 01 03 00 6200 06 fc 5e 00 0f
-// 2022-10-04 23:42:39 100 timestamp:903789 4e 00 6dca0d00 c8 0b 00 01 04 00 6400 06 ff 5e 00 0f
-// 2022-10-04 23:47:41 97 timestamp:904090 4e 00 9acb0d00 c9 0b 00 01 05 00 6100 06 fd 5c 00 0f
-
-// 2022-10-04 23:52:41 97 timestamp:904390 4e 00 c6cc0d00 ca 0b 00 01 05 00 6100 06 fe 5b 00 0f
-
-// 2022-10-04 23:52:41.100991 -0500 info 289 Dexcom G7 calBounds(signature=65,lastBG=100,lastBGTime=901259,processing=completeHigh,permitted=true,lastDisplay=phone,lastProcessingTime=901565)
-// 2022-10-04 23:52:41.260740 -0500 info 289 Dexcom G7 DisplayState: displayingGlucose(txInfo: 7815(379013053518), SW13354, 97 mg/dL, Predictive: 91 mg/dL, Rate: -0.2 @ 2022-10-04T23:52:36-05:00, sessionInfo: Optional(Start: 2022-09-24T12:40:36-05:00, End: 2022-10-05T00:40:36-05:00)), isTimeCertain: true
-//
-
-// 2022-10-04 23:57:52 98 timestamp:904701 4e 00 fdcd0d00 cb 0b 00 01 10 00 6200 06 00 5c 00 0f
-// 2022-10-05 00:02:40 96 timestamp:904989 4e 00 1dcf0d00 cc 0b 00 01 04 00 6000 06 fe 5b 00 0f
-// 2022-10-05 00:07:39 95 timestamp:905288 4e 00 48d00d00 cd 0b 00 01 03 00 5f00 06 fe 5a 00 0f
-// 2022-10-05 08:17:43 101 timestamp:934692 4e 00 24430e00 d4 0b 00 01 ab 6a 6500 18 03 6a 00 0e
-// 2022-10-05 08:22:40 101 timestamp:934989 4e 00 4d440e00 d4 0b 00 01 d4 6b 6500 18 03 6a 00 0e
-// 2022-10-05 08:27:40 101 timestamp:935289 4e 00 79450e00 d4 0b 00 01 00 6d 6500 18 03 6a 00 0e
-// 2022-10-05 08:32:42 101 timestamp:935590 4e 00 a6460e00 d4 0b 00 01 2d 6e 6500 18 03 6a 00 0e
-// 2022-10-05 08:37:42 101 timestamp:935890 4e 00 d2470e00 d4 0b 00 01 59 6f 6500 18 03 6a 00 0e
-// 2022-10-05 08:42:39 101 timestamp:936188 4e 00 fc480e00 d4 0b 00 01 83 70 6500 18 03 6a 00 0e
-// 2022-10-05 08:47:39 101 timestamp:936488 4e 00 284a0e00 d4 0b 00 01 af 71 6500 18 03 6a 00 0e
diff --git a/Dependencies/G7SensorKit/G7SensorKitTests/G7SensorKitTests.swift b/Dependencies/G7SensorKit/G7SensorKitTests/G7SensorKitTests.swift
deleted file mode 100644
index 3b3d87195..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitTests/G7SensorKitTests.swift
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// G7SensorKitTests.swift
-// G7SensorKitTests
-//
-// Created by Pete Schwamb on 11/11/22.
-//
-
-import XCTest
-@testable import G7SensorKit
-
-class G7SensorKitTests: XCTestCase {
-
- override func setUpWithError() throws {
- // Put setup code here. This method is called before the invocation of each test method in the class.
- }
-
- override func tearDownWithError() throws {
- // Put teardown code here. This method is called after the invocation of each test method in the class.
- }
-
- func testExample() throws {
- // This is an example of a functional test case.
- // Use XCTAssert and related functions to verify your tests produce the correct results.
- // Any test you write for XCTest can be annotated as throws and async.
- // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
- // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
- }
-
- func testPerformanceExample() throws {
- // This is an example of a performance test case.
- self.measure {
- // Put the code you want to measure the time of here.
- }
- }
-
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/Contents.json b/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/Contents.json
deleted file mode 100644
index 73c00596a..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/Contents.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/g7.imageset/Contents.json b/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/g7.imageset/Contents.json
deleted file mode 100644
index b729fd599..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/g7.imageset/Contents.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "images" : [
- {
- "filename" : "g7.png",
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/g7.imageset/g7.png b/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/g7.imageset/g7.png
deleted file mode 100644
index 624f20c56..000000000
Binary files a/Dependencies/G7SensorKit/G7SensorKitUI/Assets.xcassets/g7.imageset/g7.png and /dev/null differ
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Extensions/Image.swift b/Dependencies/G7SensorKit/G7SensorKitUI/Extensions/Image.swift
deleted file mode 100644
index 2d9195642..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/Extensions/Image.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Image.swift
-// CGMBLEKitUI
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import SwiftUI
-
-extension Image {
- init(frameworkImage name: String, decorative: Bool = false) {
- if decorative {
- self.init(decorative: name, bundle: FrameworkBundle.main)
- } else {
- self.init(name, bundle: FrameworkBundle.main)
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/G7CGMManager/G7CGMManager+UI.swift b/Dependencies/G7SensorKit/G7SensorKitUI/G7CGMManager/G7CGMManager+UI.swift
deleted file mode 100644
index f5820d832..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/G7CGMManager/G7CGMManager+UI.swift
+++ /dev/null
@@ -1,139 +0,0 @@
-//
-// G7CGMManager+UI.swift
-// CGMBLEKitUI
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import G7SensorKit
-import LoopKitUI
-import LoopKit
-
-public struct G7DeviceStatusHighlight: DeviceStatusHighlight, Equatable {
- public let localizedMessage: String
- public let imageName: String
- public let state: DeviceStatusHighlightState
- init(localizedMessage: String, imageName: String, state: DeviceStatusHighlightState) {
- self.localizedMessage = localizedMessage
- self.imageName = imageName
- self.state = state
- }
-}
-
-extension G7CGMManager: CGMManagerUI {
- public static var onboardingImage: UIImage? {
- return nil
- }
-
- public static func setupViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) -> SetupUIResult {
-
- let vc = G7UICoordinator(colorPalette: colorPalette, displayGlucoseUnitObservable: displayGlucoseUnitObservable, allowDebugFeatures: allowDebugFeatures)
- return .userInteractionRequired(vc)
- }
-
- public func settingsViewController(bluetoothProvider: BluetoothProvider, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable, colorPalette: LoopUIColorPalette, allowDebugFeatures: Bool) ->CGMManagerViewController {
-
- return G7UICoordinator(cgmManager: self, colorPalette: colorPalette, displayGlucoseUnitObservable: displayGlucoseUnitObservable, allowDebugFeatures: allowDebugFeatures)
- }
-
- public var smallImage: UIImage? {
- UIImage(named: "g7", in: Bundle(for: G7SettingsViewModel.self), compatibleWith: nil)!
- }
-
- // TODO Placeholder.
- public var cgmStatusHighlight: DeviceStatusHighlight? {
-
- if lifecycleState == .searching {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Searching for\nSensor", comment: "G7 Status highlight text for searching for sensor"),
- imageName: "dot.radiowaves.left.and.right",
- state: .normalCGM)
- }
-
- if lifecycleState == .expired {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nExpired", comment: "G7 Status highlight text for sensor expired"),
- imageName: "clock",
- state: .normalCGM)
- }
-
- if lifecycleState == .failed {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nFailed", comment: "G7 Status highlight text for sensor failed"),
- imageName: "exclamationmark.circle.fill",
- state: .critical)
- }
-
- if let latestReadingReceivedAt = state.latestReadingTimestamp, latestReadingReceivedAt.timeIntervalSinceNow < -.minutes(15) {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Signal\nLoss", comment: "G7 Status highlight text for signal loss"),
- imageName: "exclamationmark.circle.fill",
- state: .warning)
- }
-
- if let latestReading = latestReading, latestReading.algorithmState.isInSensorError {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nIssue", comment: "G7 Status highlight text for sensor error"),
- imageName: "exclamationmark.circle.fill",
- state: .warning)
- }
-
- if lifecycleState == .warmup {
- return G7DeviceStatusHighlight(
- localizedMessage: LocalizedString("Sensor\nWarmup", comment: "G7 Status highlight text for sensor warmup"),
- imageName: "clock",
- state: .normalCGM)
- }
- return nil
- }
-
- // TODO Placeholder.
- public var cgmStatusBadge: DeviceStatusBadge? {
- if lifecycleState == .gracePeriod {
- return G7DeviceStatusBadge(image: UIImage(systemName: "clock"), state: .critical)
- }
- return nil
- }
-
- // TODO Placeholder.
- public var cgmLifecycleProgress: DeviceLifecycleProgress? {
- switch lifecycleState {
- case .ok:
- // show remaining lifetime, if < 24 hours
- guard let expiration = sensorExpiresAt else {
- return nil
- }
- let remaining = max(0, expiration.timeIntervalSinceNow)
-
- if remaining < .hours(24) {
- return G7LifecycleProgress(percentComplete: 1-(remaining/G7Sensor.lifetime), progressState: .warning)
- }
- return nil
- case .gracePeriod:
- guard let endTime = sensorEndsAt else {
- return nil
- }
- let remaining = max(0, endTime.timeIntervalSinceNow)
- return G7LifecycleProgress(percentComplete: 1-(remaining/G7Sensor.gracePeriod), progressState: .critical)
- case .expired:
- return G7LifecycleProgress(percentComplete: 1, progressState: .critical)
- default:
- return nil
- }
- }
-}
-
-struct G7DeviceStatusBadge: DeviceStatusBadge {
- var image: UIImage?
-
- var state: LoopKitUI.DeviceStatusBadgeState
-}
-
-
-struct G7LifecycleProgress: DeviceLifecycleProgress {
- var percentComplete: Double
-
- var progressState: LoopKit.DeviceLifecycleProgressState
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/G7CGMManager/G7UICoordinator.swift b/Dependencies/G7SensorKit/G7SensorKitUI/G7CGMManager/G7UICoordinator.swift
deleted file mode 100644
index 87bf0168f..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/G7CGMManager/G7UICoordinator.swift
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// G7UICoordinator.swift
-// CGMBLEKitUI
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import LoopKitUI
-import G7SensorKit
-
-class G7UICoordinator: UINavigationController, CGMManagerOnboarding, CompletionNotifying, UINavigationControllerDelegate {
- var cgmManagerOnboardingDelegate: LoopKitUI.CGMManagerOnboardingDelegate?
- var completionDelegate: LoopKitUI.CompletionDelegate?
- var cgmManager: G7CGMManager?
- var displayGlucoseUnitObservable: DisplayGlucoseUnitObservable
-
- var colorPalette: LoopUIColorPalette
-
- init(cgmManager: G7CGMManager? = nil,
- colorPalette: LoopUIColorPalette,
- displayGlucoseUnitObservable: DisplayGlucoseUnitObservable,
- allowDebugFeatures: Bool)
- {
- self.cgmManager = cgmManager
- self.colorPalette = colorPalette
- self.displayGlucoseUnitObservable = displayGlucoseUnitObservable
- super.init(navigationBarClass: UINavigationBar.self, toolbarClass: UIToolbar.self)
- }
-
- required init?(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- delegate = self
-
- navigationBar.prefersLargeTitles = true // Ensure nav bar text is displayed correctly
-
- let viewController = initialView()
- setViewControllers([viewController], animated: false)
- }
-
- private func initialView() -> UIViewController {
- if cgmManager == nil {
- let rootView = G7StartupView(
- didContinue: { [weak self] in self?.completeSetup() },
- didCancel: { [weak self] in
- if let self = self {
- self.completionDelegate?.completionNotifyingDidComplete(self)
- }
- }
- )
- let hostingController = DismissibleHostingController(rootView: rootView, colorPalette: colorPalette)
- hostingController.navigationItem.largeTitleDisplayMode = .never
- hostingController.title = nil
- return hostingController
- } else {
- let view = G7SettingsView(
- didFinish: { [weak self] in
- if let self = self {
- self.completionDelegate?.completionNotifyingDidComplete(self)
- }
- },
- deleteCGM: { [ weak self] in
- self?.cgmManager?.notifyDelegateOfDeletion {
- DispatchQueue.main.async {
- if let self = self {
- self.completionDelegate?.completionNotifyingDidComplete(self)
- self.dismiss(animated: true)
- }
- }
- }
- },
- viewModel: G7SettingsViewModel(cgmManager: cgmManager!, displayGlucoseUnitObservable: displayGlucoseUnitObservable)
- )
- let hostingController = DismissibleHostingController(rootView: view, colorPalette: colorPalette)
- return hostingController
- }
- }
-
- func completeSetup() {
- cgmManager = G7CGMManager()
- cgmManagerOnboardingDelegate?.cgmManagerOnboarding(didCreateCGMManager: cgmManager!)
- cgmManagerOnboardingDelegate?.cgmManagerOnboarding(didOnboardCGMManager: cgmManager!)
- completionDelegate?.completionNotifyingDidComplete(self)
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/G7SensorKitUI.h b/Dependencies/G7SensorKit/G7SensorKitUI/G7SensorKitUI.h
deleted file mode 100644
index b549da0d8..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/G7SensorKitUI.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// G7SensorKitUI.h
-// G7SensorKitUI
-//
-// Created by Pete Schwamb on 11/11/22.
-//
-
-#import
-
-//! Project version number for G7SensorKitUI.
-FOUNDATION_EXPORT double G7SensorKitUIVersionNumber;
-
-//! Project version string for G7SensorKitUI.
-FOUNDATION_EXPORT const unsigned char G7SensorKitUIVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import
-
-
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/LocalizedString.swift b/Dependencies/G7SensorKit/G7SensorKitUI/LocalizedString.swift
deleted file mode 100644
index 68b75aa5a..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/LocalizedString.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// LocalizedString.swift
-// G7SensorKitUI
-//
-// Created by Pete Schwamb on 3/20/23.
-//
-
-import Foundation
-
-internal class FrameworkBundle {
- static let main = Bundle(for: FrameworkBundle.self)
-}
-
-func LocalizedString(_ key: String, tableName: String? = nil, value: String? = nil, comment: String) -> String {
- if let value = value {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, value: value, comment: comment)
- } else {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, comment: comment)
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/OSLog.swift b/Dependencies/G7SensorKit/G7SensorKitUI/OSLog.swift
deleted file mode 100644
index f09e87ea6..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/OSLog.swift
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// OSLog.swift
-// Loop
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import os.log
-
-
-extension OSLog {
- convenience init(category: String) {
- self.init(subsystem: "org.loopkit.G7SensorKitUI", category: category)
- }
-
- func debug(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .debug, args)
- }
-
- func info(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .info, args)
- }
-
- func `default`(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .default, args)
- }
-
- func error(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .error, args)
- }
-
- private func log(_ message: StaticString, type: OSLogType, _ args: [CVarArg]) {
- switch args.count {
- case 0:
- os_log(message, log: self, type: type)
- case 1:
- os_log(message, log: self, type: type, args[0])
- case 2:
- os_log(message, log: self, type: type, args[0], args[1])
- case 3:
- os_log(message, log: self, type: type, args[0], args[1], args[2])
- case 4:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3])
- case 5:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3], args[4])
- default:
- os_log(message, log: self, type: type, args)
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7ProgressBarState.swift b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7ProgressBarState.swift
deleted file mode 100644
index 652a6111f..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7ProgressBarState.swift
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// G7ProgressBarState.swift
-// G7SensorKitUI
-//
-// Created by Pete Schwamb on 11/22/22.
-//
-
-import Foundation
-
-enum G7ProgressBarState {
- case warmupProgress
- case lifetimeRemaining
- case gracePeriodRemaining
- case sensorFailed
- case sensorExpired
- case searchingForSensor
-
- var label: String {
- switch self {
- case .searchingForSensor:
- return LocalizedString("Searching for sensor", comment: "G7 Progress bar label when searching for sensor")
- case .sensorExpired:
- return LocalizedString("Sensor expired", comment: "G7 Progress bar label when sensor expired")
- case .warmupProgress:
- return LocalizedString("Warmup completes", comment: "G7 Progress bar label when sensor in warmup")
- case .sensorFailed:
- return LocalizedString("Sensor failed", comment: "G7 Progress bar label when sensor failed")
- case .lifetimeRemaining:
- return LocalizedString("Sensor expires", comment: "G7 Progress bar label when sensor lifetime progress showing")
- case .gracePeriodRemaining:
- return LocalizedString("Grace period remaining", comment: "G7 Progress bar label when sensor grace period progress showing")
- }
- }
-
- var labelColor: ColorStyle {
- switch self {
- case .sensorExpired:
- return .critical
- default:
- return .normal
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift
deleted file mode 100644
index 322fc78fb..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsView.swift
+++ /dev/null
@@ -1,208 +0,0 @@
-//
-// G7SettingsView.swift
-// CGMBLEKitUI
-//
-// Created by Pete Schwamb on 9/25/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import SwiftUI
-import G7SensorKit
-import LoopKitUI
-
-struct G7SettingsView: View {
-
- private var durationFormatter: RelativeDateTimeFormatter = {
- let formatter = RelativeDateTimeFormatter()
- formatter.unitsStyle = .full
- return formatter
- }()
-
- @Environment(\.guidanceColors) private var guidanceColors
- @Environment(\.glucoseTintColor) private var glucoseTintColor
-
- var didFinish: (() -> Void)
- var deleteCGM: (() -> Void)
- @ObservedObject var viewModel: G7SettingsViewModel
-
- @State private var showingDeletionSheet = false
-
- init(didFinish: @escaping () -> Void, deleteCGM: @escaping () -> Void, viewModel: G7SettingsViewModel) {
- self.didFinish = didFinish
- self.deleteCGM = deleteCGM
- self.viewModel = viewModel
- }
-
- private var timeFormatter: DateFormatter = {
- let formatter = DateFormatter()
-
- formatter.dateStyle = .short
- formatter.timeStyle = .short
-
- return formatter
- }()
-
- var body: some View {
- List {
- Section() {
- VStack {
- headerImage
- progressBar
- }
- }
- if let activatedAt = viewModel.activatedAt {
- HStack {
- Text(LocalizedString("Sensor Start", comment: "title for g7 settings row showing sensor start time"))
- Spacer()
- Text(timeFormatter.string(from: activatedAt))
- .foregroundColor(.secondary)
- }
- HStack {
- Text(LocalizedString("Sensor Expiration", comment: "title for g7 settings row showing sensor expiration time"))
- Spacer()
- Text(timeFormatter.string(from: activatedAt.addingTimeInterval(G7Sensor.lifetime)))
- .foregroundColor(.secondary)
- }
- HStack {
- Text(LocalizedString("Grace Period End", comment: "title for g7 settings row showing sensor grace period end time"))
- Spacer()
- Text(timeFormatter.string(from: activatedAt.addingTimeInterval(G7Sensor.lifetime + G7Sensor.gracePeriod)))
- .foregroundColor(.secondary)
- }
- }
-
- Section(LocalizedString("Last Reading", comment: "")) {
- LabeledValueView(label: LocalizedString("Glucose", comment: "Field label"),
- value: viewModel.lastGlucoseString)
- LabeledDateView(label: LocalizedString("Time", comment: "Field label"),
- date: viewModel.latestReadingTimestamp,
- dateFormatter: viewModel.dateFormatter)
- LabeledValueView(label: LocalizedString("Trend", comment: "Field label"),
- value: viewModel.lastGlucoseTrendString)
- }
-
- Section(LocalizedString("Bluetooth", comment: "")) {
- if let name = viewModel.sensorName {
- HStack {
- Text(LocalizedString("Name", comment: "title for g7 settings row showing BLE Name"))
- Spacer()
- Text(name)
- .foregroundColor(.secondary)
- }
- }
- if viewModel.scanning {
- HStack {
- Text(LocalizedString("Scanning", comment: "title for g7 settings connection status when scanning"))
- Spacer()
- SwiftUI.ProgressView()
- }
- } else {
- if viewModel.connected {
- Text(LocalizedString("Connected", comment: "title for g7 settings connection status when connected"))
- } else {
- HStack {
- Text(LocalizedString("Connecting", comment: "title for g7 settings connection status when connecting"))
- Spacer()
- SwiftUI.ProgressView()
- }
- }
- }
- if let lastConnect = viewModel.lastConnect {
- LabeledValueView(label: LocalizedString("Last Connect", comment: "title for g7 settings row showing sensor last connect time"),
- value: timeFormatter.string(from: lastConnect))
- }
- }
-
- Section(LocalizedString("Configuration", comment: "")) {
- HStack {
- Toggle(LocalizedString("Upload Readings", comment: "title for g7 config settings to upload readings"), isOn: $viewModel.uploadReadings)
- }
- }
-
- Section () {
- if !self.viewModel.scanning {
- Button(LocalizedString("Scan for new sensor", comment: ""), action: {
- self.viewModel.scanForNewSensor()
- })
- }
-
- deleteCGMButton
- }
- }
- .insetGroupedListStyle()
- .navigationBarItems(trailing: doneButton)
- .navigationBarTitle(LocalizedString("Dexcom G7", comment: "Navigation bar title for G7SettingsView"))
- }
-
- private var deleteCGMButton: some View {
- Button(action: {
- showingDeletionSheet = true
- }, label: {
- Text(LocalizedString("Delete CGM", comment: "Button label for removing CGM"))
- .foregroundColor(.red)
- }).actionSheet(isPresented: $showingDeletionSheet) {
- ActionSheet(
- title: Text("Are you sure you want to delete this CGM?"),
- buttons: [
- .destructive(Text("Delete CGM")) {
- self.deleteCGM()
- },
- .cancel(),
- ]
- )
- }
- }
-
- private var headerImage: some View {
- VStack(alignment: .center) {
- Image(frameworkImage: "g7")
- .resizable()
- .aspectRatio(contentMode: ContentMode.fit)
- .frame(height: 150)
- .padding(.horizontal)
- }.frame(maxWidth: .infinity)
- }
-
- @ViewBuilder
- private var progressBar: some View {
- VStack(alignment: .leading, spacing: 4) {
- HStack(alignment: .firstTextBaseline) {
- Text(viewModel.progressBarState.label)
- .font(.system(size: 17))
- .foregroundColor(color(for: viewModel.progressBarState.labelColor))
-
- Spacer()
- if let referenceDate = viewModel.progressReferenceDate {
- Text(durationFormatter.localizedString(for: referenceDate, relativeTo: Date()))
- .foregroundColor(.secondary)
- }
- }
- ProgressView(value: viewModel.progressBarProgress)
- .accentColor(color(for: viewModel.progressBarColorStyle))
- }
- }
-
- private func color(for colorStyle: ColorStyle) -> Color {
- switch colorStyle {
- case .glucose:
- return glucoseTintColor
- case .warning:
- return guidanceColors.warning
- case .critical:
- return guidanceColors.critical
- case .normal:
- return .primary
- case .dimmed:
- return .secondary
- }
- }
-
-
- private var doneButton: some View {
- Button("Done", action: {
- self.didFinish()
- })
- }
-
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsViewModel.swift b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsViewModel.swift
deleted file mode 100644
index 8513d2b5a..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7SettingsViewModel.swift
+++ /dev/null
@@ -1,218 +0,0 @@
-//
-// G7SettingsViewModel.swift
-// CGMBLEKitUI
-//
-// Created by Pete Schwamb on 10/4/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import G7SensorKit
-import LoopKit
-import LoopKitUI
-import HealthKit
-
-public enum ColorStyle {
- case glucose, warning, critical, normal, dimmed
-}
-
-class G7SettingsViewModel: ObservableObject {
- @Published private(set) var scanning: Bool = false
- @Published private(set) var connected: Bool = false
- @Published private(set) var sensorName: String?
- @Published private(set) var activatedAt: Date?
- @Published private(set) var lastConnect: Date?
- @Published private(set) var latestReadingTimestamp: Date?
- @Published var uploadReadings: Bool = false {
- didSet {
- cgmManager.uploadReadings = uploadReadings
- }
- }
-
- var displayGlucoseUnitObservable: DisplayGlucoseUnitObservable
-
- private var lastReading: G7GlucoseMessage?
-
- lazy var dateFormatter: DateFormatter = {
- let formatter = DateFormatter()
- formatter.dateStyle = .short
- formatter.timeStyle = .short
- return formatter
- }()
-
- private lazy var glucoseFormatter: QuantityFormatter = {
- let formatter = QuantityFormatter()
- formatter.setPreferredNumberFormatter(for: displayGlucoseUnitObservable.displayGlucoseUnit)
- formatter.numberFormatter.notANumberSymbol = "–"
- return formatter
- }()
-
- private let quantityFormatter = QuantityFormatter()
-
- private var cgmManager: G7CGMManager
-
- var progressBarState: G7ProgressBarState {
- switch cgmManager.lifecycleState {
- case .searching:
- return .searchingForSensor
- case .ok:
- return .lifetimeRemaining
- case .warmup:
- return .warmupProgress
- case .failed:
- return .sensorFailed
- case .gracePeriod:
- return .gracePeriodRemaining
- case .expired:
- return .sensorExpired
- }
- }
-
- init(cgmManager: G7CGMManager, displayGlucoseUnitObservable: DisplayGlucoseUnitObservable) {
- self.cgmManager = cgmManager
- self.displayGlucoseUnitObservable = displayGlucoseUnitObservable
- updateValues()
-
- self.cgmManager.addStateObserver(self, queue: DispatchQueue.main)
- }
-
- func updateValues() {
- scanning = cgmManager.isScanning
- sensorName = cgmManager.sensorName
- activatedAt = cgmManager.sensorActivatedAt
- connected = cgmManager.isConnected
- lastConnect = cgmManager.lastConnect
- lastReading = cgmManager.latestReading
- latestReadingTimestamp = cgmManager.latestReadingTimestamp
- uploadReadings = cgmManager.state.uploadReadings
- }
-
- var progressBarColorStyle: ColorStyle {
- switch progressBarState {
- case .warmupProgress:
- return .glucose
- case .searchingForSensor:
- return .dimmed
- case .sensorExpired, .sensorFailed:
- return .critical
- case .lifetimeRemaining:
- guard let remaining = progressValue else {
- return .dimmed
- }
- if remaining > .hours(24) {
- return .glucose
- } else {
- return .warning
- }
- case .gracePeriodRemaining:
- return .critical
- }
- }
-
- var progressBarProgress: Double {
- switch progressBarState {
- case .searchingForSensor:
- return 0
- case .warmupProgress:
- guard let value = progressValue, value > 0 else {
- return 0
- }
- return 1 - value / G7Sensor.warmupDuration
- case .lifetimeRemaining:
- guard let value = progressValue, value > 0 else {
- return 0
- }
- return 1 - value / G7Sensor.lifetime
- case .gracePeriodRemaining:
- guard let value = progressValue, value > 0 else {
- return 0
- }
- return 1 - value / G7Sensor.gracePeriod
- case .sensorExpired, .sensorFailed:
- return 1
- }
- }
-
- var progressReferenceDate: Date? {
- switch progressBarState {
- case .searchingForSensor:
- return nil
- case .sensorExpired, .gracePeriodRemaining:
- return cgmManager.sensorEndsAt
- case .warmupProgress:
- return cgmManager.sensorFinishesWarmupAt
- case .lifetimeRemaining:
- return cgmManager.sensorExpiresAt
- case .sensorFailed:
- return nil
- }
- }
-
- var progressValue: TimeInterval? {
- switch progressBarState {
- case .sensorExpired, .sensorFailed, .searchingForSensor:
- guard let sensorEndsAt = cgmManager.sensorEndsAt else {
- return nil
- }
- return sensorEndsAt.timeIntervalSinceNow
- case .warmupProgress:
- guard let warmupFinishedAt = cgmManager.sensorFinishesWarmupAt else {
- return nil
- }
- return max(0, warmupFinishedAt.timeIntervalSinceNow)
- case .lifetimeRemaining:
- guard let expiration = cgmManager.sensorExpiresAt else {
- return nil
- }
- return max(0, expiration.timeIntervalSinceNow)
- case .gracePeriodRemaining:
- guard let sensorEndsAt = cgmManager.sensorEndsAt else {
- return nil
- }
- return max(0, sensorEndsAt.timeIntervalSinceNow)
- }
- }
-
- func scanForNewSensor() {
- cgmManager.scanForNewSensor()
- }
-
- var lastGlucoseString: String {
- guard let lastReading = lastReading, lastReading.hasReliableGlucose, let quantity = lastReading.glucoseQuantity else {
- return LocalizedString("– – –", comment: "No glucose value representation (3 dashes for mg/dL)")
- }
-
- switch lastReading.glucoseRangeCategory {
- case .some(.belowRange):
- return LocalizedString("LOW", comment: "String displayed instead of a glucose value below the CGM range")
- case .some(.aboveRange):
- return LocalizedString("HIGH", comment: "String displayed instead of a glucose value above the CGM range")
- default:
- quantityFormatter.setPreferredNumberFormatter(for: displayGlucoseUnitObservable.displayGlucoseUnit)
- let valueStr = quantityFormatter.string(from: quantity, for: displayGlucoseUnitObservable.displayGlucoseUnit, includeUnit: false) ?? ""
- return String(format: "%@ %@", valueStr, displayGlucoseUnitObservable.displayGlucoseUnit.shortLocalizedUnitString())
- }
- }
-
- var lastGlucoseTrendString: String {
- if let lastReading = lastReading, lastReading.hasReliableGlucose, let trendRate = lastReading.trendRate {
- let glucoseUnitPerMinute = displayGlucoseUnitObservable.displayGlucoseUnit.unitDivided(by: .minute())
- // This seemingly strange replacement of glucose units is only to display the unit string correctly
- let trendPerMinute = HKQuantity(unit: displayGlucoseUnitObservable.displayGlucoseUnit, doubleValue: trendRate.doubleValue(for: glucoseUnitPerMinute))
- let formatted = glucoseFormatter.string(from: trendPerMinute, for: displayGlucoseUnitObservable.displayGlucoseUnit)!
- return String(format: LocalizedString("%@/min", comment: "Format string for glucose trend per minute. (1: glucose value and unit)"), formatted)
- } else {
- return ""
- }
- }
-}
-
-extension G7SettingsViewModel: G7StateObserver {
- func g7StateDidUpdate(_ state: G7CGMManagerState?) {
- updateValues()
- }
-
- func g7ConnectionStatusDidChange() {
- updateValues()
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7StartupView.swift b/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7StartupView.swift
deleted file mode 100644
index af76fb0da..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/Views/G7StartupView.swift
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// G7StartupView.swift
-// CGMBLEKitUI
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import SwiftUI
-
-struct G7StartupView: View {
- var didContinue: (() -> Void)?
- var didCancel: (() -> Void)?
-
- var body: some View {
- VStack(alignment: .center, spacing: 20) {
- Spacer()
- Text(LocalizedString("Dexcom G7", comment: "Title on WelcomeView"))
- .font(.largeTitle)
- .fontWeight(.semibold)
- VStack(alignment: .center) {
- Image(frameworkImage: "g7")
- .resizable()
- .aspectRatio(contentMode: ContentMode.fit)
- .frame(height: 120)
- .padding(.horizontal)
- }.frame(maxWidth: .infinity)
- Text(LocalizedString("iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.", comment: "Descriptive text on G7StartupView"))
- .fixedSize(horizontal: false, vertical: true)
- .foregroundColor(.secondary)
- Spacer()
- Button(action: { self.didContinue?() }) {
- Text(LocalizedString("Continue", comment:"Button title for starting setup"))
- .actionButtonStyle(.primary)
- }
- Button(action: { self.didCancel?() } ) {
- Text(LocalizedString("Cancel", comment: "Button text to cancel G7 setup")).padding(.top, 20)
- }
- }
- .padding()
- .environment(\.horizontalSizeClass, .compact)
- .navigationBarTitle("")
- .navigationBarHidden(true)
- }
-}
-
-struct WelcomeView_Previews: PreviewProvider {
- static var previews: some View {
- NavigationView {
- G7StartupView()
- }
- .previewDevice("iPod touch (7th generation)")
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ar.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ar.lproj/Localizable.strings
deleted file mode 100644
index 9b9a6b952..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/ar.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configuration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Done";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Time";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/cs.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/cs.lproj/Localizable.strings
deleted file mode 100644
index 087836a06..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/cs.lproj/Localizable.strings
+++ /dev/null
@@ -1,46 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Zrušit";
-
-/* No comment provided by engineer. */
-"Configuration" = "Konfigurace";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Připojeno";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Připojuji";
-
-/* Button title for starting setup */
-"Continue" = "Pokračovat";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Hotovo";
-
-/* Field label */
-"Glucose" = "Glukóza";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Konec dodatečné lhůty";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Zbývající dodatečná lhůta";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Název";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Platnost senzoru vypršela";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Senzor selhal";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings
deleted file mode 100644
index 25ddad8ad..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/da.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Er du sikker på, at du vil slette denne CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Annuller";
-
-/* No comment provided by engineer. */
-"Configuration" = "Konfiguration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Tilsluttet";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Tilslutter";
-
-/* Button title for starting setup */
-"Continue" = "Fortsæt";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Slet CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "OK";
-
-/* Field label */
-"Glucose" = "Glukose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Nådeperiodens Slut";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Tilbageværende nådeperiode";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HØJ";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Sidste Forbindelse";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Sidste Aflæsning";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan læse G7 CGM-data, men du skal stadig bruge Dexcom G7-appen til parring, kalibrering og anden sensorkontrol.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LAV";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Navn";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan efter ny sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanner";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Søger efter\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Søger efter sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nUdløbet";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFejlede";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nProblem";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Udløber";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor udløbet";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor udløber";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor fejlede";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signaltab";
-
-/* Field label */
-"Time" = "Tid";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Aflæsninger";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup fuldfører";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings
deleted file mode 100644
index e9ae6ef1b..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/de.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Möchten Sie das CGM wirklich löschen?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Abbrechen";
-
-/* No comment provided by engineer. */
-"Configuration" = "Konfiguration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Verbunden";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Verbinden";
-
-/* Button title for starting setup */
-"Continue" = "Fortsetzen";
-
-/* Button label for removing CGM */
-"Delete CGM" = "CGM löschen";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Fertig";
-
-/* Field label */
-"Glucose" = "Blutzucker";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Ende der Karenzfrist";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Verbleibende Karenzfrist";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HOCH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Letzte Verbindung";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Letzte Messung";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten direkt vom G7 lesen. Zum Verbinden, Kalibrieren und erweitertem Sensor Management benötigt man die G7 App.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "NIEDRIG";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Nach neuem Sensor suchen";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scannt";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Suche nach\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Suche nach Sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nabgelaufen";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensorverbindung\nfehlfeschlagen";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nFehler";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nAufwärmphase";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Ablaufdatum";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor abgelaufen";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor abgelaufen";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensorfehler";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Starte den Sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nVerlust";
-
-/* Field label */
-"Time" = "Uhrzeit";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload von Messwerten";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Aufwärmphase abgeschlossen";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings
deleted file mode 100644
index 8fb5899d1..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/en.lproj/Localizable.strings
+++ /dev/null
@@ -1,118 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configuration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Done";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Time";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings
deleted file mode 100644
index 4b41e6d16..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/es.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancelar";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configuracion";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Conectado";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Conectando";
-
-/* Button title for starting setup */
-"Continue" = "Continuar";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Hecho";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nombre";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Tiempo";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings
deleted file mode 100644
index 3b24a01c1..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/fi.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configuration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Yhdistetty";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Yhdistetään";
-
-/* Button title for starting setup */
-"Continue" = "Jatka";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Done";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Time";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings
deleted file mode 100644
index e02d131d6..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/fr.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Annuler";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configuration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connecté";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connexion en cours";
-
-/* Button title for starting setup */
-"Continue" = "Continuer";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Supprimer CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Terminé";
-
-/* Field label */
-"Glucose" = "Glycémie";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Fin de la Période de Grâce";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Période de grâce restante";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Dernière Connexion";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS peut lire les données G7 de la CGM mais vous devez toujours utiliser l'application Dexcom G7 pour associer, calibrer et gérer les capteurs.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nom";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Rechercher un nouveau capteur";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Balayage";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Recherche d'un\ncapteur";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Recherche d’un capteur";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Capteur\n expiré";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Capteur\na échoué";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Capteur\nproblème";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Capteur\nRéchauffement";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Capteur expiré";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Capteur expiré";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Capteura échoué";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Démarrer le capteur";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nPerte";
-
-/* Field label */
-"Time" = "Heure";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "L'échauffement est terminé";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/he.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/he.lproj/Localizable.strings
deleted file mode 100644
index 53ce1a9b4..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/he.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configuration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "מחובר";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "מתחבר";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Done";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Time";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/hi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/hi.lproj/Localizable.strings
deleted file mode 100644
index e99df8c7f..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/hi.lproj/Localizable.strings
+++ /dev/null
@@ -1,97 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/मिनट";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "निरस्त";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "कनेक्ट हो गया";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "कनेक्ट हो रहा है";
-
-/* Button title for starting setup */
-"Continue" = "जारी";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Field label */
-"Glucose" = "शुगर";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "ग्रेस समय समाप्त";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "बचा हुआ ग्रेस समय";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "लास्ट कनेक्ट";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "लूप G7 सीजीएम की रीडिंग्स पढ़ सकता है लेकिन सीजीएम सेन्सर के मैनज्मेंट, सेन्सर पैरिंग और कैलिब्रेशन की लिए dexcom का G7 ऐप ही इस्तेमाल करना चाहिए।";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "नाम";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "स्कैनिंग";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "सेन्सर ढूँड रहा है";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "सेन्सर ढूँड रहा है";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "सेन्सर समाप्त";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "सेन्सर ख़राब";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "सेन्सर ख़राबी";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "सेन्सर का शुरुआती समय";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "सेन्सर समाप्ति";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "सेन्सर समाप्त हो गया";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "सेन्सर समाप्त";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "सेन्सर ख़राब हो गया है";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "सेन्सर शुरू";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "सिग्नल लॉस";
-
-/* Field label */
-"Time" = "समय";
-
-/* Field label */
-"Trend" = "ट्रेंड";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "अपलोड रीडिंग्स";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "शुरुआती वॉर्म अप पूर्ण";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings
deleted file mode 100644
index d5a77fe52..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/hu.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Mégse";
-
-/* No comment provided by engineer. */
-"Configuration" = "Beállítások";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button label for removing CGM */
-"Delete CGM" = "CGM kitörlése";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Kész";
-
-/* Field label */
-"Glucose" = "Glükóz";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Megnevezés";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Idő";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings
deleted file mode 100644
index 02213ad8e..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/it.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Sei sicuro di voler cancellare questo CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancella";
-
-/* No comment provided by engineer. */
-"Configuration" = "Impostazioni";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connesso";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "In fase di Connessione";
-
-/* Button title for starting setup */
-"Continue" = "Continua";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Cancella CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Fine";
-
-/* Field label */
-"Glucose" = "Glicemie";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Fine periodo di tolleranza";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Periodo di tolleranza residuo";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "ALTO";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Ultima Connessione";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Ultima lettura";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS è in grado di leggere i dati CGM di G7, ma è comunque necessario utilizzare l'App Dexcom G7 per l'accoppiamento, la calibrazione e la gestione di altri sensori.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "BASSO";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nome";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scansiona nuovo sensore";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Lettura";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Ricerca del sensore \n";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Ricerca del sensore in corso";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensore \n scaduto";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensore \n Fallito";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Problema al sensore \n";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Riscaldamento sensore \n";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Scadenza Sensore";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensore scaduto";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Il sensore scade";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensore fallito";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Avvia sensore";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Perdita segnale \n";
-
-/* Field label */
-"Time" = "Tempo";
-
-/* Field label */
-"Trend" = "Tendenza";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Carica Letture";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Avvio completato";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ja.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ja.lproj/Localizable.strings
deleted file mode 100644
index d3dba4faa..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/ja.lproj/Localizable.strings
+++ /dev/null
@@ -1,36 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "---";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/分";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "このCGMを削除しますか?";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "キャンセル";
-
-/* No comment provided by engineer. */
-"Configuration" = "コンフィグレーション";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "接続済み";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "接続しています";
-
-/* Button title for starting setup */
-"Continue" = "次へ";
-
-/* Button label for removing CGM */
-"Delete CGM" = "CGMを削除";
-
-/* Field label */
-"Glucose" = "血糖値";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "プリセット名";
-
-/* Field label */
-"Trend" = "トレンド";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings
deleted file mode 100644
index e1e1b0148..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/nb.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Sikker på at du vil slette denne CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Avbryt";
-
-/* No comment provided by engineer. */
-"Configuration" = "Oppsett";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Tilkoblet";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Kobler til";
-
-/* Button title for starting setup */
-"Continue" = "Fortsett";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Slett CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Ferdig";
-
-/* Field label */
-"Glucose" = "Blodsukker";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Slutt på utsettelsesperiode";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Utsettelsesperiode som gjenstår";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HØYT";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Siste tilkobling";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Siste måling";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan lese data fra Dexcom G7, men du må fremdeles bruke Dexcom G7-appen for å koble til sender, kalibrere og andre innstillinger for sensoren.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LAVT";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Navn";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Søk etter ny sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Skanner";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Søker etter\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Søker etter sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nUtløpt";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFeilet";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nFeil";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nOppvarming";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor utløper";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensoren er utløpt";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor utløper";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensoren feilet";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nTapt";
-
-/* Field label */
-"Time" = "Tidspunkt";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Last opp avlesninger";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Oppvarming fullført";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings
deleted file mode 100644
index 05c99a6d7..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/nl.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Weet je zeker dat je deze CGM wilt vewijderen?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluethooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Annuleer";
-
-/* No comment provided by engineer. */
-"Configuration" = "Instellingen";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Verbonden";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Bezig met verbinden";
-
-/* Button title for starting setup */
-"Continue" = "Vervolg";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Verwijder CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "OK";
-
-/* Field label */
-"Glucose" = "Glucosewaarde";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Einde coulance periode";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Resterende coulance periode";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HOOG";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Laatste connectie";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Laatste stand";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan G7 CGM-gegevens lezen, maar je moet nog steeds de Dexcom G7 App gebruiken voor koppeling, kalibratie en ander sensorbeheer.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LAAG";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Naam";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Nieuwe sensor aan het scannen";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Aan het scannen";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Zoeken naar\nsensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Sensor aan het zoeken";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nverlopen";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nmislukt";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nprobleem";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nopwarmen";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor verloopt";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor verlopen";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor verloopt";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor mislukt";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signaal\nverlies";
-
-/* Field label */
-"Time" = "Tijd";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Lezingen uploaden";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Opwarmen voltooid";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings
deleted file mode 100644
index b20033e2f..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/pl.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Anuluj";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configuration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Połączono";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Łączenie";
-
-/* Button title for starting setup */
-"Continue" = "Kontynuuj";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Done";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Czas";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/pt-BR.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/pt-BR.lproj/Localizable.strings
deleted file mode 100644
index a5dbae60d..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/pt-BR.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancelar";
-
-/* No comment provided by engineer. */
-"Configuration" = "Ajustes";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Conectado";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Conectando";
-
-/* Button title for starting setup */
-"Continue" = "Continuar";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "OK";
-
-/* Field label */
-"Glucose" = "Glicose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nome";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Hora";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/pt-PT.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/pt-PT.lproj/Localizable.strings
deleted file mode 100644
index 71efa1317..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/pt-PT.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancelar";
-
-/* No comment provided by engineer. */
-"Configuration" = "Ajustes";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "OK";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nome";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "Hora";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ro.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ro.lproj/Localizable.strings
deleted file mode 100644
index 17af25cd9..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/ro.lproj/Localizable.strings
+++ /dev/null
@@ -1,118 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Sunteți sigur că doriți să ștergeți acest CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Renunță";
-
-/* No comment provided by engineer. */
-"Configuration" = "Configurare";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Conectat";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Conectare";
-
-/* Button title for starting setup */
-"Continue" = "Continuă";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Ștergeți CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Realizat";
-
-/* Field label */
-"Glucose" = "Glucoza";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Sfârșitul perioadei de grație";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Perioada de grație rămasă";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIPER";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Ultima conectare";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Ultima citire";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "Loop poate citi datele G7 CGM, dar pentru cuplare, calibrare și alte activități de gestionare a senzorului, va trebui să folosiți aplicația Dexcom G7.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "HIPO";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nume";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scanați pentru un senzor nou";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanare";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Detectarea senzorului";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Detectarea senzorului";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Senzorul a expirat";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Senzorul a eșuat";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Problemă cu senzorul";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Senzorul se încălzește";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Expirarea senzorului";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Senzorul a expirat";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Senzorul expiră";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Senzorul a eșuat";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Pornirea senzorului";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Pierdere de semnal";
-
-/* Field label */
-"Time" = "Timp";
-
-/* Field label */
-"Trend" = "Tendinţă";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Urcă citirile de glicemie";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Încălzirea s-a încheiat";
-
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings
deleted file mode 100644
index 1fca7ed02..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/ru.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/мин";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Вы уверены, что хотите удалить текущий CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Отмена";
-
-/* No comment provided by engineer. */
-"Configuration" = "Конфигурация";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Подключено";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Подключение";
-
-/* Button title for starting setup */
-"Continue" = "Продолжить";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Удалить CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Готово";
-
-/* Field label */
-"Glucose" = "Глюкоза";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Период отсрочки";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Оставшийся период отсрочки";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "ВЫСОКИЙ";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Последнее подключение";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Последнее считывание";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS может считывать G7 CGM данные, но Вы все равно должны использовать Dexcom G7 App для сопряжения, калибровки и управления датчиком.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "НИЗКИЙ";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Название";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Сканирование нового датчика";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Сканирование";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Поиск\nДатчика";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Поиск датчика";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Датчик\nИстек";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Датчик\nСбой";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Датчик\nПроблема";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Датчик\nПрогрев";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Датчик истекает";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Срок действия датчика истек";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Датчик заканчивается";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Сбой датчика";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Запуск датчика";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Сигнал\nПотерян";
-
-/* Field label */
-"Time" = "Время";
-
-/* Field label */
-"Trend" = "Тенденция";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Выгружать данные";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Прогрев завершается";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings
deleted file mode 100644
index 7844483e0..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/sk.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Ste si istí, že chcete tento CGM vymazať?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* No comment provided by engineer. */
-"Configuration" = "Nastavenie";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Pripojené";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Pripája sa";
-
-/* Button title for starting setup */
-"Continue" = "Pokračovať";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Odstrániť senzor";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Done";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Dodatočná doba na výmenu senzoru končí";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Zostávajúce predĺžené obdobie";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "VYSOKÉ";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Posledná hodnota";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS dokáže čítať dáta z G7 CGM, ale stále musíte používať aplikáciu Dexcom G7 na párovanie, kalibráciu a ďalšiu správu senzora.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "NÍZKE";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Načítať nový senzor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Skenuje sa";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Vyhľadávam\nsenzor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Vyhľadávam nový senzor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Senzor\nexspiroval";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Senzor\nzlyhal";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Problém\nsenzoru";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Zahrievanie\nsenzoru";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Senzor exspiruje";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Senzor exspiroval";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Senzor exspiruje";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Senzor štartu";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Strata\nsignálu";
-
-/* Field label */
-"Time" = "Time";
-
-/* Field label */
-"Trend" = "Vývoj";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Nahrať merania";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Zahrievanie senzora dokončené";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/sv.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/sv.lproj/Localizable.strings
deleted file mode 100644
index a5ffc0790..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/sv.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "År du säker på att du vill ta bort denna CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Avbryt";
-
-/* No comment provided by engineer. */
-"Configuration" = "Konfiguration";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Ansluten";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Ansluter";
-
-/* Button title for starting setup */
-"Continue" = "Fortsätt";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Radera CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Klar";
-
-/* Field label */
-"Glucose" = "Glukos";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Reservperiod slutar";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Tid kvar av reservtid";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HÖGT";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Senaste anslutning";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Senaste avläsning";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan läsa G7 CGM-värden, men du måste alltjämt använda Dexcom G7-appen för parkoppling, kalibrering samt hantering av sensorn.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LÅGT";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Namn";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Skanna efter ny sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Skannar";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Söker efter\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Söker efter sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nUtgått";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nmisslyckades";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensorproblem";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nUppvärmning";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensorns utgångsdatum";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensorns livslängd är slut";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensorn går ut";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensorn misslyckades";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Starta Sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal-\nförlust";
-
-/* Field label */
-"Time" = "Tid";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Ladda upp blodsocker";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Uppvärming av sensor";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings
deleted file mode 100644
index d25f3f78f..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/tr.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/dak";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Vazgeç";
-
-/* No comment provided by engineer. */
-"Configuration" = "Yapılandırma";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Bağlandı";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Bağlanıyor";
-
-/* Button title for starting setup */
-"Continue" = "Devam et";
-
-/* Button label for removing CGM */
-"Delete CGM" = "CGM'i Sil";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Tamam";
-
-/* Field label */
-"Glucose" = "Glikoz";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Yetkisiz Kullanım Sonu";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Kalan ek süre";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "YÜKSEK";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Son Bağlantı";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Son Okuma Değeri";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS, G7 CGM verilerini okuyabilir ancak yine de eşleştirme, kalibrasyon ve diğer sensör yönetimi için Dexcom G7 Uygulamasını kullanmanız gerekir.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "DÜŞÜK";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "İsim";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Yeni sensör için tara";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Taranıyor";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Sensör\nAranıyor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Sensör aranıyor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensör\nSüresi Doldu";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensör\nArızalı";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensör\nSorunu";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensör\nIsınıyor";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensör Süre Sonu";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensör süresi doldu";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensör süresi doluyor";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensör arızalı";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensörü başlatın";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Sinyal\nKaybı";
-
-/* Field label */
-"Time" = "Saat";
-
-/* Field label */
-"Trend" = "Eğilim";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Okumaları Yükle";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Isınma tamamlandı";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/uk.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/uk.lproj/Localizable.strings
deleted file mode 100644
index d22dc14d9..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/uk.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/хв";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Ви впевнені, що хочете видалити цей CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Відмінити";
-
-/* No comment provided by engineer. */
-"Configuration" = "Налаштування";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Під'єднаний";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Під'єднання";
-
-/* Button title for starting setup */
-"Continue" = "Продовжити";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Видалити CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Готово";
-
-/* Field label */
-"Glucose" = "Глюкоза";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Час до блокування";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Період витонченості, що залишився";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "ВИСОКИЙ";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Останнє підключення";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Останнє читання";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS може читати дані G7 CGM, але ви все одно повинні використовувати додаток Dexcom G7 для парування, калібрування та іншого управління сенсором.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "НИЗЬКИЙ";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Ім’я";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Сканувати новий Сенсор";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Сканування";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Пошук\nСенсору";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Пошук Сенсору";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Сенсор\nЗакінчився";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Сенсори\nНе вдалося";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Сенсор\nПроблема";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Сенсор\nПрогрів";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Термін дії Сенсору";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Термін Сенсору закінчився";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Сенсор закінчується";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Не вдалося встановити Сенсор";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Запустити сенсор";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Сигнал\nВтрата";
-
-/* Field label */
-"Time" = "Час";
-
-/* Field label */
-"Trend" = "Тренди";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Вивантажити читання";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Прогрів виконано";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings
deleted file mode 100644
index 21559a57b..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/vi.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "---";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/phút";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Bạn có chắc sẽ xóa CGM này?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Hủy bỏ";
-
-/* No comment provided by engineer. */
-"Configuration" = "Cấu hình";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Đã kết nối";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Đang kết nối";
-
-/* Button title for starting setup */
-"Continue" = "Tiếp tục";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Xóa CGM";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "Hoàn thành";
-
-/* Field label */
-"Glucose" = "Đường huyết";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Thời gian ân huệ kết thúc";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Thời gian ân huệ còn lại";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "CAO";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Kết nối gần đây nhất";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Kết quả đọc gần nhất";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS có thể đọc dữ liệu G7 CGM tuy nhiên bạn nên dùng app của Dexcom G7 để ghép đôi, hiệu chỉnh và quản lý sensor.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "THẤP";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Tên";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan để thay sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Đang quét";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Đang tìm kiếm \n sensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Đang tìm kiếm cảm biến";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\n hết hạn";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\n thất bại";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\n có vấn đề";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\n đang khởi động";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Cảm biến hết hạn";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Cảm biến đã hết hạn";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor hết hạn";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Lỗi cảm biến";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Bắt đầu sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Tín hiệu\n mất";
-
-/* Field label */
-"Time" = "Thời gian";
-
-/* Field label */
-"Trend" = "Xu hướng";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Glucose đang tải lên";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Khởi động hoàn tất";
diff --git a/Dependencies/G7SensorKit/G7SensorKitUI/zh-Hans.lproj/Localizable.strings b/Dependencies/G7SensorKit/G7SensorKitUI/zh-Hans.lproj/Localizable.strings
deleted file mode 100644
index 2111b941b..000000000
--- a/Dependencies/G7SensorKit/G7SensorKitUI/zh-Hans.lproj/Localizable.strings
+++ /dev/null
@@ -1,117 +0,0 @@
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* No comment provided by engineer. */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No comment provided by engineer. */
-"Bluetooth" = "Bluetooth";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "取消";
-
-/* No comment provided by engineer. */
-"Configuration" = "配置";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "已连接";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "正在连接";
-
-/* Button title for starting setup */
-"Continue" = "继续";
-
-/* Button label for removing CGM */
-"Delete CGM" = "删除CGM数据源";
-
-/* Navigation bar title for G7SettingsView
- Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* No comment provided by engineer. */
-"Done" = "完成";
-
-/* Field label */
-"Glucose" = "葡萄糖";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* No comment provided by engineer. */
-"Last Reading" = "Last Reading";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "设备名称";
-
-/* No comment provided by engineer. */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for sensor failed */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Start sensor";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/* Field label */
-"Time" = "时间";
-
-/* Field label */
-"Trend" = "Trend";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
diff --git a/Dependencies/G7SensorKit/G7SensorPlugin/G7SensorPlugin.h b/Dependencies/G7SensorKit/G7SensorPlugin/G7SensorPlugin.h
deleted file mode 100644
index ef99685fa..000000000
--- a/Dependencies/G7SensorKit/G7SensorPlugin/G7SensorPlugin.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// G7SensorPlugin.h
-// G7SensorPlugin
-//
-// Created by Pete Schwamb on 11/11/22.
-//
-
-#import
-
-//! Project version number for G7SensorPlugin.
-FOUNDATION_EXPORT double G7SensorPluginVersionNumber;
-
-//! Project version string for G7SensorPlugin.
-FOUNDATION_EXPORT const unsigned char G7SensorPluginVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import
-
-
diff --git a/Dependencies/G7SensorKit/G7SensorPlugin/G7SensorPlugin.swift b/Dependencies/G7SensorKit/G7SensorPlugin/G7SensorPlugin.swift
deleted file mode 100644
index a2b16ffa1..000000000
--- a/Dependencies/G7SensorKit/G7SensorPlugin/G7SensorPlugin.swift
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// CGMBLEKitG7Plugin.swift
-// CGMBLEKitG7Plugin
-//
-// Created by Pete Schwamb on 9/24/22.
-// Copyright © 2022 LoopKit Authors. All rights reserved.
-//
-
-import os.log
-import LoopKitUI
-import G7SensorKit
-import G7SensorKitUI
-
-class G7SensorPlugin: NSObject, CGMManagerUIPlugin {
- private let log = OSLog(category: "G7Plugin")
-
- public var cgmManagerType: CGMManagerUI.Type? {
- return G7CGMManager.self
- }
-
- override init() {
- super.init()
- log.default("Instantiated")
- }
-}
diff --git a/Dependencies/G7SensorKit/G7SensorPlugin/Info.plist b/Dependencies/G7SensorKit/G7SensorPlugin/Info.plist
deleted file mode 100644
index 86c3457b2..000000000
--- a/Dependencies/G7SensorKit/G7SensorPlugin/Info.plist
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- $(PRODUCT_BUNDLE_PACKAGE_TYPE)
- CFBundleShortVersionString
- 1.0
- CFBundleVersion
- 1
- NSHumanReadableCopyright
- Copyright © 2019 LoopKit Authors. All rights reserved.
- NSPrincipalClass
- G7SensorPlugin
- com.loopkit.Loop.CGMManagerDisplayName
- Dexcom G7
- com.loopkit.Loop.CGMManagerIdentifier
- G7CGMManager
-
-
diff --git a/Dependencies/G7SensorKit/G7SensorPlugin/OSLog.swift b/Dependencies/G7SensorKit/G7SensorPlugin/OSLog.swift
deleted file mode 100644
index 03224267c..000000000
--- a/Dependencies/G7SensorKit/G7SensorPlugin/OSLog.swift
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// OSLog.swift
-// Loop
-//
-// Copyright © 2017 LoopKit Authors. All rights reserved.
-//
-
-import os.log
-
-
-extension OSLog {
- convenience init(category: String) {
- self.init(subsystem: "org.loopkit.G7SensorPlugin", category: category)
- }
-
- func debug(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .debug, args)
- }
-
- func info(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .info, args)
- }
-
- func `default`(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .default, args)
- }
-
- func error(_ message: StaticString, _ args: CVarArg...) {
- log(message, type: .error, args)
- }
-
- private func log(_ message: StaticString, type: OSLogType, _ args: [CVarArg]) {
- switch args.count {
- case 0:
- os_log(message, log: self, type: type)
- case 1:
- os_log(message, log: self, type: type, args[0])
- case 2:
- os_log(message, log: self, type: type, args[0], args[1])
- case 3:
- os_log(message, log: self, type: type, args[0], args[1], args[2])
- case 4:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3])
- case 5:
- os_log(message, log: self, type: type, args[0], args[1], args[2], args[3], args[4])
- default:
- os_log(message, log: self, type: type, args)
- }
- }
-}
diff --git a/Dependencies/G7SensorKit/README.md b/Dependencies/G7SensorKit/README.md
deleted file mode 100644
index 973711959..000000000
--- a/Dependencies/G7SensorKit/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# Loop Plugin for G7 Sensor
-Requires use of official G7 app
\ No newline at end of file
diff --git a/Dependencies/G7SensorKit/ar.lproj/Localizable.strings b/Dependencies/G7SensorKit/ar.lproj/Localizable.strings
deleted file mode 100644
index cdf9de583..000000000
--- a/Dependencies/G7SensorKit/ar.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Time";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/ca.lproj/Localizable.strings b/Dependencies/G7SensorKit/ca.lproj/Localizable.strings
deleted file mode 100644
index cdf9de583..000000000
--- a/Dependencies/G7SensorKit/ca.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Time";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/da.lproj/Localizable.strings b/Dependencies/G7SensorKit/da.lproj/Localizable.strings
deleted file mode 100644
index d5a287e65..000000000
--- a/Dependencies/G7SensorKit/da.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan læse G7 CGM-data, men du skal stadig bruge Dexcom G7-appen til parring, kalibrering og anden sensorkontrol.";
-
-/* Button title for starting setup */
-"Continue" = "Fortsæt";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Annuller";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukosedata ikke tilgængeligt";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor er OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor er stoppet";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor varmer op";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor udløbet";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor fejlede";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor i ukendt tilstand %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Udløber";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Nådeperiodens Slut";
-
-/* Field label */
-"Glucose" = "Glukose";
-
-"Last Reading" = "Sidste Aflæsning";
-
-"Time" = "Tid";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Navn";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanner";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Tilsluttet";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Tilslutter";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Sidste Forbindelse";
-
-/* Configuration */
-"Configuration" = "Konfiguration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Aflæsninger";
-
-/* Button */
-"Scan for new sensor" = "Scan efter ny sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Slet CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LAV";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HØJ";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Søger efter sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor udløbet";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup fuldfører";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup fuldfører";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor fejlede";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor udløber";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Tilbageværende nådeperiode";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Søger efter\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nUdløbet";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFejlede";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signaltab";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nProblem";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/de.lproj/Localizable.strings b/Dependencies/G7SensorKit/de.lproj/Localizable.strings
deleted file mode 100644
index ac6fad5f7..000000000
--- a/Dependencies/G7SensorKit/de.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kann CGM Daten direkt vom G7 lesen. Zum Verbinden, Kalibrieren und erweitertes Sensor Management benötigt man die G7 App.";
-
-/* Button title for starting setup */
-"Continue" = "Fortsetzen";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Abbrechen";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glukosewerte sind nicht verfügbar";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor ist OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor ist gestoppt";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor ist in der Aufwärmphase";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor abgelaufen";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensorfehler";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor ist in unbekanntem Zustand %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensorstart";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Ablaufdatum";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Ende der Karenzfrist";
-
-/* Field label */
-"Glucose" = "Blutzucker";
-
-"Last Reading" = "Letzte Messung";
-
-"Time" = "Uhrzeit";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scannt";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Verbunden";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Verbinden";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Letzte Verbindung";
-
-/* Configuration */
-"Configuration" = "Konfiguration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Werte hochladen";
-
-/* Button */
-"Scan for new sensor" = "Nach neuem Sensor suchen";
-
-/* Button label for removing CGM */
-"Delete CGM" = "CGM löschen";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "NIEDRIG";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HOCH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Suche nach Sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor abgelaufen";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Aufwärmphase abgeschlossen";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Aufwärmphase abgeschlossen";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensorfehler";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor abgelaufen";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Verbleibende Karenzfrist";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Suche nach\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nabgelaufen";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensorverbindung\nfehlfeschlagen";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nVerlust";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nFehler";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nAufwärmphase";
diff --git a/Dependencies/G7SensorKit/en.lproj/Localizable.strings b/Dependencies/G7SensorKit/en.lproj/Localizable.strings
deleted file mode 100644
index cdf9de583..000000000
--- a/Dependencies/G7SensorKit/en.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Time";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/es.lproj/Localizable.strings b/Dependencies/G7SensorKit/es.lproj/Localizable.strings
deleted file mode 100644
index 785196761..000000000
--- a/Dependencies/G7SensorKit/es.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continuar";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancelar";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Tiempo";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nombre";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Conectado";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Conectando";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuracion";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/fi.lproj/Localizable.strings b/Dependencies/G7SensorKit/fi.lproj/Localizable.strings
deleted file mode 100644
index d005f6a54..000000000
--- a/Dependencies/G7SensorKit/fi.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Jatka";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Time";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Yhdistetty";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Yhdistetään";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/fr.lproj/Localizable.strings b/Dependencies/G7SensorKit/fr.lproj/Localizable.strings
deleted file mode 100644
index f29a56106..000000000
--- a/Dependencies/G7SensorKit/fr.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS peut lire les données G7 de la CGM mais vous devez toujours utiliser l'application Dexcom G7 pour associer, calibrer et gérer les capteurs.";
-
-/* Button title for starting setup */
-"Continue" = "Continuer";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Annuler";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Les données de glycémie ne sont pas disponibles";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Capteur est OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Le capteur est arrêté";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Capteur est en période de réchauffement";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Capteur expiré";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Capteura échoué";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Le capteur est dans un état inconnu %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Capteur démarré";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Capteur expiré";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Fin de la Période de Grâce";
-
-/* Field label */
-"Glucose" = "Glycémie";
-
-"Last Reading" = "Dernière lecture";
-
-"Time" = "Heure";
-
-"Trend" = "Tendance";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nom";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Balayage";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connecté";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "De liaison";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Dernière Connexion";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Envoyer les données";
-
-/* Button */
-"Scan for new sensor" = "Rechercher un nouveau capteur";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Supprimer CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "BAS";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HAUT";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Recherche d’un capteur";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Capteur expiré";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "L'échauffement est terminé";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "L'échauffement est terminé";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Capteura échoué";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Capteur expiré";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Période de grâce restante";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Recherche d'un\ncapteur";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Capteur\n expiré";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Capteur\na échoué";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nPerte";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Capteur\nproblème";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Capteur\nRéchauffement";
diff --git a/Dependencies/G7SensorKit/he.lproj/Localizable.strings b/Dependencies/G7SensorKit/he.lproj/Localizable.strings
deleted file mode 100644
index 635c45190..000000000
--- a/Dependencies/G7SensorKit/he.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Time";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "מחובר";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "מתחבר";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/hu.lproj/Localizable.strings b/Dependencies/G7SensorKit/hu.lproj/Localizable.strings
deleted file mode 100644
index 8e190c619..000000000
--- a/Dependencies/G7SensorKit/hu.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Mégse";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glükóz";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Idő";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Megnevezés";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Beállítások";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "CGM kitörlése";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/it.lproj/Localizable.strings b/Dependencies/G7SensorKit/it.lproj/Localizable.strings
deleted file mode 100644
index 1c5734119..000000000
--- a/Dependencies/G7SensorKit/it.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS è in grado di leggere i dati CGM di G7, ma è comunque necessario utilizzare l'App Dexcom G7 per l'accoppiamento, la calibrazione e la gestione di altri sensori.";
-
-/* Button title for starting setup */
-"Continue" = "Continua";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancella";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "I dati della glicemia non sono disponibili";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Il sensore è OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Il sensore è arrestato";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Il sensore è in fase di avvio";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensore scaduto";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensore fallito";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Il Sensore è in un stato %1$d sconosciuto";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Avvia sensore";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Scadenza Sensore";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Fine periodo di tolleranza";
-
-/* Field label */
-"Glucose" = "Glucosio";
-
-"Last Reading" = "Ultima lettura";
-
-"Time" = "Tempo";
-
-"Trend" = "Tendenza";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nome";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Lettura";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Collegato";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "In collegamento";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Ultima Connessione";
-
-/* Configuration */
-"Configuration" = "Impostazioni";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Carica Letture";
-
-/* Button */
-"Scan for new sensor" = "Scansiona per nuovo sensore";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Elimina CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "BASSO";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "ALTO";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/minuto";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Ricerca del sensore in corso";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensore scaduto";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Avvio completato";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Avvio completato";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensore fallito";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Il sensore scade";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Periodo di tolleranza residuo";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Ricerca del sensore \n";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensore \n scaduto";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensore \n Fallito";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Perdita segnale \n";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Problema al sensore \n";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Riscaldamento sensore \n";
diff --git a/Dependencies/G7SensorKit/ja.lproj/Localizable.strings b/Dependencies/G7SensorKit/ja.lproj/Localizable.strings
deleted file mode 100644
index 259def8e7..000000000
--- a/Dependencies/G7SensorKit/ja.lproj/Localizable.strings
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancel";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Time";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* Button text */
-"Are you sure you want to delete this CGM?" = "Are you sure you want to delete this CGM?";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/nb.lproj/Localizable.strings b/Dependencies/G7SensorKit/nb.lproj/Localizable.strings
deleted file mode 100644
index fd47dece6..000000000
--- a/Dependencies/G7SensorKit/nb.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan lese data fra Dexcom G7, men du må fremdeles bruke Dexcom G7-appen for å koble til sender, kalibrere og andre innstillinger for sensoren.";
-
-/* Button title for starting setup */
-"Continue" = "Fortsett";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Avbryt";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Blodsukker er utilgjengelig";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensoren er OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensoren er stoppet";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensoren varmer opp";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensoren er utløpt";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensoren feilet";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensoren har ukjent tilstand %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensorstart";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor utløper";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Slutt på utsettelsesperiode";
-
-/* Field label */
-"Glucose" = "Blodsukker";
-
-"Last Reading" = "Siste måling";
-
-"Time" = "Tidspunkt";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Navn";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Skanner";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Tilkoblet";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Kobler til";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Siste tilkobling";
-
-/* Configuration */
-"Configuration" = "Oppsett";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Last opp avlesninger";
-
-/* Button */
-"Scan for new sensor" = "Søk etter ny sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Slett CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LAVT";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HØYT";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Søker etter sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensoren er utløpt";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Oppvarming fullført";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Oppvarming fullført";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensoren feilet";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor utløper";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Utsettelsesperiode som gjenstår";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Søker etter\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nUtløpt";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFeilet";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nTapt";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nFeil";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nOppvarming";
diff --git a/Dependencies/G7SensorKit/nl.lproj/Localizable.strings b/Dependencies/G7SensorKit/nl.lproj/Localizable.strings
deleted file mode 100644
index 7075fed78..000000000
--- a/Dependencies/G7SensorKit/nl.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan G7 CGM-gegevens lezen, maar je moet nog steeds de Dexcom G7 App gebruiken voor koppeling, kalibratie en ander sensorbeheer.";
-
-/* Button title for starting setup */
-"Continue" = "Vervolg";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Annuleer";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose gegevens niet beschikbaar";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is ok";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is gestopt";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is aan het opwarmen";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor verlopen";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor mislukt";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Senor is in onbekende status %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor verloopt";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Einde coulance periode";
-
-/* Field label */
-"Glucose" = "Glucosewaarde";
-
-"Last Reading" = "Laatste stand";
-
-"Time" = "Tijd";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluethooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Naam";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Aan het scannen";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Verbonden";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Verbinden";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Laatste connectie";
-
-/* Configuration */
-"Configuration" = "Instellingen";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Lezingen uploaden";
-
-/* Button */
-"Scan for new sensor" = "Nieuwe sensor aan het scannen";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Verwijder CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LAAG";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HOOG";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Sensor aan het zoeken";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor verlopen";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Opwarmen voltooid";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Opwarmen voltooid";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor mislukt";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor verloopt";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Resterende coulance periode";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Zoeken naar\nsensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nverlopen";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nmislukt";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signaal\nverlies";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nprobleem";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nopwarmen";
diff --git a/Dependencies/G7SensorKit/pl.lproj/Localizable.strings b/Dependencies/G7SensorKit/pl.lproj/Localizable.strings
deleted file mode 100644
index 789376a3e..000000000
--- a/Dependencies/G7SensorKit/pl.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Kontynuuj";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Anuluj";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Czas";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Name";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Połączony";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Łączenie";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Configuration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/pt-BR.lproj/Localizable.strings b/Dependencies/G7SensorKit/pt-BR.lproj/Localizable.strings
deleted file mode 100644
index f4e2108d7..000000000
--- a/Dependencies/G7SensorKit/pt-BR.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continuar";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancelar";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glicose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Hora";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nome";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Conectado";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Conectando";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Ajustes";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/pt-PT.lproj/Localizable.strings b/Dependencies/G7SensorKit/pt-PT.lproj/Localizable.strings
deleted file mode 100644
index bf6dfb9eb..000000000
--- a/Dependencies/G7SensorKit/pt-PT.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "Continue";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Cancelar";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "Glucose";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "Hora";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Nome";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Connected";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Connecting";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "Ajustes";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Delete CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/G7SensorKit/ru.lproj/Localizable.strings b/Dependencies/G7SensorKit/ru.lproj/Localizable.strings
deleted file mode 100644
index b480fd5d7..000000000
--- a/Dependencies/G7SensorKit/ru.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS может считывать G7 CGM данные, но Вы все равно должны использовать Dexcom G7 App для сопряжения, калибровки и управления датчиком.";
-
-/* Button title for starting setup */
-"Continue" = "Продолжить";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Отмена";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Данные глюкозы недоступны";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Датчик ОК";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Датчик остановлен";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Датчик прогревается";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Срок действия датчика истек";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Сбой датчика";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Датчик находится в неизвестном состоянии %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Старт датчика";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Датчик истекает";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Период отсрочки";
-
-/* Field label */
-"Glucose" = "Глюкоза";
-
-"Last Reading" = "Последнее считывание";
-
-"Time" = "Время";
-
-"Trend" = "Тенденция";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Название";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Сканирование";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Соединение установлено";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Соединяется";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Последнее подключение";
-
-/* Configuration */
-"Configuration" = "Конфигурация";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Выгружать данные";
-
-/* Button */
-"Scan for new sensor" = "Сканирование нового датчика";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Удалить CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "НИЗКИЙ";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "ВЫСОКИЙ";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/мин";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Поиск датчика";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Срок действия датчика истек";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Прогрев завершается";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Прогрев завершается";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Сбой датчика";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Датчик заканчивается";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Оставшийся период отсрочки";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Поиск\nДатчика";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Датчик\nИстек";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Датчик\nСбой";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Сигнал\nПотерян";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Датчик\nПроблема";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Датчик\nПрогрев";
diff --git a/Dependencies/G7SensorKit/sk.lproj/Localizable.strings b/Dependencies/G7SensorKit/sk.lproj/Localizable.strings
deleted file mode 100644
index ce08bc035..000000000
--- a/Dependencies/G7SensorKit/sk.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS dokáže čítať dáta z G7 CGM, ale stále musíte používať aplikáciu Dexcom G7 na párovanie, kalibráciu a ďalšiu správu senzora.";
-
-/* Button title for starting setup */
-"Continue" = "Pokračovať";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Zrušiť";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Dáta o hladine glukózy nie sú k dispozícii";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Senzor pracuje správne";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Senzor je zastavený";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Senzor sa zahrieva";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Senzor exspiroval";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Senzor zlyhal";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Senzor je v neznámom stave %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Čas zavedenia";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Senzor exspiruje";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Dodatočná doba na výmenu senzoru končí";
-
-/* Field label */
-"Glucose" = "Glykémia";
-
-"Last Reading" = "Posledná hodnota";
-
-"Time" = "Čas";
-
-"Trend" = "Vývoj";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Názov";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Skenuje sa";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Pripojený";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Pripája sa";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Posledné spojenie";
-
-/* Configuration */
-"Configuration" = "Nastavenie";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Nahrať merania";
-
-/* Button */
-"Scan for new sensor" = "Načítať nový senzor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Odstrániť senzor";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "NÍZKE";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "VYSOKÉ";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Vyhľadávam nový senzor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Senzor exspiroval";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Zahrievanie senzora dokončené";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Zahrievanie senzora dokončené";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Senzor zlyhal";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Senzor exspiruje";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Zostávajúce predĺžené obdobie";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Vyhľadávam\nsenzor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Senzor\nexspiroval";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Senzor\nzlyhal";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Strata\nsignálu";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Problém\nsenzoru";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Zahrievanie\nsenzoru";
diff --git a/Dependencies/G7SensorKit/sv.lproj/Localizable.strings b/Dependencies/G7SensorKit/sv.lproj/Localizable.strings
deleted file mode 100644
index aa32dbf3d..000000000
--- a/Dependencies/G7SensorKit/sv.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS kan läsa G7 CGM-värden, men du måste alltjämt använda Dexcom G7-appen för parkoppling, kalibrering samt hantering av sensorn.";
-
-/* Button title for starting setup */
-"Continue" = "Fortsätt";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Avbryt";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Inga blodglukosdata tillgängliga";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensorn är OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensorn har stoppats";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensorn värms upp";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensorns livslängd är slut";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensorn är felaktig";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensorstatus okänd %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensorstart";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensorns utgångsdatum";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Slut av livslängd";
-
-/* Field label */
-"Glucose" = "Glukos";
-
-"Last Reading" = "Senaste avläsning";
-
-"Time" = "Tid";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Namn";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Skannar";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Ansluten";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Ansluter";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Senaste anslutning";
-
-/* Configuration */
-"Configuration" = "Konfiguration";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Ladda upp blodsocker";
-
-/* Button */
-"Scan for new sensor" = "Skanna efter ny sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Radera CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LÅGT";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HÖGT";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Söker efter sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensorns livslängd är slut";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Uppvärming av sensor";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Uppvärming av sensor";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensorn är felaktig";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensorn går ut";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Tid kvar av sensors livslängd";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Söker efter\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nUtgått";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nmisslyckades";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal-\nförlust";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nProblem";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nUppvärmning";
diff --git a/Dependencies/G7SensorKit/tr.lproj/Localizable.strings b/Dependencies/G7SensorKit/tr.lproj/Localizable.strings
deleted file mode 100644
index b80812dfc..000000000
--- a/Dependencies/G7SensorKit/tr.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS, G7 CGM verilerini okuyabilir ancak yine de eşleştirme, kalibrasyon ve diğer sensör yönetimi için Dexcom G7 Uygulamasını kullanmanız gerekir.";
-
-/* Button title for starting setup */
-"Continue" = "Devam et";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Vazgeç";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glikoz verileri kullanılamıyor";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensör TAMAM";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensör durduruldu";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensör ısınıyor";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensör süresi doldu";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensör arızalı";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensör bilinmeyen durumda %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensörü Başlat";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensör Süre Sonu";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Yetkisiz Kullanım Sonu";
-
-/* Field label */
-"Glucose" = "Glikoz";
-
-"Last Reading" = "Son Okuma Değeri";
-
-"Time" = "Saat";
-
-"Trend" = "Eğilim";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "İsim";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Taranıyor";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Bağlandı";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Bağlanıyor";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Son Bağlantı";
-
-/* Configuration */
-"Configuration" = "Yapılandırma";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Okumaları Yükle";
-
-/* Button */
-"Scan for new sensor" = "Yeni sensör için tara";
-
-/* Button label for removing CGM */
-"Delete CGM" = "CGM'i Sil";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "DÜŞÜK";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "YÜKSEK";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/dak";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Sensör aranıyor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensör süresi doldu";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Isınma tamamlandı";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Isınma tamamlandı";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensör arızalı";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensör süresi doluyor";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Kalan ek süre";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Sensör\nAranıyor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensör\nSüresi Doldu";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensör\nArızalı";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Sinyal\nKaybı";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensör\nSorunu";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensör\nIsınıyor";
diff --git a/Dependencies/G7SensorKit/uk.lproj/Localizable.strings b/Dependencies/G7SensorKit/uk.lproj/Localizable.strings
deleted file mode 100644
index b36b92942..000000000
--- a/Dependencies/G7SensorKit/uk.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS може читати дані G7 CGM, але ви все одно повинні використовувати додаток Dexcom G7 для парування, калібрування та іншого управління сенсором.";
-
-/* Button title for starting setup */
-"Continue" = "Продовжити";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Відмінити";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Дані глюкози недоступні";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Сенсор підключено";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Сенсор зупинений";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Сенсор прогрівається";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Термін Сенсору закінчився";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Не вдалося встановити Сенсор";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Сенсор знаходиться в невідомому стані%1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Старт Сенсора моніторингу";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Термін дії Сенсору";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Час до блокування";
-
-/* Field label */
-"Glucose" = "Глюкоза";
-
-"Last Reading" = "Останнє читання";
-
-"Time" = "Час";
-
-"Trend" = "Тренди";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Ім’я";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Сканування";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Під'єднаний";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Під'єднання";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Останнє підключення";
-
-/* Configuration */
-"Configuration" = "Налаштування";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Вивантажити читання";
-
-/* Button */
-"Scan for new sensor" = "Сканувати новий Сенсор";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Видалити CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "НИЗЬКИЙ";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "ВИСОКИЙ";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/хв";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Пошук Сенсору";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Термін Сенсору закінчився";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Прогрів виконано";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Прогрів виконано";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Не вдалося встановити Сенсор";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Сенсор закінчується";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Період витонченості, що залишився";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Пошук\nСенсору";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Сенсор\nЗакінчився";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Сенсори\nНе вдалося";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Сигнал\nВтрата";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Сенсор\nПроблема";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Сенсор\nПрогрів";
diff --git a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings b/Dependencies/G7SensorKit/vi.lproj/Localizable.strings
deleted file mode 100644
index 917eec144..000000000
--- a/Dependencies/G7SensorKit/vi.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS có thể đọc dữ liệu G7 CGM tuy nhiên bạn nên dùng app của Dexcom G7 để ghép đôi, hiệu chỉnh và quản lý sensor.";
-
-/* Button title for starting setup */
-"Continue" = "Tiếp tục";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "Bỏ qua";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Dữ liệu đường huyết không có sẵn";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Cảm biến đã dừng hoạt động";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Cảm biến đang khởi động";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Cảm biến đã hết hạn";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Lỗi cảm biến";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Trạng thái cảm biến không xác định %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Khởi động Cảm biến";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Cảm biến hết hạn";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Thời gian ân huệ kết thúc";
-
-/* Field label */
-"Glucose" = "Đường huyết";
-
-"Last Reading" = "Kết quả đọc gần nhất";
-
-"Time" = "Thời gian";
-
-"Trend" = "Xu hướng Glucose";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "Tên";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Đang quét";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "Đã kết nối";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "Đang kết nối";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Kết nối gần đây nhất";
-
-/* Configuration */
-"Configuration" = "Cấu hình";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Glucose đang tải lên";
-
-/* Button */
-"Scan for new sensor" = "Scan để thay sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "Xoá CGM";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "THẤP";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "CAO";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/phút";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Đang tìm kiếm cảm biến";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Cảm biến đã hết hạn";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Khởi động hoàn tất";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Khởi động hoàn tất";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Lỗi cảm biến";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor hết hạn";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Thời gian ân huệ còn lại";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Đang tìm kiếm \n sensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\n hết hạn";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\n thất bại";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Tín hiệu\n mất";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\n có vấn đề";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\n đang khởi động";
diff --git a/Dependencies/G7SensorKit/zh-Hans.lproj/Localizable.strings b/Dependencies/G7SensorKit/zh-Hans.lproj/Localizable.strings
deleted file mode 100644
index 06ecefda0..000000000
--- a/Dependencies/G7SensorKit/zh-Hans.lproj/Localizable.strings
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Title on WelcomeView */
-"Dexcom G7" = "Dexcom G7";
-
-/* Descriptive text on G7StartupView */
-"iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management." = "iAPS can read G7 CGM data, but you must still use the Dexcom G7 App for pairing, calibration, and other sensor management.";
-
-/* Button title for starting setup */
-"Continue" = "继续";
-
-/* Button text to cancel G7 setup */
-"Cancel" = "取消";
-
-/* Error description for unreliable state */
-"Glucose data is unavailable" = "Glucose data is unavailable";
-
-/* The description of sensor algorithm state when sensor is ok. */
-"Sensor is OK" = "Sensor is OK";
-
-/* The description of sensor algorithm state when sensor is stopped." */
-"Sensor is stopped" = "Sensor is stopped";
-
-/* The description of sensor algorithm state when sensor is warming up. */
-"Sensor is warming up" = "Sensor is warming up";
-
-/* The description of sensor algorithm state when sensor is expired. */
-"Sensor expired" = "Sensor expired";
-
-/* The description of sensor algorithm state when sensor failed. */
-"Sensor failed" = "Sensor failed";
-
-/* The description of sensor algorithm state when raw value is unknown. (1: missing data details) */
-"Sensor is in unknown state %1$d" = "Sensor is in unknown state %1$d";
-
-/* title for g7 settings row showing sensor start time */
-"Sensor Start" = "Sensor Start";
-
-/* title for g7 settings row showing sensor expiration time */
-"Sensor Expiration" = "Sensor Expiration";
-
-/* title for g7 settings row showing sensor grace period end time */
-"Grace Period End" = "Grace Period End";
-
-/* Field label */
-"Glucose" = "葡萄糖";
-
-"Last Reading" = "Last Reading";
-
-"Time" = "时间";
-
-"Trend" = "Trend";
-
-"Bluetooth" = "Bluetooth";
-
-/* title for g7 settings row showing BLE Name */
-"Name" = "设备名称";
-
-/* title for g7 settings connection status when scanning */
-"Scanning" = "Scanning";
-
-/* title for g7 settings connection status when connected */
-"Connected" = "已连接";
-
-/* title for g7 settings connection status when connecting */
-"Connecting" = "正在连接";
-
-/* title for g7 settings row showing sensor last connect time */
-"Last Connect" = "Last Connect";
-
-/* Configuration */
-"Configuration" = "配置";
-
-/* title for g7 config settings to upload readings */
-"Upload Readings" = "Upload Readings";
-
-/* Button */
-"Scan for new sensor" = "Scan for new sensor";
-
-/* Button label for removing CGM */
-"Delete CGM" = "删除CGM数据源";
-
-/* No glucose value representation (3 dashes for mg/dL) */
-"– – –" = "– – –";
-/* String displayed instead of a glucose value below the CGM range */
-"LOW" = "LOW";
-
-/* String displayed instead of a glucose value above the CGM range */
-"HIGH" = "HIGH";
-
-/* Format string for glucose trend per minute. (1: glucose value and unit) */
-"%@/min" = "%@/min";
-
-/* G7 Progress bar label when searching for sensor */
-"Searching for sensor" = "Searching for sensor";
-
-/* G7 Progress bar label when sensor expired */
-"Sensor expired" = "Sensor expired";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor in warmup */
-"Warmup completes" = "Warmup completes";
-
-/* G7 Progress bar label when sensor failed */
-"Sensor failed" = "Sensor failed";
-
-/* G7 Progress bar label when sensor lifetime progress showing */
-"Sensor expires" = "Sensor expires";
-
-/* G7 Progress bar label when sensor grace period progress showing */
-"Grace period remaining" = "Grace period remaining";
-
-/* G7 Status highlight text for searching for sensor */
-"Searching for\nSensor" = "Searching for\nSensor";
-
-/* G7 Status highlight text for sensor expired */
-"Sensor\nExpired" = "Sensor\nExpired";
-
-/* G7 Status highlight text for signal loss */
-"Sensor\nFailed" = "Sensor\nFailed";
-
-/* G7 Status highlight text for signal loss */
-"Signal\nLoss" = "Signal\nLoss";
-
-/*G7 Status highlight text for sensor error */
-"Sensor\nIssue" = "Sensor\nIssue";
-
-/* G7 Status highlight text for sensor warmup */
-"Sensor\nWarmup" = "Sensor\nWarmup";
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.pbxproj b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.pbxproj
deleted file mode 100644
index 403d0eee1..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,388 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 55;
- objects = {
-
-/* Begin PBXBuildFile section */
- 38567101272C4E39002C4DD8 /* LibreTramsmitterExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38567100272C4E39002C4DD8 /* LibreTramsmitterExampleApp.swift */; };
- 38567103272C4E39002C4DD8 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38567102272C4E39002C4DD8 /* ContentView.swift */; };
- 38567105272C4E3B002C4DD8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 38567104272C4E3B002C4DD8 /* Assets.xcassets */; };
- 38567108272C4E3B002C4DD8 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 38567107272C4E3B002C4DD8 /* Preview Assets.xcassets */; };
- 3856711B272C51A3002C4DD8 /* LibreTransmitter in Frameworks */ = {isa = PBXBuildFile; productRef = 3856711A272C51A3002C4DD8 /* LibreTransmitter */; };
- 38FEF403273AE2E300574A46 /* StateModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38FEF402273AE2E300574A46 /* StateModel.swift */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXFileReference section */
- 385670FD272C4E39002C4DD8 /* LibreTramsmitterExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LibreTramsmitterExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 38567100272C4E39002C4DD8 /* LibreTramsmitterExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibreTramsmitterExampleApp.swift; sourceTree = ""; };
- 38567102272C4E39002C4DD8 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
- 38567104272C4E3B002C4DD8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
- 38567107272C4E3B002C4DD8 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
- 38567118272C5173002C4DD8 /* LibreTransmitter */ = {isa = PBXFileReference; lastKnownFileType = folder; name = LibreTransmitter; path = ..; sourceTree = ""; };
- 3856711C272C5281002C4DD8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; };
- 38FEF3FF2739509400574A46 /* LibreTramsmitterExample.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = LibreTramsmitterExample.entitlements; sourceTree = ""; };
- 38FEF402273AE2E300574A46 /* StateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateModel.swift; sourceTree = ""; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 385670FA272C4E39002C4DD8 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3856711B272C51A3002C4DD8 /* LibreTransmitter in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 3818AA43274BFE8A00843DB3 /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- );
- name = Frameworks;
- sourceTree = "";
- };
- 385670F4272C4E39002C4DD8 = {
- isa = PBXGroup;
- children = (
- 385670FF272C4E39002C4DD8 /* LibreTramsmitterExample */,
- 38567116272C5115002C4DD8 /* Packages */,
- 385670FE272C4E39002C4DD8 /* Products */,
- 3818AA43274BFE8A00843DB3 /* Frameworks */,
- );
- sourceTree = "";
- };
- 385670FE272C4E39002C4DD8 /* Products */ = {
- isa = PBXGroup;
- children = (
- 385670FD272C4E39002C4DD8 /* LibreTramsmitterExample.app */,
- );
- name = Products;
- sourceTree = "";
- };
- 385670FF272C4E39002C4DD8 /* LibreTramsmitterExample */ = {
- isa = PBXGroup;
- children = (
- 38FEF3FF2739509400574A46 /* LibreTramsmitterExample.entitlements */,
- 3856711C272C5281002C4DD8 /* Info.plist */,
- 38567102272C4E39002C4DD8 /* ContentView.swift */,
- 38567100272C4E39002C4DD8 /* LibreTramsmitterExampleApp.swift */,
- 38567104272C4E3B002C4DD8 /* Assets.xcassets */,
- 38567106272C4E3B002C4DD8 /* Preview Content */,
- 38FEF402273AE2E300574A46 /* StateModel.swift */,
- );
- path = LibreTramsmitterExample;
- sourceTree = "";
- };
- 38567106272C4E3B002C4DD8 /* Preview Content */ = {
- isa = PBXGroup;
- children = (
- 38567107272C4E3B002C4DD8 /* Preview Assets.xcassets */,
- );
- path = "Preview Content";
- sourceTree = "";
- };
- 38567116272C5115002C4DD8 /* Packages */ = {
- isa = PBXGroup;
- children = (
- 38567118272C5173002C4DD8 /* LibreTransmitter */,
- );
- name = Packages;
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 385670FC272C4E39002C4DD8 /* LibreTramsmitterExample */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 3856710B272C4E3B002C4DD8 /* Build configuration list for PBXNativeTarget "LibreTramsmitterExample" */;
- buildPhases = (
- 385670F9272C4E39002C4DD8 /* Sources */,
- 385670FA272C4E39002C4DD8 /* Frameworks */,
- 385670FB272C4E39002C4DD8 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = LibreTramsmitterExample;
- packageProductDependencies = (
- 3856711A272C51A3002C4DD8 /* LibreTransmitter */,
- );
- productName = LibreTramsmitterExample;
- productReference = 385670FD272C4E39002C4DD8 /* LibreTramsmitterExample.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 385670F5272C4E39002C4DD8 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- BuildIndependentTargetsInParallel = 1;
- LastSwiftUpdateCheck = 1310;
- LastUpgradeCheck = 1310;
- TargetAttributes = {
- 385670FC272C4E39002C4DD8 = {
- CreatedOnToolsVersion = 13.1;
- };
- };
- };
- buildConfigurationList = 385670F8272C4E39002C4DD8 /* Build configuration list for PBXProject "LibreTramsmitterExample" */;
- compatibilityVersion = "Xcode 13.0";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 385670F4272C4E39002C4DD8;
- productRefGroup = 385670FE272C4E39002C4DD8 /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 385670FC272C4E39002C4DD8 /* LibreTramsmitterExample */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 385670FB272C4E39002C4DD8 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 38567108272C4E3B002C4DD8 /* Preview Assets.xcassets in Resources */,
- 38567105272C4E3B002C4DD8 /* Assets.xcassets in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 385670F9272C4E39002C4DD8 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 38FEF403273AE2E300574A46 /* StateModel.swift in Sources */,
- 38567103272C4E39002C4DD8 /* ContentView.swift in Sources */,
- 38567101272C4E39002C4DD8 /* LibreTramsmitterExampleApp.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin XCBuildConfiguration section */
- 38567109272C4E3B002C4DD8 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 15.0;
- MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
- MTL_FAST_MATH = YES;
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = iphoneos;
- SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- };
- name = Debug;
- };
- 3856710A272C4E3B002C4DD8 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu11;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 15.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- MTL_FAST_MATH = YES;
- SDKROOT = iphoneos;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 3856710C272C4E3B002C4DD8 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- CODE_SIGN_ENTITLEMENTS = LibreTramsmitterExample/LibreTramsmitterExample.entitlements;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_ASSET_PATHS = "\"LibreTramsmitterExample/Preview Content\"";
- DEVELOPMENT_TEAM = BA7ZHP4963;
- ENABLE_PREVIEWS = YES;
- GENERATE_INFOPLIST_FILE = NO;
- INFOPLIST_FILE = LibreTramsmitterExample/Info.plist;
- INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
- INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
- INFOPLIST_KEY_UILaunchScreen_Generation = YES;
- INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
- INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = ru.artpancreas.LibreTramsmitterExample;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- 3856710D272C4E3B002C4DD8 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- CODE_SIGN_ENTITLEMENTS = LibreTramsmitterExample/LibreTramsmitterExample.entitlements;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_ASSET_PATHS = "\"LibreTramsmitterExample/Preview Content\"";
- DEVELOPMENT_TEAM = BA7ZHP4963;
- ENABLE_PREVIEWS = YES;
- GENERATE_INFOPLIST_FILE = NO;
- INFOPLIST_FILE = LibreTramsmitterExample/Info.plist;
- INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
- INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
- INFOPLIST_KEY_UILaunchScreen_Generation = YES;
- INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
- INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = ru.artpancreas.LibreTramsmitterExample;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 385670F8272C4E39002C4DD8 /* Build configuration list for PBXProject "LibreTramsmitterExample" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 38567109272C4E3B002C4DD8 /* Debug */,
- 3856710A272C4E3B002C4DD8 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 3856710B272C4E3B002C4DD8 /* Build configuration list for PBXNativeTarget "LibreTramsmitterExample" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3856710C272C4E3B002C4DD8 /* Debug */,
- 3856710D272C4E3B002C4DD8 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
-
-/* Begin XCSwiftPackageProductDependency section */
- 3856711A272C51A3002C4DD8 /* LibreTransmitter */ = {
- isa = XCSwiftPackageProductDependency;
- productName = LibreTransmitter;
- };
-/* End XCSwiftPackageProductDependency section */
- };
- rootObject = 385670F5272C4E39002C4DD8 /* Project object */;
-}
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 919434a62..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d981003..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/AccentColor.colorset/Contents.json b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/AccentColor.colorset/Contents.json
deleted file mode 100644
index eb8789700..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/AccentColor.colorset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "colors" : [
- {
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 9221b9bb1..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "20x20"
- },
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "29x29"
- },
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "40x40"
- },
- {
- "idiom" : "iphone",
- "scale" : "2x",
- "size" : "60x60"
- },
- {
- "idiom" : "iphone",
- "scale" : "3x",
- "size" : "60x60"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "20x20"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "20x20"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "29x29"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "29x29"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "40x40"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "40x40"
- },
- {
- "idiom" : "ipad",
- "scale" : "1x",
- "size" : "76x76"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "76x76"
- },
- {
- "idiom" : "ipad",
- "scale" : "2x",
- "size" : "83.5x83.5"
- },
- {
- "idiom" : "ios-marketing",
- "scale" : "1x",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/Contents.json b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/Contents.json
deleted file mode 100644
index 73c00596a..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Assets.xcassets/Contents.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/ContentView.swift b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/ContentView.swift
deleted file mode 100644
index 92b981b8c..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/ContentView.swift
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// ContentView.swift
-// LibreTramsmitterExample
-//
-// Created by Ivan Valkou on 29.10.2021.
-//
-
-import SwiftUI
-import LibreTransmitter
-import HealthKit
-
-struct ContentView: View {
- @StateObject var state = StateModel()
-
- @State var manager: LibreTransmitterManager? {
- didSet {
- manager?.cgmManagerDelegate = state
- }
- }
-
- @State var setupPresented = false
- @State var settingsPresented = false
- @AppStorage("LibreTransmitterManager.configured") var configured = false
-
- let unit = HKUnit.moleUnit(with: .milli, molarMass: HKUnitMolarMassBloodGlucose).unitDivided(by: .liter())
-
- var body: some View {
- VStack(spacing: 50) {
- Text("\(state.currentGlucose?.glucoseDouble ?? .nan)")
- Text("\(state.trend.symbol)")
-
- Button("Libre Transmitter") {
- setupPresented = true
- }
-
- Button("Test alert sound") {
- NotificationHelper.playSoundIfNeeded()
- }
- }
- .sheet(isPresented: $setupPresented) {} content: {
- if configured, let manager = manager {
- LibreTransmitterSettingsView(
- manager: manager,
- glucoseUnit: unit) {
- self.manager = nil
- configured = false
- } completion: {
- setupPresented = false
- }
-
- } else {
- LibreTransmitterSetupView { manager in
- self.manager = manager
- configured = true
- } completion: {
- setupPresented = false
- }
- }
- }
- .onAppear {
- if configured {
- manager = LibreTransmitterManager()
- }
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Info.plist b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Info.plist
deleted file mode 100644
index 4619575c3..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Info.plist
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
- NSBluetoothAlwaysUsageDescription
- Because why not
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- $(PRODUCT_NAME)
- CFBundlePackageType
- $(PRODUCT_BUNDLE_PACKAGE_TYPE)
- CFBundleShortVersionString
- $(MARKETING_VERSION)
- CFBundleVersion
- $(CURRENT_PROJECT_VERSION)
- LSRequiresIPhoneOS
-
- UIApplicationSceneManifest
-
- UIApplicationSupportsMultipleScenes
-
-
- UIApplicationSupportsIndirectInputEvents
-
- UIBackgroundModes
-
- bluetooth-central
- bluetooth-peripheral
-
- UILaunchScreen
-
- UILaunchScreen
-
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~iphone
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
-
-
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/LibreTramsmitterExample.entitlements b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/LibreTramsmitterExample.entitlements
deleted file mode 100644
index 1ca50cc82..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/LibreTramsmitterExample.entitlements
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- com.apple.developer.usernotifications.time-sensitive
-
-
-
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/LibreTramsmitterExampleApp.swift b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/LibreTramsmitterExampleApp.swift
deleted file mode 100644
index 18f0bda2f..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/LibreTramsmitterExampleApp.swift
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// LibreTramsmitterExampleApp.swift
-// LibreTramsmitterExample
-//
-// Created by Ivan Valkou on 29.10.2021.
-//
-
-import SwiftUI
-
-@main
-struct LibreTramsmitterExampleApp: App {
- var body: some Scene {
- WindowGroup {
- ContentView()
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Preview Content/Preview Assets.xcassets/Contents.json b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Preview Content/Preview Assets.xcassets/Contents.json
deleted file mode 100644
index 73c00596a..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/Preview Content/Preview Assets.xcassets/Contents.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/StateModel.swift b/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/StateModel.swift
deleted file mode 100644
index 44b077724..000000000
--- a/Dependencies/LibreTransmitter/LibreTramsmitterExample/LibreTramsmitterExample/StateModel.swift
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// StateModel.swift
-// LibreTramsmitterExample
-//
-// Created by Ivan Valkou on 09.11.2021.
-//
-
-import SwiftUI
-import LibreTransmitter
-
-final class StateModel: ObservableObject {
- private let delegateQueue = DispatchQueue(label: "StateModel.delegateQueue")
- @Published var currentGlucose: LibreGlucose?
- @Published var trend: GlucoseTrend = .flat
-}
-
-extension StateModel: LibreTransmitterManagerDelegate {
- var queue: DispatchQueue {
- delegateQueue
- }
-
- func startDateToFilterNewData(for: LibreTransmitterManager) -> Date? {
- Date().addingTimeInterval(-3600)
- }
-
- func cgmManager(_ manager: LibreTransmitterManager, hasNew result: Result<[LibreGlucose], Error>) {
- switch result {
-
- case let .success(data):
- print("New data: \(data)")
- DispatchQueue.main.async {
- self.trend = manager.glucoseDisplay?.trendType ?? .flat
- self.currentGlucose = data.first
- }
- case let .failure(error):
- print("Error: \(error.localizedDescription)")
- }
- }
-
- func overcalibration(for: LibreTransmitterManager) -> ((Double) -> (Double))? {
- nil
- }
-}
diff --git a/Dependencies/LibreTransmitter/Package.swift b/Dependencies/LibreTransmitter/Package.swift
deleted file mode 100644
index 37bfde83d..000000000
--- a/Dependencies/LibreTransmitter/Package.swift
+++ /dev/null
@@ -1,28 +0,0 @@
-// swift-tools-version:5.5
-
-import PackageDescription
-
-let package = Package(
- name: "LibreTransmitter",
- platforms: [.iOS(.v14)],
- products: [
- .library(
- name: "LibreTransmitter",
- targets: ["LibreTransmitter"]),
- .library(
- name: "RawGlucose",
- targets: ["RawGlucose"]),
- ],
- dependencies: [],
- targets: [
- .binaryTarget(
- name: "RawGlucose",
- path: "RawGlucose.xcframework"),
- .target(
- name: "LibreTransmitter",
- dependencies: ["RawGlucose"],
- resources: [.process("LibreTransmitterUI/Graphics")]
- )
-
- ]
-)
diff --git a/Dependencies/LibreTransmitter/README.md b/Dependencies/LibreTransmitter/README.md
deleted file mode 100644
index 7e078b032..000000000
--- a/Dependencies/LibreTransmitter/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# LibreTransmitter
-
-A description of this package.
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/Info.plist b/Dependencies/LibreTransmitter/RawGlucose.xcframework/Info.plist
deleted file mode 100644
index bef68fd7c..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/Info.plist
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
- AvailableLibraries
-
-
- LibraryIdentifier
- ios-arm64_x86_64-simulator
- LibraryPath
- RawGlucose.framework
- SupportedArchitectures
-
- arm64
- x86_64
-
- SupportedPlatform
- ios
- SupportedPlatformVariant
- simulator
-
-
- LibraryIdentifier
- ios-arm64
- LibraryPath
- RawGlucose.framework
- SupportedArchitectures
-
- arm64
-
- SupportedPlatform
- ios
-
-
- CFBundlePackageType
- XFWK
- XCFrameworkFormatVersion
- 1.0
-
-
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Headers/RawGlucose-Swift.h b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Headers/RawGlucose-Swift.h
deleted file mode 100644
index ed205baab..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Headers/RawGlucose-Swift.h
+++ /dev/null
@@ -1,212 +0,0 @@
-// Generated by Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-#ifndef RAWGLUCOSE_SWIFT_H
-#define RAWGLUCOSE_SWIFT_H
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wgcc-compat"
-
-#if !defined(__has_include)
-# define __has_include(x) 0
-#endif
-#if !defined(__has_attribute)
-# define __has_attribute(x) 0
-#endif
-#if !defined(__has_feature)
-# define __has_feature(x) 0
-#endif
-#if !defined(__has_warning)
-# define __has_warning(x) 0
-#endif
-
-#if __has_include()
-# include
-#endif
-
-#pragma clang diagnostic ignored "-Wauto-import"
-#include
-#include
-#include
-#include
-
-#if !defined(SWIFT_TYPEDEFS)
-# define SWIFT_TYPEDEFS 1
-# if __has_include()
-# include
-# elif !defined(__cplusplus)
-typedef uint_least16_t char16_t;
-typedef uint_least32_t char32_t;
-# endif
-typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
-typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
-typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
-typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
-typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
-typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
-typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
-typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
-typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
-typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
-typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
-typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
-#endif
-
-#if !defined(SWIFT_PASTE)
-# define SWIFT_PASTE_HELPER(x, y) x##y
-# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
-#endif
-#if !defined(SWIFT_METATYPE)
-# define SWIFT_METATYPE(X) Class
-#endif
-#if !defined(SWIFT_CLASS_PROPERTY)
-# if __has_feature(objc_class_property)
-# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
-# else
-# define SWIFT_CLASS_PROPERTY(...)
-# endif
-#endif
-
-#if __has_attribute(objc_runtime_name)
-# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
-#else
-# define SWIFT_RUNTIME_NAME(X)
-#endif
-#if __has_attribute(swift_name)
-# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
-#else
-# define SWIFT_COMPILE_NAME(X)
-#endif
-#if __has_attribute(objc_method_family)
-# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
-#else
-# define SWIFT_METHOD_FAMILY(X)
-#endif
-#if __has_attribute(noescape)
-# define SWIFT_NOESCAPE __attribute__((noescape))
-#else
-# define SWIFT_NOESCAPE
-#endif
-#if __has_attribute(ns_consumed)
-# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
-#else
-# define SWIFT_RELEASES_ARGUMENT
-#endif
-#if __has_attribute(warn_unused_result)
-# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-#else
-# define SWIFT_WARN_UNUSED_RESULT
-#endif
-#if __has_attribute(noreturn)
-# define SWIFT_NORETURN __attribute__((noreturn))
-#else
-# define SWIFT_NORETURN
-#endif
-#if !defined(SWIFT_CLASS_EXTRA)
-# define SWIFT_CLASS_EXTRA
-#endif
-#if !defined(SWIFT_PROTOCOL_EXTRA)
-# define SWIFT_PROTOCOL_EXTRA
-#endif
-#if !defined(SWIFT_ENUM_EXTRA)
-# define SWIFT_ENUM_EXTRA
-#endif
-#if !defined(SWIFT_CLASS)
-# if __has_attribute(objc_subclassing_restricted)
-# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
-# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# else
-# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# endif
-#endif
-#if !defined(SWIFT_RESILIENT_CLASS)
-# if __has_attribute(objc_class_stub)
-# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
-# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
-# else
-# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
-# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
-# endif
-#endif
-
-#if !defined(SWIFT_PROTOCOL)
-# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
-# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
-#endif
-
-#if !defined(SWIFT_EXTENSION)
-# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
-#endif
-
-#if !defined(OBJC_DESIGNATED_INITIALIZER)
-# if __has_attribute(objc_designated_initializer)
-# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
-# else
-# define OBJC_DESIGNATED_INITIALIZER
-# endif
-#endif
-#if !defined(SWIFT_ENUM_ATTR)
-# if defined(__has_attribute) && __has_attribute(enum_extensibility)
-# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
-# else
-# define SWIFT_ENUM_ATTR(_extensibility)
-# endif
-#endif
-#if !defined(SWIFT_ENUM)
-# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
-# if __has_feature(generalized_swift_name)
-# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
-# else
-# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
-# endif
-#endif
-#if !defined(SWIFT_UNAVAILABLE)
-# define SWIFT_UNAVAILABLE __attribute__((unavailable))
-#endif
-#if !defined(SWIFT_UNAVAILABLE_MSG)
-# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
-#endif
-#if !defined(SWIFT_AVAILABILITY)
-# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
-#endif
-#if !defined(SWIFT_WEAK_IMPORT)
-# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
-#endif
-#if !defined(SWIFT_DEPRECATED)
-# define SWIFT_DEPRECATED __attribute__((deprecated))
-#endif
-#if !defined(SWIFT_DEPRECATED_MSG)
-# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
-#endif
-#if __has_feature(attribute_diagnose_if_objc)
-# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
-#else
-# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
-#endif
-#if !defined(IBSegueAction)
-# define IBSegueAction
-#endif
-#if __has_feature(modules)
-#if __has_warning("-Watimport-in-framework-header")
-#pragma clang diagnostic ignored "-Watimport-in-framework-header"
-#endif
-#endif
-
-#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
-#pragma clang diagnostic ignored "-Wduplicate-method-arg"
-#if __has_warning("-Wpragma-clang-attribute")
-# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
-#endif
-#pragma clang diagnostic ignored "-Wunknown-pragmas"
-#pragma clang diagnostic ignored "-Wnullability"
-
-#if __has_attribute(external_source_symbol)
-# pragma push_macro("any")
-# undef any
-# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RawGlucose",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
-# pragma pop_macro("any")
-#endif
-
-#if __has_attribute(external_source_symbol)
-# pragma clang attribute pop
-#endif
-#pragma clang diagnostic pop
-#endif
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Headers/RawGlucose.h b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Headers/RawGlucose.h
deleted file mode 100644
index 0bb475c6f..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Headers/RawGlucose.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// RawGlucose.h
-// RawGlucose
-//
-// Created by Ivan Valkou on 29.10.2021.
-//
-
-#import
-
-//! Project version number for RawGlucose.
-FOUNDATION_EXPORT double RawGlucoseVersionNumber;
-
-//! Project version string for RawGlucose.
-FOUNDATION_EXPORT const unsigned char RawGlucoseVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import
-
-
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Info.plist b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Info.plist
deleted file mode 100644
index 15d6b27bc..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Info.plist and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftdoc b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftdoc
deleted file mode 100644
index e1bbd9719..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftdoc and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftinterface b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftinterface
deleted file mode 100644
index 8bdb66a37..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftinterface
+++ /dev/null
@@ -1,8 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target arm64-apple-ios14.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name RawGlucose
-import Foundation
-@_exported import RawGlucose
-import Swift
-import _Concurrency
-public func glucoseValueFromRaw(rawTemperature: Swift.Double, rawTemperatureAdjustment: Swift.Double, rawGlucose: Swift.Double, i1: Swift.Int, i2: Swift.Int, i3: Swift.Double, i4: Swift.Double, i5: Swift.Double, i6: Swift.Double) -> Swift.Double
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftdoc b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftdoc
deleted file mode 100644
index e1bbd9719..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftdoc and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftinterface b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftinterface
deleted file mode 100644
index 8bdb66a37..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftinterface
+++ /dev/null
@@ -1,8 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target arm64-apple-ios14.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name RawGlucose
-import Foundation
-@_exported import RawGlucose
-import Swift
-import _Concurrency
-public func glucoseValueFromRaw(rawTemperature: Swift.Double, rawTemperatureAdjustment: Swift.Double, rawGlucose: Swift.Double, i1: Swift.Int, i2: Swift.Int, i3: Swift.Double, i4: Swift.Double, i5: Swift.Double, i6: Swift.Double) -> Swift.Double
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/module.modulemap b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/module.modulemap
deleted file mode 100644
index 73e07f3aa..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/Modules/module.modulemap
+++ /dev/null
@@ -1,11 +0,0 @@
-framework module RawGlucose {
- umbrella header "RawGlucose.h"
-
- export *
- module * { export * }
-}
-
-module RawGlucose.Swift {
- header "RawGlucose-Swift.h"
- requires objc
-}
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/RawGlucose b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/RawGlucose
deleted file mode 100755
index 9f2bdcd45..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/RawGlucose and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/_CodeSignature/CodeResources b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/_CodeSignature/CodeResources
deleted file mode 100644
index 284af541d..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64/RawGlucose.framework/_CodeSignature/CodeResources
+++ /dev/null
@@ -1,201 +0,0 @@
-
-
-
-
- files
-
- Headers/RawGlucose-Swift.h
-
- TbsdmPkVid1MmO08l/+IxleHiDQ=
-
- Headers/RawGlucose.h
-
- e5N6Xw/Q6Ssus1Sfka2OdAgEwfs=
-
- Info.plist
-
- tEul9y3almjw/PjiqgW3W7uKoME=
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftdoc
-
- N3fVe2jpkhUblN1Mys8Q2Qhaa6w=
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftinterface
-
- bDo7yq/Pn9WJy96YLVD14CFqy6k=
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftmodule
-
- VJ11gvKIAReSPnvteZuJ/Zi2lzs=
-
- Modules/RawGlucose.swiftmodule/arm64.swiftdoc
-
- N3fVe2jpkhUblN1Mys8Q2Qhaa6w=
-
- Modules/RawGlucose.swiftmodule/arm64.swiftinterface
-
- bDo7yq/Pn9WJy96YLVD14CFqy6k=
-
- Modules/RawGlucose.swiftmodule/arm64.swiftmodule
-
- VJ11gvKIAReSPnvteZuJ/Zi2lzs=
-
- Modules/module.modulemap
-
- Nbavz/+JmGFVpOq9rrggRbhjo/Y=
-
-
- files2
-
- Headers/RawGlucose-Swift.h
-
- hash2
-
- QTI1cy5YKF3DvEw55SrCA5btCBewRFi+VYIPM8VFMxg=
-
-
- Headers/RawGlucose.h
-
- hash2
-
- vWp1R9C9/5EBlkAhcUZ6DglPTPIL7LdzMYFDrxPPp2w=
-
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftdoc
-
- hash2
-
- KD1y+BgwVATnQ7wQtEbcw5J5sG2J6FDDlUSo2Mc5vbk=
-
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftinterface
-
- hash2
-
- zsjCd1qkk/OvTWr8aJ0L7SbzmnZA7/2pKuTHg3N9cgY=
-
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios.swiftmodule
-
- hash2
-
- 2Az19ev+8tlVF8RvybrcaMdD2qRfiAg2iEOK8NwNN0Q=
-
-
- Modules/RawGlucose.swiftmodule/arm64.swiftdoc
-
- hash2
-
- KD1y+BgwVATnQ7wQtEbcw5J5sG2J6FDDlUSo2Mc5vbk=
-
-
- Modules/RawGlucose.swiftmodule/arm64.swiftinterface
-
- hash2
-
- zsjCd1qkk/OvTWr8aJ0L7SbzmnZA7/2pKuTHg3N9cgY=
-
-
- Modules/RawGlucose.swiftmodule/arm64.swiftmodule
-
- hash2
-
- 2Az19ev+8tlVF8RvybrcaMdD2qRfiAg2iEOK8NwNN0Q=
-
-
- Modules/module.modulemap
-
- hash2
-
- HGSrZF6T2tksU5dqClpOIcyQITvyjJOLdm6TEvIdU7M=
-
-
-
- rules
-
- ^.*
-
- ^.*\.lproj/
-
- optional
-
- weight
- 1000
-
- ^.*\.lproj/locversion.plist$
-
- omit
-
- weight
- 1100
-
- ^Base\.lproj/
-
- weight
- 1010
-
- ^version.plist$
-
-
- rules2
-
- .*\.dSYM($|/)
-
- weight
- 11
-
- ^(.*/)?\.DS_Store$
-
- omit
-
- weight
- 2000
-
- ^.*
-
- ^.*\.lproj/
-
- optional
-
- weight
- 1000
-
- ^.*\.lproj/locversion.plist$
-
- omit
-
- weight
- 1100
-
- ^Base\.lproj/
-
- weight
- 1010
-
- ^Info\.plist$
-
- omit
-
- weight
- 20
-
- ^PkgInfo$
-
- omit
-
- weight
- 20
-
- ^embedded\.provisionprofile$
-
- weight
- 20
-
- ^version\.plist$
-
- weight
- 20
-
-
-
-
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Headers/RawGlucose-Swift.h b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Headers/RawGlucose-Swift.h
deleted file mode 100644
index 3e33d5ed7..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Headers/RawGlucose-Swift.h
+++ /dev/null
@@ -1,430 +0,0 @@
-#if 0
-#elif defined(__arm64__) && __arm64__
-// Generated by Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-#ifndef RAWGLUCOSE_SWIFT_H
-#define RAWGLUCOSE_SWIFT_H
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wgcc-compat"
-
-#if !defined(__has_include)
-# define __has_include(x) 0
-#endif
-#if !defined(__has_attribute)
-# define __has_attribute(x) 0
-#endif
-#if !defined(__has_feature)
-# define __has_feature(x) 0
-#endif
-#if !defined(__has_warning)
-# define __has_warning(x) 0
-#endif
-
-#if __has_include()
-# include
-#endif
-
-#pragma clang diagnostic ignored "-Wauto-import"
-#include
-#include
-#include
-#include
-
-#if !defined(SWIFT_TYPEDEFS)
-# define SWIFT_TYPEDEFS 1
-# if __has_include()
-# include
-# elif !defined(__cplusplus)
-typedef uint_least16_t char16_t;
-typedef uint_least32_t char32_t;
-# endif
-typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
-typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
-typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
-typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
-typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
-typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
-typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
-typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
-typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
-typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
-typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
-typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
-#endif
-
-#if !defined(SWIFT_PASTE)
-# define SWIFT_PASTE_HELPER(x, y) x##y
-# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
-#endif
-#if !defined(SWIFT_METATYPE)
-# define SWIFT_METATYPE(X) Class
-#endif
-#if !defined(SWIFT_CLASS_PROPERTY)
-# if __has_feature(objc_class_property)
-# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
-# else
-# define SWIFT_CLASS_PROPERTY(...)
-# endif
-#endif
-
-#if __has_attribute(objc_runtime_name)
-# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
-#else
-# define SWIFT_RUNTIME_NAME(X)
-#endif
-#if __has_attribute(swift_name)
-# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
-#else
-# define SWIFT_COMPILE_NAME(X)
-#endif
-#if __has_attribute(objc_method_family)
-# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
-#else
-# define SWIFT_METHOD_FAMILY(X)
-#endif
-#if __has_attribute(noescape)
-# define SWIFT_NOESCAPE __attribute__((noescape))
-#else
-# define SWIFT_NOESCAPE
-#endif
-#if __has_attribute(ns_consumed)
-# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
-#else
-# define SWIFT_RELEASES_ARGUMENT
-#endif
-#if __has_attribute(warn_unused_result)
-# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-#else
-# define SWIFT_WARN_UNUSED_RESULT
-#endif
-#if __has_attribute(noreturn)
-# define SWIFT_NORETURN __attribute__((noreturn))
-#else
-# define SWIFT_NORETURN
-#endif
-#if !defined(SWIFT_CLASS_EXTRA)
-# define SWIFT_CLASS_EXTRA
-#endif
-#if !defined(SWIFT_PROTOCOL_EXTRA)
-# define SWIFT_PROTOCOL_EXTRA
-#endif
-#if !defined(SWIFT_ENUM_EXTRA)
-# define SWIFT_ENUM_EXTRA
-#endif
-#if !defined(SWIFT_CLASS)
-# if __has_attribute(objc_subclassing_restricted)
-# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
-# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# else
-# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# endif
-#endif
-#if !defined(SWIFT_RESILIENT_CLASS)
-# if __has_attribute(objc_class_stub)
-# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
-# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
-# else
-# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
-# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
-# endif
-#endif
-
-#if !defined(SWIFT_PROTOCOL)
-# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
-# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
-#endif
-
-#if !defined(SWIFT_EXTENSION)
-# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
-#endif
-
-#if !defined(OBJC_DESIGNATED_INITIALIZER)
-# if __has_attribute(objc_designated_initializer)
-# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
-# else
-# define OBJC_DESIGNATED_INITIALIZER
-# endif
-#endif
-#if !defined(SWIFT_ENUM_ATTR)
-# if defined(__has_attribute) && __has_attribute(enum_extensibility)
-# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
-# else
-# define SWIFT_ENUM_ATTR(_extensibility)
-# endif
-#endif
-#if !defined(SWIFT_ENUM)
-# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
-# if __has_feature(generalized_swift_name)
-# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
-# else
-# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
-# endif
-#endif
-#if !defined(SWIFT_UNAVAILABLE)
-# define SWIFT_UNAVAILABLE __attribute__((unavailable))
-#endif
-#if !defined(SWIFT_UNAVAILABLE_MSG)
-# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
-#endif
-#if !defined(SWIFT_AVAILABILITY)
-# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
-#endif
-#if !defined(SWIFT_WEAK_IMPORT)
-# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
-#endif
-#if !defined(SWIFT_DEPRECATED)
-# define SWIFT_DEPRECATED __attribute__((deprecated))
-#endif
-#if !defined(SWIFT_DEPRECATED_MSG)
-# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
-#endif
-#if __has_feature(attribute_diagnose_if_objc)
-# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
-#else
-# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
-#endif
-#if !defined(IBSegueAction)
-# define IBSegueAction
-#endif
-#if __has_feature(modules)
-#if __has_warning("-Watimport-in-framework-header")
-#pragma clang diagnostic ignored "-Watimport-in-framework-header"
-#endif
-#endif
-
-#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
-#pragma clang diagnostic ignored "-Wduplicate-method-arg"
-#if __has_warning("-Wpragma-clang-attribute")
-# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
-#endif
-#pragma clang diagnostic ignored "-Wunknown-pragmas"
-#pragma clang diagnostic ignored "-Wnullability"
-
-#if __has_attribute(external_source_symbol)
-# pragma push_macro("any")
-# undef any
-# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RawGlucose",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
-# pragma pop_macro("any")
-#endif
-
-#if __has_attribute(external_source_symbol)
-# pragma clang attribute pop
-#endif
-#pragma clang diagnostic pop
-#endif
-
-#elif defined(__x86_64__) && __x86_64__
-// Generated by Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-#ifndef RAWGLUCOSE_SWIFT_H
-#define RAWGLUCOSE_SWIFT_H
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wgcc-compat"
-
-#if !defined(__has_include)
-# define __has_include(x) 0
-#endif
-#if !defined(__has_attribute)
-# define __has_attribute(x) 0
-#endif
-#if !defined(__has_feature)
-# define __has_feature(x) 0
-#endif
-#if !defined(__has_warning)
-# define __has_warning(x) 0
-#endif
-
-#if __has_include()
-# include
-#endif
-
-#pragma clang diagnostic ignored "-Wauto-import"
-#include
-#include
-#include
-#include
-
-#if !defined(SWIFT_TYPEDEFS)
-# define SWIFT_TYPEDEFS 1
-# if __has_include()
-# include
-# elif !defined(__cplusplus)
-typedef uint_least16_t char16_t;
-typedef uint_least32_t char32_t;
-# endif
-typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
-typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
-typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
-typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
-typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
-typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
-typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
-typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
-typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
-typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
-typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
-typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
-#endif
-
-#if !defined(SWIFT_PASTE)
-# define SWIFT_PASTE_HELPER(x, y) x##y
-# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
-#endif
-#if !defined(SWIFT_METATYPE)
-# define SWIFT_METATYPE(X) Class
-#endif
-#if !defined(SWIFT_CLASS_PROPERTY)
-# if __has_feature(objc_class_property)
-# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
-# else
-# define SWIFT_CLASS_PROPERTY(...)
-# endif
-#endif
-
-#if __has_attribute(objc_runtime_name)
-# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
-#else
-# define SWIFT_RUNTIME_NAME(X)
-#endif
-#if __has_attribute(swift_name)
-# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
-#else
-# define SWIFT_COMPILE_NAME(X)
-#endif
-#if __has_attribute(objc_method_family)
-# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
-#else
-# define SWIFT_METHOD_FAMILY(X)
-#endif
-#if __has_attribute(noescape)
-# define SWIFT_NOESCAPE __attribute__((noescape))
-#else
-# define SWIFT_NOESCAPE
-#endif
-#if __has_attribute(ns_consumed)
-# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
-#else
-# define SWIFT_RELEASES_ARGUMENT
-#endif
-#if __has_attribute(warn_unused_result)
-# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
-#else
-# define SWIFT_WARN_UNUSED_RESULT
-#endif
-#if __has_attribute(noreturn)
-# define SWIFT_NORETURN __attribute__((noreturn))
-#else
-# define SWIFT_NORETURN
-#endif
-#if !defined(SWIFT_CLASS_EXTRA)
-# define SWIFT_CLASS_EXTRA
-#endif
-#if !defined(SWIFT_PROTOCOL_EXTRA)
-# define SWIFT_PROTOCOL_EXTRA
-#endif
-#if !defined(SWIFT_ENUM_EXTRA)
-# define SWIFT_ENUM_EXTRA
-#endif
-#if !defined(SWIFT_CLASS)
-# if __has_attribute(objc_subclassing_restricted)
-# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
-# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# else
-# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
-# endif
-#endif
-#if !defined(SWIFT_RESILIENT_CLASS)
-# if __has_attribute(objc_class_stub)
-# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
-# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
-# else
-# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
-# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
-# endif
-#endif
-
-#if !defined(SWIFT_PROTOCOL)
-# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
-# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
-#endif
-
-#if !defined(SWIFT_EXTENSION)
-# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
-#endif
-
-#if !defined(OBJC_DESIGNATED_INITIALIZER)
-# if __has_attribute(objc_designated_initializer)
-# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
-# else
-# define OBJC_DESIGNATED_INITIALIZER
-# endif
-#endif
-#if !defined(SWIFT_ENUM_ATTR)
-# if defined(__has_attribute) && __has_attribute(enum_extensibility)
-# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
-# else
-# define SWIFT_ENUM_ATTR(_extensibility)
-# endif
-#endif
-#if !defined(SWIFT_ENUM)
-# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
-# if __has_feature(generalized_swift_name)
-# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
-# else
-# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
-# endif
-#endif
-#if !defined(SWIFT_UNAVAILABLE)
-# define SWIFT_UNAVAILABLE __attribute__((unavailable))
-#endif
-#if !defined(SWIFT_UNAVAILABLE_MSG)
-# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
-#endif
-#if !defined(SWIFT_AVAILABILITY)
-# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
-#endif
-#if !defined(SWIFT_WEAK_IMPORT)
-# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
-#endif
-#if !defined(SWIFT_DEPRECATED)
-# define SWIFT_DEPRECATED __attribute__((deprecated))
-#endif
-#if !defined(SWIFT_DEPRECATED_MSG)
-# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
-#endif
-#if __has_feature(attribute_diagnose_if_objc)
-# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
-#else
-# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
-#endif
-#if !defined(IBSegueAction)
-# define IBSegueAction
-#endif
-#if __has_feature(modules)
-#if __has_warning("-Watimport-in-framework-header")
-#pragma clang diagnostic ignored "-Watimport-in-framework-header"
-#endif
-#endif
-
-#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
-#pragma clang diagnostic ignored "-Wduplicate-method-arg"
-#if __has_warning("-Wpragma-clang-attribute")
-# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
-#endif
-#pragma clang diagnostic ignored "-Wunknown-pragmas"
-#pragma clang diagnostic ignored "-Wnullability"
-
-#if __has_attribute(external_source_symbol)
-# pragma push_macro("any")
-# undef any
-# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="RawGlucose",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
-# pragma pop_macro("any")
-#endif
-
-#if __has_attribute(external_source_symbol)
-# pragma clang attribute pop
-#endif
-#pragma clang diagnostic pop
-#endif
-
-#endif
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Headers/RawGlucose.h b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Headers/RawGlucose.h
deleted file mode 100644
index 0bb475c6f..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Headers/RawGlucose.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// RawGlucose.h
-// RawGlucose
-//
-// Created by Ivan Valkou on 29.10.2021.
-//
-
-#import
-
-//! Project version number for RawGlucose.
-FOUNDATION_EXPORT double RawGlucoseVersionNumber;
-
-//! Project version string for RawGlucose.
-FOUNDATION_EXPORT const unsigned char RawGlucoseVersionString[];
-
-// In this header, you should import all the public headers of your framework using statements like #import
-
-
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Info.plist b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Info.plist
deleted file mode 100644
index 0f9dc3480..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Info.plist and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftdoc b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftdoc
deleted file mode 100644
index d2b2a6a11..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftdoc and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftinterface b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftinterface
deleted file mode 100644
index 74af49bcd..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftinterface
+++ /dev/null
@@ -1,8 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target arm64-apple-ios14.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name RawGlucose
-import Foundation
-@_exported import RawGlucose
-import Swift
-import _Concurrency
-public func glucoseValueFromRaw(rawTemperature: Swift.Double, rawTemperatureAdjustment: Swift.Double, rawGlucose: Swift.Double, i1: Swift.Int, i2: Swift.Int, i3: Swift.Double, i4: Swift.Double, i5: Swift.Double, i6: Swift.Double) -> Swift.Double
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftdoc b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftdoc
deleted file mode 100644
index d2b2a6a11..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftdoc and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftinterface b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftinterface
deleted file mode 100644
index 74af49bcd..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/arm64.swiftinterface
+++ /dev/null
@@ -1,8 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target arm64-apple-ios14.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name RawGlucose
-import Foundation
-@_exported import RawGlucose
-import Swift
-import _Concurrency
-public func glucoseValueFromRaw(rawTemperature: Swift.Double, rawTemperatureAdjustment: Swift.Double, rawGlucose: Swift.Double, i1: Swift.Int, i2: Swift.Int, i3: Swift.Double, i4: Swift.Double, i5: Swift.Double, i6: Swift.Double) -> Swift.Double
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftdoc b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftdoc
deleted file mode 100644
index d961e46ed..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftdoc and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftinterface b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftinterface
deleted file mode 100644
index d8e268371..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftinterface
+++ /dev/null
@@ -1,8 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target x86_64-apple-ios14.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name RawGlucose
-import Foundation
-@_exported import RawGlucose
-import Swift
-import _Concurrency
-public func glucoseValueFromRaw(rawTemperature: Swift.Double, rawTemperatureAdjustment: Swift.Double, rawGlucose: Swift.Double, i1: Swift.Int, i2: Swift.Int, i3: Swift.Double, i4: Swift.Double, i5: Swift.Double, i6: Swift.Double) -> Swift.Double
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64.swiftdoc b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64.swiftdoc
deleted file mode 100644
index d961e46ed..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64.swiftdoc and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64.swiftinterface b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64.swiftinterface
deleted file mode 100644
index d8e268371..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/RawGlucose.swiftmodule/x86_64.swiftinterface
+++ /dev/null
@@ -1,8 +0,0 @@
-// swift-interface-format-version: 1.0
-// swift-compiler-version: Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
-// swift-module-flags: -target x86_64-apple-ios14.0-simulator -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name RawGlucose
-import Foundation
-@_exported import RawGlucose
-import Swift
-import _Concurrency
-public func glucoseValueFromRaw(rawTemperature: Swift.Double, rawTemperatureAdjustment: Swift.Double, rawGlucose: Swift.Double, i1: Swift.Int, i2: Swift.Int, i3: Swift.Double, i4: Swift.Double, i5: Swift.Double, i6: Swift.Double) -> Swift.Double
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/module.modulemap b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/module.modulemap
deleted file mode 100644
index 73e07f3aa..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/Modules/module.modulemap
+++ /dev/null
@@ -1,11 +0,0 @@
-framework module RawGlucose {
- umbrella header "RawGlucose.h"
-
- export *
- module * { export * }
-}
-
-module RawGlucose.Swift {
- header "RawGlucose-Swift.h"
- requires objc
-}
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/RawGlucose b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/RawGlucose
deleted file mode 100755
index c821e55cc..000000000
Binary files a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/RawGlucose and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/_CodeSignature/CodeResources b/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/_CodeSignature/CodeResources
deleted file mode 100644
index c6fa7659c..000000000
--- a/Dependencies/LibreTransmitter/RawGlucose.xcframework/ios-arm64_x86_64-simulator/RawGlucose.framework/_CodeSignature/CodeResources
+++ /dev/null
@@ -1,267 +0,0 @@
-
-
-
-
- files
-
- Headers/RawGlucose-Swift.h
-
- NOPVTsnUQdvUXiVvlGkcrHBsYf8=
-
- Headers/RawGlucose.h
-
- e5N6Xw/Q6Ssus1Sfka2OdAgEwfs=
-
- Info.plist
-
- C822WpDoMUZHHWfCJ8tfMtklvCc=
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftdoc
-
- XVOH12u7W5mUldmztR8JA2sGUBE=
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftinterface
-
- 3G/qIi+knDm6DNBZMdut0+I0F8U=
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftmodule
-
- 8XbBt5zfUNlmyrYv31HsRH5I7Pc=
-
- Modules/RawGlucose.swiftmodule/arm64.swiftdoc
-
- XVOH12u7W5mUldmztR8JA2sGUBE=
-
- Modules/RawGlucose.swiftmodule/arm64.swiftinterface
-
- 3G/qIi+knDm6DNBZMdut0+I0F8U=
-
- Modules/RawGlucose.swiftmodule/arm64.swiftmodule
-
- 8XbBt5zfUNlmyrYv31HsRH5I7Pc=
-
- Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftdoc
-
- YTLCQrGaBLjG2V3HCaucJ1Affak=
-
- Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftinterface
-
- 8+AhO+0B1RfBn7TTtbJhId3or3k=
-
- Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftmodule
-
- fBhjoSFy5wsrXWVEqv2bue3Tdho=
-
- Modules/RawGlucose.swiftmodule/x86_64.swiftdoc
-
- YTLCQrGaBLjG2V3HCaucJ1Affak=
-
- Modules/RawGlucose.swiftmodule/x86_64.swiftinterface
-
- 8+AhO+0B1RfBn7TTtbJhId3or3k=
-
- Modules/RawGlucose.swiftmodule/x86_64.swiftmodule
-
- fBhjoSFy5wsrXWVEqv2bue3Tdho=
-
- Modules/module.modulemap
-
- Nbavz/+JmGFVpOq9rrggRbhjo/Y=
-
-
- files2
-
- Headers/RawGlucose-Swift.h
-
- hash2
-
- 05/Gxrpmj85ok9eADvswbwYSHS2GDU+dONqnxWX0YKc=
-
-
- Headers/RawGlucose.h
-
- hash2
-
- vWp1R9C9/5EBlkAhcUZ6DglPTPIL7LdzMYFDrxPPp2w=
-
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftdoc
-
- hash2
-
- R0b1kXmBK9IQpw2/AgSdiCUB3tyXVOLVYFhrcMiJTdc=
-
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftinterface
-
- hash2
-
- JIy4JCrP2htiXMPFm2mtQWks0BAt8xJ4N8zKSbVi4WU=
-
-
- Modules/RawGlucose.swiftmodule/arm64-apple-ios-simulator.swiftmodule
-
- hash2
-
- WvvLbXOvP/MljSINhZaIT3RXsDVf/dFvySSwZ2qgElg=
-
-
- Modules/RawGlucose.swiftmodule/arm64.swiftdoc
-
- hash2
-
- R0b1kXmBK9IQpw2/AgSdiCUB3tyXVOLVYFhrcMiJTdc=
-
-
- Modules/RawGlucose.swiftmodule/arm64.swiftinterface
-
- hash2
-
- JIy4JCrP2htiXMPFm2mtQWks0BAt8xJ4N8zKSbVi4WU=
-
-
- Modules/RawGlucose.swiftmodule/arm64.swiftmodule
-
- hash2
-
- WvvLbXOvP/MljSINhZaIT3RXsDVf/dFvySSwZ2qgElg=
-
-
- Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftdoc
-
- hash2
-
- nLt/uTqHb2O8ehdLv6Pykcy9VYdbwfpAEJ7j8At6ruU=
-
-
- Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftinterface
-
- hash2
-
- odDK6zWxPbRZLxn8UV8Pb3KyYW50utHNICmLKU3+B3I=
-
-
- Modules/RawGlucose.swiftmodule/x86_64-apple-ios-simulator.swiftmodule
-
- hash2
-
- QEolRuoZA6Gqn9VoRQId+9TRRhZAgZwIQgjHYACF9wk=
-
-
- Modules/RawGlucose.swiftmodule/x86_64.swiftdoc
-
- hash2
-
- nLt/uTqHb2O8ehdLv6Pykcy9VYdbwfpAEJ7j8At6ruU=
-
-
- Modules/RawGlucose.swiftmodule/x86_64.swiftinterface
-
- hash2
-
- odDK6zWxPbRZLxn8UV8Pb3KyYW50utHNICmLKU3+B3I=
-
-
- Modules/RawGlucose.swiftmodule/x86_64.swiftmodule
-
- hash2
-
- QEolRuoZA6Gqn9VoRQId+9TRRhZAgZwIQgjHYACF9wk=
-
-
- Modules/module.modulemap
-
- hash2
-
- HGSrZF6T2tksU5dqClpOIcyQITvyjJOLdm6TEvIdU7M=
-
-
-
- rules
-
- ^.*
-
- ^.*\.lproj/
-
- optional
-
- weight
- 1000
-
- ^.*\.lproj/locversion.plist$
-
- omit
-
- weight
- 1100
-
- ^Base\.lproj/
-
- weight
- 1010
-
- ^version.plist$
-
-
- rules2
-
- .*\.dSYM($|/)
-
- weight
- 11
-
- ^(.*/)?\.DS_Store$
-
- omit
-
- weight
- 2000
-
- ^.*
-
- ^.*\.lproj/
-
- optional
-
- weight
- 1000
-
- ^.*\.lproj/locversion.plist$
-
- omit
-
- weight
- 1100
-
- ^Base\.lproj/
-
- weight
- 1010
-
- ^Info\.plist$
-
- omit
-
- weight
- 20
-
- ^PkgInfo$
-
- omit
-
- weight
- 20
-
- ^embedded\.provisionprofile$
-
- weight
- 20
-
- ^version\.plist$
-
- weight
- 20
-
-
-
-
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/BluetoothSearch.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/BluetoothSearch.swift
deleted file mode 100644
index b9b920b9a..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/BluetoothSearch.swift
+++ /dev/null
@@ -1,258 +0,0 @@
-//
-// BluetoothSearch.swift
-// MiaomiaoClientUI
-//
-// Created by Bjørn Inge Berg on 26/07/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import OSLog
-import UIKit
-import Combine
-
-struct RSSIInfo {
- let bledeviceID: String
- let signalStrength: Int
-
- var totalBars : Int {
- 3
- }
-
- var signalBars : Int {
- if signalStrength < -80 {
- return 1 //near
- }
-
- if signalStrength > -50 {
- return 3 //immediate
- }
-
- return 2 //near
- }
-
-
-
-}
-
-public final class BluetoothSearchManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
-
- var centralManager: CBCentralManager!
-
- fileprivate lazy var logger = Logger(forType: Self.self)
-
- //fileprivate let deviceNames = SupportedDevices.allNames
- //fileprivate let serviceUUIDs:[CBUUID]? = [CBUUID(string: "6E400001-B5A3-F393-E0A9-E50E24DCCA9E")]
-
- private var discoveredDevices = [CBPeripheral]()
-
- public let passThrough = PassthroughSubject()
- public let passThroughMetaData = PassthroughSubject<(CBPeripheral, [String: Any]), Never>()
- let throttledRSSI = GenericThrottler(identificator: \RSSIInfo.bledeviceID, interval: 5)
-
-
- private var rescanTimerBag = Set()
-
- public func addDiscoveredDevice(_ device: CBPeripheral, with metadata: [String: Any], rssi: Int) {
- passThrough.send(device)
- passThroughMetaData.send((device, metadata))
- throttledRSSI.incoming.send(RSSIInfo(bledeviceID: device.identifier.uuidString, signalStrength: rssi))
- }
-
- public override init() {
- super.init()
- // calling readrssi on a peripheral is only supported on connected peripherals
- // here we want the AllowDuplicatesKey to be true so that we get a continous feed of new rssi values for
- // discovered but unconnected peripherals
- // This should work, but in practice, most devices will still only be discovered once, meaning that we cannot update rssi values
- // without either a new scan, or connecting to the peripheral and using .readrssi()
- //centralManager = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
- centralManager = CBCentralManager(delegate: self, queue: nil, options: nil)
- // slipBuffer.delegate = self
- logger.debug("BluetoothSearchManager init called ")
-
- // Ugly hack to be able to update rssi continously without connecting to peripheral
- // Yes, this consumes extra power, but this feature is very convenient when needed, but very rarely used (only during setup)
- //startTimer()
- }
-
- public func startTimer(){
- stopTimer()
-
- Timer.publish(every: 10, on: .main, in: .default)
- .autoconnect()
- .sink(
- receiveValue: { [weak self ] _ in
- self?.rescan()
- }
- )
- .store(in: &rescanTimerBag)
- }
-
- public func stopTimer() {
- if !rescanTimerBag.isEmpty {
- rescanTimerBag.forEach { cancel in
- cancel.cancel()
- }
- }
- }
-
- func rescan() {
- if centralManager.isScanning {
- centralManager.stopScan()
- }
- logger.debug("Rescanning")
-
- self.scanForCompatibleDevices()
- }
-
- func scanForCompatibleDevices() {
-
-
-
- if centralManager.state == .poweredOn && !centralManager.isScanning {
- logger.debug("Before scan for transmitter while central manager state \(String(describing: self.centralManager.state.rawValue))")
-
- let allServices : [CBUUID] = LibreTransmitters.all.compactMap { atype in
- atype.serviceUUID.first?.value
- }
-
-
- logger.debug("Will scan for the following services: \(String(describing: allServices))")
-
-
- // nil because miamiao1 not advertising it's services
- centralManager.scanForPeripherals(withServices: nil, options:nil)
-
-
- // Ugly hack to be able to update rssi continously without connecting to peripheral
- // Yes, this consumes extra power, but this feature is very convenient when needed, but very rarely used (only during setup)
- startTimer()
- }
- }
-
- func disconnectManually() {
- logger.debug("did disconnect manually")
- // NotificationManager.scheduleDebugNotification(message: "Timer fired in Background", wait: 3)
- // _ = Timer(timeInterval: 150, repeats: false, block: {timer in NotificationManager.scheduleDebugNotification(message: "Timer fired in Background", wait: 0.5)})
-
- if centralManager.isScanning {
- centralManager.stopScan()
- }
- }
-
-
-
- // MARK: - CBCentralManagerDelegate
-
- public func centralManagerDidUpdateState(_ central: CBCentralManager) {
- logger.debug("Central Manager did update state to \(String(describing: central.state.rawValue))")
- switch central.state {
- case .poweredOff, .resetting, .unauthorized, .unknown, .unsupported:
- logger.debug("Central Manager was either .poweredOff, .resetting, .unauthorized, .unknown, .unsupported: \(String(describing: central.state))")
- case .poweredOn:
- //we don't want this to start scanning right away, but rather wait until the view has appeared
- // this means that the view is responsible for calling scanForCompatibleDevices it self
- //scanForCompatibleDevices() // power was switched on, while app is running -> reconnect.
- break
-
- @unknown default:
- fatalError("libre bluetooth state unhandled")
- }
- }
-
- public func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
- guard let name = peripheral.name?.lowercased() else {
- logger.debug("dabear:: could not find name for device \(peripheral.identifier.uuidString)")
- return
- }
-
- if LibreTransmitters.isSupported(peripheral) {
- logger.debug("dabear:: did recognize device: \(name): \(peripheral.identifier)")
- self.addDiscoveredDevice(peripheral, with: advertisementData, rssi: RSSI.intValue)
- //peripheral.delegate = self
- //peripheral.readRSSI()
- } else {
- logger.debug("dabear:: did not add unknown device: \(name): \(peripheral.identifier)")
- }
- }
-
- public func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
- //self.lastConnectedIdentifier = peripheral.identifier.uuidString
-
- }
-
- public func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
- logger.error("did fail to connect")
- }
-
- public func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
- logger.debug("did didDisconnectPeripheral")
- }
-
- // MARK: - CBPeripheralDelegate
-
- public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
- logger.debug("Did discover services")
- if let error = error {
- logger.error("Did discover services error: \(error.localizedDescription)")
- }
-
- if let services = peripheral.services {
- for service in services {
- peripheral.discoverCharacteristics(nil, for: service)
-
- logger.debug("Did discover service: \(String(describing: service.debugDescription))")
- }
- }
- }
-
- public func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
- logger.debug("Did discover characteristics for service \(String(describing: peripheral.name))")
-
- if let error = error {
- logger.error("Did discover characteristics for service error: \(error.localizedDescription)")
- }
-
- if let characteristics = service.characteristics {
- for characteristic in characteristics {
- logger.debug("Did discover characteristic: \(String(describing: characteristic.debugDescription))")
-
- if (characteristic.properties.intersection(.notify)) == .notify && characteristic.uuid == CBUUID(string: "6E400003-B5A3-F393-E0A9-E50E24DCCA9E") {
- peripheral.setNotifyValue(true, for: characteristic)
- logger.debug("Set notify value for this characteristic")
- }
- if characteristic.uuid == CBUUID(string: "6E400002-B5A3-F393-E0A9-E50E24DCCA9E") {
- //writeCharacteristic = characteristic
- }
- }
- } else {
- logger.error("Discovered characteristics, but no characteristics listed. There must be some error.")
- }
- }
-
-
- public func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) {
-
- //throttledRSSI.incoming.send(RSSIInfo(bledeviceID: peripheral.identifier.uuidString, signalStrength: RSSI.intValue))
-
- //peripheral.readRSSI() //we keep contuing to update the rssi (only works if peripheral is already connected....
-
- }
- public func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {
- logger.debug("Did update notification state for characteristic: \(String(describing: characteristic.debugDescription))")
- }
-
- public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
- logger.debug("Did update value for characteristic: \(String(describing: characteristic.debugDescription))")
- }
-
- public func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
- logger.debug("Did Write value \(String(characteristic.value.debugDescription)) for characteristic \(String(characteristic.debugDescription))")
- }
-
- deinit {
- logger.debug("dabear:: BluetoothSearchManager deinit called")
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/CBPeripheralExtensions.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/CBPeripheralExtensions.swift
deleted file mode 100644
index 220f9e337..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/CBPeripheralExtensions.swift
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-// CBPeripheralExtensions.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 19/10/2020.
-// Copyright © 2020 Bjørn Inge Vikhammermo Berg. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-
-public protocol PeripheralProtocol {
- var name: String? { get }
- var name2: String { get }
-
- var asStringIdentifier: String { get }
-}
-
-public enum Either {
- case Left(A)
- case Right(B)
-}
-
-public typealias SomePeripheral = Either
-
-extension SomePeripheral: PeripheralProtocol, Identifiable, Hashable, Equatable {
- public static func == (lhs: Either, rhs: Either) -> Bool {
- lhs.asStringIdentifier == rhs.asStringIdentifier
- }
-
- public var id: String {
- actualPeripheral.asStringIdentifier
- }
-
- public func hash(into hasher: inout Hasher) {
- hasher.combine(actualPeripheral.asStringIdentifier)
- }
-
- private var actualPeripheral: PeripheralProtocol {
- switch self {
- case let .Left(real):
- return real
- case let .Right(mocked):
- return mocked
- }
- }
- public var name: String? {
- actualPeripheral.name
- }
-
- public var name2: String {
- actualPeripheral.name2
- }
-
- public var asStringIdentifier: String {
- actualPeripheral.asStringIdentifier
- }
-}
-
-extension CBPeripheral: PeripheralProtocol, Identifiable {
- public var name2: String {
- self.name ?? ""
- }
-
- public var asStringIdentifier: String {
- self.identifier.uuidString
- }
-}
-
-public class MockedPeripheral: PeripheralProtocol, Identifiable {
- public var name: String?
-
- public var name2: String {
- name ?? "unknown-device"
- }
-
- public var asStringIdentifier: String {
- name2
- }
-
- public init(name: String) {
- self.name = name
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/GenericThrottler.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/GenericThrottler.swift
deleted file mode 100644
index fe112aba2..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/GenericThrottler.swift
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// GenericThrottler.swift
-// LibreTransmitter
-//
-// Created by Bjørn Inge Berg on 16/08/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import Foundation
-import Combine
-
-class GenericThrottler{
-
- public var throttledPublisher : AnyPublisher {
- throttledSubject.eraseToAnyPublisher()
- }
- //this is the where the bluetoothsearch should send its updates
- public let incoming = PassthroughSubject()
-
- //this is what swiftui would connect to
- private let throttledSubject = PassthroughSubject()
- private var initiallyPublished = Set()
-
- private var bag = Set()
- private var timerBag = Set()
-
-
- private var newValues : [U: T] = [:]
-
- private var identificator : KeyPath
-
- private var interval: TimeInterval
-
- public func startTimer(){
- stopTimer()
-
- Timer.publish(every: interval, on: .main, in: .default)
- .autoconnect()
- .sink(
- receiveValue: { [weak self ] _ in
- //every 10 seconds, send the latest element as uniquely identified by bledeviceid
- // we reset the newvalues so that we wont resend the same identifical element after 10 additional seconds
- self?.newValues.forEach { el in
- self?.throttledSubject.send(el.value)
- }
- self?.newValues = [:]
- }
- )
- .store(in: &timerBag)
- }
-
- public func stopTimer() {
- if !timerBag.isEmpty {
- timerBag.forEach { cancel in
- cancel.cancel()
- }
- }
- }
-
- private func setupDebugListener() {
- throttledSubject
- .sink { el in
- let now = Date().description
- print("\(now) \t throttledPublisher got new value: \(el) ")
- }
- .store(in: &bag)
- }
-
- private func setupIncoming() {
- incoming
- .sink { [weak self] el in
- guard let self = self else {
- return
- }
-
- let id = el.self[keyPath: self.identificator]
-
-
- let neverPublished = !self.initiallyPublished.contains(id)
- if neverPublished {
- self.initiallyPublished.insert(id)
- //every element should be published initially
- self.throttledSubject.send(el)
- return
- }
-
- self.newValues[id] = el
-
- }
- .store(in: &bag)
- }
-
- init(identificator : KeyPath, interval: TimeInterval) {
- self.identificator = identificator
- self.interval = interval
-
- startTimer()
- setupIncoming()
-
-
- //this cancellable would normally not be used directly, as you would consume the publisher from swiftui
- //setupDebugListener()
-
- }
-
- deinit {
- print("deiniting GenericThrottler")
- }
-
-
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/LibreTransmitterMetadata.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/LibreTransmitterMetadata.swift
deleted file mode 100644
index b714c6544..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/LibreTransmitterMetadata.swift
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// MiaoMiao.swift
-// LibreMonitor
-//
-// Created by Uwe Petersen on 02.11.18.
-// Copyright © 2018 Uwe Petersen. All rights reserved.
-//
-
-import Foundation
-
-public struct LibreTransmitterMetadata: CustomStringConvertible {
- // hardware number
- public let hardware: String
- // software number
- public let firmware: String
- // battery level, percentage between 0 % and 100 %
- public let battery: Int?
- // battery level String
- public let batteryString: String
-
- public let macAddress: String?
-
- public let name: String
-
- public let patchInfo: String?
- public let uid: [UInt8]?
-
- init(hardware: String, firmware: String, battery: Int?, name: String, macAddress: String?, patchInfo: String?, uid: [UInt8]?) {
- self.hardware = hardware
- self.firmware = firmware
- self.battery = battery
- let batteryString = battery == nil ? "-" : "\(battery!)"
- self.batteryString = batteryString
- self.macAddress = macAddress
- self.name = name
- self.patchInfo = patchInfo
- self.uid = uid
- }
-
- public var description: String {
- "Transmitter: \(name), Hardware: \(hardware), firmware: \(firmware)" +
- "battery: \(batteryString), macAddress: \(String(describing: macAddress)), patchInfo: \(String(describing: patchInfo)), uid: \(String(describing: uid))"
- }
-
- public func sensorType() -> SensorType? {
- guard let patchInfo = patchInfo else { return nil }
- return SensorType(patchInfo: patchInfo)
- }
-}
-
-extension String {
- //https://stackoverflow.com/questions/39677330/how-does-string-substring-work-in-swift
- //usage
- //let s = "hello"
- //s[0..<3] // "hel"
- //s[3..) -> String {
- let idx1 = index(startIndex, offsetBy: max(0, range.lowerBound))
- let idx2 = index(startIndex, offsetBy: min(self.count, range.upperBound))
- return String(self[idx1.. Data? {
- var data = Data(capacity: count / 2)
-
- let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive)
- regex.enumerateMatches(in: self, range: NSRange(startIndex..., in: self)) { match, _, _ in
- let byteString = (self as NSString).substring(with: match!.range)
- let num = UInt8(byteString, radix: 16)!
- data.append(num)
- }
-
- guard data.count > 0 else { return nil }
-
- return data
- }
-}
-
-public enum SensorType: String, CustomStringConvertible {
- case libre1 = "DF"
- case libre1A2 = "A2"
- case libre2 = "9D"
- case libre2C5 = "C5"
- case libreUS14day = "E5"
- case libreUS14dayE6 = "E6"
- case libreProH = "70"
-
- public var description: String {
- switch self {
- case .libre1:
- return "Libre 1"
- case .libre1A2:
- return "Libre 1 A2"
- case .libre2, .libre2C5:
- return "Libre 2"
- case .libreUS14day, .libreUS14dayE6:
- return "Libre US"
- case .libreProH:
- return "Libre PRO H"
- }
- }
-}
-
-public extension SensorType {
- init?(patchInfo: String) {
- guard patchInfo.count > 1 else { return nil }
-
- let start = patchInfo[0..<2].uppercased()
-
- let choices: [String: SensorType] = ["DF": .libre1, "A2": .libre1A2, "9D": .libre2, "C5": .libre2, "E5": .libreUS14day, "E6": .libreUS14dayE6, "70": .libreProH]
-
- if let res = choices[start] {
- self = res
- return
- }
-
- return nil
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/BubbleTransmitter.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/BubbleTransmitter.swift
deleted file mode 100644
index 986d4687c..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/BubbleTransmitter.swift
+++ /dev/null
@@ -1,207 +0,0 @@
-//
-// BubbleTransmitter.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 08/01/2020.
-// Copyright © 2020 Bjørn Inge Berg. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import UIKit
-import os.log
-
-public enum BubbleResponseType: UInt8 {
- case dataPacket = 130
- case bubbleInfo = 128 // = wakeUp + device info
- case noSensor = 191
- case serialNumber = 192
- case patchInfo = 193 //0xC1
- /// bubble firmware 2.6 support decrypt libre2 344 to libre1 344
- /// if firmware >= 2.6, write [0x08, 0x01, 0x00, 0x00, 0x00, 0x2B]
- /// bubble will decrypt the libre2 data and return it
- //we don't really support decrypteddatapacket as we like to decrypt our selves!
- //case decryptedDataPacket = 136 // 0x88
-}
-
-extension BubbleResponseType {
- var description: String {
- switch self {
- case .bubbleInfo:
- return "bubbleinfo"
- case .dataPacket:
- return "datapacket"
- case .noSensor:
- return "nosensor"
- case .serialNumber:
- return "serialnumber"
- case .patchInfo:
- return "patchInfo"
- }
- }
-}
-
-// The Bubble uses the same serviceUUID,
-// writeCharachteristic and notifyCharachteristic
-// as the MiaoMiao, but different byte sequences
-class BubbleTransmitter: MiaoMiaoTransmitter {
- override class var shortTransmitterName: String {
- "bubble"
- }
- override class var manufacturerer: String {
- "bubbledevteam"
- }
-
- override class var smallImage: UIImage? {
- UIImage(named: "bubble", in: Bundle.module, compatibleWith: nil)
- }
-
- override static func canSupportPeripheral(_ peripheral: CBPeripheral) -> Bool {
- peripheral.name?.lowercased().starts(with: "bubble") ?? false
- }
-
- override func reset() {
- rxBuffer.resetAllBytes()
- }
-
- override class var requiresDelayedReconnect : Bool {
- true
- }
-
- private var hardware: String? = ""
- private var firmware: String? = ""
- private var mac: String? = ""
-
- private var patchInfo: String?
- private var uid: [UInt8]?
-
- private var battery: Int?
-
- fileprivate lazy var bLogger = Logger(forType: Self.self)
-
- override class func getDeviceDetailsFromAdvertisement(advertisementData: [String: Any]?) -> String? {
- let (amac, afirmware, ahardware) = Self.getDeviceDetailsFromAdvertisementInternal(advertisementData: advertisementData)
-
- if let amac = amac, let ahardware = ahardware, let afirmware = afirmware {
- return "\(amac)\n HW:\(ahardware), FW: \(afirmware)"
- }
-
- return nil
- }
-
- private static func getDeviceDetailsFromAdvertisementInternal(advertisementData: [String: Any]?) -> (String?, String?, String?) {
-
-
-
- guard let data = advertisementData?["kCBAdvDataManufacturerData"] as? Data else {
- return (nil, nil, nil)
- }
- var mac = ""
- for i in 0 ..< 6 {
- mac += data.subdata(in: (7 - i)..<(8 - i)).hexEncodedString().uppercased()
- if i != 5 {
- mac += ":"
- }
- }
-
- guard data.count >= 12 else {
- return (nil, nil, nil)
- }
-
- let fSub1 = Data(repeating: data[8], count: 1)
- let fSub2 = Data(repeating: data[9], count: 1)
- let firmware = Float("\(fSub1.hexEncodedString()).\(fSub2.hexEncodedString())")?.description
-
- let hSub1 = Data(repeating: data[10], count: 1)
- let hSub2 = Data(repeating: data[11], count: 1)
-
- let hardware = Float("\(hSub1.hexEncodedString()).\(hSub2.hexEncodedString())")?.description
- return (mac, firmware, hardware)
- }
-
- required init(delegate: LibreTransmitterDelegate, advertisementData: [String: Any]?) {
- //advertisementData is unknown for the miaomiao
-
- super.init(delegate: delegate, advertisementData: advertisementData)
- //self.delegate = delegate
- //deviceFromAdvertisementData(advertisementData: advertisementData)
- (self.mac, self.firmware, self.hardware) = Self.getDeviceDetailsFromAdvertisementInternal(advertisementData: advertisementData)
- }
-
- override func requestData(writeCharacteristics: CBCharacteristic, peripheral: CBPeripheral) {
- bLogger.debug("dabear:: bubbleRequestData")
- reset()
-
- peripheral.writeValue(Data([0x00, 0x00, 0x05]), for: writeCharacteristics, type: .withResponse)
- }
- override func updateValueForNotifyCharacteristics(_ value: Data, peripheral: CBPeripheral, writeCharacteristic: CBCharacteristic?) {
- bLogger.debug("dabear:: bubbleDidUpdateValueForNotifyCharacteristics, firstbyte is: \(value.first.debugDescription)")
- guard let firstByte = value.first, let bubbleResponseState = BubbleResponseType(rawValue: firstByte) else {
- return
- }
- bLogger.debug("dabear:: bubble responsestate is of type \(bubbleResponseState.description)")
- bLogger.debug("dabear:: bubble value is: \(value.toDebugString())")
- switch bubbleResponseState {
- case .bubbleInfo:
- hardware = value[value.count-2].description + "." + value[value.count-1].description
- firmware = value[2].description + "." + value[3].description
- //let patchInfo = Data(Double(firmware)! < 1.35 ? value[3...8] : value[5...10])
- battery = Int(value[4])
-
- bLogger.debug("dabear:: Got bubbledevice: \(self.metadata.debugDescription)")
- if let writeCharacteristic = writeCharacteristic {
-
- peripheral.writeValue(Data([0x02, 0x00, 0x00, 0x00, 0x00, 0x2B]), for: writeCharacteristic, type: .withResponse)
- }
- case .dataPacket://, .decryptedDataPacket:
- rxBuffer.append(value.suffix(from: 4))
- bLogger.debug("dabear:: aggregated datapacket is now of length: \(self.rxBuffer.count)")
- if rxBuffer.count >= 352 {
- handleCompleteMessage()
- reset()
- }
- case .noSensor:
- delegate?.libreTransmitterReceivedMessage(0x0000, txFlags: 0x34, payloadData: rxBuffer)
-
- reset()
- case .serialNumber:
- guard value.count >= 10 else { return }
- reset()
- self.uid = [UInt8](value.subdata(in: 2..<10))
-
- //for historical reasons
- rxBuffer.append(value.subdata(in: 2..<10))
-
- case .patchInfo:
- guard value.count >= 10 else {
- bLogger.debug("not able to extract patchinfo")
- return
- }
- patchInfo = value.subdata(in: 5 ..< 11).hexEncodedString().uppercased()
- }
- }
-
- private var rxBuffer = Data()
- private var sensorData: SensorData?
- private var metadata: LibreTransmitterMetadata?
-
- override func handleCompleteMessage() {
- bLogger.debug("dabear:: bubbleHandleCompleteMessage")
-
- guard rxBuffer.count >= 352 else {
- return
- }
-
- metadata = .init(hardware: hardware ?? "unknown", firmware: firmware ?? "unknown", battery: battery ?? 100, name: Self.shortTransmitterName, macAddress: self.mac, patchInfo: patchInfo, uid: self.uid)
-
- let data = rxBuffer.subdata(in: 8..<352)
- bLogger.debug("dabear:: bubbleHandleCompleteMessage raw data: \([UInt8](self.rxBuffer))")
- sensorData = SensorData(uuid: rxBuffer.subdata(in: 0..<8), bytes: [UInt8](data), date: Date())
-
- bLogger.debug("dabear:: bubble got sensordata \(self.sensorData.debugDescription) and metadata \(self.metadata.debugDescription), delegate is \(self.delegate.debugDescription)")
-
- if let sensorData = sensorData, let metadata = metadata {
- delegate?.libreTransmitterDidUpdate(with: sensorData, and: metadata)
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/Libre2DirectTransmitter.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/Libre2DirectTransmitter.swift
deleted file mode 100644
index 5ec85509f..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/Libre2DirectTransmitter.swift
+++ /dev/null
@@ -1,158 +0,0 @@
-//
-// Libre2DirectTransmitter.swift
-
-
-import CoreBluetooth
-import Foundation
-import os.log
-import UIKit
-
-
-
-
-class Libre2DirectTransmitter: LibreTransmitterProxyProtocol {
-
-
- fileprivate lazy var logger = Logger(forType: Self.self)
-
- func reset() {
- rxBuffer.resetAllBytes()
- }
-
- class var manufacturerer: String {
- "Abbott"
- }
-
- class var smallImage: UIImage? {
- UIImage(named: "libresensor", in: Bundle.module, compatibleWith: nil)
- }
-
- class var shortTransmitterName: String {
- "libre2"
- }
-
- class var requiresDelayedReconnect : Bool {
- false
- }
-
- private let expectedBufferSize = 46
- static var requiresSetup = true
- static var requiresPhoneNFC: Bool = true
-
- static var writeCharacteristic: UUIDContainer? = "F001"//0000f001-0000-1000-8000-00805f9b34fb"
- static var notifyCharacteristic: UUIDContainer? = "F002"//"0000f002-0000-1000-8000-00805f9b34fb"
- //static var serviceUUID: [UUIDContainer] = ["0000fde3-0000-1000-8000-00805f9b34fb"]
- static var serviceUUID: [UUIDContainer] = ["FDE3"]
-
- weak var delegate: LibreTransmitterDelegate?
-
- private var rxBuffer = Data()
- private var sensorData: SensorData?
- private var metadata: LibreTransmitterMetadata?
-
- class func canSupportPeripheral(_ peripheral: CBPeripheral) -> Bool {
- peripheral.name?.lowercased().starts(with: "abbott") ?? false
- }
-
- class func getDeviceDetailsFromAdvertisement(advertisementData: [String: Any]?) -> String? {
- nil
- }
-
- required init(delegate: LibreTransmitterDelegate, advertisementData: [String: Any]?) {
- //advertisementData is unknown for the miaomiao
- self.delegate = delegate
- }
-
- func requestData(writeCharacteristics: CBCharacteristic, peripheral: CBPeripheral) {
- //because of timing issues, we cannot use this method on libre2 eu sensors
- }
-
- func updateValueForNotifyCharacteristics(_ value: Data, peripheral: CBPeripheral, writeCharacteristic: CBCharacteristic?) {
- rxBuffer.append(value)
-
- logger.debug("libre2 direct Appended value with length \(String(describing: value.count)), buffer length is: \(String(describing: self.rxBuffer.count))")
-
-
- if rxBuffer.count == expectedBufferSize {
- handleCompleteMessage()
- }
-
-
- }
-
-
-
- func didDiscoverWriteCharacteristics(_ peripheral: CBPeripheral, writeCharacteristics: CBCharacteristic) {
-
- guard let unlock = unlock() else{
- logger.debug("Cannot unlock sensor, aborting")
- return
- }
-
- logger.debug("Writing streaming unlock code to peripheral: \(unlock.hexEncodedString())")
- peripheral.writeValue(unlock, for: writeCharacteristics, type: .withResponse)
-
-
- }
-
-
-
- func didDiscoverNotificationCharacteristic(_ peripheral: CBPeripheral, notifyCharacteristic: CBCharacteristic) {
-
- logger.debug("libre2: saving notifyCharacteristic")
- //peripheral.setNotifyValue(true, for: notifyCharacteristic)
- logger.debug("libre2 setting notify while discovering : \(String(describing: notifyCharacteristic.debugDescription))")
- peripheral.setNotifyValue(true, for: notifyCharacteristic)
- }
-
-
- private func unlock() -> Data? {
-
- guard var sensor = UserDefaults.standard.preSelectedSensor else {
- logger.debug("impossible to unlock sensor")
- return nil
- }
-
- sensor.unlockCount = sensor.unlockCount + 1
-
- UserDefaults.standard.preSelectedSensor = sensor
-
- let unlockPayload = Libre2.streamingUnlockPayload(sensorUID: sensor.uuid, info: sensor.patchInfo, enableTime: 42, unlockCount: UInt16(sensor.unlockCount))
- return Data(unlockPayload)
-
- }
-
- func handleCompleteMessage() {
- guard rxBuffer.count >= expectedBufferSize else {
- logger.debug("libre2 handle complete message with incorrect buffersize")
- reset()
- return
- }
-
- guard let sensor = UserDefaults.standard.preSelectedSensor else {
- logger.debug("libre2 handle complete message without sensorinfo present")
- reset()
- return
- }
-
-
- do {
- let decryptedBLE = Data(try Libre2.decryptBLE(id: [UInt8](sensor.uuid), data: [UInt8](rxBuffer)))
- let sensorUpdate = Libre2.parseBLEData(decryptedBLE)
-
- metadata = LibreTransmitterMetadata(hardware: "-", firmware: "-", battery: 100, name: Self.shortTransmitterName, macAddress: nil, patchInfo: sensor.patchInfo.hexEncodedString().uppercased(), uid: [UInt8](sensor.uuid))
-
- delegate?.libreSensorDidUpdate(with: sensorUpdate, and: metadata!)
-
- print("libre2 got sensorupdate: \(String(describing: sensorUpdate))")
-
- } catch {
-
- }
-
- reset()
-
- }
-
-
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/LibreTransmitterProxyManager.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/LibreTransmitterProxyManager.swift
deleted file mode 100644
index 26dcf5480..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/LibreTransmitterProxyManager.swift
+++ /dev/null
@@ -1,729 +0,0 @@
-//
-// MiaoMiaoManager.swift
-// LibreMonitor
-//
-// Created by Uwe Petersen on 10.03.18, heravily modified by Bjørn Berg.
-// Copyright © 2018 Uwe Petersen. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import HealthKit
-import os.log
-import UIKit
-
-public enum BluetoothmanagerState: String {
- case Unassigned = "Unassigned"
- case Scanning = "Scanning"
- case Disconnected = "Disconnected"
- case DelayedReconnect = "Will soon reconnect"
- case DisconnectingDueToButtonPress = "Disconnecting due to button press"
- case Connecting = "Connecting"
- case Connected = "Connected"
- case Notifying = "Notifying"
- case powerOff = "powerOff"
- case UnknownDevice = "UnknownDevice"
-}
-
-public protocol LibreTransmitterDelegate: AnyObject {
- // Can happen on any queue
- func libreTransmitterStateChanged(_ state: BluetoothmanagerState)
- func libreTransmitterReceivedMessage(_ messageIdentifier: UInt16, txFlags: UInt8, payloadData: Data)
- // Will always happen on managerQueue
- func libreTransmitterDidUpdate(with sensorData: SensorData, and Device: LibreTransmitterMetadata)
- func libreSensorDidUpdate(with bleData: Libre2.LibreBLEResponse, and Device: LibreTransmitterMetadata)
-
- func noLibreTransmitterSelected()
- func libreManagerDidRestoreState(found peripherals: [CBPeripheral], connected to: CBPeripheral?)
-}
-
-extension LibreTransmitterDelegate {
- func noLibreTransmitterSelected() {}
- public func libreManagerDidRestoreState(found peripherals: [CBPeripheral], connected to: CBPeripheral?) {}
-}
-
-final class LibreTransmitterProxyManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate, LibreTransmitterDelegate {
- func libreSensorDidUpdate(with bleData: Libre2.LibreBLEResponse, and Device: LibreTransmitterMetadata) {
- dispatchToDelegate { manager in
- manager.delegate?.libreSensorDidUpdate(with: bleData, and: Device)
- }
- }
-
-
-
- func libreManagerDidRestoreState(found peripherals: [CBPeripheral], connected to: CBPeripheral?) {
- dispatchToDelegate { manager in
- manager.delegate?.libreManagerDidRestoreState(found: peripherals, connected: to)
- }
- }
-
- func noLibreTransmitterSelected() {
- dispatchToDelegate { manager in
- manager.delegate?.noLibreTransmitterSelected()
- }
- }
-
- func libreTransmitterStateChanged(_ state: BluetoothmanagerState) {
-
- logger.debug("libreTransmitterStateChanged delegating")
- dispatchToDelegate { manager in
- manager.delegate?.libreTransmitterStateChanged(state)
- }
- }
-
- func libreTransmitterReceivedMessage(_ messageIdentifier: UInt16, txFlags: UInt8, payloadData: Data) {
-
- logger.debug("libreTransmitterReceivedMessage delegating")
- dispatchToDelegate { manager in
- manager.delegate?.libreTransmitterReceivedMessage(messageIdentifier, txFlags: txFlags, payloadData: payloadData)
- }
- }
-
- func libreTransmitterDidUpdate(with sensorData: SensorData, and Device: LibreTransmitterMetadata) {
- self.metadata = Device
- self.sensorData = sensorData
-
- logger.debug("libreTransmitterDidUpdate delegating")
- dispatchToDelegate { manager in
- manager.delegate?.libreTransmitterDidUpdate(with: sensorData, and: Device)
- }
- }
-
- // MARK: - Properties
- private var wantsToTerminate = false
- //private var lastConnectedIdentifier : String?
-
- var activePlugin: LibreTransmitterProxyProtocol? = nil {
- didSet {
-
- logger.debug("dabear:: activePlugin changed from \(oldValue.debugDescription) to \(self.activePlugin.debugDescription)")
-
- }
- }
-
- var activePluginType: LibreTransmitterProxyProtocol.Type? {
- activePlugin?.staticType
- }
-
- var shortTransmitterName: String? {
- activePluginType?.shortTransmitterName
- }
-
-
- fileprivate lazy var logger = Logger(forType: Self.self)
- var metadata: LibreTransmitterMetadata?
-
- var centralManager: CBCentralManager!
- var peripheral: CBPeripheral?
- // var slipBuffer = SLIPBuffer()
- var writeCharacteristic: CBCharacteristic?
-
- var sensorData: SensorData?
-
- public var identifier: UUID? {
- peripheral?.identifier
- }
-
- private let managerQueue = DispatchQueue(label: "no.bjorninge.bluetoothManagerQueue", qos: .utility)
- private let delegateQueue = DispatchQueue(label: "no.bjorninge.delegateQueue", qos: .utility)
-
- fileprivate var serviceUUIDs: [CBUUID]? {
- activePluginType?.serviceUUID.map { $0.value }
- }
- fileprivate var writeCharachteristicUUID: CBUUID? {
- activePluginType?.writeCharacteristic?.value
- }
- fileprivate var notifyCharacteristicUUID: CBUUID? {
- activePluginType?.notifyCharacteristic?.value
- }
-
- weak var delegate: LibreTransmitterDelegate? {
- didSet {
- dispatchToDelegate { manager in
- // Help delegate initialize by sending current state directly after delegate assignment
- manager.delegate?.libreTransmitterStateChanged(self.state)
- }
- }
- }
-
- private var state: BluetoothmanagerState = .Unassigned {
- didSet {
- dispatchToDelegate { manager in
- // Help delegate initialize by sending current state directly after delegate assignment
- manager.delegate?.libreTransmitterStateChanged(self.state)
- }
- }
- }
- public var connectionStateString: String {
- self.state.rawValue
- }
-
- public func dispatchToDelegate( _ closure :@escaping (_ aself: LibreTransmitterProxyManager) -> Void ) {
- delegateQueue.async { [weak self] in
- if let self = self {
- closure(self)
- }
- }
- }
-
- // MARK: - Methods
-
- override init() {
- super.init()
- logger.debug("LibreTransmitterProxyManager called")
- managerQueue.sync {
- let restoreID = (bundleSeedID() ?? "Unknown") + "BluetoothRestoreIdentifierKey"
- centralManager = CBCentralManager(delegate: self, queue: managerQueue, options: [CBCentralManagerOptionShowPowerAlertKey: true, CBCentralManagerOptionRestoreIdentifierKey: restoreID])
- }
- }
-
- func scanForDevices() {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- logger.debug("Scan for bluetoothdevice while internal state= \(String(describing: self.state)), bluetoothstate=\(String(describing: self.centralManager.state))")
-
- guard centralManager.state == .poweredOn else {
- return
- }
-
- logger.debug("Before scan for libre bluetooth device while central manager state was \(String(describing: self.centralManager.state.rawValue)))")
-
- let scanForAllServices = false
-
- //this will search for all peripherals. Guaranteed to work
- if scanForAllServices {
-
- logger.debug("Scanning for all services:")
- centralManager.scanForPeripherals(withServices: nil, options: nil)
- } else {
- // This is what we should have done
- // Here we optimize by scanning only for relevant services
- // However, this doesn't work correctly with both miaomiao and bubble
- let services = LibreTransmitters.all.getServicesForDiscovery()
- logger.debug("Scanning for specific services: \(String(describing: services.map { $0.uuidString }))")
- centralManager.scanForPeripherals(withServices: services, options: nil)
-
- }
-
- state = .Scanning
- }
-
- private func reset() {
- logger.debug("manager is resetting the activeplugin")
-
- self.activePlugin?.reset()
- }
-
- private func connect(force forceConnect: Bool = false, advertisementData: [String: Any]?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- logger.debug("connect while state: \(String(describing: self.state.rawValue))")
- if centralManager.isScanning {
- centralManager.stopScan()
- }
- if state == .DisconnectingDueToButtonPress && !forceConnect {
-
- logger.debug("Connect aborted, user has actively disconnected and a reconnect was not forced")
- return
- }
-
- if let peripheral = self.peripheral {
- peripheral.delegate = self
-
- if activePlugin?.canSupportPeripheral(peripheral) == true {
- //when reaching this part,
- //we are sure the peripheral is reconnecting and therefore needs reset
-
- logger.debug("Connecting to known device with known plugin")
-
- self.reset()
-
- centralManager.connect(peripheral, options: nil)
- state = .Connecting
- } else if let plugin = LibreTransmitters.getSupportedPlugins(peripheral)?.first {
- self.activePlugin = plugin.init(delegate: self, advertisementData: advertisementData)
-
- logger.debug("Connecting to new device with known plugin")
-
- //only connect to devices we can support (i.e. devices that has a suitable plugin)
- centralManager.connect(peripheral, options: nil)
- state = .Connecting
- } else {
- state = .UnknownDevice
- }
- }
- }
-
- func disconnectManually() {
- dispatchPrecondition(condition: .notOnQueue(managerQueue))
- logger.debug("Disconnect manually while state \(String(describing: self.state.rawValue))" )
-
- managerQueue.sync {
- switch self.state {
- case .Connected, .Connecting, .Notifying, .Scanning:
- self.state = .DisconnectingDueToButtonPress // to avoid reconnect in didDisconnetPeripheral
-
- self.wantsToTerminate = true
- default:
- break
- }
-
- if centralManager.isScanning {
- logger.debug("Stopping scan")
- centralManager.stopScan()
- }
- if let peripheral = peripheral {
- centralManager.cancelPeripheralConnection(peripheral)
- }
- }
- }
-
- // MARK: - CBCentralManagerDelegate
-
- func centralManagerDidUpdateState(_ central: CBCentralManager) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- logger.debug("Central Manager did update state to \(String(describing: central.state.rawValue))")
-
- switch central.state {
- case .poweredOff:
- state = .powerOff
- case .resetting, .unauthorized, .unknown, .unsupported:
- logger.debug("Central Manager was either .poweredOff, .resetting, .unauthorized, .unknown, .unsupported: \(String(describing: central.state))")
- state = .Unassigned
-
- if central.state == .resetting, let peripheral = self.peripheral {
- logger.debug("Central Manager resetting, will cancel peripheral connection")
- central.cancelPeripheralConnection(peripheral)
- self.peripheral = nil
- }
-
- if central.isScanning {
- central.stopScan()
- }
- case .poweredOn:
-
- if state == .DisconnectingDueToButtonPress {
- logger.debug("Central Manager was powered on but sensorstate was DisconnectingDueToButtonPress: \(String(describing: central.state))")
-
- return
- }
-
- logger.debug("Central Manager was powered on")
-
-
- //not sure if needed, but can be helpful when state is restored
- if let peripheral = peripheral, delegate != nil {
- // do not scan if already connected
- switch peripheral.state {
- case .disconnected, .disconnecting:
- logger.debug("Central Manager was powered on, peripheral state is disconnecting")
- self.connect(advertisementData: nil)
- case .connected, .connecting:
- logger.debug("Central Manager was powered on, peripheral state is connected/connecting, renewing plugin")
-
- // This is necessary
- // Normally the connect() method would have set the correct plugin,
- // however when we hit this path, it is likely a state restoration
- if self.activePlugin == nil || self.activePlugin?.canSupportPeripheral(peripheral) == false {
- let plugin = LibreTransmitters.getSupportedPlugins(peripheral)?.first
- self.activePlugin = plugin?.init(delegate: self, advertisementData: nil)
-
-
- logger.debug("Central Manager was powered on, peripheral state is connected/connecting, stopping scan")
- if central.isScanning && peripheral.state == .connected {
- central.stopScan()
- }
- if peripheral.delegate == nil {
- logger.debug("Central Manager was powered on, peripheral delegate was nil")
-
- }
- }
-
- if let serviceUUIDs = serviceUUIDs, !serviceUUIDs.isEmpty {
- peripheral.discoverServices(serviceUUIDs) // good practice to just discover the services, needed
- } else {
- logger.debug("Central Manager was powered on, could not discover services")
-
- }
-
- default:
- logger.debug("Central Manager already connected")
- }
- } else {
-
-
- if let preselected = UserDefaults.standard.preSelectedDevice,
- let uuid = UUID(uuidString: preselected),
- let newPeripheral = centralManager.retrievePeripherals(withIdentifiers: [uuid]).first,
- let plugin = LibreTransmitters.getSupportedPlugins(newPeripheral)?.first {
- logger.debug("Central Manager was powered on, directly connecting to already known peripheral \(newPeripheral): \(String(describing: self.state))")
- self.peripheral = newPeripheral
- self.peripheral?.delegate = self
-
- self.activePlugin = plugin.init(delegate: self, advertisementData: nil)
-
- managerQueue.async {
- self.state = .Connecting
- self.centralManager.connect(newPeripheral, options: nil)
-
- }
-
- } else {
- //state should be nassigned here
- logger.debug("Central Manager was powered on, scanningfordevice: \(String(describing: self.state))")
- scanForDevices() // power was switched on, while app is running -> reconnect.
-
- }
-
-
- }
- @unknown default:
- fatalError("libre bluetooth state unhandled")
- }
- }
-
- func centralManager(_ central: CBCentralManager, willRestoreState dict: [String: Any]) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- logger.debug("Central Manager will restore state to \(String(describing: dict.debugDescription))")
-
-
- guard self.peripheral == nil else {
- logger.debug("Central Manager tried to restore state while already connected")
- return
- }
-
- guard let preselected = UserDefaults.standard.preSelectedDevice else {
- logger.debug("Central Manager tried to restore state but no device was preselected")
- return
- }
-
- guard let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey] as? [CBPeripheral] else {
- logger.debug("Central Manager tried to restore state but no peripheral found")
- self.scanForDevices()
- return
- }
-
- defer {
- self.libreManagerDidRestoreState(found: peripherals, connected: self.peripheral)
- }
-
- let restorablePeripheral = peripherals.first(where: { $0.identifier.uuidString == preselected })
-
- guard let peripheral = restorablePeripheral else {
- return
- }
-
- self.peripheral = peripheral
- peripheral.delegate = self
-
- switch peripheral.state {
- case .disconnected, .disconnecting:
- logger.debug("Central Manager tried to restore state from disconnected peripheral")
- state = .Disconnected
- self.connect(advertisementData: nil)
- case .connecting:
- logger.debug("Central Manager tried to restore state from connecting peripheral")
- state = .Connecting
- case .connected:
- logger.debug("Central Manager tried to restore state from connected peripheral, letting centralManagerDidUpdateState() do the rest of the job")
- //the idea here is to let centralManagerDidUpdateState() do the heavy lifting
- // after all, we did assign the periheral.delegate to self earlier
-
- //that means the following is not necessary:
- //state = .Connected
- //peripheral.discoverServices(serviceUUIDs) // good practice to just discover the services, needed
- @unknown default:
- fatalError("Failed due to unkown default, Uwe!")
- }
- }
-
- func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- logger.debug("Did discover peripheral while state \(String(describing: self.state.rawValue)) with name: \(String(describing: peripheral.name)), wantstoterminate?: \(self.wantsToTerminate)")
-
-
- // Libre2:
- // during setup, we find the uid by scanning via nfc
- // first time connecting to a libre2 sensor via bluetooth we don't know its peripheral identifier
- // but since the uid is also part of the libre 2bluetooth advertismentdata we trade uid for
-
- if let selectedUid = UserDefaults.standard.preSelectedUid {
- logger.debug("Was asked to connect preselected libre2 by uid: \(selectedUid.hex), discovered devicename is: \(String(describing: peripheral.name))")
-
- guard let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data else {
- return
- }
-
- guard manufacturerData.count == 8 else {
- return
- }
-
- var foundUUID = manufacturerData.subdata(in: 2..<8)
- foundUUID.append(contentsOf: [0x07, 0xe0])
-
- guard foundUUID == selectedUid && Libre2DirectTransmitter.canSupportPeripheral(peripheral) else {
- return
- }
-
- //next time we search via bluetooth, let's identify the sensor with its bluetooth identifier
- UserDefaults.standard.preSelectedUid = nil
- UserDefaults.standard.preSelectedDevice = peripheral.identifier.uuidString
-
- logger.debug("ManufacturerData: \(manufacturerData), found uid: \(foundUUID)")
-
- logger.debug("Did connect to preselected \(String(describing: peripheral.name)) with identifier \(String(describing: peripheral.identifier.uuidString)) and uid \(selectedUid.hex)")
- self.peripheral = peripheral
-
- self.connect(force: true, advertisementData: advertisementData)
-
-
- return
-
- }
-
- if let preselected = UserDefaults.standard.preSelectedDevice {
- if peripheral.identifier.uuidString == preselected {
- logger.debug("Did connect to preselected \(String(describing: peripheral.name)) with identifier \(String(describing: peripheral.identifier.uuidString))")
- self.peripheral = peripheral
-
- self.connect(force: true, advertisementData: advertisementData)
- } else {
- logger.info("Did not connect to \(String(describing: peripheral.name)) with identifier \(String(describing: peripheral.identifier.uuidString)), because another device with identifier \(preselected) was selected")
- }
-
- return
- } else {
- self.noLibreTransmitterSelected()
- }
- }
-
- func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- logger.debug("Did connect peripheral while state \(String(describing: self.state.rawValue)) with name: \(String(describing: peripheral.name))")
- if central.isScanning {
- central.stopScan()
- }
- state = .Connected
- //self.lastConnectedIdentifier = peripheral.identifier.uuidString
- // Discover all Services. This might be helpful if writing is needed some time
- peripheral.discoverServices(serviceUUIDs)
- }
-
- func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- logger.debug("Did fail to connect peripheral while state: \(String(describing: self.state.rawValue))")
- if let error = error {
- logger.error("Did fail to connect peripheral error: \(error.localizedDescription)")
- }
- state = .Disconnected
-
- self.reconnect()
- }
-
- private func reconnect() {
- let withDelay = self.activePluginType?.requiresDelayedReconnect == true
- if withDelay {
- delayedReconnect()
- } else {
- reconnectImmediately()
- }
- }
-
- private func reconnectImmediately() {
- self.connect(advertisementData: nil)
- }
-
- private func delayedReconnect(_ seconds: Double = 7) {
- state = .DelayedReconnect
-
- logger.debug("Will reconnect peripheral in \(String(describing: seconds)) seconds")
- self.reset()
- // attempt to avoid IOS killing app because of cpu usage.
- // postpone connecting for x seconds
- DispatchQueue.global(qos: .utility).async { [weak self] in
- Thread.sleep(forTimeInterval: seconds)
- self?.managerQueue.sync {
- self?.connect(advertisementData: nil)
- }
- }
- }
-
- func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- logger.debug("Did disconnect peripheral while state: \(String(describing: self.state.rawValue)))")
- if let error = error {
- logger.error("Did disconnect peripheral error: \(error.localizedDescription)")
- }
-
- switch state {
- case .DisconnectingDueToButtonPress:
- state = .Disconnected
- self.wantsToTerminate = true
-
- default:
- state = .Disconnected
- self.reconnect()
-
- // scanForMiaoMiao()
- }
- }
-
- // MARK: - CBPeripheralDelegate
-
- func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- logger.debug("Did discover services. is plugin nil? \((self.activePlugin == nil ? "nil" : "not nil"))")
- if let error = error {
- logger.error("Did discover services error: \(error.localizedDescription)")
- }
-
- if let services = peripheral.services {
- for service in services {
- let toDiscover = [writeCharachteristicUUID, notifyCharacteristicUUID].compactMap { $0 }
-
- logger.debug("Will discover : \(String(describing: toDiscover.count)) Characteristics for service \(String(describing: service.debugDescription))")
-
- if !toDiscover.isEmpty {
- peripheral.discoverCharacteristics(toDiscover, for: service)
-
- logger.debug("Did discover service: \(String(describing: service.debugDescription))")
- }
- }
- }
- }
-
- func didDiscoverNotificationCharacteristic(_ peripheral: CBPeripheral, notifyCharacteristic characteristic: CBCharacteristic){
-
-
- logger.debug("Did discover characteristic: \(String(describing: characteristic.debugDescription)) and asking activeplugin to handle it as a notification Characteristic")
-
- self.activePlugin?.didDiscoverNotificationCharacteristic(peripheral, notifyCharacteristic: characteristic)
-
-
-
-
- }
-
- func didDiscoverWriteCharacteristic(_ peripheral: CBPeripheral, writeCharacteristic characteristic: CBCharacteristic){
- writeCharacteristic = characteristic
- logger.debug("Did discover characteristic: \(String(describing: characteristic.debugDescription)) and asking activeplugin to handle it as a write Characteristic")
- self.activePlugin?.didDiscoverWriteCharacteristics(peripheral, writeCharacteristics: characteristic)
-
-
- }
-
- func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- logger.debug("Did discover characteristics for service \(String(describing: peripheral.name))")
-
- if let error = error {
- logger.error("Did discover characteristics for service error: \(error.localizedDescription)")
- }
-
- if let characteristics = service.characteristics {
- for characteristic in characteristics {
-
- logger.debug("Did discover characteristic: \(String(describing: characteristic.debugDescription))")
- if characteristic.properties.intersection(.notify) == .notify && characteristic.uuid == notifyCharacteristicUUID {
- didDiscoverNotificationCharacteristic(peripheral, notifyCharacteristic: characteristic)
- }
- if characteristic.uuid == writeCharachteristicUUID {
- didDiscoverWriteCharacteristic(peripheral, writeCharacteristic: characteristic)
- }
- }
- } else {
- logger.debug("Discovered characteristics, but no characteristics listed. There must be some error.")
- }
- }
-
- func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- logger.debug("Did update notification state for characteristic: \(String(describing: characteristic.debugDescription))")
-
- if let error = error {
- logger.error("Peripheral did update notification state for characteristic: \(error.localizedDescription) with error")
- } else {
- self.reset()
- requestData()
- }
- state = .Notifying
- }
-
- private var lastNotifyUpdate: Date?
- func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
-
- let now = Date()
-
- // We can expect thedevices to complete well within 5 seconds for all the telegrams combined in a session
- // it is therefore reasonable to expect the time between one telegram
- // to the other in the same session to be well within 6 seconds
- // this path will be hit when a telegram for some reason is dropped
- // in a session. Or that the user disconnecting and reconnecting during a transmission
- // By resetting here we ensure that the rxbuffer doesn't leak over into the next session
- // Leaking over into the next session, is however not a problem for consitency as we always check the CRC's anyway
- if let lastNotifyUpdate = self.lastNotifyUpdate, now > lastNotifyUpdate.addingTimeInterval(6) {
- logger.debug("dabear:: there hasn't been any traffic to the \((self.activePluginType?.shortTransmitterName).debugDescription) plugin for more than 10 seconds, so we reset now")
- self.reset()
- }
-
- logger.debug("Did update value for characteristic: \(String(describing: characteristic.debugDescription))")
-
- self.lastNotifyUpdate = now
-
- if let error = error {
- logger.error("Characteristic update error: \(error.localizedDescription)")
- } else {
- if characteristic.uuid == notifyCharacteristicUUID, let value = characteristic.value {
- if self.activePlugin == nil {
- logger.error("Characteristic update error: activeplugin was nil")
- }
- self.activePlugin?.updateValueForNotifyCharacteristics(value, peripheral: peripheral, writeCharacteristic: writeCharacteristic)
- }
- }
- }
-
- func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
- dispatchPrecondition(condition: .onQueue(managerQueue))
- logger.debug("Did Write value \(String(describing: characteristic.value?.hexEncodedString())) for characteristic \(String(characteristic.debugDescription))")
- self.activePlugin?.didWrite(peripheral, characteristics: characteristic)
-
- }
-
- func requestData() {
- guard let peripheral = peripheral,
- let writeCharacteristic = writeCharacteristic else {
- return
- }
- self.activePlugin?.requestData(writeCharacteristics: writeCharacteristic, peripheral: peripheral)
- }
-
- deinit {
- self.activePlugin = nil
- self.delegate = nil
- logger.debug("dabear:: miaomiaomanager deinit called")
- }
-}
-
-extension LibreTransmitterProxyManager {
- public var manufacturer: String {
- activePluginType?.manufacturerer ?? "n/a"
- }
-
- var device: HKDevice? {
- HKDevice(
- name: "MiaomiaoClient",
- manufacturer: manufacturer,
- model: nil, //latestSpikeCollector,
- hardwareVersion: self.metadata?.hardware ,
- firmwareVersion: self.metadata?.firmware,
- softwareVersion: nil,
- localIdentifier: identifier?.uuidString,
- udiDeviceIdentifier: nil
- )
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/LibreTransmitterProxyProtocol.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/LibreTransmitterProxyProtocol.swift
deleted file mode 100644
index 4ce61d996..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/LibreTransmitterProxyProtocol.swift
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-// LibreTransmitter.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 08/01/2020.
-// Copyright © 2020 Bjørn Inge Berg. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-import UIKit
-public protocol LibreTransmitterProxyProtocol: AnyObject {
- static var shortTransmitterName: String { get }
- static var smallImage: UIImage? { get }
- static var manufacturerer: String { get }
- static var requiresPhoneNFC: Bool { get }
- static var requiresSetup : Bool { get }
- static func canSupportPeripheral(_ peripheral: CBPeripheral) -> Bool
-
- static var writeCharacteristic: UUIDContainer? { get set }
- static var notifyCharacteristic: UUIDContainer? { get set }
- static var serviceUUID: [UUIDContainer] { get set }
-
- var delegate: LibreTransmitterDelegate? { get set }
- init(delegate: LibreTransmitterDelegate, advertisementData: [String: Any]? )
- func requestData(writeCharacteristics: CBCharacteristic, peripheral: CBPeripheral)
- func updateValueForNotifyCharacteristics(_ value: Data, peripheral: CBPeripheral, writeCharacteristic: CBCharacteristic?)
- func didDiscoverWriteCharacteristics(_ peripheral: CBPeripheral, writeCharacteristics: CBCharacteristic)
- func didDiscoverNotificationCharacteristic(_ peripheral: CBPeripheral, notifyCharacteristic: CBCharacteristic)
- func didWrite(_ peripheral: CBPeripheral, characteristics: CBCharacteristic)
-
- func reset()
-
-
-
-
- static func getDeviceDetailsFromAdvertisement(advertisementData: [String: Any]?) -> String?
-
-}
-
-extension LibreTransmitterProxyProtocol {
- func canSupportPeripheral(_ peripheral: CBPeripheral) -> Bool {
- Self.canSupportPeripheral(peripheral)
- }
- public var staticType: LibreTransmitterProxyProtocol.Type {
- Self.self
- }
-
- func didDiscoverWriteCharacteristics(_ peripheral: CBPeripheral, writeCharacteristics: CBCharacteristic) {
-
- }
-
- func didDiscoverNotificationCharacteristic(_ peripheral: CBPeripheral, notifyCharacteristic: CBCharacteristic) {
- print("Setting setNotifyValue on notifyCharacteristic")
- peripheral.setNotifyValue(true, for: notifyCharacteristic)
- }
-
- func didWrite(_ peripheral: CBPeripheral, characteristics: CBCharacteristic) {
-
- }
-
- static var requiresSetup : Bool { return false}
- static var requiresPhoneNFC: Bool { return false }
-
- static var requiresDelayedReconnect: Bool { return false}
-}
-
-extension Array where Array.Element == LibreTransmitterProxyProtocol.Type {
- func getServicesForDiscovery() -> [CBUUID] {
- self.flatMap {
- return $0.serviceUUID.map { $0.value }
- }.removingDuplicates()
- }
-}
-
-public enum LibreTransmitters {
- public static var all: [LibreTransmitterProxyProtocol.Type] {
- [MiaoMiaoTransmitter.self, BubbleTransmitter.self, Libre2DirectTransmitter.self]
- }
- public static func isSupported(_ peripheral: CBPeripheral) -> Bool {
- getSupportedPlugins(peripheral)?.isEmpty == false
- }
-
- public static func getSupportedPlugins(_ peripheral: CBPeripheral) -> [LibreTransmitterProxyProtocol.Type]? {
- all.enumerated().compactMap {
- $0.element.canSupportPeripheral(peripheral) ? $0.element : nil
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/MiaomiaoTransmitter.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/MiaomiaoTransmitter.swift
deleted file mode 100644
index af648a1f7..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/MiaomiaoTransmitter.swift
+++ /dev/null
@@ -1,337 +0,0 @@
-//
-// MiaomiaoTransmitter.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 01/08/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-// How does the MiaoMiao work?
-//
-// 0.) Advertising
-// MiaoMiao advertises with the following data:
-// - key : "kCBAdvDataIsConnectable" - value : 1
-// - key : "kCBAdvDataManufacturerData" - value : <0034cb1c 53093fb4> -> This might be usable as a unique device id.
-// - key : "kCBAdvDataLocalName" - value : miaomiao
-//
-// 1.) Services
-/// The MiaoMiao has two bluetooth services, one provided for the open source community and one that is probably to be used by the Tomato app.
-// a) UUID: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E -> Open Source Community
-// Did discover service:
-// b) UUID: 00001532-1212-EFDE-1523-785FEABCD123
-// Did discover service:
-//
-// 2.) Characteristics for open source service with UUID 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
-//
-// The service contains two characheristics:
-//
-// a) Notify_Characteristic
-// UUID: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E
-// ""
-// ... with properties:
-// __C.CBCharacteristicProperties(rawValue: 16)
-// Broadcast: [false]
-// Read: [false]
-// WriteWithoutResponse: [false]
-// Write: [false]
-// Notify: [true]
-// Indicate: [false]
-// AuthenticatedSignedWrites: [false]
-// ExtendedProperties: [false]
-// NotifyEncryptionRequired: [false]
-// BroaIndicateEncryptionRequireddcast: [false]
-// Service for Characteristic: [""]
-//
-// b) Write_Characteristic
-// UUID: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E
-// ""
-// ... with properties:
-// __C.CBCharacteristicProperties(rawValue: 12)
-// Broadcast: [false]
-// Read: [false]
-// WriteWithoutResponse: [true]
-// Write: [true]
-// Notify: [false]
-// Indicate: [false]
-// AuthenticatedSignedWrites: [false]
-// ExtendedProperties: [false]
-// NotifyEncryptionRequired: [false]
-// BroaIndicateEncryptionRequireddcast: [false]
-// Service for Characteristic: [""]
-//
-// 3.) Characteristics for (possibly) Tomato app services with UUID 00001532-1212-EFDE-1523-785FEABCD123
-//
-// The service contains three characteristics
-//
-// a) Read characteristic
-// ""
-// ... with properties:
-// __C.CBCharacteristicProperties(rawValue: 2)
-// Broadcast: [false]
-// Read: [true]
-// WriteWithoutResponse: [false]
-// Write: [false]
-// Notify: [false]
-// Indicate: [false]
-// AuthenticatedSignedWrites: [false]
-// ExtendedProperties: [false]
-// NotifyEncryptionRequired: [false]
-// BroaIndicateEncryptionRequireddcast: [false]
-// Service for Characteristic: [""]
-//
-// b) Write without respons characteristic
-// Characteristic:
-// ""
-// ... with properties:
-// __C.CBCharacteristicProperties(rawValue: 4)
-// Broadcast: [false]
-// Read: [false]
-// WriteWithoutResponse: [true]
-// Write: [false]
-// Notify: [false]
-// Indicate: [false]
-// AuthenticatedSignedWrites: [false]
-// ExtendedProperties: [false]
-// NotifyEncryptionRequired: [false]
-// BroaIndicateEncryptionRequireddcast: [false]
-// Service for Characteristic: [""]
-//
-// c) Write and notify characteristic
-// ""
-// ... with properties:
-// __C.CBCharacteristicProperties(rawValue: 24)
-// Broadcast: [false]
-// Read: [false]
-// WriteWithoutResponse: [false]
-// Write: [true]
-// Notify: [true]
-// Indicate: [false]
-// AuthenticatedSignedWrites: [false]
-// ExtendedProperties: [false]
-// NotifyEncryptionRequired: [false]
-// BroaIndicateEncryptionRequireddcast: [false]
-// Service for Characteristic: [""]
-//
-// The MiaoMiao protocol
-// 1.) Data
-// TX: 0xF0
-// Request all the data or the sensor. The bluetooth will return the data at a certain frequency (default is every 5 minutes) after the request
-// RX:
-// a) Data (363 bytes):
-// Pos. 0 (0x00): 0x28 +
-// Pos. 1 (0x01): Len[2 bytes] +
-// Pos. 3 (0x03): Index [2 bytes] (this is the minute counter of the Freestyle Libre sensor) +
-// Pos. 5 (0x05): ID [8 bytes] +
-// Pos. 13 (0x0D): xbattery level in percent [1 byte] (e.g. 0x64 which is 100 in decimal means 100%?)
-// Pos. 14 (0x0E): firmware version [2 bytes] +
-// Pos. 16 (0x10): hardware version [2 bytes] +
-// Pos. 18 (0x12): FRAM data (43 x 8 bytes = 344 bytes) +
-// Pos. end : 0x29
-// Example: 28 07b3 5457 db353e01 00a007e0 64 0034 0001 11b6e84f050003 875104 57540000 00 000000 00000000 0000b94b 060f1600 c0da6a80 1600c0d6 6a801600
-// 0x28 -> marks begin of data response
-// 0x07b3 -> len is 1971 bytes (= 1952 for FRAM and 19 bytes for all the rest from 0x28 to 0x29, both of which are included)
-// but as of 2018-03-12 only 1791 bytes are sent.
-// 0x5457 -> index is 21591
-// 0xdb353e0100a007e0 -> id, can be converted to serial number
-// 0x64 -> battery level (= 100%)
-// 0x0034 -> firmware version
-// 0x0001 -> hardware version
-// 0x11b6e84f05000387 FRAM block 0x00 (sensor is expired since byte 0x04 has value 0x05)
-// 0x5104575400000000 FRAM block 0x01
-// 0x0000000000000000 FRAM block 0x02
-// 0xb94b060f1600c0da FRAM block 0x03
-// ...
-// 28 07b3 182b 9a8150 0100a007 e0640034 0001539d
-// b) A new sensor has been detected
-// 0x32
-// c) No sensor has been detected
-// 0x34
-//
-// 2.) Confirm to replace the sensor (if a new sensor is detected and shall be used, send this)
-// TX: 0xD301
-// 3.) Confirm not to replace the sensor (if a new sensor is detected and shall not be used, send this)
-// TX: 0xD300
-// 4.) Change the frequence of data transmission
-// TX: 0xD1XX, where XX is the intervall time, 1 byte, e.g. 0x0A is 10 minutes
-// RX:
-// a) 0xD101 Success
-// b) 0xD100 Fail
-
-import CoreBluetooth
-import Foundation
-import os.log
-import UIKit
-public enum MiaoMiaoResponseState: UInt8 {
- case dataPacketReceived = 0x28
- case newSensor = 0x32
- case noSensor = 0x34
- case frequencyChangedResponse = 0xD1
-}
-extension MiaoMiaoResponseState: CustomStringConvertible {
- public var description: String {
- switch self {
- case .dataPacketReceived:
- return "Data packet received"
- case .newSensor:
- return "New sensor detected"
- case .noSensor:
- return "No sensor found"
- case .frequencyChangedResponse:
- return "Reading intervall changed"
- }
- }
-}
-
-class MiaoMiaoTransmitter: LibreTransmitterProxyProtocol {
-
- fileprivate lazy var logger = Logger(forType: Self.self)
-
- func reset() {
- rxBuffer.resetAllBytes()
- }
-
- class var manufacturerer: String {
- "Tomato"
- }
-
- class var smallImage: UIImage? {
- UIImage(named: "miaomiao-small", in: Bundle.module, compatibleWith: nil)
- }
-
- class var shortTransmitterName: String {
- "miaomiao"
- }
-
- class var requiresDelayedReconnect : Bool {
- true
- }
-
- static var writeCharacteristic: UUIDContainer? = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
- static var notifyCharacteristic: UUIDContainer? = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
- static var serviceUUID: [UUIDContainer] = ["6E400001-B5A3-F393-E0A9-E50E24DCCA9E"]
-
- weak var delegate: LibreTransmitterDelegate?
-
- private var rxBuffer = Data()
- private var sensorData: SensorData?
- private var metadata: LibreTransmitterMetadata?
-
-
-
- class func canSupportPeripheral(_ peripheral: CBPeripheral) -> Bool {
- peripheral.name?.lowercased().starts(with: "miaomiao") ?? false
- }
-
- class func getDeviceDetailsFromAdvertisement(advertisementData: [String: Any]?) -> String? {
- nil
- }
-
- required init(delegate: LibreTransmitterDelegate, advertisementData: [String: Any]?) {
- //advertisementData is unknown for the miaomiao
- self.delegate = delegate
- }
-
- func requestData(writeCharacteristics: CBCharacteristic, peripheral: CBPeripheral) {
- confirmSensor(peripheral: peripheral, writeCharacteristics: writeCharacteristics)
- reset()
- logger.debug("dabear: miaomiaoRequestData")
-
- peripheral.writeValue(Data([0xF0]), for: writeCharacteristics, type: .withResponse)
- }
-
- func updateValueForNotifyCharacteristics(_ value: Data, peripheral: CBPeripheral, writeCharacteristic: CBCharacteristic?) {
- rxBuffer.append(value)
-
- logger.debug("miaomiao Appended value with length \(String(describing: value.count)), buffer length is: \(String(describing: self.rxBuffer.count))")
-
-
-
- // When spreading a message over multiple telegrams, the miaomiao protocol
- // does not repeat that initial byte
- // firstbyte is therefore written to rxbuffer on first received telegram
- // this becomes sort of a state to track which message is actually received.
- // Therefore it also becomes important that once a message is fully received, the buffer is invalidated
- //
- guard let firstByte = rxBuffer.first, let miaoMiaoResponseState = MiaoMiaoResponseState(rawValue: firstByte) else {
- reset()
- logger.error("miaomiaoDidUpdateValueForNotifyCharacteristics did not undestand what to do (internal error")
- return
- }
-
- switch miaoMiaoResponseState {
- case .dataPacketReceived: // 0x28: // data received, append to buffer and inform delegate if end reached
-
- if rxBuffer.count >= 363 {
-
-
- delegate?.libreTransmitterReceivedMessage(0x0000, txFlags: 0x28, payloadData: rxBuffer)
-
- handleCompleteMessage()
- reset()
- }
-
- case .newSensor: // 0x32: // A new sensor has been detected -> acknowledge to use sensor and reset buffer
- delegate?.libreTransmitterReceivedMessage(0x0000, txFlags: 0x32, payloadData: rxBuffer)
-
- confirmSensor(peripheral: peripheral, writeCharacteristics: writeCharacteristic)
- reset()
- case .noSensor: // 0x34: // No sensor has been detected -> reset buffer (and wait for new data to arrive)
-
- delegate?.libreTransmitterReceivedMessage(0x0000, txFlags: 0x34, payloadData: rxBuffer)
-
- reset()
- case .frequencyChangedResponse: // 0xD1: // Success of fail for setting time intervall
-
- delegate?.libreTransmitterReceivedMessage(0x0000, txFlags: 0xD1, payloadData: rxBuffer)
-
- if value.count >= 2 {
- if value[2] == 0x01 {
- //success setting time interval
- } else if value[2] == 0x00 {
- // faioure
- } else {
- //"Unkown response for setting time interval."
- }
- }
- reset()
- }
- }
-
- func handleCompleteMessage() {
- guard rxBuffer.count >= 363 else {
- return
- }
-
- var patchInfo: String?
-
- if rxBuffer.count >= 369 {
- patchInfo = Data(rxBuffer[363...368]).hexEncodedString().uppercased()
- }
-
- logger.debug("rxbuffer length: \(self.rxBuffer.count ), patchinfo: \(String(describing: patchInfo))")
-
- metadata = LibreTransmitterMetadata(
- hardware: String(describing: rxBuffer[16...17].hexEncodedString()),
- firmware: String(describing: rxBuffer[14...15].hexEncodedString()),
- battery: Int(rxBuffer[13]),
- name: Self.shortTransmitterName,
- macAddress: nil,
- patchInfo: patchInfo,
- uid: [UInt8](rxBuffer[5..<13]) )
-
- sensorData = SensorData(uuid: Data(rxBuffer.subdata(in: 5..<13)), bytes: [UInt8](rxBuffer.subdata(in: 18..<362)), date: Date())
-
- if let sensorData = sensorData, let metadata = metadata {
- delegate?.libreTransmitterDidUpdate(with: sensorData, and: metadata)
- }
- }
-
- // Confirm (to replace) the sensor. Iif a new sensor is detected and shall be used, send this command (0xD301)
- func confirmSensor(peripheral: CBPeripheral, writeCharacteristics: CBCharacteristic?) {
- guard let writeCharacteristics = writeCharacteristics else {
- logger.error("could not confirm sensor")
- return
- }
- logger.debug("confirming new sensor")
- peripheral.writeValue(Data([0xD3, 0x01]), for: writeCharacteristics, type: .withResponse)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/UUIDContainer.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/UUIDContainer.swift
deleted file mode 100644
index 89411d4b0..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Bluetooth/Transmitter/UUIDContainer.swift
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// UUIDContainer.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 08/01/2020.
-// Copyright © 2020 Bjørn Inge Berg. All rights reserved.
-//
-
-import CoreBluetooth
-import Foundation
-public struct UUIDContainer: ExpressibleByStringLiteral {
- public var value: CBUUID
-
- init(value: CBUUID) {
- self.value = value
- }
- public init(stringLiteral value: String) {
- self.value = CBUUID(string: value)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/CollectionExtensions.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/CollectionExtensions.swift
deleted file mode 100644
index d8d95151a..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/CollectionExtensions.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// CollectionExtensions.swift
-// MiaomiaoClientUI
-//
-// Created by Bjørn Inge Berg on 26/03/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-extension Collection {
- subscript(safe index: Index) -> Element? {
- indices.contains(index) ? self[index] : nil
- }
-}
-
-extension Array where Element: Hashable {
- func removingDuplicates() -> [Element] {
- var addedDict = [Element: Bool]()
-
- return filter {
- addedDict.updateValue(true, forKey: $0) == nil
- }
- }
-
- mutating func removeDuplicates() {
- self = self.removingDuplicates()
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DataExtensions.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DataExtensions.swift
deleted file mode 100644
index 9ba9488d3..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DataExtensions.swift
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// DataExtensions.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 22/09/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-extension Data {
- mutating func resetAllBytes() {
- self = Data()
- }
-
- // From Stackoverflow, see https://stackoverflow.com/questions/39075043/how-to-convert-data-to-hex-string-in-swift
- private static let hexAlphabet = "0123456789abcdef".unicodeScalars.map { $0 }
-
- public var hex: String {
- return map { String(format: "%02X", $0) }.joined(separator: " ")
- }
-
- public func hexEncodedString() -> String {
- String(self.reduce(into: "".unicodeScalars, { result, value in
- result.append(Data.hexAlphabet[Int(value / 16)])
- result.append(Data.hexAlphabet[Int(value % 16)])
- }))
- }
-
- func toDebugString() -> String {
- self.map { "\($0)" }.joined(separator: ", ")
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DateExtensions.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DateExtensions.swift
deleted file mode 100644
index 86e36a690..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DateExtensions.swift
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// DateExtensions.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 07/03/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-public extension Date {
-
-
- func rounded(on amount: Int, _ component: Calendar.Component) -> Date {
- let cal = Calendar.current
- let value = cal.component(component, from: self)
-
- // Compute nearest multiple of amount:
- let roundedValue = lrint(Double(value) / Double(amount)) * amount
- let newDate = cal.date(byAdding: component, value: roundedValue - value, to: self)!
-
- return newDate.floorAllComponents(before: component)
- }
-
- func floorAllComponents(before component: Calendar.Component) -> Date {
- // All components to round ordered by length
- let components = [Calendar.Component.year, .month, .day, .hour, .minute, .second, .nanosecond]
-
- guard let index = components.firstIndex(of: component) else {
- fatalError("Wrong component")
- }
-
- let cal = Calendar.current
- var date = self
-
- components.suffix(from: index + 1).forEach { roundComponent in
- let value = cal.component(roundComponent, from: date) * -1
- date = cal.date(byAdding: roundComponent, value: value, to: date)!
- }
-
- return date
- }
-
- static var LocaleWantsAMPM: Bool {
- DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: NSLocale.current)!.contains("a")
- }
-
- func getFormattedDate(format: String) -> String {
- let dateformat = DateFormatter()
- dateformat.dateFormat = format
- return dateformat.string(from: self)
- }
-}
-
-extension DateComponents {
- func ToTimeString(wantsAMPM: Bool = Date.LocaleWantsAMPM) -> String {
- //print("hour: \(self.hour) minute: \(self.minute)")
- let date = Calendar.current.date(bySettingHour: self.hour ?? 0, minute: self.minute ?? 0, second: 0, of: Date())!
-
- let formatter = DateFormatter()
- formatter.dateStyle = DateFormatter.Style.long
- formatter.timeStyle = DateFormatter.Style.medium
-
- formatter.dateFormat = wantsAMPM ? "hh:mm a" : "HH:mm"
- return formatter.string(from: date)
- }
-}
-
-
-extension Array where Element == DateInterval {
- // Check for intersection among the intervals in the given array and return
- // the interval if found.
- func intersect() -> DateInterval? {
- // Algorithm:
- // We will compare first two intervals.
- // If an intersection is found, we will save the resultant interval
- // and compare it with the next interval in the array.
- // If no intersection is found at any iteration
- // it means the intervals in the array are disjoint. Break the loop and return nil
- // Otherwise return the last intersection.
-
- var previous = self.first
- for (index, element) in self.enumerated() {
- if index == 0 {
- continue
- }
-
- previous = previous?.intersection(with: element)
-
- if previous == nil {
- break
- }
- }
-
- return previous
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DoubleExtensions.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DoubleExtensions.swift
deleted file mode 100644
index bf6a83f72..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/DoubleExtensions.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// DoubleExtensions.swift
-// MiaomiaoClientUI
-//
-// Created by Bjørn Inge Berg on 25/03/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-extension Double {
- func roundTo(places: Int) -> Double {
- let divisor = pow(10.0, Double(places))
- return (self * divisor).rounded() / divisor
- }
-
- var twoDecimals: String {
- String(format: "%.2f", self)
- }
- var fourDecimals: String {
- String(format: "%.4f", self)
- }
-
- enum Number {
- static var formatter = NumberFormatter()
- }
-
-
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/HashableClass.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/HashableClass.swift
deleted file mode 100644
index 3818e69de..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/HashableClass.swift
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// HashableClass.swift
-// LibreTransmitterUI
-//
-// Created by Bjørn Inge Berg on 17/05/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-extension Hashable where Self: AnyObject {
-
- public func hash(into hasher: inout Hasher) {
- hasher.combine(ObjectIdentifier(self))
- }
-}
-
-extension Equatable where Self: AnyObject {
-
- public static func == (lhs:Self, rhs:Self) -> Bool {
- return lhs === rhs
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/Notification.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/Notification.swift
deleted file mode 100644
index 41b83ef7b..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/Notification.swift
+++ /dev/null
@@ -1,5 +0,0 @@
-import Foundation
-
-public extension Notification.Name {
- static let newSensorDetected = Notification.Name("LibreTransmitter.newSensorDetected")
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/TimeIntervalExtensions.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/TimeIntervalExtensions.swift
deleted file mode 100644
index e9a7f911b..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Extensions/TimeIntervalExtensions.swift
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// NSTimeInterval.swift
-// Naterade
-//
-// Created by Nathan Racklyeft on 1/9/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-
-extension TimeInterval {
- static func seconds(_ seconds: Double) -> TimeInterval {
- seconds
- }
-
- static func minutes(_ minutes: Double) -> TimeInterval {
- TimeInterval(minutes: minutes)
- }
-
- static func hours(_ hours: Double) -> TimeInterval {
- TimeInterval(hours: hours)
- }
-
- init(minutes: Double) {
- //self.init(minutes * 60)
- let m = minutes * 60
- self.init(m)
- }
-
- init(hours: Double) {
- self.init(minutes: hours * 60)
- }
-
- var minutes: Double {
- self / 60.0
- }
-
- var hours: Double {
- minutes / 60.0
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/GlucoseSampleValue.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/GlucoseSampleValue.swift
deleted file mode 100644
index f12a6ddfe..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/GlucoseSampleValue.swift
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// GlucoseSampleValue.swift
-// LoopKit
-//
-// Created by Nathan Racklyeft on 3/6/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-public protocol GlucoseSampleValue: GlucoseValue {
- /// Uniquely identifies the source of the sample.
- var provenanceIdentifier: String { get }
-
- /// Whether the glucose value was provided for visual consistency, rather than an actual, calibrated reading.
- var isDisplayOnly: Bool { get }
-
- /// Whether the glucose value was entered by the user.
- var wasUserEntered: Bool { get }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/GlucoseValue.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/GlucoseValue.swift
deleted file mode 100644
index 59b21e553..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/GlucoseValue.swift
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// GlucoseValue.swift
-// LoopKit
-//
-// Created by Nathan Racklyeft on 3/2/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-
-import HealthKit
-
-
-public protocol GlucoseValue: SampleValue {
-}
-
-public struct SimpleGlucoseValue: Equatable, GlucoseValue {
- public let startDate: Date
- public let endDate: Date
- public let quantity: HKQuantity
-
- public init(startDate: Date, endDate: Date? = nil, quantity: HKQuantity) {
- self.startDate = startDate
- self.endDate = endDate ?? startDate
- self.quantity = quantity
- }
-
- public init(_ glucoseValue: GlucoseValue) {
- self.startDate = glucoseValue.startDate
- self.endDate = glucoseValue.endDate
- self.quantity = glucoseValue.quantity
- }
-}
-
-extension SimpleGlucoseValue: Codable {
- public init(from decoder: Decoder) throws {
- let container = try decoder.container(keyedBy: CodingKeys.self)
- self.startDate = try container.decode(Date.self, forKey: .startDate)
- self.endDate = try container.decode(Date.self, forKey: .endDate)
- self.quantity = HKQuantity(unit: HKUnit(from: try container.decode(String.self, forKey: .quantityUnit)),
- doubleValue: try container.decode(Double.self, forKey: .quantity))
- }
-
- public func encode(to encoder: Encoder) throws {
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(startDate, forKey: .startDate)
- try container.encode(endDate, forKey: .endDate)
- try container.encode(quantity.doubleValue(for: .milligramsPerDeciliter), forKey: .quantity)
- try container.encode(HKUnit.milligramsPerDeciliter.unitString, forKey: .quantityUnit)
- }
-
- private enum CodingKeys: String, CodingKey {
- case startDate
- case endDate
- case quantity
- case quantityUnit
- }
-}
-
-public struct PredictedGlucoseValue: Equatable, GlucoseValue {
- public let startDate: Date
- public let quantity: HKQuantity
-
- public init(startDate: Date, quantity: HKQuantity) {
- self.startDate = startDate
- self.quantity = quantity
- }
-}
-
-extension PredictedGlucoseValue: Codable {
- public init(from decoder: Decoder) throws {
- let container = try decoder.container(keyedBy: CodingKeys.self)
- self.startDate = try container.decode(Date.self, forKey: .startDate)
- self.quantity = HKQuantity(unit: HKUnit(from: try container.decode(String.self, forKey: .quantityUnit)),
- doubleValue: try container.decode(Double.self, forKey: .quantity))
- }
-
- public func encode(to encoder: Encoder) throws {
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(startDate, forKey: .startDate)
- try container.encode(quantity.doubleValue(for: .milligramsPerDeciliter), forKey: .quantity)
- try container.encode(HKUnit.milligramsPerDeciliter.unitString, forKey: .quantityUnit)
- }
-
- private enum CodingKeys: String, CodingKey {
- case startDate
- case quantity
- case quantityUnit
- }
-}
-
-extension HKQuantitySample: GlucoseValue { }
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/HKQuantitySample+GlucoseKit.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/HKQuantitySample+GlucoseKit.swift
deleted file mode 100644
index 075cfac7b..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/HKQuantitySample+GlucoseKit.swift
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// GlucoseValue.swift
-// LoopKit
-//
-// Created by Nathan Racklyeft on 2/19/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import HealthKit
-
-
-let MetadataKeyGlucoseIsDisplayOnly = "com.loudnate.GlucoseKit.HKMetadataKey.GlucoseIsDisplayOnly"
-
-
-extension HKQuantitySample: GlucoseSampleValue {
- public var provenanceIdentifier: String {
- return sourceRevision.source.bundleIdentifier
- }
-
- public var isDisplayOnly: Bool {
- return metadata?[MetadataKeyGlucoseIsDisplayOnly] as? Bool ?? false
- }
-
- public var wasUserEntered: Bool {
- return metadata?[HKMetadataKeyWasUserEntered] as? Bool ?? false
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/HKUnit.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/HKUnit.swift
deleted file mode 100644
index 7ca8bb734..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/HKUnit.swift
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// HKUnit.swift
-// Naterade
-//
-// Created by Nathan Racklyeft on 1/17/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import HealthKit
-
-
-extension HKUnit {
- static let milligramsPerDeciliter: HKUnit = {
- return HKUnit.gramUnit(with: .milli).unitDivided(by: .literUnit(with: .deci))
- }()
-
- static let millimolesPerLiter: HKUnit = {
- return HKUnit.moleUnit(with: .milli, molarMass: HKUnitMolarMassBloodGlucose).unitDivided(by: .liter())
- }()
-
- static let internationalUnitsPerHour: HKUnit = {
- return HKUnit.internationalUnit().unitDivided(by: .hour())
- }()
-
- static let gramsPerUnit: HKUnit = {
- return HKUnit.gram().unitDivided(by: .internationalUnit())
- }()
-
- var foundationUnit: Unit? {
- if self == HKUnit.milligramsPerDeciliter {
- return UnitConcentrationMass.milligramsPerDeciliter
- }
-
- if self == HKUnit.millimolesPerLiter {
- return UnitConcentrationMass.millimolesPerLiter(withGramsPerMole: HKUnitMolarMassBloodGlucose)
- }
-
- if self == HKUnit.gram() {
- return UnitMass.grams
- }
-
- return nil
- }
-
- /// The smallest value expected to be visible on a chart
- var chartableIncrement: Double {
- if self == .milligramsPerDeciliter {
- return 1
- } else {
- return 1 / 25
- }
- }
-
- var localizedShortUnitString: String {
- if self == HKUnit.millimolesPerLiter {
- return NSLocalizedString("mmol/L", comment: "The short unit display string for millimoles of glucose per liter")
- } else if self == .milligramsPerDeciliter {
- return NSLocalizedString("mg/dL", comment: "The short unit display string for milligrams of glucose per decilter")
- } else if self == .internationalUnit() {
- return NSLocalizedString("U", comment: "The short unit display string for international units of insulin")
- } else if self == .gram() {
- return NSLocalizedString("g", comment: "The short unit display string for grams")
- } else {
- return String(describing: self)
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/LocalizedString.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/LocalizedString.swift
deleted file mode 100644
index efc2abfba..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/LocalizedString.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// LocalizedString.swift
-// LoopKit
-//
-// Created by Retina15 on 8/6/18.
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-// really needs to be a class to compile
-// swiftlint:disable:next convenience_type
-internal class FrameworkBundle {
- static let main = Bundle(for: FrameworkBundle.self)
-}
-
-func LocalizedString(_ key: String, tableName: String? = nil, value: String? = nil, comment: String) -> String {
- if let value = value {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, value: value, comment: comment)
- } else {
- return NSLocalizedString(key, tableName: tableName, bundle: FrameworkBundle.main, comment: comment)
- }
-}
-/*
-extension DefaultStringInterpolation {
- mutating func appendInterpolation(_ optional: T?) {
- appendInterpolation(String(describing: optional))
- }
-}*/
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/MessagePassing.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/MessagePassing.swift
deleted file mode 100644
index 777435e58..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/MessagePassing.swift
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// MessagePassing.swift
-// LibreTransmitter
-//
-// Created by Bjørn Inge Berg on 21/04/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-public func bundleSeedID() -> String? {
- let queryLoad: [String: AnyObject] = [
- kSecClass as String: kSecClassGenericPassword,
- kSecAttrAccount as String: "bundleSeedID" as AnyObject,
- kSecAttrService as String: "" as AnyObject,
- kSecReturnAttributes as String: kCFBooleanTrue
- ]
-
- var result: AnyObject?
- var status = withUnsafeMutablePointer(to: &result) {
- SecItemCopyMatching(queryLoad as CFDictionary, UnsafeMutablePointer($0))
- }
-
- if status == errSecItemNotFound {
- status = withUnsafeMutablePointer(to: &result) {
- SecItemAdd(queryLoad as CFDictionary, UnsafeMutablePointer($0))
- }
- }
-
- if status == noErr {
- if let resultDict = result as? [String: Any], let accessGroup = resultDict[kSecAttrAccessGroup as String] as? String {
- let components = accessGroup.components(separatedBy: ".")
- return components.first
- } else {
- return nil
- }
- } else {
- print("Error getting bundleSeedID to Keychain")
- return nil
- }
-}
-
-public func getDynamicAppGroupForMessagePassing() -> String? {
- if let seed = bundleSeedID() {
- return "group.com.\(seed).Loopkit.Loop.MessagePassing"
- }
- return nil
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NewGlucoseSample.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NewGlucoseSample.swift
deleted file mode 100644
index 05e440b17..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NewGlucoseSample.swift
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// NewGlucoseSample.swift
-// LoopKit
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import HealthKit
-
-
-public struct NewGlucoseSample: Equatable {
- public let date: Date
- public let quantity: HKQuantity
- public let isDisplayOnly: Bool
- public let wasUserEntered: Bool
- public let syncIdentifier: String
- public var syncVersion: Int
- public var device: HKDevice?
-
- /// - Parameters:
- /// - date: The date the sample was collected
- /// - quantity: The glucose sample quantity
- /// - isDisplayOnly: Whether the reading was shifted for visual consistency after calibration
- /// - wasUserEntered: Whether the reading was entered by the user (manual) or not (device)
- /// - syncIdentifier: A unique identifier representing the sample, used for de-duplication
- /// - syncVersion: A version number for determining resolution in de-duplication
- /// - device: The description of the device the collected the sample
- public init(date: Date, quantity: HKQuantity, isDisplayOnly: Bool, wasUserEntered: Bool, syncIdentifier: String, syncVersion: Int = 1, device: HKDevice? = nil) {
- self.date = date
- self.quantity = quantity
- self.isDisplayOnly = isDisplayOnly
- self.wasUserEntered = wasUserEntered
- self.syncIdentifier = syncIdentifier
- self.syncVersion = syncVersion
- self.device = device
- }
-}
-
-
-extension NewGlucoseSample {
- public var quantitySample: HKQuantitySample {
- var metadata: [String: Any] = [
- HKMetadataKeySyncIdentifier: syncIdentifier,
- HKMetadataKeySyncVersion: syncVersion,
- ]
-
- if isDisplayOnly {
- metadata[MetadataKeyGlucoseIsDisplayOnly] = true
- }
- if wasUserEntered {
- metadata[HKMetadataKeyWasUserEntered] = true
- }
-
- return HKQuantitySample(
- type: HKQuantityType.quantityType(forIdentifier: .bloodGlucose)!,
- quantity: quantity,
- start: date,
- end: date,
- device: device,
- metadata: metadata
- )
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NotificationHelper.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NotificationHelper.swift
deleted file mode 100644
index 78251dac4..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NotificationHelper.swift
+++ /dev/null
@@ -1,350 +0,0 @@
-//
-// NotificationHelper.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 30/05/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-import UserNotifications
-import os.log
-import UIKit
-
-fileprivate var logger = Logger(forType: "NotificationHelper")
-
-public enum NotificationHelper {
-
- private enum Identifiers: String {
- case glucocoseNotifications = "no.bjorninge.miaomiao.glucose-notification"
- case noSensorDetected = "no.bjorninge.miaomiao.nosensordetected-notification"
- case tryAgainLater = "no.bjorninge.miaomiao.glucoseNotAvailableTryAgainLater-notification"
- case sensorChange = "no.bjorninge.miaomiao.sensorchange-notification"
- case invalidSensor = "no.bjorninge.miaomiao.invalidsensor-notification"
- case lowBattery = "no.bjorninge.miaomiao.lowbattery-notification"
- case sensorExpire = "no.bjorninge.miaomiao.SensorExpire-notification"
- case noBridgeSelected = "no.bjorninge.miaomiao.noBridgeSelected-notification"
- case bluetoothPoweredOff = "no.bjorninge.miaomiao.bluetoothPoweredOff-notification"
- case invalidChecksum = "no.bjorninge.miaomiao.invalidChecksum-notification"
- case calibrationOngoing = "no.bjorninge.miaomiao.calibration-notification"
- case restoredState = "no.bjorninge.miaomiao.state-notification"
- }
-
- public static func GlucoseUnitIsSupported(unit: HKUnit) -> Bool {
- [HKUnit.milligramsPerDeciliter, HKUnit.millimolesPerLiter].contains(unit)
- }
-
- public static func sendRestoredStateNotification(msg: String) {
- ensureCanSendNotification {
- logger.debug("dabear:: sending RestoredStateNotification")
-
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("State was restored", comment: "State was restored")
- content.body = msg
-
- addRequest(identifier: .restoredState, content: content )
- }
- }
-
- public static func sendBluetoothPowerOffNotification() {
- ensureCanSendNotification {
- logger.debug("dabear:: sending BluetoothPowerOffNotification")
-
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("Bluetooth Power Off", comment: "Bluetooth Power Off")
- content.body = NSLocalizedString("Please turn on Bluetooth", comment: "Please turn on Bluetooth")
-
- addRequest(identifier: .bluetoothPoweredOff, content: content)
- }
- }
-
- public static func sendNoTransmitterSelectedNotification() {
- ensureCanSendNotification {
- logger.debug("dabear:: sending NoTransmitterSelectedNotification")
-
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("No Libre Transmitter Selected", comment: "No Libre Transmitter Selected")
- content.body = NSLocalizedString("Delete Transmitter and start anew.", comment: "Delete Transmitter and start anew.")
-
- addRequest(identifier: .noBridgeSelected, content: content)
- }
- }
-
- private static func ensureCanSendGlucoseNotification(_ completion: @escaping (_ unit: HKUnit) -> Void ) {
- ensureCanSendNotification {
- if let glucoseUnit = UserDefaults.standard.mmGlucoseUnit, GlucoseUnitIsSupported(unit: glucoseUnit) {
- completion(glucoseUnit)
- }
- }
- }
-
- public static func requestNotificationPermissionsIfNeeded(){
- UNUserNotificationCenter.current().getNotificationSettings { settings in
- logger.debug("settings.authorizationStatus: \(String(describing: settings.authorizationStatus.rawValue))")
- if ![.authorized,.provisional].contains(settings.authorizationStatus) {
- requestNotificationPermissions()
- }
-
- }
-
- }
-
- private static func requestNotificationPermissions() {
- logger.debug("requestNotificationPermissions called")
- let center = UNUserNotificationCenter.current()
- center.requestAuthorization(options: [.badge, .sound, .alert]) { (granted, error) in
- if granted {
- logger.debug("requestNotificationPermissions was granted")
- } else {
- logger.debug("requestNotificationPermissions failed because of error: \(String(describing: error))")
- }
-
- }
-
-
- }
-
- private static func ensureCanSendNotification(_ completion: @escaping () -> Void ) {
- UNUserNotificationCenter.current().getNotificationSettings { settings in
- guard settings.authorizationStatus == .authorized || settings.authorizationStatus == .provisional else {
- logger.debug("dabear:: ensureCanSendNotification failed, authorization denied")
- return
- }
-
- logger.debug("dabear:: sending notification was allowed")
-
- completion()
- }
- }
-
- public static func sendInvalidChecksumIfDeveloper(_ sensorData: SensorData) {
- if sensorData.hasValidCRCs {
- return
- }
-
- ensureCanSendNotification {
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("Invalid libre checksum", comment: "Invalid libre checksum")
- content.body = NSLocalizedString("Libre sensor was incorrectly read, CRCs were not valid", comment: "Libre sensor was incorrectly read, CRCs were not valid")
-
- addRequest(identifier: .invalidChecksum, content: content)
- }
- }
-
- private static func addRequest(identifier: Identifiers, content: UNMutableNotificationContent, deleteOld: Bool = false) {
- let center = UNUserNotificationCenter.current()
- //content.sound = UNNotificationSound.
- let request = UNNotificationRequest(identifier: identifier.rawValue, content: content, trigger: nil)
-
- if deleteOld {
- // Required since ios12+ have started to cache/group notifications
- center.removeDeliveredNotifications(withIdentifiers: [identifier.rawValue])
- center.removePendingNotificationRequests(withIdentifiers: [identifier.rawValue])
- }
-
- center.add(request) { error in
- if let error = error {
- logger.debug("dabear:: unable to addNotificationRequest: \(error.localizedDescription)")
- return
- }
-
- logger.debug("dabear:: sending \(identifier.rawValue) notification")
- }
- }
-
- public enum CalibrationMessage: String {
- case starting = "Calibrating sensor, please stand by!"
- case noCalibration = "Could not calibrate sensor, check libreoopweb permissions and internet connection"
- case invalidCalibrationData = "Could not calibrate sensor, invalid calibrationdata"
- case success = "Success!"
- }
-
- public static func sendCalibrationNotification(_ calibrationMessage: CalibrationMessage) {
- ensureCanSendNotification {
- let content = UNMutableNotificationContent()
- content.sound = .default
- content.title = NSLocalizedString("Extracting calibrationdata from sensor", comment: "Extracting calibrationdata from sensor")
- content.body = NSLocalizedString(calibrationMessage.rawValue, comment: "calibrationMessage")
-
- addRequest(identifier: .calibrationOngoing,
- content: content,
- deleteOld: true)
- }
- }
-
- public static func sendSensorNotDetectedNotificationIfNeeded(noSensor: Bool) {
- guard UserDefaults.standard.mmAlertNoSensorDetected && noSensor else {
- logger.debug("Not sending noSensorDetected notification")
- return
- }
-
- sendSensorNotDetectedNotification()
- }
-
- private static func sendSensorNotDetectedNotification() {
- ensureCanSendNotification {
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("No Sensor Detected", comment: "No Sensor Detected")
- content.body = NSLocalizedString("This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor", comment: "This might be an intermittent problem, but please check that your transmitter is tightly secured over your sensor")
-
- addRequest(identifier: .noSensorDetected, content: content)
- }
- }
-
- public static func sendSensorChangeNotificationIfNeeded() {
- guard UserDefaults.standard.mmAlertNewSensorDetected else {
- logger.debug("not sending sendSensorChange notification ")
- return
- }
- sendSensorChangeNotification()
- }
-
- private static func sendSensorChangeNotification() {
- ensureCanSendNotification {
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("New Sensor Detected", comment: "New Sensor Detected")
- content.body = NSLocalizedString("Please wait up to 30 minutes before glucose readings are available!", comment: "Please wait up to 30 minutes before glucose readings are available!")
-
- addRequest(identifier: .sensorChange, content: content)
- //content.sound = UNNotificationSound.
-
- }
- }
-
- public static func sendSensorTryAgainLaterNotification() {
- ensureCanSendNotification {
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("Invalid Glucose sample detected, try again later", comment: "Invalid Glucose sample detected, try again later")
- content.body = NSLocalizedString("Sensor might have temporarily stopped, fallen off or is too cold or too warm", comment: "Sensor might have temporarily stopped, fallen off or is too cold or too warm")
-
- addRequest(identifier: .tryAgainLater, content: content)
- //content.sound = UNNotificationSound.
-
- }
- }
-
-
-
- public static func sendInvalidSensorNotificationIfNeeded(sensorData: SensorData) {
- let isValid = sensorData.isLikelyLibre1FRAM && (sensorData.state == .starting || sensorData.state == .ready)
-
- guard UserDefaults.standard.mmAlertInvalidSensorDetected && !isValid else {
- logger.debug("not sending invalidSensorDetected notification")
- return
- }
-
- sendInvalidSensorNotification(sensorData: sensorData)
- }
-
- private static func sendInvalidSensorNotification(sensorData: SensorData) {
- ensureCanSendNotification {
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("Invalid Sensor Detected", comment: "Invalid Sensor Detected")
-
- if !sensorData.isLikelyLibre1FRAM {
- content.body = NSLocalizedString("Detected sensor seems not to be a libre 1 sensor!", comment: "Detected sensor seems not to be a libre 1 sensor!")
- } else if !(sensorData.state == .starting || sensorData.state == .ready) {
- content.body = String(format: NSLocalizedString("Detected sensor is invalid: %@", comment: "Detected sensor is invalid: %@"), sensorData.state.description)
- }
-
- content.sound = .default
-
- addRequest(identifier: .invalidSensor, content: content)
- }
- }
-
- private static var lastBatteryWarning: Date?
-
- public static func sendLowBatteryNotificationIfNeeded(device: LibreTransmitterMetadata) {
- guard UserDefaults.standard.mmAlertLowBatteryWarning else {
- logger.debug("mmAlertLowBatteryWarning toggle was not enabled, not sending low notification")
- return
- }
-
- if let battery = device.battery, battery > 20 {
- logger.debug("device battery is \(battery), not sending low notification")
- return
-
- }
-
- let now = Date()
- //only once per mins minute
- let mins = 60.0 * 120
- if let earlierplus = lastBatteryWarning?.addingTimeInterval(mins) {
- if earlierplus < now {
- sendLowBatteryNotification(batteryPercentage: device.batteryString,
- deviceName: device.name)
- lastBatteryWarning = now
- } else {
- logger.debug("Device battery is running low, but lastBatteryWarning Notification was sent less than 45 minutes ago, aborting. earlierplus: \(earlierplus), now: \(now)")
- }
- } else {
- sendLowBatteryNotification(batteryPercentage: device.batteryString,
- deviceName: device.name)
- lastBatteryWarning = now
- }
- }
-
- private static func sendLowBatteryNotification(batteryPercentage: String, deviceName: String) {
- ensureCanSendNotification {
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("Low Battery", comment: "Low Battery")
- content.body = String(format: NSLocalizedString("Battery is running low %@, consider charging your %@ device as soon as possible", comment: ""), batteryPercentage, deviceName)
-
-
- content.sound = .default
-
- addRequest(identifier: .lowBattery, content: content)
- }
- }
-
- private static var lastSensorExpireAlert: Date?
-
- public static func sendSensorExpireAlertIfNeeded(minutesLeft: Double) {
- guard UserDefaults.standard.mmAlertWillSoonExpire else {
- logger.debug("mmAlertWillSoonExpire toggle was not enabled, not sending expiresoon alarm")
- return
- }
-
- guard TimeInterval(minutes: minutesLeft) < TimeInterval(hours: 24) else {
- logger.debug("Sensor time left was more than 24 hours, not sending notification: \(minutesLeft.twoDecimals) minutes")
- return
- }
-
- let now = Date()
- //only once per 6 hours
- let min45 = 60.0 * 60 * 6
-
- if let earlier = lastSensorExpireAlert {
- if earlier.addingTimeInterval(min45) < now {
- sendSensorExpireAlert(minutesLeft: minutesLeft)
- lastSensorExpireAlert = now
- } else {
- logger.debug("Sensor is soon expiring, but lastSensorExpireAlert was sent less than 6 hours ago, so aborting")
- }
- } else {
- sendSensorExpireAlert(minutesLeft: minutesLeft)
- lastSensorExpireAlert = now
- }
- }
-
- public static func sendSensorExpireAlertIfNeeded(sensorData: SensorData) {
- sendSensorExpireAlertIfNeeded(minutesLeft: Double(sensorData.minutesLeft))
- }
-
- private static func sendSensorExpireAlert(minutesLeft: Double) {
- ensureCanSendNotification {
-
- let hours = minutesLeft == 0 ? 0 : round(minutesLeft/60)
-
- let dynamicText = hours <= 1 ? NSLocalizedString("minutes", comment: "minutes") + ": \(minutesLeft.twoDecimals)" : NSLocalizedString("hours", comment: "hours") + ": \(hours.twoDecimals)"
-
- let content = UNMutableNotificationContent()
- content.title = NSLocalizedString("Sensor Ending Soon", comment: "Sensor Ending Soon")
- content.body = String(format: NSLocalizedString("Current Sensor is Ending soon! Sensor Life left in %@", comment: ""), dynamicText)
-
- addRequest(identifier: .sensorExpire, content: content, deleteOld: true)
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NumberFormatter.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NumberFormatter.swift
deleted file mode 100644
index 969d26f55..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/NumberFormatter.swift
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// NSNumberFormatter.swift
-// Loop
-//
-// Created by Nate Racklyeft on 9/5/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-
-extension NumberFormatter {
- func string(from number: Double) -> String? {
- return string(from: NSNumber(value: number))
- }
-
- func string(from number: Double, unit: String, style: Formatter.UnitStyle = .medium) -> String? {
- guard let stringValue = string(from: number) else {
- return nil
- }
-
- let format: String
- switch style {
- case .long, .medium:
- format = LocalizedString(
- "quantity-and-unit-space",
- value: "%1$@ %2$@",
- comment: "Format string for combining localized numeric value and unit with a space. (1: numeric value)(2: unit)"
- )
- case .short:
- fallthrough
- @unknown default:
- format = LocalizedString(
- "quantity-and-unit-tight",
- value: "%1$@%2$@",
- comment: "Format string for combining localized numeric value and unit without spacing. (1: numeric value)(2: unit)"
- )
- }
-
- return String(
- format: format,
- stringValue,
- unit
- )
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/QuantityFormatter.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/QuantityFormatter.swift
deleted file mode 100644
index 4bbd78922..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/QuantityFormatter.swift
+++ /dev/null
@@ -1,253 +0,0 @@
-//
-// QuantityFormatter.swift
-// LoopKit
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-
-/// Formats unit quantities as localized strings
-open class QuantityFormatter {
-
- public init() {
- }
-
- public convenience init(for unit: HKUnit) {
- self.init()
- setPreferredNumberFormatter(for: unit)
- }
-
- /// The unit style determines how the unit strings are abbreviated, and spacing between the value and unit
- open var unitStyle: Formatter.UnitStyle = .medium {
- didSet {
- if hasMeasurementFormatter {
- measurementFormatter.unitStyle = unitStyle
- }
-
- if hasMassFormatter {
- massFormatter.unitStyle = unitStyle
- }
- }
- }
-
- open var locale: Locale = Locale.current {
- didSet {
- if hasNumberFormatter {
- numberFormatter.locale = locale
- }
-
- if hasMeasurementFormatter {
- measurementFormatter.locale = locale
- }
- }
- }
-
- /// Updates `numberFormatter` configuration for the specified unit
- ///
- /// - Parameter unit: The unit
- open func setPreferredNumberFormatter(for unit: HKUnit) {
- numberFormatter.numberStyle = .decimal
- numberFormatter.minimumFractionDigits = unit.preferredFractionDigits
- numberFormatter.maximumFractionDigits = unit.maxFractionDigits
- }
-
- private var hasNumberFormatter = false
-
- /// The formatter used for the quantity values
- open private(set) lazy var numberFormatter: NumberFormatter = {
- hasNumberFormatter = true
-
- let formatter = NumberFormatter()
- formatter.numberStyle = .decimal
- formatter.locale = self.locale
- formatter.roundingMode = .halfUp
- return formatter
- }()
-
- private var hasMeasurementFormatter = false
-
- /// MeasurementFormatter is used for gram measurements, mg/dL units, and mmol/L units.
- /// It does not properly handle glucose measurements, as it changes unit scales: 100 mg/dL -> 1 g/L
- private lazy var measurementFormatter: MeasurementFormatter = {
- hasMeasurementFormatter = true
-
- let formatter = MeasurementFormatter()
- formatter.unitOptions = [.providedUnit]
- formatter.numberFormatter = self.numberFormatter
- formatter.locale = self.locale
- formatter.unitStyle = self.unitStyle
- return formatter
- }()
-
- private var hasMassFormatter = false
-
- /// MassFormatter properly creates unit strings for grams in .short/.medium style as "g", where MeasurementFormatter uses "gram"/"grams"
- private lazy var massFormatter: MassFormatter = {
- hasMassFormatter = true
-
- let formatter = MassFormatter()
- formatter.numberFormatter = self.numberFormatter
- formatter.unitStyle = self.unitStyle
- return formatter
- }()
-
- /// Formats a quantity and unit as a localized string
- ///
- /// - Parameters:
- /// - quantity: The quantity
- /// - unit: The unit. An exception is thrown if `quantity` is not compatible with the unit.
- /// - includeUnit: Whether or not to include the unit in the returned string
- /// - Returns: A localized string, or nil if `numberFormatter` is unable to format the quantity value
- open func string(from quantity: HKQuantity, for unit: HKUnit, includeUnit: Bool = true) -> String? {
- let value = quantity.doubleValue(for: unit)
-
- if !includeUnit {
- return numberFormatter.string(from: value)
- }
-
- if let foundationUnit = unit.foundationUnit, unit.usesMeasurementFormatterForMeasurement {
- return measurementFormatter.string(from: Foundation.Measurement(value: value, unit: foundationUnit))
- }
-
- return numberFormatter.string(from: value, unit: string(from: unit, forValue: value), style: unitStyle)
- }
-
- /// Formats a unit as a localized string
- ///
- /// - Parameters:
- /// - unit: The unit
- /// - value: An optional value for determining the plurality of the unit string
- /// - Returns: A string for the unit. If no localization entry is available, the unlocalized `unitString` is returned.
- open func string(from unit: HKUnit, forValue value: Double = 10) -> String {
- if let string = unit.localizedUnitString(in: unitStyle, singular: abs(1.0 - value) < .ulpOfOne) {
- return string
- }
-
- if unit.usesMassFormatterForUnitString {
- return massFormatter.unitString(fromValue: value, unit: HKUnit.massFormatterUnit(from: unit))
- }
-
- if let foundationUnit = unit.foundationUnit {
- return measurementFormatter.string(from: foundationUnit)
- }
-
- // Fallback, unlocalized
- return unit.unitString
- }
-}
-
-
-public extension HKUnit {
- var usesMassFormatterForUnitString: Bool {
- return self == .gram()
- }
-
- var usesMeasurementFormatterForMeasurement: Bool {
- return self == .gram()
- }
-
- var preferredFractionDigits: Int {
- if self == HKUnit.millimolesPerLiter || self == HKUnit.millimolesPerLiter.unitDivided(by: .internationalUnit()) {
- return 1
- } else {
- return 0
- }
- }
-
- var maxFractionDigits: Int {
- switch self {
- case .internationalUnit(), .internationalUnitsPerHour:
- return 3
- case HKUnit.gram().unitDivided(by: .internationalUnit()):
- return 2
- default:
- return preferredFractionDigits
- }
- }
-
- // Short localized unit string with unlocalized fallback
- func shortLocalizedUnitString() -> String {
- return localizedUnitString(in: .short) ?? unitString
- }
-
- func localizedUnitString(in style: Formatter.UnitStyle, singular: Bool = false) -> String? {
- if self == .internationalUnit() {
- switch style {
- case .short, .medium:
- return LocalizedString("U", comment: "The short unit display string for international units of insulin")
- case .long:
- fallthrough
- @unknown default:
- if singular {
- return LocalizedString("Unit", comment: "The long unit display string for a singular international unit of insulin")
- } else {
- return LocalizedString("Units", comment: "The long unit display string for international units of insulin")
- }
- }
- }
-
- if self == .internationalUnitsPerHour {
- switch style {
- case .short, .medium:
- return LocalizedString("U/hr", comment: "The short unit display string for international units of insulin per hour")
- case .long:
- fallthrough
- @unknown default:
- if singular {
- return LocalizedString("Unit/hour", comment: "The long unit display string for a singular international unit of insulin per hour")
- } else {
- return LocalizedString("Units/hour", comment: "The long unit display string for international units of insulin per hour")
- }
- }
- }
-
- if self == HKUnit.millimolesPerLiter {
- switch style {
- case .short, .medium:
- return LocalizedString("mmol/L", comment: "The short unit display string for millimoles per liter")
- case .long:
- break // Fallback to the MeasurementFormatter localization
- @unknown default:
- break
- }
- }
-
- if self == HKUnit.milligramsPerDeciliter.unitDivided(by: HKUnit.internationalUnit()) {
- switch style {
- case .short, .medium:
- return LocalizedString("mg/dL/U", comment: "The short unit display string for milligrams per deciliter per U")
- case .long:
- break // Fallback to the MeasurementFormatter localization
- @unknown default:
- break
- }
- }
-
- if self == HKUnit.millimolesPerLiter.unitDivided(by: HKUnit.internationalUnit()) {
- switch style {
- case .short, .medium:
- return LocalizedString("mmol/L/U", comment: "The short unit display string for millimoles per liter per U")
- case .long:
- break // Fallback to the MeasurementFormatter localization
- @unknown default:
- break
- }
- }
-
- if self == HKUnit.gram().unitDivided(by: HKUnit.internationalUnit()) {
- switch style {
- case .short, .medium:
- return LocalizedString("g/U", comment: "The short unit display string for grams per U")
- case .long:
- fallthrough
- @unknown default:
- break // Fallback to the MeasurementFormatter localization
- }
- }
-
- return nil
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/SampleValue.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/SampleValue.swift
deleted file mode 100644
index 267e915cc..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/SampleValue.swift
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// SampleValue.swift
-// Naterade
-//
-// Created by Nathan Racklyeft on 1/24/16.
-// Copyright © 2016 Nathan Racklyeft. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-
-public protocol TimelineValue {
- var startDate: Date { get }
- var endDate: Date { get }
-}
-
-
-public extension TimelineValue {
- var endDate: Date {
- return startDate
- }
-}
-
-
-public protocol SampleValue: TimelineValue {
- var quantity: HKQuantity { get }
-}
-
-
-public extension Sequence where Element: TimelineValue {
- /**
- Returns the closest element in the sorted sequence prior to the specified date
-
- - parameter date: The date to use in the search
-
- - returns: The closest element, if any exist before the specified date
- */
- func closestPrior(to date: Date) -> Iterator.Element? {
- return elementsAdjacent(to: date).before
- }
-
- /// Returns the elements immediately before and after the specified date
- ///
- /// - Parameter date: The date to use in the search
- /// - Returns: The closest elements, if found
- func elementsAdjacent(to date: Date) -> (before: Iterator.Element?, after: Iterator.Element?) {
- var before: Iterator.Element?
- var after: Iterator.Element?
-
- for value in self {
- if value.startDate <= date {
- before = value
- } else {
- after = value
- break
- }
- }
-
- return (before, after)
- }
-
- /// Returns all elements inmmediately adjacent to the specified date
- ///
- /// Use Sequence.elementsAdjacent(to:) if specific before/after references are necessary
- ///
- /// - Parameter date: The date to use in the search
- /// - Returns: The closest elements, if found
- func allElementsAdjacent(to date: Date) -> [Iterator.Element] {
- let (before, after) = elementsAdjacent(to: date)
- return [before, after].compactMap({ $0 })
- }
-
- /**
- Returns an array of elements filtered by the specified date range.
-
- This behavior mimics HKQueryOptionNone, where the value must merely overlap the specified range,
- not strictly exist inside of it.
-
- - parameter startDate: The earliest date of elements to return
- - parameter endDate: The latest date of elements to return
-
- - returns: A new array of elements
- */
- func filterDateRange(_ startDate: Date?, _ endDate: Date?) -> [Iterator.Element] {
- return filter { (value) -> Bool in
- if let startDate = startDate, value.endDate < startDate {
- return false
- }
-
- if let endDate = endDate, value.startDate > endDate {
- return false
- }
-
- return true
- }
- }
-}
-
-public extension Sequence where Element: SampleValue {
- func average(unit: HKUnit) -> HKQuantity? {
- let (sum, count) = reduce(into: (sum: 0.0, count: 0)) { result, element in
- result.0 += element.quantity.doubleValue(for: unit)
- result.1 += 1
- }
-
- guard count > 0 else {
- return nil
- }
-
- let average = sum / Double(count)
-
- return HKQuantity(unit: unit, doubleValue: average)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/KeyChainManagerWrapper.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/KeyChainManagerWrapper.swift
deleted file mode 100644
index e6fb7f16b..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/KeyChainManagerWrapper.swift
+++ /dev/null
@@ -1,258 +0,0 @@
-//
-// KeyChainWrapper.swift
-// LibreTransmitter
-//
-// Created by Bjørn Inge Berg on 11/07/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import Foundation
-import Security
-
-
-public enum KeychainManagerError: Error {
- case add(OSStatus)
- case copy(OSStatus)
- case delete(OSStatus)
- case unknownResult
-}
-
-
-/**
-
- Influenced by https://github.com/marketplacer/keychain-swift
- */
-public struct KeychainManagerWrapper {
- typealias Query = [String: NSObject]
-
- public init() { }
-
- var accessibility: CFString = kSecAttrAccessibleAfterFirstUnlock
-
- var accessGroup: String?
-
- static public var standard = KeychainManagerWrapper()
-
- public struct InternetCredentials: Equatable {
- public let username: String
- public let password: String
- public let url: URL
-
- public init(username: String, password: String, url: URL) {
- self.username = username
- self.password = password
- self.url = url
- }
- }
-
- // MARK: - Convenience methods
-
- private func query(by class: CFString) -> Query {
- var query: Query = [kSecClass as String: `class`]
-
- if let accessGroup = accessGroup {
- query[kSecAttrAccessGroup as String] = accessGroup as NSObject?
- }
-
- return query
- }
-
-
-
-
- private func queryForInternetPassword(account: String? = nil, url: URL? = nil, label: String? = nil) -> Query {
- var query = self.query(by: kSecClassInternetPassword)
-
- if let account = account {
- query[kSecAttrAccount as String] = account as NSObject?
- }
-
- if let url = url, let components = URLComponents(url: url, resolvingAgainstBaseURL: true) {
- for (key, value) in components.keychainAttributes {
- query[key] = value
- }
- }
-
- if let label = label {
- query[kSecAttrLabel as String] = label as NSObject?
- }
-
- return query
- }
-
- private func updatedQuery(_ query: Query, withPassword password: Data) throws -> Query {
- var query = query
-
- query[kSecValueData as String] = password as NSObject?
- query[kSecAttrAccessible as String] = accessibility
-
- return query
- }
-
- private func updatedQuery(_ query: Query, withPassword password: String) throws -> Query {
- guard let value = password.data(using: String.Encoding.utf8) else {
- throw KeychainManagerError.add(errSecDecode)
- }
-
- return try updatedQuery(query, withPassword: value)
- }
-
- func delete(_ query: Query) throws {
- let statusCode = SecItemDelete(query as CFDictionary)
-
- guard statusCode == errSecSuccess || statusCode == errSecItemNotFound else {
- throw KeychainManagerError.delete(statusCode)
- }
- }
-
-
-
- // MARK – Internet Passwords
-
- public func setInternetPassword(_ password: String, account: String, atURL url: URL, label: String? = nil) throws {
- var query = try updatedQuery(queryForInternetPassword(account: account, url: url, label: label), withPassword: password)
-
- query[kSecAttrAccount as String] = account as NSObject?
-
- if let components = URLComponents(url: url, resolvingAgainstBaseURL: true) {
- for (key, value) in components.keychainAttributes {
- query[key] = value
- }
- }
-
- if let label = label {
- query[kSecAttrLabel as String] = label as NSObject?
- }
-
- let statusCode = SecItemAdd(query as CFDictionary, nil)
-
- guard statusCode == errSecSuccess else {
- throw KeychainManagerError.add(statusCode)
- }
- }
-
-
- public func replaceInternetCredentials(_ credentials: InternetCredentials?, forLabel label: String) throws {
- let query = queryForInternetPassword(label: label)
-
- try delete(query)
-
- if let credentials = credentials {
- try setInternetPassword(credentials.password, account: credentials.username, atURL: credentials.url, label: label)
- }
- }
-
- public func getInternetCredentials(account: String? = nil, url: URL? = nil, label: String? = nil) throws -> InternetCredentials {
- var query = queryForInternetPassword(account: account, url: url, label: label)
-
- query[kSecReturnData as String] = kCFBooleanTrue
- query[kSecReturnAttributes as String] = kCFBooleanTrue
- query[kSecMatchLimit as String] = kSecMatchLimitOne
-
- var result: AnyObject?
-
- let statusCode: OSStatus = SecItemCopyMatching(query as CFDictionary, &result)
-
- guard statusCode == errSecSuccess else {
- throw KeychainManagerError.copy(statusCode)
- }
-
- if let result = result as? [AnyHashable: Any], let passwordData = result[kSecValueData as String] as? Data,
- let password = String(data: passwordData, encoding: String.Encoding.utf8),
- let url = URLComponents(keychainAttributes: result)?.url,
- let username = result[kSecAttrAccount as String] as? String
- {
- return InternetCredentials(username: username, password: password, url: url)
- }
-
- throw KeychainManagerError.unknownResult
- }
-}
-
-
-private enum SecurityProtocol {
- case http
- case https
-
- init?(scheme: String?) {
- switch scheme?.lowercased() {
- case "http"?:
- self = .http
- case "https"?:
- self = .https
- default:
- return nil
- }
- }
-
- init?(secAttrProtocol: CFString) {
- if secAttrProtocol == kSecAttrProtocolHTTP {
- self = .http
- } else if secAttrProtocol == kSecAttrProtocolHTTPS {
- self = .https
- } else {
- return nil
- }
- }
-
- var scheme: String {
- switch self {
- case .http:
- return "http"
- case .https:
- return "https"
- }
- }
-
- var secAttrProtocol: CFString {
- switch self {
- case .http:
- return kSecAttrProtocolHTTP
- case .https:
- return kSecAttrProtocolHTTPS
- }
- }
-}
-
-
-private extension URLComponents {
- init?(keychainAttributes: [AnyHashable: Any]) {
- self.init()
-
- if let secAttProtocol = keychainAttributes[kSecAttrProtocol as String] {
- scheme = SecurityProtocol(secAttrProtocol: secAttProtocol as! CFString)?.scheme
- }
-
- host = keychainAttributes[kSecAttrServer as String] as? String
-
- if let port = keychainAttributes[kSecAttrPort as String] as? Int, port > 0 {
- self.port = port
- }
-
- if let path = keychainAttributes[kSecAttrPath as String] as? String {
- self.path = path
- }
- }
-
- var keychainAttributes: [String: NSObject] {
- var query: [String: NSObject] = [:]
-
- if let `protocol` = SecurityProtocol(scheme: scheme) {
- query[kSecAttrProtocol as String] = `protocol`.secAttrProtocol
- }
-
- if let host = host {
- query[kSecAttrServer as String] = host as NSObject
- }
-
- if let port = port {
- query[kSecAttrPort as String] = port as NSObject
- }
-
- if !path.isEmpty {
- query[kSecAttrPath as String] = path as NSObject
- }
-
- return query
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/LogExport.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/LogExport.swift
deleted file mode 100644
index ef352b50e..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/LogExport.swift
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// LogExport.swift
-// LibreTransmitter
-//
-// Created by Bjørn Inge Berg on 22/09/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import Foundation
-import OSLog
-
-
-@available(iOS 15, *)
-fileprivate func getLogEntries() throws -> [OSLogEntryLog] {
- // Open the log store.
- let logStore = try OSLogStore(scope: .currentProcessIdentifier)
-
- // Get all the logs from the last hour.
- let oneHourAgo = logStore.position(date: Date().addingTimeInterval(-3600))
-
- // Fetch log objects.
- let allEntries = try logStore.getEntries(at: oneHourAgo)
-
- // Filter the log to be relevant for our specific subsystem
- // and remove other elements (signposts, etc).
- return allEntries
- .compactMap { $0 as? OSLogEntryLog }
- //.filter { $0.subsystem == Features.logSubsystem }
-}
-
-@available(iOS 15, *)
-func getLogAsData() throws -> Data {
- var data = Data()
- let entries = try getLogEntries()
- entries.forEach { log in
- if let logstring = [log.date.ISO8601Format(), log.subsystem, log.category, "[["+log.composedMessage+"]]\r\n"]
- .joined(separator: "||").data(using: .utf8, allowLossyConversion: false) {
- data.append(logstring)
- }
-
- }
- return data
-}
-
-func getLogs() throws -> Data {
- var logs = Data()
- if #available(iOS 15, *) {
- logs = try getLogAsData()
- }
- return logs
-
-}
-
-
-public extension Logger {
- init(forType atype: Any, forSubSystem subsystem: String=Features.logSubsystem) {
- self.init(subsystem: subsystem, category: String(describing: atype) )
- }
-
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UIApplication+metadata.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UIApplication+metadata.swift
deleted file mode 100644
index bbb3364f1..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UIApplication+metadata.swift
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// UIApplication+metadata.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 30/12/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-private let prefix = "no-bjorninge-mm"
-enum AppMetaData {
- static var allProperties: String {
- Bundle.module.infoDictionary?.compactMap {
- $0.key.starts(with: prefix) ? "\($0.key): \($0.value)" : nil
- }.joined(separator: "\n") ?? "none"
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+Alarmsettings.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+Alarmsettings.swift
deleted file mode 100644
index 122fbc774..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+Alarmsettings.swift
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// Userdefaults+Alarmsettings.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 20/04/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-extension UserDefaults {
- private enum Key: String {
- case mmAlertLowBatteryWarning = "no.bjorninge.mmLowBatteryWarning"
- case mmAlertInvalidSensorDetected = "no.bjorninge.mmInvalidSensorDetected"
- case mmAlertNewSensorDetected = "no.bjorninge.mmNewSensorDetected"
- case mmAlertNoSensorDetected = "no.bjorninge.mmNoSensorDetected"
- case mmGlucoseUnit = "no.bjorninge.mmGlucoseUnit"
- case mmAlertSensorSoonExpire = "no.bjorninge.mmAlertSensorSoonExpire"
- case mmSnoozedUntil = "no.bjorninge.mmSnoozedUntil"
- }
- /*
- case always
- case lowBattery
- case invalidSensorDetected
- //case alarmNotifications
- case newSensorDetected
- case noSensorDetected
- case unit
- */
- public func optionalBool(forKey defaultName: String) -> Bool? {
- if let value = value(forKey: defaultName) {
- return value as? Bool
- }
- return nil
- }
-
- var mmAlertLowBatteryWarning: Bool {
- get {
- optionalBool(forKey: Key.mmAlertLowBatteryWarning.rawValue) ?? true
- }
- set {
- set(newValue, forKey: Key.mmAlertLowBatteryWarning.rawValue)
- }
- }
- var mmAlertInvalidSensorDetected: Bool {
- get {
- optionalBool(forKey: Key.mmAlertInvalidSensorDetected.rawValue) ?? true
- }
- set {
- set(newValue, forKey: Key.mmAlertInvalidSensorDetected.rawValue)
- }
- }
-
- var mmAlertNewSensorDetected: Bool {
- get {
- optionalBool(forKey: Key.mmAlertNewSensorDetected.rawValue) ?? true
- }
- set {
- set(newValue, forKey: Key.mmAlertNewSensorDetected.rawValue)
- }
- }
-
- var mmAlertNoSensorDetected: Bool {
- get {
- optionalBool(forKey: Key.mmAlertNoSensorDetected.rawValue) ?? true
- }
- set {
- set(newValue, forKey: Key.mmAlertNoSensorDetected.rawValue)
- }
- }
-
- var mmAlertWillSoonExpire: Bool {
- get {
- optionalBool(forKey: Key.mmAlertSensorSoonExpire.rawValue) ?? true
- }
- set {
- set(newValue, forKey: Key.mmAlertSensorSoonExpire.rawValue)
- }
- }
-
- var allNotificationToggles: [Bool] {
- [mmAlertLowBatteryWarning, mmAlertInvalidSensorDetected, mmAlertNewSensorDetected, mmAlertNoSensorDetected, mmAlertWillSoonExpire]
- }
-
- //intentionally only supports mgdl and mmol
- var mmGlucoseUnit: HKUnit? {
- get {
- if let textUnit = string(forKey: Key.mmGlucoseUnit.rawValue) {
- if textUnit == "mmol" {
- return HKUnit.millimolesPerLiter
- } else if textUnit == "mgdl" {
- return HKUnit.milligramsPerDeciliter
- }
- }
-
- return nil
- }
- set {
- if newValue == HKUnit.milligramsPerDeciliter {
- set("mgdl", forKey: Key.mmGlucoseUnit.rawValue)
- } else if newValue == HKUnit.millimolesPerLiter {
- set("mmol", forKey: Key.mmGlucoseUnit.rawValue)
- }
- }
- }
-
- var snoozedUntil: Date? {
- get {
- object(forKey: Key.mmSnoozedUntil.rawValue) as? Date
- }
- set {
- set(newValue, forKey: Key.mmSnoozedUntil.rawValue)
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+Bluetooth.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+Bluetooth.swift
deleted file mode 100644
index a69caac54..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+Bluetooth.swift
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// UserDefaults+Bluetooth.swift
-// MiaomiaoClientUI
-//
-// Created by Bjørn Inge Berg on 27/07/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-//import MiaomiaoClient
-
-extension UserDefaults {
- private enum Key: String {
- case bluetoothDeviceUUIDString = "no.bjorninge.bluetoothDeviceUUIDString"
- case libre2UiD = "no.bjorninge.libre2uid"
- }
-
- public var preSelectedUid: Data? {
- get {
- return data(forKey: Key.libre2UiD.rawValue)
-
- }
- set {
- if let newValue = newValue {
- set(newValue, forKey: Key.libre2UiD.rawValue)
- } else {
- print("Removing preSelectedUid")
- removeObject(forKey: Key.libre2UiD.rawValue)
- }
- }
- }
-
- public var preSelectedDevice: String? {
- get {
- if let astr = string(forKey: Key.bluetoothDeviceUUIDString.rawValue) {
- return astr.count > 0 ? astr : nil
- }
- return nil
- }
- set {
- if let newValue = newValue {
- set(newValue, forKey: Key.bluetoothDeviceUUIDString.rawValue)
- } else {
- removeObject(forKey: Key.bluetoothDeviceUUIDString.rawValue)
- }
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+GlucoseSettings.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+GlucoseSettings.swift
deleted file mode 100644
index c50d87c5a..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/Settings/UserDefaults+GlucoseSettings.swift
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Userdefaults+Alarmsettings.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 20/04/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-extension UserDefaults {
- private enum Key: String {
- case mmBackfillFromHistory = "no.bjorninge.mmBackfillFromHistory"
- case mmBackfillFromTrend = "no.bjorninge.mmBackfillFromTrend"
- }
-
- var mmBackfillFromHistory: Bool {
- get {
- optionalBool(forKey: Key.mmBackfillFromHistory.rawValue) ?? true
- }
- set {
- set(newValue, forKey: Key.mmBackfillFromHistory.rawValue)
- }
- }
-
- var mmBackfillFromTrend: Bool {
- get {
- optionalBool(forKey: Key.mmBackfillFromTrend.rawValue) ?? false
- }
- set {
- set(newValue, forKey: Key.mmBackfillFromTrend.rawValue)
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/UnfairLock.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/UnfairLock.swift
deleted file mode 100644
index 974192055..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/UnfairLock.swift
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// UnfairLock.swift
-// LoopKit Example
-//
-// Created by Pete Schwamb on 3/22/19.
-// Copyright © 2019 LoopKit Authors. All rights reserved.
-//
-
-// Source: http://www.russbishop.net/the-law
-
-import Foundation
-
-public class UnfairLock {
- private var _lock: UnsafeMutablePointer
-
- public init() {
- _lock = UnsafeMutablePointer.allocate(capacity: 1)
- _lock.initialize(to: os_unfair_lock())
- }
-
- deinit {
- _lock.deallocate()
- }
-
- public func withLock(_ f: () throws -> ReturnValue) rethrows -> ReturnValue {
- os_unfair_lock_lock(_lock)
- defer { os_unfair_lock_unlock(_lock) }
- return try f()
- }
-
- public func assertOwned() {
- os_unfair_lock_assert_owner(_lock)
- }
-
- public func assertNotOwned() {
- os_unfair_lock_assert_not_owner(_lock)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/WeakSynchronizedDelegate.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/WeakSynchronizedDelegate.swift
deleted file mode 100644
index a67264995..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Common/WeakSynchronizedDelegate.swift
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// WeakSynchronizedDelegate.swift
-// LoopKit
-//
-// Copyright © 2019 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-public class WeakSynchronizedDelegate {
-
- private let lock = UnfairLock()
- private weak var _delegate: AnyObject?
- private var _queue: DispatchQueue
-
- public init(queue: DispatchQueue = .main) {
- _queue = queue
- }
-
- public var delegate: Delegate? {
- get {
- return lock.withLock {
- return _delegate as? Delegate
- }
- }
- set {
- lock.withLock {
- _delegate = newValue as AnyObject
- }
- }
- }
-
- public var queue: DispatchQueue! {
- get {
- return lock.withLock {
- return _queue
- }
- }
- set {
- lock.withLock {
- _queue = newValue ?? .main
- }
- }
- }
-
- public func notify(_ block: @escaping (_ delegate: Delegate?) -> Void) {
- var delegate: Delegate?
- var queue: DispatchQueue!
-
- lock.withLock {
- delegate = _delegate as? Delegate
- queue = _queue
- }
-
- queue.async {
- block(delegate)
- }
- }
-
- public func notifyDelayed(by interval: TimeInterval, _ block: @escaping (_ delegate: Delegate?) -> Void) {
- var delegate: Delegate?
- var queue: DispatchQueue!
-
- lock.withLock {
- delegate = _delegate as? Delegate
- queue = _queue
- }
-
- queue.asyncAfter(deadline: .now() + interval) {
- block(delegate)
- }
- }
-
- public func call(_ block: (_ delegate: Delegate?) -> ReturnType) -> ReturnType {
- return lock.withLock { () -> ReturnType in
- var result: ReturnType!
- _queue.sync {
- result = block(_delegate as? Delegate)
- }
- return result
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/CompletionNotifying.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/CompletionNotifying.swift
deleted file mode 100644
index 39fa06e1d..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/CompletionNotifying.swift
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// CompletionNotifying.swift
-// LoopKitUI
-//
-// Created by Pete Schwamb on 1/29/19.
-// Copyright © 2019 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-public protocol CompletionDelegate: AnyObject {
- func completionNotifyingDidComplete(_ object: CompletionNotifying)
-}
-
-public protocol CompletionNotifying {
- var completionDelegate: CompletionDelegate? { set get }
-}
-
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/ConcreteGlucoseDisplayable.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/ConcreteGlucoseDisplayable.swift
deleted file mode 100644
index fa182f6eb..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/ConcreteGlucoseDisplayable.swift
+++ /dev/null
@@ -1,146 +0,0 @@
-//
-// ConcreteSensorDisplayable.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 04/11/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-import HealthKit
-
-public struct ConcreteGlucoseDisplayable: GlucoseDisplayable {
- public var glucoseRangeCategory: GlucoseRangeCategory?
-
- public var isStateValid: Bool
-
- public var trendType: GlucoseTrend?
-
- public var isLocal: Bool
-
- public var batteries : [(name: String, percentage: Int)]?
-}
-
-public enum GlucoseRangeCategory: Int, CaseIterable {
- case belowRange
- case urgentLow
- case low
- case normal
- case high
- case aboveRange
-}
-
-public enum GlucoseTrend: Int, CaseIterable {
- case upUpUp = 1
- case upUp = 2
- case up = 3
- case flat = 4
- case down = 5
- case downDown = 6
- case downDownDown = 7
-
- public var symbol: String {
- switch self {
- case .upUpUp:
- return "⇈"
- case .upUp:
- return "↑"
- case .up:
- return "↗︎"
- case .flat:
- return "→"
- case .down:
- return "↘︎"
- case .downDown:
- return "↓"
- case .downDownDown:
- return "⇊"
- }
- }
-
- public var arrows: String {
- switch self {
- case .upUpUp:
- return "↑↑"
- case .upUp:
- return "↑"
- case .up:
- return "↗︎"
- case .flat:
- return "→"
- case .down:
- return "↘︎"
- case .downDown:
- return "↓"
- case .downDownDown:
- return "↓↓"
- }
- }
-
- public var localizedDescription: String {
- switch self {
- case .upUpUp:
- return LocalizedString("Rising very fast", comment: "Glucose trend up-up-up")
- case .upUp:
- return LocalizedString("Rising fast", comment: "Glucose trend up-up")
- case .up:
- return LocalizedString("Rising", comment: "Glucose trend up")
- case .flat:
- return LocalizedString("Flat", comment: "Glucose trend flat")
- case .down:
- return LocalizedString("Falling", comment: "Glucose trend down")
- case .downDown:
- return LocalizedString("Falling fast", comment: "Glucose trend down-down")
- case .downDownDown:
- return LocalizedString("Falling very fast", comment: "Glucose trend down-down-down")
- }
- }
-
- public var direction: String {
- switch self {
- case .upUpUp:
- return "DoubleUp"
- case .upUp:
- return "SingleUp"
- case .up:
- return "FortyFiveUp"
- case .flat:
- return "Flat"
- case .down:
- return "FortyFiveDown"
- case .downDown:
- return "SingleDown"
- case .downDownDown:
- return "DoubleDown"
- }
- }
-
-}
-
-public protocol GlucoseDisplayable {
- /// Returns whether the current state is valid
- var isStateValid: Bool { get }
-
- /// Describes the state of the sensor in the current localization
- var stateDescription: String { get }
-
- /// Enumerates the trend of the sensor values
- var trendType: GlucoseTrend? { get }
-
- /// Returns whether the data is from a locally-connected device
- var isLocal: Bool { get }
-
- /// enumerates the glucose value type (e.g., normal, low, high)
- var glucoseRangeCategory: GlucoseRangeCategory? { get }
-}
-
-
-extension GlucoseDisplayable {
- public var stateDescription: String {
- if isStateValid {
- return LocalizedString("OK", comment: "Sensor state description for the valid state")
- } else {
- return LocalizedString("Needs Attention", comment: "Sensor state description for the non-valid state")
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/DeviceLogEntryType.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/DeviceLogEntryType.swift
deleted file mode 100644
index 04d6b0ab8..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/DeviceLogEntryType.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// DeviceLogEntryType.swift
-// LoopKit
-//
-// Created by Pete Schwamb on 1/13/20.
-// Copyright © 2020 LoopKit Authors. All rights reserved.
-//
-
-import Foundation
-
-public enum DeviceLogEntryType: String {
- /// Log entry related to data or commands sent to the device.
- case send
- /// Log entry related to data or events received from the device.
- case receive
- /// Log entry related to any errors from the device's SDK or the device itself.
- case error
- /// Log entry related to a delegate call from the device's SDK (for example, acknowledgement of receiving a command).
- case delegate
- /// Log entry related to a response from a delegate call (for example, acknowledgement of executing a command).
- case delegateResponse
- /// Log entry related to any device connection activities (e.g. scanning, connecting, disconnecting, reconnecting, etc.).
- case connection
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Features.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Features.swift
deleted file mode 100644
index 9ec409e30..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/Features.swift
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// Features.swift
-// LibreTransmitter
-//
-// Created by Bjørn Inge Berg on 30/08/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import Foundation
-
-#if canImport(CoreNFC)
-import CoreNFC
-#endif
-
-public final class Features{
-
- static public var logSubsystem = "no.bjorninge.libre"
-
- static var phoneNFCAvailable: Bool {
- #if canImport(CoreNFC)
- if NSClassFromString("NFCNDEFReaderSession") == nil {
- return false
-
- }
-
- return NFCNDEFReaderSession.readingAvailable
- #else
- return false
- #endif
- }
-
- static var supportsLogExport: Bool {
- if #available(iOS 15, *) {
- return true
- }
- return false
- }
-
-
-
-
-}
-
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreGlucose.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreGlucose.swift
deleted file mode 100644
index ce04e40e0..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreGlucose.swift
+++ /dev/null
@@ -1,229 +0,0 @@
-//
-// MiaomiaoClient.h
-// MiaomiaoClient
-//
-
-import Foundation
-import HealthKit
-import os.log
-
-
-fileprivate var logger = Logger(forType: "LibreGlucose")
-
-
-public struct LibreGlucose {
- public let unsmoothedGlucose: Double
- public var glucoseDouble: Double
- public var error = [MeasurementError.OK]
- public var glucose: UInt16 {
- UInt16(glucoseDouble.rounded())
- }
- //trend is deprecated here, it should only be calculated once in latestbackfill
- //public var trend: UInt8
- public var timestamp: Date
- //public let collector: String?
-
- public var sensorStartDate: Date? = nil
-
- public static func timeDifference(oldGlucose: LibreGlucose, newGlucose: LibreGlucose) -> TimeInterval {
- newGlucose.startDate.timeIntervalSince(oldGlucose.startDate)
- }
-
- public var syncId: String {
- "\(Int(self.startDate.timeIntervalSince1970))\(self.unsmoothedGlucose)"
- }
-
- public var isStateValid: Bool {
- // We know that the official libre algorithm doesn't produce values
- // below 39. However, both the raw sensor contents and the derived algorithm
- // supports values down to 0 without issues. A bit uncertain if nightscout and loop will work with values below 1, so we restrict this to 1
- glucose >= 1
- }
-
- public func GetGlucoseTrend(last: Self) -> GlucoseTrend {
- Self.GetGlucoseTrend(current: self, last: last)
- }
-}
-
-extension LibreGlucose: GlucoseValue {
- public var startDate: Date {
- timestamp
- }
-
- public var quantity: HKQuantity {
- .init(unit: .milligramsPerDeciliter, doubleValue: glucoseDouble)
- }
-}
-
-extension LibreGlucose {
- public var description: String {
- guard let glucoseUnit = UserDefaults.standard.mmGlucoseUnit, let formatter = LibreGlucose.dynamicFormatter, let formatted = formatter.string(from: self.quantity, for: glucoseUnit) else {
- logger.debug("dabear:: glucose unit was not recognized, aborting")
- return "Unknown"
- }
-
- return formatted
- }
- private static var glucoseFormatterMgdl: QuantityFormatter = {
- let formatter = QuantityFormatter()
- formatter.setPreferredNumberFormatter(for: HKUnit.milligramsPerDeciliter)
- return formatter
- }()
-
- private static var glucoseFormatterMmol: QuantityFormatter = {
- let formatter = QuantityFormatter()
- formatter.setPreferredNumberFormatter(for: HKUnit.millimolesPerLiter)
- return formatter
- }()
-
- public static var dynamicFormatter: QuantityFormatter? {
- guard let glucoseUnit = UserDefaults.standard.mmGlucoseUnit else {
- logger.debug("dabear:: glucose unit was not recognized, aborting")
- return nil
- }
-
- return (glucoseUnit == HKUnit.milligramsPerDeciliter ? glucoseFormatterMgdl : glucoseFormatterMmol)
- }
-
- public static func glucoseDiffDesc(oldValue: Self, newValue: Self) -> String {
- guard let glucoseUnit = UserDefaults.standard.mmGlucoseUnit else {
- logger.debug("dabear:: glucose unit was not recognized, aborting")
- return "Unknown"
- }
-
- var stringValue = [String]()
-
- var diff = newValue.glucoseDouble - oldValue.glucoseDouble
- let sign = diff < 0 ? "-" : "+"
-
- if diff == 0 {
- stringValue.append( "\(sign) 0")
- } else {
- diff = abs(diff)
- let asObj = LibreGlucose(
- unsmoothedGlucose: diff,
- glucoseDouble: diff,
- timestamp: Date())
- if let formatted = dynamicFormatter?.string(from: asObj.quantity, for: glucoseUnit) {
- stringValue.append( "\(sign) \(formatted)")
- }
- }
-
- return stringValue.joined(separator: ",")
- }
-}
-
-extension LibreGlucose {
- static func calculateSlope(current: Self, last: Self) -> Double {
- if current.timestamp == last.timestamp {
- return 0.0
- }
-
- let _curr = Double(current.timestamp.timeIntervalSince1970 * 1_000)
- let _last = Double(last.timestamp.timeIntervalSince1970 * 1_000)
-
- return (Double(last.unsmoothedGlucose) - Double(current.unsmoothedGlucose)) / (_last - _curr)
- }
-
- static func calculateSlopeByMinute(current: Self, last: Self) -> Double {
- return calculateSlope(current: current, last: last) * 60_000
- }
-
- static func GetGlucoseTrend(current: Self?, last: Self?) -> GlucoseTrend {
-
- guard let current = current, let last = last else {
- return .flat
- }
-
- let s = calculateSlopeByMinute(current: current, last: last)
-
-
- switch s {
- case _ where s <= (-3.5):
- return .downDownDown
- case _ where s <= (-2):
- return .downDown
- case _ where s <= (-1):
- return .down
- case _ where s <= (1):
- return .flat
- case _ where s <= (2):
- return .up
- case _ where s <= (3.5):
- return .upUp
- case _ where s <= (40):
- return .flat //flat is the new (tm) "unknown"!
-
- default:
-
- return .flat
- }
- }
-}
-
-extension LibreGlucose {
- static func fromHistoryMeasurements(_ measurements: [Measurement], nativeCalibrationData: SensorData.CalibrationInfo) -> [LibreGlucose] {
- var arr = [LibreGlucose]()
-
- for historical in measurements {
- let glucose = LibreGlucose(
- //unsmoothedGlucose: historical.temperatureAlgorithmGlucose,
- //glucoseDouble: historical.temperatureAlgorithmGlucose,
- unsmoothedGlucose: historical.roundedGlucoseValueFromRaw2(calibrationInfo: nativeCalibrationData),
- glucoseDouble: historical.roundedGlucoseValueFromRaw2(calibrationInfo: nativeCalibrationData),
- error: historical.error,
- timestamp: historical.date)
-
- if glucose.glucoseDouble > 0 {
- arr.append(glucose)
- }
- }
-
- return arr
- }
-
- static func fromTrendMeasurements(_ measurements: [Measurement], nativeCalibrationData: SensorData.CalibrationInfo, returnAll: Bool,
- sensorStartDate: Date? = nil) -> [LibreGlucose] {
- var arr = [LibreGlucose]()
-
- var shouldSmoothGlucose = true
- for trend in measurements {
- // trend arrows on each libreglucose value is not needed
- // instead we calculate it once when latestbackfill is set, which in turn sets
- // the sensordisplayable property
- let glucose = LibreGlucose(
- //unsmoothedGlucose: trend.temperatureAlgorithmGlucose,
- unsmoothedGlucose: trend.roundedGlucoseValueFromRaw2(calibrationInfo: nativeCalibrationData),
- glucoseDouble: 0.0,
- error: trend.error,
- timestamp: trend.date,
- sensorStartDate: sensorStartDate)
- // if sensor is ripped off body while transmitter is attached, values below 1 might be created
-
- if glucose.unsmoothedGlucose > 0 && glucose.unsmoothedGlucose <= 500 {
- arr.append(glucose)
- }
-
- // Just for expliciticity, if one of the values are 0,
- // then the rest of the values should not be smoothed
- if glucose.unsmoothedGlucose <= 0 {
- shouldSmoothGlucose = false
- }
- }
-
-
- if shouldSmoothGlucose {
- arr = CalculateSmothedData5Points(origtrends: arr)
- } else {
- for i in 0 ..< arr.count {
- arr[i].glucoseDouble = arr[i].unsmoothedGlucose
- }
- }
-
- if !returnAll, let first = arr.first {
- return [first]
- }
-
- return arr
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/Calibration.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/Calibration.swift
deleted file mode 100644
index 94a764420..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/Calibration.swift
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-// Calibration.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 05/03/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-import os.log
-
-private let LibreCalibrationLabel = "https://LibreCalibrationLabelNative.doesnot.exist.com"
-private let LibreCalibrationUrl = URL(string: LibreCalibrationLabel)!
-private let LibreUsername = "LibreUsername"
-
-fileprivate var logger = Logger(forType: "KeychainManagerCalibration")
-
-public extension KeychainManagerWrapper {
- func setLibreNativeCalibrationData(_ calibrationData: SensorData.CalibrationInfo?) throws {
- var credentials: InternetCredentials? = nil
- if let calibrationData = calibrationData {
- credentials = InternetCredentials(username: LibreUsername, password: serializeNativeAlgorithmParameters(calibrationData), url: LibreCalibrationUrl)
- }
- logger.debug("dabear: Setting calibrationdata to \(String(describing: calibrationData))")
- try replaceInternetCredentials(credentials, forLabel: LibreCalibrationLabel)
- }
-
- func getLibreNativeCalibrationData() -> SensorData.CalibrationInfo? {
- do { // Silence all errors and return nil
- let credentials = try getInternetCredentials(label: LibreCalibrationLabel)
- return deserializeNativeAlgorithmParameters(text: credentials.password)
- } catch {
-
- return nil
- }
- }
-}
-
-public func calibrateSensor(sensordata: SensorData, callback: @escaping (SensorData.CalibrationInfo) -> Void) {
-
- let params = sensordata.calibrationData
- callback(params)
-}
-
-private func serializeNativeAlgorithmParameters(_ params: SensorData.CalibrationInfo) -> String {
- let encoder = JSONEncoder()
- encoder.outputFormatting = .prettyPrinted
-
- var aString = ""
- do {
- let jsonData = try encoder.encode(params)
-
- if let jsonString = String(data: jsonData, encoding: .utf8) {
- aString = jsonString
- }
- } catch {
- logger.debug("Could not serialize parameters: \(error.localizedDescription)")
- }
- return aString
-}
-
-private func deserializeNativeAlgorithmParameters(text: String) -> SensorData.CalibrationInfo? {
- if let jsonData = text.data(using: .utf8) {
- let decoder = JSONDecoder()
-
- do {
- return try decoder.decode(SensorData.CalibrationInfo.self, from: jsonData)
- } catch {
- logger.debug("Could not create instance: \(error.localizedDescription)")
- }
- } else {
- logger.debug("Did not create instance")
- }
- return nil
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/GlucoseAlgorithm/GlucoseFromRaw.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/GlucoseAlgorithm/GlucoseFromRaw.swift
deleted file mode 100644
index ccaefc891..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/GlucoseAlgorithm/GlucoseFromRaw.swift
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// GlucoseFromRaw.swift
-//
-
-import Foundation
-import RawGlucose
-
-extension MeasurementProtocol {
- func roundedGlucoseValueFromRaw(calibrationInfo: SensorData.CalibrationInfo) -> Int {
- Int(round(glucoseValueFromRaw(calibrationInfo: calibrationInfo)))
- }
-
- func roundedGlucoseValueFromRaw2(calibrationInfo: SensorData.CalibrationInfo) -> Double{
- round(glucoseValueFromRaw(calibrationInfo: calibrationInfo))
- }
-
-
- func glucoseValueFromRaw(calibrationInfo: SensorData.CalibrationInfo) -> Double {
- RawGlucose.glucoseValueFromRaw(
- rawTemperature: Double(self.rawTemperature),
- rawTemperatureAdjustment: Double(self.rawTemperatureAdjustment),
- rawGlucose: Double(self.rawGlucose),
- i1: calibrationInfo.i1,
- i2: calibrationInfo.i2,
- i3: calibrationInfo.i3,
- i4: calibrationInfo.i4,
- i5: calibrationInfo.i5,
- i6: calibrationInfo.i6
- )
- }
-}
-
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/GlucoseAlgorithm/GlucoseSmoothing.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/GlucoseAlgorithm/GlucoseSmoothing.swift
deleted file mode 100644
index d5561f460..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/GlucoseAlgorithm/GlucoseSmoothing.swift
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// GlucoseSmoothing.swift
-// MiaomiaoClientUI
-//
-// Created by Bjørn Inge Berg on 25/03/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-//https://github.com/NightscoutFoundation/xDrip/pull/828/files
-
-//private func trendToLibreGlucose(_ measurements: [Measurement]) -> [LibreGlucose]?{
-
-func CalculateSmothedData5Points(origtrends: [LibreGlucose]) -> [LibreGlucose] {
- // In all places in the code, there should be exactly 16 points.
- // Since that might change, and I'm doing an average of 5, then in the case of less then 5 points,
- // I'll only copy the data as is (to make sure there are reasonable values when the function returns).
-
- var trends = origtrends
- //this is an adoptation, doesn't follow the original directly
- if trends.count < 5 {
- for i in 0 ..< trends.count {
- trends[i].glucoseDouble = trends[i].unsmoothedGlucose
- }
-
- return trends
- }
- for i in 0 ..< trends.count - 4 {
- trends[i].glucoseDouble = (trends[i].unsmoothedGlucose + trends[i + 1].unsmoothedGlucose + trends[i + 2].unsmoothedGlucose + trends[i + 3].unsmoothedGlucose + trends[i + 4].unsmoothedGlucose) / 5
- }
- trends[trends.count - 4].glucoseDouble = (trends[trends.count - 4].unsmoothedGlucose + trends[trends.count - 3].unsmoothedGlucose + trends[trends.count - 2].unsmoothedGlucose + trends[trends.count - 1].unsmoothedGlucose) / 4
- trends[trends.count - 3].glucoseDouble = (trends[trends.count - 3].unsmoothedGlucose + trends[trends.count - 2].unsmoothedGlucose + trends[trends.count - 1].unsmoothedGlucose ) / 3
-
- trends[trends.count - 2].glucoseDouble = (trends[trends.count - 2].unsmoothedGlucose + trends[trends.count - 1].unsmoothedGlucose ) / 2
-
- trends[trends.count - 1].glucoseDouble = trends[trends.count - 2].glucoseDouble
-
- return trends
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/LibreError.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/LibreError.swift
deleted file mode 100644
index e42dc5dcf..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/LibreError.swift
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-// LibreError.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 05/03/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-
-import Foundation
-
-public enum LibreError: Error {
- case noSensorData
- case noCalibrationData
- case invalidCalibrationData
- case checksumValidationError
- case expiredSensor
- case invalidAutoCalibrationCredentials
- case encryptedSensor
- case noValidSensorData
-
- public var errorDescription: String {
- switch self {
- case .noSensorData:
- return "No sensor data present"
- case .noValidSensorData:
- return "No valid sensor data present, but sensor is running. Maybe due to sensor being off-body?"
-
- case .noCalibrationData:
- return "No calibration data present"
- case .invalidCalibrationData:
- return "invalid calibration data detected"
- case .checksumValidationError:
- return "Checksum Validation Error "
- case .expiredSensor:
- return "Sensor has expired"
- case .invalidAutoCalibrationCredentials:
- return "Invalid Auto Calibration Credentials"
- case .encryptedSensor:
- return "Encrypted or unsupported libre sensor detected."
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/LimitedQueue.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/LimitedQueue.swift
deleted file mode 100644
index 81d9bfed4..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/LimitedQueue.swift
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// LimitedQueue.swift
-// MiaomiaoClient
-//
-// Created by Bjørn Inge Berg on 03/03/2020.
-// Copyright © 2020 Bjørn Inge Vikhammermo Berg. All rights reserved.
-//
-
-import Foundation
-
-public struct LimitedQueue: Codable {
- public var array = [T]()
- var limit: Int = 10
-
- mutating func enqueue(_ element: T) {
- while array.count >= limit {
- array.removeFirst()
- }
- array.append(element)
- }
-
- mutating func dequeue() -> T? {
- array.isEmpty ? nil : array.removeFirst()
- }
-}
-extension UserDefaults {
- private enum Key: String {
- case queuedSensorData = "no.bjorninge.queuedSensorData"
- case shouldPersistSensorData = "no.bjorninge.shouldPersistSensorData"
- }
-
- var shouldPersistSensorData: Bool {
- get {
- optionalBool(forKey: Key.shouldPersistSensorData.rawValue) ?? false
- }
- set {
- set(newValue, forKey: Key.shouldPersistSensorData.rawValue)
- }
- }
-
- public var queuedSensorData: LimitedQueue? {
- get {
- guard let data = object(forKey: Key.queuedSensorData.rawValue) as? Data else {
- return nil
- }
-
- let decoder = JSONDecoder()
- guard let q = try? decoder.decode(LimitedQueue.self, from: data) else {
- return nil
- }
-
- return q
- }
- set {
- let encoder = JSONEncoder()
- if let val = newValue, let encoded = try? encoder.encode(val) {
- set(encoded, forKey: Key.queuedSensorData.rawValue)
- } else {
- removeObject(forKey: Key.queuedSensorData.rawValue)
- }
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/CRC.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/CRC.swift
deleted file mode 100644
index a9af4facf..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/CRC.swift
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// CRC.swift
-// LibreMonitor
-//
-// Created by Uwe Petersen on 26.07.16.
-// Copyright © 2016 Uwe Petersen. All rights reserved.
-//
-//
-// Part of this code is taken from
-// CRC.swift
-// CryptoSwift
-//
-// Created by Marcin Krzyzanowski on 25/08/14.
-// Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
-//
-
-import Foundation
-
-final class Crc {
- /// Table of precalculated crc16 values
- static let crc16table: [UInt16] = [0, 4_489, 8_978, 12_955, 17_956, 22_445, 25_910, 29_887, 35_912, 40_385, 44_890, 48_851, 51_820, 56_293, 59_774, 63_735, 4_225, 264, 13_203, 8_730, 22_181, 18_220, 30_135, 25_662, 40_137, 36_160, 49_115, 44_626, 56_045, 52_068, 63_999, 59_510, 8_450, 12_427, 528, 5_017, 26_406, 30_383, 17_460, 21_949, 44_362, 48_323, 36_440, 40_913, 60_270, 64_231, 51_324, 55_797, 12_675, 8_202, 4_753, 792, 30_631, 26_158, 21_685, 17_724, 48_587, 44_098, 40_665, 36_688, 64_495, 60_006, 55_549, 51_572, 16_900, 21_389, 24_854, 28_831, 1_056, 5_545, 10_034, 14_011, 52_812, 57_285, 60_766, 64_727, 34_920, 39_393, 43_898, 47_859, 21_125, 17_164, 29_079, 24_606, 5_281, 1_320, 14_259, 9_786, 57_037, 53_060, 64_991, 60_502, 39_145, 35_168, 48_123, 43_634, 25_350, 29_327, 16_404, 20_893, 9_506, 13_483, 1_584, 6_073, 61_262, 65_223, 52_316, 56_789, 43_370, 47_331, 35_448, 39_921, 29_575, 25_102, 20_629, 16_668, 13_731, 9_258, 5_809, 1_848, 65_487, 60_998, 56_541, 52_564, 47_595, 43_106, 39_673, 35_696, 33_800, 38_273, 42_778, 46_739, 49_708, 54_181, 57_662, 61_623, 2_112, 6_601, 11_090, 15_067, 20_068, 24_557, 28_022, 31_999, 38_025, 34_048, 47_003, 42_514, 53_933, 49_956, 61_887, 57_398, 6_337, 2_376, 15_315, 10_842, 24_293, 20_332, 32_247, 27_774, 42_250, 46_211, 34_328, 38_801, 58_158, 62_119, 49_212, 53_685, 10_562, 14_539, 2_640, 7_129, 28_518, 32_495, 19_572, 24_061, 46_475, 41_986, 38_553, 34_576, 62_383, 57_894, 53_437, 49_460, 14_787, 10_314, 6_865, 2_904, 32_743, 28_270, 23_797, 19_836, 50_700, 55_173, 58_654, 62_615, 32_808, 37_281, 41_786, 45_747, 19_012, 23_501, 26_966, 30_943, 3_168, 7_657, 12_146, 16_123, 54_925, 50_948, 62_879, 58_390, 37_033, 33_056, 46_011, 41_522, 23_237, 19_276, 31_191, 26_718, 7_393, 3_432, 16_371, 11_898, 59_150, 63_111, 50_204, 54_677, 41_258, 45_219, 33_336, 37_809, 27_462, 31_439, 18_516, 23_005, 11_618, 15_595, 3_696, 8_185, 63_375, 58_886, 54_429, 50_452, 45_483, 40_994, 37_561, 33_584, 31_687, 27_214, 22_741, 18_780, 15_843, 11_370, 7_921, 3_960]
-
- /// Calculates crc16. Taken from https://github.com/krzyzanowskim/CryptoSwift with modifications (reversing and byte swapping) to adjust for crc as used by Freestyle Libre
- ///
- /// - parameter message: Array of bytes for which the crc is to be calculated
- /// - parameter seed: seed for crc
- ///
- /// - returns: crc16
- static func crc16(_ message: [UInt8], seed: UInt16? = nil) -> UInt16 {
- var crc: UInt16 = seed != nil ? seed! : 0x0000
-
- // calculate crc
- for chunk in BytesSequence(chunkSize: 256, data: message) {
- for b in chunk {
- crc = (crc >> 8) ^ crc16table[Int((crc ^ UInt16(b)) & 0xFF)]
- }
- }
-
- // reverse the bits (modification by Uwe Petersen, 2016-06-05)
- var reverseCrc = UInt16(0)
- for _ in 0..<16 {
- reverseCrc = reverseCrc << 1 | crc & 1
- crc >>= 1
- }
-
- // swap bytes and return (modification by Uwe Petersen, 2016-06-05)
- return reverseCrc.byteSwapped
- }
-
- /// Checks crc for an array of bytes.
- ///
- /// Assumes that the first two bytes are the crc16 of the bytes array and compares the corresponding value with the crc16 calculated over the rest of the array of bytes.
- ///
- /// - parameter bytes: Array of bytes with a crc in the first two bytes
- ///
- /// - returns: true if crc is valid
- static func hasValidCrc16InFirstTwoBytes(_ bytes: [UInt8]) -> Bool {
-// print(Array(bytes.dropFirst(2)))
- let calculatedCrc = Crc.crc16(Array(bytes.dropFirst(2)), seed: 0xffff)
- let enclosedCrc = (UInt16(bytes[0]) << 8) | UInt16(bytes[1])
-
-// print(String(format: "Calculated crc is %X and enclosed crc is %x", arguments: [calculatedCrc, enclosedCrc]))
-
- return calculatedCrc == enclosedCrc
- }
-
- static func hasValidCrc16InLastTwoBytes(_ bytes: [UInt8]) -> Bool {
- let calculatedCrc = Crc.crc16(Array(bytes.dropLast(2)), seed: 0xffff)
- let enclosedCrc = (UInt16(Array(bytes.suffix(2))[0]) << 8) | UInt16(Array(bytes.suffix(2))[1])
-
- return calculatedCrc == enclosedCrc
- }
-
- /// Returns a byte array with correct crc in first two bytes (calculated over the remaining bytes).
- ///
- /// In case some bytes of the original byte array are tweaked, the original crc does not match the remainaing bytes any more. This function calculates the correct crc of the bytes from byte #0x02 to the end and replaces the first two bytes with the correct crc.
- ///
- /// - Parameter bytes: byte array
- /// - Returns: byte array with correct crc in first two bytes
- static func bytesWithCorrectCRC(_ bytes: [UInt8]) -> [UInt8] {
- let calculatedCrc = Crc.crc16(Array(bytes.dropFirst(2)), seed: 0xffff)
-
- var correctedBytes = bytes
- correctedBytes[0] = UInt8(calculatedCrc >> 8)
- correctedBytes[1] = UInt8(calculatedCrc & 0x00FF)
- return correctedBytes
- }
-}
-
-/// Struct BytesSequence, taken from https://github.com/krzyzanowskim/CryptoSwift
-struct BytesSequence: Sequence {
- let chunkSize: Int
- let data: [UInt8]
-
- func makeIterator() -> AnyIterator> {
- var offset: Int = 0
-
- return AnyIterator {
- let end = Swift.min(self.chunkSize, self.data.count - offset)
- let result = self.data[offset.. [MeasurementError]{
- errBitField == 0 ?
- [MeasurementError.OK] :
- MeasurementError.allErrorCodes.filter { (errBitField & $0.rawValue) != 0}
-
- }
-
-
- var description: String {
- String(" date: \(date), rawGlucose: \(rawGlucose), rawTemperature: \(rawTemperature), bytes: \(bytes) \n")
-
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/PreLibre2.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/PreLibre2.swift
deleted file mode 100644
index 9ae09b6d8..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/PreLibre2.swift
+++ /dev/null
@@ -1,785 +0,0 @@
-import Foundation
-
-public enum Libre2 {
- /// Decrypts 43 blocks of Libre 2 FRAM
- /// - Parameters:
- /// - type: Suppurted sensor type (.libre2, .libreUS14day)
- /// - id: ID/Serial of the sensor. Could be retrieved from NFC as uid.
- /// - info: Sensor info. Retrieved by sending command '0xa1' via NFC.
- /// - data: Encrypted FRAM data
- /// - Returns: Decrypted FRAM data
- static public func decryptFRAM(type: SensorType, id: [UInt8], info: [UInt8], data: [UInt8]) throws -> [UInt8] {
- guard type == .libre2 || type == .libre2C5 || type == .libreUS14day || type == .libreUS14dayE6 else {
- struct DecryptFRAMError: Error {
- let errorDescription = "Unsupported sensor type"
- }
- throw DecryptFRAMError()
- }
-
- func getArg(block: Int) -> UInt16 {
- switch type {
- case .libreUS14day, .libreUS14dayE6:
- if block < 3 || block >= 40 {
- // For header and footer it is a fixed value.
- return 0xcadc
- }
- return UInt16(info[5], info[4])
- case .libre2, .libre2C5:
- return UInt16(info[5], info[4]) ^ 0x44
- default: fatalError("Unsupported sensor type")
- }
- }
-
- var result = [UInt8]()
-
- for i in 0 ..< 43 {
- let input = prepareVariables(id: id, x: UInt16(i), y: getArg(block: i))
- let blockKey = processCrypto(input: input)
-
- result.append(data[i * 8 + 0] ^ UInt8(truncatingIfNeeded: blockKey[0]))
- result.append(data[i * 8 + 1] ^ UInt8(truncatingIfNeeded: blockKey[0] >> 8))
- result.append(data[i * 8 + 2] ^ UInt8(truncatingIfNeeded: blockKey[1]))
- result.append(data[i * 8 + 3] ^ UInt8(truncatingIfNeeded: blockKey[1] >> 8))
- result.append(data[i * 8 + 4] ^ UInt8(truncatingIfNeeded: blockKey[2]))
- result.append(data[i * 8 + 5] ^ UInt8(truncatingIfNeeded: blockKey[2] >> 8))
- result.append(data[i * 8 + 6] ^ UInt8(truncatingIfNeeded: blockKey[3]))
- result.append(data[i * 8 + 7] ^ UInt8(truncatingIfNeeded: blockKey[3] >> 8))
- }
- return result
- }
-
- /// Decrypts Libre 2 BLE payload
- /// - Parameters:
- /// - id: ID/Serial of the sensor. Could be retrieved from NFC as uid.
- /// - data: Encrypted BLE data
- /// - Returns: Decrypted BLE data
- static func decryptBLE(id: [UInt8], data: [UInt8]) throws -> [UInt8] {
- let d = usefulFunction(id: id, x: 0x1b, y: 0x1b6a)
- let x = UInt16(d[1], d[0]) ^ UInt16(d[3], d[2]) | 0x63
- let y = UInt16(data[1], data[0]) ^ 0x63
-
- var key = [UInt8]()
- var initialKey = processCrypto(input: prepareVariables(id: id, x: x, y: y))
-
- for _ in 0 ..< 8 {
- key.append(UInt8(truncatingIfNeeded: initialKey[0]))
- key.append(UInt8(truncatingIfNeeded: initialKey[0] >> 8))
- key.append(UInt8(truncatingIfNeeded: initialKey[1]))
- key.append(UInt8(truncatingIfNeeded: initialKey[1] >> 8))
- key.append(UInt8(truncatingIfNeeded: initialKey[2]))
- key.append(UInt8(truncatingIfNeeded: initialKey[2] >> 8))
- key.append(UInt8(truncatingIfNeeded: initialKey[3]))
- key.append(UInt8(truncatingIfNeeded: initialKey[3] >> 8))
- initialKey = processCrypto(input: initialKey)
- }
-
- let result = data[2...].enumerated().map { i, value in
- value ^ key[i]
- }
-
- guard Crc.hasValidCrc16InLastTwoBytes(result) else {
- struct DecryptBLEError: Error, LocalizedError {
- let errorDescription = "BLE data decrytion failed"
- }
- throw DecryptBLEError()
- }
-
- return result
- }
-
- static func activateParameters(id: [UInt8]) -> Data {
- let d = usefulFunction(id: id, x: 0x1b, y: 0x1b6a)
- return Data([UInt8]([0x1b, d[0], d[1], d[2], d[3]]))
- }
-}
-
-public extension Libre2 {
-
- static func streamingUnlockPayload(sensorUID: Data, info: Data, enableTime: UInt32, unlockCount: UInt16) -> [UInt8] {
- // First 4 bytes are just int32 of timestamp + unlockCount
- let time = enableTime + UInt32(unlockCount)
- let b: [UInt8] = [UInt8(time & 0xFF), UInt8((time >> 8) & 0xFF), UInt8((time >> 16) & 0xFF), UInt8((time >> 24) & 0xFF)]
-
- // Then we need data of activation command and enable command that were sent to sensor
- let ad = Libre2.usefulFunction(sensorUID: sensorUID, x: 0x1b, y: 0x1b6a)
- let ed = Libre2.usefulFunction(sensorUID: sensorUID, x: 0x1e, y: UInt16(enableTime & 0xFFFF) ^ UInt16(info[5], info[4]))
-
- let t11 = UInt16(ed[1], ed[0]) ^ UInt16(b[3], b[2])
- let t12 = UInt16(ad[1], ad[0])
- let t13 = UInt16(ed[3], ed[2]) ^ UInt16(b[1], b[0])
- let t14 = UInt16(ad[3], ad[2])
-
- let t2 = Libre2.processCrypto(input: Libre2.prepareVariables(sensorUID: sensorUID, i1: t11, i2: t12, i3: t13, i4: t14))
-
- // TODO extract if secret
- let t31 = crc16(Data([0xc1, 0xc4, 0xc3, 0xc0, 0xd4, 0xe1, 0xe7, 0xba, UInt8(t2[0] & 0xFF), UInt8((t2[0] >> 8) & 0xFF)])).byteSwapped
- let t32 = crc16(Data([UInt8(t2[1] & 0xFF), UInt8((t2[1] >> 8) & 0xFF), UInt8(t2[2] & 0xFF), UInt8((t2[2] >> 8) & 0xFF), UInt8(t2[3] & 0xFF), UInt8((t2[3] >> 8) & 0xFF)])).byteSwapped
- let t33 = crc16(Data([ad[0], ad[1], ad[2], ad[3], ed[0], ed[1]])).byteSwapped
- let t34 = crc16(Data([ed[2], ed[3], b[0], b[1], b[2], b[3]])).byteSwapped
-
- let t4 = Libre2.processCrypto(input: Libre2.prepareVariables(sensorUID: sensorUID, i1: t31, i2: t32, i3: t33, i4: t34))
-
- let res = [UInt8(t4[0] & 0xFF), UInt8((t4[0] >> 8) & 0xFF), UInt8(t4[1] & 0xFF), UInt8((t4[1] >> 8) & 0xFF), UInt8(t4[2] & 0xFF), UInt8((t4[2] >> 8) & 0xFF), UInt8(t4[3] & 0xFF), UInt8((t4[3] >> 8) & 0xFF)]
-
- return [b[0], b[1], b[2], b[3], res[0], res[1], res[2], res[3], res[4], res[5], res[6], res[7]]
- }
-
- static let key: [UInt16] = [0xA0C5, 0x6860, 0x0000, 0x14C6]
-
- static func processCrypto(input: [UInt16]) -> [UInt16] {
- func op(_ value: UInt16) -> UInt16 {
- // We check for last 2 bits and do the xor with specific value if bit is 1
- var res = value >> 2 // Result does not include these last 2 bits
- if value & 1 != 0 { // If last bit is 1
- res = res ^ key[1]
- }
-
- if value & 2 != 0 { // If second last bit is 1
- res = res ^ key[0]
- }
-
- return res
- }
-
- let r0 = op(input[0]) ^ input[3]
- let r1 = op(r0) ^ input[2]
- let r2 = op(r1) ^ input[1]
- let r3 = op(r2) ^ input[0]
- let r4 = op(r3)
- let r5 = op(r4 ^ r0)
- let r6 = op(r5 ^ r1)
- let r7 = op(r6 ^ r2)
-
- let f1 = r0 ^ r4
- let f2 = r1 ^ r5
- let f3 = r2 ^ r6
- let f4 = r3 ^ r7
-
- return [f4, f3, f2, f1]
- }
-
- static func prepareVariables(sensorUID: Data, i1: UInt16, i2: UInt16, i3: UInt16, i4: UInt16) -> [UInt16] {
- let s1 = UInt16(truncatingIfNeeded: UInt(UInt16(sensorUID[5], sensorUID[4])) + UInt(i1))
- let s2 = UInt16(truncatingIfNeeded: UInt(UInt16(sensorUID[3], sensorUID[2])) + UInt(i2))
- let s3 = UInt16(truncatingIfNeeded: UInt(UInt16(sensorUID[1], sensorUID[0])) + UInt(i3) + UInt(key[2]))
- let s4 = UInt16(truncatingIfNeeded: UInt(i4) + UInt(key[3]))
-
- return [s1, s2, s3, s4]
- }
-
- static func prepareVariables(id: [UInt8], x: UInt16, y: UInt16) -> [UInt16] {
- let s1 = UInt16(truncatingIfNeeded: UInt(UInt16(id[5], id[4])) + UInt(x) + UInt(y))
- let s2 = UInt16(truncatingIfNeeded: UInt(UInt16(id[3], id[2])) + UInt(key[2]))
- let s3 = UInt16(truncatingIfNeeded: UInt(UInt16(id[1], id[0])) + UInt(x) * 2)
- let s4 = 0x241a ^ key[3]
-
- return [s1, s2, s3, s4]
- }
-
- static func prepareVariables(sensorUID: Data, x: UInt16, y: UInt16) -> [UInt16] {
- let s1 = UInt16(truncatingIfNeeded: UInt(UInt16(sensorUID[5], sensorUID[4])) + UInt(x) + UInt(y))
- let s2 = UInt16(truncatingIfNeeded: UInt(UInt16(sensorUID[3], sensorUID[2])) + UInt(key[2]))
- let s3 = UInt16(truncatingIfNeeded: UInt(UInt16(sensorUID[1], sensorUID[0])) + UInt(x) * 2)
- let s4 = 0x241a ^ key[3]
-
- return [s1, s2, s3, s4]
- }
-
- static func usefulFunction(sensorUID: Data, x: UInt16, y: UInt16) -> [UInt8] {
- let blockKey = processCrypto(input: prepareVariables(sensorUID: sensorUID, x: x, y: y))
- let low = blockKey[0]
- let high = blockKey[1]
-
- let r1 = low ^ 0x4163
- let r2 = high ^ 0x4344
-
- return [
- UInt8(truncatingIfNeeded: r1),
- UInt8(truncatingIfNeeded: r1 >> 8),
- UInt8(truncatingIfNeeded: r2),
- UInt8(truncatingIfNeeded: r2 >> 8)
- ]
- }
-
- static func usefulFunction(id: [UInt8], x: UInt16, y: UInt16) -> [UInt8] {
- let blockKey = processCrypto(input: prepareVariables(id: id, x: x, y: y))
- let low = blockKey[0]
- let high = blockKey[1]
-
-
-
- let r1 = low ^ 0x4163
- let r2 = high ^ 0x4344
- return [
- UInt8(truncatingIfNeeded: r1),
- UInt8(truncatingIfNeeded: r1 >> 8),
- UInt8(truncatingIfNeeded: r2),
- UInt8(truncatingIfNeeded: r2 >> 8)
- ]
- }
-
- typealias LibreBLEResponse = (age: Int, trend: [Measurement], history: [Measurement], crcVerified: Bool)
-
- static func parseBLEData(_ data: Data) -> LibreBLEResponse {
- var measurementTrend: [Measurement] = []
- var measurementHistory: [Measurement] = []
- let age = Int(word(data[41], data[40]))
-// let crc = Int(word(data[43], data[42]))
-
- let bytes = [UInt8](data)
- let calculatedCrc = Crc.crc16(Array(bytes.dropLast(2)), seed: 0xffff)
- let enclosedCrc = (UInt16(bytes[42]) << 8) | UInt16(bytes[43])
-
-
-
- let delay = 2
- let ints = [0, 2, 4, 6, 7, 12, 15]
- var historyCount = 0
- for i in 0 ..< 10 {
- let rawSensorValue = Double(readBits(data, i * 4, 0, 0xe))
- if rawSensorValue == 0 {
- continue
- }
-
- let rawTemperature = readBits(data, i * 4, 0xe, 0xc) << 2
- var rawTemperatureAdjustment = readBits(data, i * 4, 0x1a, 0x5) << 2
-
- let negativeAdjustment = readBits(data, i * 4, 0x1f, 0x1)
- if negativeAdjustment != 0 {
- rawTemperatureAdjustment = -rawTemperatureAdjustment
- }
-
- var idValue = age
-
- if i < 7 {
- idValue -= ints[i]
- } else {
- historyCount += 1
- idValue = ((idValue - delay) / 15) * 15 - 15 * (i - 7)
- }
-
- let timeStamp = Date().addingTimeInterval(Double(-60 * i))
- let measurementFactory = Measurement(date: timeStamp, rawGlucose: Int(rawSensorValue), rawTemperature: rawTemperature, rawTemperatureAdjustment: rawTemperatureAdjustment, idValue: idValue)
-
- if i < 7 {
- measurementTrend.append(measurementFactory)
- } else {
- measurementHistory.append(measurementFactory)
- }
- }
-
- let trend = measurementTrend.sorted(by: { $0.idValue < $1.idValue })
- let history = measurementHistory.sorted(by: { $0.idValue < $1.idValue })
-
- return (age, trend, history, calculatedCrc == enclosedCrc)
- }
-}
-
-extension Libre2 {
- enum Example {
- static let sensorInfo: [UInt8] = [
- 157,
- 8,
- 48,
- 1,
- 115,
- 23
- ]
-
- static let sensorId: [UInt8] = [
- 157,
- 129,
- 194,
- 0,
- 0,
- 164,
- 7,
- 224
- ]
-
- static let buffer: [UInt8] = [
- 6,
- 154,
- 221,
- 121,
- 142,
- 154,
- 244,
- 186,
- 162,
- 85,
- 79,
- 49,
- 234,
- 224,
- 71,
- 58,
- 189,
- 121,
- 123,
- 39,
- 28,
- 162,
- 134,
- 248,
- 95,
- 4,
- 28,
- 203,
- 27,
- 82,
- 76,
- 119,
- 82,
- 98,
- 189,
- 183,
- 147,
- 151,
- 32,
- 13,
- 73,
- 158,
- 214,
- 167,
- 143,
- 2,
- 182,
- 22,
- 69,
- 188,
- 73,
- 219,
- 7,
- 159,
- 179,
- 169,
- 237,
- 79,
- 32,
- 189,
- 37,
- 211,
- 32,
- 166,
- 191,
- 150,
- 171,
- 60,
- 143,
- 143,
- 1,
- 105,
- 89,
- 197,
- 98,
- 250,
- 1,
- 201,
- 21,
- 56,
- 64,
- 191,
- 58,
- 17,
- 198,
- 108,
- 72,
- 106,
- 144,
- 253,
- 19,
- 111,
- 235,
- 187,
- 245,
- 208,
- 239,
- 60,
- 145,
- 1,
- 107,
- 94,
- 238,
- 199,
- 157,
- 93,
- 243,
- 5,
- 4,
- 154,
- 25,
- 129,
- 131,
- 75,
- 16,
- 240,
- 210,
- 118,
- 172,
- 14,
- 80,
- 49,
- 33,
- 11,
- 81,
- 11,
- 238,
- 220,
- 78,
- 85,
- 82,
- 245,
- 4,
- 63,
- 129,
- 254,
- 214,
- 233,
- 225,
- 147,
- 58,
- 153,
- 20,
- 247,
- 10,
- 38,
- 149,
- 35,
- 14,
- 59,
- 168,
- 224,
- 162,
- 141,
- 9,
- 72,
- 201,
- 90,
- 56,
- 131,
- 150,
- 89,
- 126,
- 2,
- 96,
- 38,
- 140,
- 78,
- 151,
- 196,
- 57,
- 55,
- 37,
- 20,
- 249,
- 199,
- 168,
- 59,
- 41,
- 217,
- 240,
- 67,
- 199,
- 93,
- 164,
- 121,
- 206,
- 100,
- 214,
- 126,
- 40,
- 231,
- 68,
- 4,
- 76,
- 202,
- 131,
- 154,
- 98,
- 80,
- 227,
- 237,
- 144,
- 53,
- 125,
- 133,
- 14,
- 174,
- 196,
- 90,
- 78,
- 238,
- 163,
- 199,
- 249,
- 74,
- 75,
- 56,
- 127,
- 61,
- 98,
- 180,
- 153,
- 51,
- 85,
- 68,
- 234,
- 204,
- 117,
- 158,
- 245,
- 185,
- 40,
- 186,
- 227,
- 50,
- 105,
- 231,
- 155,
- 160,
- 66,
- 178,
- 124,
- 162,
- 70,
- 119,
- 102,
- 161,
- 234,
- 105,
- 252,
- 200,
- 195,
- 202,
- 246,
- 18,
- 71,
- 189,
- 150,
- 123,
- 105,
- 106,
- 105,
- 223,
- 116,
- 160,
- 142,
- 101,
- 28,
- 151,
- 42,
- 204,
- 49,
- 44,
- 111,
- 245,
- 161,
- 66,
- 178,
- 26,
- 99,
- 110,
- 136,
- 140,
- 135,
- 167,
- 171,
- 160,
- 221,
- 115,
- 9,
- 230,
- 105,
- 66,
- 20,
- 195,
- 172,
- 206,
- 215,
- 226,
- 107,
- 250,
- 224,
- 241,
- 6,
- 219,
- 139,
- 251,
- 189,
- 106,
- 161,
- 124,
- 98,
- 78,
- 186,
- 236,
- 200,
- 55,
- 21,
- 68,
- 171,
- 57,
- 8,
- 27,
- 221,
- 118,
- 206,
- 94,
- 226,
- 155,
- 82,
- 143,
- 44,
- 186,
- 173,
- 86,
- 248,
- 222,
- 158,
- 97,
- 241,
- 156,
- 253,
- 254
- ]
- }
-
- enum Example2 {
- static let sensorInfo: [UInt8] = [0x9D, 0x08, 0x30, 0x01, 0x76, 0x25]
-
- static let sensorId: [UInt8] = [0xDF, 0x20, 0xBE, 0x00, 0x00, 0xA4, 0x07, 0xE0]
-
- static let buffer: [UInt8] = [
- 0x52, 0x0B, 0xF3, 0x44, 0xDC, 0xA0, 0x43, 0x21,
- 0xCC, 0x7D, 0xD7, 0x4E, 0x29, 0xE2, 0x82, 0xE3,
- 0xE7, 0x04, 0xC9, 0xCF, 0x6C, 0x57, 0x2C, 0x7D,
- 0xA8, 0x82, 0x10, 0xAA, 0xD7, 0x32, 0x19, 0xB3,
- 0xC7, 0x9F, 0x39, 0x5F, 0xE3, 0x7A, 0x45, 0x08,
- 0xB7, 0x09, 0xBC, 0x6E, 0xFA, 0xDA, 0x34, 0x07,
- 0xB4, 0x65, 0x68, 0x60, 0x7E, 0xA5, 0x04, 0xE6,
- 0x65, 0x65, 0x48, 0x13, 0xF8, 0x9C, 0xA7, 0xC8,
- 0x70, 0xA7, 0x4D, 0x9D, 0x52, 0x35, 0x86, 0xF2,
- 0x02, 0xCC, 0x9B, 0x9B, 0x74, 0x32, 0xFF, 0xC5,
- 0xBF, 0xE9, 0x78, 0x1F, 0x46, 0xC2, 0xC7, 0x0B,
- 0x0F, 0xB0, 0xC8, 0x54, 0x23, 0xE2, 0x0D, 0x44,
- 0x97, 0x44, 0x36, 0x8F, 0xAC, 0x12, 0xAE, 0x4A,
- 0x6C, 0xE1, 0x37, 0xE2, 0x46, 0x2B, 0x5C, 0x74,
- 0x1B, 0x7A, 0xFE, 0x67, 0x4F, 0xCC, 0xDD, 0x95,
- 0x17, 0x73, 0xB3, 0x25, 0xE9, 0xAB, 0xA6, 0x5E,
- 0x70, 0xE4, 0x6C, 0xCE, 0x56, 0x8D, 0xB9, 0xE5,
- 0xFE, 0xAA, 0x50, 0x36, 0x52, 0xD2, 0xC5, 0x22,
- 0x24, 0x39, 0xD8, 0x63, 0x08, 0x62, 0x04, 0xAD,
- 0xFA, 0x89, 0x00, 0x10, 0x72, 0xCF, 0xA9, 0xF3,
- 0x47, 0x4B, 0xF5, 0x70, 0x96, 0xF2, 0x8A, 0xCA,
- 0xFF, 0xEF, 0xA3, 0x9E, 0x1A, 0xEC, 0x9F, 0x4A,
- 0x2F, 0xE8, 0xA9, 0xCA, 0xE6, 0xC8, 0x74, 0x46,
- 0x98, 0xB2, 0xA2, 0x9E, 0x8D, 0xF0, 0xAF, 0x09,
- 0xC1, 0x5B, 0x52, 0x59, 0x7E, 0x00, 0xD3, 0x3F,
- 0x59, 0x41, 0x7B, 0x33, 0xEE, 0xDB, 0x40, 0x51,
- 0xB2, 0x3D, 0x94, 0x82, 0xF3, 0xB2, 0xE4, 0xCA,
- 0xAD, 0x3C, 0xD8, 0xC0, 0xD7, 0xD7, 0x4C, 0x51,
- 0xCA, 0xA3, 0xAD, 0x26, 0x24, 0xAB, 0x10, 0xBA,
- 0x61, 0x35, 0xE1, 0x7F, 0x3D, 0x3F, 0xEC, 0xB4,
- 0xCF, 0xE3, 0xA2, 0x31, 0x6A, 0xE7, 0xD7, 0x36,
- 0x18, 0x21, 0x5B, 0x43, 0x5A, 0x9C, 0x75, 0x7C,
- 0x89, 0xE2, 0x49, 0x6C, 0xB1, 0x71, 0x6A, 0x47,
- 0x6E, 0x8A, 0xE5, 0xB2, 0xC5, 0x37, 0xE9, 0xE5,
- 0xDD, 0xB3, 0x12, 0x37, 0x95, 0x7A, 0xD0, 0x1F,
- 0x73, 0xEB, 0xB8, 0x15, 0xF1, 0xE6, 0x5D, 0x51,
- 0xFB, 0x16, 0x88, 0xA6, 0x9C, 0x17, 0xB0, 0x40,
- 0x0E, 0xBB, 0xD7, 0xCA, 0x9D, 0xCD, 0x8B, 0x60,
- 0x88, 0x88, 0x54, 0xFC, 0x65, 0x71, 0x43, 0xE7,
- 0x51, 0xE2, 0x18, 0xEA, 0x63, 0x1D, 0x5B, 0xAA,
- 0xD1, 0xD3, 0xD7, 0x08, 0xB7, 0xED, 0x87, 0xC4,
- 0xB4, 0x24, 0x31, 0xE7, 0xA0, 0xE6, 0x59, 0x51,
- 0x93, 0xFD, 0xA3, 0xE6, 0xBF, 0xE1, 0xF2, 0x09
- ]
- }
-
- enum BLEExample {
- static let sensorId: [UInt8] = [0x2f, 0xe7, 0xb1, 0x00, 0x00, 0xa4, 0x07, 0xe0]
- static let data: [UInt8] = [
- 0xb1,
- 0x94,
- 0xfa,
- 0xed,
- 0x2c,
- 0xde,
- 0xa1,
- 0x69,
- 0x46,
- 0x57,
- 0xcf,
- 0xd0,
- 0xd8,
- 0x5a,
- 0xaa,
- 0xf1,
- 0xe2,
- 0x89,
- 0x1c,
- 0xe9,
- 0xac,
- 0x82,
- 0x16,
- 0xfb,
- 0x67,
- 0xa1,
- 0xd3,
- 0xb6,
- 0x3f,
- 0x91,
- 0xcd,
- 0x18,
- 0x4b,
- 0x95,
- 0x31,
- 0x6c,
- 0x04,
- 0x5f,
- 0xe1,
- 0x96,
- 0xc4,
- 0xfd,
- 0x14,
- 0xfc,
- 0x68,
- 0xe0
- ]
- }
-}
-
-
-
-
-fileprivate func crc16(_ data: Data) -> UInt16 {
- let crc16table: [UInt16] = [0, 4489, 8978, 12955, 17956, 22445, 25910, 29887, 35912, 40385, 44890, 48851, 51820, 56293, 59774, 63735, 4225, 264, 13203, 8730, 22181, 18220, 30135, 25662, 40137, 36160, 49115, 44626, 56045, 52068, 63999, 59510, 8450, 12427, 528, 5017, 26406, 30383, 17460, 21949, 44362, 48323, 36440, 40913, 60270, 64231, 51324, 55797, 12675, 8202, 4753, 792, 30631, 26158, 21685, 17724, 48587, 44098, 40665, 36688, 64495, 60006, 55549, 51572, 16900, 21389, 24854, 28831, 1056, 5545, 10034, 14011, 52812, 57285, 60766, 64727, 34920, 39393, 43898, 47859, 21125, 17164, 29079, 24606, 5281, 1320, 14259, 9786, 57037, 53060, 64991, 60502, 39145, 35168, 48123, 43634, 25350, 29327, 16404, 20893, 9506, 13483, 1584, 6073, 61262, 65223, 52316, 56789, 43370, 47331, 35448, 39921, 29575, 25102, 20629, 16668, 13731, 9258, 5809, 1848, 65487, 60998, 56541, 52564, 47595, 43106, 39673, 35696, 33800, 38273, 42778, 46739, 49708, 54181, 57662, 61623, 2112, 6601, 11090, 15067, 20068, 24557, 28022, 31999, 38025, 34048, 47003, 42514, 53933, 49956, 61887, 57398, 6337, 2376, 15315, 10842, 24293, 20332, 32247, 27774, 42250, 46211, 34328, 38801, 58158, 62119, 49212, 53685, 10562, 14539, 2640, 7129, 28518, 32495, 19572, 24061, 46475, 41986, 38553, 34576, 62383, 57894, 53437, 49460, 14787, 10314, 6865, 2904, 32743, 28270, 23797, 19836, 50700, 55173, 58654, 62615, 32808, 37281, 41786, 45747, 19012, 23501, 26966, 30943, 3168, 7657, 12146, 16123, 54925, 50948, 62879, 58390, 37033, 33056, 46011, 41522, 23237, 19276, 31191, 26718, 7393, 3432, 16371, 11898, 59150, 63111, 50204, 54677, 41258, 45219, 33336, 37809, 27462, 31439, 18516, 23005, 11618, 15595, 3696, 8185, 63375, 58886, 54429, 50452, 45483, 40994, 37561, 33584, 31687, 27214, 22741, 18780, 15843, 11370, 7921, 3960]
- var crc = data.reduce(UInt16(0xFFFF)) { ($0 >> 8) ^ crc16table[Int(($0 ^ UInt16($1)) & 0xFF)] }
- var reverseCrc = UInt16(0)
- for _ in 0 ..< 16 {
- reverseCrc = reverseCrc << 1 | crc & 1
- crc >>= 1
- }
- return reverseCrc.byteSwapped
-}
-
-fileprivate func word(_ high: UInt8, _ low: UInt8) -> UInt64 {
- return (UInt64(high) << 8) + UInt64(low & 0xff)
-}
-
-fileprivate func readBits(_ buffer: Data, _ byteOffset: Int, _ bitOffset: Int, _ bitCount: Int) -> Int {
- guard bitCount != 0 else {
- return 0
- }
- var res = 0
- for i in 0 ..< bitCount {
- let totalBitOffset = byteOffset * 8 + bitOffset + i
- let byte = Int(floor(Float(totalBitOffset) / 8))
- let bit = totalBitOffset % 8
- if totalBitOffset >= 0 && ((Int(buffer[byte]) >> bit) & 0x1) == 1 {
- res = res | (1 << i)
- }
- }
- return res
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/Sensor.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/Sensor.swift
deleted file mode 100644
index 83d39595c..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/Sensor.swift
+++ /dev/null
@@ -1,179 +0,0 @@
-import Foundation
-
-public extension UserDefaults {
- private enum Key: String {
- case sensor = "no.bjorninge.libre2sensor"
- case calibrationMapping = "no.bjorninge.libre2sensor-calibrationmapping"
-
-
- }
-
- var preSelectedSensor: Sensor? {
- get {
-
- if let sensor = object(forKey: Key.sensor.rawValue) as? Data {
- let decoder = JSONDecoder()
- return try? decoder.decode(Sensor.self, from: sensor)
- }
-
- return nil
-
- }
- set {
- if let newValue = newValue {
- let encoder = JSONEncoder()
- if let encoded = try? encoder.encode(newValue) {
- set(encoded, forKey: Key.sensor.rawValue)
- }
- } else {
- removeObject(forKey: Key.sensor.rawValue)
- }
- }
- }
-
- var calibrationMapping : CalibrationToSensorMapping? {
- get {
- if let sensor = object(forKey: Key.calibrationMapping.rawValue) as? Data {
- let decoder = JSONDecoder()
- return try? decoder.decode(CalibrationToSensorMapping.self, from: sensor)
- }
-
- return nil
-
- }
- set {
- if let newValue = newValue {
- let encoder = JSONEncoder()
- if let encoded = try? encoder.encode(newValue) {
- set(encoded, forKey: Key.calibrationMapping.rawValue)
- }
- } else {
- removeObject(forKey: Key.calibrationMapping.rawValue)
- }
- }
- }
-}
-
-public struct CalibrationToSensorMapping: Codable {
- public let uuid: Data
- public let reverseFooterCRC: Int
-
- public init(uuid: Data, reverseFooterCRC: Int) {
- self.uuid = uuid
- self.reverseFooterCRC = reverseFooterCRC
- }
-}
-
-
-public struct Sensor: Codable {
- public let uuid: Data
- public let patchInfo: Data
- // public let calibrationInfo: SensorData.CalibrationInfo
-
- //public let family: SensorFamily
- //public let type: SensorType
- //public let region: SensorRegion
- //public let serial: String?
- //public var state: SensorState
- public var age: Int? = nil
- public var maxAge: Int
- // public var lifetime: Int
-
- public var unlockCount: Int
-
- /*
- public var unlockCount: Int {
- get {
- return UserDefaults.standard.integer(forKey: Key.sensorUnlockCount.rawValue)
- }
- set {
- UserDefaults.standard.setValue(newValue, forKey: Key.sensorUnlockCount.rawValue)
- }
- }*/
-
- /*
- public var elapsedLifetime: Int? {
- get {
- if let remainingLifetime = remainingLifetime {
- return max(0, lifetime - remainingLifetime)
- }
-
- return nil
- }
- }
-
- public var remainingLifetime: Int? {
- get {
- if let age = age {
- return max(0, lifetime - age)
- }
-
- return nil
- }
- } */
-
- public init(uuid: Data, patchInfo: Data, maxAge:Int, unlockCount: Int = 0) {
- self.uuid = uuid
- self.patchInfo = patchInfo
-
- //self.family = SensorFamily(patchInfo: patchInfo)
- //self.type = SensorType(patchInfo: patchInfo)
- //self.region = SensorRegion(patchInfo: patchInfo)
- //self.serial = sensorSerialNumber(sensorUID: self.uuid, sensorFamily: self.family)
- //self.state = SensorState(fram: fram)
- //self.lifetime = Int(fram[327]) << 8 + Int(fram[326])
- self.unlockCount = 0
- self.maxAge = maxAge
- //self.calibrationInfo = calibrationInfo
- }
-
- public var description: String {
- return [
- "uuid: (\(uuid.hex))",
- "patchInfo: (\(patchInfo.hex))",
- //"calibrationInfo: (\(calibrationInfo.description))",
- //"family: \(family.description)",
- //"type: \(type.description)",
- //"region: \(region.description)",
- //"serial: \(serial ?? "Unknown")",
- //"state: \(state.description)",
- //"lifetime: \(lifetime.inTime)",
- ].joined(separator: ", ")
- }
-}
-
-fileprivate enum Key: String, CaseIterable {
- case sensorUnlockCount = "libre-direct.settings.sensor.unlockCount"
-}
-
-/*
-fileprivate func sensorSerialNumber(sensorUID: Data, sensorFamily: SensorFamily) -> String? {
- let lookupTable = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "T", "U", "V", "W", "X", "Y", "Z"]
-
- guard sensorUID.count == 8 else {
- return nil
- }
-
- let bytes = Array(sensorUID.reversed().suffix(6))
- var fiveBitsArray = [UInt8]()
- fiveBitsArray.append(bytes[0] >> 3)
- fiveBitsArray.append(bytes[0] << 2 + bytes[1] >> 6)
-
- fiveBitsArray.append(bytes[1] >> 1)
- fiveBitsArray.append(bytes[1] << 4 + bytes[2] >> 4)
-
- fiveBitsArray.append(bytes[2] << 1 + bytes[3] >> 7)
-
- fiveBitsArray.append(bytes[3] >> 2)
- fiveBitsArray.append(bytes[3] << 3 + bytes[4] >> 5)
-
- fiveBitsArray.append(bytes[4])
-
- fiveBitsArray.append(bytes[5] >> 3)
- fiveBitsArray.append(bytes[5] << 2)
-
- return fiveBitsArray.reduce("\(sensorFamily.rawValue)", {
- $0 + lookupTable[Int(0x1F & $1)]
- })
-}
- */
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorData.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorData.swift
deleted file mode 100644
index d2d499e01..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorData.swift
+++ /dev/null
@@ -1,473 +0,0 @@
-//
-// SensorData
-// LibreMonitor
-//
-// Created by Uwe Petersen on 26.07.16.
-// Copyright © 2016 Uwe Petersen. All rights reserved.
-//
-
-import Foundation
-
-/// Structure for data from Freestyle Libre sensor
-/// To be initialized with the bytes as read via nfc. Provides all derived data.
-public struct SensorData: Codable {
- /// Parameters for the temperature compensation algorithm
- //let temperatureAlgorithmParameterSet: TemperatureAlgorithmParameters?
-
- private var headerRange = 0..<24 // 24 bytes, i.e. 3 blocks a 8 bytes
- private var bodyRange = 24..<320 // 296 bytes, i.e. 37 blocks a 8 bytes
- private var footerRange = 320..<344 // 24 bytes, i.e. 3 blocks a 8 bytes
-
- /// The uid of the sensor
- let uuid: Data
- /// The serial number of the sensor
- let serialNumber: String
- /// Number of bytes of sensor data to be used (read only), i.e. 344 bytes (24 for header, 296 for body and 24 for footer)
- private var numberOfBytes = 344 // Header and body and footer of Freestyle Libre data (i.e. 40 blocks of 8 bytes)
- /// Array of 344 bytes as read via nfc
- var bytes: [UInt8]
- /// Subarray of 24 header bytes
- var header: [UInt8] {
- Array(bytes[headerRange])
- }
- /// Subarray of 296 body bytes
- var body: [UInt8] {
- Array(bytes[bodyRange])
- }
- /// Subarray of 24 footer bytes
- var footer: [UInt8] {
- Array(bytes[footerRange])
- }
- /// Date when data was read from sensor
- let date: Date
- /// Minutes (approx) since start of sensor
- var minutesSinceStart: Int {
- Int(body[293]) << 8 + Int(body[292])
- }
- /// Maximum time in Minutes he sensor can be worn before it expires
- public var maxMinutesWearTime: Int {
- Int(footer[7]) << 8 + Int(footer[6])
- }
- /// Index on the next block of trend data that the sensor will measure and store
- var nextTrendBlock: Int {
- Int(body[2])
- }
- /// Index on the next block of history data that the sensor will create from trend data and store
- var nextHistoryBlock: Int {
- Int(body[3])
- }
- /// true if all crc's are valid
- var hasValidCRCs: Bool {
- hasValidHeaderCRC && hasValidBodyCRC && hasValidFooterCRC
- }
- /// true if the header crc, stored in the first two header bytes, is equal to the calculated crc
- var hasValidHeaderCRC: Bool {
- Crc.hasValidCrc16InFirstTwoBytes(header)
- }
- /// true if the body crc, stored in the first two body bytes, is equal to the calculated crc
- var hasValidBodyCRC: Bool {
- Crc.hasValidCrc16InFirstTwoBytes(body)
- }
- /// true if the footer crc, stored in the first two footer bytes, is equal to the calculated crc
- var hasValidFooterCRC: Bool {
- Crc.hasValidCrc16InFirstTwoBytes(footer)
- }
- /// Footer crc needed for checking integrity of SwiftLibreOOPWeb response
- var footerCrc: UInt16 {
- Crc.crc16(Array(footer.dropFirst(2)), seed: 0xffff)
- }
-
- // the amount of minutes left before this sensor expires
- var minutesLeft: Int {
- maxMinutesWearTime - minutesSinceStart
- }
-
- //once the sensor has ended we don't know the exact date anymore
- var sensorEndTime: Date? {
- if minutesLeft <= 0 {
- return nil
- }
-
- return self.date.addingTimeInterval(TimeInterval(minutes: Double(self.minutesLeft)))
- }
-
- var sensorStartTime: Date? {
- self.date.addingTimeInterval(-1*TimeInterval(minutes: Double(self.minutesSinceStart)))
- }
-
- /// Sensor state (ready, failure, starting etc.)
- var state: SensorState {
- SensorState(stateByte: header[4])
- }
-
- //all libre1 and 2 sensors will pass this, once decrypted
- var isLikelyLibre1FRAM: Bool {
- if bytes.count > 23 {
- let subset = bytes[9...23]
- return !subset.contains(where: { $0 > 0 })
- }
- return false
- }
-
- var reverseFooterCRC: UInt16? {
- let b0 = UInt16(self.footer[1])
- let b1 = UInt16(self.footer[0])
- return (b0 << 8) | UInt16(b1)
- }
-
- mutating func decrypt(patchInfo: String, uid: [UInt8]) {
- guard let info = patchInfo.hexadecimal(), let sensorType = SensorType(patchInfo: patchInfo) else {
- return
- }
-
- //var decrypted2 = Libre2.decryptFRAM(sensorId: uid, sensorInfo: [UInt8](info), FRAMData: self.bytes)
-
- do {
- self.bytes = try Libre2.decryptFRAM(type: sensorType, id: uid, info: [UInt8](info), data: self.bytes)
- } catch {
- return
- }
- }
-
- enum CalibrationInfoCodingKeys: CodingKey {
- case i1
- case i2
- case i3
- case i4
- case i5
- case i6
- case isValidForFooterWithReverseCRCs
-
- }
-
- public class CalibrationInfo: Codable, CustomStringConvertible, ObservableObject {
- public required init(from decoder: Decoder) throws {
- let container = try decoder.container(keyedBy: CalibrationInfoCodingKeys.self)
- i1 = try container.decode(Int.self, forKey: .i1)
- i2 = try container.decode(Int.self, forKey: .i2)
- i3 = try container.decode(Double.self, forKey: .i3)
- i4 = try container.decode(Double.self, forKey: .i4)
- i5 = try container.decode(Double.self, forKey: .i5)
- i6 = try container.decode(Double.self, forKey: .i6)
- isValidForFooterWithReverseCRCs = try container.decode(Int.self, forKey: .isValidForFooterWithReverseCRCs)
- }
-
- public func encode(to encoder: Encoder) throws {
- var container = encoder.container(keyedBy: CalibrationInfoCodingKeys.self)
- try container.encode(i1, forKey: .i1)
- try container.encode(i2, forKey: .i2)
- try container.encode(i3, forKey: .i3)
- try container.encode(i4, forKey: .i4)
- try container.encode(i5, forKey: .i5)
- try container.encode(i6, forKey: .i6)
- try container.encode(isValidForFooterWithReverseCRCs, forKey: .isValidForFooterWithReverseCRCs)
- }
- public init(i1: Int, i2: Int, i3: Double, i4: Double, i5: Double, i6: Double, isValidForFooterWithReverseCRCs: Int) {
- self.i1 = i1
- self.i2 = i2
- self.i3 = i3
- self.i4 = i4
- self.i5 = i5
- self.i6 = i6
- self.isValidForFooterWithReverseCRCs = isValidForFooterWithReverseCRCs
- }
-
- @Published public var i1: Int
- @Published public var i2: Int
- @Published public var i3: Double
- @Published public var i4: Double
- @Published public var i5: Double
- @Published public var i6: Double
-
- @Published public var isValidForFooterWithReverseCRCs: Int
-
- public var description: String {
- "CalibrationInfo(i1: \(i1), i2: \(i2), i3: \(i3), i4: \(i4), isValidForFooterWithReverseCRCs: \(isValidForFooterWithReverseCRCs), i5: \(i5)), i6: \(i6))"
- }
- }
-
- //static func readBits(_ buffer: [UInt8], _ byteOffset: Int, _ bitOffset: Int, _ bitCount: Int) -> Int {
-
- public var calibrationData: CalibrationInfo {
- let data = self.bytes
- let i1 = Self.readBits(data, 2, 0, 3)
- let i2 = Self.readBits(data, 2, 3, 0xa)
- let i3 = Double(Self.readBits(data, 0x150, 0, 8))
- let i4 = Double(Self.readBits(data, 0x150, 8, 0xe))
- let negativei3 = Self.readBits(data, 0x150, 0x21, 1) != 0
- let i5 = Double(Self.readBits(data, 0x150, 0x28, 0xc) << 2)
- let i6 = Double(Self.readBits(data, 0x150, 0x34, 0xc) << 2)
-
- return CalibrationInfo(i1: i1, i2: i2, i3: negativei3 ? -i3 : i3, i4: i4, i5: i5, i6: i6, isValidForFooterWithReverseCRCs: Int(self.footerCrc.byteSwapped))
- }
-
- fileprivate var aday = 86_400.0 //in seconds
-
- var humanReadableSensorAge: String {
- let days = TimeInterval(minutesSinceStart * 60) / aday
- return String(format: "%.2f", days) + NSLocalizedString(" day(s)", comment: "Sensor day(s)")
- }
-
- var humanReadableTimeLeft: String {
- let days = TimeInterval(minutesLeft * 60) / aday
- return String(format: "%.2f", days) + NSLocalizedString(" day(s)", comment: "Sensor day(s)")
- }
-
- var toJson: String {
- "[" + self.bytes.map { String(format: "0x%02x", $0) }.joined(separator: ", ") + "]"
- }
- var toEcmaStatement: String {
- "var someFRAM=" + self.toJson + ";"
- }
-
- public init?(bytes: [UInt8], date: Date = Date()) {
- self.init(uuid: Data(), bytes: bytes, date: date)
- }
- public init?(uuid: Data, bytes: [UInt8], date: Date = Date()) {
- guard bytes.count == numberOfBytes else {
- return nil
- }
- self.bytes = bytes
- // we don't actually know when this reading was done, only that
- // it was produced within the last minute
- self.date = date.rounded(on: 1, .minute)
-
- self.uuid = uuid
-
- self.serialNumber = SensorSerialNumber(withUID: uuid)?.serialNumber ?? "-"
-
- // we disable this check as we might be dealing with an encrypted libre2 sensor
- /*
-
- guard 0 <= nextTrendBlock && nextTrendBlock < 16 && 0 <= nextHistoryBlock && nextHistoryBlock < 32 else {
- return nil
- }
- */
- }
-
- /// Get array of 16 trend glucose measurements.
- /// Each array is sorted such that the most recent value is at index 0 and corresponds to the time when the sensor was read, i.e. self.date. The following measurements are each one more minute behind, i.e. -1 minute, -2 mintes, -3 minutes, ... -15 minutes.
- ///
- /// - parameter offset: offset in mg/dl that is added (NOT IN USE FOR DERIVEDALGO)
- /// - parameter slope: slope in (mg/dl)/ raw (NOT IN USE FOR DERIVEDALGO)
- ///
- /// - returns: Array of Measurements
- func trendMeasurements(_ offset: Double = 0.0, slope: Double = 0.1) -> [Measurement] {
- var measurements = [Measurement]()
- // Trend data is stored in body from byte 4 to byte 4+96=100 in units of 6 bytes. Index on data such that most recent block is first.
- for blockIndex in 0...15 {
- var index = 4 + (nextTrendBlock - 1 - blockIndex) * 6 // runs backwards
- if index < 4 {
- index += 96 // if end of ring buffer is reached shift to beginning of ring buffer
- }
- let range = index.. (date: Date, counter: Int) {
- // Calculate correct date for the most recent history value.
- // date.addingTimeInterval( 60.0 * -Double( (minutesSinceStart - 3) % 15 + 3 ) )
- let nextHistoryIndexCalculatedFromMinutesCounter = ( (minutesSinceStart - 3) / 15 ) % 32
- let delay = (minutesSinceStart - 3) % 15 + 3 // in minutes
- if nextHistoryIndexCalculatedFromMinutesCounter == nextHistoryBlock {
- // Case when history index is incremented togehter with minutesSinceStart (in sync)
- // print("delay: \(delay), minutesSinceStart: \(minutesSinceStart), result: \(minutesSinceStart-delay)")
- return (date: date.addingTimeInterval( 60.0 * -Double(delay) ), counter: minutesSinceStart - delay)
- } else {
- // Case when history index is incremented before minutesSinceStart (and they are async)
- // print("delay: \(delay), minutesSinceStart: \(minutesSinceStart), result: \(minutesSinceStart-delay-15)")
- return (date: date.addingTimeInterval( 60.0 * -Double(delay - 15)), counter: minutesSinceStart - delay)
- }
- }
-
- /// Get date of most recent history value.
- /// History values are updated every 15 minutes. Their corresponding time from start of the sensor in minutes is 15, 30, 45, 60, ..., but the value is delivered three minutes later, i.e. at the minutes 18, 33, 48, 63, ... and so on. So for instance if the current time in minutes (since start of sensor) is 67, the most recent value is 7 minutes old. This can be calculated from the minutes since start. Unfortunately sometimes the history index is incremented earlier than the minutes counter and they are not in sync. This has to be corrected.
- ///
- /// - Returns: the date of the most recent history value
- func dateOfMostRecentHistoryValue() -> Date {
- // Calculate correct date for the most recent history value.
- // date.addingTimeInterval( 60.0 * -Double( (minutesSinceStart - 3) % 15 + 3 ) )
- let nextHistoryIndexCalculatedFromMinutesCounter = ( (minutesSinceStart - 3) / 15 ) % 32
- let delay = (minutesSinceStart - 3) % 15 + 3 // in minutes
- if nextHistoryIndexCalculatedFromMinutesCounter == nextHistoryBlock {
- // Case when history index is incremented togehter with minutesSinceStart (in sync)
- // print("delay: \(delay), minutesSinceStart: \(minutesSinceStart), result: \(minutesSinceStart-delay)")
- return date.addingTimeInterval( 60.0 * -Double(delay) )
- } else {
- // Case when history index is incremented before minutesSinceStart (and they are async)
- // print("delay: \(delay), minutesSinceStart: \(minutesSinceStart), result: \(minutesSinceStart-delay-15)")
- return date.addingTimeInterval( 60.0 * -Double(delay - 15))
- }
- }
-
-// func currentTime() -> Int {
-//
-// let quotientBy16 = minutesSinceStart / 16
-// let nominalMinutesSinceStart = nextTrendBlock + quotientBy16 * 16
-// let correctedQuotientBy16 = minutesSinceStart <= nominalMinutesSinceStart ? quotientBy16 - 1 : quotientBy16
-// let currentTime = nextTrendBlock + correctedQuotientBy16 * 16
-//
-// let mostRecentHistoryCounter = (currentTime / 15) * 15
-//
-// print("currentTime: \(currentTime), mostRecentHistoryCounter: \(mostRecentHistoryCounter)")
-// return currentTime
-// }
-
- /// Get array of 32 history glucose measurements.
- /// Each array is sorted such that the most recent value is at index 0. This most recent value corresponds to -(minutesSinceStart - 3) % 15 + 3. The following measurements are each 15 more minutes behind, i.e. -15 minutes behind, -30 minutes, -45 minutes, ... .
- ///
- /// - parameter offset: offset in mg/dl that is added
- /// - parameter slope: slope in (mg/dl)/ raw
- ///
- /// - returns: Array of Measurements
- func historyMeasurements(_ offset: Double = 0.0, slope: Double = 0.1) -> [Measurement] {
- var measurements = [Measurement]()
- // History data is stored in body from byte 100 to byte 100+192-1=291 in units of 6 bytes. Index on data such that most recent block is first.
- for blockIndex in 0..<32 {
- var index = 100 + (nextHistoryBlock - 1 - blockIndex) * 6 // runs backwards
- if index < 100 {
- index += 192 // if end of ring buffer is reached shift to beginning of ring buffer
- }
-
- let range = index.. String {
- Data(bytes).base64EncodedString()
- }
-
- /// Returns a new array of 344 bytes of FRAM with correct crc for header, body and footer.
- ///
- /// Usefull, if some bytes are modified in order to investigate how the OOP algorithm handles this modification.
- /// - Returns: 344 bytes of FRAM with correct crcs
- func bytesWithCorrectCRC() -> [UInt8] {
- Crc.bytesWithCorrectCRC(header) + Crc.bytesWithCorrectCRC(body) + Crc.bytesWithCorrectCRC(footer)
- }
-
-
-
-
-}
-
-
-
-extension SensorData {
- /// Reads Libredata in bits converts and the result to int
- ///
- /// Makes it possible to read for example 7 bits from a 1 byte (8 bit) buffer.
- /// Can be used to read both FRAM and Libre2 Bluetooth buffer data . Buffer is expected to be unencrypted
- /// - Returns: bits from buffer
- static func readBits(_ buffer: [UInt8], _ byteOffset: Int, _ bitOffset: Int, _ bitCount: Int) -> Int {
- guard bitCount != 0 else {
- return 0
- }
- var res = 0
- for i in stride(from: 0, to: bitCount, by: 1) {
- let totalBitOffset = byteOffset * 8 + bitOffset + i
- let abyte = Int(floor(Float(totalBitOffset) / 8))
- let abit = totalBitOffset % 8
- if totalBitOffset >= 0 && ((buffer[abyte] >> abit) & 0x1) == 1 {
- res = res | (1 << i)
- }
- }
- return res
- }
-
- static func writeBits(_ buffer: [UInt8], _ byteOffset: Int, _ bitOffset: Int, _ bitCount: Int, _ value: Int) -> [UInt8] {
- var res = buffer; // Make a copy
- for i in stride(from: 0, to: bitCount, by: 1) {
- let totalBitOffset = byteOffset * 8 + bitOffset + i
- let byte = Int(floor(Double(totalBitOffset) / 8))
- let bit = totalBitOffset % 8
- let bitValue = (value >> i) & 0x1
- res[byte] = (res[byte] & ~(1 << bit) | (UInt8(bitValue) << bit))
- }
- return res
- }
-}
-
-public extension SensorData {
-
- private func average(_ input: [Double]) -> Double {
- return input.reduce(0, +) / Double(input.count)
- }
-
- private func multiply(_ a: [Double], _ b: [Double]) -> [Double] {
- return zip(a, b).map(*)
- }
- //https://github.com/raywenderlich/swift-algorithm-club/blob/master/Linear%20Regression/LinearRegression.playground/Contents.swift
- private func linearRegression(_ xs: [Double], _ ys: [Double]) -> (Double) -> Double {
- let sum1 = average(multiply(xs, ys)) - average(xs) * average(ys)
- let sum2 = average(multiply(xs, xs)) - pow(average(xs), 2)
- let slope = sum1 / sum2
- let intercept = average(ys) - slope * average(xs)
- return { x in intercept + slope * x }
- }
-
- /// Uses trend data to predict a measurement 10 minutes into the future
- ///
- /// This makes it possible to better align glucose data from the intertestual fluid with actual blood sugar values,
- /// Intertestual fluid lags about 10 to 15 minutes (for most people) behind blood sugar values measuretd by a finger stick
- ///
- /// - Returns: a predicted measurement 10 minutes into the future, or the most recent glucose value if such prediction is impossible. If no reading exists, this will return nil
- ///
-
- internal func predictBloodSugar(_ minutes: Double = 10) -> Measurement? {
-
- let trends = self.trendMeasurements()//.filter { !$0.error.contains(.SENSOR_SIGNAL_LOW)}
-
-
- guard trends.count > 15 else {
- return trends.first
- }
-
- guard let mostRecent = trends.first else {
- return nil
- }
-
- let sorted = trends.sorted{ $0.date < $1.date}
-
- //keep the recent raw temperatures, we don't want to apply linear regression to them
- let mostRecentTemperature = mostRecent.rawTemperature
- let mostRecentAdjustment = mostRecent.rawTemperatureAdjustment
- let mostRecentDate = mostRecent.date
- let futureDate = mostRecentDate.addingTimeInterval(60*minutes)
-
-
- let glucoseAge = sorted.compactMap { measurement in
- Double(measurement.date.timeIntervalSince1970)
- }
-
- let rawGlucoseValues = sorted.compactMap { measurement in
- Double(measurement.rawGlucose)
- }
-
- let glucosePrediction = linearRegression(glucoseAge, rawGlucoseValues)(futureDate.timeIntervalSince1970)
-
- let predicted = Measurement(date: futureDate,
- rawGlucose: Int(glucosePrediction.rounded()),
- rawTemperature: mostRecentTemperature,
- rawTemperatureAdjustment: mostRecentAdjustment)
- return predicted
-
-
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorSerialNumber.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorSerialNumber.swift
deleted file mode 100644
index 656a5cd81..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorSerialNumber.swift
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// FreestyleLibreSensor.swift
-// LibreMonitor
-//
-// Created by Uwe Petersen on 01.04.18.
-// Copyright © 2018 Uwe Petersen. All rights reserved.
-//
-
-import Foundation
-
-public struct SensorSerialNumber: CustomStringConvertible {
- let uid: Data
-
- fileprivate let lookupTable = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "T", "U", "V", "W", "X", "Y", "Z"]
-
- init?(withUID uid: Data) {
- guard uid.count == 8 else { return nil }
- self.uid = uid
- }
-
- // MARK: - computed properties
-
- var serialNumber: String {
- // The serial number of the sensor can be derived from its uid.
- //
- // The numbers an letters of the serial number are coded a compressed scheme that uses only 32 numbers and letters,
- // by omitting the letters B, I, O and S. This information is stored in consecutive units of five bits.
- //
- // The encoding thus is as follows:
- // index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
- // char: 0 1 2 3 4 5 6 7 8 9 A (B) C D E F G H (I) J K L M N (O) P Q R (S) T U V W X Y Z
- //
- // Example: 75 ce 86 00 00 a0 07 e0
- // Uid is E0 07 A0 00 00 25 90 5E, and the corresponding serial number is "0M00009DHCR"
- // \ / \ /
- // -+- -----+--------
- // | |
- // | +-- This part encodes the serial number, see below
- // +-- Standard first two bytes, where 0x07 is the code for "Texas Instruments Tag-it™", see https://en.wikipedia.org/wiki/ISO/IEC_15693
- //
- // 1.) Convert the part without E007, i.e. A0 00 00 25 90 5E to binary representation
- //
- // A 0 0 0 0 0 2 5 9 0 5 E
- // 1010 0000 0000 0000 0000 0000 0010 0101 1001 0000 0101 1110
- //
- // 2.) Split this binary array in units of five bits length from the beginning and pad with two zeros at the end and
- // calculate the corresponding integer and retreive the corresponding char from the table above
- //
- // Byte # 0 1 2 3 4 5
- // Bit # 8765 4321 8765 4321 8765 4321 8765 4321 8765 4321 8765 4321
- //
- // +-- 1010 0000 0000 0000 0000 0000 0010 0101 1001 0000 0101 1110 + 00
- // | \ /\ /\ /\ / \ /\ /\ /\ / \ /\ /
- // +-> 10100 00000 00000 00000 00000 01001 01100 10000 01011 11000
- // | | | | | | | | | |
- // | | | | | | | | | +- = 24 -> "R" (Byte 6) << 2 Mask 0x1F
- // | | | | | | | | +-------- = 11 -> "C" (Byte 5) >> 3 Mask 0x1F
- // | | | | | | | +--------------- = 16 -> "H" (Byte 4) Mask 0x1F
- // | | | | | | +---------------------- = 12 -> "D" (Byte 3) << 2 + (Byte 4) >> 5 Mask 0x1F
- // | | | | | +----------------------------- = 9 -> "9" (Byte 3) >> 2 Mask 0x1F
- // | | | | +------------------------------------ = 0 -> "0" (Byte 2) << 1 + (Byte 3) >> 7 Mask 0x1F
- // | | | +------------------------------------------- = 0 -> "0" (Byte 1) << 4 + (Byte 2) >> 4 Mask 0x1F
- // | | +-------------------------------------------------- = 0 -> "0" (Byte 1) >> 1 Mask 0x1F
- // | +--------------------------------------------------------- = 0 -> "0" (Byte 0) << 2 + (Byte 1) >> 6 Mask 0x1F
- // +---------------------------------------------------------------- = 20 -> "M" (byte 0) >> 3 Mask 0x1F
- //
- //
- // 3.) Prepend "0" at the beginning an thus receive "0M00009DHCR"
-
- guard uid.count == 8 else { return "invalid uid" }
-
- let bytes = Array(uid.reversed().suffix(6)) // 5E 90 25 00 00 A0 07 E0" -> E0 07 A0 00 00 25 90 5E -> A0 00 00 25 90 5E
-
- // A0 00 00 25 90 5E -> "M00009DHCR"
- var fiveBitsArray = [UInt8]() // Mask later with 0x1F to use only five bits
-
- fiveBitsArray.append( bytes[0] >> 3 )
- fiveBitsArray.append( bytes[0] << 2 + bytes[1] >> 6 )
- fiveBitsArray.append( bytes[1] >> 1 )
- fiveBitsArray.append( bytes[1] << 4 + bytes[2] >> 4 )
- fiveBitsArray.append( bytes[2] << 1 + bytes[3] >> 7 )
- fiveBitsArray.append( bytes[3] >> 2 )
- fiveBitsArray.append( bytes[3] << 3 + bytes[4] >> 5 )
- fiveBitsArray.append( bytes[4] )
- fiveBitsArray.append( bytes[5] >> 3 )
- fiveBitsArray.append( bytes[5] << 2 )
-
- let serialNumber = fiveBitsArray.reduce("0", { // prepend with "0" according to step 3.)
- $0 + lookupTable[ Int(0x1F & $1) ] // Mask with 0x1F to only take the five relevant bits
- })
- return serialNumber
- }
-
- var uidString: String {
- Data(self.uid).hexEncodedString()
- }
-
- var prettyUidString: String {
- let stringArray = self.uid.map({ String(format: "%02X", $0) })
- return stringArray.dropFirst().reduce(stringArray.first!, { $0 + ":" + $1 })
- }
-
- // MARK: - CustomStringConvertible Protocoll
- public var description: String {
- "Uid is \(prettyUidString) and derived serial number is \(serialNumber)"
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorState.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorState.swift
deleted file mode 100644
index 467c3b87d..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreSensor/SensorContents/SensorState.swift
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// SensorState.swift
-// LibreMonitor
-//
-// Created by Uwe Petersen on 31.07.16.
-// Copyright © 2016 Uwe Petersen. All rights reserved.
-//
-
-import Foundation
-
-/// State of the freestyle libre sensor
-///
-/// - notYetStarted: 0x01 sensor not yet started
-/// - starting: 0x02 sensor is in the starting phase
-/// - ready: 0x03 sensor is ready, i.e. in normal operation mode
-/// - stateFour: 0x04 state with yet unknown meaning
-/// - expired: 0x05 sensor is expired
-/// - failure: 0x06 sensor has an error
-/// - unknown: any other state
-enum SensorState {
- case notYetStarted
- case starting
- case ready
- case expired
- case shutdown
- case failure
- case unknown
-
- init() {
- self = .unknown
- }
- init(stateByte: UInt8) {
- switch stateByte {
- case 01:
- self = .notYetStarted
- case 02:
- self = .starting
- case 03:
- self = .ready
- case 04:
- self = .expired
- case 05:
- self = .shutdown
- case 06:
- self = .failure
- default:
- self = .unknown
- }
- }
-
- var description: String {
- switch self {
- case .notYetStarted:
- return "Sensor not yet startet"
- case .starting:
- return "Sensor in starting phase"
- case .ready:
- return "Sensor is ready"
- case .expired:
- return "Sensor is expired"
- case .shutdown:
- return "Sensor is shut down"
- case .failure:
- return "Sensor has failure"
- default:
- return "Unknown sensor state"
- }
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterManager.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterManager.swift
deleted file mode 100644
index 1c456b4b6..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterManager.swift
+++ /dev/null
@@ -1,868 +0,0 @@
-//
-// LibreTransmitterManager.swift
-// Created by Bjørn Inge Berg on 25/02/2019.
-// Copyright © 2019 Bjørn Inge Berg. All rights reserved.
-//
-import Foundation
-import UserNotifications
-import Combine
-import UIKit
-import CoreBluetooth
-import HealthKit
-import os.log
-
-public protocol LibreTransmitterManagerDelegate: AnyObject {
- var queue: DispatchQueue { get }
-
- func startDateToFilterNewData(for: LibreTransmitterManager) -> Date?
-
- func cgmManager(_:LibreTransmitterManager, hasNew result: Result<[LibreGlucose], Error>)
-
- func overcalibration(for: LibreTransmitterManager) -> ((Double) -> (Double))?
-}
-
-public final class LibreTransmitterManager: LibreTransmitterDelegate {
-
- public typealias GlucoseArrayWithPrediction = (glucose:[LibreGlucose], prediction:[LibreGlucose])
- public lazy var logger = Logger(forType: Self.self)
-
-
- public let isOnboarded = true // No distinction between created and onboarded
- public var hasValidSensorSession: Bool {
- lastConnected != nil
- }
-
- public var glucoseDisplay: GlucoseDisplayable?
- public var trend: GlucoseTrend?
-
-
- public func libreManagerDidRestoreState(found peripherals: [CBPeripheral], connected to: CBPeripheral?) {
- let devicename = to?.name ?? "no device"
- let id = to?.identifier.uuidString ?? "null"
- let msg = String(format: NSLocalizedString("Bluetooth State restored (APS restarted?). Found %d peripherals, and connected to %@ with identifier %@", comment: "Restored state message"), peripherals.count, devicename, id)
-
- NotificationHelper.sendRestoredStateNotification(msg: msg)
- }
-
- public var batteryLevel: Double? {
- let batt = self.proxy?.metadata?.battery
- logger.debug("dabear:: LibreTransmitterManager was asked to return battery: \(batt.debugDescription)")
- //convert from 8% -> 0.8
- if let battery = proxy?.metadata?.battery {
- return Double(battery) / 100
- }
-
- return nil
- }
-
-
-
- public var cgmManagerDelegate: LibreTransmitterManagerDelegate? {
- get {
- return delegate.delegate
- }
- set {
- delegate.delegate = newValue
- }
- }
-
- public var delegateQueue: DispatchQueue! {
- get {
- return delegate.queue
- }
- set {
- delegate.queue = newValue
- }
- }
-
- public let delegate = WeakSynchronizedDelegate()
-
- public var managedDataInterval: TimeInterval?
-
-
- private func getPersistedSensorDataForDebug() -> String {
- guard let data = UserDefaults.standard.queuedSensorData else {
- return "nil"
- }
-
- let c = self.calibrationData?.description ?? "no calibrationdata"
- return data.array.map {
- "SensorData(uuid: \"0123\".data(using: .ascii)!, bytes: \($0.bytes))!"
- }
- .joined(separator: ",\n")
- + ",\n Calibrationdata: \(c)"
- }
-
- public var debugDescription: String {
-
- return [
- "## LibreTransmitterManager",
- "Testdata: foo",
- "lastConnected: \(String(describing: lastConnected))",
- "Connection state: \(connectionState)",
- "Sensor state: \(sensorStateDescription)",
- "transmitterbattery: \(batteryString)",
- "SensorData: \(getPersistedSensorDataForDebug())",
- "Metainfo::\n\(AppMetaData.allProperties)",
- ""
- ].joined(separator: "\n")
- }
-
- public private(set) var lastConnected: Date?
-
- public private(set) var latestPrediction: LibreGlucose?
- public private(set) var latestBackfill: LibreGlucose? {
- willSet(newValue) {
- guard let newValue = newValue else {
- return
- }
-
- var trend: GlucoseTrend?
- let oldValue = latestBackfill
-
- logger.debug("dabear:: latestBackfill set, newvalue is \(newValue.description)")
-
- if let oldValue = oldValue {
- // the idea here is to use the diff between the old and the new glucose to calculate slope and direction, rather than using trend from the glucose value.
- // this is because the old and new glucose values represent earlier readouts, while the trend buffer contains somewhat more jumpy (noisy) values.
- let timediff = LibreGlucose.timeDifference(oldGlucose: oldValue, newGlucose: newValue)
- logger.debug("dabear:: timediff is \(timediff)")
- let oldIsRecentEnough = timediff <= TimeInterval.minutes(15)
-
- trend = oldIsRecentEnough ? newValue.GetGlucoseTrend(last: oldValue) : nil
-
- var batteries : [(name: String, percentage: Int)]?
- if let metaData = metaData, let battery = battery {
- batteries = [(name: metaData.name, percentage: battery)]
- }
-
- self.glucoseDisplay = ConcreteGlucoseDisplayable(isStateValid: newValue.isStateValid, trendType: trend, isLocal: true, batteries: batteries)
- } else {
- //could consider setting this to ConcreteSensorDisplayable with trendtype GlucoseTrend.flat, but that would be kinda lying
- self.glucoseDisplay = nil
- }
- }
-
- }
-
- static public var managerIdentifier : String {
- Self.className
- }
-
- static public let localizedTitle = LocalizedString("Libre Bluetooth", comment: "Title for the CGMManager option")
-
-
-
- public init() {
- lastConnected = nil
- //let isui = (self is CGMManagerUI)
- //self.miaomiaoService = MiaomiaoService(keychainManager: keychain)
- logger.debug("dabear: LibreTransmitterManager will be created now")
- //proxy = MiaoMiaoBluetoothManager()
- proxy?.delegate = self
- }
-
- public func disconnect() {
- logger.debug("dabear:: LibreTransmitterManager disconnect called")
-
- proxy?.disconnectManually()
- proxy?.delegate = nil
- }
-
- deinit {
- logger.debug("dabear:: LibreTransmitterManager deinit called")
- //cleanup any references to events to this class
- disconnect()
- }
-
- //lazy because we don't want to scan immediately
- private lazy var proxy: LibreTransmitterProxyManager? = LibreTransmitterProxyManager()
-
- /*
- These properties are mostly useful for swiftui
- */
- public var transmitterInfoObservable = TransmitterInfo()
- public var sensorInfoObservable = SensorInfo()
- public var glucoseInfoObservable = GlucoseInfo()
-
-
-
- var longDateFormatter : DateFormatter = ({
- let df = DateFormatter()
- df.dateStyle = .long
- df.timeStyle = .long
- df.doesRelativeDateFormatting = true
- return df
- })()
-
- var dateFormatter : DateFormatter = ({
- let df = DateFormatter()
- df.dateStyle = .long
- df.timeStyle = .full
- df.locale = Locale.current
- return df
- })()
-
-
- //when was the libre2 direct ble update last received?
- var lastDirectUpdate : Date? = nil
-
- private var countTimesWithoutData: Int = 0
-
-
-}
-
-
-// MARK: - Convenience functions
-extension LibreTransmitterManager {
- func setObservables(sensorData: SensorData?, bleData: Libre2.LibreBLEResponse?, metaData: LibreTransmitterMetadata?) {
- logger.debug("dabear:: setObservables called")
- DispatchQueue.main.async {
-
-
- if let metaData=metaData {
- self.logger.debug("dabear::will set transmitterInfoObservable")
- self.transmitterInfoObservable.battery = metaData.batteryString
- self.transmitterInfoObservable.hardware = metaData.hardware
- self.transmitterInfoObservable.firmware = metaData.firmware
- self.transmitterInfoObservable.sensorType = metaData.sensorType()?.description ?? "Unknown"
- self.transmitterInfoObservable.transmitterIdentifier = metaData.macAddress ?? UserDefaults.standard.preSelectedDevice ?? "Unknown"
-
-
- }
-
- self.transmitterInfoObservable.connectionState = self.proxy?.connectionStateString ?? "n/a"
- self.transmitterInfoObservable.transmitterType = self.proxy?.shortTransmitterName ?? "Unknown"
-
- if let sensorData = sensorData {
- self.logger.debug("dabear::will set sensorInfoObservable")
- self.sensorInfoObservable.sensorAge = sensorData.humanReadableSensorAge
- self.sensorInfoObservable.sensorAgeLeft = sensorData.humanReadableTimeLeft
-
- self.sensorInfoObservable.sensorState = sensorData.state.description
- self.sensorInfoObservable.sensorSerial = sensorData.serialNumber
-
- self.glucoseInfoObservable.checksum = String(sensorData.footerCrc.byteSwapped)
-
-
-
- if let sensorEndTime = sensorData.sensorEndTime {
- self.sensorInfoObservable.sensorEndTime = self.dateFormatter.string(from: sensorEndTime )
-
- } else {
- self.sensorInfoObservable.sensorEndTime = "Unknown or ended"
-
- }
-
- } else if let bleData = bleData, let sensor = UserDefaults.standard.preSelectedSensor {
- let aday = 86_400.0 //in seconds
- var humanReadableSensorAge: String {
- let days = TimeInterval(bleData.age * 60) / aday
- return String(format: "%.2f", days) + NSLocalizedString(" day(s)", comment: "Sensor day(s)")
- }
-
-
- var maxMinutesWearTime : Int{
- sensor.maxAge
- }
-
- var minutesLeft: Int {
- maxMinutesWearTime - bleData.age
- }
-
-
- var humanReadableTimeLeft: String {
- let days = TimeInterval(minutesLeft * 60) / aday
- return String(format: "%.2f", days) + NSLocalizedString(" day(s)", comment: "Sensor day(s)")
- }
-
- //once the sensor has ended we don't know the exact date anymore
- var sensorEndTime: Date? {
- if minutesLeft <= 0 {
- return nil
- }
-
- // we can assume that the libre2 direct bluetooth packet is received immediately
- // after the sensor has been done a new measurement, so using Date() should be fine here
- return Date().addingTimeInterval(TimeInterval(minutes: Double(minutesLeft)))
- }
-
- self.sensorInfoObservable.sensorAge = humanReadableSensorAge
- self.sensorInfoObservable.sensorAgeLeft = humanReadableTimeLeft
- self.sensorInfoObservable.sensorState = "Operational"
- self.sensorInfoObservable.sensorState = "Operational"
- self.sensorInfoObservable.sensorSerial = SensorSerialNumber(withUID: sensor.uuid)?.serialNumber ?? "-"
-
- if let mapping = UserDefaults.standard.calibrationMapping,
- let calibration = self.calibrationData ,
- mapping.uuid == sensor.uuid && calibration.isValidForFooterWithReverseCRCs == mapping.reverseFooterCRC {
- self.glucoseInfoObservable.checksum = "\(mapping.reverseFooterCRC)"
- }
-
- if let sensorEndTime = sensorEndTime {
- self.sensorInfoObservable.sensorEndTime = self.dateFormatter.string(from: sensorEndTime )
-
- } else {
- self.sensorInfoObservable.sensorEndTime = "Unknown or ended"
-
- }
-
- }
-
- let formatter = QuantityFormatter()
- let preferredUnit = UserDefaults.standard.mmGlucoseUnit ?? .millimolesPerLiter
-
-
- if let d = self.latestBackfill {
- self.logger.debug("dabear::will set glucoseInfoObservable")
-
- formatter.setPreferredNumberFormatter(for: .millimolesPerLiter)
- self.glucoseInfoObservable.glucoseMMOL = formatter.string(from: d.quantity, for: .millimolesPerLiter) ?? "-"
-
-
- formatter.setPreferredNumberFormatter(for: .milligramsPerDeciliter)
- self.glucoseInfoObservable.glucoseMGDL = formatter.string(from: d.quantity, for: .milligramsPerDeciliter) ?? "-"
-
- //backward compat
- if preferredUnit == .millimolesPerLiter {
- self.glucoseInfoObservable.glucose = self.glucoseInfoObservable.glucoseMMOL
- } else if preferredUnit == .milligramsPerDeciliter {
- self.glucoseInfoObservable.glucose = self.glucoseInfoObservable.glucoseMGDL
- }
-
-
-
- self.glucoseInfoObservable.date = self.longDateFormatter.string(from: d.timestamp)
- }
-
- if let d = self.latestPrediction {
- formatter.setPreferredNumberFormatter(for: .millimolesPerLiter)
- self.glucoseInfoObservable.predictionMMOL = formatter.string(from: d.quantity, for: .millimolesPerLiter) ?? "-"
-
-
- formatter.setPreferredNumberFormatter(for: .milligramsPerDeciliter)
- self.glucoseInfoObservable.predictionMGDL = formatter.string(from: d.quantity, for: .milligramsPerDeciliter) ?? "-"
- self.glucoseInfoObservable.predictionDate = self.longDateFormatter.string(from: d.timestamp)
-
-
- }
-
-
-
-
-
- }
-
-
- }
-
- func getStartDateForFilter() -> Date?{
- var startDate: Date?
-
- self.delegateQueue.sync {
- startDate = self.cgmManagerDelegate?.startDateToFilterNewData(for: self) ?? self.latestBackfill?.startDate
- }
-
- // add one second to startdate to make this an exclusive (non overlapping) match
- return startDate?.addingTimeInterval(1)
- }
-
- func glucosesToSamplesFilter(_ array: [LibreGlucose], startDate: Date?) -> [LibreGlucose] {
- array
- .filterDateRange(startDate, nil)
- .filter { $0.isStateValid }
- .compactMap { $0 }
- }
-
- public var calibrationData: SensorData.CalibrationInfo? {
- KeychainManagerWrapper.standard.getLibreNativeCalibrationData()
- }
-}
-
-
-// MARK: - Direct bluetooth updates
-extension LibreTransmitterManager {
-
- public func libreSensorDidUpdate(with bleData: Libre2.LibreBLEResponse, and device: LibreTransmitterMetadata) {
- self.logger.debug("dabear:: got sensordata: \(String(describing: bleData))")
- let typeDesc = device.sensorType().debugDescription
-
- let now = Date()
- //only once per mins minute
- let mins = 4.5
- if let earlierplus = lastDirectUpdate?.addingTimeInterval(mins * 60), earlierplus >= now {
- logger.debug("last ble update was less than \(mins) minutes ago, aborting loop update")
- return
- }
-
- logger.debug("Directly connected to libresensor of type \(typeDesc). Details: \(device.description)")
-
- guard let mapping = UserDefaults.standard.calibrationMapping,
- let calibrationData = calibrationData,
- let sensor = UserDefaults.standard.preSelectedSensor else {
- logger.error("calibrationdata, sensor uid or mapping missing, could not continue")
- self.delegateQueue.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .failure(LibreError.noCalibrationData))
- }
- return
- }
-
- guard mapping.reverseFooterCRC == calibrationData.isValidForFooterWithReverseCRCs &&
- mapping.uuid == sensor.uuid else {
- logger.error("Calibrationdata was not correct for these bluetooth packets. This is a fatal error, we cannot calibrate without re-pairing")
- self.delegateQueue.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .failure(LibreError.noCalibrationData))
- }
- return
- }
-
- guard bleData.crcVerified else {
- self.delegateQueue.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .failure(LibreError.checksumValidationError))
- }
-
- logger.debug("did not get bledata with valid crcs")
- return
- }
-
- if sensor.maxAge > 0 {
- let minutesLeft = Double(sensor.maxAge - bleData.age)
- NotificationHelper.sendSensorExpireAlertIfNeeded(minutesLeft: minutesLeft)
-
- }
-
- let sensorStartDate = Date().addingTimeInterval(-1 * TimeInterval(minutes: Double(bleData.age)))
- NSLog("Libre age \(bleData.age), Start Date calculated: \(sensorStartDate)")
-
-// let device = self.proxy?.device
-
-
-
- let sortedTrends = bleData.trend.sorted{ $0.date > $1.date}
-
- let glucose = LibreGlucose.fromTrendMeasurements(sortedTrends, nativeCalibrationData: calibrationData, returnAll: UserDefaults.standard.mmBackfillFromTrend, sensorStartDate: sensorStartDate)
- //glucose += LibreGlucose.fromHistoryMeasurements(bleData.history, nativeCalibrationData: calibrationData)
- // while libre2 fram scans contains historymeasurements for the last 8 hours,
- // history from bledata contains just a couple of data points, so we don't bother
- /*if UserDefaults.standard.mmBackfillFromHistory {
- let sortedHistory = bleData.history.sorted{ $0.date > $1.date}
- glucose += LibreGlucose.fromHistoryMeasurements(sortedHistory, nativeCalibrationData: calibrationData)
- }*/
-
- var newGlucose = glucosesToSamplesFilter(glucose, startDate: getStartDateForFilter())
-
- if newGlucose.isEmpty {
- self.countTimesWithoutData &+= 1
- } else {
- self.latestBackfill = glucose.max { $0.startDate < $1.startDate }
- self.logger.debug("dabear:: latestbackfill set to \(self.latestBackfill.debugDescription)")
- self.countTimesWithoutData = 0
- }
-
- //todo: predictions also for libre2 bluetooth data
- //self.latestPrediction = prediction?.first
- var predictions: [LibreGlucose] = []
-
- overcalibrate(entries: &newGlucose, prediction: &predictions)
-
- self.setObservables(sensorData: nil, bleData: bleData, metaData: device)
-
- self.logger.debug("dabear:: handleGoodReading returned with \(newGlucose.count) entries")
- self.delegateQueue.async {
- var result: Result<[LibreGlucose], Error>
- // If several readings from a valid and running sensor come out empty,
- // we have (with a large degree of confidence) a sensor that has been
- // ripped off the body
- if self.countTimesWithoutData > 1 {
- result = .failure(LibreError.noValidSensorData)
- } else {
- result = .success(newGlucose)
- }
- self.cgmManagerDelegate?.cgmManager(self, hasNew: result)
- }
-
- lastDirectUpdate = Date()
-
- }
-}
-
-// MARK: - Bluetooth transmitter data
-extension LibreTransmitterManager {
-
- public func noLibreTransmitterSelected() {
- NotificationHelper.sendNoTransmitterSelectedNotification()
- }
-
- public func libreTransmitterDidUpdate(with sensorData: SensorData, and device: LibreTransmitterMetadata) {
-
- self.logger.debug("dabear:: got sensordata: \(String(describing: sensorData)), bytescount: \( sensorData.bytes.count), bytes: \(sensorData.bytes)")
- var sensorData = sensorData
-
- NotificationHelper.sendLowBatteryNotificationIfNeeded(device: device)
- self.setObservables(sensorData: sensorData, bleData: nil, metaData: device)
-
- if !sensorData.isLikelyLibre1FRAM {
- if let patchInfo = device.patchInfo, let sensorType = SensorType(patchInfo: patchInfo) {
- let needsDecryption = [SensorType.libre2, .libreUS14day].contains(sensorType)
- if needsDecryption, let uid = device.uid {
- sensorData.decrypt(patchInfo: patchInfo, uid: uid)
- }
- } else {
- logger.debug("Sensor type was incorrect, and no decryption of sensor was possible")
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .failure(LibreError.encryptedSensor))
- return
- }
- }
-
- let typeDesc = device.sensorType().debugDescription
-
- logger.debug("Transmitter connected to libresensor of type \(typeDesc). Details: \(device.description)")
-
- tryPersistSensorData(with: sensorData)
-
- NotificationHelper.sendInvalidSensorNotificationIfNeeded(sensorData: sensorData)
- NotificationHelper.sendInvalidChecksumIfDeveloper(sensorData)
-
-
-
- guard sensorData.hasValidCRCs else {
- self.delegateQueue.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .failure(LibreError.checksumValidationError))
- }
-
- logger.debug("did not get sensordata with valid crcs")
- return
- }
-
- NotificationHelper.sendSensorExpireAlertIfNeeded(sensorData: sensorData)
-
- guard sensorData.state == .ready || sensorData.state == .starting else {
- logger.debug("dabear:: got sensordata with valid crcs, but sensor is either expired or failed")
- self.delegateQueue.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .failure(LibreError.expiredSensor))
- }
- return
- }
-
- logger.debug("dabear:: got sensordata with valid crcs, sensor was ready")
-// self.lastValidSensorData = sensorData
-
-
- self.handleGoodReading(data: sensorData) { [weak self] error, glucoseArrayWithPrediction in
- guard let self = self else {
- print("dabear:: handleGoodReading could not lock on self, aborting")
- return
- }
- if let error = error {
- self.logger.error("dabear:: handleGoodReading returned with error: \(error.errorDescription)")
- self.delegateQueue.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .failure(error))
- }
- return
- }
-
-
- guard let glucose = glucoseArrayWithPrediction?.glucose else {
- self.logger.debug("dabear:: handleGoodReading returned with no data")
- self.delegateQueue.async {
- self.cgmManagerDelegate?.cgmManager(self, hasNew: .success([]))
- }
- return
- }
-
- let prediction = glucoseArrayWithPrediction?.prediction
-
-
-
-// let device = self.proxy?.device
- let newGlucose = self.glucosesToSamplesFilter(glucose, startDate: self.getStartDateForFilter())
-
-
-
- if newGlucose.isEmpty {
- self.countTimesWithoutData &+= 1
- } else {
- self.latestBackfill = glucose.max { $0.startDate < $1.startDate }
- self.logger.debug("dabear:: latestbackfill set to \(self.latestBackfill.debugDescription)")
- self.countTimesWithoutData = 0
- }
-
- self.latestPrediction = prediction?.first
-
- //must be inside this handler as setobservables "depend" on latestbackfill
- self.setObservables(sensorData: sensorData, bleData: nil, metaData: nil)
-
- self.logger.debug("dabear:: handleGoodReading returned with \(newGlucose.count) entries")
- self.delegateQueue.async {
- var result: Result<[LibreGlucose], Error>
- // If several readings from a valid and running sensor come out empty,
- // we have (with a large degree of confidence) a sensor that has been
- // ripped off the body
- if self.countTimesWithoutData > 1 {
- result = .failure(LibreError.noValidSensorData)
- } else {
- result = .success(newGlucose)
- }
- self.cgmManagerDelegate?.cgmManager(self, hasNew: result)
- }
- }
-
- }
- private func readingToGlucose(_ data: SensorData, calibration: SensorData.CalibrationInfo) -> GlucoseArrayWithPrediction {
-
- var entries: [LibreGlucose] = []
- var prediction: [LibreGlucose] = []
-
- let predictGlucose = true
-
- // Increase to up to 15 to move closer to real blood sugar
- // The cost is slightly more noise on consecutive readings
- let glucosePredictionMinutes : Double = 10
-
- if predictGlucose {
- // We cheat here by forcing the loop to think that the predicted glucose value is the current blood sugar value.
- logger.debug("Predicting glucose value")
- if let predicted = data.predictBloodSugar(glucosePredictionMinutes){
- let currentBg = predicted.roundedGlucoseValueFromRaw2(calibrationInfo: calibration)
- let bgDate = predicted.date.addingTimeInterval(60 * -glucosePredictionMinutes)
-
- prediction.append(LibreGlucose(unsmoothedGlucose: currentBg, glucoseDouble: currentBg, timestamp: bgDate))
- logger.debug("Predicted glucose (not used) was: \(currentBg)")
- } else {
- logger.debug("Tried to predict glucose value but failed!")
- }
-
- }
-
- let trends = data.trendMeasurements()
- let firstTrend = trends.first?.roundedGlucoseValueFromRaw2(calibrationInfo: calibration)
- logger.debug("first trend was: \(String(describing: firstTrend))")
- entries = LibreGlucose.fromTrendMeasurements(trends, nativeCalibrationData: calibration, returnAll: UserDefaults.standard.mmBackfillFromTrend)
-
- if UserDefaults.standard.mmBackfillFromHistory {
- let history = data.historyMeasurements()
- entries += LibreGlucose.fromHistoryMeasurements(history, nativeCalibrationData: calibration)
- }
-
- overcalibrate(entries: &entries, prediction: &prediction)
-
- return (glucose: entries, prediction: prediction)
- }
-
- private func overcalibrate(entries: inout [LibreGlucose], prediction: inout [LibreGlucose]) {
- // overcalibrate
- var overcalibration: ((Double) -> (Double))? = nil
- delegateQueue.sync { overcalibration = cgmManagerDelegate?.overcalibration(for: self) }
-
- if let overcalibration = overcalibration {
- func overcalibrate(entries: [LibreGlucose]) -> [LibreGlucose] {
- entries.map { entry in
- var entry = entry
- entry.glucoseDouble = overcalibration(entry.glucoseDouble)
- return entry
- }
- }
-
- entries = overcalibrate(entries: entries)
- prediction = overcalibrate(entries: prediction)
- }
- }
-
- public func handleGoodReading(data: SensorData?, _ callback: @escaping (LibreError?, GlucoseArrayWithPrediction?) -> Void) {
- //only care about the once per minute readings here, historical data will not be considered
- guard let data = data else {
- callback(.noSensorData, nil)
- return
- }
-
-
- if let calibrationdata = calibrationData {
- logger.debug("dabear:: calibrationdata loaded")
-
- if calibrationdata.isValidForFooterWithReverseCRCs == data.footerCrc.byteSwapped {
- logger.debug("dabear:: calibrationdata correct for this sensor, returning last values")
-
- callback(nil, readingToGlucose(data, calibration: calibrationdata))
- return
- } else {
- logger.debug("dabear:: calibrationdata incorrect for this sensor, calibrationdata.isValidForFooterWithReverseCRCs: \(calibrationdata.isValidForFooterWithReverseCRCs), data.footerCrc.byteSwapped: \(data.footerCrc.byteSwapped)")
- }
- } else {
- logger.debug("dabear:: calibrationdata was nil")
- }
-
- calibrateSensor(sensordata: data) { [weak self] calibrationparams in
- do {
- try KeychainManagerWrapper.standard.setLibreNativeCalibrationData(calibrationparams)
- } catch {
- NotificationHelper.sendCalibrationNotification(.invalidCalibrationData)
- callback(.invalidCalibrationData, nil)
- return
- }
- //here we assume success, data is not changed,
- //and we trust that the remote endpoint returns correct data for the sensor
- NotificationHelper.sendCalibrationNotification(.success)
- callback(nil, self?.readingToGlucose(data, calibration: calibrationparams))
- }
- }
-
- //will be called on utility queue
- public func libreTransmitterStateChanged(_ state: BluetoothmanagerState) {
- DispatchQueue.main.async {
- self.transmitterInfoObservable.connectionState = self.proxy?.connectionStateString ?? "n/a"
- self.transmitterInfoObservable.transmitterType = self.proxy?.shortTransmitterName ?? "Unknown"
- }
- switch state {
- case .Connected:
- lastConnected = Date()
- case .powerOff:
- NotificationHelper.sendBluetoothPowerOffNotification()
- default:
- break
- }
- return
- }
-
- //will be called on utility queue
- public func libreTransmitterReceivedMessage(_ messageIdentifier: UInt16, txFlags: UInt8, payloadData: Data) {
- guard let packet = MiaoMiaoResponseState(rawValue: txFlags) else {
- // Incomplete package?
- // this would only happen if delegate is called manually with an unknown txFlags value
- // this was the case for readouts that were not yet complete
- // but that was commented out in MiaoMiaoManager.swift, see comment there:
- // "dabear-edit: don't notify on incomplete readouts"
- logger.debug("dabear:: incomplete package or unknown response state")
- return
- }
-
- switch packet {
- case .newSensor:
- logger.debug("dabear:: new libresensor detected")
- NotificationHelper.sendSensorChangeNotificationIfNeeded()
- NotificationCenter.default.post(name: .newSensorDetected, object: nil)
- case .noSensor:
- logger.debug("dabear:: no libresensor detected")
- NotificationHelper.sendSensorNotDetectedNotificationIfNeeded(noSensor: true)
- case .frequencyChangedResponse:
- logger.debug("dabear:: transmitter readout interval has changed!")
-
- default:
- //we don't care about the rest!
- break
- }
-
- return
- }
-
- func tryPersistSensorData(with sensorData: SensorData) {
- guard UserDefaults.standard.shouldPersistSensorData else {
- return
- }
-
- //yeah, we really really need to persist any changes right away
- var data = UserDefaults.standard.queuedSensorData ?? LimitedQueue()
- data.enqueue(sensorData)
- UserDefaults.standard.queuedSensorData = data
- }
-}
-
-// MARK: - conventience properties to access the enclosed proxy's properties
-extension LibreTransmitterManager {
- public var device: HKDevice? {
- //proxy?.OnQueue_device
- proxy?.device
- }
-
- static var className: String {
- String(describing: Self.self)
- }
- //cannot be called from managerQueue
- public var identifier: String {
- //proxy?.OnQueue_identifer?.uuidString ?? "n/a"
- proxy?.identifier?.uuidString ?? "n/a"
- }
-
- public var metaData: LibreTransmitterMetadata? {
- //proxy?.OnQueue_metadata
- proxy?.metadata
- }
-
- //cannot be called from managerQueue
- public var connectionState: String {
- //proxy?.connectionStateString ?? "n/a"
- proxy?.connectionStateString ?? "n/a"
- }
- //cannot be called from managerQueue
- public var sensorSerialNumber: String {
- //proxy?.OnQueue_sensorData?.serialNumber ?? "n/a"
- proxy?.sensorData?.serialNumber ?? "n/a"
- }
-
- public var sensorStartDate: Date? {
- proxy?.sensorData?.sensorStartTime
- }
-
-
- //cannot be called from managerQueue
- public var sensorAge: String {
- //proxy?.OnQueue_sensorData?.humanReadableSensorAge ?? "n/a"
- proxy?.sensorData?.humanReadableSensorAge ?? "n/a"
- }
-
- public var sensorEndTime : String {
- if let endtime = proxy?.sensorData?.sensorEndTime {
- let mydf = DateFormatter()
- mydf.dateStyle = .long
- mydf.timeStyle = .full
- mydf.locale = Locale.current
- return mydf.string(from: endtime)
- }
- return "Unknown or Ended"
- }
-
- public var sensorTimeLeft: String {
- //proxy?.OnQueue_sensorData?.humanReadableSensorAge ?? "n/a"
- proxy?.sensorData?.humanReadableTimeLeft ?? "n/a"
- }
-
- //cannot be called from managerQueue
- public var sensorFooterChecksums: String {
- //(proxy?.OnQueue_sensorData?.footerCrc.byteSwapped).map(String.init)
- (proxy?.sensorData?.footerCrc.byteSwapped).map(String.init)
-
- ?? "n/a"
- }
-
-
-
- //cannot be called from managerQueue
- public var sensorStateDescription: String {
- //proxy?.OnQueue_sensorData?.state.description ?? "n/a"
- proxy?.sensorData?.state.description ?? "n/a"
- }
- //cannot be called from managerQueue
- public var firmwareVersion: String {
- proxy?.metadata?.firmware ?? "n/a"
- }
-
- //cannot be called from managerQueue
- public var hardwareVersion: String {
- proxy?.metadata?.hardware ?? "n/a"
- }
-
- //cannot be called from managerQueue
- public var batteryString: String {
- proxy?.metadata?.batteryString ?? "n/a"
- }
-
- public var battery: Int? {
- proxy?.metadata?.battery
- }
-
- public func getDeviceType() -> String {
- proxy?.shortTransmitterName ?? "Unknown"
- }
- public func getSmallImage() -> UIImage? {
- proxy?.activePluginType?.smallImage ?? UIImage(named: "libresensor", in: Bundle.module, compatibleWith: nil)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Controllers/LibreTransmitterSetupViewController.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Controllers/LibreTransmitterSetupViewController.swift
deleted file mode 100644
index ca451d745..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Controllers/LibreTransmitterSetupViewController.swift
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// MiaomiaoClientSetupViewController.swift
-// Loop
-//
-// Copyright © 2018 LoopKit Authors. All rights reserved.
-//
-
-import Combine
-import SwiftUI
-import UIKit
-import os.log
-import HealthKit
-
-public protocol CGMManagerSetupViewController {
- var setupDelegate: CGMManagerSetupViewControllerDelegate? { get set }
-}
-
-public protocol CGMManagerSetupViewControllerDelegate: AnyObject {
- func cgmManagerSetupViewController(_ cgmManagerSetupViewController: CGMManagerSetupViewController, didSetUpCGMManager cgmManager: LibreTransmitterManager)
-}
-
-class LibreTransmitterSetupViewController: UINavigationController,
- CGMManagerSetupViewController,
-
- CompletionNotifying {
-
- weak var setupDelegate: CGMManagerSetupViewControllerDelegate?
- weak var completionDelegate: CompletionDelegate?
-
- var modeSelection: UIHostingController!
-
- fileprivate var logger = Logger.init(subsystem: "no.bjorninge.libre", category: "LibreTransmitterSetupViewController")
- lazy var cgmManager: LibreTransmitterManager? = LibreTransmitterManager()
-
-
- init() {
- SelectionState.shared.selectedStringIdentifier = UserDefaults.standard.preSelectedDevice
-
- let cancelNotifier = GenericObservableObject()
- let saveNotifier = GenericObservableObject()
-
- modeSelection = UIHostingController(rootView: ModeSelectionView(cancelNotifier: cancelNotifier, saveNotifier: saveNotifier))
-
-
- super.init(rootViewController: modeSelection)
-
-
- cancelNotifier.listenOnce { [weak self] in
- self?.cancel()
- }
-
- saveNotifier.listenOnce { [weak self] in
- self?.save()
- }
-
- }
-
- override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
- super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
- }
-
- deinit {
- logger.debug("dabear LibreTransmitterSetupViewController() deinit was called")
- //cgmManager = nil
- }
-
- @available(*, unavailable)
- required init?(coder aDecoder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- @objc
- private func cancel() {
- completionDelegate?.completionNotifyingDidComplete(self)
-
- }
-
- @objc
- private func save() {
-
- let hasNewDevice = SelectionState.shared.selectedStringIdentifier != UserDefaults.standard.preSelectedDevice
- if hasNewDevice, let newDevice = SelectionState.shared.selectedStringIdentifier {
- logger.debug("dabear: Setupcontroller will set new device to \(newDevice)")
- UserDefaults.standard.preSelectedDevice = newDevice
- SelectionState.shared.selectedUID = nil
- UserDefaults.standard.preSelectedUid = nil
-
- } else if let newUID = SelectionState.shared.selectedUID {
- // this one is only temporary,
- // as we don't know the bluetooth identifier during nfc setup
- logger.debug("dabear: Setupcontroller will set new libre2 device to \(newUID)")
-
- UserDefaults.standard.preSelectedUid = newUID
- SelectionState.shared.selectedUID = nil
- UserDefaults.standard.preSelectedDevice = nil
-
-
- } else {
-
- //this cannot really happen unless you are a developer and have previously
- // stored both preSelectedDevice and selectedUID !
- }
-
- if let cgmManager = cgmManager {
- logger.debug("dabear: Setupcontroller Saving from setup")
- setupDelegate?.cgmManagerSetupViewController(self, didSetUpCGMManager: cgmManager)
-
- } else {
- logger.debug("dabear: Setupcontroller not Saving from setup")
- }
-
-
- completionDelegate?.completionNotifyingDidComplete(self)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/bubble.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/bubble.png
deleted file mode 100644
index bfb323c26..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/bubble.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/ic_bubble_mini_3-2.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/ic_bubble_mini_3-2.png
deleted file mode 100644
index 280b58eb1..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/ic_bubble_mini_3-2.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-down-arrow-50.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-down-arrow-50.png
deleted file mode 100644
index 404412d10..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-down-arrow-50.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-drop-down-arrow-50.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-drop-down-arrow-50.png
deleted file mode 100644
index fe8055166..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-drop-down-arrow-50.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-schedule-50.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-schedule-50.png
deleted file mode 100644
index 397103da7..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-schedule-50.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-slide-up-50.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-slide-up-50.png
deleted file mode 100644
index 3ec8682e9..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-slide-up-50.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-up-50.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-up-50.png
deleted file mode 100644
index e02e5d5db..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/icons8-up-50.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/libresensor.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/libresensor.png
deleted file mode 100644
index a9e8ee286..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/libresensor.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/miaomiao-small.png b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/miaomiao-small.png
deleted file mode 100644
index d4fba9331..000000000
Binary files a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Graphics/miaomiao-small.png and /dev/null differ
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/LibreTransmitterManager+UI.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/LibreTransmitterManager+UI.swift
deleted file mode 100644
index 8f62ac055..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/LibreTransmitterManager+UI.swift
+++ /dev/null
@@ -1,111 +0,0 @@
-import UIKit
-import SwiftUI
-import HealthKit
-
-public struct LibreTransmitterSetupView: UIViewControllerRepresentable {
- public class Coordinator: CompletionDelegate, CGMManagerSetupViewControllerDelegate {
- let completion: (() -> Void)?
- let setup: ((LibreTransmitterManager) -> Void)?
-
- public func cgmManagerSetupViewController(_ cgmManagerSetupViewController: CGMManagerSetupViewController, didSetUpCGMManager cgmManager: LibreTransmitterManager) {
- setup?(cgmManager)
- }
-
- public func completionNotifyingDidComplete(_ object: CompletionNotifying) {
- completion?()
- }
-
- init(completion: (() -> Void)?, setup: ((LibreTransmitterManager) -> Void)?) {
- self.completion = completion
- self.setup = setup
- }
- }
-
- private let setup: ((LibreTransmitterManager) -> Void)?
- private let completion: (() -> Void)?
-
- public init(setup: ((LibreTransmitterManager) -> Void)? = nil , completion: (() -> Void)? = nil) {
- self.setup = setup
- self.completion = completion
- }
-
- public func makeUIViewController(context: Context) -> UIViewController {
- let controller = LibreTransmitterSetupViewController()
- controller.completionDelegate = context.coordinator
- controller.setupDelegate = context.coordinator
- return controller
- }
-
- public func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
-
- public func makeCoordinator() -> Coordinator {
- Coordinator(completion: completion, setup: setup)
- }
-}
-
-public struct LibreTransmitterSettingsView: UIViewControllerRepresentable {
- public class Coordinator: CompletionDelegate {
- let completion: (() -> Void)?
- let delete: (() -> Void)?
-
- public func completionNotifyingDidComplete(_ object: CompletionNotifying) {
- completion?()
- }
-
- init(completion: (() -> Void)?, delete: (() -> Void)?) {
- self.completion = completion
- self.delete = delete
- }
- }
-
- private weak var manager: LibreTransmitterManager!
- private let glucoseUnit: HKUnit
- private let delete: (() -> Void)?
- private let completion: (() -> Void)?
-
- public init(manager: LibreTransmitterManager, glucoseUnit: HKUnit, delete: (() -> Void)? = nil , completion: (() -> Void)? = nil) {
- self.manager = manager
- self.glucoseUnit = glucoseUnit
- self.delete = delete
- self.completion = completion
- }
-
- public func makeUIViewController(context: Context) -> UIViewController {
- let doneNotifier = GenericObservableObject()
- let wantToTerminateNotifier = GenericObservableObject()
-
- let settings = SettingsView.asHostedViewController(
- glucoseUnit: glucoseUnit,
- //displayGlucoseUnitObservable: displayGlucoseUnitObservable,
- notifyComplete: doneNotifier,
- notifyDelete: wantToTerminateNotifier,
- transmitterInfoObservable: manager.transmitterInfoObservable,
- sensorInfoObervable: manager.sensorInfoObservable,
- glucoseInfoObservable: manager.glucoseInfoObservable
- )
-
- let nav = SettingsNavigationViewController(rootViewController: settings)
- nav.navigationItem.title = NSLocalizedString("Libre Bluetooth", comment: "Libre Bluetooth")
- nav.completionDelegate = context.coordinator
-
- doneNotifier.listenOnce { [weak nav] in
- nav?.notifyComplete()
- }
-
- wantToTerminateNotifier.listenOnce { [weak nav] in
- manager.logger.debug("CGM wants to terminate")
- manager.disconnect()
- UserDefaults.standard.preSelectedDevice = nil
- context.coordinator.delete?()
- nav?.notifyComplete()
- }
-
- return nav
- }
-
- public func makeCoordinator() -> Coordinator {
- Coordinator(completion: completion, delete: delete)
- }
-
- public func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/SensorPairing/SensorPairing.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/SensorPairing/SensorPairing.swift
deleted file mode 100644
index 795a0fcee..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/SensorPairing/SensorPairing.swift
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// SensorPairing.swift
-// LibreDirect
-//
-// Created by Reimar Metzen on 06.07.21.
-//
-import Foundation
-import Combine
-
-class SensorPairingInfo : ObservableObject {
- @Published private(set) var uuid: Data
- @Published private(set) var patchInfo: Data
- @Published private(set) var fram: Data
- @Published private(set) var streamingEnabled: Bool
-
- public init(uuid: Data=Data(), patchInfo:Data=Data(), fram:Data=Data(), streamingEnabled: Bool = false) {
- self.uuid = uuid
- self.patchInfo = patchInfo
- self.fram = fram
- self.streamingEnabled = streamingEnabled
- }
-
- var sensorData : SensorData? {
- SensorData(bytes: [UInt8](self.fram))
- }
-
- var calibrationData : SensorData.CalibrationInfo? {
- sensorData?.calibrationData
- }
-
-
-
-
-}
-
-protocol SensorPairingProtocol {
- func pairSensor() -> AnyPublisher
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/SensorPairing/SensorPairingService.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/SensorPairing/SensorPairingService.swift
deleted file mode 100644
index cee8b099b..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/SensorPairing/SensorPairingService.swift
+++ /dev/null
@@ -1,332 +0,0 @@
-//
-// SensorPairingService.swift
-// LibreDirect
-//
-// Created by Reimar Metzen on 06.07.21.
-//
-
-#if canImport(CoreNFC)
-
-import Foundation
-import Combine
-import CoreNFC
-
-class SensorPairingService: NSObject, NFCTagReaderSessionDelegate, SensorPairingProtocol {
- private var session: NFCTagReaderSession?
- private var readingsSubject = PassthroughSubject()
-
- private let nfcQueue = DispatchQueue(label: "libre-direct.nfc-queue")
- private let accessQueue = DispatchQueue(label: "libre-direct.nfc-access-queue")
-
- private let unlockCode: UInt32 = 42 //42
-
- @discardableResult func pairSensor() -> AnyPublisher {
- if NFCTagReaderSession.readingAvailable {
- accessQueue.async {
- self.session = NFCTagReaderSession(pollingOption: .iso15693, delegate: self, queue: self.nfcQueue)
- self.session?.alertMessage = LocalizedString("Hold the top of your iPhone near the sensor to pair", comment: "")
- self.session?.begin()
- }
- }
-
- return readingsSubject.eraseToAnyPublisher()
- }
-
- public var publisher : AnyPublisher {
- readingsSubject.eraseToAnyPublisher()
- }
-
- private func sendUpdate(_ info: SensorPairingInfo) {
- DispatchQueue.main.async { [weak self] in
- self?.readingsSubject.send(info)
- }
- }
-
- internal func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
- }
-
- internal func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
- }
-
- internal func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
- guard let firstTag = tags.first else { return }
- guard case .iso15693(let tag) = firstTag else { return }
-
- let blocks = 43
- let requestBlocks = 3
-
- let requests = Int(ceil(Double(blocks) / Double(requestBlocks)))
- let remainder = blocks % requestBlocks
- var dataArray = [Data](repeating: Data(), count: blocks)
-
- session.connect(to: firstTag) { error in
- if error != nil {
- return
- }
-
- tag.getSystemInfo(requestFlags: [.address, .highDataRate]) { result in
- switch result {
- case .failure(_):
- return
- case .success(_):
- tag.customCommand(requestFlags: .highDataRate, customCommandCode: 0xA1, customRequestParameters: Data()) { response, error in
-
- for i in 0 ..< requests {
- tag.readMultipleBlocks(
- requestFlags: [.highDataRate, .address],
- blockRange: NSRange(UInt8(i * requestBlocks) ... UInt8(i * requestBlocks + (i == requests - 1 ? (remainder == 0 ? requestBlocks : remainder) : requestBlocks) - (requestBlocks > 1 ? 1 : 0)))
- ) { blockArray, error in
- if error != nil {
- if i != requests - 1 { return }
- } else {
- for j in 0 ..< blockArray.count {
- dataArray[i * requestBlocks + j] = blockArray[j]
- }
- }
-
- if i == requests - 1 {
- var fram = Data()
-
- for (_, data) in dataArray.enumerated() {
- if data.count > 0 {
- fram.append(data)
- }
- }
-
- // get sensorUID and patchInfo and send to delegate
- let sensorUID = Data(tag.identifier.reversed())
- let patchInfo = response
-
- // patchInfo should have length 6, which sometimes is not the case, as there are occuring crashes in nfcCommand and Libre2BLEUtilities.streamingUnlockPayload
- guard patchInfo.count >= 6 else {
- return
- }
-
-
- let subCmd: Subcommand = .enableStreaming
- let cmd = self.nfcCommand(subCmd, unlockCode: self.unlockCode, patchInfo: patchInfo, sensorUID: sensorUID)
-
- tag.customCommand(requestFlags: .highDataRate, customCommandCode: Int(cmd.code), customRequestParameters: cmd.parameters) { response, error in
- var streamingEnabled = false
-
- if subCmd == .enableStreaming && response.count == 6 {
- streamingEnabled = true
- }
-
- session.invalidate()
-
-
- let patchHex = patchInfo.hexEncodedString()
- let sensorType = SensorType(patchInfo: patchHex)
-
- print("got patchhex: \(patchHex) and sensorType: \(String(describing: sensorType))")
-
-
- guard sensorUID.count == 8 && patchInfo.count == 6 && fram.count == 344 else {
- //self.readingsSubject.send(completion: .failure(LibreError.noSensorData))
- return
- }
-
-
- if let sensorType = sensorType {
- do {
- let decryptedBytes = try Libre2.decryptFRAM(type: sensorType, id: [UInt8](sensorUID), info: [UInt8](patchInfo), data: [UInt8](fram))
-
- self.sendUpdate(SensorPairingInfo(uuid: sensorUID, patchInfo: patchInfo, fram: Data(decryptedBytes), streamingEnabled: streamingEnabled))
-
- return
- } catch {
- print("problem decrypting")
- }
-
- self.sendUpdate(SensorPairingInfo(uuid: sensorUID, patchInfo: patchInfo, fram: fram, streamingEnabled: streamingEnabled))
-
- }
- }
-
-
- }
- }
- }
- }
- }
- }
- }
- }
-
- private func readRaw(_ address: UInt16, _ bytes: Int, buffer: Data = Data(), tag: NFCISO15693Tag, handler: @escaping (UInt16, Data, Error?) -> Void) {
- var buffer = buffer
- let addressToRead = address + UInt16(buffer.count)
-
- var remainingBytes = bytes
- let bytesToRead = remainingBytes > 24 ? 24 : bytes
-
- var remainingWords = bytes / 2
- if bytes % 2 == 1 || (bytes % 2 == 0 && addressToRead % 2 == 1) { remainingWords += 1 }
- let wordsToRead = UInt8(remainingWords > 12 ? 12 : remainingWords) // real limit is 15
-
- // this is for libre 2 only, ignoring other libre types
- let readRawCommand = NFCCommand(code: 0xB3, parameters: Data([UInt8(addressToRead & 0x00FF), UInt8(addressToRead >> 8), wordsToRead]))
-
- tag.customCommand(requestFlags: .highDataRate, customCommandCode: Int(readRawCommand.code), customRequestParameters: readRawCommand.parameters) { response, error in
- var data = response
-
- if error != nil {
- remainingBytes = 0
- } else {
- if addressToRead % 2 == 1 { data = data.subdata(in: 1 ..< data.count) }
- if data.count - Int(bytesToRead) == 1 { data = data.subdata(in: 0 ..< data.count - 1) }
- }
-
- buffer += data
- remainingBytes -= data.count
-
- if remainingBytes == 0 {
- handler(address, buffer, error)
- } else {
- self.readRaw(address, remainingBytes, buffer: buffer, tag: tag) { address, data, error in handler(address, data, error) }
- }
- }
- }
-
- private func writeRaw(_ address: UInt16, _ data: Data, tag: NFCISO15693Tag, handler: @escaping (UInt16, Data, Error?) -> Void) {
- let backdoor = "deadbeef".utf8
-
- tag.customCommand(requestFlags: .highDataRate, customCommandCode: 0xA4, customRequestParameters: Data(backdoor)) {
- response, error in
-
- let addressToRead = (address / 8) * 8
- let startOffset = Int(address % 8)
- let endAddressToRead = ((Int(address) + data.count - 1) / 8) * 8 + 7
- let blocksToRead = (endAddressToRead - Int(addressToRead)) / 8 + 1
-
- self.readRaw(addressToRead, blocksToRead * 8, tag: tag) { readAddress, readData, error in
- if error != nil {
- handler(address, data, error)
- return
- }
-
- var bytesToWrite = readData
- bytesToWrite.replaceSubrange(startOffset ..< startOffset + data.count, with: data)
-
- let startBlock = Int(addressToRead / 8)
- let blocks = bytesToWrite.count / 8
-
- if address < 0xF860 { // lower than FRAM blocks
- for i in 0 ..< blocks {
- let blockToWrite = bytesToWrite[i * 8 ... i * 8 + 7]
-
- // FIXME: doesn't work as the custom commands C1 or A5 for other chips
- tag.extendedWriteSingleBlock(requestFlags: .highDataRate, blockNumber: startBlock + i, dataBlock: blockToWrite) { error in
- if error != nil {
- if i != blocks - 1 { return }
- }
-
- if i == blocks - 1 {
- tag.customCommand(requestFlags: .highDataRate, customCommandCode: 0xA2, customRequestParameters: Data(backdoor)) { response, error in
- handler(address, data, error)
- }
- }
- }
- }
-
- } else { // address >= 0xF860: write to FRAM blocks
- let requestBlocks = 2 // 3 doesn't work
- let requests = Int(ceil(Double(blocks) / Double(requestBlocks)))
- let remainder = blocks % requestBlocks
- var blocksToWrite = [Data](repeating: Data(), count: blocks)
-
- for i in 0 ..< blocks {
- blocksToWrite[i] = Data(bytesToWrite[i * 8 ... i * 8 + 7])
- }
-
- for i in 0 ..< requests {
- let startIndex = startBlock - 0xF860 / 8 + i * requestBlocks
- let endIndex = startIndex + (i == requests - 1 ? (remainder == 0 ? requestBlocks : remainder) : requestBlocks) - (requestBlocks > 1 ? 1 : 0)
- let blockRange = NSRange(UInt8(startIndex) ... UInt8(endIndex))
-
- var dataBlocks = [Data]()
- for j in startIndex ... endIndex { dataBlocks.append(blocksToWrite[j - startIndex]) }
-
- // TODO: write to 16-bit addresses as the custom cummand C4 for other chips
- tag.writeMultipleBlocks(requestFlags: [.highDataRate, .address], blockRange: blockRange, dataBlocks: dataBlocks) { error in // TEST
- if error != nil {
- if i != requests - 1 { return }
- }
-
- if i == requests - 1 {
- // Lock
- tag.customCommand(requestFlags: .highDataRate, customCommandCode: 0xA2, customRequestParameters: Data(backdoor)) {
- response, error in
-
- handler(address, data, error)
- }
- }
- }
- }
- }
- }
- }
- }
-
- private func nfcCommand(_ code: Subcommand, unlockCode: UInt32, patchInfo: Data, sensorUID: Data) -> NFCCommand {
- var b: [UInt8] = []
- var y: UInt16
-
- if code == .enableStreaming {
- // Enables Bluetooth on Libre 2. Returns peripheral MAC address to connect to.
- // unlockCode could be any 32 bit value. The unlockCode and sensor Uid / patchInfo
- // will have also to be provided to the login function when connecting to peripheral.
- b = [UInt8(unlockCode & 0xFF), UInt8((unlockCode >> 8) & 0xFF), UInt8((unlockCode >> 16) & 0xFF), UInt8((unlockCode >> 24) & 0xFF)]
- y = UInt16(patchInfo[4...5]) ^ UInt16(b[1], b[0])
- } else {
- y = 0x1b6a
- }
-
- let d = Libre2.usefulFunction(id: [UInt8](sensorUID), x: UInt16(code.rawValue), y: y)
-
- var parameters = Data([code.rawValue])
-
- if code == .enableStreaming {
- parameters += b
- }
-
- parameters += d
-
- return NFCCommand(code: 0xA1, parameters: parameters)
- }
-}
-
-extension UInt16 {
- init(_ high: UInt8, _ low: UInt8) {
- self = UInt16(high) << 8 + UInt16(low)
- }
-
- init(_ data: Data) {
- self = UInt16(data[data.startIndex + 1]) << 8 + UInt16(data[data.startIndex])
- }
-}
-
-fileprivate struct NFCCommand {
- let code: UInt8
- let parameters: Data
-}
-
-fileprivate enum Subcommand: UInt8, CustomStringConvertible {
- case activate = 0x1b
- case enableStreaming = 0x1e
- case unknown0x1a = 0x1a
- case unknown0x1c = 0x1c
- case unknown0x1d = 0x1d
- case unknown0x1f = 0x1f
-
- var description: String {
- switch self {
- case .activate: return "activate"
- case .enableStreaming: return "enable BLE streaming"
- default: return "[unknown: 0x\(String(format: "%x", rawValue))]"
- }
- }
-}
-
-#endif
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/CalibrationEditView.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/CalibrationEditView.swift
deleted file mode 100644
index 655f462e4..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/CalibrationEditView.swift
+++ /dev/null
@@ -1,135 +0,0 @@
-//
-// CalibrationEditView.swift
-// LibreTransmitterUI
-//
-// Created by Bjørn Inge Berg on 24/03/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import SwiftUI
-import Combine
-
-struct CalibrationEditView: View {
- typealias Params = SensorData.CalibrationInfo
-
-
-
- @State private var isPressed = false
-
- @State private var presentableStatus: StatusMessage?
-
- public var isReadOnly : Bool {
- if debugMode {
- return false
- }
-
- return !hasExistingParams
- }
-
-
- @ObservedObject fileprivate var formstate = FormErrorState.shared
-
-
-
-
- var saveButtonSection: some View{
- Section {
- Button(action: {
- print("calibrationsaving in progress")
-
-
- self.isPressed.toggle()
-
- if formstate.hasAnyError {
- presentableStatus = StatusMessage(title: "Could not save", message:"Some of the fields was not correctly entered")
- return
- }
-
- if false && isReadOnly {
- presentableStatus = StatusMessage(title: "Could not save", message:"Calibration parameters are readonly and cannot be saved")
- return
- }
-
- do {
- try KeychainManagerWrapper.standard.setLibreNativeCalibrationData(newParams)
- print("calibrationsaving completed")
-
- presentableStatus = StatusMessage(title: "OK", message: "Calibrations saved!")
- } catch {
- print("error: \(error.localizedDescription)")
- presentableStatus = StatusMessage(title: "Calibration error", message:"Calibrations could not be saved, Check that footer crc is non-zero and that all values have sane defaults")
- }
-
-
- }, label: {
- Text("Save")
-
- }).buttonStyle(BlueButtonStyle())
- .alert(item: $presentableStatus) { status in
- Alert(title: Text(status.title), message: Text(status.message) , dismissButton: .default(Text("Got it!")))
- }
-
- }
- }
-
- var calibrationInputsSection : some View{
- Section {
- NumericTextField(description: "i1", showDescription: true, numericValue: $newParams.i1, isReadOnly: isReadOnly)
- NumericTextField(description: "i2", showDescription: true, numericValue: $newParams.i2, isReadOnly: isReadOnly)
- NumericTextField(description: "i3", showDescription: true, numericValue: $newParams.i3, isReadOnly: isReadOnly)
- NumericTextField(description: "i4", showDescription: true, numericValue: $newParams.i4, isReadOnly: isReadOnly)
- NumericTextField(description: "i5", showDescription: true, numericValue: $newParams.i5, isReadOnly: isReadOnly)
- NumericTextField(description: "i6", showDescription: true, numericValue: $newParams.i6, isReadOnly: isReadOnly)
- }
- }
-
- var validForSection : some View {
- Section {
- Text("Valid for footer: \(newParams.isValidForFooterWithReverseCRCs)")
-
- }
- }
-
- var body: some View {
- List {
- calibrationInputsSection
- validForSection
- saveButtonSection
- }
- .listStyle(InsetGroupedListStyle())
- .navigationBarTitle("Calibration Edit")
- }
-
- @ObservedObject private var newParams: Params
-
- private var debugMode = false
- private var hasExistingParams = false
-
- public init(debugMode:Bool=false) {
- self.debugMode = debugMode
-
-
- if let params = KeychainManagerWrapper.standard.getLibreNativeCalibrationData() {
- hasExistingParams = true
- self.newParams = params
- } else {
- hasExistingParams = false
- self.newParams = Params(i1: 1,i2: 2,i3: 3,i4: 4,i5: 5,i6: 5,isValidForFooterWithReverseCRCs: 1337)
- }
-
- }
-
-
-
-
-
-}
-
-struct CalibrationEditView_Previews: PreviewProvider {
- static var previews: some View {
- //var testData = FormState.shared
- //testData.childStates["i1"] = true
- CalibrationEditView(debugMode: true)
-
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/GlucoseSettingsView.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/GlucoseSettingsView.swift
deleted file mode 100644
index 5eedf243d..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/GlucoseSettingsView.swift
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-// GlucoseSettingsView.swift
-// LibreTransmitterUI
-//
-// Created by Bjørn Inge Berg on 26/05/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import SwiftUI
-import Combine
-import HealthKit
-
-struct GlucoseSettingsView: View {
-
-
- @State private var presentableStatus: StatusMessage?
-
-
- private var glucoseUnit: HKUnit
-
- public init(glucoseUnit: HKUnit) {
- if let savedGlucoseUnit = UserDefaults.standard.mmGlucoseUnit {
- self.glucoseUnit = savedGlucoseUnit
- } else {
- self.glucoseUnit = glucoseUnit
- UserDefaults.standard.mmGlucoseUnit = glucoseUnit
- }
-
-
-
- }
-
- @AppStorage("no.bjorninge.mmBackfillFromHistory") var mmBackfillFromHistory: Bool = true
- @AppStorage("no.bjorninge.mmBackfillFromTrend") var mmBackfillFromTrend: Bool = false
- @AppStorage("no.bjorninge.shouldPersistSensorData") var shouldPersistSensorData: Bool = false
-
-
-
- var body: some View {
- List {
-
- Section(header: Text("Backfill options"), footer:Text("Backfilling from trend is currently not well supported by Loop") ) {
- Toggle("Backfill from history", isOn:$mmBackfillFromHistory)
- Toggle("Backfill from trend", isOn: $mmBackfillFromTrend)
- }
-
- Section(header: Text("Debug options"), footer: Text("Adds a lot of data to the Issue Report ")) {
- Toggle("Persist sensordata", isOn:$shouldPersistSensorData)
- }
-
- }
- .listStyle(InsetGroupedListStyle())
- .alert(item: $presentableStatus) { status in
- Alert(title: Text(status.title), message: Text(status.message) , dismissButton: .default(Text("Got it!")))
- }
- .navigationBarTitle("Glucose Settings")
-
- }
-
-
-
-
-}
-
-
-struct GlucoseSettingsView_Previews: PreviewProvider {
- static var previews: some View {
- GlucoseSettingsView(glucoseUnit: HKUnit.millimolesPerLiter)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/NotificationSettingsView.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/NotificationSettingsView.swift
deleted file mode 100644
index b7c54ba28..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/NotificationSettingsView.swift
+++ /dev/null
@@ -1,129 +0,0 @@
-//
-// NotificationSettingsView.swift
-// LibreTransmitterUI
-//
-// Created by Bjørn Inge Berg on 27/05/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import SwiftUI
-import Combine
-import HealthKit
-
-
-struct NotificationSettingsView: View {
-
-
-
- @State private var presentableStatus: StatusMessage?
-
-
- private var glucoseUnit: HKUnit
-
- private let glucoseSegments = [HKUnit.millimolesPerLiter, HKUnit.milligramsPerDeciliter]
- private lazy var glucoseSegmentStrings = self.glucoseSegments.map({ $0.localizedShortUnitString })
-
- public init(glucoseUnit: HKUnit) {
- if let savedGlucoseUnit = UserDefaults.standard.mmGlucoseUnit {
- self.glucoseUnit = savedGlucoseUnit
- } else {
- self.glucoseUnit = glucoseUnit
- UserDefaults.standard.mmGlucoseUnit = glucoseUnit
- }
-
-
- }
-
-
- private enum Key: String {
- case mmAlertLowBatteryWarning = "no.bjorninge.mmLowBatteryWarning"
- case mmAlertInvalidSensorDetected = "no.bjorninge.mmInvalidSensorDetected"
- //case mmAlertalarmNotifications
- case mmAlertNewSensorDetected = "no.bjorninge.mmNewSensorDetected"
- case mmAlertNoSensorDetected = "no.bjorninge.mmNoSensorDetected"
-
- case mmAlertSensorSoonExpire = "no.bjorninge.mmAlertSensorSoonExpire"
-
- //handle specially:
- case mmGlucoseUnit = "no.bjorninge.mmGlucoseUnit"
- }
-
- @AppStorage(Key.mmAlertLowBatteryWarning.rawValue) var mmAlertLowBatteryWarning: Bool = true
- @AppStorage(Key.mmAlertInvalidSensorDetected.rawValue) var mmAlertInvalidSensorDetected: Bool = true
- @AppStorage(Key.mmAlertNewSensorDetected.rawValue) var mmAlertNewSensorDetected: Bool = true
- @AppStorage(Key.mmAlertNoSensorDetected.rawValue) var mmAlertNoSensorDetected: Bool = true
- @AppStorage(Key.mmAlertSensorSoonExpire.rawValue) var mmAlertSensorSoonExpire: Bool = true
-
- //especially handled mostly for backward compat
- @AppStorage(Key.mmGlucoseUnit.rawValue) var mmGlucoseUnit: String = ""
-
-
- @State var notifyErrorState = FormErrorState()
-
- @State private var favoriteGlucoseUnit = 0
-
- static let formatter = NumberFormatter()
-
- var additionalNotificationsSection : some View {
- Section(header: Text("Additional notification types")) {
- Toggle("Low battery", isOn:$mmAlertLowBatteryWarning)
- Toggle("Invalid sensor", isOn:$mmAlertInvalidSensorDetected)
- Toggle("Sensor change", isOn:$mmAlertNewSensorDetected)
- Toggle("Sensor not found", isOn:$mmAlertNoSensorDetected)
- Toggle("Sensor expires soon", isOn:$mmAlertSensorSoonExpire)
-
- }
- }
-
- var miscSection : some View {
- Section(header: Text("Misc")) {
- HStack {
- Text("Unit override")
- Picker(selection: $favoriteGlucoseUnit, label: Text("Unit override")) {
- Text(HKUnit.millimolesPerLiter.localizedShortUnitString).tag(0)
- Text(HKUnit.milligramsPerDeciliter.localizedShortUnitString).tag(1)
- }
- .pickerStyle(SegmentedPickerStyle())
- .clipped()
- }
- }
- }
-
- var body: some View {
- List {
- additionalNotificationsSection
-
- miscSection
- .onAppear {
- favoriteGlucoseUnit = glucoseSegments.firstIndex(of: glucoseUnit) ?? 0
- }
- .onChange(of: favoriteGlucoseUnit){ newValue in
- let newUnit = glucoseSegments[newValue]
- if newUnit == HKUnit.milligramsPerDeciliter {
- mmGlucoseUnit = "mgdl"
- } else if newUnit == HKUnit.millimolesPerLiter {
- mmGlucoseUnit = "mmol"
- }
- }
-
- }
- .listStyle(InsetGroupedListStyle())
- .alert(item: $presentableStatus) { status in
- Alert(title: Text(status.title), message: Text(status.message) , dismissButton: .default(Text("Got it!")))
- }
-
- .navigationBarTitle("Notification Settings")
-
- }
-
-
-
-
-}
-
-
-struct NotificationSettingsView_Previews: PreviewProvider {
- static var previews: some View {
- NotificationSettingsView(glucoseUnit: HKUnit.millimolesPerLiter)
- }
-}
diff --git a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/SettingsView.swift b/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/SettingsView.swift
deleted file mode 100644
index 06af3ad0d..000000000
--- a/Dependencies/LibreTransmitter/Sources/LibreTransmitter/LibreTransmitterUI/Views/Settings/SettingsView.swift
+++ /dev/null
@@ -1,401 +0,0 @@
-//
-// SettingsOverview.swift
-// LibreTransmitterUI
-//
-// Created by Bjørn Inge Berg on 12/06/2021.
-// Copyright © 2021 Mark Wilson. All rights reserved.
-//
-
-import SwiftUI
-import HealthKit
-import UniformTypeIdentifiers
-
-
-public struct SettingsItem: View {
- @State var title: String = "" // we don't want this to change after it is set
- @Binding var detail: String
-
- init(title: String, detail: Binding