1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-guide: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker==================== 4*61c4878aSAndroid Build Coastguard WorkerGet started & guides 5*61c4878aSAndroid Build Coastguard Worker==================== 6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage:: 7*61c4878aSAndroid Build Coastguard Worker :name: pw_hdlc 8*61c4878aSAndroid Build Coastguard Worker 9*61c4878aSAndroid Build Coastguard Worker.. include:: design.rst 10*61c4878aSAndroid Build Coastguard Worker :start-after: .. pw_hdlc-overview-start 11*61c4878aSAndroid Build Coastguard Worker :end-before: .. pw_hdlc-overview-end 12*61c4878aSAndroid Build Coastguard Worker 13*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-getstarted: 14*61c4878aSAndroid Build Coastguard Worker 15*61c4878aSAndroid Build Coastguard Worker------------------------ 16*61c4878aSAndroid Build Coastguard WorkerGet started with pw_hdlc 17*61c4878aSAndroid Build Coastguard Worker------------------------ 18*61c4878aSAndroid Build Coastguard WorkerDepend on the library: 19*61c4878aSAndroid Build Coastguard Worker 20*61c4878aSAndroid Build Coastguard Worker.. tab-set:: 21*61c4878aSAndroid Build Coastguard Worker 22*61c4878aSAndroid Build Coastguard Worker .. tab-item:: Bazel 23*61c4878aSAndroid Build Coastguard Worker :sync: bazel 24*61c4878aSAndroid Build Coastguard Worker 25*61c4878aSAndroid Build Coastguard Worker Add ``@pigweed//pw_hdlc`` to the ``deps`` list in your Bazel target: 26*61c4878aSAndroid Build Coastguard Worker 27*61c4878aSAndroid Build Coastguard Worker .. code-block:: 28*61c4878aSAndroid Build Coastguard Worker 29*61c4878aSAndroid Build Coastguard Worker cc_library("...") { 30*61c4878aSAndroid Build Coastguard Worker # ... 31*61c4878aSAndroid Build Coastguard Worker deps = [ 32*61c4878aSAndroid Build Coastguard Worker # ... 33*61c4878aSAndroid Build Coastguard Worker "@pigweed//pw_hdlc", 34*61c4878aSAndroid Build Coastguard Worker # ... 35*61c4878aSAndroid Build Coastguard Worker ] 36*61c4878aSAndroid Build Coastguard Worker } 37*61c4878aSAndroid Build Coastguard Worker 38*61c4878aSAndroid Build Coastguard Worker This assumes that your Bazel ``WORKSPACE`` has a `repository 39*61c4878aSAndroid Build Coastguard Worker <https://bazel.build/concepts/build-ref#repositories>`_ named ``@pigweed`` 40*61c4878aSAndroid Build Coastguard Worker that points to the upstream Pigweed repository. 41*61c4878aSAndroid Build Coastguard Worker 42*61c4878aSAndroid Build Coastguard Worker .. tab-item:: GN 43*61c4878aSAndroid Build Coastguard Worker :sync: gn 44*61c4878aSAndroid Build Coastguard Worker 45*61c4878aSAndroid Build Coastguard Worker Add ``$dir_pw_hdlc`` to the ``deps`` list in your ``pw_executable()`` 46*61c4878aSAndroid Build Coastguard Worker build target: 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Worker .. code-block:: 49*61c4878aSAndroid Build Coastguard Worker 50*61c4878aSAndroid Build Coastguard Worker pw_executable("...") { 51*61c4878aSAndroid Build Coastguard Worker # ... 52*61c4878aSAndroid Build Coastguard Worker deps = [ 53*61c4878aSAndroid Build Coastguard Worker # ... 54*61c4878aSAndroid Build Coastguard Worker "$dir_pw_hdlc", 55*61c4878aSAndroid Build Coastguard Worker # ... 56*61c4878aSAndroid Build Coastguard Worker ] 57*61c4878aSAndroid Build Coastguard Worker } 58*61c4878aSAndroid Build Coastguard Worker 59*61c4878aSAndroid Build Coastguard Worker 60*61c4878aSAndroid Build Coastguard Worker .. tab-item:: CMake 61*61c4878aSAndroid Build Coastguard Worker :sync: cmake 62*61c4878aSAndroid Build Coastguard Worker 63*61c4878aSAndroid Build Coastguard Worker Add ``pw_hdlc`` to your ``pw_add_library`` or similar CMake target: 64*61c4878aSAndroid Build Coastguard Worker 65*61c4878aSAndroid Build Coastguard Worker .. code-block:: 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker pw_add_library(my_library STATIC 68*61c4878aSAndroid Build Coastguard Worker HEADERS 69*61c4878aSAndroid Build Coastguard Worker # ... 70*61c4878aSAndroid Build Coastguard Worker PRIVATE_DEPS 71*61c4878aSAndroid Build Coastguard Worker # ... 72*61c4878aSAndroid Build Coastguard Worker pw_hdlc 73*61c4878aSAndroid Build Coastguard Worker # ... 74*61c4878aSAndroid Build Coastguard Worker ) 75*61c4878aSAndroid Build Coastguard Worker 76*61c4878aSAndroid Build Coastguard Worker .. tab-item:: Zephyr 77*61c4878aSAndroid Build Coastguard Worker :sync: zephyr 78*61c4878aSAndroid Build Coastguard Worker 79*61c4878aSAndroid Build Coastguard Worker There are two ways to use ``pw_hdlc`` from a Zephyr project: 80*61c4878aSAndroid Build Coastguard Worker 81*61c4878aSAndroid Build Coastguard Worker * (Recommended) Depend on ``pw_hdlc`` in your CMake target. See the CMake 82*61c4878aSAndroid Build Coastguard Worker tab. The Pigweed team recommends this approach because it enables 83*61c4878aSAndroid Build Coastguard Worker precise CMake dependency analysis. 84*61c4878aSAndroid Build Coastguard Worker 85*61c4878aSAndroid Build Coastguard Worker * Add ``CONFIG_PIGWEED_HDLC=y`` to your Zephyr project's configuration. 86*61c4878aSAndroid Build Coastguard Worker Also add ``CONFIG_PIGWEED_HDLC_RPC=y`` if using RPC. Although this is 87*61c4878aSAndroid Build Coastguard Worker the typical Zephyr solution, the Pigweed team doesn't recommend this 88*61c4878aSAndroid Build Coastguard Worker approach because it makes ``pw_hdlc`` a global dependency and exposes 89*61c4878aSAndroid Build Coastguard Worker its includes to all targets. 90*61c4878aSAndroid Build Coastguard Worker 91*61c4878aSAndroid Build Coastguard WorkerAnd then :ref:`encode <module-pw_hdlc-guide-encode>` and 92*61c4878aSAndroid Build Coastguard Worker:ref:`decode <module-pw_hdlc-guide-decode>` some data! 93*61c4878aSAndroid Build Coastguard Worker 94*61c4878aSAndroid Build Coastguard WorkerSet up RPC over HDLC 95*61c4878aSAndroid Build Coastguard Worker==================== 96*61c4878aSAndroid Build Coastguard WorkerSee :ref:`module-pw_hdlc-rpc-example`. 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-guide-encode: 99*61c4878aSAndroid Build Coastguard Worker 100*61c4878aSAndroid Build Coastguard Worker-------- 101*61c4878aSAndroid Build Coastguard WorkerEncoding 102*61c4878aSAndroid Build Coastguard Worker-------- 103*61c4878aSAndroid Build Coastguard Worker.. include:: docs.rst 104*61c4878aSAndroid Build Coastguard Worker :start-after: .. pw_hdlc-encoding-example-start 105*61c4878aSAndroid Build Coastguard Worker :end-before: .. pw_hdlc-encoding-example-end 106*61c4878aSAndroid Build Coastguard Worker 107*61c4878aSAndroid Build Coastguard WorkerAllocating buffers when encoding 108*61c4878aSAndroid Build Coastguard Worker================================ 109*61c4878aSAndroid Build Coastguard Worker.. tab-set:: 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard Worker .. tab-item:: C++ 112*61c4878aSAndroid Build Coastguard Worker :sync: cpp 113*61c4878aSAndroid Build Coastguard Worker 114*61c4878aSAndroid Build Coastguard Worker HDLC encoding overhead changes depending on the payload size and the 115*61c4878aSAndroid Build Coastguard Worker nature of the data being encoded. ``pw_hdlc`` provides helper functions 116*61c4878aSAndroid Build Coastguard Worker for determining the size of buffers. The helper functions provide 117*61c4878aSAndroid Build Coastguard Worker worst-case sizes of frames given a certain payload size and vice-versa. 118*61c4878aSAndroid Build Coastguard Worker 119*61c4878aSAndroid Build Coastguard Worker .. code-block:: cpp 120*61c4878aSAndroid Build Coastguard Worker 121*61c4878aSAndroid Build Coastguard Worker #include "pw_assert/check.h" 122*61c4878aSAndroid Build Coastguard Worker #include "pw_bytes/span.h" 123*61c4878aSAndroid Build Coastguard Worker #include "pw_hdlc/encoder" 124*61c4878aSAndroid Build Coastguard Worker #include "pw_hdlc/encoded_size.h" 125*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status.h" 126*61c4878aSAndroid Build Coastguard Worker 127*61c4878aSAndroid Build Coastguard Worker // The max on-the-wire size in bytes of a single HDLC frame after encoding. 128*61c4878aSAndroid Build Coastguard Worker constexpr size_t kMtu = 512; 129*61c4878aSAndroid Build Coastguard Worker constexpr size_t kRpcEncodeBufferSize = pw::hdlc::MaxSafePayloadSize(kMtu); 130*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, kRpcEncodeBufferSize> rpc_encode_buffer; 131*61c4878aSAndroid Build Coastguard Worker 132*61c4878aSAndroid Build Coastguard Worker // Any data encoded to this buffer is guaranteed to fit in the MTU after 133*61c4878aSAndroid Build Coastguard Worker // HDLC encoding. 134*61c4878aSAndroid Build Coastguard Worker pw::ConstByteSpan GetRpcEncodeBuffer() { 135*61c4878aSAndroid Build Coastguard Worker return rpc_encode_buffer; 136*61c4878aSAndroid Build Coastguard Worker } 137*61c4878aSAndroid Build Coastguard Worker 138*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc-guide-decode: 139*61c4878aSAndroid Build Coastguard Worker 140*61c4878aSAndroid Build Coastguard Worker-------- 141*61c4878aSAndroid Build Coastguard WorkerDecoding 142*61c4878aSAndroid Build Coastguard Worker-------- 143*61c4878aSAndroid Build Coastguard Worker.. include:: docs.rst 144*61c4878aSAndroid Build Coastguard Worker :start-after: .. pw_hdlc-decoding-example-start 145*61c4878aSAndroid Build Coastguard Worker :end-before: .. pw_hdlc-decoding-example-end 146*61c4878aSAndroid Build Coastguard Worker 147*61c4878aSAndroid Build Coastguard Worker 148*61c4878aSAndroid Build Coastguard WorkerAllocating buffers when decoding 149*61c4878aSAndroid Build Coastguard Worker================================ 150*61c4878aSAndroid Build Coastguard Worker.. tab-set:: 151*61c4878aSAndroid Build Coastguard Worker 152*61c4878aSAndroid Build Coastguard Worker .. tab-item:: C++ 153*61c4878aSAndroid Build Coastguard Worker :sync: cpp 154*61c4878aSAndroid Build Coastguard Worker 155*61c4878aSAndroid Build Coastguard Worker ``pw::hdlc::Decoder`` is a helper for allocating a buffer. It has slightly 156*61c4878aSAndroid Build Coastguard Worker lower overhead because it doesn't need to decode the entire escaped 157*61c4878aSAndroid Build Coastguard Worker frame in-memory. 158*61c4878aSAndroid Build Coastguard Worker 159*61c4878aSAndroid Build Coastguard Worker .. code-block:: cpp 160*61c4878aSAndroid Build Coastguard Worker 161*61c4878aSAndroid Build Coastguard Worker #include "pw_hdlc/decoder.h" 162*61c4878aSAndroid Build Coastguard Worker 163*61c4878aSAndroid Build Coastguard Worker // The max on-the-wire size in bytes of a single HDLC frame after encoding. 164*61c4878aSAndroid Build Coastguard Worker constexpr size_t kMtu = 512; 165*61c4878aSAndroid Build Coastguard Worker 166*61c4878aSAndroid Build Coastguard Worker // Create a decoder given the MTU constraint. 167*61c4878aSAndroid Build Coastguard Worker constexpr size_t kDecoderBufferSize = 168*61c4878aSAndroid Build Coastguard Worker pw::hdlc::Decoder::RequiredBufferSizeForFrameSize(kMtu); 169*61c4878aSAndroid Build Coastguard Worker pw::hdlc::DecoderBuffer<kDecoderBufferSize> decoder; 170*61c4878aSAndroid Build Coastguard Worker 171*61c4878aSAndroid Build Coastguard Worker----------------- 172*61c4878aSAndroid Build Coastguard WorkerMore pw_hdlc docs 173*61c4878aSAndroid Build Coastguard Worker----------------- 174*61c4878aSAndroid Build Coastguard Worker.. include:: docs.rst 175*61c4878aSAndroid Build Coastguard Worker :start-after: .. pw_hdlc-nav-start 176*61c4878aSAndroid Build Coastguard Worker :end-before: .. pw_hdlc-nav-end 177