-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ICD] Add read handler callback to negociate max sub interval (#24414)
* add max interval negociation * generic read handler * restyle * Address PR comments * Update naming used * Update gn argument name * Add class / function comments * Add an ICD build to efr32 workflow * Apply suggestions from code review Co-authored-by: Boris Zbarsky <[email protected]> * Address PR comments * restyle * Add fail safe checks to always have a valid maxInterval * PR comments Co-authored-by: Boris Zbarsky <[email protected]>
- Loading branch information
Showing
7 changed files
with
145 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
/* | ||
* | ||
* Copyright (c) 2023 Project CHIP Authors | ||
* All rights reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include "ICDSubscriptionCallback.h" | ||
#include <platform/CHIPDeviceConfig.h> | ||
|
||
CHIP_ERROR ICDSubscriptionCallback::OnSubscriptionRequested(chip::app::ReadHandler & aReadHandler, | ||
chip::Transport::SecureSession & aSecureSession) | ||
{ | ||
using namespace chip::System::Clock; | ||
|
||
Seconds32 interval_s32 = std::chrono::duration_cast<Seconds32>(CHIP_DEVICE_CONFIG_SED_IDLE_INTERVAL); | ||
|
||
if (interval_s32 > Seconds16::max()) | ||
{ | ||
interval_s32 = Seconds16::max(); | ||
} | ||
uint32_t decidedMaxInterval = interval_s32.count(); | ||
|
||
uint16_t requestedMinInterval = 0; | ||
uint16_t requestedMaxInterval = 0; | ||
aReadHandler.GetReportingIntervals(requestedMinInterval, requestedMaxInterval); | ||
|
||
// If requestedMinInterval is greater than IdleTimeInterval, select next wake up time as max interval | ||
if (requestedMinInterval > decidedMaxInterval) | ||
{ | ||
uint16_t ratio = requestedMinInterval / decidedMaxInterval; | ||
if (requestedMinInterval % decidedMaxInterval) | ||
{ | ||
ratio++; | ||
} | ||
|
||
decidedMaxInterval *= ratio; | ||
} | ||
|
||
// Verify that decidedMaxInterval is an acceptable value | ||
if (decidedMaxInterval > Seconds16::max().count()) | ||
{ | ||
decidedMaxInterval = Seconds16::max().count(); | ||
} | ||
|
||
// Verify that the decidedMaxInterval respects MAX(SUBSCRIPTION_MAX_INTERVAL_PUBLISHER_LIMIT, MaxIntervalCeiling) | ||
uint16_t maximumMaxInterval = std::max(kSubscriptionMaxIntervalPublisherLimit, requestedMaxInterval); | ||
if (decidedMaxInterval > maximumMaxInterval) | ||
{ | ||
decidedMaxInterval = maximumMaxInterval; | ||
} | ||
|
||
return aReadHandler.SetReportingIntervals(decidedMaxInterval); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* | ||
* | ||
* Copyright (c) 2023 Project CHIP Authors | ||
* All rights reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
#pragma once | ||
|
||
#include <app/ReadHandler.h> | ||
|
||
/** | ||
* @brief The goal of the ICDSubscriptionCallback class is to negotiate the max interval subscription to match the idle interval of | ||
* the IC device. When a subscription is requested, the device will change the requested max interval to match its idle time | ||
* interval through the OnSubscriptionRequested function. | ||
*/ | ||
class ICDSubscriptionCallback : public chip::app::ReadHandler::ApplicationCallback | ||
{ | ||
/** | ||
* @brief Function called when a subscription is requested. | ||
* An ICD will use this function to negotiate the subscription max interval to match its idle time interval | ||
*/ | ||
CHIP_ERROR OnSubscriptionRequested(chip::app::ReadHandler & aReadHandler, | ||
chip::Transport::SecureSession & aSecureSession) override; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters