Skip to content

Commit 8da05d0

Browse files
mishadeshserhiiSalamakharestyled-commitss07641069
authored
[Telink]: Updated lock-app to fully support NVS storage. (#31744)
* [Telink]: Updated lock-app to fully support NVS storage. Reduced Lock-app RAM usage from 12kb to 4kb. Refactored credential storage. Signed-off-by: Misha Tkachenko <misha.tkachenko@telink-semi.com> * Restyled by whitespace * Restyled by clang-format * [Telink]: Added PWM configuration to project file Added PWM configuration to project file --------- Signed-off-by: Misha Tkachenko <misha.tkachenko@telink-semi.com> Co-authored-by: Serhii Salamakha <serhii.salamakha@gmail.com> Co-authored-by: Restyled.io <commits@restyled.io> Co-authored-by: Alex Tsitsiura <s07641069@gmail.com>
1 parent 2823126 commit 8da05d0

19 files changed

+664
-204
lines changed

config/telink/chip-module/Kconfig

+4
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,10 @@ config CHIP_ENABLE_POWER_ON_FACTORY_RESET
216216
first 5 seconds after power on and this sequence repeated 5 times - factory
217217
reset will be involved.
218218

219+
config CHIP_TASK_STACK_SIZE
220+
int
221+
default 8192
222+
219223
config CHIP_USE_MARS_SENSOR
220224
bool "Use Mars board sensor"
221225
depends on SOC_SERIES_RISCV_TELINK_B9X && (BOARD_TLSR9518ADK80D || BOARD_TLSR9518ADK80D_RETENTION)

config/telink/chip-module/Kconfig.defaults

+4-1
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ config SETTINGS_NVS_SECTOR_SIZE_MULT
211211

212212
# Set sector counter of NVS
213213
config SETTINGS_NVS_SECTOR_COUNT
214-
default 10
214+
default 12
215215

216216
# Enable OpenThread
217217

@@ -329,4 +329,7 @@ config PWM_SHELL
329329
config OPENTHREAD_SHELL
330330
default n
331331

332+
config CHIP_TASK_STACK_SIZE
333+
default 4864 if PM
334+
332335
endif

examples/lighting-app/telink/prj.conf

+3
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,8 @@ CONFIG_CHIP_FACTORY_DATA_BUILD=n
5151
CONFIG_CHIP_FACTORY_DATA_MERGE_WITH_FIRMWARE=n
5252
CONFIG_CHIP_CERTIFICATION_DECLARATION_STORAGE=n
5353

54+
#Enable PWM
55+
CONFIG_PWM=y
56+
5457
# Enable Power Management
5558
CONFIG_PM=n

examples/lock-app/telink/Kconfig

+11
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,16 @@
1515
#
1616
mainmenu "Matter Telink Lock Example Application"
1717

18+
if BOARD_TLSR9528A_RETENTION || BOARD_TLSR9518ADK80D_RETENTION
19+
config COMMON_LIBC_MALLOC_ARENA_SIZE
20+
default 9216
21+
endif
22+
23+
config SETTINGS_NVS_NAME_CACHE
24+
default y
25+
26+
config SETTINGS_NVS_NAME_CACHE_SIZE
27+
default 256
28+
1829
rsource "../../../config/telink/chip-module/Kconfig.defaults"
1930
source "Kconfig.zephyr"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/ {
2+
keys {
3+
compatible = "gpio-keys";
4+
key_5: button_5 {
5+
gpios = <&gpioe 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
6+
};
7+
key_6: button_6 {
8+
gpios = <&gpioe 1 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
9+
};
10+
};
11+
};
12+
13+
&gpioe {
14+
interrupts = <38 1>;
15+
status = "okay";
16+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/ {
2+
keys {
3+
compatible = "gpio-keys";
4+
key_5: button_5 {
5+
gpios = <&gpiob 6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
6+
};
7+
key_6: button_6 {
8+
gpios = <&gpiob 7 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
9+
};
10+
};
11+
};
12+
13+
&gpiob {
14+
interrupts = <39 1>;
15+
status = "okay";
16+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/ {
2+
keys {
3+
compatible = "gpio-keys";
4+
key_5: button_5 {
5+
gpios = <&gpiob 6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
6+
};
7+
key_6: button_6 {
8+
gpios = <&gpiob 7 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
9+
};
10+
};
11+
};
12+
13+
&gpiob {
14+
interrupts = <39 1>;
15+
status = "okay";
16+
};

examples/lock-app/telink/include/AppConfig.h

+8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@
2323
#define LOCK_MANAGER_CONFIG_USE_NVM_CREDENTIAL_STORAGE 1
2424
#define LOCK_MANAGER_ACTUATOR_MOVEMENT_TIME_MS 2000
2525

26+
#define APP_MAX_USERS 10
27+
#define APP_MAX_CREDENTIAL 10
28+
#define APP_MAX_WEEKDAY_SCHEDULE_PER_USER 10
29+
#define APP_MAX_YEARDAY_SCHEDULE_PER_USER 10
30+
#define APP_MAX_HOLYDAY_SCHEDULE_PER_USER 10
31+
32+
#define APP_MAX_SCHEDULES_TOTAL 100
33+
2634
#define APP_DEFAULT_USERS_COUNT 5
2735
#define APP_DEFAULT_CREDENTIAL_COUNT 5
2836
#define APP_DEFAULT_WEEKDAY_SCHEDULE_PER_USER_COUNT 5

examples/lock-app/telink/include/AppTask.h

+4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class AppTask : public AppTaskCommon
4040

4141
static void LockActionEventHandler(AppEvent * event);
4242
static void LockStateChanged(LockManager::State_t state);
43+
static void LockJammedEventHandler(void);
44+
static void LockJammedActionHandler(AppEvent * aEvent);
45+
static void LockStateEventHandler(void);
46+
static void LockStateActionHandler(AppEvent * aEvent);
4347

4448
static AppTask sAppTask;
4549
};

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

+14-23
Original file line numberDiff line numberDiff line change
@@ -30,34 +30,27 @@
3030

3131
struct WeekDaysScheduleInfo
3232
{
33-
DlScheduleStatus status;
33+
DlScheduleStatus status = DlScheduleStatus::kAvailable;
3434
EmberAfPluginDoorLockWeekDaySchedule schedule;
3535
};
3636

3737
struct YearDayScheduleInfo
3838
{
39-
DlScheduleStatus status;
39+
DlScheduleStatus status = DlScheduleStatus::kAvailable;
4040
EmberAfPluginDoorLockYearDaySchedule schedule;
4141
};
4242

4343
struct HolidayScheduleInfo
4444
{
45-
DlScheduleStatus status;
45+
DlScheduleStatus status = DlScheduleStatus::kAvailable;
4646
EmberAfPluginDoorLockHolidaySchedule schedule;
4747
};
4848

4949
namespace TelinkDoorLock {
5050
namespace ResourceRanges {
5151
// Used to size arrays
52-
static constexpr uint16_t kMaxUsers = 10;
53-
static constexpr uint8_t kMaxCredentialsPerUser = 10;
54-
static constexpr uint8_t kMaxWeekdaySchedulesPerUser = 10;
55-
static constexpr uint8_t kMaxYeardaySchedulesPerUser = 10;
56-
static constexpr uint8_t kMaxHolidaySchedules = 10;
57-
static constexpr uint8_t kMaxCredentialSize = 20;
58-
static constexpr uint8_t kNumCredentialTypes = 6;
59-
60-
static constexpr uint8_t kMaxCredentials = kMaxUsers * kMaxCredentialsPerUser;
52+
static constexpr uint8_t kMaxCredentialSize = 20;
53+
static constexpr uint8_t kNumCredentialTypes = 6;
6154

6255
} // namespace ResourceRanges
6356

@@ -197,26 +190,24 @@ class LockManager
197190
OperationSource mActuatorOperationSource = OperationSource::kButton;
198191
k_timer mActuatorTimer = {};
199192

200-
#if LOCK_MANAGER_CONFIG_USE_NVM_CREDENTIAL_STORAGE
201-
bool ReadConfigValues();
202-
#endif
203-
204193
bool setLockState(chip::EndpointId endpointId, DlLockState lockState, OperationSource source, OperationErrorEnum & err,
205194
const Nullable<chip::FabricIndex> & fabricIdx, const Nullable<chip::NodeId> & nodeId,
206195
const Optional<chip::ByteSpan> & pin);
207196

208197
static void ActuatorTimerEventHandler(k_timer * timer);
209198
static void ActuatorAppEventHandler(const AppEvent & event);
210199

211-
EmberAfPluginDoorLockUserInfo mLockUsers[kMaxUsers];
212-
EmberAfPluginDoorLockCredentialInfo mLockCredentials[kNumCredentialTypes][kMaxCredentials];
213-
WeekDaysScheduleInfo mWeekdaySchedule[kMaxUsers][kMaxWeekdaySchedulesPerUser];
214-
YearDayScheduleInfo mYeardaySchedule[kMaxUsers][kMaxYeardaySchedulesPerUser];
215-
HolidayScheduleInfo mHolidaySchedule[kMaxHolidaySchedules];
200+
#if !LOCK_MANAGER_CONFIG_USE_NVM_CREDENTIAL_STORAGE
201+
EmberAfPluginDoorLockUserInfo mLockUsers[APP_MAX_USERS];
202+
EmberAfPluginDoorLockCredentialInfo mLockCredentials[kNumCredentialTypes][APP_MAX_CREDENTIAL];
203+
WeekDaysScheduleInfo mWeekdaySchedule[APP_MAX_USERS][APP_MAX_WEEKDAY_SCHEDULE_PER_USER];
204+
YearDayScheduleInfo mYeardaySchedule[APP_MAX_USERS][APP_MAX_YEARDAY_SCHEDULE_PER_USER];
205+
HolidayScheduleInfo mHolidaySchedule[APP_MAX_HOLYDAY_SCHEDULE_PER_USER];
216206

217207
char mUserNames[ArraySize(mLockUsers)][DOOR_LOCK_MAX_USER_NAME_SIZE];
218-
uint8_t mCredentialData[kNumCredentialTypes][kMaxCredentials][kMaxCredentialSize];
219-
CredentialStruct mCredentials[kMaxUsers][kMaxCredentials];
208+
uint8_t mCredentialData[kNumCredentialTypes][APP_MAX_CREDENTIAL][kMaxCredentialSize];
209+
CredentialStruct mCredentials[APP_MAX_USERS][APP_MAX_CREDENTIAL];
210+
#endif
220211

221212
static LockManager sLock;
222213
TelinkDoorLock::LockInitParams::LockParam LockParams;

examples/lock-app/telink/include/LockSettingsStorage.h

+19-8
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,25 @@ namespace Internal {
2828
class LockSettingsStorage : ZephyrConfig
2929
{
3030
public:
31-
static const ZephyrConfig::Key kConfigKey_LockUser;
32-
static const ZephyrConfig::Key kConfigKey_LockUserName;
33-
static const ZephyrConfig::Key kConfigKey_UserCredentials;
34-
static const ZephyrConfig::Key kConfigKey_WeekDaySchedules;
35-
static const ZephyrConfig::Key kConfigKey_YearDaySchedules;
36-
static const ZephyrConfig::Key kConfigKey_HolidaySchedules;
37-
static const char * kConfigKey_Credential[kNumCredentialTypes];
38-
static const char * kConfigKey_CredentialData[kNumCredentialTypes];
31+
static const char * kConfigKey_LockUser[APP_MAX_USERS];
32+
static const char * kConfigKey_LockUserName[APP_MAX_USERS];
33+
static const char * kConfigKey_UserCredentials[APP_MAX_CREDENTIAL];
34+
static const char * kConfigKey_WeekDaySchedules[APP_MAX_USERS][APP_MAX_WEEKDAY_SCHEDULE_PER_USER];
35+
static const char * kConfigKey_YearDaySchedules[APP_MAX_USERS][APP_MAX_YEARDAY_SCHEDULE_PER_USER];
36+
static const char * kConfigKey_HolidaySchedules[APP_MAX_HOLYDAY_SCHEDULE_PER_USER];
37+
38+
static const char * kConfigKey_CredentialPin[APP_MAX_CREDENTIAL];
39+
static const char * kConfigKey_CredentialFace[APP_MAX_CREDENTIAL];
40+
static const char * kConfigKey_CredentialFingerprint[APP_MAX_CREDENTIAL];
41+
static const char * kConfigKey_CredentialFingervein[APP_MAX_CREDENTIAL];
42+
static const char * kConfigKey_CredentialRfid[APP_MAX_CREDENTIAL];
43+
44+
static const char * kConfigKey_CredentialData[APP_MAX_CREDENTIAL];
45+
static const char * kConfigKey_CredentialDataPin[APP_MAX_CREDENTIAL];
46+
static const char * kConfigKey_CredentialDataFace[APP_MAX_CREDENTIAL];
47+
static const char * kConfigKey_CredentialDataFingerprint[APP_MAX_CREDENTIAL];
48+
static const char * kConfigKey_CredentialDataFingerVein[APP_MAX_CREDENTIAL];
49+
static const char * kConfigKey_CredentialDataRfid[APP_MAX_CREDENTIAL];
3950
};
4051
} // namespace Internal
4152
} // namespace DeviceLayer

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

+57
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818

1919
#include "AppTask.h"
20+
#include "ButtonManager.h"
2021
#include <LockManager.h>
2122
#include <app-common/zap-generated/attributes/Accessors.h>
2223
#include <app/data-model/Nullable.h>
@@ -39,12 +40,20 @@ LEDWidget sLockLED;
3940
} // namespace
4041

4142
AppTask AppTask::sAppTask;
43+
static const struct gpio_dt_spec sLockJammedInputDt = GPIO_DT_SPEC_GET(DT_NODELABEL(key_5), gpios);
44+
static const struct gpio_dt_spec sLockStatusInputDt = GPIO_DT_SPEC_GET(DT_NODELABEL(key_6), gpios);
45+
Button sLockJammedAction;
46+
Button sLockStatusChangedAction;
4247

4348
CHIP_ERROR AppTask::Init(void)
4449
{
4550
#if APP_USE_EXAMPLE_START_BUTTON
4651
SetExampleButtonCallbacks(LockActionEventHandler);
4752
#endif
53+
sLockJammedAction.Configure(&sLockJammedInputDt, LockJammedEventHandler);
54+
sLockStatusChangedAction.Configure(&sLockStatusInputDt, LockStateEventHandler);
55+
ButtonManagerInst().AddButton(sLockJammedAction);
56+
ButtonManagerInst().AddButton(sLockStatusChangedAction);
4857
InitCommonParts();
4958

5059
#if CONFIG_CHIP_ENABLE_APPLICATION_STATUS_LED
@@ -200,3 +209,51 @@ void AppTask::LockStateChanged(LockManager::State_t state)
200209
break;
201210
}
202211
}
212+
213+
void AppTask::LockJammedEventHandler(void)
214+
{
215+
AppEvent event;
216+
217+
event.Type = AppEvent::kEventType_Button;
218+
event.ButtonEvent.Action = kButtonPushEvent;
219+
event.Handler = LockJammedActionHandler;
220+
GetAppTask().PostEvent(&event);
221+
}
222+
223+
void AppTask::LockJammedActionHandler(AppEvent * aEvent)
224+
{
225+
LOG_INF("Sending a lock jammed event");
226+
227+
/* Generating Door Lock Jammed event */
228+
DoorLockServer::Instance().SendLockAlarmEvent(kExampleEndpointId, AlarmCodeEnum::kLockJammed);
229+
}
230+
231+
void AppTask::LockStateEventHandler(void)
232+
{
233+
AppEvent event;
234+
235+
event.Type = AppEvent::kEventType_Button;
236+
event.ButtonEvent.Action = kButtonPushEvent;
237+
event.Handler = LockStateActionHandler;
238+
GetAppTask().PostEvent(&event);
239+
}
240+
241+
void AppTask::LockStateActionHandler(AppEvent * aEvent)
242+
{
243+
LOG_INF("Sending a lock state event");
244+
245+
// This code was written for testing purpose only
246+
// For real door status the level detection may be used instead of pulse
247+
static DoorStateEnum mDoorState = DoorStateEnum::kDoorOpen;
248+
if (mDoorState == DoorStateEnum::kDoorOpen)
249+
{
250+
mDoorState = DoorStateEnum::kDoorClosed;
251+
}
252+
else
253+
{
254+
mDoorState = DoorStateEnum::kDoorOpen;
255+
}
256+
257+
/* Generating Door Lock Status event */
258+
DoorLockServer::Instance().SetDoorState(kExampleEndpointId, mDoorState);
259+
}

0 commit comments

Comments
 (0)