Skip to content

Commit 1190299

Browse files
mykrupprestyled-commits
authored andcommitted
[EFR32] Lock-app working schedules with nvm storage, nvm credentials fix, add comments (#20044)
* working schedules with nvm storage, nvm credentials fix, add comments * restyle * return true if programmingPin is given to GetCredential * add index-checking helper functions, add param builder, replace preprocessor directive with constants, general clean up * code review comments, initial config params to 0, fix indexing check * Restyled by clang-format Co-authored-by: Restyled.io <[email protected]>
1 parent b714946 commit 1190299

File tree

5 files changed

+441
-100
lines changed

5 files changed

+441
-100
lines changed

examples/lock-app/efr32/include/LockManager.h

+99-19
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,73 @@
2929

3030
#include <lib/core/CHIPError.h>
3131

32-
using namespace ::chip;
32+
namespace EFR32DoorLock {
33+
namespace ResourceRanges {
34+
// Used to size arrays
35+
static constexpr uint16_t kMaxUsers = 10;
36+
static constexpr uint8_t kMaxCredentialsPerUser = 10;
37+
static constexpr uint8_t kMaxWeekdaySchedulesPerUser = 10;
38+
static constexpr uint8_t kMaxYeardaySchedulesPerUser = 10;
39+
static constexpr uint8_t kMaxHolidaySchedules = 10;
40+
static constexpr uint8_t kMaxCredentialSize = 8;
41+
42+
// Indices received for user/credential/schedules are 1-indexed
43+
static constexpr uint8_t kStartIndexValue = 1;
3344

34-
// Currently up to 10 users are support on the EFR32 platform
35-
#define DOOR_LOCK_MAX_USERS 10
36-
#define DOOR_LOCK_MAX_CREDENTIAL_SIZE 8
37-
#define MININUM_USER_INDEX 1
38-
#define MINIMUM_CREDENTIAL_INDEX 1
39-
#define MAX_CREDENTIAL_PER_USER 10
40-
#define MAX_CREDENTIALS 50
45+
static constexpr uint8_t kMaxCredentials = kMaxUsers * kMaxCredentialsPerUser;
46+
} // namespace ResourceRanges
4147

42-
static constexpr size_t DOOR_LOCK_CREDENTIAL_INFO_MAX_DATA_SIZE = 20;
48+
namespace LockInitParams {
49+
50+
struct LockParam
51+
{
52+
// Read from zap attributes
53+
uint16_t numberOfUsers = 0;
54+
uint8_t numberOfCredentialsPerUser = 0;
55+
uint8_t numberOfWeekdaySchedulesPerUser = 0;
56+
uint8_t numberOfYeardaySchedulesPerUser = 0;
57+
uint8_t numberOfHolidaySchedules = 0;
58+
};
59+
60+
class ParamBuilder
61+
{
62+
public:
63+
ParamBuilder & SetNumberOfUsers(uint16_t numberOfUsers)
64+
{
65+
lockParam_.numberOfUsers = numberOfUsers;
66+
return *this;
67+
}
68+
ParamBuilder & SetNumberOfCredentialsPerUser(uint8_t numberOfCredentialsPerUser)
69+
{
70+
lockParam_.numberOfCredentialsPerUser = numberOfCredentialsPerUser;
71+
return *this;
72+
}
73+
ParamBuilder & SetNumberOfWeekdaySchedulesPerUser(uint8_t numberOfWeekdaySchedulesPerUser)
74+
{
75+
lockParam_.numberOfWeekdaySchedulesPerUser = numberOfWeekdaySchedulesPerUser;
76+
return *this;
77+
}
78+
ParamBuilder & SetNumberOfYeardaySchedulesPerUser(uint8_t numberOfYeardaySchedulesPerUser)
79+
{
80+
lockParam_.numberOfYeardaySchedulesPerUser = numberOfYeardaySchedulesPerUser;
81+
return *this;
82+
}
83+
ParamBuilder & SetNumberOfHolidaySchedules(uint8_t numberOfHolidaySchedules)
84+
{
85+
lockParam_.numberOfHolidaySchedules = numberOfHolidaySchedules;
86+
return *this;
87+
}
88+
LockParam GetLockParam() { return lockParam_; }
89+
90+
private:
91+
LockParam lockParam_;
92+
};
93+
94+
} // namespace LockInitParams
95+
} // namespace EFR32DoorLock
96+
97+
using namespace ::chip;
98+
using namespace EFR32DoorLock::ResourceRanges;
4399

44100
class LockManager
45101
{
@@ -61,7 +117,7 @@ class LockManager
61117
} State;
62118

63119
CHIP_ERROR Init(chip::app::DataModel::Nullable<chip::app::Clusters::DoorLock::DlLockState> state,
64-
uint8_t maxNumberOfCredentialsPerUser, uint16_t numberOfSupportedUsers);
120+
EFR32DoorLock::LockInitParams::LockParam lockParam);
65121
bool NextState();
66122
bool IsActionInProgress();
67123
bool InitiateAction(int32_t aActor, Action_t aAction);
@@ -73,17 +129,40 @@ class LockManager
73129
bool Lock(chip::EndpointId endpointId, const Optional<chip::ByteSpan> & pin, DlOperationError & err);
74130
bool Unlock(chip::EndpointId endpointId, const Optional<chip::ByteSpan> & pin, DlOperationError & err);
75131

