Skip to content

Commit 3fd1319

Browse files
OliverFan1restyled-commits
authored andcommitted
[occupancy-sensing] Follow up improvements for Occupancy Sensing Cluster updates for Matter 1.4 (project-chip#34658)
* [occupancy-sensing]Follow up improvements for Occupancy Sensing Cluster updates for Matter 1.4 * Apply follow-up suggestions from review PR#34293 * Make HoldTime attribute writable * Fix array index mapping issue reported from PR#34593 in occupancy-sensing-stub.cpp Signed-off-by: Oliver Fan <oliver.fan@nxp.com> * Regen ZAP after adding FeatureMap and HoldTime to zcl.json and zcl-with-test-extensions.json file for Occupancy Sensing cluster Signed-off-by: Oliver Fan <oliver.fan@nxp.com> * Restyled by clang-format * Restyled by prettier-json * Restyled by clang-format * Add an error print in occupancy-sensing-stub.cpp Signed-off-by: Oliver Fan <oliver.fan@nxp.com> * Update all-clusters-app.zap for HoldTime and FeatureMap attributes of Occupancy Sensing cluster Signed-off-by: Oliver Fan <oliver.fan@nxp.com> * Resolve merge conflict in endpoint_config.h Signed-off-by: Oliver Fan <oliver.fan@nxp.com> --------- Signed-off-by: Oliver Fan <oliver.fan@nxp.com> Co-authored-by: Restyled.io <commits@restyled.io>
1 parent f1bf871 commit 3fd1319

File tree

17 files changed

+114
-170
lines changed

17 files changed

+114
-170
lines changed

examples/all-clusters-app/all-clusters-common/all-clusters-app.matter

+4-4
Original file line numberDiff line numberDiff line change
@@ -9252,10 +9252,10 @@ endpoint 1 {
92529252
ram attribute occupancy;
92539253
ram attribute occupancySensorType;
92549254
ram attribute occupancySensorTypeBitmap default = 1;
9255-
ram attribute holdTime default = 10;
9255+
callback attribute holdTime;
92569256
callback attribute holdTimeLimits;
92579257
ram attribute PIROccupiedToUnoccupiedDelay default = 10;
9258-
ram attribute featureMap default = 0x02;
9258+
callback attribute featureMap;
92599259
ram attribute clusterRevision default = 5;
92609260
}
92619261

@@ -9730,10 +9730,10 @@ endpoint 2 {
97309730
ram attribute occupancy;
97319731
ram attribute occupancySensorType;
97329732
ram attribute occupancySensorTypeBitmap default = 1;
9733-
ram attribute holdTime default = 20;
9733+
callback attribute holdTime;
97349734
callback attribute holdTimeLimits;
97359735
ram attribute PIROccupiedToUnoccupiedDelay default = 10;
9736-
ram attribute featureMap default = 0x02;
9736+
callback attribute featureMap;
97379737
ram attribute clusterRevision default = 5;
97389738
}
97399739
}

examples/all-clusters-app/all-clusters-common/all-clusters-app.zap

