# 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_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 $(UINT16_MAX)
	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_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
