Skip to content

Commit 65263bb

Browse files
Merge branch 'master' into YAML-Updates-2-23-2024
2 parents 3d103ac + 2e35d01 commit 65263bb

File tree

15 files changed

+585
-71
lines changed

15 files changed

+585
-71
lines changed

examples/air-quality-sensor-app/linux/README.md

+18
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,21 @@ value.
165165
```
166166
$ echo '{"Name":"NitrogenDioxideConcentrationMeasurement","NewValue":1}' > /tmp/chip_air_quality_fifo_<PID>
167167
```
168+
169+
Generate event `Pm1ConcentrationMeasurement`, to change the PM1 value.
170+
171+
```
172+
echo '{"Name":"Pm1ConcentrationMeasurement","NewValue":1}' > /tmp/chip_air_quality_fifo_<PID>
173+
```
174+
175+
Generate event `Pm25ConcentrationMeasurement`, to change the PM2.5 value.
176+
177+
```
178+
echo '{"Name":"Pm25ConcentrationMeasurement","NewValue":2.5}' > /tmp/chip_air_quality_fifo_<PID>
179+
```
180+
181+
Generate event `Pm10ConcentrationMeasurement`, to change the PM10 value.
182+
183+
```
184+
echo '{"Name":"Pm10ConcentrationMeasurement","NewValue":10}' > /tmp/chip_air_quality_fifo_<PID>
185+
```
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
37 : [NXP] Update Docker image for RW61X SDK
1+
38 : [NXP] Update Docker image for K32W1 SDK

integrations/docker/images/stage-2/chip-build-k32w/Dockerfile

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ RUN set -x \
2424

2525
RUN set -x \
2626
&& mkdir -p k32w1 \
27-
&& wget https://cache.nxp.com/lgfiles/bsps/SDK_2_12_6_K32W148-EVK.zip \
28-
&& unzip SDK_2_12_6_K32W148-EVK.zip -d k32w1 \
29-
&& rm -rf SDK_2_12_6_K32W148-EVK.zip
27+
&& wget https://cache.nxp.com/lgfiles/bsps/SDK_2_12_7_K32W148-EVK.zip \
28+
&& unzip SDK_2_12_7_K32W148-EVK.zip -d k32w1 \
29+
&& rm -rf SDK_2_12_7_K32W148-EVK.zip
3030

3131
FROM ghcr.io/project-chip/chip-build:${VERSION}
3232

scripts/py_matter_yamltests/matter_yamltests/hooks.py

+11
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16+
from typing import Optional
17+
1618
from .parser import TestStep
1719

1820