+8-8
Original file line numberDiff line numberDiff line change
@@ -19196,10 +19196,10 @@
1919619196
"side": "server",
1919719197
"type": "int16u",
1919819198
"included": 1,
19199-
"storageOption": "RAM",
19199+
"storageOption": "External",
1920019200
"singleton": 0,
1920119201
"bounded": 0,
19202-
"defaultValue": "10",
19202+
"defaultValue": null,
1920319203
"reportable": 1,
1920419204
"minInterval": 1,
1920519205
"maxInterval": 65534,
@@ -19244,10 +19244,10 @@
1924419244
"side": "server",
1924519245
"type": "bitmap32",
1924619246
"included": 1,
19247-
"storageOption": "RAM",
19247+
"storageOption": "External",
1924819248
"singleton": 0,
1924919249
"bounded": 0,
19250-
"defaultValue": "0x02",
19250+
"defaultValue": null,
1925119251
"reportable": 1,
1925219252
"minInterval": 1,
1925319253
"maxInterval": 65534,
@@ -25353,10 +25353,10 @@
2535325353
"side": "server",
2535425354
"type": "int16u",
2535525355
"included": 1,
25356-
"storageOption": "RAM",
25356+
"storageOption": "External",
2535725357
"singleton": 0,
2535825358
"bounded": 0,
25359-
"defaultValue": "20",
25359+
"defaultValue": null,
2536025360
"reportable": 1,
2536125361
"minInterval": 1,
2536225362
"maxInterval": 65534,
@@ -25401,10 +25401,10 @@
2540125401
"side": "server",
2540225402
"type": "bitmap32",
2540325403
"included": 1,
25404-
"storageOption": "RAM",
25404+
"storageOption": "External",
2540525405
"singleton": 0,
2540625406
"bounded": 0,
25407-
"defaultValue": "0x02",
25407+
"defaultValue": null,
2540825408
"reportable": 1,
2540925409
"minInterval": 1,
2541025410
"maxInterval": 65534,

examples/all-clusters-app/all-clusters-common/src/occupancy-sensing-stub.cpp

+35-16
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <app/CommandHandler.h>
1919
#include <app/clusters/occupancy-sensor-server/occupancy-hal.h>
2020
#include <app/clusters/occupancy-sensor-server/occupancy-sensor-server.h>
21+
#include <app/util/attribute-storage.h>
2122
#include <platform/CHIPDeviceLayer.h>
2223

2324
using namespace chip;
@@ -28,30 +29,48 @@ using namespace chip::DeviceLayer;
2829

2930
using chip::Protocols::InteractionModel::Status;
3031

31-
static std::unique_ptr<OccupancySensingAttrAccess>
32-
gAttrAccess[MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT];
32+
namespace {
33+
34+
static constexpr size_t kOccupancySensingClusterTableSize =
35+
MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT;
36+
37+
static_assert(kOccupancySensingClusterTableSize <= kEmberInvalidEndpointIndex, "Occupancy Sensing Cluster table size error");
38+
39+
static std::unique_ptr<Instance> gOccupancySensingClusterInstances[kOccupancySensingClusterTableSize];
40+
41+
} // namespace
3342

3443
void emberAfOccupancySensingClusterInitCallback(EndpointId endpointId)
3544
{
36-
VerifyOrDie(!gAttrAccess[endpointId]);
45+
uint16_t epIndex = emberAfGetClusterServerEndpointIndex(endpointId, chip::app::Clusters::OccupancySensing::Id,
46+
MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT);
3747

38-
gAttrAccess[endpointId] = std::make_unique<OccupancySensingAttrAccess>(
39-
BitMask<OccupancySensing::Feature, uint32_t>(OccupancySensing::Feature::kPassiveInfrared));
48+
if (epIndex < kOccupancySensingClusterTableSize)
49+
{
50+
VerifyOrDie(!gOccupancySensingClusterInstances[epIndex]);
4051

41-
OccupancySensing::Structs::HoldTimeLimitsStruct::Type holdTimeLimits = {
42-
.holdTimeMin = 1,
43-
.holdTimeMax = 300,
44-
.holdTimeDefault = 10,
45-
};
52+
gOccupancySensingClusterInstances[epIndex] =
53+
std::make_unique<Instance>(BitMask<OccupancySensing::Feature, uint32_t>(OccupancySensing::Feature::kPassiveInfrared));
4654

47-
uint16_t holdTime = 10;
55+
OccupancySensing::Structs::HoldTimeLimitsStruct::Type holdTimeLimits = {
56+
.holdTimeMin = 1,
57+
.holdTimeMax = 300,
58+
.holdTimeDefault = 10,
59+
};
4860

49-
if (gAttrAccess[endpointId])
50-
{
51-
gAttrAccess[endpointId]->Init();
61+
uint16_t holdTime = 10;
62+
63+
if (gOccupancySensingClusterInstances[epIndex])
64+
{
65+
gOccupancySensingClusterInstances[epIndex]->Init();
5266

53-
SetHoldTimeLimits(endpointId, holdTimeLimits);
67+
SetHoldTimeLimits(endpointId, holdTimeLimits);
5468

55-
SetHoldTime(endpointId, holdTime);
69+
SetHoldTime(endpointId, holdTime);
70+
}
71+
}
72+
else
73+
{
74+
ChipLogError(AppServer, "Error: invalid/unexpected OccupancySensing Cluster endpoint index.");
5675
}
5776
}

examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter

+2-2
Original file line numberDiff line numberDiff line change
@@ -6922,7 +6922,7 @@ endpoint 1 {
69226922
ram attribute occupancy;
69236923
ram attribute occupancySensorType;
69246924
ram attribute occupancySensorTypeBitmap;
6925-
ram attribute featureMap default = 0;
6925+
callback attribute featureMap;
69266926
ram attribute clusterRevision default = 5;
69276927
}
69286928

@@ -7275,7 +7275,7 @@ endpoint 2 {
72757275
ram attribute occupancy;
72767276
ram attribute occupancySensorType;
72777277
ram attribute occupancySensorTypeBitmap;
7278-
ram attribute featureMap default = 0;
7278+
callback attribute featureMap;
72797279
ram attribute clusterRevision default = 5;
72807280
}
72817281
}

examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter

+1-1
Original file line numberDiff line numberDiff line change
@@ -1932,7 +1932,7 @@ endpoint 1 {
19321932
callback attribute generatedCommandList;
19331933
callback attribute acceptedCommandList;
19341934
callback attribute attributeList;
1935-
ram attribute featureMap default = 0;
1935+
callback attribute featureMap;
19361936
ram attribute clusterRevision default = 5;
19371937
}
19381938
}

examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter

+1-1
Original file line numberDiff line numberDiff line change
@@ -2369,7 +2369,7 @@ endpoint 1 {
23692369
ram attribute occupancy;
23702370
ram attribute occupancySensorType;
23712371
ram attribute occupancySensorTypeBitmap;
2372-
ram attribute featureMap default = 0;
2372+
callback attribute featureMap;
23732373
ram attribute clusterRevision default = 5;
23742374
}
23752375
}

examples/lighting-app/lighting-common/lighting-app.matter

+1-1
Original file line numberDiff line numberDiff line change
@@ -3193,7 +3193,7 @@ endpoint 1 {
31933193
ram attribute occupancy;
31943194
ram attribute occupancySensorType;
31953195
ram attribute occupancySensorTypeBitmap;
3196-
ram attribute featureMap default = 0;
3196+
callback attribute featureMap;
31973197
ram attribute clusterRevision default = 5;
31983198
}
31993199
}

examples/placeholder/linux/apps/app1/config.matter

+1-1
Original file line numberDiff line numberDiff line change
@@ -9589,7 +9589,7 @@ endpoint 1 {
95899589
ram attribute physicalContactOccupiedToUnoccupiedDelay default = 0x00;
95909590
ram attribute physicalContactUnoccupiedToOccupiedDelay default = 0x00;
95919591
ram attribute physicalContactUnoccupiedToOccupiedThreshold default = 1;
9592-
ram attribute featureMap default = 0;
9592+
callback attribute featureMap;
95939593
callback attribute clusterRevision default = 5;
95949594
}
95959595
}

examples/placeholder/linux/apps/app2/config.matter

+1-1
Original file line numberDiff line numberDiff line change
@@ -9528,7 +9528,7 @@ endpoint 1 {
95289528
ram attribute physicalContactOccupiedToUnoccupiedDelay default = 0x00;
95299529
ram attribute physicalContactUnoccupiedToOccupiedDelay default = 0x00;
95309530
ram attribute physicalContactUnoccupiedToOccupiedThreshold default = 1;
9531-
ram attribute featureMap default = 0;
9531+
callback attribute featureMap;
95329532
callback attribute clusterRevision default = 5;
95339533
}
95349534
}

scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/endpoint_config.h

+14-14
Original file line numberDiff line numberDiff line change
@@ -1575,11 +1575,11 @@
15751575
{ ZAP_SIMPLE_DEFAULT(3), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
15761576
\
15771577
/* Endpoint: 1, Cluster: Occupancy Sensing (server) */ \
1578-
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 1, ZAP_TYPE(BITMAP8), 0 }, /* Occupancy */ \
1579-
{ ZAP_EMPTY_DEFAULT(), 0x00000001, 1, ZAP_TYPE(ENUM8), 0 }, /* OccupancySensorType */ \
1580-
{ ZAP_EMPTY_DEFAULT(), 0x00000002, 1, ZAP_TYPE(BITMAP8), 0 }, /* OccupancySensorTypeBitmap */ \
1581-
{ ZAP_SIMPLE_DEFAULT(0), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), 0 }, /* FeatureMap */ \
1582-
{ ZAP_SIMPLE_DEFAULT(4), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
1578+
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 1, ZAP_TYPE(BITMAP8), 0 }, /* Occupancy */ \
1579+
{ ZAP_EMPTY_DEFAULT(), 0x00000001, 1, ZAP_TYPE(ENUM8), 0 }, /* OccupancySensorType */ \
1580+
{ ZAP_EMPTY_DEFAULT(), 0x00000002, 1, ZAP_TYPE(BITMAP8), 0 }, /* OccupancySensorTypeBitmap */ \
1581+
{ ZAP_EMPTY_DEFAULT(), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) }, /* FeatureMap */ \
1582+
{ ZAP_SIMPLE_DEFAULT(4), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
15831583
\
15841584
/* Endpoint: 1, Cluster: Carbon Monoxide Concentration Measurement (server) */ \
15851585
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 4, ZAP_TYPE(SINGLE), \
@@ -2016,11 +2016,11 @@
20162016
{ ZAP_SIMPLE_DEFAULT(1), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
20172017
\
20182018
/* Endpoint: 2, Cluster: Occupancy Sensing (server) */ \
2019-
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 1, ZAP_TYPE(BITMAP8), 0 }, /* Occupancy */ \
2020-
{ ZAP_EMPTY_DEFAULT(), 0x00000001, 1, ZAP_TYPE(ENUM8), 0 }, /* OccupancySensorType */ \
2021-
{ ZAP_EMPTY_DEFAULT(), 0x00000002, 1, ZAP_TYPE(BITMAP8), 0 }, /* OccupancySensorTypeBitmap */ \
2022-
{ ZAP_SIMPLE_DEFAULT(0), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), 0 }, /* FeatureMap */ \
2023-
{ ZAP_SIMPLE_DEFAULT(4), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
2019+
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 1, ZAP_TYPE(BITMAP8), 0 }, /* Occupancy */ \
2020+
{ ZAP_EMPTY_DEFAULT(), 0x00000001, 1, ZAP_TYPE(ENUM8), 0 }, /* OccupancySensorType */ \
2021+
{ ZAP_EMPTY_DEFAULT(), 0x00000002, 1, ZAP_TYPE(BITMAP8), 0 }, /* OccupancySensorTypeBitmap */ \
2022+
{ ZAP_EMPTY_DEFAULT(), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) }, /* FeatureMap */ \
2023+
{ ZAP_SIMPLE_DEFAULT(4), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
20242024
\
20252025
/* Endpoint: 65534, Cluster: Descriptor (server) */ \
20262026
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 0, ZAP_TYPE(ARRAY), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) }, /* DeviceTypeList */ \
@@ -3884,7 +3884,7 @@
38843884
.clusterId = 0x00000406, \
38853885
.attributes = ZAP_ATTRIBUTE_INDEX(761), \
38863886
.attributeCount = 5, \
3887-
.clusterSize = 9, \
3887+
.clusterSize = 5, \
38883888
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
38893889
.functions = chipFuncArrayOccupancySensingServer, \
38903890
.acceptedCommandList = nullptr, \
@@ -4157,7 +4157,7 @@
41574157
.clusterId = 0x00000406, \
41584158
.attributes = ZAP_ATTRIBUTE_INDEX(1033), \
41594159
.attributeCount = 5, \
4160-
.clusterSize = 9, \
4160+
.clusterSize = 5, \
41614161
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
41624162
.functions = chipFuncArrayOccupancySensingServer, \
41634163
.acceptedCommandList = nullptr, \
@@ -4200,7 +4200,7 @@
42004200
// This is an array of EmberAfEndpointType structures.
42014201
#define GENERATED_ENDPOINT_TYPES \
42024202
{ \
4203-
{ ZAP_CLUSTER_INDEX(0), 29, 349 }, { ZAP_CLUSTER_INDEX(29), 74, 3521 }, { ZAP_CLUSTER_INDEX(103), 7, 126 }, \
4203+
{ ZAP_CLUSTER_INDEX(0), 29, 349 }, { ZAP_CLUSTER_INDEX(29), 74, 3517 }, { ZAP_CLUSTER_INDEX(103), 7, 122 }, \
42044204
{ ZAP_CLUSTER_INDEX(110), 2, 0 }, \
42054205
}
42064206

