From 0dca5fb6f04f504a87c5983d9de9a9a9ae207295 Mon Sep 17 00:00:00 2001 From: Kamil Kasperczyk Date: Tue, 14 Jun 2022 09:10:30 +0200 Subject: [PATCH] [nrfconnect] Fixed auto relock attribute and Lock Operation event There are two issues with the nrfconnect door lock: * It has auto-relock-time value set to 60, while it should be 0 * It emits Lock Operation event on init, while no operation was done. * Set auto relock time to 0 * Added invoking lock/unlock operation only if lock state is not null (uninitialized) * By the way of this change aligned lighting app extended discovery timeout to other nrfconnect examples --- .../lighting-app/nrfconnect/main/AppTask.cpp | 2 -- examples/lock-app/nrfconnect/main/AppTask.cpp | 30 ++++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/examples/lighting-app/nrfconnect/main/AppTask.cpp b/examples/lighting-app/nrfconnect/main/AppTask.cpp index a108dc1b4bf89b..3e4b71b1068d07 100644 --- a/examples/lighting-app/nrfconnect/main/AppTask.cpp +++ b/examples/lighting-app/nrfconnect/main/AppTask.cpp @@ -59,7 +59,6 @@ namespace { constexpr int kFactoryResetTriggerTimeout = 3000; constexpr int kFactoryResetCancelWindowTimeout = 3000; -constexpr int kExtDiscoveryTimeoutSecs = 20; constexpr int kAppEventQueueSize = 10; constexpr uint8_t kButtonPushEvent = 1; constexpr uint8_t kButtonReleaseEvent = 0; @@ -170,7 +169,6 @@ CHIP_ERROR AppTask::Init() // Initialize CHIP server SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); - chip::app::DnssdServer::Instance().SetExtendedDiscoveryTimeoutSecs(kExtDiscoveryTimeoutSecs); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); diff --git a/examples/lock-app/nrfconnect/main/AppTask.cpp b/examples/lock-app/nrfconnect/main/AppTask.cpp index 5917cfe34a8d95..6975dea5e6a65c 100644 --- a/examples/lock-app/nrfconnect/main/AppTask.cpp +++ b/examples/lock-app/nrfconnect/main/AppTask.cpp @@ -168,6 +168,9 @@ CHIP_ERROR AppTask::Init() // between the main and the CHIP threads. PlatformMgr().AddEventHandler(ChipEventHandler, 0); + // Disable auto-relock time feature. + DoorLockServer::Instance().SetAutoRelockTime(kLockEndpointId, 0); + err = PlatformMgr().StartEventLoopTask(); if (err != CHIP_NO_ERROR) { @@ -533,27 +536,38 @@ void AppTask::DispatchEvent(AppEvent * aEvent) void AppTask::UpdateClusterState(BoltLockManager::State state, BoltLockManager::OperationSource source) { - DlLockState lockState; + DlLockState newLockState; switch (state) { case BoltLockManager::State::kLockingCompleted: - lockState = DlLockState::kLocked; + newLockState = DlLockState::kLocked; break; case BoltLockManager::State::kUnlockingCompleted: - lockState = DlLockState::kUnlocked; + newLockState = DlLockState::kUnlocked; break; default: - lockState = DlLockState::kNotFullyLocked; + newLockState = DlLockState::kNotFullyLocked; break; } - SystemLayer().ScheduleLambda([lockState, source] { - LOG_INF("Updating LockState attribute"); + SystemLayer().ScheduleLambda([newLockState, source] { + chip::app::DataModel::Nullable currentLockState; + chip::app::Clusters::DoorLock::Attributes::LockState::Get(kLockEndpointId, currentLockState); - if (!DoorLockServer::Instance().SetLockState(kLockEndpointId, lockState, source)) + if (currentLockState.IsNull()) + { + // Initialize lock state with start value, but not invoke lock/unlock. + chip::app::Clusters::DoorLock::Attributes::LockState::Set(kLockEndpointId, newLockState); + } + else { - LOG_ERR("Failed to update LockState attribute"); + LOG_INF("Updating LockState attribute"); + + if (!DoorLockServer::Instance().SetLockState(kLockEndpointId, newLockState, source)) + { + LOG_ERR("Failed to update LockState attribute"); + } } }); }