Skip to content

Chef: Add APIs to provide deviceType info on Endpoints. Make chef static temperature levels (temperature control cluster) endpoint agnostic. #38142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 53 commits into from
Apr 9, 2025
Merged
Show file tree
Hide file tree
Changes from 32 commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
88f6797
Chef: Add APIs to provide deviceType info on Endpoints. Fix compositi…
sxb427 Mar 27, 2025
3441ee1
+
sxb427 Mar 27, 2025
bf2fde7
+
sxb427 Mar 27, 2025
8a441e2
Fix: two elements should not have common bits in an enum used as bitmask
sxb427 Mar 27, 2025
210234c
Merge branch 'master' into oven
sxb427 Mar 27, 2025
dc03344
Restyled by clang-format
restyled-commits Mar 27, 2025
b2f7220
Refactoring
sxb427 Mar 27, 2025
4641c8a
compilation err
sxb427 Mar 27, 2025
e2dd9f4
compilation err
sxb427 Mar 27, 2025
d8cf98a
compilation err
sxb427 Mar 27, 2025
7252e81
compilation err
sxb427 Mar 28, 2025
5e13d4b
compilation err
sxb427 Mar 28, 2025
e528154
compilation err
sxb427 Mar 28, 2025
0a04f6c
compilation err
sxb427 Mar 28, 2025
187407b
compilation err
sxb427 Mar 28, 2025
dd52e75
compilation err
sxb427 Mar 28, 2025
a1a8756
compilation err
sxb427 Mar 28, 2025
487ce16
compilation err
sxb427 Mar 28, 2025
0e1d905
compilation err
sxb427 Mar 28, 2025
f0fb2b9
compilation err
sxb427 Mar 28, 2025
d6a1a8c
compilation err
sxb427 Mar 28, 2025
e0a688a
compilation err
sxb427 Mar 28, 2025
a95ac81
compilation err
sxb427 Mar 28, 2025
49fb24f
compilation err
sxb427 Mar 28, 2025
81bfbf1
compilation err
sxb427 Mar 28, 2025
af847e1
compilation err
sxb427 Mar 28, 2025
137cdb0
compilation err
sxb427 Mar 28, 2025
50c084a
compilation err
sxb427 Mar 28, 2025
48cfc55
compilation err
sxb427 Mar 28, 2025
6aaf697
Merge branch 'master' into oven
sxb427 Mar 28, 2025
8426fb2
compilation err
sxb427 Mar 28, 2025
27faf55
compilation err
sxb427 Mar 28, 2025
faaee88
Merge branch 'master' into oven
sxb427 Mar 28, 2025
fbed38a
+
sxb427 Mar 28, 2025
b6fbf5e
Rename DataModelUtils to DeviceTypes
sxb427 Mar 28, 2025
9a688f7
Document the new methods
sxb427 Mar 28, 2025
a208953
Fix invalid memory.
sxb427 Mar 28, 2025
fa062ed
Fix compilation
sxb427 Mar 28, 2025
f954b82
Comments for EndpointPair struct. New chef namespace for cluster conf…
sxb427 Mar 28, 2025
f731b94
+
sxb427 Mar 28, 2025
b32ee18
Merge branch 'master' into oven
sxb427 Apr 3, 2025
2bb9099
Do not silently ignore CHIP_ERROR return value
sxb427 Apr 3, 2025
dcc6b0c
Review suggestion
sxb427 Apr 3, 2025
cdb5c3b
Review suggestion
sxb427 Apr 3, 2025
fd556ec
Use Enums for expected endpoint IDs
sxb427 Apr 3, 2025
c348009
Avoid enums due to casting issue
sxb427 Apr 3, 2025
01b50ae
Use Span for temperature levels
sxb427 Apr 4, 2025
3b8200d
Use Span for temperature levels
sxb427 Apr 4, 2025
dd544d4
Fix compilation
sxb427 Apr 4, 2025
69e71f0
nit: Rename constant.
sxb427 Apr 4, 2025
b204b5e
Merge branch 'master' into oven
sxb427 Apr 4, 2025
7336521
Merge branch 'master' into oven
sxb427 Apr 8, 2025
b0dd140
Merge branch 'master' into oven
sxb427 Apr 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions examples/chef/common/DataModelUtils.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
*
* Copyright (c) 2025 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 <DataModelUtils.h>
#include <app/InteractionModelEngine.h>
#include <app/data-model-provider/MetadataTypes.h>
#include <lib/support/CodeUtils.h>

using namespace chef;
using namespace chip;
using namespace chip::app;

