1 /*
2  * Copyright (c) 2022 Rodrigo Peixoto <rodrigopex@gmail.com>
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #include "messages.h"
7 
8 #include <stdint.h>
9 
10 #include <zephyr/kernel.h>
11 #include <zephyr/logging/log.h>
12 #include <zephyr/zbus/zbus.h>
13 LOG_MODULE_DECLARE(zbus, CONFIG_ZBUS_LOG_LEVEL);
14 
15 ZBUS_CHAN_DEFINE(processed_data_chan, struct sensor_msg, NULL, NULL, ZBUS_OBSERVERS(consumer_sub),
16 		 ZBUS_MSG_INIT(.x = 0, .y = 0, .z = 0));
17 
18 ZBUS_CHAN_DECLARE(raw_data_chan, state_chan);
19 
filter_callback(const struct zbus_channel * chan)20 static void filter_callback(const struct zbus_channel *chan)
21 {
22 	const struct sensor_msg *msg = zbus_chan_const_msg(chan);
23 	struct sensor_msg proc_msg = {0};
24 
25 	if (0 == (msg->x % 2)) {
26 		proc_msg.x = msg->x;
27 	}
28 	if (0 == (msg->y % 2)) {
29 		proc_msg.y = msg->y;
30 	}
31 	if (0 == (msg->z % 2)) {
32 		proc_msg.z = msg->z;
33 	}
34 	LOG_INF(" -|- Filtering data");
35 	zbus_chan_pub(&processed_data_chan, &proc_msg, K_MSEC(200));
36 }
37 
38 ZBUS_LISTENER_DEFINE(filter_lis, filter_callback);
39 
40 ZBUS_SUBSCRIBER_DEFINE(state_change_sub, 5);
41 
main(void)42 int main(void)
43 {
44 	LOG_INF("System started");
45 
46 	const struct zbus_channel *chan;
47 
48 	while (1) {
49 		LOG_INF("Activating filter");
50 		zbus_chan_add_obs(&raw_data_chan, &filter_lis, K_MSEC(200));
51 
52 		zbus_sub_wait(&state_change_sub, &chan, K_FOREVER);
53 
54 		LOG_INF("Deactivating filter");
55 		zbus_chan_rm_obs(&raw_data_chan, &filter_lis, K_MSEC(200));
56 
57 		LOG_INF("Bypass filter");
58 		zbus_chan_add_obs(&raw_data_chan, &consumer_sub, K_MSEC(200));
59 
60 		zbus_sub_wait(&state_change_sub, &chan, K_FOREVER);
61 
62 		LOG_INF("Disable bypass filter");
63 		zbus_chan_rm_obs(&raw_data_chan, &consumer_sub, K_MSEC(200));
64 
65 		zbus_sub_wait(&state_change_sub, &chan, K_FOREVER);
66 	}
67 	return 0;
68 }
69