blob: 30fbf683e6e8dcf585660f68e4020e09c8dffc9f [file] [log] [blame]
/*
*
* 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);
}