blob: 38a825e91b229facd3075d7b20f64403b1a73e56 [file] [log] [blame]
/**
* 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.
*/
#pragma once
#include <app/clusters/boolean-state-configuration-server/boolean-state-configuration-delegate.h>
#include <app/server-cluster/DefaultServerCluster.h>
#include <app/server-cluster/OptionalAttributeSet.h>
#include <clusters/BooleanStateConfiguration/AttributeIds.h>
#include <clusters/BooleanStateConfiguration/ClusterId.h>
#include <lib/core/DataModelTypes.h>
#include <cstdint>
namespace chip::app::Clusters {
class BooleanStateConfigurationCluster : public DefaultServerCluster
{
public:
static constexpr uint8_t kMinSupportedSensitivityLevels = 2;
static constexpr uint8_t kMaxSupportedSensitivityLevels = 10;
using OptionalAttributesSet = OptionalAttributeSet< //
BooleanStateConfiguration::Attributes::DefaultSensitivityLevel::Id, // optional if sensitivity level feature is enabled
BooleanStateConfiguration::Attributes::AlarmsEnabled::Id, // optional if VIS or Aud enabled
BooleanStateConfiguration::Attributes::SensorFault::Id // fully optional
>;
using AlarmModeBitMask = chip::BitMask<BooleanStateConfiguration::AlarmModeBitmap>;
using SensorFaultBitMask = chip::BitMask<BooleanStateConfiguration::SensorFaultBitmap>;
struct StartupConfiguration
{
const uint8_t supportedSensitivityLevels;
const uint8_t defaultSensitivityLevel;
const AlarmModeBitMask alarmsSupported;
};
BooleanStateConfigurationCluster(EndpointId endpointId, BitMask<BooleanStateConfiguration::Feature> features,
OptionalAttributesSet optionalAttributes, const StartupConfiguration & config);
const BitMask<BooleanStateConfiguration::Feature> & GetFeatures() const { return mFeatures; }
void SetDelegate(BooleanStateConfiguration::Delegate * delegate) { mDelegate = delegate; }
BooleanStateConfiguration::Delegate * GetDelegate() const { return mDelegate; }
Protocols::InteractionModel::Status SetAlarmsActive(AlarmModeBitMask alarms);
/// Marks the given alarms as being suppressed.
///
/// Prerequisites:
/// - all input alarms MUST be supported
/// - all input alarms MUST be currently active
///
/// Treated as a NOOP (i.e. no delegate call and no event generated)
/// if the input alarms are already suppressed.
Protocols::InteractionModel::Status SuppressAlarms(AlarmModeBitMask alarms);
CHIP_ERROR SetCurrentSensitivityLevel(uint8_t level);
uint8_t GetCurrentSensitivityLevel() const { return mCurrentSensitivityLevel; }
/// Clears out all active and suppressed alarm bits.
///
/// Generates an `AlarmsStateChanged` event if any values are
/// cleared.
void ClearAllAlarms();
/// Sets the current sensor fault to the given fault value
/// and generates a new sensor fault event.
void GenerateSensorFault(SensorFaultBitMask fault);
/// Sets the active alarms as being all enabled alarms
Protocols::InteractionModel::Status SetAllEnabledAlarmsActive();
SensorFaultBitMask GetSensorFault() const { return mSensorFault; }
AlarmModeBitMask GetAlarmsActive() const { return mAlarmsActive; }
AlarmModeBitMask GetAlarmsSuppressed() const { return mAlarmsSuppressed; }
AlarmModeBitMask GetAlarmsEnabled() const { return mAlarmsEnabled; }
// ServerClusterInterface/DefaultServerCluster implementation
CHIP_ERROR Startup(ServerClusterContext & context) override;
DataModel::ActionReturnStatus ReadAttribute(const DataModel::ReadAttributeRequest & request,
AttributeValueEncoder & encoder) override;
DataModel::ActionReturnStatus WriteAttribute(const DataModel::WriteAttributeRequest & request,
AttributeValueDecoder & decoder) override;
CHIP_ERROR Attributes(const ConcreteClusterPath & path, ReadOnlyBufferBuilder<DataModel::AttributeEntry> & builder) override;
CHIP_ERROR AcceptedCommands(const ConcreteClusterPath & path,
ReadOnlyBufferBuilder<DataModel::AcceptedCommandEntry> & builder) override;
std::optional<DataModel::ActionReturnStatus> InvokeCommand(const DataModel::InvokeRequest & request,
chip::TLV::TLVReader & input_arguments,
CommandHandler * handler) override;
private:
// A superset of optional attributes, based on both real optional
// attributes and the feature map setting.
using FullOptionalAttributesSet = OptionalAttributeSet< //
BooleanStateConfiguration::Attributes::CurrentSensitivityLevel::Id, //
BooleanStateConfiguration::Attributes::SupportedSensitivityLevels::Id, // optional if sensitivity level feature is enabled
BooleanStateConfiguration::Attributes::DefaultSensitivityLevel::Id, //
BooleanStateConfiguration::Attributes::AlarmsActive::Id, //
BooleanStateConfiguration::Attributes::AlarmsSupported::Id, //
BooleanStateConfiguration::Attributes::AlarmsEnabled::Id, //
BooleanStateConfiguration::Attributes::AlarmsSuppressed::Id, //
BooleanStateConfiguration::Attributes::SensorFault::Id //
>;
const BitMask<BooleanStateConfiguration::Feature> mFeatures;
const FullOptionalAttributesSet mOptionalAttributes;
BooleanStateConfiguration::Delegate * mDelegate = nullptr;
// attributes that are maintained by this cluster
uint8_t mCurrentSensitivityLevel = 0;
const uint8_t mSupportedSensitivityLevels;
const uint8_t mDefaultSensitivityLevel;
AlarmModeBitMask mAlarmsActive{ 0 };
AlarmModeBitMask mAlarmsSuppressed{ 0 };
AlarmModeBitMask mAlarmsEnabled{ 0 };
const AlarmModeBitMask mAlarmsSupported;
SensorFaultBitMask mSensorFault{ 0 };
void GenerateAlarmsStateChangedEvent();
// Does NotifyAttributeChanged and also calls the delegate attribute changed callback
void OnClusterAttributeChanged(AttributeId attributeId);
};
} // namespace chip::app::Clusters