76-
bool GetUser(chip::EndpointId endpointId, uint16_t userIndex, EmberAfPluginDoorLockUserInfo & user) const;
132+
bool GetUser(chip::EndpointId endpointId, uint16_t userIndex, EmberAfPluginDoorLockUserInfo & user);
77133
bool SetUser(chip::EndpointId endpointId, uint16_t userIndex, chip::FabricIndex creator, chip::FabricIndex modifier,
78134
const chip::CharSpan & userName, uint32_t uniqueId, DlUserStatus userStatus, DlUserType usertype,
79135
DlCredentialRule credentialRule, const DlCredential * credentials, size_t totalCredentials);
80136

81137
bool GetCredential(chip::EndpointId endpointId, uint16_t credentialIndex, DlCredentialType credentialType,
82-
EmberAfPluginDoorLockCredentialInfo & credential) const;
138+
EmberAfPluginDoorLockCredentialInfo & credential);
83139

84140
bool SetCredential(chip::EndpointId endpointId, uint16_t credentialIndex, chip::FabricIndex creator, chip::FabricIndex modifier,
85141
DlCredentialStatus credentialStatus, DlCredentialType credentialType, const chip::ByteSpan & credentialData);
86142

143+
DlStatus GetWeekdaySchedule(chip::EndpointId endpointId, uint8_t weekdayIndex, uint16_t userIndex,
144+
EmberAfPluginDoorLockWeekDaySchedule & schedule);
145+
146+
DlStatus SetWeekdaySchedule(chip::EndpointId endpointId, uint8_t weekdayIndex, uint16_t userIndex, DlScheduleStatus status,
147+
DlDaysMaskMap daysMask, uint8_t startHour, uint8_t startMinute, uint8_t endHour, uint8_t endMinute);
148+
149+
DlStatus GetYeardaySchedule(chip::EndpointId endpointId, uint8_t yearDayIndex, uint16_t userIndex,
150+
EmberAfPluginDoorLockYearDaySchedule & schedule);
151+
152+
DlStatus SetYeardaySchedule(chip::EndpointId endpointId, uint8_t yearDayIndex, uint16_t userIndex, DlScheduleStatus status,
153+
uint32_t localStartTime, uint32_t localEndTime);
154+
155+
DlStatus GetHolidaySchedule(chip::EndpointId endpointId, uint8_t holidayIndex, EmberAfPluginDoorLockHolidaySchedule & schedule);
156+
157+
DlStatus SetHolidaySchedule(chip::EndpointId endpointId, uint8_t holidayIndex, DlScheduleStatus status, uint32_t localStartTime,
158+
uint32_t localEndTime, DlOperatingMode operatingMode);
159+
160+
bool IsValidUserIndex(uint16_t userIndex);
161+
bool IsValidCredentialIndex(uint16_t credentialIndex, DlCredentialType type);
162+
bool IsValidWeekdayScheduleIndex(uint8_t scheduleIndex);
163+
bool IsValidYeardayScheduleIndex(uint8_t scheduleIndex);
164+
bool IsValidHolidayScheduleIndex(uint8_t scheduleIndex);
165+
87166
bool setLockState(chip::EndpointId endpointId, DlLockState lockState, const Optional<chip::ByteSpan> & pin,
88167
DlOperationError & err);
89168
const char * lockStateToString(DlLockState lockState) const;
@@ -105,17 +184,18 @@ class LockManager
105184
static void AutoLockTimerEventHandler(AppEvent * aEvent);
106185
static void ActuatorMovementTimerEventHandler(AppEvent * aEvent);
107186

108-
EmberAfPluginDoorLockUserInfo mLockUsers[DOOR_LOCK_MAX_USERS];
109-
EmberAfPluginDoorLockCredentialInfo mLockCredentials[MAX_CREDENTIALS];
110-
111-
uint8_t mMaxCredentialsPerUser;
112-
uint16_t mMaxUsers;
187+
EmberAfPluginDoorLockUserInfo mLockUsers[kMaxUsers];
188+
EmberAfPluginDoorLockCredentialInfo mLockCredentials[kMaxCredentials];
189+
EmberAfPluginDoorLockWeekDaySchedule mWeekdaySchedule[kMaxUsers][kMaxWeekdaySchedulesPerUser];
190+
EmberAfPluginDoorLockYearDaySchedule mYeardaySchedule[kMaxUsers][kMaxYeardaySchedulesPerUser];
191+
EmberAfPluginDoorLockHolidaySchedule mHolidaySchedule[kMaxHolidaySchedules];
113192