bool DataModelUtils::EndpointHasDeviceType(EndpointId endpoint, DeviceTypeId deviceTypeId)
{
DataModel::ListBuilder<DataModel::DeviceTypeEntry> deviceTypesList;
InteractionModelEngine::GetInstance()->GetDataModelProvider()->DeviceTypes(endpoint, deviceTypesList);
auto deviceTypes = deviceTypesList.TakeBuffer();
for (const auto & type : deviceTypes)
{
if (type.deviceTypeId == deviceTypeId)
{
return true;
}
}
return false;
}

DataModel::ListBuilder<EndpointId> DataModelUtils::GetAllEndpointsHavingDeviceType(DeviceTypeId devieType)
{
DataModel::ListBuilder<DataModel::EndpointEntry> endpointsList;
InteractionModelEngine::GetInstance()->GetDataModelProvider()->Endpoints(endpointsList);
auto allEndpoints = endpointsList.TakeBuffer();

DataModel::ListBuilder<EndpointId> endpoints;

for (const auto & ep : allEndpoints)
{
if (EndpointHasDeviceType(ep.id, devieType))
{
endpoints.Append(ep.id);
}
}
return endpoints;
}
38 changes: 38 additions & 0 deletions examples/chef/common/DataModelUtils.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
*
* Copyright (c) 2025 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 <app/data-model-provider/MetadataList.h>
#include <lib/core/CHIPError.h>
#include <lib/core/DataModelTypes.h>

namespace chef {
namespace DataModelUtils {

// Common location to store all device type IDs
constexpr chip::DeviceTypeId kCookSurfaceDeviceId = 0x0077;
constexpr chip::DeviceTypeId kCooktopDeviceId = 0x0078;
constexpr chip::DeviceTypeId kOvenDeviceId = 0x007B;
constexpr chip::DeviceTypeId kRefrigeratorDeviceId = 0x0070;
constexpr chip::DeviceTypeId kTemperatureControlledCabinetDeviceId = 0x0071;

// Datamodel Util APIs
bool EndpointHasDeviceType(chip::EndpointId endpoint, chip::DeviceTypeId deviceTypeId);
chip::app::DataModel::ListBuilder<chip::EndpointId> GetAllEndpointsHavingDeviceType(chip::DeviceTypeId devieType);

} // namespace DataModelUtils
} // namespace chef
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#ifdef MATTER_DM_PLUGIN_TEMPERATURE_CONTROL_SERVER
#include "static-supported-temperature-levels.h"
#include <app/clusters/temperature-control-server/supported-temperature-levels-manager.h>
#include <app/util/attribute-storage.h>
#include <lib/support/CodeUtils.h>

using namespace chip;
Expand All @@ -30,12 +31,12 @@ using chip::Protocols::InteractionModel::Status;

app::Clusters::TemperatureControl::AppSupportedTemperatureLevelsDelegate sAppSupportedTemperatureLevelsDelegate;

CharSpan AppSupportedTemperatureLevelsDelegate::temperatureLevelOptions[] = { "Low"_span, "Medium"_span, "High"_span };
namespace ChefTemperatureControl {
static const CharSpan temperatureLevelOptions[3] = { "Low"_span, "Medium"_span, "High"_span };
} // namespace ChefTemperatureControl

const AppSupportedTemperatureLevelsDelegate::EndpointPair AppSupportedTemperatureLevelsDelegate::supportedOptionsByEndpoints
[MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT] = { EndpointPair(
1 /* endpointId */, AppSupportedTemperatureLevelsDelegate::temperatureLevelOptions,
MATTER_ARRAY_SIZE(AppSupportedTemperatureLevelsDelegate::temperatureLevelOptions)) };
ChefTemperatureControl::EndpointPair
AppSupportedTemperatureLevelsDelegate::supportedOptionsByEndpoints[MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT];

