Skip to content

Commit 3e9b04f

Browse files
committed
Fix TLV Reader in LastChangedTime
1 parent 3718e99 commit 3e9b04f

8 files changed

+443
-23
lines changed

examples/chef/common/chef-resource-monitoring-delegates.cpp examples/chef/common/clusters/resource-monitoring/chef-resource-monitoring-delegates.cpp

+140-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (c) 2023 Project CHIP Authors
3+
* Copyright (c) 2024 Project CHIP Authors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
66
* you may not use this file except in compliance with the License.
@@ -15,11 +15,13 @@
1515
* limitations under the License.
1616
*/
1717

18+
#include <utility>
1819
#include <app-common/zap-generated/ids/Attributes.h>
1920
#include <app-common/zap-generated/ids/Clusters.h>
2021
#include <app/clusters/resource-monitoring-server/resource-monitoring-cluster-objects.h>
2122
#include <app/clusters/resource-monitoring-server/resource-monitoring-server.h>
22-
#include <chef-resource-monitoring-delegates.h>
23+
#include <resource-monitoring/chef-resource-monitoring-delegates.h>
24+
#include <lib/core/TLVReader.h>
2325

2426
using namespace chip;
2527
using namespace chip::app;
@@ -37,10 +39,10 @@ const chip::BitMask<ResourceMonitoring::Feature> gActivatedCarbonFeatureMap(Reso
3739
ResourceMonitoring::Feature::kReplacementProductList);
3840

3941
static std::unique_ptr<ActivatedCarbonFilterMonitoringDelegate> gActivatedCarbonFilterDelegate;
40-
static std::unique_ptr<ResourceMonitoring::Instance> gActivatedCarbonFilterInstance;
42+
static std::unique_ptr<ResourceMonitoring::ChefResourceMonitorInstance> gActivatedCarbonFilterInstance;
4143

4244
static std::unique_ptr<HepaFilterMonitoringDelegate> gHepaFilterDelegate;
43-
static std::unique_ptr<ResourceMonitoring::Instance> gHepaFilterInstance;
45+
static std::unique_ptr<ResourceMonitoring::ChefResourceMonitorInstance> gHepaFilterInstance;
4446

4547
static ImmutableReplacementProductListManager sReplacementProductListManager;
4648

@@ -96,25 +98,155 @@ void HepaFilterMonitoring::Shutdown()
9698
gHepaFilterDelegate.reset();
9799
}
98100

