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

menuconfig SETTINGS
	bool "Enable settings subsystem with non-volatile storage"
	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"
	depends on SETTINGS
	select BASE64
	help
	  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
