# Copyright (c) 2020 Linumiz
# SPDX-License-Identifier: Apache-2.0

menuconfig HAWKBIT
	bool "Eclipse hawkBit Firmware Over-the-Air support"
	depends on SETTINGS
	depends on FLASH
	depends on REBOOT
	depends on HWINFO
	depends on NET_TCP
	depends on NET_SOCKETS
	depends on IMG_MANAGER
	depends on NETWORKING
	depends on HTTP_CLIENT
	depends on DNS_RESOLVER
	depends on JSON_LIBRARY
	depends on BOOTLOADER_MCUBOOT
	select MPU_ALLOW_FLASH_WRITE
	select IMG_ENABLE_IMAGE_CHECK
	select IMG_ERASE_PROGRESSIVELY
	help
	  hawkBit is a domain independent back-end framework for polling out
	  software updates to constrained edge devices as well as more powerful
	  controllers and gateways connected to IP based networking infrastructure.

if HAWKBIT
config HAWKBIT_POLL_INTERVAL
	int "Time to poll interval (in minutes)"
	default 5
	range 1 43200
	help
	  Set the interval that the hawkbit update server will be polled.
	  This time interval is zero and 43200 minutes(30 days). This will be overridden
	  by the value configured in the settings of the hawkBit server.

config HAWKBIT_AUTOHANDLER
	bool "hawkBit autohandler"
	select EVENTS
	default y
	help
	  Activate autohandler to handle the update process automatically.

config HAWKBIT_SHELL
	bool "hawkBit shell utilities"
	depends on SHELL
	depends on HAWKBIT_AUTOHANDLER
	help
	  Activate shell module that provides hawkBit commands.

config HAWKBIT_SERVER
	string "User address for the hawkbit server"
	help
	  Configure the hawkbit server address.

config HAWKBIT_PORT
	int "Port number for the hawkbit server"
	default 8080
	help
	  Configure the hawkbit port number.

config HAWKBIT_SET_SETTINGS_RUNTIME
	bool "Set hawkbit settings at runtime"
	help
	  Enable to set hawkbit settings at runtime.

choice HAWKBIT_DDI_SECURITY
	prompt "hawkBit DDI API authentication modes"
	default HAWKBIT_DDI_NO_SECURITY

config HAWKBIT_DDI_NO_SECURITY
	bool "No authentication security"
	help
	  No authentication security for the hawkBit DDI API.

config HAWKBIT_DDI_TARGET_SECURITY
	bool "Use target security token authentication"
	help
	  Use target security token authentication for the hawkBit DDI API.

config HAWKBIT_DDI_GATEWAY_SECURITY
	bool "Use gateway security token authentication"
	help
	  Use gateway security token authentication for the hawkBit DDI API.

endchoice

config HAWKBIT_DDI_SECURITY_TOKEN
	string "Authentication security token"
	depends on HAWKBIT_DDI_TARGET_SECURITY || HAWKBIT_DDI_GATEWAY_SECURITY
	default ""
	help
	  Authentication security token for the configured hawkBit DDI
	  authentication mode.

config HAWKBIT_CUSTOM_ATTRIBUTES
	bool "Custom device attributes"
	help
	  Use custom definition of device attributes.

config HAWKBIT_STATUS_BUFFER_SIZE
	int "hawkBit status buffer size"
	default 200
	help
	  Set the size of the buffer, which is used to store the
	  json strings, that are sent to the hawkBit server. It might
	  be increased if the custom attributes are used extensively.

config HAWKBIT_CUSTOM_DEVICE_ID
	bool "Custom device id through callback function"
	help
	  Be able to customize the device id during runtime to a custom value,
	  by configuring the callback function. See `hawkbit_set_device_identity_cb`

config HAWKBIT_DEVICE_ID_MAX_LENGTH
	int "Maximum length of the device id"
	depends on HAWKBIT_CUSTOM_DEVICE_ID
	range 1 128
	default 32
	help
	  Maximum length of the device id.

config HAWKBIT_USE_TLS
	bool "Use TLS for hawkBit server connection"
	depends on NET_SOCKETS_SOCKOPT_TLS
	help
	  Use TLS for hawkBit connection.

if HAWKBIT_USE_TLS

choice HAWKBIT_CERT_TAG
	prompt "hawkBit certificate tag"
	default HAWKBIT_USE_STATIC_CERT_TAG

config HAWKBIT_USE_STATIC_CERT_TAG
	bool "Use static certificate tag"
	help
	  Use static certificate tag for TLS connection to the hawkBit server.

config HAWKBIT_USE_DYNAMIC_CERT_TAG
	bool "Use dynamic certificate tag"
	depends on HAWKBIT_SET_SETTINGS_RUNTIME
	help
	  Use dynamic certificate tag for TLS connection to the hawkBit server.

endchoice

config HAWKBIT_STATIC_CERT_TAG
	int "Static certificate tag"
	depends on HAWKBIT_USE_STATIC_CERT_TAG
	default 1
	help
	  Static certificate tag for TLS connection to the hawkBit server.

endif

choice HAWKBIT_REBOOT_MODE
	prompt "Reboot mode after update"
	default HAWKBIT_REBOOT_WARM

config HAWKBIT_REBOOT_WARM
	bool "Warm reboot after update"
	help
	  Do a warm reboot after the update.

config HAWKBIT_REBOOT_COLD
	bool "Cold reboot after update"
	help
	  Do a cold reboot after the update.

endchoice

config HEAP_MEM_POOL_ADD_SIZE_HAWKBIT
	int "Heap memory pool size for hawkBit"
	default 4096
	help
	  Set the size of the heap memory pool for hawkBit.

module = HAWKBIT
module-str = Log Level for hawkbit
module-help = Enables logging for hawkBit code.
source "subsys/logging/Kconfig.template.log_config"

endif
