blob: e7c51f99e3298af28893c5c856ae2eecf57487b1 [file]
/**
*
* Copyright (c) 2025 Project CHIP Authors
*
* 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 <app/clusters/av-analysis-server/AvAnalysisCluster.h>
#include <app/reporting/reporting.h>
#include <app/server-cluster/AttributeListBuilder.h>
#include <app/util/util.h>
#include <clusters/CameraAvSettingsUserLevelManagement/Commands.h>
#include <clusters/CameraAvSettingsUserLevelManagement/Ids.h>
#include <clusters/CameraAvSettingsUserLevelManagement/Metadata.h>
#include <lib/core/CHIPSafeCasts.h>
#include <lib/support/DefaultStorageKeyAllocator.h>
#include <protocols/interaction_model/StatusCode.h>
namespace chip {
namespace app {
namespace Clusters {
using Protocols::InteractionModel::Status;
using namespace AvAnalysis;
CHIP_ERROR AvAnalysisCluster::AcceptedCommands(const ConcreteClusterPath & path,
ReadOnlyBufferBuilder<DataModel::AcceptedCommandEntry> & builder)
{
return mLogic.AcceptedCommands(builder);
}
CHIP_ERROR AvAnalysisCluster::Attributes(const ConcreteClusterPath & path,
ReadOnlyBufferBuilder<DataModel::AttributeEntry> & builder)
{
return mLogic.Attributes(builder);
}
CHIP_ERROR AvAnalysisCluster::Startup(ServerClusterContext & context)
{
ReturnErrorOnFailure(DefaultServerCluster::Startup(context));
mLogic.SetMarkDirtyCallback([this](AttributeId attributeId) { MarkAttributeDirty(attributeId); });
return mLogic.Startup(context.attributeStorage);
}
DataModel::ActionReturnStatus AvAnalysisCluster::ReadAttribute(const DataModel::ReadAttributeRequest & request,
AttributeValueEncoder & aEncoder)
{
switch (request.path.mAttributeId)
{
case Attributes::FeatureMap::Id:
return aEncoder.Encode(mLogic.mFeatures);
case Attributes::SupportedAmbientContexts::Id:
return mLogic.ReadAndEncodeSupportedAmbientContexts(aEncoder);
case Attributes::ActiveAmbientContextTriggers::Id:
return mLogic.ReadAndEncodeActiveAmbientContextTriggers(aEncoder);
case Attributes::MaxAnalysisStreamCount::Id:
return aEncoder.Encode(mLogic.mMaxAnalysisStreamCount);
case Attributes::CurrentAnalysisStreamCount::Id:
return aEncoder.Encode(mLogic.mCurrentAnalysisStreamCount);
case Attributes::AnalysisStreams::Id:
return mLogic.ReadAndEncodeAnalysisStreams(aEncoder);
case Attributes::TrackingEnabled::Id:
return aEncoder.Encode(mLogic.mTrackingEnabled);
}
return Status::UnsupportedAttribute;
}
DataModel::ActionReturnStatus AvAnalysisCluster::WriteAttribute(const DataModel::WriteAttributeRequest & request,
AttributeValueDecoder & aDecoder)
{
VerifyOrDie(request.path.mClusterId == AvAnalysis::Id);
switch (request.path.mAttributeId)
{
case Attributes::TrackingEnabled::Id: {
bool trackingEnabled;
ReturnErrorOnFailure(aDecoder.Decode(trackingEnabled));
return mLogic.SetTrackingEnabled(trackingEnabled);
}
default:
// Unknown attribute
return CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute);
}
}
CHIP_ERROR AvAnalysisCluster::SetMaxAnalysisStreamCount(uint8_t aMaxAnalysisStreamCount)
{
return mLogic.SetMaxAnalysisStreamCount(aMaxAnalysisStreamCount);
}
std::optional<DataModel::ActionReturnStatus> AvAnalysisCluster::InvokeCommand(const DataModel::InvokeRequest & request,
chip::TLV::TLVReader & input_arguments,
CommandHandler * handler)
{
ChipLogProgress(Zcl, "AvAnalysis[ep=%d]: InvokeCommand", request.path.mEndpointId);
switch (request.path.mCommandId)
{
case Commands::EnableContextTriggers::Id: {
ChipLogProgress(Zcl, "AvAnalysis[ep=%d]: Enabling Context Triggers", request.path.mEndpointId);
Commands::EnableContextTriggers::DecodableType data;
ReturnErrorOnFailure(data.Decode(input_arguments));
return mLogic.HandleEnableContextTriggers(*handler, request.path, data);
}
case Commands::DisableContextTriggers::Id: {
ChipLogProgress(Zcl, "AvAnalysis[ep=%d]: Disabling Context Triggers", request.path.mEndpointId);
Commands::DisableContextTriggers::DecodableType data;
ReturnErrorOnFailure(data.Decode(input_arguments));
return mLogic.HandleDisableContextTriggers(*handler, request.path, data);
}
case Commands::EstablishAnalysisStream::Id: {
ChipLogProgress(Zcl, "AvAnalysis[ep=%d]: Establishing Analysis Stream", request.path.mEndpointId);
Commands::EstablishAnalysisStream::DecodableType data;
ReturnErrorOnFailure(data.Decode(input_arguments));
return mLogic.HandleEstablishAnalysisStream(*handler, request.path, data);
}
case Commands::ActivateAnalysisStream::Id: {
ChipLogProgress(Zcl, "AvAnalysis[ep=%d]: Activating Analysis Stream", request.path.mEndpointId);
Commands::ActivateAnalysisStream::DecodableType data;
ReturnErrorOnFailure(data.Decode(input_arguments));
return mLogic.HandleActivateAnalysisStream(*handler, request.path, data);
}
case Commands::DeactivateAnalysisStream::Id: {
ChipLogProgress(Zcl, "AvAnalysis[ep=%d]: Deactivating Analysis Stream", request.path.mEndpointId);
Commands::DeactivateAnalysisStream::DecodableType data;
ReturnErrorOnFailure(data.Decode(input_arguments));
return mLogic.HandleDeactivateAnalysisStream(*handler, request.path, data);
}
case Commands::RemoveAnalysisStream::Id: {
ChipLogProgress(Zcl, "AvAnalysis[ep=%d]: Removing Analysis Stream", request.path.mEndpointId);
Commands::RemoveAnalysisStream::DecodableType data;
ReturnErrorOnFailure(data.Decode(input_arguments));
return mLogic.HandleRemoveAnalysisStream(*handler, request.path, data);
}
}
return Status::UnsupportedCommand;
}
} // namespace Clusters
} // namespace app
} // namespace chip