blob: 37bd1f6bd11a83442e879c8884cfb75dc3a9a2f7 [file] [log] [blame]
/**
*
* Copyright (c) 2023 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.
*/
/**
* @file
* APIs and defines for the Smoke CO Alarm Server plugin.
*
*/
#pragma once
#include <app-common/zap-generated/cluster-objects.h>
#include <app/CommandHandler.h>
#include <app/util/af.h>
/**
* @brief Smoke CO Alarm Server Plugin class
*/
class SmokeCoAlarmServer
{
public:
static SmokeCoAlarmServer & Instance();
/* Expected byte size of the PriorityOrder */
static constexpr size_t kPriorityOrderLength = 8;
using AlarmStateEnum = chip::app::Clusters::SmokeCoAlarm::AlarmStateEnum;
using ContaminationStateEnum = chip::app::Clusters::SmokeCoAlarm::ContaminationStateEnum;
using EndOfServiceEnum = chip::app::Clusters::SmokeCoAlarm::EndOfServiceEnum;
using ExpressedStateEnum = chip::app::Clusters::SmokeCoAlarm::ExpressedStateEnum;
using Feature = chip::app::Clusters::SmokeCoAlarm::Feature;
using MuteStateEnum = chip::app::Clusters::SmokeCoAlarm::MuteStateEnum;
using SensitivityEnum = chip::app::Clusters::SmokeCoAlarm::SensitivityEnum;
/**
* @brief Set the highest level of Expressed State according to priorityOrder
* @param endpointId ID of the endpoint
* @param priorityOrder Priority order of expressed state from highest to lowest
*/
void SetExpressedStateByPriority(chip::EndpointId endpointId,
const std::array<ExpressedStateEnum, kPriorityOrderLength> & priorityOrder);
/**
* @brief Request self-test when receiving local commands
* @param endpointId ID of the endpoint
* @return true on success, false on failure
*/
bool RequestSelfTest(chip::EndpointId endpointId);
/**
* For all the functions below, the return value is true on success, false on failure
*/
bool SetSmokeState(chip::EndpointId endpointId, AlarmStateEnum newSmokeState);
bool SetCOState(chip::EndpointId endpointId, AlarmStateEnum newCOState);
bool SetBatteryAlert(chip::EndpointId endpointId, AlarmStateEnum newBatteryAlert);
bool SetDeviceMuted(chip::EndpointId endpointId, MuteStateEnum newDeviceMuted);
bool SetTestInProgress(chip::EndpointId endpointId, bool newTestInProgress);
bool SetHardwareFaultAlert(chip::EndpointId endpointId, bool newHardwareFaultAlert);
bool SetEndOfServiceAlert(chip::EndpointId endpointId, EndOfServiceEnum newEndOfServiceAlert);
bool SetInterconnectSmokeAlarm(chip::EndpointId endpointId, AlarmStateEnum newInterconnectSmokeAlarm);
bool SetInterconnectCOAlarm(chip::EndpointId endpointId, AlarmStateEnum newInterconnectCOAlarm);
bool SetContaminationState(chip::EndpointId endpointId, ContaminationStateEnum newContaminationState);
bool SetSmokeSensitivityLevel(chip::EndpointId endpointId, SensitivityEnum newSmokeSensitivityLevel);
bool GetExpressedState(chip::EndpointId endpointId, ExpressedStateEnum & expressedState);
bool GetSmokeState(chip::EndpointId endpointId, AlarmStateEnum & smokeState);
bool GetCOState(chip::EndpointId endpointId, AlarmStateEnum & coState);
bool GetBatteryAlert(chip::EndpointId endpointId, AlarmStateEnum & batteryAlert);
bool GetDeviceMuted(chip::EndpointId endpointId, MuteStateEnum & deviceMuted);
bool GetTestInProgress(chip::EndpointId endpointId, bool & testInProgress);
bool GetHardwareFaultAlert(chip::EndpointId endpointId, bool & hardwareFaultAlert);
bool GetEndOfServiceAlert(chip::EndpointId endpointId, EndOfServiceEnum & endOfServiceAlert);
bool GetInterconnectSmokeAlarm(chip::EndpointId endpointId, AlarmStateEnum & interconnectSmokeAlarm);
bool GetInterconnectCOAlarm(chip::EndpointId endpointId, AlarmStateEnum & interconnectCOAlarm);
bool GetContaminationState(chip::EndpointId endpointId, ContaminationStateEnum & contaminationState);
bool GetSmokeSensitivityLevel(chip::EndpointId endpointId, SensitivityEnum & smokeSensitivityLevel);
bool GetExpiryDate(chip::EndpointId endpointId, uint32_t & expiryDate);
chip::BitFlags<Feature> GetFeatures(chip::EndpointId endpointId);
inline bool SupportsSmokeAlarm(chip::EndpointId endpointId) { return GetFeatures(endpointId).Has(Feature::kSmokeAlarm); }
inline bool SupportsCOAlarm(chip::EndpointId endpointId) { return GetFeatures(endpointId).Has(Feature::kCoAlarm); }
private:
/**
* @brief Updates the expressed state with new value
*
* @note If the value of ExpressedState is not Normal, the attribute corresponding to the value should not be Normal.
*
* @param endpointId ID of the endpoint
* @param newExpressedState new expressed state
*/
void SetExpressedState(chip::EndpointId endpointId, ExpressedStateEnum newExpressedState);
/**
* @brief Common handler for SelfTestRequest commands
*
* @param commandObj original command context
* @param commandPath original command path
*/
void HandleRemoteSelfTestRequest(chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath);
/**
* @brief Send generic event
*
* @tparam T Any event type supported by Matter
* @param endpointId endpoint where SmokeCoAlarmServer is running
* @param event event object built by caller
*/
template <typename T>
void SendEvent(chip::EndpointId endpointId, T & event);
/**
* @brief Get generic attribute value
*
* @tparam T attribute value type
* @param endpointId endpoint where SmokeCoAlarmServer is running
* @param attributeId attribute Id (used for logging only)
* @param getFn attribute getter function as defined in <Accessors.h>
* @param value actual attribute value on success
* @return true on success (value is set to the actual attribute value)
* @return false if attribute reading failed (value is kept unchanged)
*/
template <typename T>
bool GetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId,
EmberAfStatus (*getFn)(chip::EndpointId endpointId, T * value), T & value) const;
/**
* @brief Set generic attribute value
*
* @tparam T attribute value type
* @param endpointId endpoint where SmokeCoAlarmServer is running
* @param attributeId attribute Id (used for logging only)
* @param setFn attribute setter function as defined in <Accessors.h>
* @param value new attribute value
* @return true on success
* @return false if attribute writing failed
*/
template <typename T>
bool SetAttribute(chip::EndpointId endpointId, chip::AttributeId attributeId,
EmberAfStatus (*setFn)(chip::EndpointId endpointId, T value), T value);
friend bool emberAfSmokeCoAlarmClusterSelfTestRequestCallback(
chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
const chip::app::Clusters::SmokeCoAlarm::Commands::SelfTestRequest::DecodableType & commandData);
static SmokeCoAlarmServer sInstance;
};
// =============================================================================
// Plugin callbacks that are called by cluster server and should be implemented
// by the server app
// =============================================================================
/**
* @brief User handler for SelfTestRequest command (server)
*
* @note The application must set the ExpressedState to "Testing"
*
* @param endpointId endpoint for which SelfTestRequest command is called
*/
void emberAfPluginSmokeCoAlarmSelfTestRequestCommand(chip::EndpointId endpointId);