114193
char mUserNames[ArraySize(mLockUsers)][DOOR_LOCK_MAX_USER_NAME_SIZE];
115-
uint8_t mCredentialData[MAX_CREDENTIALS][DOOR_LOCK_MAX_CREDENTIAL_SIZE];
116-
chip::Platform::ScopedMemoryBuffer<DlCredential> mCredentials[MAX_CREDENTIAL_PER_USER];
194+
uint8_t mCredentialData[kMaxCredentials][kMaxCredentialSize];
195+
DlCredential mCredentials[kMaxUsers][kMaxCredentialsPerUser];
117196

118197
static LockManager sLock;
198+
EFR32DoorLock::LockInitParams::LockParam LockParams;
119199
};
120200

121201
inline LockManager & LockMgr()

examples/lock-app/efr32/src/AppTask.cpp

+47-7
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ using chip::app::Clusters::DoorLock::DlOperationSource;
8383
using namespace chip;
8484
using namespace ::chip::DeviceLayer;
8585
using namespace ::chip::DeviceLayer::Internal;
86+
using namespace EFR32DoorLock::LockInitParams;
8687

8788
namespace {
8889
TimerHandle_t sFunctionTimer; // FreeRTOS app sw timer.
@@ -236,27 +237,66 @@ CHIP_ERROR AppTask::Init()
236237
chip::DeviceLayer::PlatformMgr().LockChipStack();
237238
chip::app::Clusters::DoorLock::Attributes::LockState::Get(endpointId, state);
238239

239-
uint8_t maxCredentialsPerUser = 0;
240-
if (!DoorLockServer::Instance().GetNumberOfCredentialsSupportedPerUser(endpointId, maxCredentialsPerUser))
240+
uint8_t numberOfCredentialsPerUser = 0;
241+
if (!DoorLockServer::Instance().GetNumberOfCredentialsSupportedPerUser(endpointId, numberOfCredentialsPerUser))
241242
{
242243
ChipLogError(Zcl,
243244
"Unable to get number of credentials supported per user when initializing lock endpoint, defaulting to 5 "
244245
"[endpointId=%d]",
245246
endpointId);
246-
maxCredentialsPerUser = 5;
247+
numberOfCredentialsPerUser = 5;
247248
}
248249

249-
uint16_t numberOfSupportedUsers = 0;
250-
if (!DoorLockServer::Instance().GetNumberOfUserSupported(endpointId, numberOfSupportedUsers))
250+
uint16_t numberOfUsers = 0;
251+
if (!DoorLockServer::Instance().GetNumberOfUserSupported(endpointId, numberOfUsers))
251252
{
252253
ChipLogError(Zcl,
253254
"Unable to get number of supported users when initializing lock endpoint, defaulting to 10 [endpointId=%d]",
254255
endpointId);
255-
numberOfSupportedUsers = 10;
256+
numberOfUsers = 10;
256257
}
258+
259+
uint8_t numberOfWeekdaySchedulesPerUser = 0;
260+
if (!DoorLockServer::Instance().GetNumberOfWeekDaySchedulesPerUserSupported(endpointId, numberOfWeekdaySchedulesPerUser))
261+
{
262+
ChipLogError(
263+
Zcl,
264+
"Unable to get number of supported weekday schedules when initializing lock endpoint, defaulting to 10 [endpointId=%d]",
265+
endpointId);
266+
numberOfWeekdaySchedulesPerUser = 10;
267+
}
268+
269+
uint8_t numberOfYeardaySchedulesPerUser = 0;
270+
if (!DoorLockServer::Instance().GetNumberOfYearDaySchedulesPerUserSupported(endpointId, numberOfYeardaySchedulesPerUser))
271+
{
272+
ChipLogError(
273+
Zcl,
274+
"Unable to get number of supported yearday schedules when initializing lock endpoint, defaulting to 10 [endpointId=%d]",
275+
endpointId);
276+
numberOfYeardaySchedulesPerUser = 10;
277+
}
278+
279+
uint8_t numberOfHolidaySchedules = 0;
280+
if (!DoorLockServer::Instance().GetNumberOfHolidaySchedulesSupported(endpointId, numberOfHolidaySchedules))
281+
{
282+
ChipLogError(
283+
Zcl,
284+
"Unable to get number of supported holiday schedules when initializing lock endpoint, defaulting to 10 [endpointId=%d]",
285+
endpointId);
286+
numberOfHolidaySchedules = 10;
287+
}
288+
257289
chip::DeviceLayer::PlatformMgr().UnlockChipStack();
258290

259-
err = LockMgr().Init(state, maxCredentialsPerUser, numberOfSupportedUsers);
291+
err = LockMgr().Init(state,
292+
ParamBuilder()
293+
.SetNumberOfUsers(numberOfUsers)
294+
.SetNumberOfCredentialsPerUser(numberOfCredentialsPerUser)
295+
.SetNumberOfWeekdaySchedulesPerUser(numberOfWeekdaySchedulesPerUser)
296+
.SetNumberOfYeardaySchedulesPerUser(numberOfYeardaySchedulesPerUser)
297+
.SetNumberOfHolidaySchedules(numberOfHolidaySchedules)
298+
.GetLockParam());
299+
260300
if (err != CHIP_NO_ERROR)
261301
{
262302
EFR32_LOG("LockMgr().Init() failed");

0 commit comments

Comments
 (0)