Skip to content

Commit c0045c0

Browse files
Add setting Features in Meter Indetification cluster
1 parent bf58d13 commit c0045c0

File tree

6 files changed

+47
-11
lines changed

6 files changed

+47
-11
lines changed

examples/all-clusters-app/all-clusters-common/src/meter-identification-stub.cpp

+17-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ using Feature = chip::app::Clusters::MeterIdentification::Feature;
2525

2626
static std::unique_ptr<MeterIdentificationDelegate> gMIDelegate;
2727
static std::unique_ptr<MeterIdentificationInstance> gMIInstance;
28+
static BitMask<Feature> gMIFeature = BitMask<Feature, uint32_t>(Feature::kPowerThreshold);
2829

2930
void emberAfMeterIdentificationClusterInitCallback(chip::EndpointId endpointId)
3031
{
@@ -39,7 +40,7 @@ void emberAfMeterIdentificationClusterInitCallback(chip::EndpointId endpointId)
3940
gMIDelegate->Init();
4041

4142
gMIInstance = std::make_unique<MeterIdentificationInstance>(endpointId, *gMIDelegate,
42-
BitMask<Feature, uint32_t>(Feature::kPowerThreshold));
43+
gMIFeature);
4344

4445
gMIInstance->Init();
4546
}
@@ -49,3 +50,18 @@ MeterIdentificationDelegate * chip::app::Clusters::MeterIdentification::GetDeleg
4950
{
5051
return &(*gMIDelegate);
5152
}
53+
54+
namespace chip::app::Clusters::MeterIdentification {
55+
56+
void RestartServer(uint32_t features)
57+
{
58+
gMIFeature = static_cast<BitMask<Feature>>(features);
59+
60+
VerifyOrDie(gMIInstance);
61+
gMIInstance.reset();
62+
63+
gMIInstance = std::make_unique<MeterIdentificationInstance>(1, *gMIDelegate, gMIFeature);
64+
gMIInstance->Init();
65+
}
66+
67+
}

examples/energy-management-app/energy-management-common/include/MeterIdentificationDelegate.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,22 @@ class MeterIdentificationDelegate : public MeterIdentification::Delegate
4141
DataModel::Nullable<MeterTypeEnum> GetMeterType() override { return mMeterType; };
4242
DataModel::Nullable<CharSpan> GetUtilityName() override { return mUtilityName; };
4343
DataModel::Nullable<CharSpan> GetPointOfDelivery() override { return mPointOfDelivery; };
44-
DataModel::Nullable<uint64_t> GetPowerThreshold() override { return mPowerThreshold; };
44+
DataModel::Nullable<int64_t> GetPowerThreshold() override { return mPowerThreshold; };
4545
DataModel::Nullable<PowerThresholdSourceEnum> GetPowerThresholdSource() override { return mPowerThresholdSource; };
4646

4747
// Internal Application API to set attribute values
4848
CHIP_ERROR SetMeterType(DataModel::Nullable<MeterTypeEnum>);
4949
CHIP_ERROR SetUtilityName(DataModel::Nullable<CharSpan> value);
5050
CHIP_ERROR SetPointOfDelivery(DataModel::Nullable<CharSpan> value);
51-
CHIP_ERROR SetPowerThreshold(DataModel::Nullable<uint64_t>);
51+
CHIP_ERROR SetPowerThreshold(DataModel::Nullable<int64_t>);
5252
CHIP_ERROR SetPowerThresholdSource(DataModel::Nullable<PowerThresholdSourceEnum>);
5353

5454
private:
5555
// Attribute storage
5656
DataModel::Nullable<MeterTypeEnum> mMeterType;
5757
DataModel::Nullable<CharSpan> mUtilityName;
5858
DataModel::Nullable<CharSpan> mPointOfDelivery;
59-
DataModel::Nullable<uint64_t> mPowerThreshold;
59+
DataModel::Nullable<int64_t> mPowerThreshold;
6060
DataModel::Nullable<PowerThresholdSourceEnum> mPowerThresholdSource;
6161
};
6262

examples/energy-management-app/energy-management-common/src/MeterIdentificationDelegate.cpp

+16-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ using chip::app::Clusters::MeterIdentification::PowerThresholdSourceEnum;
3434
constexpr size_t kUtilityNameSize = 16;
3535
constexpr size_t kPointOfDeliverySize = 16;
3636

