samples: zbus: add Message subscriber sample

This sample illustrates how to use message subscribers with ZBus.

Signed-off-by: Rodrigo Peixoto <rodrigopex@gmail.com>
This commit is contained in:
Rodrigo Peixoto 2023-07-11 16:32:29 -03:00 committed by Johan Hedberg
commit 94f98b6cf0
6 changed files with 485 additions and 0 deletions

View file

@ -0,0 +1,8 @@
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(msg_subscriber)
FILE(GLOB app_sources src/*.c)
target_sources(app PRIVATE ${app_sources})

View file

@ -0,0 +1,10 @@
# Copyright (c) 2023 Rodrigo Peixoto <rodrigopex@gmail.com>
# SPDX-License-Identifier: Apache-2.0
config ZBUS_MSG_SUBSCRIBER_SAMPLE
bool "Force selection of heap listener configurations"
default y
select SYS_HEAP_LISTENER
select SYS_HEAP_RUNTIME_STATS
source "Kconfig.zephyr"

View file

@ -0,0 +1,78 @@
.. zephyr:code-sample:: zbus-msg-subscriber
:name: Message subscriber
:relevant-api: zbus_apis
Use zbus message subscribers to listen to messages published to channels.
Overview
********
This sample illustrates how to use a message subscriber in different
ways in conjunction with other types of observers.
Building and Running
********************
This project outputs to the console. It can be built and executed
on QEMU as follows:
.. zephyr-app-commands::
:zephyr-app: samples/subsys/zbus/msg_subscriber
:host-os: unix
:board: qemu_x86
:goals: run
Sample Output
=============
.. code-block:: console
-- west build: running target run
[0/1] To exit from QEMU enter: 'CTRL+a, x'[QEMU] CPU: qemu32,+nx,+pae
Booting from ROM..
I: ----> Publishing to acc_data_chan channel
I: AL Memory allocated 28 bytes. Total allocated 28 bytes
I: From listener foo_lis -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub1 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub2 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub3 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub4 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub5 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub6 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub7 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub8 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub9 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub10 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub11 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub12 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub13 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub14 -> Acc x=1, y=10, z=100
I: From msg subscriber bar_msg_sub15 -> Acc x=1, y=10, z=100
I: FR Memory freed 28 bytes. Total allocated 0 bytes
I: From msg subscriber bar_msg_sub16 -> Acc x=1, y=10, z=100
I: From subscriber bar_sub1 -> Acc x=1, y=10, z=100
I: From subscriber bar_sub2 -> Acc x=1, y=10, z=100
I: ----> Publishing to acc_data_chan channel
I: AL Memory allocated 28 bytes. Total allocated 28 bytes
I: From listener foo_lis -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub1 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub2 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub3 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub4 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub5 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub6 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub7 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub8 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub9 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub10 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub11 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub12 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub13 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub14 -> Acc x=2, y=20, z=200
I: From msg subscriber bar_msg_sub15 -> Acc x=2, y=20, z=200
I: FR Memory freed 28 bytes. Total allocated 0 bytes
I: From msg subscriber bar_msg_sub16 -> Acc x=2, y=20, z=200
I: From subscriber bar_sub1 -> Acc x=2, y=20, z=200
I: From subscriber bar_sub2 -> Acc x=2, y=20, z=200
<continues>
Exit QEMU by pressing :kbd:`CTRL+A` :kbd:`x`.

View file

@ -0,0 +1,12 @@
CONFIG_LOG=y
CONFIG_LOG_MODE_MINIMAL=y
CONFIG_ASSERT=y
CONFIG_BOOT_BANNER=n
CONFIG_MAIN_THREAD_PRIORITY=5
CONFIG_ZBUS=y
CONFIG_ZBUS_LOG_LEVEL_INF=y
CONFIG_ZBUS_CHANNEL_NAME=y
CONFIG_ZBUS_OBSERVER_NAME=y
CONFIG_ZBUS_MSG_SUBSCRIBER=y
CONFIG_HEAP_MEM_POOL_SIZE=1024
CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_POOL_SIZE=32

View file

@ -0,0 +1,183 @@
sample:
name: Message subscriber
tests:
sample.zbus.msg_subscriber_dynamic:
harness: console
extra_configs:
- CONFIG_ZBUS_LOG_LEVEL_DBG=y
harness_config:
type: multi_line
ordered: false
regex:
- "^.*?I: ----> Publishing to acc_data_chan channel"
- "^.*?I: AL Memory allocated \\d{1,3} bytes. Total allocated \\d{1,3} bytes$"
- "^.*?I: FR Memory freed \\d{1,3} bytes. Total allocated 0 bytes$"
- "^.*?D: 0 -> bar_sub1"
- "^.*?D: 1 -> bar_msg_sub1"
- "^.*?D: 2 -> bar_msg_sub2"
- "^.*?D: 3 -> bar_msg_sub3"
- "^.*?D: 4 -> bar_msg_sub4"
- "^.*?D: 5 -> bar_msg_sub5"
- "^.*?D: 6 -> bar_msg_sub6"
- "^.*?D: 7 -> bar_msg_sub7"
- "^.*?D: 8 -> bar_msg_sub8"
- "^.*?D: 9 -> bar_msg_sub9"
- "^.*?D: 10 -> foo_lis"
- "^.*?D: 11 -> bar_msg_sub10"
- "^.*?D: 12 -> bar_msg_sub11"
- "^.*?D: 13 -> bar_msg_sub12"
- "^.*?D: 14 -> bar_msg_sub13"
- "^.*?D: 15 -> bar_msg_sub14"
- "^.*?D: 16 -> bar_msg_sub15"
- "^.*?D: 17 -> bar_msg_sub16"
- "^.*?D: 18 -> bar_sub2"
- "^.*?I: From listener foo_lis -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub1 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub2 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub3 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub4 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub5 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub6 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub7 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub8 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub9 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub10 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub11 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub12 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub13 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub14 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub15 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub16 -> Acc x=1, y=10, z=100"
- "^.*?I: From subscriber bar_sub1 -> Acc x=1, y=10, z=100"
- "^.*?I: From subscriber bar_sub2 -> Acc x=1, y=10, z=100"
- "^.*?I: From listener foo_lis -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub1 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub2 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub3 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub4 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub5 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub6 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub7 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub8 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub9 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub10 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub11 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub12 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub13 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub14 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub15 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub16 -> Acc x=2, y=20, z=200"
- "^.*?I: From subscriber bar_sub1 -> Acc x=2, y=20, z=200"
- "^.*?I: From subscriber bar_sub2 -> Acc x=2, y=20, z=200"
- "^.*?I: From listener foo_lis -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub1 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub2 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub3 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub4 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub5 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub6 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub7 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub8 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub9 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub10 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub11 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub12 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub13 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub14 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub15 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub16 -> Acc x=3, y=30, z=300"
- "^.*?I: From subscriber bar_sub1 -> Acc x=3, y=30, z=300"
- "^.*?I: From subscriber bar_sub2 -> Acc x=3, y=30, z=300"
tags: zbus
integration_platforms:
- qemu_x86
sample.zbus.msg_subscriber_static:
harness: console
extra_configs:
- CONFIG_ZBUS_LOG_LEVEL_DBG=y
- CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_STATIC=y
- CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_STATIC_DATA_SIZE=16
harness_config:
type: multi_line
ordered: false
regex:
- "^.*?I: ----> Publishing to acc_data_chan channel"
- "^.*?D: 0 -> bar_sub1"
- "^.*?D: 1 -> bar_msg_sub1"
- "^.*?D: 2 -> bar_msg_sub2"
- "^.*?D: 3 -> bar_msg_sub3"
- "^.*?D: 4 -> bar_msg_sub4"
- "^.*?D: 5 -> bar_msg_sub5"
- "^.*?D: 6 -> bar_msg_sub6"
- "^.*?D: 7 -> bar_msg_sub7"
- "^.*?D: 8 -> bar_msg_sub8"
- "^.*?D: 9 -> bar_msg_sub9"
- "^.*?D: 10 -> foo_lis"
- "^.*?D: 11 -> bar_msg_sub10"
- "^.*?D: 12 -> bar_msg_sub11"
- "^.*?D: 13 -> bar_msg_sub12"
- "^.*?D: 14 -> bar_msg_sub13"
- "^.*?D: 15 -> bar_msg_sub14"
- "^.*?D: 16 -> bar_msg_sub15"
- "^.*?D: 17 -> bar_msg_sub16"
- "^.*?D: 18 -> bar_sub2"
- "^.*?I: From listener foo_lis -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub1 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub2 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub3 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub4 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub5 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub6 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub7 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub8 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub9 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub10 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub11 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub12 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub13 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub14 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub15 -> Acc x=1, y=10, z=100"
- "^.*?I: From msg subscriber bar_msg_sub16 -> Acc x=1, y=10, z=100"
- "^.*?I: From subscriber bar_sub1 -> Acc x=1, y=10, z=100"
- "^.*?I: From subscriber bar_sub2 -> Acc x=1, y=10, z=100"
- "^.*?I: From listener foo_lis -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub1 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub2 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub3 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub4 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub5 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub6 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub7 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub8 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub9 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub10 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub11 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub12 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub13 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub14 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub15 -> Acc x=2, y=20, z=200"
- "^.*?I: From msg subscriber bar_msg_sub16 -> Acc x=2, y=20, z=200"
- "^.*?I: From subscriber bar_sub1 -> Acc x=2, y=20, z=200"
- "^.*?I: From subscriber bar_sub2 -> Acc x=2, y=20, z=200"
- "^.*?I: From listener foo_lis -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub1 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub2 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub3 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub4 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub5 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub6 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub7 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub8 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub9 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub10 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub11 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub12 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub13 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub14 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub15 -> Acc x=3, y=30, z=300"
- "^.*?I: From msg subscriber bar_msg_sub16 -> Acc x=3, y=30, z=300"
- "^.*?I: From subscriber bar_sub1 -> Acc x=3, y=30, z=300"
- "^.*?I: From subscriber bar_sub2 -> Acc x=3, y=30, z=300"
tags: zbus
integration_platforms:
- qemu_x86

View file

@ -0,0 +1,194 @@
/*
* Copyright (c) 2022 Rodrigo Peixoto <rodrigopex@gmail.com>
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zephyr/sys/heap_listener.h>
#include <zephyr/zbus/zbus.h>
LOG_MODULE_REGISTER(sample, CONFIG_LOG_MAX_LEVEL);
extern struct sys_heap _system_heap;
static size_t total_allocated;
void on_heap_alloc(uintptr_t heap_id, void *mem, size_t bytes)
{
total_allocated += bytes;
LOG_INF(" AL Memory allocated %u bytes. Total allocated %u bytes", (unsigned int)bytes,
(unsigned int)total_allocated);
}
void on_heap_free(uintptr_t heap_id, void *mem, size_t bytes)
{
total_allocated -= bytes;
LOG_INF(" FR Memory freed %u bytes. Total allocated %u bytes", (unsigned int)bytes,
(unsigned int)total_allocated);
}
#if defined(CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_DYNAMIC)
HEAP_LISTENER_ALLOC_DEFINE(my_heap_listener_alloc, HEAP_ID_FROM_POINTER(&_system_heap),
on_heap_alloc);
HEAP_LISTENER_FREE_DEFINE(my_heap_listener_free, HEAP_ID_FROM_POINTER(&_system_heap), on_heap_free);
#endif /* CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_DYNAMIC */
struct acc_msg {
int x;
int y;
int z;
};
ZBUS_CHAN_DEFINE(acc_data_chan, /* Name */
struct acc_msg, /* Message type */
NULL, /* Validator */
NULL, /* User data */
ZBUS_OBSERVERS(bar_sub1, bar_msg_sub1, bar_msg_sub2, bar_msg_sub3, bar_msg_sub4,
bar_msg_sub5, bar_msg_sub6, bar_msg_sub7, bar_msg_sub8,
bar_msg_sub9, foo_lis), /* observers */
ZBUS_MSG_INIT(.x = 0, .y = 0, .z = 0) /* Initial value */
);
static void listener_callback_example(const struct zbus_channel *chan)
{
const struct acc_msg *acc = zbus_chan_const_msg(chan);
LOG_INF("From listener foo_lis -> Acc x=%d, y=%d, z=%d", acc->x, acc->y, acc->z);
}
ZBUS_LISTENER_DEFINE(foo_lis, listener_callback_example);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub1);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub2);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub3);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub4);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub5);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub6);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub7);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub8);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub9);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub10);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub11);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub12);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub13);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub14);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub15);
ZBUS_MSG_SUBSCRIBER_DEFINE(bar_msg_sub16);
ZBUS_SUBSCRIBER_DEFINE(bar_sub1, 4);
ZBUS_SUBSCRIBER_DEFINE(bar_sub2, 4);
static void msg_subscriber_task(void *sub)
{
const struct zbus_channel *chan;
struct acc_msg acc;
const struct zbus_observer *subscriber = sub;
while (!zbus_sub_wait_msg(subscriber, &chan, &acc, K_FOREVER)) {
if (&acc_data_chan != chan) {
LOG_ERR("Wrong channel %p!", chan);
continue;
}
LOG_INF("From msg subscriber %s -> Acc x=%d, y=%d, z=%d", zbus_obs_name(subscriber),
acc.x, acc.y, acc.z);
}
}
K_THREAD_DEFINE(subscriber_task_id1, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub1,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id2, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub2,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id3, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub3,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id4, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub4,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id5, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub5,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id6, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub6,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id7, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub7,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id8, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub8,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id9, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub9,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id10, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub10,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id11, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub11,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id12, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub12,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id13, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub13,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id14, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub14,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id15, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub15,
NULL, NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id16, CONFIG_MAIN_STACK_SIZE, msg_subscriber_task, &bar_msg_sub16,
NULL, NULL, 3, 0, 0);
static void subscriber_task(void *sub)
{
const struct zbus_channel *chan;
struct acc_msg acc;
const struct zbus_observer *subscriber = sub;
while (!zbus_sub_wait(subscriber, &chan, K_FOREVER)) {
if (&acc_data_chan != chan) {
LOG_ERR("Wrong channel %p!", chan);
continue;
}
zbus_chan_read(chan, &acc, K_MSEC(250));
LOG_INF("From subscriber %s -> Acc x=%d, y=%d, z=%d", zbus_obs_name(subscriber),
acc.x, acc.y, acc.z);
}
}
K_THREAD_DEFINE(subscriber_task_id17, CONFIG_MAIN_STACK_SIZE, subscriber_task, &bar_sub1, NULL,
NULL, 3, 0, 0);
K_THREAD_DEFINE(subscriber_task_id18, CONFIG_MAIN_STACK_SIZE, subscriber_task, &bar_sub2, NULL,
NULL, 3, 0, 0);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_sub2, 3);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_msg_sub10, 3);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_msg_sub11, 3);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_msg_sub12, 3);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_msg_sub13, 3);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_msg_sub14, 3);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_msg_sub15, 3);
ZBUS_CHAN_ADD_OBS(acc_data_chan, bar_msg_sub16, 3);
int main(void)
{
struct acc_msg acc = {.x = 1, .y = 10, .z = 100};
total_allocated = 0;
#if defined(CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_DYNAMIC)
heap_listener_register(&my_heap_listener_alloc);
heap_listener_register(&my_heap_listener_free);
#endif /* CONFIG_ZBUS_MSG_SUBSCRIBER_NET_BUF_DYNAMIC */
while (1) {
LOG_INF("----> Publishing to %s channel", zbus_chan_name(&acc_data_chan));
zbus_chan_pub(&acc_data_chan, &acc, K_SECONDS(1));
acc.x += 1;
acc.y += 10;
acc.z += 100;
k_msleep(1000);
}
return 0;
}