zephyr/samples/subsys/zbus/remote_mock
..
boards
src
CMakeLists.txt
README.rst
prj.conf
remote_mock.py
sample.yaml

README.rst

.. zephyr:code-sample:: zbus-remote-mock
   :name: Remote mock sample
   :relevant-api: zbus_apis

   Publish to a zbus instance using UART as a bridge.

Overview
********

This application demonstrates how a host script can publish to the zbus in an embedded device using the UART as a bridge.
The device sends information to the script running on a computer host. Then, the script sends back information when it would simulate a publish to some channel. Finally, the script decodes the data exchanged and prints it to the stdout.

With this approach, developers can implement tests using any language on a computer to talk directly via channels with threads running on a device. Furthermore, it gives the tests more controllability and observability since we can control and access what is sent and received by the script.

Building and Running
********************

This project outputs to the console. It can be built and executed
on :ref:`native_sim <native_sim>` as follows:

.. zephyr-app-commands::
   :zephyr-app: samples/subsys/zbus/remote_mock
   :host-os: unix
   :board: native_sim
   :goals: run

Sample Output
=============

.. code-block:: console

    -- west build: running target run
    [0/1] cd /.../zephyr/build/zephyr/zephyr.exe
    uart_1 connected to pseudotty: /dev/pts/2
    uart connected to pseudotty: /dev/pts/3
    *** Booting Zephyr OS build zephyr-v3.1.0 ***
    D: [Mock Proxy] Started.
    D: [Mock Proxy RX] Started.
    D: [Mock Proxy RX] Found sentence
    D: Channel start_measurement claimed
    D: Channel start_measurement finished
    D: Publishing channel start_measurement
    D: START processing channel start_measurement change
    D: Channel start_measurement claimed
    D: discard loopback event (channel start_measurement)
    D: Channel start_measurement finished
    D: FINISH processing channel start_measurement change
    D: START processing channel sensor_data change
    D: Channel sensor_data claimed
    D: sending message to host (channel sensor_data)
    D: Channel sensor_data finished
    D: FINISH processing channel sensor_data change
    D: sending sensor data err = 0

    <repeats endlessly>

Exit execution by pressing :kbd:`CTRL+C`.

The :file:`remote_mock.py` script can be executed using the following command:

.. code-block:: bash

    python3.8 samples/subsys/zbus/remote_mock/remote_mock.py /dev/pts/2


Note the run command above prints the value of pts port because it is running in
:ref:`native_sim <native_sim>`.
Look at the line indicating ``uart_1 connected to pseudotty: /dev/pts/2``.
It can be different in your case. If you are using a board, read the documentation to get the
correct port destination (in Linux is something like ``/dev/tty...`` or in Windows ``COM...``).

From the remote mock (Python script), you would see something like this:

.. code-block:: shell

    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 1
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 2
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 3
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 4
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 5
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 6
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 7
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 8
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 9
    Proxy PUB [start_measurement] -> start measurement
    Proxy NOTIFY: [sensor_data] -> sensor value 10

    <continues>

Exit the remote mock script by pressing :kbd:`CTRL+C`.