Skip to content

Commit

Permalink
[Chef] Fix AirQualitySensor to support RPC write (project-chip#30822)
Browse files Browse the repository at this point in the history
* Fix AirQualitySensor to support RPC write

1. Support Write Attributes through RPC
2. Support Multiple Endpoints for AirQuality / Concentration Measurement
   Clusters
3. Fix comformance issues caught by  TC_DeviceConformance.py

* Restyled by whitespace

* Restyled by clang-format

* Update ZAP version and fix compilation issues

* Restyled by clang-format

---------

Co-authored-by: Restyled.io <[email protected]>
  • Loading branch information
erwinpan1 and restyled-commits committed Feb 3, 2024
1 parent 32b2ef0 commit a820d24
Show file tree
Hide file tree
Showing 7 changed files with 517 additions and 135 deletions.
52 changes: 50 additions & 2 deletions examples/chef/common/chef-air-quality.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <app-common/zap-generated/ids/Clusters.h>
#include <app/util/config.h>
#include <lib/core/DataModelTypes.h>
#include <map>

using namespace chip;
using namespace chip::app;
Expand All @@ -30,10 +31,57 @@ using namespace chip::app::Clusters::AirQuality;

static chip::BitMask<Feature, uint32_t> airQualityFeatures(Feature::kFair, Feature::kModerate, Feature::kVeryPoor,
Feature::kExtremelyPoor);
static Instance gAirQualityClusterInstance = Instance(1, airQualityFeatures);
static std::map<int, Instance *> gAirQualityClusterInstance{};

void emberAfAirQualityClusterInitCallback(chip::EndpointId endpointId)
{
gAirQualityClusterInstance.Init();
Instance * clusterInstance = new Instance(1, airQualityFeatures);
clusterInstance->Init();
gAirQualityClusterInstance[1] = clusterInstance;
}

EmberAfStatus chefAirQualityWriteCallback(EndpointId endpoint, ClusterId clusterId,
const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer)
{
EmberAfStatus ret = EMBER_ZCL_STATUS_SUCCESS;

if (gAirQualityClusterInstance.find(endpoint) == gAirQualityClusterInstance.end())
{
ChipLogError(DeviceLayer, "Invalid Endpoind ID: %d", endpoint);
return EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT;
}

Instance * clusterInstance = gAirQualityClusterInstance[endpoint];
AttributeId attributeId = attributeMetadata->attributeId;

switch (attributeId)
{
case chip::app::Clusters::AirQuality::Attributes::AirQuality::Id: {
AirQualityEnum m = static_cast<AirQualityEnum>(buffer[0]);
Protocols::InteractionModel::Status status = clusterInstance->UpdateAirQuality(m);
if (Protocols::InteractionModel::Status::Success == status)
{
break;
}
ret = EMBER_ZCL_STATUS_UNSUPPORTED_WRITE;
ChipLogError(DeviceLayer, "Invalid Attribute Update status: %d", static_cast<int>(status));
}
break;
default:
ret = EMBER_ZCL_STATUS_UNSUPPORTED_ATTRIBUTE;
ChipLogError(DeviceLayer, "Unsupported Attribute ID: %d", static_cast<int>(attributeId));
break;
}

return ret;
}

EmberAfStatus chefAirQualityReadCallback(EndpointId endpoint, ClusterId clusterId,
const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer,
uint16_t maxReadLength)
{
EmberAfStatus ret = EMBER_ZCL_STATUS_SUCCESS;

return ret;
}
#endif
30 changes: 30 additions & 0 deletions examples/chef/common/chef-air-quality.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
*
* Copyright (c) 2023 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.
*/
#include <app-common/zap-generated/callback.h>
#include <app-common/zap-generated/ids/Attributes.h>
#include <app-common/zap-generated/ids/Clusters.h>
#include <app/util/af-types.h>
#include <app/util/config.h>
#include <lib/core/DataModelTypes.h>

#ifdef EMBER_AF_PLUGIN_AIR_QUALITY_SERVER
EmberAfStatus chefAirQualityWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer);
EmberAfStatus chefAirQualityReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId,
const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer,
uint16_t maxReadLength);
#endif
Loading

0 comments on commit a820d24

Please sign in to comment.