@@ -4213,7 +4213,7 @@ static_assert(ATTRIBUTE_LARGEST <= CHIP_CONFIG_MAX_ATTRIBUTE_STORE_ELEMENT_SIZE,
42134213
#define ATTRIBUTE_SINGLETONS_SIZE (36)
42144214

42154215
// Total size of attribute storage
4216-
#define ATTRIBUTE_MAX_SIZE (3996)
4216+
#define ATTRIBUTE_MAX_SIZE (3988)
42174217

42184218
// Number of fixed endpoints
42194219
#define FIXED_ENDPOINT_COUNT (4)

scripts/tools/zap/tests/outputs/lighting-app/app-templates/endpoint_config.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -536,11 +536,11 @@
536536
{ ZAP_SIMPLE_DEFAULT(7), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
537537
\
538538
/* Endpoint: 1, Cluster: Occupancy Sensing (server) */ \
539-
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 1, ZAP_TYPE(BITMAP8), 0 }, /* Occupancy */ \
540-
{ ZAP_EMPTY_DEFAULT(), 0x00000001, 1, ZAP_TYPE(ENUM8), 0 }, /* OccupancySensorType */ \
541-
{ ZAP_EMPTY_DEFAULT(), 0x00000002, 1, ZAP_TYPE(BITMAP8), 0 }, /* OccupancySensorTypeBitmap */ \
542-
{ ZAP_SIMPLE_DEFAULT(0), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), 0 }, /* FeatureMap */ \
543-
{ ZAP_SIMPLE_DEFAULT(4), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
539+
{ ZAP_EMPTY_DEFAULT(), 0x00000000, 1, ZAP_TYPE(BITMAP8), 0 }, /* Occupancy */ \
540+
{ ZAP_EMPTY_DEFAULT(), 0x00000001, 1, ZAP_TYPE(ENUM8), 0 }, /* OccupancySensorType */ \
541+
{ ZAP_EMPTY_DEFAULT(), 0x00000002, 1, ZAP_TYPE(BITMAP8), 0 }, /* OccupancySensorTypeBitmap */ \
542+
{ ZAP_EMPTY_DEFAULT(), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) }, /* FeatureMap */ \
543+
{ ZAP_SIMPLE_DEFAULT(4), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
544544
}
545545

