@@ -19,23 +19,29 @@ public struct TransmitterManagerState: RawRepresentable, Equatable {
1919 public var transmitterID : String
2020
2121 public var passiveModeEnabled : Bool = true
22+
23+ public var shouldSyncToRemoteService : Bool
2224
23- public init ( transmitterID: String ) {
25+ public init ( transmitterID: String , shouldSyncToRemoteService : Bool = false ) {
2426 self . transmitterID = transmitterID
27+ self . shouldSyncToRemoteService = shouldSyncToRemoteService
2528 }
2629
2730 public init ? ( rawValue: RawValue ) {
2831 guard let transmitterID = rawValue [ " transmitterID " ] as? String
2932 else {
3033 return nil
3134 }
35+
36+ let shouldSyncToRemoteService = rawValue [ " shouldSyncToRemoteService " ] as? Bool ?? false
3237
33- self . init ( transmitterID: transmitterID)
38+ self . init ( transmitterID: transmitterID, shouldSyncToRemoteService : shouldSyncToRemoteService )
3439 }
3540
3641 public var rawValue : RawValue {
3742 return [
38- " transmitterID " : transmitterID
43+ " transmitterID " : transmitterID,
44+ " shouldSyncToRemoteService " : shouldSyncToRemoteService,
3945 ]
4046 }
4147}
@@ -50,14 +56,47 @@ public class TransmitterManager: TransmitterDelegate {
5056 private var state : TransmitterManagerState
5157
5258 private let observers = WeakSynchronizedSet < TransmitterManagerObserver > ( )
59+
60+
5361
5462 public required init ( state: TransmitterManagerState ) {
5563 self . state = state
5664 self . transmitter = Transmitter ( id: state. transmitterID, passiveModeEnabled: state. passiveModeEnabled)
5765 self . shareManager = ShareClientManager ( )
5866
5967 self . transmitter. delegate = self
68+
69+ #if targetEnvironment(simulator)
70+ setupSimulatedSampleGenerator ( )
71+ #endif
72+
73+ }
74+
75+
76+ #if targetEnvironment(simulator)
77+ var simulatedSampleGeneratorTimer : DispatchSourceTimer ?
78+
79+ private func setupSimulatedSampleGenerator( ) {
80+
81+ let timer = DispatchSource . makeTimerSource ( queue: DispatchQueue ( label: " com.loopkit.simulatedSampleGenerator " ) )
82+ timer. schedule ( deadline: . now( ) + . seconds( 10 ) , repeating: . minutes( 5 ) )
83+ timer. setEventHandler ( handler: { [ weak self] in
84+ self ? . generateSimulatedSample ( )
85+ } )
86+ self . simulatedSampleGeneratorTimer = timer
87+ timer. resume ( )
88+ }
89+
90+ private func generateSimulatedSample( ) {
91+ let timestamp = Date ( )
92+ let syncIdentifier = " \( self . state. transmitterID) \( timestamp) "
93+ let period = TimeInterval ( hours: 3 )
94+ let glucoseValue = 100 + 20 * cos( Date ( ) . timeIntervalSinceReferenceDate. remainder ( dividingBy: period) / period * Double. pi * 2 )
95+ let quantity = HKQuantity ( unit: . milligramsPerDeciliter, doubleValue: glucoseValue)
96+ let sample = NewGlucoseSample ( date: timestamp, quantity: quantity, isDisplayOnly: false , syncIdentifier: syncIdentifier)
97+ self . updateDelegate ( with: . newData( [ sample] ) )
6098 }
99+ #endif
61100
62101 required convenience public init ? ( rawState: CGMManager . RawStateValue ) {
63102 guard let state = TransmitterManagerState ( rawValue: rawState) else {
@@ -71,7 +110,15 @@ public class TransmitterManager: TransmitterDelegate {
71110 return state. rawValue
72111 }
73112
74- public let shouldSyncToRemoteService = false
113+ public var shouldSyncToRemoteService : Bool {
114+ get {
115+ return state. shouldSyncToRemoteService
116+ }
117+ set {
118+ self . state. shouldSyncToRemoteService = newValue
119+ notifyDelegateOfStateChange ( )
120+ }
121+ }
75122
76123 public var cgmManagerDelegate : CGMManagerDelegate ? {
77124 get {
@@ -193,6 +240,15 @@ public class TransmitterManager: TransmitterDelegate {
193240
194241 notifyObserversOfLatestReading ( )
195242 }
243+
244+ private func notifyDelegateOfStateChange( ) {
245+ if let manager = self as? CGMManager {
246+ shareManager. delegate. notify { ( delegate) in
247+ delegate? . cgmManagerDidUpdateState ( manager)
248+ }
249+ }
250+ }
251+
196252
197253 // MARK: - TransmitterDelegate
198254
0 commit comments