LCOV - code coverage report
Current view: top level - lib/core - DataModelTypes.h (source / functions) Hit Total Coverage
Test: lcov_final.info Lines: 37 37 100.0 %
Date: 2024-02-15 08:20:41 Functions: 11 11 100.0 %

          Line data    Source code
       1             : /*
       2             :  *
       3             :  *    Copyright (c) 2021-2023 Project CHIP Authors
       4             :  *
       5             :  *    Licensed under the Apache License, Version 2.0 (the "License");
       6             :  *    you may not use this file except in compliance with the License.
       7             :  *    You may obtain a copy of the License at
       8             :  *
       9             :  *        http://www.apache.org/licenses/LICENSE-2.0
      10             :  *
      11             :  *    Unless required by applicable law or agreed to in writing, software
      12             :  *    distributed under the License is distributed on an "AS IS" BASIS,
      13             :  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      14             :  *    See the License for the specific language governing permissions and
      15             :  *    limitations under the License.
      16             :  */
      17             : 
      18             : #pragma once
      19             : 
      20             : #include <cstdint>
      21             : 
      22             : #include <lib/core/CHIPConfig.h>
      23             : #include <lib/core/CHIPVendorIdentifiers.hpp> // For VendorId
      24             : #include <lib/core/GroupId.h>
      25             : #include <lib/core/NodeId.h>
      26             : #include <lib/core/PasscodeId.h>
      27             : 
      28             : namespace chip {
      29             : 
      30             : typedef uint8_t ActionId;
      31             : typedef uint32_t AttributeId;
      32             : typedef uint32_t ClusterId;
      33             : typedef uint8_t ClusterStatus;
      34             : typedef uint32_t CommandId;
      35             : typedef uint16_t CommandRef;
      36             : typedef uint64_t CompressedFabricId;
      37             : typedef uint32_t DataVersion;
      38             : typedef uint32_t DeviceTypeId;
      39             : typedef uint16_t EndpointId;
      40             : typedef uint32_t EventId;
      41             : typedef uint64_t EventNumber;
      42             : typedef uint64_t FabricId;
      43             : typedef uint8_t FabricIndex;
      44             : typedef uint32_t FieldId;
      45             : typedef uint16_t ListIndex;
      46             : typedef uint16_t LocalizedStringIdentifier;
      47             : typedef uint32_t TransactionId;
      48             : typedef uint16_t KeysetId;
      49             : typedef uint8_t InteractionModelRevision;
      50             : typedef uint32_t SubscriptionId;
      51             : typedef uint8_t SceneId;
      52             : 
      53             : inline constexpr CompressedFabricId kUndefinedCompressedFabricId = 0ULL;
      54             : inline constexpr FabricId kUndefinedFabricId                     = 0ULL;
      55             : 
      56             : inline constexpr FabricIndex kUndefinedFabricIndex = 0;
      57             : inline constexpr FabricIndex kMinValidFabricIndex  = 1;
      58             : inline constexpr FabricIndex kMaxValidFabricIndex  = UINT8_MAX - 1;
      59             : 
      60             : inline constexpr EndpointId kInvalidEndpointId = 0xFFFF;
      61             : inline constexpr EndpointId kRootEndpointId    = 0;
      62             : inline constexpr ListIndex kInvalidListIndex   = 0xFFFF; // List index is a uint16 thus 0xFFFF is a invalid list index.
      63             : inline constexpr KeysetId kInvalidKeysetId     = 0xFFFF;
      64             : 
      65             : // Invalid IC identifier is provisional. Value will most likely change when identifying token is defined
      66             : // https://github.com/project-chip/connectedhomeip/issues/24251
      67             : inline constexpr uint64_t kInvalidIcId = 0;
      68             : 
      69             : // These are MEIs, 0xFFFF is not a valid manufacturer code,
      70             : // thus 0xFFFF'FFFF is not a valid MEI.
      71             : static constexpr ClusterId kInvalidClusterId     = 0xFFFF'FFFF;
      72             : static constexpr AttributeId kInvalidAttributeId = 0xFFFF'FFFF;
      73             : static constexpr CommandId kInvalidCommandId     = 0xFFFF'FFFF;
      74             : static constexpr EventId kInvalidEventId         = 0xFFFF'FFFF;
      75             : static constexpr FieldId kInvalidFieldId         = 0xFFFF'FFFF;
      76             : 
      77             : static constexpr uint16_t kMaxVendorId = VendorId::TestVendor4;
      78             : 
      79       30044 : static constexpr uint16_t ExtractIdFromMEI(uint32_t aMEI)
      80             : {
      81       30044 :     constexpr uint32_t kIdMask = 0x0000'FFFF;
      82       30044 :     return static_cast<uint16_t>(aMEI & kIdMask);
      83             : }
      84             : 
      85       30044 : static constexpr uint16_t ExtractVendorFromMEI(uint32_t aMEI)
      86             : {
      87       30044 :     constexpr uint32_t kVendorMask  = 0xFFFF'0000;
      88       30044 :     constexpr uint32_t kVendorShift = 16;
      89       30044 :     return static_cast<uint16_t>((aMEI & kVendorMask) >> kVendorShift);
      90             : }
      91             : 
      92       27218 : static constexpr bool IsValidVendorId(uint16_t aVendorId)
      93             : {
      94       27218 :     return aVendorId <= kMaxVendorId;
      95             : }
      96             : 
      97       18426 : constexpr bool IsValidClusterId(ClusterId aClusterId)
      98             : {
      99       18426 :     const auto id     = ExtractIdFromMEI(aClusterId);
     100       18426 :     const auto vendor = ExtractVendorFromMEI(aClusterId);
     101             :     // Cluster id suffixes in the range 0x0000 to 0x7FFF indicate a standard
     102             :     // cluster.
     103             :     //
     104             :     // Cluster id suffixes in the range 0xFC00 to 0xFFFE indicate an MS cluster.
     105       18426 :     return IsValidVendorId(vendor) && ((vendor == 0x0000 && id <= 0x7FFF) || (vendor >= 0x0001 && id >= 0xFC00 && id <= 0xFFFE));
     106             : }
     107             : 
     108        1413 : constexpr bool IsGlobalAttribute(AttributeId aAttributeId)
     109             : {
     110        1413 :     const auto id     = ExtractIdFromMEI(aAttributeId);
     111        1413 :     const auto vendor = ExtractVendorFromMEI(aAttributeId);
     112             :     // Attribute id suffixes in the range 0xF000 to 0xFFFE indicate a standard
     113             :     // global attribute.
     114        1413 :     return (vendor == 0x0000 && id >= 0xF000 && id <= 0xFFFE);
     115             : }
     116             : 
     117       10136 : constexpr bool IsValidAttributeId(AttributeId aAttributeId)
     118             : {
     119       10136 :     const auto id     = ExtractIdFromMEI(aAttributeId);
     120       10136 :     const auto vendor = ExtractVendorFromMEI(aAttributeId);
     121             :     // Attribute id suffixes in the range 0x0000 to 0x4FFF indicate a non-global
     122             :     // attribute (standard or MS).  The vendor id must not be wildcard in this
     123             :     // case.
     124       10136 :     return (id <= 0x4FFF && IsValidVendorId(vendor)) || IsGlobalAttribute(aAttributeId);
     125             : }
     126             : 
     127          69 : constexpr bool IsValidCommandId(CommandId aCommandId)
     128             : {
     129          69 :     const auto id     = ExtractIdFromMEI(aCommandId);
     130          69 :     const auto vendor = ExtractVendorFromMEI(aCommandId);
     131             : 
     132             :     // Command id suffixes must be in the range 0x00 to 0xFF, and the prefix
     133             :     // must be a valid prefix (standard or MC).
     134          69 :     return id <= 0xFF && IsValidVendorId(vendor);
     135             : }
     136             : 
     137        1360 : constexpr bool IsValidDeviceTypeId(DeviceTypeId aDeviceTypeId)
     138             : {
     139        1360 :     const DeviceTypeId kIdMask     = 0x0000'FFFF;
     140        1360 :     const DeviceTypeId kVendorMask = 0xFFFF'0000;
     141        1360 :     const auto id                  = aDeviceTypeId & kIdMask;
     142        1360 :     const auto vendor              = aDeviceTypeId & kVendorMask;
     143        1360 :     return vendor <= 0xFFFE'0000 && id <= 0xBFFF;
     144             : }
     145             : 
     146        4073 : constexpr bool IsValidEndpointId(EndpointId aEndpointId)
     147             : {
     148        4073 :     return aEndpointId != kInvalidEndpointId;
     149             : }
     150             : 
     151        8199 : constexpr bool IsValidFabricIndex(FabricIndex fabricIndex)
     152             : {
     153        8199 :     return (fabricIndex >= kMinValidFabricIndex) && (fabricIndex <= kMaxValidFabricIndex);
     154             : }
     155             : 
     156        4938 : constexpr bool IsValidFabricId(FabricId fabricId)
     157             : {
     158        4938 :     return fabricId != kUndefinedFabricId;
     159             : }
     160             : 
     161             : } // namespace chip

Generated by: LCOV version 1.14