@@ -174,15 +174,16 @@ + (instancetype)deviceWithNodeID:(NSNumber *)nodeID controller:(MTRDeviceControl
174
174
#pragma mark Subscription and delegate handling
175
175
176
176
// subscription intervals are in seconds
177
- #define MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_DEFAULT (3600 )
177
+ #define MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_MIN (2 )
178
+ #define MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_MAX (60 )
178
179
179
180
- (void )setDelegate : (id <MTRDeviceDelegate>)delegate queue : (dispatch_queue_t )queue
180
181
{
181
182
os_unfair_lock_lock (&self->_lock );
182
183
183
184
_weakDelegate = [MTRWeakReference weakReferenceWithObject: delegate];
184
185
_delegateQueue = queue;
185
- [self subscribeWithMinInterval: 0 maxInterval: MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_DEFAULT ];
186
+ [self setupSubscription ];
186
187
187
188
os_unfair_lock_unlock (&self->_lock );
188
189
}
@@ -285,7 +286,7 @@ - (void)_handleEventReport:(NSArray<NSDictionary<NSString *, id> *> *)eventRepor
285
286
os_unfair_lock_unlock (&self->_lock );
286
287
}
287
288
288
- - (void )subscribeWithMinInterval : ( uint16_t ) minInterval maxInterval : ( uint16_t ) maxInterval
289
+ - (void )setupSubscription
289
290
{
290
291
// for now just subscribe once
291
292
if (_subscriptionActive) {
@@ -310,8 +311,19 @@ - (void)subscribeWithMinInterval:(uint16_t)minInterval maxInterval:(uint16_t)max
310
311
// We want to get event reports at the minInterval, not the maxInterval.
311
312
eventPath->mIsUrgentEvent = true ;
312
313
ReadPrepareParams readParams (session.Value ());
313
- readParams.mMinIntervalFloorSeconds = minInterval;
314
- readParams.mMaxIntervalCeilingSeconds = maxInterval;
314
+
315
+ readParams.mMinIntervalFloorSeconds = 0 ;
316
+ // Select a max interval based on the device's claimed idle sleep interval.
317
+ auto idleSleepInterval = std::chrono::duration_cast<System::Clock::Seconds32>(
318
+ session.Value ()->GetRemoteMRPConfig ().mIdleRetransTimeout );
319
+ if (idleSleepInterval.count () < MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_MIN) {
320
+ idleSleepInterval = System::Clock::Seconds32 (MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_MIN);
321
+ }
322
+ if (idleSleepInterval.count () > MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_MAX) {
323
+ idleSleepInterval = System::Clock::Seconds32 (MTR_DEVICE_SUBSCRIPTION_MAX_INTERVAL_MAX);
324
+ }
325
+ readParams.mMaxIntervalCeilingSeconds = static_cast <uint16_t >(idleSleepInterval.count ());
326
+
315
327
readParams.mpAttributePathParamsList = attributePath.get ();
316
328
readParams.mAttributePathParamsListSize = 1 ;
317
329
readParams.mpEventPathParamsList = eventPath.get ();
0 commit comments