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