blob: afa8bf88012f546c3c84ab6cc2c10d1ad44b8c1e [file] [log] [blame]
/**
*
* Copyright (c) 2024 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/ConcreteAttributePath.h>
#include <app/util/af-types.h>
#include <app/util/attribute-metadata.h>
#include <lib/core/DataModelTypes.h>
#include <protocols/interaction_model/StatusCode.h>
#include <cstdint>
struct EmberAfWriteDataInput
{
// Where the input data originates from.
//
// NOTE: at this time there is no information regarding
// input buffer size and it is assumed "correct" for the given data type.
//
// NOTE: technically this should be `const uint8_t*`, however ember internal logic uses a
// `emAfReadOrWriteAttribute` method and because of the duality of read/write it needs
// a non-const input. This is odd and should probably be fixed.
uint8_t * dataPtr;
// The data type that dataPtr points to
EmberAfAttributeType dataType;
// Controls when `changeListener` is called to flag an attribute dirty. It allows for things like:
// kIfChanged - only if the dataPtr contains a different value than what currenty exists
// kNo - never called
// kYes - always called
chip::app::MarkAttributeDirty markDirty = chip::app::MarkAttributeDirty::kIfChanged;
// Listener called when when the written data is consided changed/dirty.
// This being called depends on settings of `markDirty` combined with the actual contents of dataPtr
// vs the contents of the current attribute storage.
chip::app::AttributesChangedListener * changeListener = nullptr;
EmberAfWriteDataInput(uint8_t * data, EmberAfAttributeType type) : dataPtr(data), dataType(type) {}
EmberAfWriteDataInput & SetMarkDirty(chip::app::MarkAttributeDirty value)
{
markDirty = value;
return *this;
}
EmberAfWriteDataInput & SetChangeListener(chip::app::AttributesChangedListener * listener)
{
changeListener = listener;
return *this;
}
};
/**
* @brief write an attribute, performing all the checks.
*
* TODO: what are "all the checks"? There are limitations below
* and generally input data pointer does not even have a size,
* hence data validity check capabilities seem limited.
*
* This function will attempt to write the attribute value from
* the provided pointer. This function will only check that the
* attribute exists. If it does it will write the value into
* the attribute table for the given attribute.
*
* This function will not check to see if the attribute is
* writable since the read only / writable characteristic
* of an attribute only pertains to external devices writing
* over the air. Because this function is being called locally
* it assumes that the device knows what it is doing and has permission
* to perform the given operation.
*
* This function also does NOT check that the input dataType matches the expected
* data type (as Accessors.h/cpp have this correct by default).
* TODO: this not checking seems off - what if this is run without Accessors.h ?
*/
chip::Protocols::InteractionModel::Status emberAfWriteAttribute(const chip::app::ConcreteAttributePath & path,
const EmberAfWriteDataInput & input);
/**
* Override of emberAfWriteAttribute to reduce code size for calls that default
* markDirty/changeListener and any other future customization calls.
*/
chip::Protocols::InteractionModel::Status emberAfWriteAttribute(chip::EndpointId endpoint, chip::ClusterId cluster,
chip::AttributeId attributeID, uint8_t * dataPtr,
EmberAfAttributeType dataType);
/**
* @brief Read the attribute value, performing all the checks.
*
* This function will attempt to read the attribute and store it into the
* pointer.
*
* dataPtr may be NULL, signifying that we don't need the value, just the status
* (i.e. whether the attribute can be read).
*/
chip::Protocols::InteractionModel::Status emberAfReadAttribute(chip::EndpointId endpoint, chip::ClusterId cluster,
chip::AttributeId attributeID, uint8_t * dataPtr,
uint16_t readLength);