# Copyright (c) 2018 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menuconfig SETTINGS
	bool "Settings"
	help
	  The settings subsystem allows its users to serialize and
	  deserialize state in memory into and from non-volatile memory.
	  It supports several back-ends to store and load serialized data from
	  and it can do so atomically for all involved modules.

if SETTINGS

module = SETTINGS
module-str = settings
source "subsys/logging/Kconfig.template.log_config"

config SETTINGS_RUNTIME
	bool "runtime storage back-end"
	help
	  Enables runtime storage back-end.

config SETTINGS_DYNAMIC_HANDLERS
	bool "dynamic settings handlers"
	default y
	help
	  Enables the use of dynamic settings handlers

# Hidden option to enable encoding length into settings entry
config SETTINGS_ENCODE_LEN
	bool

choice SETTINGS_BACKEND
	prompt "Storage back-end"
	default SETTINGS_NVS if NVS
	default SETTINGS_FCB if FCB
	default SETTINGS_FILE if FILE_SYSTEM
	default SETTINGS_NONE
	help
	  Storage back-end to be used by the settings subsystem.

config SETTINGS_FCB
	bool "FCB"
	depends on FCB
	help
	  Use FCB as a settings storage back-end.

config SETTINGS_FILE
	bool "File"
	depends on FILE_SYSTEM
	select SETTINGS_ENCODE_LEN
	help
	  Use a file (on mounted file system) as a settings storage back-end.

config SETTINGS_FS
	bool "FS (DEPRECATED)"
	depends on FILE_SYSTEM
	select SETTINGS_ENCODE_LEN
	select DEPRECATED
	help
	  This is deprecated, please use SETTINGS_FILE instead.

config SETTINGS_NVS
	bool "NVS non-volatile storage support"
	depends on NVS
	depends on FLASH_MAP
	help
	  Enables NVS storage support

if SETTINGS_NVS

config SETTINGS_NVS_NAME_CACHE
	bool "NVS name lookup cache"
	help
	  Enable NVS name lookup cache, used to reduce the Settings name
	  lookup time.

config SETTINGS_NVS_NAME_CACHE_SIZE
	int "NVS name lookup cache size"
	default 128
	range 1 65535
	depends on SETTINGS_NVS_NAME_CACHE
	help
	  Number of entries in Settings NVS name cache.

endif # SETTINGS_NVS

config SETTINGS_CUSTOM
	bool "CUSTOM"
	help
	  Use a custom settings storage back-end.

config SETTINGS_NONE
	bool "NONE"
	help
	  No storage back-end.
endchoice

config SETTINGS_FCB_NUM_AREAS
	int "Number of flash areas used by the settings subsystem"
	default 8
	depends on SETTINGS_FCB
	help
	  Number of areas to allocate in the settings FCB. A smaller number is
	  used if the flash hardware cannot support this value.

config SETTINGS_FCB_MAGIC
	hex "FCB magic for the settings subsystem"
	default 0xc0ffeeee
	depends on SETTINGS_FCB
	help
	  Magic 32-bit word for to identify valid settings area

config SETTINGS_FILE_PATH
	string "Default settings file"
	default "/settings/run"
	depends on SETTINGS_FILE
	help
	  Full path to the default settings file.

config SETTINGS_FILE_MAX_LINES
	int "Compression threshold"
	default 32
	depends on SETTINGS_FILE
	help
	  Limit how many items stored in a file before compressing

config SETTINGS_FS_DIR
	string "Serialization directory (DEPRECATED)"
	default "/settings"
	depends on SETTINGS_FS
	help
	  This is deprecated. Use SETTINGS_FILE_PATH instead.

config SETTINGS_FS_FILE
	string "Default settings file (DEPRECATED)"
	default "/settings/run"
	depends on SETTINGS_FS
	help
	  This is deprecated. Use SETTINGS_FILE_PATH instead.

config SETTINGS_FS_MAX_LINES
	int "Compression threshold (DEPRECATED)"
	default 32
	depends on SETTINGS_FS
	help
	  This is deprecated. Use SETTINGS_FILE_MAX_LINES instead.

config SETTINGS_NVS_SECTOR_SIZE_MULT
	int "Sector size of the NVS settings area"
	default 1
	depends on SETTINGS_NVS
	help
	  The sector size to use for the NVS settings area as a multiple of
	  FLASH_ERASE_BLOCK_SIZE.

config SETTINGS_NVS_SECTOR_COUNT
	int "Sector count of the NVS settings area"
	default 8
	depends on SETTINGS_NVS
	help
	  Number of sectors used for the NVS settings area

config SETTINGS_SHELL
	bool "Settings shell"
	depends on SHELL
	help
	  Enable shell commands for listing and reading the settings. Note that
	  reading the settings requires quite a big stack buffer, so the stack
	  size of the shell thread may need to be increased to accommodate this
	  feature.

endif # SETTINGS
