blob: ef77717bc154806ebcdc2b427cee65a7a50405c6 [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.
*/
#pragma once
#include <app-common/zap-generated/cluster-objects.h>
#include <app/AttributeAccessInterface.h>
#include <app/CommandHandlerInterface.h>
#include <app/clusters/mode-base-server/mode-base-server.h>
#include <app/clusters/operational-state-server/operational-state-server.h>
#include <protocols/interaction_model/StatusCode.h>
namespace chip {
namespace app {
namespace Clusters {
namespace MicrowaveOvenControl {
constexpr uint32_t kDefaultCookTimeSec = 30u;
constexpr uint32_t kMinCookTimeSec = 1u;
constexpr uint8_t kDefaultMinPowerNum = 10u;
constexpr uint8_t kDefaultMaxPowerNum = 100u;
constexpr uint8_t kDefaultPowerStepNum = 10u;
class Delegate;
class Instance : public CommandHandlerInterface, public AttributeAccessInterface
{
public:
/**
* @brief Creates a Microwave Oven Control cluster instance. The Init() function needs to be called for this instance
* to be registered and called by the interaction model at the appropriate times.
* @param aDelegate A pointer to the delegate to be used by this server.
* Note: the caller must ensure that the delegate lives throughout the instance's lifetime.
* @param aEndpointId The endpoint on which this cluster exists. This must match the zap configuration.
* @param aClusterId The ID of the Microwave Oven Control cluster to be instantiated.
* @param aFeature The bitmask value that identifies which features are supported by this instance.
* @param aOpStateInstance The reference of Operational State Instance.
* @param aMicrowaveOvenModeInstance The reference of Microwave Oven Mode Instance.
* Note: a MicrowaveOvenControl instance must relies on an Operational State instance and a Microwave Oven Mode instance.
* Caller must ensure those 2 instances are live and initialized before initializing MicorwaveOvenControl instance.
*/
Instance(Delegate * aDelegate, EndpointId aEndpointId, ClusterId aClusterId, BitMask<MicrowaveOvenControl::Feature> aFeature,
Clusters::OperationalState::Instance & aOpStateInstance, Clusters::ModeBase::Instance & aMicrowaveOvenModeInstance);
~Instance() override;
/**
* @brief Initialise the Microwave Oven Control server instance.
* This function must be called after defining an Instance class object.
* @return Returns an error if the given endpoint and cluster ID have not been enabled in zap or if the
* CommandHandler or AttributeHandler registration fails, else returns CHIP_NO_ERROR.
* This method also checks if the feature setting is valid, if invalid it will returns CHIP_ERROR_INVALID_ARGUMENT.
*/
CHIP_ERROR Init();
bool HasFeature(MicrowaveOvenControl::Feature feature) const;
uint8_t GetCountOfSupportedWattLevels() const;
uint32_t GetCookTimeSec() const;
void SetCookTimeSec(uint32_t cookTimeSec);
private:
Delegate * mDelegate;
EndpointId mEndpointId;
ClusterId mClusterId;
BitMask<MicrowaveOvenControl::Feature> mFeature;
Clusters::OperationalState::Instance & mOpStateInstance;
Clusters::ModeBase::Instance & mMicrowaveOvenModeInstance;
uint32_t mCookTimeSec = kDefaultCookTimeSec;
uint8_t mSupportedWattLevels = 0;
/**
* IM-level implementation of read
* @return appropriately mapped CHIP_ERROR if applicable
*/
CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override;
/**
* @brief Inherited from CommandHandlerInterface
*/
void InvokeCommand(HandlerContext & ctx) override;
/**
* @brief Handle Command: SetCookingParameters.
* @param ctx Returns the Interaction Model status code which was user determined in the business logic.
* If the input value is invalid, returns the Interaction Model status code of INVALID_COMMAND.
* If the operational state is not in 'Stopped', returns the Interaction Model status code of INVALID_IN_STATE.
*/
void HandleSetCookingParameters(HandlerContext & ctx, const Commands::SetCookingParameters::DecodableType & req);
/**
* @brief Handle Command: AddMoreTime.
* @param ctx Returns the Interaction Model status code which was user determined in the business logic.
* If the cook time value is out of range, returns the Interaction Model status code of CONSTRAINT_ERROR.
* If the operational state is in 'Error', returns the Interaction Model status code of INVALID_IN_STATE.
*/
void HandleAddMoreTime(HandlerContext & ctx, const Commands::AddMoreTime::DecodableType & req);
};
/** @brief
* Defines methods for implementing application-specific logic for the MicrowaveOvenControl Cluster.
*/
class Delegate
{
public:
Delegate() = default;
virtual ~Delegate() = default;
/**
* @brief Handle Command Callback in application: SetCookingParameters.
* @return Returns the Interaction Model status code which was user determined in the business logic.
* @param cookMode: the input cook mode value. Callee needs to define the cooking mode value in the Microwave Oven Mode
* instance.
* @param cookTimeSec: the input cook time value.
* @param startAfterSetting: if true, the cooking operation will start after handling the command.
* @param powerSettingNum: the input power setting value.
* @param wattSettingIndex: the input watts setting index.
* Note: powerSettingNum and wattSettingIndex must be mutually exclusive.
* If using power as number, wattSettingIndex will be set to NullOptional.
* If using power in watts, powerSettingNum will be set to NullOptional.
*/
virtual Protocols::InteractionModel::Status HandleSetCookingParametersCallback(uint8_t cookMode, uint32_t cookTimeSec,
bool startAfterSetting,
Optional<uint8_t> powerSettingNum,
Optional<uint8_t> wattSettingIndex) = 0;
/**
* @brief Handle Command Callback in application: AddMoreTime.
* @return Returns the Interaction Model status code which was user determined in the business logic.
* @param finalCookTimeSec: the cook time value after adding input time.
*/
virtual Protocols::InteractionModel::Status HandleModifyCookTimeSecondsCallback(uint32_t finalCookTimeSec) = 0;
/**
* Get the watt setting from the supported watts list.
* @param index The index of the watt setting to be returned. It is assumed that watt setting are indexable from 0 and with no
* gaps.
* @param wattSetting A reference to receive the watt setting on success.
* @return Returns a CHIP_NO_ERROR if there was no error and the label was returned successfully,
* CHIP_ERROR_NOT_FOUND if the index in beyond the list of available labels.
*/
virtual CHIP_ERROR GetWattSettingByIndex(uint8_t index, uint16_t & wattSetting) = 0;
virtual uint32_t GetMaxCookTimeSec() const = 0;
virtual uint8_t GetPowerSettingNum() const = 0;
virtual uint8_t GetMinPowerNum() const = 0;
virtual uint8_t GetMaxPowerNum() const = 0;
virtual uint8_t GetPowerStepNum() const = 0;
virtual uint8_t GetCurrentWattIndex() const = 0;
virtual uint16_t GetWattRating() const = 0;
private:
friend class Instance;
Instance * mInstance = nullptr;
/**
* This method is used by the SDK to set the instance pointer. This is done during the instantiation of a Instance object.
* @param aInstance A pointer to the Instance object related to this delegate object.
*/
void SetInstance(Instance * aInstance) { mInstance = aInstance; }
protected:
Instance * GetInstance() const { return mInstance; }
};
/**
* @brief Check if the given cook time is in range.
*/
bool IsCookTimeSecondsInRange(uint32_t cookTimeSec, uint32_t maxCookTimeSec);
/**
* @brief Check if the given cooking power is in range.
*/
bool IsPowerSettingNumberInRange(uint8_t powerSettingNum, uint8_t minCookPowerNum, uint8_t maxCookPowerNum);
} // namespace MicrowaveOvenControl
} // namespace Clusters
} // namespace app
} // namespace chip