# 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 simutaneously."

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


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

endif # ZBUS
