/* * 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. */ #include #include #include #include namespace chip { namespace app { namespace Compatibility { namespace Internal { // On some apps, ATTRIBUTE_LARGEST can as small as 3, making compiler unhappy since data[kAttributeReadBufferSize] cannot hold // uint64_t. Make kAttributeReadBufferSize at least 8 so it can fit all basic types. constexpr size_t kAttributeReadBufferSize = (ATTRIBUTE_LARGEST >= 8 ? ATTRIBUTE_LARGEST : 8); uint8_t attributeIOBuffer[kAttributeReadBufferSize]; MutableByteSpan gEmberAttributeIOBufferSpan(attributeIOBuffer); EmberAfAttributeType AttributeBaseType(EmberAfAttributeType type) { switch (type) { case ZCL_ACTION_ID_ATTRIBUTE_TYPE: // Action Id case ZCL_FABRIC_IDX_ATTRIBUTE_TYPE: // Fabric Index case ZCL_BITMAP8_ATTRIBUTE_TYPE: // 8-bit bitmap case ZCL_ENUM8_ATTRIBUTE_TYPE: // 8-bit enumeration case ZCL_STATUS_ATTRIBUTE_TYPE: // Status Code case ZCL_PERCENT_ATTRIBUTE_TYPE: // Percentage static_assert(std::is_same::value, "chip::Percent is expected to be uint8_t, change this when necessary"); return ZCL_INT8U_ATTRIBUTE_TYPE; case ZCL_ENDPOINT_NO_ATTRIBUTE_TYPE: // Endpoint Number case ZCL_GROUP_ID_ATTRIBUTE_TYPE: // Group Id case ZCL_VENDOR_ID_ATTRIBUTE_TYPE: // Vendor Id case ZCL_ENUM16_ATTRIBUTE_TYPE: // 16-bit enumeration case ZCL_BITMAP16_ATTRIBUTE_TYPE: // 16-bit bitmap case ZCL_PERCENT100THS_ATTRIBUTE_TYPE: // 100ths of a percent static_assert(std::is_same::value, "chip::EndpointId is expected to be uint16_t, change this when necessary"); static_assert(std::is_same::value, "chip::GroupId is expected to be uint16_t, change this when necessary"); static_assert(std::is_same::value, "chip::Percent100ths is expected to be uint16_t, change this when necessary"); return ZCL_INT16U_ATTRIBUTE_TYPE; case ZCL_CLUSTER_ID_ATTRIBUTE_TYPE: // Cluster Id case ZCL_ATTRIB_ID_ATTRIBUTE_TYPE: // Attribute Id case ZCL_FIELD_ID_ATTRIBUTE_TYPE: // Field Id case ZCL_EVENT_ID_ATTRIBUTE_TYPE: // Event Id case ZCL_COMMAND_ID_ATTRIBUTE_TYPE: // Command Id case ZCL_TRANS_ID_ATTRIBUTE_TYPE: // Transaction Id case ZCL_DEVTYPE_ID_ATTRIBUTE_TYPE: // Device Type Id case ZCL_DATA_VER_ATTRIBUTE_TYPE: // Data Version case ZCL_BITMAP32_ATTRIBUTE_TYPE: // 32-bit bitmap case ZCL_EPOCH_S_ATTRIBUTE_TYPE: // Epoch Seconds case ZCL_ELAPSED_S_ATTRIBUTE_TYPE: // Elapsed Seconds static_assert(std::is_same::value, "chip::Cluster is expected to be uint32_t, change this when necessary"); static_assert(std::is_same::value, "chip::AttributeId is expected to be uint32_t, change this when necessary"); static_assert(std::is_same::value, "chip::AttributeId is expected to be uint32_t, change this when necessary"); static_assert(std::is_same::value, "chip::EventId is expected to be uint32_t, change this when necessary"); static_assert(std::is_same::value, "chip::CommandId is expected to be uint32_t, change this when necessary"); static_assert(std::is_same::value, "chip::TransactionId is expected to be uint32_t, change this when necessary"); static_assert(std::is_same::value, "chip::DeviceTypeId is expected to be uint32_t, change this when necessary"); static_assert(std::is_same::value, "chip::DataVersion is expected to be uint32_t, change this when necessary"); return ZCL_INT32U_ATTRIBUTE_TYPE; case ZCL_AMPERAGE_MA_ATTRIBUTE_TYPE: // Amperage milliamps case ZCL_ENERGY_MWH_ATTRIBUTE_TYPE: // Energy milliwatt-hours case ZCL_POWER_MW_ATTRIBUTE_TYPE: // Power milliwatts case ZCL_VOLTAGE_MV_ATTRIBUTE_TYPE: // Voltage millivolts return ZCL_INT64S_ATTRIBUTE_TYPE; case ZCL_EVENT_NO_ATTRIBUTE_TYPE: // Event Number case ZCL_FABRIC_ID_ATTRIBUTE_TYPE: // Fabric Id case ZCL_NODE_ID_ATTRIBUTE_TYPE: // Node Id case ZCL_BITMAP64_ATTRIBUTE_TYPE: // 64-bit bitmap case ZCL_EPOCH_US_ATTRIBUTE_TYPE: // Epoch Microseconds case ZCL_POSIX_MS_ATTRIBUTE_TYPE: // POSIX Milliseconds case ZCL_SYSTIME_MS_ATTRIBUTE_TYPE: // System time Milliseconds case ZCL_SYSTIME_US_ATTRIBUTE_TYPE: // System time Microseconds static_assert(std::is_same::value, "chip::EventNumber is expected to be uint64_t, change this when necessary"); static_assert(std::is_same::value, "chip::FabricId is expected to be uint64_t, change this when necessary"); static_assert(std::is_same::value, "chip::NodeId is expected to be uint64_t, change this when necessary"); return ZCL_INT64U_ATTRIBUTE_TYPE; case ZCL_TEMPERATURE_ATTRIBUTE_TYPE: // Temperature return ZCL_INT16S_ATTRIBUTE_TYPE; default: return type; } } } // namespace Internal } // namespace Compatibility } // namespace app } // namespace chip