From db088d5f386695d68cf450d136d734733cc2ec21 Mon Sep 17 00:00:00 2001 From: Marc Mikolits Date: Wed, 17 May 2023 21:17:04 +0200 Subject: [PATCH] Apply changes for european lock support to cluster xml (#26632) * apply changes for european lock support to cluster xml * Fix formatting issues. --------- Co-authored-by: Boris Zbarsky --- .../all-clusters-app.matter | 4 + .../all-clusters-minimal-app.matter | 4 + .../rootnode_doorlock_aNKYAreMXE.matter | 4 + examples/lock-app/genio/src/LockManager.cpp | 2 + .../infineon/cyw30739/src/LockManager.cpp | 2 + .../infineon/psoc6/src/LockManager.cpp | 2 + examples/lock-app/lock-common/lock-app.matter | 4 + .../lock-app/lock-common/src/LockEndpoint.cpp | 2 + examples/lock-app/nxp/zap/lock-app.matter | 4 + examples/lock-app/qpg/zap/lock.matter | 4 + .../silabs/SiWx917/src/LockManager.cpp | 2 + .../lock-app/silabs/efr32/src/LockManager.cpp | 2 + .../platform/esp32/lock/BoltLockManager.cpp | 2 + .../zcl/data-model/chip/door-lock-cluster.xml | 11 +++ .../data_model/controller-clusters.matter | 10 +++ .../python/chip/clusters/Objects.py | 30 ++++++- .../CHIP/templates/availability.yaml | 5 ++ .../CHIP/zap-generated/MTRBaseClusters.h | 11 +++ .../CHIP/zap-generated/MTRBaseClusters.mm | 49 +++++++++++ .../CHIP/zap-generated/MTRClusterConstants.h | 1 + .../CHIP/zap-generated/MTRClusters.h | 4 + .../CHIP/zap-generated/MTRClusters.mm | 86 +++++++++++++++++++ .../zap-generated/MTRCommandPayloadsObjc.h | 30 +++++++ .../zap-generated/MTRCommandPayloadsObjc.mm | 31 +++++++ .../app-common/zap-generated/callback.h | 6 ++ .../zap-generated/cluster-enums-check.h | 9 +- .../app-common/zap-generated/cluster-enums.h | 10 ++- .../zap-generated/cluster-objects.cpp | 38 ++++++++ .../zap-generated/cluster-objects.h | 37 ++++++++ .../app-common/zap-generated/ids/Commands.h | 4 + .../zap-generated/cluster/Commands.h | 32 +++++++ .../zap-generated/cluster/Commands.h | 50 +++++++++++ 32 files changed, 483 insertions(+), 9 deletions(-) diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter index 9d76c360803f43..e5c88e10a5e5e3 100644 --- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter +++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter @@ -2361,6 +2361,7 @@ server cluster DoorLock = 257 { kNotFullyLocked = 0; kLocked = 1; kUnlocked = 2; + kUnlatched = 3; } enum DlLockType : ENUM8 { @@ -2375,6 +2376,7 @@ server cluster DoorLock = 257 { kInterconnectedLock = 8; kDeadLatch = 9; kDoorFurniture = 10; + kEurocylinder = 11; } enum DlStatus : ENUM8 { @@ -2466,6 +2468,7 @@ server cluster DoorLock = 257 { kUnlock = 1; kNonAccessUserEvent = 2; kForcedUserEvent = 3; + kUnlatch = 4; } enum OperatingModeEnum : ENUM8 { @@ -2654,6 +2657,7 @@ server cluster DoorLock = 257 { kNotification = 0x200; kYearDayAccessSchedules = 0x400; kHolidaySchedules = 0x800; + kUnbolt = 0x1000; } struct CredentialStruct { diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter index 32a2bc72417bcf..256f2299e2c686 100644 --- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter +++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter @@ -2091,6 +2091,7 @@ server cluster DoorLock = 257 { kNotFullyLocked = 0; kLocked = 1; kUnlocked = 2; + kUnlatched = 3; } enum DlLockType : ENUM8 { @@ -2105,6 +2106,7 @@ server cluster DoorLock = 257 { kInterconnectedLock = 8; kDeadLatch = 9; kDoorFurniture = 10; + kEurocylinder = 11; } enum DlStatus : ENUM8 { @@ -2196,6 +2198,7 @@ server cluster DoorLock = 257 { kUnlock = 1; kNonAccessUserEvent = 2; kForcedUserEvent = 3; + kUnlatch = 4; } enum OperatingModeEnum : ENUM8 { @@ -2384,6 +2387,7 @@ server cluster DoorLock = 257 { kNotification = 0x200; kYearDayAccessSchedules = 0x400; kHolidaySchedules = 0x800; + kUnbolt = 0x1000; } struct CredentialStruct { diff --git a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter index 7b8f60cf3d3c8d..fc73fb38ad1729 100644 --- a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter +++ b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter @@ -1231,6 +1231,7 @@ server cluster DoorLock = 257 { kNotFullyLocked = 0; kLocked = 1; kUnlocked = 2; + kUnlatched = 3; } enum DlLockType : ENUM8 { @@ -1245,6 +1246,7 @@ server cluster DoorLock = 257 { kInterconnectedLock = 8; kDeadLatch = 9; kDoorFurniture = 10; + kEurocylinder = 11; } enum DlStatus : ENUM8 { @@ -1336,6 +1338,7 @@ server cluster DoorLock = 257 { kUnlock = 1; kNonAccessUserEvent = 2; kForcedUserEvent = 3; + kUnlatch = 4; } enum OperatingModeEnum : ENUM8 { @@ -1524,6 +1527,7 @@ server cluster DoorLock = 257 { kNotification = 0x200; kYearDayAccessSchedules = 0x400; kHolidaySchedules = 0x800; + kUnbolt = 0x1000; } struct CredentialStruct { diff --git a/examples/lock-app/genio/src/LockManager.cpp b/examples/lock-app/genio/src/LockManager.cpp index f558bb1de96070..aa934e3042506a 100644 --- a/examples/lock-app/genio/src/LockManager.cpp +++ b/examples/lock-app/genio/src/LockManager.cpp @@ -640,6 +640,8 @@ const char * LockManager::lockStateToString(DlLockState lockState) const return "Locked"; case DlLockState::kUnlocked: return "Unlocked"; + case DlLockState::kUnlatched: + return "Unlatched"; case DlLockState::kUnknownEnumValue: break; } diff --git a/examples/lock-app/infineon/cyw30739/src/LockManager.cpp b/examples/lock-app/infineon/cyw30739/src/LockManager.cpp index 3e868f503a84c5..30d680d96500ca 100644 --- a/examples/lock-app/infineon/cyw30739/src/LockManager.cpp +++ b/examples/lock-app/infineon/cyw30739/src/LockManager.cpp @@ -650,6 +650,8 @@ const char * LockManager::lockStateToString(DlLockState lockState) const return "Locked"; case DlLockState::kUnlocked: return "Unlocked"; + case DlLockState::kUnlatched: + return "Unlatched"; case DlLockState::kUnknownEnumValue: break; } diff --git a/examples/lock-app/infineon/psoc6/src/LockManager.cpp b/examples/lock-app/infineon/psoc6/src/LockManager.cpp index 764ee16ee61c56..4fed23346571dc 100644 --- a/examples/lock-app/infineon/psoc6/src/LockManager.cpp +++ b/examples/lock-app/infineon/psoc6/src/LockManager.cpp @@ -649,6 +649,8 @@ const char * LockManager::lockStateToString(DlLockState lockState) const return "Locked"; case DlLockState::kUnlocked: return "Unlocked"; + case DlLockState::kUnlatched: + return "Unlatched"; case DlLockState::kUnknownEnumValue: break; } diff --git a/examples/lock-app/lock-common/lock-app.matter b/examples/lock-app/lock-common/lock-app.matter index 43d0b253a9d1c5..6711806aa657cf 100644 --- a/examples/lock-app/lock-common/lock-app.matter +++ b/examples/lock-app/lock-common/lock-app.matter @@ -1678,6 +1678,7 @@ server cluster DoorLock = 257 { kNotFullyLocked = 0; kLocked = 1; kUnlocked = 2; + kUnlatched = 3; } enum DlLockType : ENUM8 { @@ -1692,6 +1693,7 @@ server cluster DoorLock = 257 { kInterconnectedLock = 8; kDeadLatch = 9; kDoorFurniture = 10; + kEurocylinder = 11; } enum DlStatus : ENUM8 { @@ -1783,6 +1785,7 @@ server cluster DoorLock = 257 { kUnlock = 1; kNonAccessUserEvent = 2; kForcedUserEvent = 3; + kUnlatch = 4; } enum OperatingModeEnum : ENUM8 { @@ -1971,6 +1974,7 @@ server cluster DoorLock = 257 { kNotification = 0x200; kYearDayAccessSchedules = 0x400; kHolidaySchedules = 0x800; + kUnbolt = 0x1000; } struct CredentialStruct { diff --git a/examples/lock-app/lock-common/src/LockEndpoint.cpp b/examples/lock-app/lock-common/src/LockEndpoint.cpp index db1fde79b9b4dc..eaa24aa1d6f07a 100644 --- a/examples/lock-app/lock-common/src/LockEndpoint.cpp +++ b/examples/lock-app/lock-common/src/LockEndpoint.cpp @@ -547,6 +547,8 @@ const char * LockEndpoint::lockStateToString(DlLockState lockState) const return "Locked"; case DlLockState::kUnlocked: return "Unlocked"; + case DlLockState::kUnlatched: + return "Unlatched"; case DlLockState::kUnknownEnumValue: break; } diff --git a/examples/lock-app/nxp/zap/lock-app.matter b/examples/lock-app/nxp/zap/lock-app.matter index cbe34d3abc1db1..a68dac1f00fab9 100644 --- a/examples/lock-app/nxp/zap/lock-app.matter +++ b/examples/lock-app/nxp/zap/lock-app.matter @@ -981,6 +981,7 @@ server cluster DoorLock = 257 { kNotFullyLocked = 0; kLocked = 1; kUnlocked = 2; + kUnlatched = 3; } enum DlLockType : ENUM8 { @@ -995,6 +996,7 @@ server cluster DoorLock = 257 { kInterconnectedLock = 8; kDeadLatch = 9; kDoorFurniture = 10; + kEurocylinder = 11; } enum DlStatus : ENUM8 { @@ -1086,6 +1088,7 @@ server cluster DoorLock = 257 { kUnlock = 1; kNonAccessUserEvent = 2; kForcedUserEvent = 3; + kUnlatch = 4; } enum OperatingModeEnum : ENUM8 { @@ -1274,6 +1277,7 @@ server cluster DoorLock = 257 { kNotification = 0x200; kYearDayAccessSchedules = 0x400; kHolidaySchedules = 0x800; + kUnbolt = 0x1000; } struct CredentialStruct { diff --git a/examples/lock-app/qpg/zap/lock.matter b/examples/lock-app/qpg/zap/lock.matter index 51ec266cee8595..9bad58cf0a9894 100644 --- a/examples/lock-app/qpg/zap/lock.matter +++ b/examples/lock-app/qpg/zap/lock.matter @@ -1290,6 +1290,7 @@ server cluster DoorLock = 257 { kNotFullyLocked = 0; kLocked = 1; kUnlocked = 2; + kUnlatched = 3; } enum DlLockType : ENUM8 { @@ -1304,6 +1305,7 @@ server cluster DoorLock = 257 { kInterconnectedLock = 8; kDeadLatch = 9; kDoorFurniture = 10; + kEurocylinder = 11; } enum DlStatus : ENUM8 { @@ -1395,6 +1397,7 @@ server cluster DoorLock = 257 { kUnlock = 1; kNonAccessUserEvent = 2; kForcedUserEvent = 3; + kUnlatch = 4; } enum OperatingModeEnum : ENUM8 { @@ -1583,6 +1586,7 @@ server cluster DoorLock = 257 { kNotification = 0x200; kYearDayAccessSchedules = 0x400; kHolidaySchedules = 0x800; + kUnbolt = 0x1000; } struct CredentialStruct { diff --git a/examples/lock-app/silabs/SiWx917/src/LockManager.cpp b/examples/lock-app/silabs/SiWx917/src/LockManager.cpp index b9a8f9db2f515c..c1a5b2ae627067 100644 --- a/examples/lock-app/silabs/SiWx917/src/LockManager.cpp +++ b/examples/lock-app/silabs/SiWx917/src/LockManager.cpp @@ -650,6 +650,8 @@ const char * LockManager::lockStateToString(DlLockState lockState) const return "Locked"; case DlLockState::kUnlocked: return "Unlocked"; + case DlLockState::kUnlatched: + return "Unlatched"; case DlLockState::kUnknownEnumValue: break; } diff --git a/examples/lock-app/silabs/efr32/src/LockManager.cpp b/examples/lock-app/silabs/efr32/src/LockManager.cpp index c0f0797e7e6eed..b66fca8ec874e6 100644 --- a/examples/lock-app/silabs/efr32/src/LockManager.cpp +++ b/examples/lock-app/silabs/efr32/src/LockManager.cpp @@ -650,6 +650,8 @@ const char * LockManager::lockStateToString(DlLockState lockState) const return "Locked"; case DlLockState::kUnlocked: return "Unlocked"; + case DlLockState::kUnlatched: + return "Unlatched"; case DlLockState::kUnknownEnumValue: break; } diff --git a/examples/platform/esp32/lock/BoltLockManager.cpp b/examples/platform/esp32/lock/BoltLockManager.cpp index dd9b1df2ac08b0..262a5991ff0be9 100644 --- a/examples/platform/esp32/lock/BoltLockManager.cpp +++ b/examples/platform/esp32/lock/BoltLockManager.cpp @@ -691,6 +691,8 @@ const char * BoltLockManager::lockStateToString(DlLockState lockState) const return "Locked"; case DlLockState::kUnlocked: return "Unlocked"; + case DlLockState::kUnlatched: + return "Unlatched"; case DlLockState::kUnknownEnumValue: break; } diff --git a/src/app/zap-templates/zcl/data-model/chip/door-lock-cluster.xml b/src/app/zap-templates/zcl/data-model/chip/door-lock-cluster.xml index 9902fe74d2dd79..b32136aa30394b 100644 --- a/src/app/zap-templates/zcl/data-model/chip/door-lock-cluster.xml +++ b/src/app/zap-templates/zcl/data-model/chip/door-lock-cluster.xml @@ -37,6 +37,7 @@ limitations under the License. + true true @@ -57,6 +58,7 @@ limitations under the License. false true true + true + + @@ -531,6 +538,7 @@ limitations under the License. + @@ -594,6 +602,7 @@ limitations under the License. + @@ -610,6 +619,7 @@ limitations under the License. + @@ -758,6 +768,7 @@ limitations under the License. + diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter index 5a960777719c68..b05b5821804791 100644 --- a/src/controller/data_model/controller-clusters.matter +++ b/src/controller/data_model/controller-clusters.matter @@ -3048,6 +3048,7 @@ client cluster DoorLock = 257 { kNotFullyLocked = 0; kLocked = 1; kUnlocked = 2; + kUnlatched = 3; } enum DlLockType : ENUM8 { @@ -3062,6 +3063,7 @@ client cluster DoorLock = 257 { kInterconnectedLock = 8; kDeadLatch = 9; kDoorFurniture = 10; + kEurocylinder = 11; } enum DlStatus : ENUM8 { @@ -3153,6 +3155,7 @@ client cluster DoorLock = 257 { kUnlock = 1; kNonAccessUserEvent = 2; kForcedUserEvent = 3; + kUnlatch = 4; } enum OperatingModeEnum : ENUM8 { @@ -3341,6 +3344,7 @@ client cluster DoorLock = 257 { kNotification = 0x200; kYearDayAccessSchedules = 0x400; kHolidaySchedules = 0x800; + kUnbolt = 0x1000; } struct CredentialStruct { @@ -3582,6 +3586,10 @@ client cluster DoorLock = 257 { nullable CredentialStruct credential = 0; } + request struct UnboltDoorRequest { + optional OCTET_STRING PINCode = 0; + } + /** This command causes the lock device to lock the door. */ timed command LockDoor(LockDoorRequest): DefaultSuccess = 0; /** This command causes the lock device to unlock the door. */ @@ -3618,6 +3626,8 @@ client cluster DoorLock = 257 { command access(invoke: administer) GetCredentialStatus(GetCredentialStatusRequest): GetCredentialStatusResponse = 36; /** Clear one, one type, or all credentials except ProgrammingPIN credential. */ timed command access(invoke: administer) ClearCredential(ClearCredentialRequest): DefaultSuccess = 38; + /** This command causes the lock device to unlock the door without pulling the latch. */ + timed command UnboltDoor(UnboltDoorRequest): DefaultSuccess = 39; } /** Provides an interface for controlling and adjusting automatic window coverings. */ diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py index d1d1fd36d0450b..dbcc7d61ff8e64 100644 --- a/src/controller/python/chip/clusters/Objects.py +++ b/src/controller/python/chip/clusters/Objects.py @@ -18194,11 +18194,12 @@ class DlLockState(MatterIntEnum): kNotFullyLocked = 0x00 kLocked = 0x01 kUnlocked = 0x02 + kUnlatched = 0x03 # All received enum values that are not listed above will be mapped # to kUnknownEnumValue. This is a helper enum value that should only # be used by code to process how it handles receiving and unknown # enum value. This specific should never be transmitted. - kUnknownEnumValue = 3, + kUnknownEnumValue = 4, class DlLockType(MatterIntEnum): kDeadBolt = 0x00 @@ -18212,11 +18213,12 @@ class DlLockType(MatterIntEnum): kInterconnectedLock = 0x08 kDeadLatch = 0x09 kDoorFurniture = 0x0A + kEurocylinder = 0x0B # All received enum values that are not listed above will be mapped # to kUnknownEnumValue. This is a helper enum value that should only # be used by code to process how it handles receiving and unknown # enum value. This specific should never be transmitted. - kUnknownEnumValue = 11, + kUnknownEnumValue = 12, class DlStatus(MatterIntEnum): kSuccess = 0x00 @@ -18339,11 +18341,12 @@ class LockOperationTypeEnum(MatterIntEnum): kUnlock = 0x01 kNonAccessUserEvent = 0x02 kForcedUserEvent = 0x03 + kUnlatch = 0x04 # All received enum values that are not listed above will be mapped # to kUnknownEnumValue. This is a helper enum value that should only # be used by code to process how it handles receiving and unknown # enum value. This specific should never be transmitted. - kUnknownEnumValue = 4, + kUnknownEnumValue = 5, class OperatingModeEnum(MatterIntEnum): kNormal = 0x00 @@ -18538,6 +18541,7 @@ class DoorLockFeature(IntFlag): kNotification = 0x200 kYearDayAccessSchedules = 0x400 kHolidaySchedules = 0x800 + kUnbolt = 0x1000 class Structs: @dataclass @@ -19082,6 +19086,26 @@ def must_use_timed_invoke(cls) -> bool: credential: 'typing.Union[Nullable, DoorLock.Structs.CredentialStruct]' = NullValue + @dataclass + class UnboltDoor(ClusterCommand): + cluster_id: typing.ClassVar[int] = 0x0101 + command_id: typing.ClassVar[int] = 0x00000027 + is_client: typing.ClassVar[bool] = True + response_type: typing.ClassVar[str] = None + + @ChipUtility.classproperty + def descriptor(cls) -> ClusterObjectDescriptor: + return ClusterObjectDescriptor( + Fields=[ + ClusterObjectFieldDescriptor(Label="PINCode", Tag=0, Type=typing.Optional[bytes]), + ]) + + @ChipUtility.classproperty + def must_use_timed_invoke(cls) -> bool: + return True + + PINCode: 'typing.Optional[bytes]' = None + class Attributes: @dataclass class LockState(ClusterAttributeDescriptor): diff --git a/src/darwin/Framework/CHIP/templates/availability.yaml b/src/darwin/Framework/CHIP/templates/availability.yaml index 3280cacba0e578..db1318330a792a 100644 --- a/src/darwin/Framework/CHIP/templates/availability.yaml +++ b/src/darwin/Framework/CHIP/templates/availability.yaml @@ -7562,6 +7562,11 @@ BridgedDeviceBasic: - ProductFinishEnum - ColorEnum + enum values: + # Unlatch was never present for the old operation type enum name. + DoorLock: + DlLockOperationType: + - Unlatch renames: attributes: TimeSynchronization: diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h index b6701eae3e480b..b91a2a0b8c45fb 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -9291,6 +9291,13 @@ API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) */ - (void)clearCredentialWithParams:(MTRDoorLockClusterClearCredentialParams *)params completion:(MTRStatusCompletion)completion API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); +/** + * Command UnboltDoor + * + * This command causes the lock device to unlock the door without pulling the latch. + */ +- (void)unboltDoorWithParams:(MTRDoorLockClusterUnboltDoorParams * _Nullable)params + completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (void)readAttributeLockStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -22148,6 +22155,7 @@ typedef NS_ENUM(uint8_t, MTRDoorLockDlLockState) { MTRDoorLockDlLockStateNotFullyLocked API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, MTRDoorLockDlLockStateLocked API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x01, MTRDoorLockDlLockStateUnlocked API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x02, + MTRDoorLockDlLockStateUnlatched MTR_NEWLY_AVAILABLE = 0x03, } API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRDoorLockDlLockType) { @@ -22162,6 +22170,7 @@ typedef NS_ENUM(uint8_t, MTRDoorLockDlLockType) { MTRDoorLockDlLockTypeInterconnectedLock API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x08, MTRDoorLockDlLockTypeDeadLatch API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x09, MTRDoorLockDlLockTypeDoorFurniture API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0A, + MTRDoorLockDlLockTypeEurocylinder MTR_NEWLY_AVAILABLE = 0x0B, } API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRDoorLockDlStatus) { @@ -22345,6 +22354,7 @@ typedef NS_ENUM(uint8_t, MTRDoorLockLockOperationType) { MTRDoorLockLockOperationTypeUnlock API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x01, MTRDoorLockLockOperationTypeNonAccessUserEvent API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x02, MTRDoorLockLockOperationTypeForcedUserEvent API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x03, + MTRDoorLockLockOperationTypeUnlatch MTR_NEWLY_AVAILABLE = 0x04, } API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); typedef NS_ENUM(uint8_t, MTRDoorLockDlLockOperationType) { @@ -22739,6 +22749,7 @@ typedef NS_OPTIONS(uint32_t, MTRDoorLockFeature) { macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)) = 0x400, MTRDoorLockFeatureHolidaySchedules API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x800, + MTRDoorLockFeatureUnbolt MTR_NEWLY_AVAILABLE = 0x1000, } API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRWindowCoveringEndProductType) { diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm index 69ec342a1f9180..4c84bb38308eea 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm @@ -52794,6 +52794,50 @@ - (void)clearCredentialWithParams:(MTRDoorLockClusterClearCredentialParams *)par std::move(*bridge).DispatchAction(self.device); } +- (void)unboltDoorWithParams:(MTRDoorLockClusterUnboltDoorParams * _Nullable)params completion:(MTRStatusCompletion)completion +{ + // Make a copy of params before we go async. + params = [params copy]; + auto * bridge = new MTRCommandSuccessCallbackBridge( + self.callbackQueue, + ^(id _Nullable value, NSError * _Nullable error) { + completion(error); + }, + ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb, + MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) { + auto * typedBridge = static_cast(bridge); + Optional timedInvokeTimeoutMs; + Optional invokeTimeout; + ListFreer listFreer; + DoorLock::Commands::UnboltDoor::Type request; + if (params != nil) { + if (params.timedInvokeTimeoutMs != nil) { + params.timedInvokeTimeoutMs = MTRClampedNumber(params.timedInvokeTimeoutMs, @(1), @(UINT16_MAX)); + timedInvokeTimeoutMs.SetValue(params.timedInvokeTimeoutMs.unsignedShortValue); + } + if (params.serverSideProcessingTimeout != nil) { + // Clamp to a number of seconds that will not overflow 32-bit + // int when converted to ms. + auto * serverSideProcessingTimeout = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX)); + invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue)); + } + } + if (!timedInvokeTimeoutMs.HasValue()) { + timedInvokeTimeoutMs.SetValue(10000); + } + if (params != nil) { + if (params.pinCode != nil) { + auto & definedValue_0 = request.PINCode.Emplace(); + definedValue_0 = [self asByteSpan:params.pinCode]; + } + } + + return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb, self->_endpoint, + timedInvokeTimeoutMs, invokeTimeout); + }); + std::move(*bridge).DispatchAction(self.device); +} + - (void)readAttributeLockStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion { MTRReadParams * params = [[MTRReadParams alloc] init]; @@ -55425,6 +55469,11 @@ - (void)clearCredentialWithParams:(MTRDoorLockClusterClearCredentialParams *)par { [self clearCredentialWithParams:params completion:completionHandler]; } +- (void)unboltDoorWithParams:(MTRDoorLockClusterUnboltDoorParams * _Nullable)params + completionHandler:(MTRStatusCompletion)completionHandler +{ + [self unboltDoorWithParams:params completion:completionHandler]; +} - (void)readAttributeLockStateWithCompletionHandler:(void (^)( NSNumber * _Nullable value, NSError * _Nullable error))completionHandler diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h index cb390c88dc7b25..09180049b086b2 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h @@ -9125,6 +9125,7 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { = 0x00000025, MTRCommandIDTypeClusterDoorLockCommandClearCredentialID API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000026, + MTRCommandIDTypeClusterDoorLockCommandUnboltDoorID MTR_NEWLY_AVAILABLE = 0x00000027, // Cluster WindowCovering deprecated command id names MTRClusterWindowCoveringCommandUpOrOpenID MTR_DEPRECATED("Please use MTRCommandIDTypeClusterWindowCoveringCommandUpOrOpenID", diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h index ece7422921c04a..27597e8cc9d632 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h @@ -3355,6 +3355,10 @@ API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion API_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); +- (void)unboltDoorWithParams:(MTRDoorLockClusterUnboltDoorParams * _Nullable)params + expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries + expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs + completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE; - (NSDictionary *)readAttributeLockStateWithParams:(MTRReadParams * _Nullable)params API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm index 6bb2a75441c7d4..ef4792e1b86a0a 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm @@ -16095,6 +16095,82 @@ - (void)clearCredentialWithParams:(MTRDoorLockClusterClearCredentialParams *)par } } +- (void)unboltDoorWithParams:(MTRDoorLockClusterUnboltDoorParams * _Nullable)params + expectedValues:(NSArray *> *)expectedValues + expectedValueInterval:(NSNumber *)expectedValueIntervalMs + completion:(MTRStatusCompletion)completion +{ + NSString * logPrefix = + [NSString stringWithFormat:@"MTRDevice command %u %u %u %u", self.device.deviceController.fabricIndex, _endpoint, + (unsigned int) MTRClusterIDTypeDoorLockID, (unsigned int) MTRCommandIDTypeClusterDoorLockCommandUnboltDoorID]; + // Make a copy of params before we go async. + params = [params copy]; + NSNumber * timedInvokeTimeoutMsParam = params.timedInvokeTimeoutMs; + if (timedInvokeTimeoutMsParam) { + timedInvokeTimeoutMsParam = MTRClampedNumber(timedInvokeTimeoutMsParam, @(1), @(UINT16_MAX)); + } + MTRAsyncCallbackQueueWorkItem * workItem = [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:self.device.queue]; + MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * device, NSUInteger retryCount) { + MTRClustersLogDequeue(logPrefix, self.device.asyncCallbackWorkQueue); + MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID + controller:self.device.deviceController]; + auto * bridge = new MTRCommandSuccessCallbackBridge( + self.device.queue, + ^(id _Nullable value, NSError * _Nullable error) { + MTRClustersLogCompletion(logPrefix, value, error); + dispatch_async(self.callbackQueue, ^{ + completion(error); + }); + [workItem endWork]; + }, + ^(ExchangeManager & exchangeManager, const SessionHandle & session, CommandSuccessCallbackType successCb, + MTRErrorCallback failureCb, MTRCallbackBridgeBase * bridge) { + auto * typedBridge = static_cast(bridge); + Optional timedInvokeTimeoutMs; + Optional invokeTimeout; + ListFreer listFreer; + DoorLock::Commands::UnboltDoor::Type request; + if (timedInvokeTimeoutMsParam != nil) { + timedInvokeTimeoutMs.SetValue(timedInvokeTimeoutMsParam.unsignedShortValue); + } + if (params != nil) { + if (params.serverSideProcessingTimeout != nil) { + // Clamp to a number of seconds that will not overflow 32-bit + // int when converted to ms. + auto * serverSideProcessingTimeout + = MTRClampedNumber(params.serverSideProcessingTimeout, @(0), @(UINT16_MAX)); + invokeTimeout.SetValue(Seconds16(serverSideProcessingTimeout.unsignedShortValue)); + } + } + if (!timedInvokeTimeoutMs.HasValue()) { + timedInvokeTimeoutMs.SetValue(10000); + } + if (params != nil) { + if (params.pinCode != nil) { + auto & definedValue_0 = request.PINCode.Emplace(); + definedValue_0 = [self asByteSpan:params.pinCode]; + } + } + + return MTRStartInvokeInteraction(typedBridge, request, exchangeManager, session, successCb, failureCb, + self->_endpoint, timedInvokeTimeoutMs, invokeTimeout); + }); + std::move(*bridge).DispatchAction(baseDevice); + }; + workItem.readyHandler = readyHandler; + MTRClustersLogEnqueue(logPrefix, self.device.asyncCallbackWorkQueue); + [self.device.asyncCallbackWorkQueue enqueueWorkItem:workItem]; + + if (!expectedValueIntervalMs || ([expectedValueIntervalMs compare:@(0)] == NSOrderedAscending)) { + expectedValues = nil; + } else { + expectedValueIntervalMs = MTRClampedNumber(expectedValueIntervalMs, @(1), @(UINT32_MAX)); + } + if (expectedValues) { + [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs]; + } +} + - (NSDictionary *)readAttributeLockStateWithParams:(MTRReadParams * _Nullable)params { return [self.device readAttributeWithEndpointID:@(_endpoint) @@ -16999,6 +17075,16 @@ - (void)clearCredentialWithParams:(MTRDoorLockClusterClearCredentialParams *)par expectedValueInterval:expectedValueIntervalMs completion:completionHandler]; } +- (void)unboltDoorWithParams:(MTRDoorLockClusterUnboltDoorParams * _Nullable)params + expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries + expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs + completionHandler:(MTRStatusCompletion)completionHandler +{ + [self unboltDoorWithParams:params + expectedValues:expectedDataValueDictionaries + expectedValueInterval:expectedValueIntervalMs + completion:completionHandler]; +} @end @implementation MTRClusterWindowCovering diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h index 72c27e3beb05ab..56915dd4293c74 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h @@ -5304,6 +5304,36 @@ API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end +MTR_NEWLY_AVAILABLE +@interface MTRDoorLockClusterUnboltDoorParams : NSObject + +@property (nonatomic, copy) NSData * _Nullable pinCode MTR_NEWLY_AVAILABLE; +/** + * Controls whether the command is a timed command (using Timed Invoke). + * + * If nil (the default value), a regular invoke is done for commands that do + * not require a timed invoke and a timed invoke with some default timed request + * timeout is done for commands that require a timed invoke. + * + * If not nil, a timed invoke is done, with the provided value used as the timed + * request timeout. The value should be chosen small enough to provide the + * desired security properties but large enough that it will allow a round-trip + * from the sever to the client (for the status response and actual invoke + * request) within the timeout window. + * + */ +@property (nonatomic, copy, nullable) NSNumber * timedInvokeTimeoutMs; + +/** + * Controls how much time, in seconds, we will allow for the server to process the command. + * + * The command will then time out if that much time, plus an allowance for retransmits due to network failures, passes. + * + * If nil, the framework will try to select an appropriate timeout value itself. + */ +@property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; +@end + API_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @interface MTRWindowCoveringClusterUpOrOpenParams : NSObject /** diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm index a835915630ae25..9e7af8854b0c15 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm @@ -8251,6 +8251,37 @@ - (NSString *)description return descriptionString; } +@end +@implementation MTRDoorLockClusterUnboltDoorParams +- (instancetype)init +{ + if (self = [super init]) { + + _pinCode = nil; + _timedInvokeTimeoutMs = nil; + _serverSideProcessingTimeout = nil; + } + return self; +} + +- (id)copyWithZone:(NSZone * _Nullable)zone; +{ + auto other = [[MTRDoorLockClusterUnboltDoorParams alloc] init]; + + other.pinCode = self.pinCode; + other.timedInvokeTimeoutMs = self.timedInvokeTimeoutMs; + other.serverSideProcessingTimeout = self.serverSideProcessingTimeout; + + return other; +} + +- (NSString *)description +{ + NSString * descriptionString = [NSString + stringWithFormat:@"<%@: pinCode:%@; >", NSStringFromClass([self class]), [_pinCode base64EncodedStringWithOptions:0]]; + return descriptionString; +} + @end @implementation MTRWindowCoveringClusterUpOrOpenParams - (instancetype)init diff --git a/zzz_generated/app-common/app-common/zap-generated/callback.h b/zzz_generated/app-common/app-common/zap-generated/callback.h index 48fd55330a58fb..087234106a8474 100644 --- a/zzz_generated/app-common/app-common/zap-generated/callback.h +++ b/zzz_generated/app-common/app-common/zap-generated/callback.h @@ -7944,6 +7944,12 @@ bool emberAfDoorLockClusterGetCredentialStatusCallback( bool emberAfDoorLockClusterClearCredentialCallback( chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, const chip::app::Clusters::DoorLock::Commands::ClearCredential::DecodableType & commandData); +/** + * @brief Door Lock Cluster UnboltDoor Command callback (from client) + */ +bool emberAfDoorLockClusterUnboltDoorCallback( + chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, + const chip::app::Clusters::DoorLock::Commands::UnboltDoor::DecodableType & commandData); /** * @brief Window Covering Cluster UpOrOpen Command callback (from client) */ diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h b/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h index 36b1dba039ef38..0c719c6b360e1c 100644 --- a/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h +++ b/zzz_generated/app-common/app-common/zap-generated/cluster-enums-check.h @@ -1682,9 +1682,10 @@ static auto __attribute__((unused)) EnsureKnownEnumValue(DoorLock::DlLockState v case EnumType::kNotFullyLocked: case EnumType::kLocked: case EnumType::kUnlocked: + case EnumType::kUnlatched: return val; default: - return static_cast(3); + return static_cast(4); } } static auto __attribute__((unused)) EnsureKnownEnumValue(DoorLock::DlLockType val) @@ -1703,9 +1704,10 @@ static auto __attribute__((unused)) EnsureKnownEnumValue(DoorLock::DlLockType va case EnumType::kInterconnectedLock: case EnumType::kDeadLatch: case EnumType::kDoorFurniture: + case EnumType::kEurocylinder: return val; default: - return static_cast(11); + return static_cast(12); } } static auto __attribute__((unused)) EnsureKnownEnumValue(DoorLock::DlStatus val) @@ -1857,9 +1859,10 @@ static auto __attribute__((unused)) EnsureKnownEnumValue(DoorLock::LockOperation case EnumType::kUnlock: case EnumType::kNonAccessUserEvent: case EnumType::kForcedUserEvent: + case EnumType::kUnlatch: return val; default: - return static_cast(4); + return static_cast(5); } } static auto __attribute__((unused)) EnsureKnownEnumValue(DoorLock::OperatingModeEnum val) diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h index f84c4635d79d1a..246b5a69dbff80 100644 --- a/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h +++ b/zzz_generated/app-common/app-common/zap-generated/cluster-enums.h @@ -2021,11 +2021,12 @@ enum class DlLockState : uint8_t kNotFullyLocked = 0x00, kLocked = 0x01, kUnlocked = 0x02, + kUnlatched = 0x03, // All received enum values that are not listed above will be mapped // to kUnknownEnumValue. This is a helper enum value that should only // be used by code to process how it handles receiving and unknown // enum value. This specific should never be transmitted. - kUnknownEnumValue = 3, + kUnknownEnumValue = 4, }; // Enum for DlLockType @@ -2042,11 +2043,12 @@ enum class DlLockType : uint8_t kInterconnectedLock = 0x08, kDeadLatch = 0x09, kDoorFurniture = 0x0A, + kEurocylinder = 0x0B, // All received enum values that are not listed above will be mapped // to kUnknownEnumValue. This is a helper enum value that should only // be used by code to process how it handles receiving and unknown // enum value. This specific should never be transmitted. - kUnknownEnumValue = 11, + kUnknownEnumValue = 12, }; // Enum for DlStatus @@ -2196,11 +2198,12 @@ enum class LockOperationTypeEnum : uint8_t kUnlock = 0x01, kNonAccessUserEvent = 0x02, kForcedUserEvent = 0x03, + kUnlatch = 0x04, // All received enum values that are not listed above will be mapped // to kUnknownEnumValue. This is a helper enum value that should only // be used by code to process how it handles receiving and unknown // enum value. This specific should never be transmitted. - kUnknownEnumValue = 4, + kUnknownEnumValue = 5, }; // Enum for OperatingModeEnum @@ -2454,6 +2457,7 @@ enum class DoorLockFeature : uint32_t kNotification = 0x200, kYearDayAccessSchedules = 0x400, kHolidaySchedules = 0x800, + kUnbolt = 0x1000, }; } // namespace DoorLock diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp index 75506b25fbd873..04d41b66fcd63e 100644 --- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp +++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.cpp @@ -13642,6 +13642,43 @@ CHIP_ERROR DecodableType::Decode(TLV::TLVReader & reader) return CHIP_NO_ERROR; } } // namespace ClearCredential. +namespace UnboltDoor { +CHIP_ERROR Type::Encode(TLV::TLVWriter & writer, TLV::Tag tag) const +{ + TLV::TLVType outer; + ReturnErrorOnFailure(writer.StartContainer(tag, TLV::kTLVType_Structure, outer)); + ReturnErrorOnFailure(DataModel::Encode(writer, TLV::ContextTag(Fields::kPINCode), PINCode)); + ReturnErrorOnFailure(writer.EndContainer(outer)); + return CHIP_NO_ERROR; +} + +CHIP_ERROR DecodableType::Decode(TLV::TLVReader & reader) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + TLV::TLVType outer; + VerifyOrReturnError(TLV::kTLVType_Structure == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE); + ReturnErrorOnFailure(reader.EnterContainer(outer)); + while ((err = reader.Next()) == CHIP_NO_ERROR) + { + if (!TLV::IsContextTag(reader.GetTag())) + { + continue; + } + switch (TLV::TagNumFromTag(reader.GetTag())) + { + case to_underlying(Fields::kPINCode): + ReturnErrorOnFailure(DataModel::Decode(reader, PINCode)); + break; + default: + break; + } + } + + VerifyOrReturnError(err == CHIP_END_OF_TLV, err); + ReturnErrorOnFailure(reader.ExitContainer(outer)); + return CHIP_NO_ERROR; +} +} // namespace UnboltDoor. } // namespace Commands namespace Attributes { @@ -23080,6 +23117,7 @@ bool CommandNeedsTimedInvoke(ClusterId aCluster, CommandId aCommand) case Clusters::DoorLock::Commands::ClearUser::Id: case Clusters::DoorLock::Commands::SetCredential::Id: case Clusters::DoorLock::Commands::ClearCredential::Id: + case Clusters::DoorLock::Commands::UnboltDoor::Id: return true; default: return false; diff --git a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h index 4549b4ff4b6873..627433159099d5 100644 --- a/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h +++ b/zzz_generated/app-common/app-common/zap-generated/cluster-objects.h @@ -16263,6 +16263,11 @@ struct Type; struct DecodableType; } // namespace ClearCredential +namespace UnboltDoor { +struct Type; +struct DecodableType; +} // namespace UnboltDoor + } // namespace Commands namespace Commands { @@ -17208,6 +17213,38 @@ struct DecodableType CHIP_ERROR Decode(TLV::TLVReader & reader); }; }; // namespace ClearCredential +namespace UnboltDoor { +enum class Fields : uint8_t +{ + kPINCode = 0, +}; + +struct Type +{ +public: + // Use GetCommandId instead of commandId directly to avoid naming conflict with CommandIdentification in ExecutionOfACommand + static constexpr CommandId GetCommandId() { return Commands::UnboltDoor::Id; } + static constexpr ClusterId GetClusterId() { return Clusters::DoorLock::Id; } + + Optional PINCode; + + CHIP_ERROR Encode(TLV::TLVWriter & writer, TLV::Tag tag) const; + + using ResponseType = DataModel::NullObjectType; + + static constexpr bool MustUseTimedInvoke() { return true; } +}; + +struct DecodableType +{ +public: + static constexpr CommandId GetCommandId() { return Commands::UnboltDoor::Id; } + static constexpr ClusterId GetClusterId() { return Clusters::DoorLock::Id; } + + Optional PINCode; + CHIP_ERROR Decode(TLV::TLVReader & reader); +}; +}; // namespace UnboltDoor } // namespace Commands namespace Attributes { diff --git a/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h b/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h index db687d7b7f512f..1d97415c764c37 100644 --- a/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h +++ b/zzz_generated/app-common/app-common/zap-generated/ids/Commands.h @@ -860,6 +860,10 @@ namespace ClearCredential { static constexpr CommandId Id = 0x00000026; } // namespace ClearCredential +namespace UnboltDoor { +static constexpr CommandId Id = 0x00000027; +} // namespace UnboltDoor + } // namespace Commands } // namespace DoorLock diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h index d8513c0fbb762d..f6f8372534ef24 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h @@ -4687,6 +4687,7 @@ class TonerCartridgeMonitoringResetCondition : public ClusterCommand | * SetCredential | 0x22 | | * GetCredentialStatus | 0x24 | | * ClearCredential | 0x26 | +| * UnboltDoor | 0x27 | |------------------------------------------------------------------------------| | Attributes: | | | * LockState | 0x0000 | @@ -5325,6 +5326,36 @@ class DoorLockClearCredential : public ClusterCommand mComplex_Credential; }; +/* + * Command UnboltDoor + */ +class DoorLockUnboltDoor : public ClusterCommand +{ +public: + DoorLockUnboltDoor(CredentialIssuerCommands * credsIssuerConfig) : ClusterCommand("unbolt-door", credsIssuerConfig) + { + AddArgument("PINCode", &mRequest.PINCode); + ClusterCommand::AddArguments(); + } + + CHIP_ERROR SendCommand(chip::DeviceProxy * device, std::vector endpointIds) override + { + ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000027) on endpoint %u", endpointIds.at(0)); + + return ClusterCommand::SendCommand(device, endpointIds.at(0), 0x00000101, 0x00000027, mRequest); + } + + CHIP_ERROR SendGroupCommand(chip::GroupId groupId, chip::FabricIndex fabricIndex) override + { + ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000027) on Group %u", groupId); + + return ClusterCommand::SendGroupCommand(groupId, fabricIndex, 0x00000101, 0x00000027, mRequest); + } + +private: + chip::app::Clusters::DoorLock::Commands::UnboltDoor::Type mRequest; +}; + /*----------------------------------------------------------------------------*\ | Cluster WindowCovering | 0x0102 | |------------------------------------------------------------------------------| @@ -13744,6 +13775,7 @@ void registerClusterDoorLock(Commands & commands, CredentialIssuerCommands * cre make_unique(credsIssuerConfig), // make_unique(credsIssuerConfig), // make_unique(credsIssuerConfig), // + make_unique(credsIssuerConfig), // // // Attributes // diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h index 25faa4cbe1a955..7fa5e6a3d30808 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h @@ -46737,6 +46737,7 @@ class SubscribeAttributeTonerCartridgeMonitoringClusterRevision : public Subscri | * SetCredential | 0x22 | | * GetCredentialStatus | 0x24 | | * ClearCredential | 0x26 | +| * UnboltDoor | 0x27 | |------------------------------------------------------------------------------| | Attributes: | | | * LockState | 0x0000 | @@ -47715,6 +47716,54 @@ class DoorLockClearCredential : public ClusterCommand { mComplex_Credential; }; +/* + * Command UnboltDoor + */ +class DoorLockUnboltDoor : public ClusterCommand { +public: + DoorLockUnboltDoor() + : ClusterCommand("unbolt-door") + { + AddArgument("PINCode", &mRequest.PINCode); + ClusterCommand::AddArguments(); + } + + CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override + { + ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000027) on endpoint %u", endpointId); + + dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); + __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; + __auto_type * params = [[MTRDoorLockClusterUnboltDoorParams alloc] init]; + params.timedInvokeTimeoutMs + = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; + if (mRequest.PINCode.HasValue()) { + params.pinCode = [NSData dataWithBytes:mRequest.PINCode.Value().data() length:mRequest.PINCode.Value().size()]; + } else { + params.pinCode = nil; + } + uint16_t repeatCount = mRepeatCount.ValueOr(1); + uint16_t __block responsesNeeded = repeatCount; + while (repeatCount--) { + [cluster unboltDoorWithParams:params + completion:^(NSError * _Nullable error) { + responsesNeeded--; + if (error != nil) { + mError = error; + LogNSError("Error", error); + } + if (responsesNeeded == 0) { + SetCommandExitStatus(mError); + } + }]; + } + return CHIP_NO_ERROR; + } + +private: + chip::app::Clusters::DoorLock::Commands::UnboltDoor::Type mRequest; +}; + /* * Attribute LockState */ @@ -108484,6 +108533,7 @@ void registerClusterDoorLock(Commands & commands) make_unique(), // make_unique(), // make_unique(), // + make_unique(), // make_unique(Id), // make_unique(), // make_unique(Id), //