101+
chip::Protocols::InteractionModel::Status ChefResourceMonitorInstance::ExternalAttributeWrite(const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer)
102+
{
103+
Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success;
104+
AttributeId attributeId = attributeMetadata->attributeId;
105+
106+
switch (attributeId) {
107+
case HepaFilterMonitoring::Attributes::Condition::Id:
108+
{
109+
uint8_t newCondition = *(uint8_t *)buffer;
110+
ret = UpdateCondition(newCondition);
111+
}
112+
break;
113+
case HepaFilterMonitoring::Attributes::ChangeIndication::Id:
114+
{
115+
ResourceMonitoring::ChangeIndicationEnum newIndication = static_cast<ResourceMonitoring::ChangeIndicationEnum>(*(uint8_t *)buffer);
116+
ret = UpdateChangeIndication(newIndication);
117+
}
118+
break;
119+
case HepaFilterMonitoring::Attributes::InPlaceIndicator::Id:
120+
{
121+
bool newInPlaceIndicator = *(bool *)buffer;
122+
ret = UpdateInPlaceIndicator(newInPlaceIndicator);
123+
}
124+
break;
125+
case HepaFilterMonitoring::Attributes::LastChangedTime::Id:
126+
{
127+
uint32_t newValue = 0;
128+
uint16_t tlvLen = *(uint16_t *) buffer;
129+
chip::TLV::TLVReader reader;
130+
reader.Init(buffer + sizeof(uint16_t), tlvLen);
131+
reader.Next();
132+
reader.Get(newValue);
133+
DataModel::Nullable<uint32_t> newLastChangedTime = DataModel::MakeNullable(newValue);
134+
ret = UpdateLastChangedTime(newLastChangedTime);
135+
}
136+
break;
137+
case HepaFilterMonitoring::Attributes::DegradationDirection::Id:
138+
default:
139+
{
140+
ChipLogError(Zcl, "Unsupported External Attribute Read: %d", static_cast<int>(attributeId));
141+
ret = Protocols::InteractionModel::Status::UnsupportedWrite;
142+
}
143+
break;
144+
}
145+
146+
return ret;
147+
}
148+
99149
void emberAfActivatedCarbonFilterMonitoringClusterInitCallback(chip::EndpointId endpoint)
100150
{
101151
VerifyOrDie(!gActivatedCarbonFilterInstance && !gActivatedCarbonFilterDelegate);
102-
gActivatedCarbonFilterDelegate = std::make_unique<ActivatedCarbonFilterMonitoringDelegate>();
152+
103153
bool bResetConditionCommandSupported = true; // The ResetCondition command is supported by the ResourceMonitor cluster
104-
gActivatedCarbonFilterInstance = std::make_unique<ResourceMonitoring::Instance>(
154+
gActivatedCarbonFilterDelegate = std::make_unique<ActivatedCarbonFilterMonitoringDelegate>();
155+
gActivatedCarbonFilterInstance = std::make_unique<ResourceMonitoring::ChefResourceMonitorInstance>(
105156
gActivatedCarbonFilterDelegate.get(), endpoint, ActivatedCarbonFilterMonitoring::Id,
106157
static_cast<uint32_t>(gActivatedCarbonFeatureMap.Raw()), ResourceMonitoring::DegradationDirectionEnum::kDown,
107158
bResetConditionCommandSupported);
108159
gActivatedCarbonFilterInstance->Init();
109160
}
110161

162+
chip::Protocols::InteractionModel::Status chefResourceMonitoringExternalWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer)
163+
{
164+
Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success;
165+
AttributeId attributeId = attributeMetadata->attributeId;
166+
ChipLogProgress(Zcl, "chefResourceMonitoringExternalWriteCallback EP: %d, Cluster: %d, Att: %d", static_cast<int>(endpoint), static_cast<int>(clusterId), static_cast<int>(attributeId));
167+
168+
switch (clusterId) {
169+
case HepaFilterMonitoring::Id:
170+
ret = gHepaFilterInstance->ExternalAttributeWrite(attributeMetadata, buffer);
171+
break;
172+
case ActivatedCarbonFilterMonitoring::Id:
173+
ret = gActivatedCarbonFilterInstance->ExternalAttributeWrite(attributeMetadata, buffer);
174+
break;
175+
default:
176+
ret = Protocols::InteractionModel::Status::UnsupportedWrite;
177+
break;
178+
}
179+
180+
return ret;
181+
}
182+
183+
chip::Protocols::InteractionModel::Status chefResourceMonitoringExternalReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, uint16_t maxReadLength)
184+
{
185+
Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success;
186+
AttributeId attributeId = attributeMetadata->attributeId;
187+
ChipLogProgress(Zcl, "chefResourceMonitoringExternalReadCallback EP: %d, Cluster: %d, Att: %d", static_cast<int>(endpoint), static_cast<int>(clusterId), static_cast<int>(attributeId));
188+
189+
switch (clusterId) {
190+
case HepaFilterMonitoring::Id:
191+
ret = gHepaFilterInstance->ExternalAttributeRead(attributeMetadata, buffer, maxReadLength);
192+
break;
193+
case ActivatedCarbonFilterMonitoring::Id:
194+
ret = gActivatedCarbonFilterInstance->ExternalAttributeRead(attributeMetadata, buffer, maxReadLength);
195+
break;
196+
default:
197+
ret = Protocols::InteractionModel::Status::UnsupportedRead;
198+
break;
199+
}
200+
201+
return ret;
202+
}
203+
204+
chip::Protocols::InteractionModel::Status ChefResourceMonitorInstance::ExternalAttributeRead(const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, uint16_t maxReadLength)
205+
{
206+
Protocols::InteractionModel::Status ret = Protocols::InteractionModel::Status::Success;
207+
AttributeId attributeId = attributeMetadata->attributeId;
208+
209+
switch (attributeId) {
210+
case HepaFilterMonitoring::Attributes::Condition::Id:
211+
{
212+
*buffer = GetCondition();
213+
}
214+
break;
215+
case HepaFilterMonitoring::Attributes::ChangeIndication::Id:
216+
{
217+
ResourceMonitoring::ChangeIndicationEnum changeIndication = GetChangeIndication();
218+
// The underlying type of ResourceMonitoring::ChangeIndicationEnum is uint8_t
219+
*buffer = to_underlying(changeIndication);
220+
}
221+
break;
222+
case HepaFilterMonitoring::Attributes::InPlaceIndicator::Id:
223+
{
224+
*(bool *)buffer = GetInPlaceIndicator();
225+
}
226+
break;
227+
case HepaFilterMonitoring::Attributes::LastChangedTime::Id:
228+
{
229+
DataModel::Nullable<uint32_t> lastChangedTime = GetLastChangedTime();
230+
*(uint32_t *)buffer = lastChangedTime.IsNull() ? 0 : lastChangedTime.Value();
231+
}
232+
break;
233+
case HepaFilterMonitoring::Attributes::DegradationDirection::Id:
234+
default:
235+
ChipLogError(Zcl, "Unsupported External Attribute Read: %d", static_cast<int>(attributeId));
236+
ret = Protocols::InteractionModel::Status::UnsupportedRead;
237+
break;
238+
}
239+
240+
return ret;
241+
}
242+
111243
void emberAfHepaFilterMonitoringClusterInitCallback(chip::EndpointId endpoint)
112244
{
113245
VerifyOrDie(!gHepaFilterInstance && !gHepaFilterDelegate);
114246

115-
gHepaFilterDelegate = std::make_unique<HepaFilterMonitoringDelegate>();
116247
bool bResetConditionCommandSupported = true; // The ResetCondition command is supported by the ResourceMonitor cluster
117-
gHepaFilterInstance = std::make_unique<ResourceMonitoring::Instance>(
248+
gHepaFilterDelegate = std::make_unique<HepaFilterMonitoringDelegate>();
249+
gHepaFilterInstance = std::make_unique<ResourceMonitoring::ChefResourceMonitorInstance>(
118250
gHepaFilterDelegate.get(), endpoint, HepaFilterMonitoring::Id, static_cast<uint32_t>(gHepaFilterFeatureMap.Raw()),
119251
ResourceMonitoring::DegradationDirectionEnum::kDown, bResetConditionCommandSupported);
120252
gHepaFilterInstance->Init();

examples/chef/common/chef-resource-monitoring-delegates.h examples/chef/common/clusters/resource-monitoring/chef-resource-monitoring-delegates.h

+34-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (c) 2023 Project CHIP Authors
3+
* Copyright (c) 2024 Project CHIP Authors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
66
* you may not use this file except in compliance with the License.
@@ -24,21 +24,24 @@ namespace chip {
2424
namespace app {
2525
namespace Clusters {
2626

27-
namespace ActivatedCarbonFilterMonitoring {
28-
class ActivatedCarbonFilterMonitoringDelegate : public ResourceMonitoring::Delegate
29-
{
30-
private:
31-
CHIP_ERROR Init() override;
32-
chip::Protocols::InteractionModel::Status PreResetCondition() override;
33-
chip::Protocols::InteractionModel::Status PostResetCondition() override;
27+
namespace ResourceMonitoring {
3428

29+
// Inherit ResourceMonitoring class to able to write external attributes
30+
class ChefResourceMonitorInstance : public ResourceMonitoring::Instance
31+
{
3532
public:
36-
~ActivatedCarbonFilterMonitoringDelegate() override = default;
33+
ChefResourceMonitorInstance(Delegate * aDelegate, EndpointId aEndpointId, ClusterId aClusterId, uint32_t aFeatureMap,
34+
ResourceMonitoring::Attributes::DegradationDirection::TypeInfo::Type aDegradationDirection,
35+
bool aResetConditionCommandSupported) : ResourceMonitoring::Instance(aDelegate, aEndpointId, aClusterId, aFeatureMap,
36+
aDegradationDirection, aResetConditionCommandSupported) { };
37+
38+
chip::Protocols::InteractionModel::Status ExternalAttributeWrite(const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer);
39+
chip::Protocols::InteractionModel::Status ExternalAttributeRead(const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, uint16_t maxReadLength);
40+
3741
};
3842

39-
void Shutdown();
43+
} // namespace ResourceMonitor
4044

41-
} // namespace ActivatedCarbonFilterMonitoring
4245

4346
namespace HepaFilterMonitoring {
4447
class HepaFilterMonitoringDelegate : public ResourceMonitoring::Delegate
@@ -63,6 +66,26 @@ void Shutdown();
6366

6467
} // namespace HepaFilterMonitoring
6568

69+
namespace ActivatedCarbonFilterMonitoring {
70+
class ActivatedCarbonFilterMonitoringDelegate : public ResourceMonitoring::Delegate
71+
{
72+
private:
73+
CHIP_ERROR Init() override;
74+
chip::Protocols::InteractionModel::Status PreResetCondition() override;
75+
chip::Protocols::InteractionModel::Status PostResetCondition() override;
76+
77+
public:
78+
~ActivatedCarbonFilterMonitoringDelegate() override = default;
79+
};
80+
81+
void Shutdown();
82+
83+
} // namespace ActivatedCarbonFilterMonitoring
84+
6685
} // namespace Clusters
6786
} // namespace app
6887
} // namespace chip
88+
89+
chip::Protocols::InteractionModel::Status chefResourceMonitoringExternalWriteCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer);
90+
91+
chip::Protocols::InteractionModel::Status chefResourceMonitoringExternalReadCallback(chip::EndpointId endpoint, chip::ClusterId clusterId, const EmberAfAttributeMetadata * attributeMetadata, uint8_t * buffer, uint16_t maxReadLength);

examples/chef/common/stubs.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
defined(MATTER_DM_PLUGIN_RADON_CONCENTRATION_MEASUREMENT_SERVER)
1919
#include "chef-concentration-measurement.h"
2020
#endif
21+
#if defined(MATTER_DM_PLUGIN_HEPA_FILTER_MONITORING_SERVER) || \
22+
defined(MATTER_DM_PLUGIN_ACTIVATED_CARBON_FILTER_MONITORING_SERVER)
23+
#include "resource-monitoring/chef-resource-monitoring-delegates.h"
24+
#endif
25+
2126

2227
using chip::app::DataModel::Nullable;
2328

@@ -56,6 +61,12 @@ Protocols::InteractionModel::Status emberAfExternalAttributeReadCallback(Endpoin
5661
case chip::app::Clusters::RadonConcentrationMeasurement::Id:
5762
case chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::Id:
5863
return chefConcentrationMeasurementReadCallback(endpoint, clusterId, attributeMetadata, buffer, maxReadLength);
64+
#endif
65+
#if defined(MATTER_DM_PLUGIN_HEPA_FILTER_MONITORING_SERVER) || \
66+
defined(MATTER_DM_PLUGIN_ACTIVATED_CARBON_FILTER_MONITORING_SERVER)
67+
case chip::app::Clusters::HepaFilterMonitoring::Id:
68+
case chip::app::Clusters::ActivatedCarbonFilterMonitoring::Id:
69+
return chefResourceMonitoringExternalReadCallback(endpoint, clusterId, attributeMetadata, buffer, maxReadLength);
5970
#endif
6071
default:
6172
break;
@@ -104,6 +115,12 @@ Protocols::InteractionModel::Status emberAfExternalAttributeWriteCallback(Endpoi
104115
case chip::app::Clusters::RadonConcentrationMeasurement::Id:
105116
case chip::app::Clusters::TotalVolatileOrganicCompoundsConcentrationMeasurement::Id:
106117
return chefConcentrationMeasurementWriteCallback(endpoint, clusterId, attributeMetadata, buffer);
118+
#endif
119+
#if defined(MATTER_DM_PLUGIN_HEPA_FILTER_MONITORING_SERVER) || \
120+
defined(MATTER_DM_PLUGIN_ACTIVATED_CARBON_FILTER_MONITORING_SERVER)
121+
case chip::app::Clusters::HepaFilterMonitoring::Id:
122+
case chip::app::Clusters::ActivatedCarbonFilterMonitoring::Id:
123+
return chefResourceMonitoringExternalWriteCallback(endpoint, clusterId, attributeMetadata, buffer);
107124
#endif
108125
default:
109126
break;

0 commit comments

Comments
 (0)