@@ -130,9 +130,9 @@ void AppTask::SwitchTransportTriggerHandler(const SwitchButtonAction &action)
130
130
}
131
131
#endif
132
132
133
- void AppTask::LockStateChanged (BoltLockManager::State state, BoltLockManager::OperationSource source )
133
+ void AppTask::LockStateChanged (const BoltLockManager::StateData &stateData )
134
134
{
135
- switch (state) {
135
+ switch (stateData. state ) {
136
136
case BoltLockManager::State::kLockingInitiated :
137
137
LOG_INF (" Lock action initiated" );
138
138
Nrf::GetBoard ().GetLED (Nrf::DeviceLeds::LED2).Blink (50 , 50 );
@@ -164,26 +164,33 @@ void AppTask::LockStateChanged(BoltLockManager::State state, BoltLockManager::Op
164
164
}
165
165
166
166
/* Handle changing attribute state in the application */
167
- Instance ().UpdateClusterState (state, source );
167
+ Instance ().UpdateClusterState (stateData );
168
168
}
169
169
170
- void AppTask::UpdateClusterState (BoltLockManager::State state, BoltLockManager::OperationSource source )
170
+ void AppTask::UpdateClusterState (const BoltLockManager::StateData &stateData )
171
171
{
172
- DlLockState newLockState ;
172
+ BoltLockManager::StateData *stateDataCopy = Platform::New<BoltLockManager::StateData>(stateData) ;
173
173
174
- switch (state) {
175
- case BoltLockManager::State::kLockingCompleted :
176
- newLockState = DlLockState::kLocked ;
177
- break ;
178
- case BoltLockManager::State::kUnlockingCompleted :
179
- newLockState = DlLockState::kUnlocked ;
180
- break ;
181
- default :
182
- newLockState = DlLockState::kNotFullyLocked ;
183
- break ;
174
+ if (stateDataCopy == nullptr ) {
175
+ LOG_ERR (" Failed to allocate memory for BoltLockManager::StateData" );
176
+ return ;
184
177
}
185
178
186
- SystemLayer ().ScheduleLambda ([newLockState, source] {
179
+ SystemLayer ().ScheduleLambda ([stateData = stateDataCopy]() {
180
+ DlLockState newLockState;
181
+
182
+ switch (stateData->state ) {
183
+ case BoltLockManager::State::kLockingCompleted :
184
+ newLockState = DlLockState::kLocked ;
185
+ break ;
186
+ case BoltLockManager::State::kUnlockingCompleted :
187
+ newLockState = DlLockState::kUnlocked ;
188
+ break ;
189
+ default :
190
+ newLockState = DlLockState::kNotFullyLocked ;
191
+ break ;
192
+ }
193
+
187
194
chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> currentLockState;
188
195
chip::app::Clusters::DoorLock::Attributes::LockState::Get (kLockEndpointId , currentLockState);
189
196
@@ -193,19 +200,38 @@ void AppTask::UpdateClusterState(BoltLockManager::State state, BoltLockManager::
193
200
} else {
194
201
LOG_INF (" Updating LockState attribute" );
195
202
196
- if (!DoorLockServer::Instance ().SetLockState (kLockEndpointId , newLockState, source)) {
203
+ Nullable<uint16_t > userId;
204
+ Nullable<List<const LockOpCredentials>> credentials;
205
+ List<const LockOpCredentials> credentialList;
206
+
207
+ if (!stateData->validatePINResult .IsNull ()) {
208
+ userId = { stateData->validatePINResult .Value ().userId };
209
+
210
+ /* `DoorLockServer::SetLockState` exptects list of `LockOpCredentials`,
211
+ however in case of PIN validation it makes no sense to have more than one
212
+ credential corresponding to validation result. For simplicity we wrap single
213
+ credential in list here. */
214
+ credentialList = { &stateData->validatePINResult .Value ().credential , 1 };
215
+ credentials = { credentialList };
216
+ }
217
+
218
+ if (!DoorLockServer::Instance ().SetLockState (kLockEndpointId , newLockState, stateData->source ,
219
+ userId, credentials, stateData->fabricIdx ,
220
+ stateData->nodeId )) {
197
221
LOG_ERR (" Failed to update LockState attribute" );
198
222
}
199
223
}
224
+
225
+ Platform::Delete (stateData);
200
226
});
201
227
}
202
228
203
229
#ifdef CONFIG_CHIP_NUS
204
230
void AppTask::NUSLockCallback (void *context)
205
231
{
206
232
LOG_DBG (" Received LOCK command from NUS" );
207
- if (BoltLockMgr ().mState == BoltLockManager::State::kLockingCompleted ||
208
- BoltLockMgr ().mState == BoltLockManager::State::kLockingInitiated ) {
233
+ if (BoltLockMgr ().GetState (). state == BoltLockManager::State::kLockingCompleted ||
234
+ BoltLockMgr ().GetState (). state == BoltLockManager::State::kLockingInitiated ) {
209
235
LOG_INF (" Device is already locked" );
210
236
} else {
211
237
Nrf::PostTask ([] { LockActionEventHandler (); });
@@ -215,8 +241,8 @@ void AppTask::NUSLockCallback(void *context)
215
241
void AppTask::NUSUnlockCallback (void *context)
216
242
{
217
243
LOG_DBG (" Received UNLOCK command from NUS" );
218
- if (BoltLockMgr ().mState == BoltLockManager::State::kUnlockingCompleted ||
219
- BoltLockMgr ().mState == BoltLockManager::State::kUnlockingInitiated ) {
244
+ if (BoltLockMgr ().GetState (). state == BoltLockManager::State::kUnlockingCompleted ||
245
+ BoltLockMgr ().GetState (). state == BoltLockManager::State::kUnlockingInitiated ) {
220
246
LOG_INF (" Device is already unlocked" );
221
247
} else {
222
248
Nrf::PostTask ([] { LockActionEventHandler (); });
0 commit comments