@@ -154,6 +154,10 @@ final class DeviceDataManager {
154154 self . lastTimerTick = Date ( )
155155
156156 self . cgmManager? . fetchNewDataIfNeeded ( with: self ) { ( result) in
157+ if case . newData = result {
158+ AnalyticsManager . shared. didFetchNewCGMData ( )
159+ }
160+
157161 // TODO: Isolate to queue?
158162 self . cgmManager ( self . cgmManager!, didUpdateWith: result)
159163 }
@@ -487,6 +491,16 @@ final class DeviceDataManager {
487491 return
488492 }
489493
494+ // Check if the clock should be reset
495+ if abs ( date. timeIntervalSinceNow) > . seconds( 20 ) {
496+ self . logger. addError ( " Pump clock is more than 20 seconds off. Resetting. " , fromSource: " RileyLink " )
497+ AnalyticsManager . shared. pumpTimeDidDrift ( date. timeIntervalSinceNow)
498+ try session. setTime { ( ) -> DateComponents in
499+ let calendar = Calendar ( identifier: . gregorian)
500+ return calendar. dateComponents ( [ . year, . month, . day, . hour, . minute, . second] , from: Date ( ) )
501+ }
502+ }
503+
490504 self . observeBatteryDuring {
491505 self . latestPumpStatus = status
492506 }
@@ -840,18 +854,6 @@ extension DeviceDataManager: LoopDataManagerDelegate {
840854 return
841855 }
842856
843- let notify = { ( result: Result < DoseEntry > ) -> Void in
844- // If we haven't fetched history in a while (preferredInsulinDataSource == .reservoir),
845- // let's try to do so while the pump radio is on.
846- if self . loopManager. doseStore. lastAddedPumpEvents. timeIntervalSinceNow < . minutes( - 4 ) {
847- self . fetchPumpHistory { ( _) in
848- completion ( result)
849- }
850- } else {
851- completion ( result)
852- }
853- }
854-
855857 pumpOps. runSession ( withName: " Set Temp Basal " , using: rileyLinkManager. firstConnectedDevice) { ( session) in
856858 guard let session = session else {
857859 completion ( . failure( LoopError . connectionError) )
@@ -864,15 +866,43 @@ extension DeviceDataManager: LoopDataManagerDelegate {
864866 let now = Date ( )
865867 let endDate = now. addingTimeInterval ( response. timeRemaining)
866868 let startDate = endDate. addingTimeInterval ( - basal. recommendation. duration)
867- notify ( . success( DoseEntry (
869+ completion ( . success( DoseEntry (
868870 type: . tempBasal,
869871 startDate: startDate,
870872 endDate: endDate,
871873 value: response. rate,
872874 unit: . unitsPerHour
873875 ) ) )
876+
877+ // Continue below
878+ } catch let error {
879+ completion ( . failure( error) )
880+ return
881+ }
882+
883+ do {
884+ // If we haven't fetched history in a while, our preferredInsulinDataSource is probably .reservoir, so
885+ // let's take advantage of the pump radio being on.
886+ if self . loopManager. doseStore. lastAddedPumpEvents. timeIntervalSinceNow < . minutes( - 4 ) {
887+ let clock = try session. getTime ( )
888+ // Check if the clock should be reset
889+ if let date = clock. date, abs ( date. timeIntervalSinceNow) > . seconds( 20 ) {
890+ self . logger. addError ( " Pump clock is more than 20 seconds off. Resetting. " , fromSource: " RileyLink " )
891+ AnalyticsManager . shared. pumpTimeDidDrift ( date. timeIntervalSinceNow)
892+ try session. setTime { ( ) -> DateComponents in
893+ let calendar = Calendar ( identifier: . gregorian)
894+ return calendar. dateComponents ( [ . year, . month, . day, . hour, . minute, . second] , from: Date ( ) )
895+ }
896+ }
897+
898+ self . fetchPumpHistory { ( error) in
899+ if let error = error {
900+ self . logger. addError ( " Post-basal history fetch failed: \( error) " , fromSource: " RileyLink " )
901+ }
902+ }
903+ }
874904 } catch let error {
875- notify ( . failure ( error) )
905+ self . logger . addError ( " Post-basal time sync failed: \( error) " , fromSource : " RileyLink " )
876906 }
877907 }
878908 }
0 commit comments