# Copyright (c) 2022 Rodrigo Peixoto <rodrigopex@gmail.com>
# SPDX-License-Identifier: Apache-2.0

menuconfig ZBUS
	bool "ZBus support"
	depends on MULTITHREADING
	help
	  Enables support for Zephyr message bus.

if ZBUS

config ZBUS_PREFER_DYNAMIC_ALLOCATION
	bool "Set zbus to work with dynamic allocation using the system heap"
	default y

config ZBUS_CHANNELS_SYS_INIT_PRIORITY
	default 5
	int "The priority used during the SYS_INIT procedure."

config ZBUS_CHANNEL_NAME
	bool "Channel name field"

config ZBUS_CHANNEL_ID
	bool "Channel identifier field"

config ZBUS_OBSERVER_NAME
	bool "Observer name field"

config ZBUS_CHANNEL_PUBLISH_STATS
	bool "Channel publishing statistics (Timestamp and count)"

config ZBUS_MSG_SUBSCRIBER
	select NET_BUF
	bool "Message subscribers will receive all messages in sequence."

if ZBUS_MSG_SUBSCRIBER

choice ZBUS_MSG_SUBSCRIBER_BUF_ALLOC
	prompt "ZBus msg_subscribers buffer allocation"
	default ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_DYNAMIC if ZBUS_PREFER_DYNAMIC_ALLOCATION
	default ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_STATIC

config ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_DYNAMIC
	bool "Use heap to allocate msg_subscriber buffers data"

config ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_STATIC
	bool "Use fixed data size for msg_subscriber buffers pool"

endchoice

config ZBUS_MSG_SUBSCRIBER_NET_BUF_POOL_ISOLATION
	default n
	bool "Use isolated pools instead of only using the global pool."

config ZBUS_MSG_SUBSCRIBER_NET_BUF_POOL_SIZE
	default 16
	int "The count of net_buf available to be used simultaneously."

if ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_STATIC

config ZBUS_MSG_SUBSCRIBER_NET_BUF_STATIC_DATA_SIZE
	int "The size of the biggest message used with ZBus."

endif # ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_STATIC

endif # ZBUS_MSG_SUBSCRIBER

config ZBUS_RUNTIME_OBSERVERS
	bool "Runtime observers support."

if ZBUS_RUNTIME_OBSERVERS

choice ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC
	prompt "ZBus runtime observers node allocation"
	default ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_DYNAMIC if ZBUS_PREFER_DYNAMIC_ALLOCATION
	default ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_STATIC

config ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_DYNAMIC
	bool "Use heap to allocate runtime observers node"

config ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_STATIC
	bool "Use a pool of runtime observers nodes"

config ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_NONE
	bool "Use user-provided runtime observers nodes"

endchoice

config ZBUS_RUNTIME_OBSERVERS_NODE_POOL_SIZE
	int "Runtime observer pool size"
	depends on ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_STATIC
	default 8

endif # ZBUS_RUNTIME_OBSERVERS

config ZBUS_PRIORITY_BOOST
	bool "ZBus priority boost algorithm"
	default y
	help
	  ZBus implements the Highest Locker Protocol that relies on the observers’ thread priority
	  to determine a temporary publisher priority.

config ZBUS_ASSERT_MOCK
	bool "ZBus assert mock for test purposes."
	help
	  This configuration enables the developer to change the _ZBUS_ASSERT behavior. When this configuration is
	  enabled, _ZBUS_ASSERT returns -EFAULT instead of assert. It makes it more straightforward to test invalid
	  parameters.


config HEAP_MEM_POOL_ADD_SIZE_ZBUS
	int "ZBus requested heap pool size."
	default 2048 if ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_DYNAMIC && !ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_DYNAMIC
	default 1024 if !ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_DYNAMIC && ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_DYNAMIC
	default 3072 if ZBUS_MSG_SUBSCRIBER_BUF_ALLOC_DYNAMIC && ZBUS_RUNTIME_OBSERVERS_NODE_ALLOC_DYNAMIC
	default 0
	help
	  Configures the available heap memory pool for ZBus.
	  The heap is used for various ZBus operations (especially required for dynamic buffer allocation for
	  message subscribers and runtime observers).
	  In case of dynamic net buffer allocation the heap must fit all data distributed via message subscribers.
	  Can be set manual, if more heap is required, or default heap size is too big for the soc.

module = ZBUS
module-str = zbus
source "subsys/logging/Kconfig.template.log_config"

endif # ZBUS