546546
// clang-format off
@@ -1170,7 +1170,7 @@
11701170
.clusterId = 0x00000406, \
11711171
.attributes = ZAP_ATTRIBUTE_INDEX(271), \
11721172
.attributeCount = 5, \
1173-
.clusterSize = 9, \
1173+
.clusterSize = 5, \
11741174
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
11751175
.functions = chipFuncArrayOccupancySensingServer, \
11761176
.acceptedCommandList = nullptr, \
@@ -1187,7 +1187,7 @@
11871187
// This is an array of EmberAfEndpointType structures.
11881188
#define GENERATED_ENDPOINT_TYPES \
11891189
{ \
1190-
{ ZAP_CLUSTER_INDEX(0), 21, 223 }, { ZAP_CLUSTER_INDEX(21), 8, 121 }, \
1190+
{ ZAP_CLUSTER_INDEX(0), 21, 223 }, { ZAP_CLUSTER_INDEX(21), 8, 117 }, \
11911191
}
11921192

11931193
// Largest attribute size is needed for various buffers
@@ -1199,7 +1199,7 @@ static_assert(ATTRIBUTE_LARGEST <= CHIP_CONFIG_MAX_ATTRIBUTE_STORE_ELEMENT_SIZE,
11991199
#define ATTRIBUTE_SINGLETONS_SIZE (36)
12001200

12011201
// Total size of attribute storage
1202-
#define ATTRIBUTE_MAX_SIZE (344)
1202+
#define ATTRIBUTE_MAX_SIZE (340)
12031203

12041204
// Number of fixed endpoints
12051205
#define FIXED_ENDPOINT_COUNT (2)

src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.cpp

+31-4
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,18 @@ Structs::HoldTimeLimitsStruct::Type
3939
uint16_t sHoldTime[MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT];
4040
} // namespace
4141

42-
CHIP_ERROR OccupancySensingAttrAccess::Init()
42+
CHIP_ERROR Instance::Init()
4343
{
4444
VerifyOrReturnError(registerAttributeAccessOverride(this), CHIP_ERROR_INCORRECT_STATE);
4545
return CHIP_NO_ERROR;
4646
}
4747

48-
void OccupancySensingAttrAccess::Shutdown()
48+
void Instance::Shutdown()
4949
{
5050
unregisterAttributeAccessOverride(this);
5151
}
5252

53-
CHIP_ERROR OccupancySensingAttrAccess::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder)
53+
CHIP_ERROR Instance::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder)
5454
{
5555
VerifyOrDie(aPath.mClusterId == app::Clusters::OccupancySensing::Id);
5656

@@ -88,7 +88,34 @@ CHIP_ERROR OccupancySensingAttrAccess::Read(const ConcreteReadAttributePath & aP
8888
return CHIP_NO_ERROR;
8989
}
9090

91-
bool OccupancySensingAttrAccess::HasFeature(Feature aFeature) const
91+
CHIP_ERROR Instance::Write(const ConcreteDataAttributePath & aPath, AttributeValueDecoder & aDecoder)
92+
{
93+
VerifyOrDie(aPath.mClusterId == app::Clusters::OccupancySensing::Id);
94+
95+
switch (aPath.mAttributeId)
96+
{
97+
case Attributes::HoldTime::Id: {
98+
99+
uint16_t newHoldTime;
100+
101+
ReturnErrorOnFailure(aDecoder.Decode(newHoldTime));
102+
103+
Structs::HoldTimeLimitsStruct::Type * currHoldTimeLimits = GetHoldTimeLimitsForEndpoint(aPath.mEndpointId);
104+
VerifyOrReturnError(currHoldTimeLimits != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
105+
VerifyOrReturnError(newHoldTime >= currHoldTimeLimits->holdTimeMin, CHIP_IM_GLOBAL_STATUS(ConstraintError));
106+
VerifyOrReturnError(newHoldTime <= currHoldTimeLimits->holdTimeMax, CHIP_IM_GLOBAL_STATUS(ConstraintError));
107+
108+
return SetHoldTime(aPath.mEndpointId, newHoldTime);
109+
}
110+
default: {
111+
break;
112+
}
113+
}
114+
115+
return CHIP_NO_ERROR;
116+
}
117+
118+
bool Instance::HasFeature(Feature aFeature) const
92119
{
93120
return mFeature.Has(aFeature);
94121
}

0 commit comments

Comments
 (0)