uint8_t AppSupportedTemperatureLevelsDelegate::Size()
{
Expand Down Expand Up @@ -72,7 +73,13 @@ CHIP_ERROR AppSupportedTemperatureLevelsDelegate::Next(MutableCharSpan & item)
}
void emberAfTemperatureControlClusterInitCallback(EndpointId endpoint)
{
static_assert(MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT == 1, "This cluster is only enabled for endpoint 1");
ChipLogDetail(DeviceLayer, "Initializing TemperatureControl cluster for Endpoint: %d", endpoint);
uint16_t epIndex = emberAfGetClusterServerEndpointIndex(endpoint, TemperatureControl::Id,
MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT);
sAppSupportedTemperatureLevelsDelegate.SetSupportedEndpointPair(
epIndex,
ChefTemperatureControl::EndpointPair(endpoint /* endpointId */, ChefTemperatureControl::temperatureLevelOptions,
MATTER_ARRAY_SIZE(ChefTemperatureControl::temperatureLevelOptions)));

chip::app::Clusters::TemperatureControl::SetInstance(&sAppSupportedTemperatureLevelsDelegate);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,32 +21,41 @@
#include <app/clusters/temperature-control-server/supported-temperature-levels-manager.h>
#include <app/util/config.h>

namespace ChefTemperatureControl {
struct EndpointPair
{
chip::EndpointId mEndpointId;
const chip::CharSpan * mTemperatureLevels;
uint8_t mSize;

EndpointPair() : mEndpointId(chip::kInvalidEndpointId), mTemperatureLevels(NULL), mSize(0) {}

EndpointPair(chip::EndpointId aEndpointId, const chip::CharSpan * TemperatureLevels, uint8_t size) :
mEndpointId(aEndpointId), mTemperatureLevels(TemperatureLevels), mSize(size)
{}
};
} // namespace ChefTemperatureControl

namespace chip {
namespace app {
namespace Clusters {
namespace TemperatureControl {

class AppSupportedTemperatureLevelsDelegate : public SupportedTemperatureLevelsIteratorDelegate
{
struct EndpointPair
{
EndpointId mEndpointId;
CharSpan * mTemperatureLevels;
uint8_t mSize;

EndpointPair(EndpointId aEndpointId, CharSpan * TemperatureLevels, uint8_t size) :
mEndpointId(aEndpointId), mTemperatureLevels(TemperatureLevels), mSize(size)
{}
};

static CharSpan temperatureLevelOptions[3];
static const EndpointPair supportedOptionsByEndpoints[MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT];
static ChefTemperatureControl::EndpointPair
supportedOptionsByEndpoints[MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT];

public:
uint8_t Size() override;

CHIP_ERROR Next(MutableCharSpan & item) override;

static void SetSupportedEndpointPair(uint16_t index, ChefTemperatureControl::EndpointPair endpointPair)
{
supportedOptionsByEndpoints[index] = endpointPair;
}

~AppSupportedTemperatureLevelsDelegate() {}
};

Expand Down
146 changes: 127 additions & 19 deletions examples/chef/common/stubs.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "DataModelUtils.h"
#include <app-common/zap-generated/attributes/Accessors.h>
#include <app-common/zap-generated/callback.h>
#include <app/data-model/Nullable.h>
Expand All @@ -7,6 +8,7 @@

using chip::app::DataModel::Nullable;

using namespace chef;
using namespace chip;
using namespace chip::app;
using namespace chip::app::Clusters;
Expand Down Expand Up @@ -38,21 +40,30 @@ using namespace chip::app::Clusters;
#include "refrigerator-and-temperature-controlled-cabinet-mode/tcc-mode.h"
#endif // MATTER_DM_PLUGIN_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_SERVER

#ifdef MATTER_DM_PLUGIN_REFRIGERATOR_ALARM_SERVER
namespace {

// Please refer to https://github.com/CHIP-Specifications/connectedhomeip-spec/blob/master/src/namespaces
constexpr const uint8_t kNamespaceRefrigerator = 0x41;
// Refrigerator Namespace: 0x41, tag 0x00 (Refrigerator)
constexpr const uint8_t kTagRefrigerator = 0x00;
// Refrigerator Namespace: 0x41, tag 0x01 (Freezer)
constexpr const uint8_t kTagFreezer = 0x01;
const Clusters::Descriptor::Structs::SemanticTagStruct::Type refrigeratorTagList[] = { { .namespaceID = kNamespaceRefrigerator,
.tag = kTagRefrigerator } };
const Clusters::Descriptor::Structs::SemanticTagStruct::Type freezerTagList[] = { { .namespaceID = kNamespaceRefrigerator,
.tag = kTagFreezer } };
constexpr const uint8_t kTagFreezer = 0x01;
const Clusters::Descriptor::Structs::SemanticTagStruct::Type gRefrigeratorTagList[] = { { .namespaceID = kNamespaceRefrigerator,
.tag = kTagRefrigerator } };
const Clusters::Descriptor::Structs::SemanticTagStruct::Type gFreezerTagList[] = { { .namespaceID = kNamespaceRefrigerator,
.tag = kTagFreezer } };
} // namespace
#endif // MATTER_DM_PLUGIN_REFRIGERATOR_ALARM_SERVER

namespace PostionSemanticTag {

constexpr const uint8_t kNamespace = 0x08; // Common Position Namespace
const Clusters::Descriptor::Structs::SemanticTagStruct::Type kLeft = { .namespaceID = kNamespace, .tag = 0x00 };
const Clusters::Descriptor::Structs::SemanticTagStruct::Type kRight = { .namespaceID = kNamespace, .tag = 0x01 };
const Clusters::Descriptor::Structs::SemanticTagStruct::Type kTop = { .namespaceID = kNamespace, .tag = 0x02 };
const Clusters::Descriptor::Structs::SemanticTagStruct::Type kBottom = { .namespaceID = kNamespace, .tag = 0x03 };
const Clusters::Descriptor::Structs::SemanticTagStruct::Type kMiddle = { .namespaceID = kNamespace, .tag = 0x04 };

} // namespace PostionSemanticTag

#ifdef MATTER_DM_PLUGIN_RVC_OPERATIONAL_STATE_SERVER
#include "chef-rvc-operational-state-delegate.h"
Expand Down Expand Up @@ -347,22 +358,119 @@ void emberAfWakeOnLanClusterInitCallback(EndpointId endpoint)
}
#endif

void ApplicationInit()
/**
* This initializer is for the application having refrigerator on EP1 and child
* temperatureControlledCabinet endpoints on EP2 and EP3.
*/
void RefrigeratorTemperatureControlledCabinetInit()
{
ChipLogProgress(NotSpecified, "Chef Application Init !!!");

#ifdef MATTER_DM_PLUGIN_REFRIGERATOR_ALARM_SERVER
// set Parent Endpoint and Composition Type for an Endpoint
EndpointId kRefEndpointId = 1;
EndpointId kColdCabinetEndpointId = 2;
EndpointId kFreezeCabinetEndpointId = 3;
SetTreeCompositionForEndpoint(kRefEndpointId);
SetParentEndpointForEndpoint(kColdCabinetEndpointId, kRefEndpointId);
SetParentEndpointForEndpoint(kFreezeCabinetEndpointId, kRefEndpointId);
// set TagList
SetTagList(kColdCabinetEndpointId, Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(refrigeratorTagList));
SetTagList(kFreezeCabinetEndpointId, Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(freezerTagList));
#endif // MATTER_DM_PLUGIN_REFRIGERATOR_ALARM_SERVER
if (DataModelUtils::EndpointHasDeviceType(kRefEndpointId, DataModelUtils::kRefrigeratorDeviceId))
{
ChipLogDetail(NotSpecified, "Refrigerator device type on EP: %d", kRefEndpointId);
SetTreeCompositionForEndpoint(kRefEndpointId);

// Cold Cabinet
if (DataModelUtils::EndpointHasDeviceType(kColdCabinetEndpointId, DataModelUtils::kTemperatureControlledCabinetDeviceId))
{
ChipLogDetail(NotSpecified, "Temperature controlled cabinet device type on EP: %d", kColdCabinetEndpointId);
SetParentEndpointForEndpoint(kColdCabinetEndpointId, kRefEndpointId);
SetTagList(kColdCabinetEndpointId,
Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(gRefrigeratorTagList));
}

// Freeze Cabinet
if (DataModelUtils::EndpointHasDeviceType(kFreezeCabinetEndpointId, DataModelUtils::kTemperatureControlledCabinetDeviceId))
{
ChipLogDetail(NotSpecified, "Temperature controlled cabinet device type on EP: %d", kFreezeCabinetEndpointId);
SetParentEndpointForEndpoint(kFreezeCabinetEndpointId, kRefEndpointId);
SetTagList(kFreezeCabinetEndpointId,
Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(gFreezerTagList));
}
}
}

/**
* This initializer is for the application having cooktop. The cooktop can be a part of an oven
* or standalone cooktop.
* Standalone Cooktop: Cooktop on EP1 and optional CookSurface on EP2.
* Cooktop part of Oven: Oven on EP1, Cooktop on EP3 and optional CookSurface on EP4.
*/
void CooktopCookSurfaceInit(EndpointId kCooktopEpId)
{
SetTreeCompositionForEndpoint(kCooktopEpId);
switch (kCooktopEpId)
{
case 1: // Standalone cooktop.
if (DataModelUtils::EndpointHasDeviceType(kCooktopEpId, DataModelUtils::kCooktopDeviceId))
{
ChipLogDetail(NotSpecified, "Cooktop device type on EP: %d", kCooktopEpId);
EndpointId kCookSurfaceEpId = 2;
if (DataModelUtils::EndpointHasDeviceType(kCookSurfaceEpId, DataModelUtils::kCookSurfaceDeviceId))
{
ChipLogDetail(NotSpecified, "Cook Surface device type on EP: %d", kCookSurfaceEpId);
SetParentEndpointForEndpoint(kCookSurfaceEpId, kCooktopEpId);
const Clusters::Descriptor::Structs::SemanticTagStruct::Type cookSurfacePosition[] = { PostionSemanticTag::kLeft };
SetTagList(kCookSurfaceEpId,
Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(cookSurfacePosition));
}
}
break;
case 3: // Cooktop part of oven.
EndpointId kOvenEpId = 1;
if (DataModelUtils::EndpointHasDeviceType(kCooktopEpId, DataModelUtils::kCooktopDeviceId) &&
DataModelUtils::EndpointHasDeviceType(kOvenEpId, DataModelUtils::kOvenDeviceId))
{
ChipLogDetail(NotSpecified, "Cooktop device type on EP: %d", kCooktopEpId);
SetParentEndpointForEndpoint(kCooktopEpId, kOvenEpId);
EndpointId kCookSurfaceEpId = 4;
if (DataModelUtils::EndpointHasDeviceType(kCookSurfaceEpId, DataModelUtils::kCookSurfaceDeviceId))
{
ChipLogDetail(NotSpecified, "Cook Surface device type on EP: %d", kCookSurfaceEpId);
SetParentEndpointForEndpoint(kCookSurfaceEpId, kCooktopEpId);
const Clusters::Descriptor::Structs::SemanticTagStruct::Type cookSurfacePosition[] = { PostionSemanticTag::kLeft };
SetTagList(kCookSurfaceEpId,
Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(cookSurfacePosition));
}
}
}
}

/**
* This initializer is for the application having oven on EP1 and child endpoints -
* temperatureControlledCabinet on EP2, cooktop on EP3 and cooksurface on EP4.
*/
void OvenTemperatureControlledCabinetCooktopCookSurfaceInit()
{
EndpointId kOvenEpId = 1;
EndpointId kTemperatureControlledCabinetEpId = 2;
EndpointId kCooktopEpId = 3;
if (DataModelUtils::EndpointHasDeviceType(kOvenEpId, DataModelUtils::kOvenDeviceId))
{
ChipLogDetail(NotSpecified, "Oven device type on EP: %d", kOvenEpId);
SetTreeCompositionForEndpoint(kOvenEpId);

if (DataModelUtils::EndpointHasDeviceType(kTemperatureControlledCabinetEpId,
DataModelUtils::kTemperatureControlledCabinetDeviceId))
{
ChipLogDetail(NotSpecified, "Temperature controlled cabinet device type on EP: %d", kTemperatureControlledCabinetEpId);
SetParentEndpointForEndpoint(kTemperatureControlledCabinetEpId, kOvenEpId);
const Clusters::Descriptor::Structs::SemanticTagStruct::Type cabinetPosition[] = { PostionSemanticTag::kTop };
SetTagList(kTemperatureControlledCabinetEpId,
Span<const Clusters::Descriptor::Structs::SemanticTagStruct::Type>(cabinetPosition));
}
CooktopCookSurfaceInit(kCooktopEpId);
}
}

void ApplicationInit()
{
ChipLogProgress(NotSpecified, "Chef Application Init !!!");

RefrigeratorTemperatureControlledCabinetInit();
OvenTemperatureControlledCabinetCooktopCookSurfaceInit();

#ifdef MATTER_DM_PLUGIN_WINDOW_COVERING_SERVER
ChipLogProgress(NotSpecified, "Initializing WindowCovering cluster delegate.");
Expand Down
1 change: 1 addition & 0 deletions examples/chef/linux/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ chip_data_model("chef-data-model") {

executable("${sample_name}") {
sources = [
"${project_dir}/common/DataModelUtils.cpp",
"${project_dir}/common/chef-air-quality.cpp",
"${project_dir}/common/chef-concentration-measurement.cpp",
"${project_dir}/common/chef-dishwasher-alarm-delegate-impl.cpp",
Expand Down
1 change: 1 addition & 0 deletions examples/chef/nrfconnect/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ if (CONFIG_CHIP_LIB_SHELL)
endif()

target_sources(app PRIVATE
${CHEF}/common/DataModelUtils.cpp
${CHEF}/common/chef-air-quality.cpp
${CHEF}/common/chef-concentration-measurement.cpp
${CHEF}/common/chef-fan-control-manager.cpp
Expand Down
Loading
Loading