37+
namespace chip::app::Clusters::MeterIdentification {
38+
void RestartServer(uint32_t features);
39+
}
40+
3741
CHIP_ERROR MeterIdentificationInstance::Init()
3842
{
3943
return Instance::Init();
@@ -74,6 +78,16 @@ CHIP_ERROR MeterIdentificationDelegate::LoadJson(Json::Value & root)
7478
{
7579
Json::Value value;
7680

81+
if (root.isMember("Features"))
82+
{
83+
value = root.get("Features", Json::Value());
84+
if (value.isUInt() && value.asUInt() <= 0x01)
85+
{
86+
RestartServer(value.asUInt());
87+
return CHIP_NO_ERROR;
88+
}
89+
}
90+
7791
if (root.isMember("MeterType"))
7892
{
7993
value = root.get("MeterType", Json::Value());
@@ -86,7 +100,7 @@ CHIP_ERROR MeterIdentificationDelegate::LoadJson(Json::Value & root)
86100
SetMeterType(std::nullopt);
87101
}
88102
}
89-
103+
90104
if (root.isMember("UtilityName"))
91105
{
92106
value = root.get("UtilityName", Json::Value());
@@ -209,7 +223,7 @@ CHIP_ERROR MeterIdentificationDelegate::SetPointOfDelivery(DataModel::Nullable<C
209223
return CHIP_NO_ERROR;
210224
}
211225

212-
CHIP_ERROR MeterIdentificationDelegate::SetPowerThreshold(DataModel::Nullable<uint64_t> newValue)
226+
CHIP_ERROR MeterIdentificationDelegate::SetPowerThreshold(DataModel::Nullable<int64_t> newValue)
213227
{
214228
// DataModel::Nullable<uint64_t> oldValue = mPowerThreshold;
215229

src/app/clusters/energy-calendar-server/energy-calendar-server.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -521,12 +521,12 @@ CHIP_ERROR EnergyCalendarServer::Read(const ConcreteReadAttributePath & aPath, A
521521
if (feature.Has(Feature::kPeakPeriod))
522522
return aEncoder.Encode(provider->GetCurrentPeakPeriod());
523523
else
524-
return CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute);
524+
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
525525
case NextPeakPeriod::Id:
526526
if (feature.Has(Feature::kPeakPeriod))
527527
return aEncoder.Encode(provider->GetNextPeakPeriod());
528528
else
529-
return CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute);
529+
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
530530
/* FeatureMap - is held locally */
531531
case FeatureMap::Id:
532532
return aEncoder.Encode(feature);

src/app/clusters/meter-identification-server/meter-identification-server.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,17 @@ CHIP_ERROR Instance::Read(const ConcreteReadAttributePath & aPath, AttributeValu
8484
break;
8585

8686
case PowerThreshold::Id:
87-
ReturnErrorOnFailure(aEncoder.Encode(mDelegate.GetPowerThreshold()));
87+
if (HasFeature(Feature::kPowerThreshold))
88+
ReturnErrorOnFailure(aEncoder.Encode(mDelegate.GetPowerThreshold()));
89+
else
90+
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
8891
break;
8992

9093
case PowerThresholdSource::Id:
91-
ReturnErrorOnFailure(aEncoder.Encode(mDelegate.GetPowerThresholdSource()));
94+
if (HasFeature(Feature::kPowerThreshold))
95+
ReturnErrorOnFailure(aEncoder.Encode(mDelegate.GetPowerThresholdSource()));
96+
else
97+
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
9298
break;
9399
}
94100
return CHIP_NO_ERROR;

src/app/clusters/meter-identification-server/meter-identification-server.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ struct Delegate
4646
virtual DataModel::Nullable<MeterTypeEnum> GetMeterType() = 0;
4747
virtual DataModel::Nullable<CharSpan> GetUtilityName() = 0;
4848
virtual DataModel::Nullable<CharSpan> GetPointOfDelivery() = 0;
49-
virtual DataModel::Nullable<uint64_t> GetPowerThreshold() = 0;
49+
virtual DataModel::Nullable<int64_t> GetPowerThreshold() = 0;
5050
virtual DataModel::Nullable<PowerThresholdSourceEnum> GetPowerThresholdSource() = 0;
5151

5252
protected:

0 commit comments

Comments
 (0)