HeartBeatManager.swift 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import Foundation
  2. class HeartBeatManager {
  3. private let keyForcgmTransmitterDeviceAddress = "cgmTransmitterDeviceAddress"
  4. private let keyForcgmTransmitter_CBUUID_Service = "cgmTransmitter_CBUUID_Service"
  5. private let keycgmTransmitter_CBUUID_Receive = "cgmTransmitter_CBUUID_Receive"
  6. /// to be used as singleton, no instanstation from outside allowed - class to be accessed via shared
  7. static let shared = HeartBeatManager()
  8. /// - instance of bluetoothTransmitter that will connect to the CGM, with goal to achieve heartbeat mechanism, nothing else
  9. /// - if nil then there's no heartbeat generated
  10. private var bluetoothTransmitter: BluetoothTransmitter?
  11. private var initialSetupDone = false
  12. /// to be used as singleton, no instanstation from outside allowed
  13. private init() {}
  14. /// verifies if local copy of cgmTransmitterDeviceAddress is different than the one stored in shared User Defaults
  15. /// - parameters:
  16. /// - sharedData : shared User Defaults
  17. public func checkCGMBluetoothTransmitter(sharedUserDefaults: UserDefaults) {
  18. if !initialSetupDone {
  19. initialSetupDone = true
  20. // set to nil, this will force recreation of bluetooth transmitter at app startup
  21. UserDefaults.standard.cgmTransmitterDeviceAddress = nil
  22. }
  23. if UserDefaults.standard.cgmTransmitterDeviceAddress != sharedUserDefaults
  24. .string(forKey: keyForcgmTransmitterDeviceAddress)
  25. {
  26. // assign local copy of cgmTransmitterDeviceAddress to the value stored in sharedUserDefaults (possibly nil value)
  27. UserDefaults.standard.cgmTransmitterDeviceAddress = sharedUserDefaults
  28. .string(forKey: keyForcgmTransmitterDeviceAddress)
  29. // assign new bluetoothTransmitter. If return value is nil, and if it was not nil before, and if it was currently connected then it will disconnect automatically, because there's no other reference to it, hence deinit will be called
  30. bluetoothTransmitter = setupBluetoothTransmitter(sharedData: sharedUserDefaults)
  31. }
  32. }
  33. private func setupBluetoothTransmitter(sharedData: UserDefaults) -> BluetoothTransmitter? {
  34. // if sharedUserDefaults.cgmTransmitterDeviceAddress is not nil then, create a new bluetoothTranmsitter instance
  35. if let cgmTransmitterDeviceAddress = sharedData.string(forKey: keyForcgmTransmitterDeviceAddress) {
  36. // unwrap cgmTransmitter_CBUUID_Service and cgmTransmitter_CBUUID_Receive
  37. if let cgmTransmitter_CBUUID_Service = sharedData.string(forKey: keyForcgmTransmitter_CBUUID_Service),
  38. let cgmTransmitter_CBUUID_Receive = sharedData.string(forKey: keycgmTransmitter_CBUUID_Receive)
  39. {
  40. // a new cgm transmitter has been setup in xDrip4iOS
  41. // we will connect to the same transmitter here so it can be used as heartbeat
  42. let newBluetoothTransmitter = BluetoothTransmitter(
  43. deviceAddress: cgmTransmitterDeviceAddress,
  44. servicesCBUUID: cgmTransmitter_CBUUID_Service,
  45. CBUUID_Receive: cgmTransmitter_CBUUID_Receive,
  46. heartbeat: {}
  47. )
  48. return newBluetoothTransmitter
  49. } else {
  50. // looks like a coding error, xdrip4iOS did set a value for cgmTransmitterDeviceAddress in sharedUserDefaults but did not set a value for cgmTransmitter_CBUUID_Service or cgmTransmitter_CBUUID_Receive
  51. return nil
  52. }
  53. }
  54. return nil
  55. }
  56. }