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

menuconfig MCUMGR_CMD_OS_MGMT
	bool "Mcumgr handlers for OS management"
	select REBOOT
	help
	  Enables mcumgr handlers for OS management

if MCUMGR_CMD_OS_MGMT

config OS_MGMT_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_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.

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

if OS_MGMT_TASKSTAT

config OS_MGMT_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 OS_MGMT_TASKSTAT_THREAD_NAME_CHOICE
	prompt "Characteristic used as thread name in taskstat"
	default OS_MGMT_TASKSTAT_USE_THREAD_NAME_FOR_NAME if THREAD_NAME
	default OS_MGMT_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 OS_MGMT_TASKSTAT_USE_THREAD_NAME_FOR_NAME
		bool "Thread name"
		depends on THREAD_NAME

	config OS_MGMT_TASKSTAT_USE_THREAD_IDX_FOR_NAME
		bool "Thread index"

	config OS_MGMT_TASKSTAT_USE_THREAD_PRIO_FOR_NAME
		bool "Thread priority"

endchoice

config OS_MGMT_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 OS_MGMT_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 OS_MGMT_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 OS_MGMT_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 OS_MGMT_ECHO
	bool "Support for echo command"
	default y
	select MGMT_MIN_DECODING_LEVEL_2

config OS_MGMT_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

endif
