# Copyright Runtime.io 2018. All rights reserved.
# Copyright Nordic Semiconductor ASA 2020-2022. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

# The Kconfig file is dedicated to OS management group of
# of MCUmgr subsystem and provides Kconfig options to configure
# group commands behaviour and other aspects.
#
# Options defined in this file should be prefixed:
#  MCUMGR_GRP_OS_ -- general group options;
#
# When adding Kconfig options, that control the same feature,
# try to group them together by the same stem after prefix.

menuconfig MCUMGR_GRP_OS
	bool "Mcumgr handlers for OS management"
	imply REBOOT
	help
	  Enables MCUmgr handlers for OS management

if MCUMGR_GRP_OS

if REBOOT

config MCUMGR_GRP_OS_RESET_MS
	int "Delay before executing reset command (ms)"
	default 250
	depends on REBOOT
	help
	  When a reset command is received, the system waits this many milliseconds
	  before performing the reset.  This delay allows time for the MCUmgr
	  response to be delivered.

config MCUMGR_GRP_OS_RESET_HOOK
	bool "Reset hook"
	depends on REBOOT
	depends on MCUMGR_MGMT_NOTIFICATION_HOOKS
	help
	  Allows applications to control and get notifications of when a reset
	  command has been issued via an MCUmgr command. With this option
	  disabled, modules will reboot when the command is received without
	  notification, when this is enabled and a handler is registered, the
	  application will be notified that a reset command has been received
	  and will allow the application to perform any required operations
	  before accepting or declining the reset request.

endif

config MCUMGR_GRP_OS_TASKSTAT
	bool "Support for taskstat command"
	depends on THREAD_MONITOR

if MCUMGR_GRP_OS_TASKSTAT

config MCUMGR_GRP_OS_TASKSTAT_ONLY_SUPPORTED_STATS
	bool "Send only data gathered by Zephyr"
	default y
	help
	  Response will not include fields the Zephyr does not collect statistic for.
	  Enable this if your client software is able to process "taskstat" response
	  that would be missing "runtime", "cswcnt", "last_checkin" and "next_checkin"
	  map entries for each listed task.
	  Enabling this option will slightly reduce code size.

choice MCUMGR_GRP_OS_TASKSTAT_THREAD_NAME_CHOICE
	prompt "Characteristic used as thread name in taskstat"
	default MCUMGR_GRP_OS_TASKSTAT_USE_THREAD_NAME_FOR_NAME if THREAD_NAME
	default MCUMGR_GRP_OS_TASKSTAT_USE_THREAD_PRIO_FOR_NAME
	help
	  Select what will serve as thread name in "taskstat" response.
	  By default taskstat responses use thread priority, when THREAD_NAME is disabled,

	config MCUMGR_GRP_OS_TASKSTAT_USE_THREAD_NAME_FOR_NAME
		bool "Thread name"
		depends on THREAD_NAME

	config MCUMGR_GRP_OS_TASKSTAT_USE_THREAD_IDX_FOR_NAME
		bool "Thread index"

	config MCUMGR_GRP_OS_TASKSTAT_USE_THREAD_PRIO_FOR_NAME
		bool "Thread priority"

endchoice

config MCUMGR_GRP_OS_TASKSTAT_MAX_NUM_THREADS
	int "Predicted maximum number of threads to return on taskstat list"
	default 50
	help
	  This is used for defining CBOR map holding thread info.
	  The value does not affect memory allocation, it is used by zcbor
	  to figure out how to encode map depending on its predicted size.

config MCUMGR_GRP_OS_TASKSTAT_THREAD_NAME_LEN
	int "Length of thread name to return in response"
	default THREAD_MAX_NAME_LEN if THREAD_NAME
	default 5 if !THREAD_NAME
	range 3 THREAD_MAX_NAME_LEN if THREAD_NAME
	range 3 6 if !THREAD_NAME
	help
	  The length of the string that is sent in response to taskstat command,
	  as a thread name.
	  When THREAD_NAME is enabled then this defaults to THREAD_MAX_NAME_LEN.
	  When THREAD_NAME is disabled the name is generated from thread priority,
	  signed integer, and this number regulates how many digits will be used;
	  in such case this value should also take into account possible '-'
	  sign.

config MCUMGR_GRP_OS_TASKSTAT_SIGNED_PRIORITY
	bool "Signed priorities"
	default y
	help
	  Zephyr uses int8_t as thread priorities, but in taskstat response it encodes
	  them as unsigned.  Enabling this option will use signed int for priorities in
	  responses, which is more natural for Zephyr.
	  Disable this option if your client software is unable to properly decode and
	  accept signed integers as priorities.

config MCUMGR_GRP_OS_TASKSTAT_STACK_INFO
	bool "Include stack info in taskstat responses"
	depends on THREAD_STACK_INFO
	help
	  Enabling this option adds stack information into "taskstat" command
	  responses, this is default when THREAD_STACK_INFO is selected.
	  Disable this option only when your client application is able to
	  process "taskstat" response without the "stksiz" and "stkuse" fields.
	  It is worth disabling this option when THREAD_STACK_INFO is disabled,
	  as it will prevent sending zeroed stack information just to fill
	  all the fields in "taskstat" responses, and it will slightly reduce code size.

endif

config MCUMGR_GRP_OS_ECHO
	bool "Support for echo command"
	default y
	select MCUMGR_SMP_CBOR_MIN_DECODING_LEVEL_2

config MCUMGR_GRP_OS_MCUMGR_PARAMS
	bool "MCUMGR Parameters retrieval command"

config MCUMGR_GRP_OS_INFO
	bool "Support for info command"
	help
	  Can be used similarly to the unix/linux uname command for retrieving system information
	  including kernel version, processor architecture and board name.

if MCUMGR_GRP_OS_INFO

config MCUMGR_GRP_OS_INFO_MAX_RESPONSE_SIZE
	int "Maximum response size for info command"
	default 256
	range 32 512
	help
	  The maximum size of the response to the info command, will use a stack buffer of this
	  size to store the data in. If the output response is too big then the output will not be
	  present in the response, which will just contain the result code (rc) of memory error.

config MCUMGR_GRP_OS_INFO_CUSTOM_HOOKS
	bool "Custom info hooks"
	depends on MCUMGR_MGMT_NOTIFICATION_HOOKS
	help
	  Supports adding custom command/character processing to the info command by using
	  registered callbacks. Data can be appended to the struct provided in the callback.

config MCUMGR_GRP_OS_INFO_BUILD_DATE_TIME
	bool "Show build date and time"
	help
	  Will allow returning the build date and time of the firmware by using the info with
	  format option 'b' (will also be returned with all responses by using 'a').

	  Note: This will invalidate reproducible builds of the firmware as it will embed the
	  build date/time in the output firmware image.

endif

module = MCUMGR_GRP_OS
module-str = mcumgr_grp_os
source "subsys/logging/Kconfig.template.log_config"

endif