@@ -213,6 +215,15 @@ async def step_manual(self):
213215
"""
214216
pass
215217

218+
def show_prompt(self,
219+
msg: str,
220+
placeholder: Optional[str] = None,
221+
default_value: Optional[str] = None) -> None:
222+
"""
223+
This method is called when the step needs to ask the user to perform some action or provide some value.
224+
"""
225+
pass
226+
216227

217228
class WebSocketRunnerHooks():
218229
def connecting(self, url: str):

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

+17-17
Original file line numberDiff line numberDiff line change
@@ -302,15 +302,15 @@
302302
{ (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x7 }, /* ControlMode */ \
303303
\
304304
/* Endpoint: 1, Cluster: Thermostat (server) */ \
305-
{ (uint16_t) 0xA28, (uint16_t) - 0x6AB3, (uint16_t) 0x7FFF }, /* OccupiedCoolingSetpoint */ \
306-
{ (uint16_t) 0x7D0, (uint16_t) - 0x6AB3, (uint16_t) 0x7FFF }, /* OccupiedHeatingSetpoint */ \
307-
{ (uint16_t) 0x2BC, (uint16_t) - 0x6AB3, (uint16_t) 0x7FFF }, /* MinHeatSetpointLimit */ \
308-
{ (uint16_t) 0xBB8, (uint16_t) - 0x6AB3, (uint16_t) 0x7FFF }, /* MaxHeatSetpointLimit */ \
309-
{ (uint16_t) 0x640, (uint16_t) - 0x6AB3, (uint16_t) 0x7FFF }, /* MinCoolSetpointLimit */ \
310-
{ (uint16_t) 0xC80, (uint16_t) - 0x6AB3, (uint16_t) 0x7FFF }, /* MaxCoolSetpointLimit */ \
311-
{ (uint16_t) 0x19, (uint16_t) 0x0, (uint16_t) 0x19 }, /* MinSetpointDeadBand */ \
312-
{ (uint16_t) 0x4, (uint16_t) 0x0, (uint16_t) 0x5 }, /* ControlSequenceOfOperation */ \
313-
{ (uint16_t) 0x1, (uint16_t) 0x0, (uint16_t) 0x9 }, /* SystemMode */ \
305+
{ (uint16_t) 0xA28, (uint16_t) -0x6AB3, (uint16_t) 0x7FFF }, /* OccupiedCoolingSetpoint */ \
306+
{ (uint16_t) 0x7D0, (uint16_t) -0x6AB3, (uint16_t) 0x7FFF }, /* OccupiedHeatingSetpoint */ \
307+
{ (uint16_t) 0x2BC, (uint16_t) -0x6AB3, (uint16_t) 0x7FFF }, /* MinHeatSetpointLimit */ \
308+
{ (uint16_t) 0xBB8, (uint16_t) -0x6AB3, (uint16_t) 0x7FFF }, /* MaxHeatSetpointLimit */ \
309+
{ (uint16_t) 0x640, (uint16_t) -0x6AB3, (uint16_t) 0x7FFF }, /* MinCoolSetpointLimit */ \
310+
{ (uint16_t) 0xC80, (uint16_t) -0x6AB3, (uint16_t) 0x7FFF }, /* MaxCoolSetpointLimit */ \
311+
{ (uint16_t) 0x19, (uint16_t) 0x0, (uint16_t) 0x19 }, /* MinSetpointDeadBand */ \
312+
{ (uint16_t) 0x4, (uint16_t) 0x0, (uint16_t) 0x5 }, /* ControlSequenceOfOperation */ \
313+
{ (uint16_t) 0x1, (uint16_t) 0x0, (uint16_t) 0x9 }, /* SystemMode */ \
314314
\
315315
/* Endpoint: 1, Cluster: Fan Control (server) */ \
316316
{ (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0x6 }, /* FanMode */ \
@@ -334,14 +334,14 @@
334334
{ (uint16_t) 0x0, (uint16_t) 0x0, (uint16_t) 0xFEFF }, /* StartUpColorTemperatureMireds */ \
335335
\
336336
/* Endpoint: 1, Cluster: Unit Testing (server) */ \
337-
{ (uint16_t) 0x46, (uint16_t) 0x14, (uint16_t) 0x64 }, /* range_restricted_int8u */ \
338-
{ (uint16_t) - 0x14, (uint16_t) - 0x28, (uint16_t) 0x32 }, /* range_restricted_int8s */ \
339-
{ (uint16_t) 0xC8, (uint16_t) 0x64, (uint16_t) 0x3E8 }, /* range_restricted_int16u */ \
340-
{ (uint16_t) - 0x64, (uint16_t) - 0x96, (uint16_t) 0xC8 }, /* range_restricted_int16s */ \
341-
{ (uint16_t) 0x46, (uint16_t) 0x14, (uint16_t) 0x64 }, /* nullable_range_restricted_int8u */ \
342-
{ (uint16_t) - 0x14, (uint16_t) - 0x28, (uint16_t) 0x32 }, /* nullable_range_restricted_int8s */ \
343-
{ (uint16_t) 0xC8, (uint16_t) 0x64, (uint16_t) 0x3E8 }, /* nullable_range_restricted_int16u */ \
344-
{ (uint16_t) - 0x64, (uint16_t) - 0x96, (uint16_t) 0xC8 }, /* nullable_range_restricted_int16s */ \
337+
{ (uint16_t) 0x46, (uint16_t) 0x14, (uint16_t) 0x64 }, /* range_restricted_int8u */ \
338+
{ (uint16_t) -0x14, (uint16_t) -0x28, (uint16_t) 0x32 }, /* range_restricted_int8s */ \
339+
{ (uint16_t) 0xC8, (uint16_t) 0x64, (uint16_t) 0x3E8 }, /* range_restricted_int16u */ \
340+
{ (uint16_t) -0x64, (uint16_t) -0x96, (uint16_t) 0xC8 }, /* range_restricted_int16s */ \
341+
{ (uint16_t) 0x46, (uint16_t) 0x14, (uint16_t) 0x64 }, /* nullable_range_restricted_int8u */ \
342+
{ (uint16_t) -0x14, (uint16_t) -0x28, (uint16_t) 0x32 }, /* nullable_range_restricted_int8s */ \
343+
{ (uint16_t) 0xC8, (uint16_t) 0x64, (uint16_t) 0x3E8 }, /* nullable_range_restricted_int16u */ \
344+
{ (uint16_t) -0x64, (uint16_t) -0x96, (uint16_t) 0xC8 }, /* nullable_range_restricted_int16s */ \
345345
\
346346
/* Endpoint: 2, Cluster: On/Off (server) */ \
347347
{ \

src/controller/java/AndroidCallbacks.cpp

+121-5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ static const int MILLIS_SINCE_EPOCH = 1;
4141
// Add the bytes for attribute tag(1:control + 8:tag + 8:length) and structure(1:struct + 1:close container)
4242
static const int EXTRA_SPACE_FOR_ATTRIBUTE_TAG = 19;
4343

44+
jobject DecodeGeneralTLVValue(JNIEnv * env, TLV::TLVReader & readerForGeneralValueObject, CHIP_ERROR & err);
45+
4446
GetConnectedDeviceCallback::GetConnectedDeviceCallback(jobject wrapperCallback, jobject javaCallback,
4547
const char * callbackClassSignature) :
4648
mOnSuccess(OnDeviceConnectedFn, this),
@@ -314,20 +316,24 @@ void ReportCallback::OnAttributeData(const app::ConcreteDataAttributePath & aPat
314316
readerForJavaTLV.Init(*apData);
315317

316318
jobject value = nullptr;
317-
#ifdef USE_JAVA_TLV_ENCODE_DECODE
318319
TLV::TLVReader readerForJavaObject;
319320
readerForJavaObject.Init(*apData);
320-
321+
#ifdef USE_JAVA_TLV_ENCODE_DECODE
321322
value = DecodeAttributeValue(aPath, readerForJavaObject, &err);
322323
// If we don't know this attribute, suppress it.
323324
if (err == CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB)
324325
{
325-
err = CHIP_NO_ERROR;
326+
TLV::TLVReader readerForGeneralValueObject;
327+
readerForGeneralValueObject.Init(*apData);
328+
value = DecodeGeneralTLVValue(env, readerForGeneralValueObject, err);
329+
err = CHIP_NO_ERROR;
326330
}
327331

328332
VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Fail to decode attribute with error %s", ErrorStr(err));
329333
aPath.LogPath());
330334
VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe());
335+
#else
336+
value = DecodeGeneralTLVValue(env, readerForJavaObject, err);
331337
#endif
332338
// Create TLV byte array to pass to Java layer
333339
size_t bufferLen = readerForJavaTLV.GetRemainingLength() + readerForJavaTLV.GetLengthRead();
@@ -468,18 +474,23 @@ void ReportCallback::OnEventData(const app::EventHeader & aEventHeader, TLV::TLV
468474
}
469475

470476
jobject value = nullptr;
471-
#ifdef USE_JAVA_TLV_ENCODE_DECODE
472477
TLV::TLVReader readerForJavaObject;
473478
readerForJavaObject.Init(*apData);
479+
#ifdef USE_JAVA_TLV_ENCODE_DECODE
474480
value = DecodeEventValue(aEventHeader.mPath, readerForJavaObject, &err);
475481
// If we don't know this event, just skip it.
476482
if (err == CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB)
477483
{
478-
err = CHIP_NO_ERROR;
484+
TLV::TLVReader readerForGeneralValueObject;
485+
readerForGeneralValueObject.Init(*apData);
486+
value = DecodeGeneralTLVValue(env, readerForGeneralValueObject, err);
487+
err = CHIP_NO_ERROR;
479488
}
480489
VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Controller, "Fail to decode event with error %s", ErrorStr(err));
481490
aEventHeader.LogPath());
482491
VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe());
492+
#else
493+
value = DecodeGeneralTLVValue(env, readerForJavaObject, err);
483494
#endif
484495

485496
// Create TLV byte array to pass to Java layer
@@ -907,6 +918,111 @@ void InvokeCallback::ReportError(const char * message, ChipError::StorageType er
907918
VerifyOrReturn(!env->ExceptionCheck(), env->ExceptionDescribe());
908919
}
909920

921+
jobject DecodeGeneralTLVValue(JNIEnv * env, TLV::TLVReader & readerForGeneralValueObject, CHIP_ERROR & err)
922+
{
923+
jobject retValue = nullptr;
924+
925+
switch (readerForGeneralValueObject.GetType())
926+
{
927+
case TLV::kTLVType_SignedInteger: {
928+
int64_t signedValue = 0;
929+
VerifyOrReturnValue(readerForGeneralValueObject.Get(signedValue) == CHIP_NO_ERROR, nullptr,
930+
ChipLogProgress(Controller, "Get TLV Value fail!"));
931+
err = JniReferences::GetInstance().CreateBoxedObject<jlong>("java/lang/Long", "(J)V", static_cast<jlong>(signedValue),
932+
retValue);
933+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, ChipLogProgress(Controller, "Create Boxed Object fail!"));
934+
return retValue;
935+
}
936+
case TLV::kTLVType_UnsignedInteger: {
937+
uint64_t unsignedValue = 0;
938+
VerifyOrReturnValue(readerForGeneralValueObject.Get(unsignedValue) == CHIP_NO_ERROR, nullptr,
939+
ChipLogProgress(Controller, "Get TLV Value fail!"));
940+
err = JniReferences::GetInstance().CreateBoxedObject<jlong>("java/lang/Long", "(J)V", static_cast<jlong>(unsignedValue),
941+
retValue);
942+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, ChipLogProgress(Controller, "Create Boxed Object fail!"));
943+
return retValue;
944+
}
945+
case TLV::kTLVType_Boolean: {
946+
bool booleanValue = false;
947+
VerifyOrReturnValue(readerForGeneralValueObject.Get(booleanValue) == CHIP_NO_ERROR, nullptr,
948+
ChipLogProgress(Controller, "Get TLV Value fail!"));
949+
err = JniReferences::GetInstance().CreateBoxedObject<jboolean>("java/lang/Boolean", "(Z)V",
950+
static_cast<jboolean>(booleanValue), retValue);
951+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, ChipLogProgress(Controller, "Create Boxed Object fail!"));
952+
return retValue;
953+
}
954+
case TLV::kTLVType_FloatingPointNumber: {
955+
double doubleValue = 0.0;
956+
VerifyOrReturnValue(readerForGeneralValueObject.Get(doubleValue) == CHIP_NO_ERROR, nullptr,
957+
ChipLogProgress(Controller, "Get TLV Value fail!"));
958+
err = JniReferences::GetInstance().CreateBoxedObject<jdouble>("java/lang/Double", "(D)V", static_cast<jdouble>(doubleValue),
959+
retValue);
960+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, ChipLogProgress(Controller, "Create Boxed Object fail!"));
961+
return retValue;
962+
}
963+
case TLV::kTLVType_UTF8String: {
964+
uint32_t bufferLen = readerForGeneralValueObject.GetLength();
965+
std::unique_ptr<char[]> buffer = std::unique_ptr<char[]>(new char[bufferLen + 1]);
966+
err = readerForGeneralValueObject.GetString(buffer.get(), bufferLen + 1);
967+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, ChipLogProgress(Controller, "Get TLV Value fail!"));
968+
chip::CharSpan valueSpan(buffer.get(), bufferLen);
969+
chip::JniReferences::GetInstance().CharToStringUTF(valueSpan, retValue);
970+
return retValue;
971+
}
972+
case TLV::kTLVType_ByteString: {
973+
uint32_t bufferLen = readerForGeneralValueObject.GetLength();
974+
std::unique_ptr<uint8_t[]> buffer = std::unique_ptr<uint8_t[]>(new uint8_t[bufferLen + 1]);
975+
err = readerForGeneralValueObject.GetBytes(buffer.get(), bufferLen + 1);
976+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr, ChipLogProgress(Controller, "Get TLV Value fail!"));
977+
978+
jbyteArray valueByteArray = env->NewByteArray(static_cast<jsize>(bufferLen));
979+
env->SetByteArrayRegion(valueByteArray, 0, static_cast<jsize>(bufferLen), reinterpret_cast<const jbyte *>(buffer.get()));
980+
981+
return static_cast<jobject>(valueByteArray);
982+
}
983+
case TLV::kTLVType_Array: {
984+
TLV::TLVType containerType;
985+
err = readerForGeneralValueObject.EnterContainer(containerType);
986+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr,
987+
ChipLogProgress(Controller, "EnterContainer fail! : %" CHIP_ERROR_FORMAT, err.Format()));
988+
err = chip::JniReferences::GetInstance().CreateArrayList(retValue);
989+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr,
990+
ChipLogProgress(Controller, "CreateArrayList fail! : %" CHIP_ERROR_FORMAT, err.Format()));
991+
while (readerForGeneralValueObject.Next() == CHIP_NO_ERROR)
992+
{
993+
jobject inValue = DecodeGeneralTLVValue(env, readerForGeneralValueObject, err);
994+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr,
995+
ChipLogProgress(Controller, "Can't parse general value : %" CHIP_ERROR_FORMAT, err.Format()));
996+
err = chip::JniReferences::GetInstance().AddToList(retValue, inValue);
997+
}
998+
return retValue;
999+
}
1000+
case TLV::kTLVType_List: {
1001+
TLV::TLVType containerType;
1002+
err = readerForGeneralValueObject.EnterContainer(containerType);
1003+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr,
1004+
ChipLogProgress(Controller, "EnterContainer fail! : %" CHIP_ERROR_FORMAT, err.Format()));
1005+
err = chip::JniReferences::GetInstance().CreateArrayList(retValue);
1006+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr,
1007+
ChipLogProgress(Controller, "CreateArrayList fail! : %" CHIP_ERROR_FORMAT, err.Format()));
1008+
while (readerForGeneralValueObject.Next() == CHIP_NO_ERROR)
1009+
{
1010+
jobject inValue = DecodeGeneralTLVValue(env, readerForGeneralValueObject, err);
1011+
VerifyOrReturnValue(err == CHIP_NO_ERROR, nullptr,
1012+
ChipLogProgress(Controller, "Can't parse general value : %" CHIP_ERROR_FORMAT, err.Format()));
1013+
err = chip::JniReferences::GetInstance().AddToList(retValue, inValue);
1014+
}
1015+
return retValue;
1016+
}
1017+
case TLV::kTLVType_Null: {
1018+
return nullptr;
1019+
}
1020+
default:
1021+
err = CHIP_ERROR_WRONG_TLV_TYPE;
1022+
return nullptr;
1023+
}
1024+
}
1025+
9101026
jlong newConnectedDeviceCallback(JNIEnv * env, jobject self, jobject callback)
9111027
{
9121028
chip::DeviceLayer::StackLock lock;

src/lib/support/Pool.cpp

+60-14
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,46 @@ Loop StaticAllocatorBitmap::ForEachActiveObjectInner(void * context, Lambda lamb
127127
return Loop::Finish;
128128
}
129129

130+
size_t StaticAllocatorBitmap::FirstActiveIndex()
131+
{
132+
size_t idx = 0;
133+
for (size_t word = 0; word * kBitChunkSize < Capacity(); ++word)
134+
{
135+
auto & usage = mUsage[word];
136+
auto value = usage.load(std::memory_order_relaxed);
137+
for (size_t offset = 0; offset < kBitChunkSize && offset + word * kBitChunkSize < Capacity(); ++offset)
138+
{
139+
if ((value & (kBit1 << offset)) != 0)
140+
{
141+
return idx;
142+
}
143+
idx++;
144+
}
145+
}
146+
VerifyOrDie(idx == mCapacity);
147+
return mCapacity;
148+
}
149+
150+
size_t StaticAllocatorBitmap::NextActiveIndexAfter(size_t start)
151+
{
152+
size_t idx = 0;
153+
for (size_t word = 0; word * kBitChunkSize < Capacity(); ++word)
154+
{
155+
auto & usage = mUsage[word];
156+
auto value = usage.load(std::memory_order_relaxed);
157+
for (size_t offset = 0; offset < kBitChunkSize && offset + word * kBitChunkSize < Capacity(); ++offset)
158+
{
159+
if (((value & (kBit1 << offset)) != 0) && (start < idx))
160+
{
161+
return idx;
162+
}
163+
idx++;
164+
}
165+
}
166+
VerifyOrDie(idx == mCapacity);
167+
return mCapacity;
168+
}
169+
130170
#if CHIP_SYSTEM_CONFIG_POOL_USE_HEAP
131171

132172
HeapObjectListNode * HeapObjectList::FindNode(void * object) const
@@ -159,24 +199,30 @@ Loop HeapObjectList::ForEachNode(void * context, Lambda lambda)
159199
p = p->mNext;
160200
}
161201
--mIterationDepth;
162-
if (mIterationDepth == 0 && mHaveDeferredNodeRemovals)
202+
CleanupDeferredReleases();
203+
return result;
204+
}
205+
206+
void HeapObjectList::CleanupDeferredReleases()
207+
{
208+
if (mIterationDepth != 0 || !mHaveDeferredNodeRemovals)
163209
{
164-
// Remove nodes for released objects.
165-
p = mNext;
166-
while (p != this)
210+
return;
211+
}
212+
// Remove nodes for released objects.
213+
HeapObjectListNode * p = mNext;
214+
while (p != this)
215+
{
216+
HeapObjectListNode * next = p->mNext;
217+
if (p->mObject == nullptr)
167218
{
168-
HeapObjectListNode * next = p->mNext;
169-
if (p->mObject == nullptr)
170-
{
171-
p->Remove();
172-
Platform::Delete(p);
173-
}
174-
p = next;
219+
p->Remove();
220+
Platform::Delete(p);
175221
}
176-
177-
mHaveDeferredNodeRemovals = false;
222+
p = next;
178223
}
179-
return result;
224+
225+
mHaveDeferredNodeRemovals = false;
180226
}
181227

182228
#endif // CHIP_SYSTEM_CONFIG_POOL_USE_HEAP

0 commit comments

Comments
 (0)