/* * * Copyright (c) 2024 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 "service-area-cluster-objects.h" namespace chip { namespace app { namespace Clusters { namespace ServiceArea { class Instance; /** * ServiceArea::Delegate Defines methods for implementing application-specific * logic for the Service Area Cluster. */ class Delegate { public: Delegate() = default; virtual ~Delegate() = default; /** * Due to the coupling between the Delegate and Instance classes via the references they have to each other, * copying a Delegate object might make things confusing. */ Delegate(const Delegate &) = delete; Delegate & operator=(const Delegate &) = delete; /** * @brief This method will be called during the ServiceArea server initialization after the Instance information has been * validated and the Instance has been registered. This can be used to initialise app logic. */ virtual CHIP_ERROR Init() { return CHIP_NO_ERROR; }; /** * @brief Can the selected locations be set by the client in the current operating mode? * @param[out] statusText text describing why the selected locations cannot be set (if return is false). * Max size kMaxSizeStatusText. * Note: statusText must be successfully set if the return is false. Use CopyCharSpanToMutableCharSpanWithTruncation to * ensure that a message is copied successfully. Otherwise, ensure that if setting the statusText can fail (e.g., due * to exceeding kMaxSizeStatusText) the size of this value is set to 0 with .reduce_size(0) to avoid callers using * un-initialized memory. * @return true if the current device state allows selected locations to be set by user. * * @note The statusText field SHOULD indicate why the request is not allowed, given the current mode * of the device, which may involve other clusters. */ virtual bool IsSetSelectedAreasAllowed(MutableCharSpan & statusText) = 0; /** * Given a set of locations to be set to the SelectedAreas attribute, this method should check that * the set of locations as a whole is valid and reachable by the device. * If the set of locations is invalid, the locationStatus should be set to InvalidSet and * the statusText SHALL include a vendor-defined error description. * * The caller of this method will ensure that there are no duplicates in the list * and that all the locations in the set are valid supported locations. * * @param[in] selectedAreas List of new selected locations. * @param[out] locationStatus Success if all checks pass, error code if failure. * @param[out] statusText text describing failure (see description above). Max size kMaxSizeStatusText. * Note: statusText must be successfully set if the return is false. Use CopyCharSpanToMutableCharSpanWithTruncation to * ensure that a message is copied successfully. Otherwise, ensure that if setting the statusText can fail (e.g., due * to exceeding kMaxSizeStatusText) the size of this value is set to 0 with .reduce_size(0) to avoid callers using * un-initialized memory. * @return true if success. * * @note If the SelectAreas command is allowed when the device is operating and the selected locations change to none, the * device must stop. */ virtual bool IsValidSelectAreasSet(const Span & selectedAreas, SelectAreasStatus & locationStatus, MutableCharSpan & statusText) = 0; /** * @brief The server instance ensures that the SelectedAreas and CurrentArea attributes are not null before * calling this method. * @param[in] skippedArea the area ID to skip. * @param[out] skipStatusText text describing why the current location cannot be skipped. Max size kMaxSizeStatusText. * Note: skipStatusText must be successfully set if the return is false. Use CopyCharSpanToMutableCharSpanWithTruncation to * ensure that a message is copied successfully. Otherwise, ensure that if setting the skipStatusText can fail (e.g., due * to exceeding kMaxSizeStatusText) the size of this value is set to 0 with .reduce_size(0) to avoid callers using * un-initialized memory. * @return true if command is successful, false if the received skip request cannot be handled due to the current mode of the * device. * * @note skipStatusText must be filled out by the function on failure. * * @note If the device accepts the request: * - If the device is currently operating at the area identified by SkippedArea, as indicated by either the CurrentArea or * the Progress attributes, if implemented, the device SHALL stop operating at that area. * - If the Progress attribute is implemented, the entry corresponding to SkippedArea SHALL be updated to indicate that the * area was skipped. * - The server SHALL attempt to operate only at the areas in the SelectedAreas attribute list where operating has not been * skipped or completed, using a vendor defined order. * - If the server has either skipped or completed operating at all areas on the SelectedAreas attribute list, the server * SHALL stop operating. * * @note If the Status field is set to InvalidAreaList, the StatusText field SHALL be an empty string. * If the Status field is not set to Success, or InvalidAreaList, the StatusText field SHALL include a vendor defined * error description which can be used to explain the error to the user. For example, if the Status field is set to * InvalidInMode, the StatusText field SHOULD indicate why the request is not allowed, given the current mode of the * device, which may involve other clusters. */ virtual bool HandleSkipArea(uint32_t skippedArea, MutableCharSpan & skipStatusText) { // device support of this command is optional CopyCharSpanToMutableCharSpanWithTruncation("Skip Current Area command not supported by device"_span, skipStatusText); return false; } /** * @return true if the current device state allows the SupportedAreas attribute to be updated. * * @note The SupportedAreas attribute list changes (adding or deleting entries, * changing their MapID fields, changing the AreaID fields, or nulling the entire list) * SHOULD NOT be allowed while the device is operating, to reduce the impact on the clients, * and the potential confusion for the users. * * @note The device implementation MAY allow supported location changes while operating if the device * repopulates the SupportedMaps, SupportedAreas, CurrentArea, and Progress attributes with * data matching the constraints listed in the requirements for each attribute. */ virtual bool IsSupportedAreasChangeAllowed() = 0; /** * @return true if the current device state allows the SupportedMaps attribute to be updated. * * @note The SupportedMaps attribute list changes (adding or deleting entries, * changing their MapID fields, or nulling the entire list) * SHOULD NOT be allowed while the device is operating, to reduce the impact on the clients, * and the potential confusion for the users. * * @note The device implementation MAY allow supported maps changes while operating if the device * repopulates the SupportedAreas, CurrentArea, and Progress attributes with * data matching the constraints listed in the requirements for each attribute. */ virtual bool IsSupportedMapChangeAllowed() = 0; Instance * GetInstance() { return mInstance; } void SetInstance(Instance * aInstance) { mInstance = aInstance; } private: Instance * mInstance = nullptr; }; } // namespace ServiceArea } // namespace Clusters } // namespace app } // namespace chip