You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.1 KiB
135 lines
4.1 KiB
.. _module-pw_hdlc-rpc-example:
|
|
|
|
=============================
|
|
RPC over HDLC example project
|
|
=============================
|
|
The :ref:`module-pw_hdlc` module includes an example of bringing up a
|
|
:ref:`module-pw_rpc` server that can be used to invoke RPCs. The example code
|
|
is located at ``pw_hdlc/rpc_example``. This section walks through invoking RPCs
|
|
interactively and with a script using the RPC over HDLC example.
|
|
|
|
These instructions assume the STM32F429i Discovery board, but they work with
|
|
any target with :ref:`pw::sys_io <module-pw_sys_io>` implemented.
|
|
|
|
---------------------
|
|
Getting started guide
|
|
---------------------
|
|
|
|
1. Set up your board
|
|
====================
|
|
Connect the board you'll be communicating with. For the Discovery board, connect
|
|
the mini USB port, and note which serial device it appears as (e.g.
|
|
``/dev/ttyACM0``).
|
|
|
|
2. Build Pigweed
|
|
================
|
|
Activate the Pigweed environment and run the default build.
|
|
|
|
.. code-block:: sh
|
|
|
|
source activate.sh
|
|
gn gen out
|
|
ninja -C out
|
|
|
|
3. Flash the firmware image
|
|
===========================
|
|
After a successful build, the binary for the example will be located at
|
|
``out/<toolchain>/obj/pw_hdlc/rpc_example/bin/rpc_example.elf``.
|
|
|
|
Flash this image to your board. If you are using the STM32F429i Discovery Board,
|
|
you can flash the image with `OpenOCD <http://openocd.org>`_.
|
|
|
|
.. code-block:: sh
|
|
|
|
openocd -f targets/stm32f429i-disc1/py/stm32f429i_disc1_utils/openocd_stm32f4xx.cfg \
|
|
-c "program out/stm32f429i_disc1_debug/obj/pw_hdlc/rpc_example/bin/rpc_example.elf"
|
|
|
|
4. Invoke RPCs from in an interactive console
|
|
=============================================
|
|
The RPC console uses `IPython <https://ipython.org>`_ to make a rich interactive
|
|
console for working with pw_rpc. Run the RPC console with the following command,
|
|
replacing ``/dev/ttyACM0`` with the correct serial device for your board.
|
|
|
|
.. code-block:: text
|
|
|
|
$ python -m pw_hdlc.rpc_console --device /dev/ttyACM0
|
|
|
|
Console for interacting with pw_rpc over HDLC.
|
|
|
|
To start the console, provide a serial port as the --device argument and paths
|
|
or globs for .proto files that define the RPC services to support:
|
|
|
|
python -m pw_hdlc.rpc_console --device /dev/ttyUSB0 sample.proto
|
|
|
|
This starts an IPython console for communicating with the connected device. A
|
|
few variables are predefined in the interactive console. These include:
|
|
|
|
rpcs - used to invoke RPCs
|
|
device - the serial device used for communication
|
|
client - the pw_rpc.Client
|
|
|
|
An example echo RPC command:
|
|
|
|
rpcs.pw.rpc.EchoService.Echo(msg="hello!")
|
|
|
|
In [1]:
|
|
|
|
RPCs may be accessed through the predefined ``rpcs`` variable. RPCs are
|
|
organized by their protocol buffer package and RPC service, as defined in a
|
|
.proto file. To call the ``Echo`` method is part of the ``EchoService``, which
|
|
is in the ``pw.rpc`` package. To invoke it synchronously, call
|
|
``rpcs.pw.rpc.EchoService.Echo``:
|
|
|
|
.. code-block:: python
|
|
|
|
In [1]: rpcs.pw.rpc.EchoService.Echo(msg="Your message here!")
|
|
Out[1]: (<Status.OK: 0>, msg: "Your message here!")
|
|
|
|
5. Invoke RPCs with a script
|
|
============================
|
|
RPCs may also be invoked from Python scripts. Close the RPC console if it is
|
|
running, and execute the example script. Set the --device argument to the
|
|
serial port for your device.
|
|
|
|
.. code-block:: text
|
|
|
|
$ pw_hdlc/rpc_example/example_script.py --device /dev/ttyACM0
|
|
The status was Status.OK
|
|
The payload was msg: "Hello"
|
|
|
|
The device says: Goodbye!
|
|
|
|
-------------------------
|
|
Local RPC example project
|
|
-------------------------
|
|
|
|
This example is similar to the above example, except it use socket to
|
|
connect server and client running on the host.
|
|
|
|
1. Build Pigweed
|
|
================
|
|
Activate the Pigweed environment and build the code.
|
|
|
|
.. code-block:: sh
|
|
|
|
source activate.sh
|
|
gn gen out
|
|
pw watch
|
|
|
|
2. Start client side and server side
|
|
====================================
|
|
|
|
Run pw_rpc client (i.e. use echo.proto)
|
|
|
|
.. code-block:: sh
|
|
|
|
python -m pw_hdlc.rpc_console path/to/echo.proto -s localhost:33000
|
|
|
|
Run pw_rpc server
|
|
|
|
.. code-block:: sh
|
|
|
|
out/host_clang_debug/obj/pw_hdlc/rpc_example/bin/rpc_example
|
|
|
|
Then you can invoke RPCs from the interactive console on the client side.
|