/* * * 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 #include #include #include #include #include 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 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 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 powerSettingNum, Optional 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