# 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
	bool "Message subscribers will receive all messages in sequence."
	select NET_BUF

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_ASYNC_LISTENER
	bool "Async listeners"
	select ZBUS_MSG_SUBSCRIBER
	help
	  Async listeners will execute the callback asynchronously through a work queue (the
	  system's work queue by default).

if ZBUS_ASYNC_LISTENER

config ZBUS_ASYNC_LISTENER_EXEC_TIMEOUT
	int "Timeout to get a message from the fifo"
	default 200

endif # ZBUS_ASYNC_LISTENER

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
