Skip to content

Commit

Permalink
Fix ecosystem information cluster when reading cluster revision
Browse files Browse the repository at this point in the history
  • Loading branch information
tehampson committed Aug 5, 2024
1 parent d31f7be commit a1a3929
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ namespace Clusters {
namespace EcosystemInformation {
namespace {

#define ZCL_ECOSYSTEM_INFORMATION_CLUSTER_REVISION (1u)
#define ZCL_ECOSYSTEM_INFORMATION_FEATURE_MAP (0u)

constexpr size_t kDeviceNameMaxSize = 64;
constexpr size_t kUniqueLocationIdMaxSize = 64;
constexpr size_t kUniqueLocationIdsListMaxSize = 64;
Expand All @@ -46,18 +49,7 @@ class AttrAccess : public AttributeAccessInterface
CHIP_ERROR AttrAccess::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder)
{
VerifyOrDie(aPath.mClusterId == Clusters::EcosystemInformation::Id);
switch (aPath.mAttributeId)
{
case Attributes::RemovedOn::Id:
return EcosystemInformationServer::Instance().EncodeRemovedOnAttribute(aPath.mEndpointId, aEncoder);
case Attributes::DeviceDirectory ::Id:
return EcosystemInformationServer::Instance().EncodeDeviceDirectoryAttribute(aPath.mEndpointId, aEncoder);
case Attributes::LocationDirectory ::Id:
return EcosystemInformationServer::Instance().EncodeLocationStructAttribute(aPath.mEndpointId, aEncoder);
default:
break;
}
return CHIP_NO_ERROR;
return EcosystemInformationServer::Instance().ReadAttribute(aPath, aEncoder);
}

// WARNING: caller is expected to use the returned LocationDescriptorStruct::Type immediately. Caller must
Expand All @@ -66,8 +58,7 @@ CHIP_ERROR AttrAccess::Read(const ConcreteReadAttributePath & aPath, AttributeVa
// TODO(#33223) To improve safety we could make GetEncodableLocationDescriptorStruct a private
// memeber method where we explicitly delete member method for the parameter that matches
// (LocationDescriptorStruct && aLocationDescriptor).
Globals::Structs::LocationDescriptorStruct::Type
GetEncodableLocationDescriptorStruct(const LocationDescriptorStruct & aLocationDescriptor)
Globals::Structs::LocationDescriptorStruct::Type GetEncodableLocationDescriptorStruct(const LocationDescriptorStruct & aLocationDescriptor)
{
Globals::Structs::LocationDescriptorStruct::Type locationDescriptor;
// This would imply data is either not properly validated before being
Expand Down Expand Up @@ -200,8 +191,7 @@ EcosystemLocationStruct::Builder & EcosystemLocationStruct::Builder::SetFloorNum
return *this;
}

EcosystemLocationStruct::Builder &
EcosystemLocationStruct::Builder::SetAreaTypeTag(std::optional<Globals::AreaTypeTag> aAreaTypeTag)
EcosystemLocationStruct::Builder & EcosystemLocationStruct::Builder::SetAreaTypeTag(std::optional<Globals::AreaTypeTag> aAreaTypeTag)
{
VerifyOrDie(!mIsAlreadyBuilt);
mLocationDescriptor.mAreaType = aAreaTypeTag;
Expand Down Expand Up @@ -285,6 +275,32 @@ CHIP_ERROR EcosystemInformationServer::RemoveDevice(EndpointId aEndpoint, uint64
return CHIP_NO_ERROR;
}

CHIP_ERROR EcosystemInformationServer::ReadAttribute(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder)
{
switch (aPath.mAttributeId)
{
case Attributes::RemovedOn::Id:
return EcosystemInformationServer::Instance().EncodeRemovedOnAttribute(aPath.mEndpointId, aEncoder);
case Attributes::DeviceDirectory::Id:
return EcosystemInformationServer::Instance().EncodeDeviceDirectoryAttribute(aPath.mEndpointId, aEncoder);
case Attributes::LocationDirectory::Id:
return EcosystemInformationServer::Instance().EncodeLocationStructAttribute(aPath.mEndpointId, aEncoder);
case Attributes::ClusterRevision::Id:
{
uint16_t rev = ZCL_ECOSYSTEM_INFORMATION_CLUSTER_REVISION;
return aEncoder.Encode(rev);
}
case Attributes::FeatureMap::Id:
{
uint32_t featureMap = ZCL_ECOSYSTEM_INFORMATION_FEATURE_MAP;
return aEncoder.Encode(featureMap);
}
default:
break;
}
return CHIP_NO_ERROR;
}

CHIP_ERROR EcosystemInformationServer::EncodeRemovedOnAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder)
{
auto it = mDevicesMap.find(aEndpoint);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,7 @@ class EcosystemInformationServer
CHIP_ERROR RemoveDevice(EndpointId aEndpoint, uint64_t aEpochUs);
// TODO(#33223) Add removal and update counterparts to AddDeviceInfo and AddLocationInfo.

CHIP_ERROR EncodeRemovedOnAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
CHIP_ERROR EncodeDeviceDirectoryAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
CHIP_ERROR EncodeLocationStructAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
CHIP_ERROR ReadAttribute(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder);

private:
struct DeviceInfo
Expand All @@ -194,6 +192,11 @@ class EcosystemInformationServer
// Map key is using the UniqueLocationId
std::map<std::string, std::unique_ptr<EcosystemLocationStruct>> mLocationDirectory;
};

CHIP_ERROR EncodeRemovedOnAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
CHIP_ERROR EncodeDeviceDirectoryAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);
CHIP_ERROR EncodeLocationStructAttribute(EndpointId aEndpoint, AttributeValueEncoder & aEncoder);

std::map<EndpointId, DeviceInfo> mDevicesMap;

static EcosystemInformationServer mInstance;
Expand Down

0 comments on commit a1a3929

Please sign in to comment.