# 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"
endif

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

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

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

config SETTINGS_USE_BASE64
	bool "encoding value using base64 (deprecated)"
	depends on SETTINGS
	select BASE64
	help
	  This option has been deprecated and will not be supported
	  in future releases.
	  Enables values encoding using Base64.

choice
	prompt "Storage back-end"
	default SETTINGS_NVS if NVS
	default SETTINGS_FCB if FCB
	default SETTINGS_FS if FILE_SYSTEM
	default SETTINGS_NONE
	depends on SETTINGS
	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_FS
	bool "File System"
	depends on FILE_SYSTEM
	select SETTINGS_ENCODE_LEN
	help
	  Use a 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

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 && 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 && SETTINGS_FCB
	help
	  Magic 32-bit word for to identify valid settings area

config SETTINGS_FS_DIR
	string "Serialization directory"
	default "/settings"
	depends on SETTINGS && SETTINGS_FS
	help
	  Directory where the settings data is stored

config SETTINGS_FS_FILE
	string "Default settings file"
	default "/settings/run"
	depends on SETTINGS && SETTINGS_FS
	help
	  Full path to the default settings file.

config SETTINGS_FS_MAX_LINES
	int "Compression threshold"
	default 32
	depends on SETTINGS && SETTINGS_FS
	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 && 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 && SETTINGS_NVS
	help
	  Number of sectors used for the NVS settings area
