xref: /aosp_15_r20/external/pigweed/pw_hdlc/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker.. rst-class:: with-subtitle
4*61c4878aSAndroid Build Coastguard Worker
5*61c4878aSAndroid Build Coastguard Worker=======
6*61c4878aSAndroid Build Coastguard Workerpw_hdlc
7*61c4878aSAndroid Build Coastguard Worker=======
8*61c4878aSAndroid Build Coastguard Worker.. pigweed-module::
9*61c4878aSAndroid Build Coastguard Worker   :name: pw_hdlc
10*61c4878aSAndroid Build Coastguard Worker
11*61c4878aSAndroid Build Coastguard Worker   - **Simple**: Transmit RPCs and other data between devices over serial
12*61c4878aSAndroid Build Coastguard Worker   - **Robust**: Detect corruption and data loss
13*61c4878aSAndroid Build Coastguard Worker   - **Efficient**: Stream to transport without buffering
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker.. include:: design.rst
16*61c4878aSAndroid Build Coastguard Worker   :start-after: .. pw_hdlc-overview-start
17*61c4878aSAndroid Build Coastguard Worker   :end-before: .. pw_hdlc-overview-end
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard WorkerEncoding looks like this:
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-encoding-example-start
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker.. tab-set::
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: C++
26*61c4878aSAndroid Build Coastguard Worker      :sync: cpp
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Worker      .. code-block:: cpp
29*61c4878aSAndroid Build Coastguard Worker
30*61c4878aSAndroid Build Coastguard Worker         // Writes a span of data to a pw::stream::Writer and returns the status. This
31*61c4878aSAndroid Build Coastguard Worker         // implementation uses the pw_checksum module to compute the CRC-32 frame check
32*61c4878aSAndroid Build Coastguard Worker         // sequence.
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker         #include "pw_hdlc/encoder.h"
35*61c4878aSAndroid Build Coastguard Worker         #include "pw_hdlc/sys_io_stream.h"
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker         int main() {
38*61c4878aSAndroid Build Coastguard Worker           pw::stream::SysIoWriter serial_writer;
39*61c4878aSAndroid Build Coastguard Worker           Status status = pw::hdlc::WriteUIFrame(123 /* address */, data, serial_writer);
40*61c4878aSAndroid Build Coastguard Worker           if (!status.ok()) {
41*61c4878aSAndroid Build Coastguard Worker             PW_LOG_INFO("Writing frame failed! %s", status.str());
42*61c4878aSAndroid Build Coastguard Worker           }
43*61c4878aSAndroid Build Coastguard Worker         }
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: Python
46*61c4878aSAndroid Build Coastguard Worker      :sync: py
47*61c4878aSAndroid Build Coastguard Worker
48*61c4878aSAndroid Build Coastguard Worker      .. code-block:: python
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker         # Read bytes from serial and encode HDLC frames
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker         import serial
53*61c4878aSAndroid Build Coastguard Worker         from pw_hdlc import encode
54*61c4878aSAndroid Build Coastguard Worker
55*61c4878aSAndroid Build Coastguard Worker         ser = serial.Serial()
56*61c4878aSAndroid Build Coastguard Worker         address = 123
57*61c4878aSAndroid Build Coastguard Worker         ser.write(encode.ui_frame(address, b'your data here!'))
58*61c4878aSAndroid Build Coastguard Worker
59*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-encoding-example-end
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard WorkerAnd decoding looks like this:
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-decoding-example-start
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard Worker.. tab-set::
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: C++
68*61c4878aSAndroid Build Coastguard Worker      :sync: cpp
69*61c4878aSAndroid Build Coastguard Worker
70*61c4878aSAndroid Build Coastguard Worker      .. code-block:: cpp
71*61c4878aSAndroid Build Coastguard Worker
72*61c4878aSAndroid Build Coastguard Worker         // Read individual bytes from pw::sys_io and decode HDLC frames.
73*61c4878aSAndroid Build Coastguard Worker
74*61c4878aSAndroid Build Coastguard Worker         #include "pw_hdlc/decoder.h"
75*61c4878aSAndroid Build Coastguard Worker         #include "pw_sys_io/sys_io.h"
76*61c4878aSAndroid Build Coastguard Worker
77*61c4878aSAndroid Build Coastguard Worker         int main() {
78*61c4878aSAndroid Build Coastguard Worker           std::byte data;
79*61c4878aSAndroid Build Coastguard Worker           std::array<std::byte, 128> decode_buffer;
80*61c4878aSAndroid Build Coastguard Worker           pw::hdlc::Decoder decoder(decode_buffer);
81*61c4878aSAndroid Build Coastguard Worker           while (true) {
82*61c4878aSAndroid Build Coastguard Worker             if (!pw::sys_io::ReadByte(&data).ok()) {
83*61c4878aSAndroid Build Coastguard Worker               // Log serial reading error
84*61c4878aSAndroid Build Coastguard Worker             }
85*61c4878aSAndroid Build Coastguard Worker             Result<Frame> decoded_frame = decoder.Process(data);
86*61c4878aSAndroid Build Coastguard Worker
87*61c4878aSAndroid Build Coastguard Worker             if (decoded_frame.ok()) {
88*61c4878aSAndroid Build Coastguard Worker               // Handle the decoded frame
89*61c4878aSAndroid Build Coastguard Worker             }
90*61c4878aSAndroid Build Coastguard Worker           }
91*61c4878aSAndroid Build Coastguard Worker         }
92*61c4878aSAndroid Build Coastguard Worker
93*61c4878aSAndroid Build Coastguard Worker   .. tab-item:: Python
94*61c4878aSAndroid Build Coastguard Worker      :sync: py
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard Worker      .. code-block:: python
97*61c4878aSAndroid Build Coastguard Worker
98*61c4878aSAndroid Build Coastguard Worker         # Decode data read from serial
99*61c4878aSAndroid Build Coastguard Worker
100*61c4878aSAndroid Build Coastguard Worker         import serial
101*61c4878aSAndroid Build Coastguard Worker         from pw_hdlc import decode
102*61c4878aSAndroid Build Coastguard Worker
103*61c4878aSAndroid Build Coastguard Worker         ser = serial.Serial()
104*61c4878aSAndroid Build Coastguard Worker         decoder = decode.FrameDecoder()
105*61c4878aSAndroid Build Coastguard Worker
106*61c4878aSAndroid Build Coastguard Worker         while True:
107*61c4878aSAndroid Build Coastguard Worker             for frame in decoder.process_valid_frames(ser.read()):
108*61c4878aSAndroid Build Coastguard Worker                 # Handle the decoded frame
109*61c4878aSAndroid Build Coastguard Worker
110*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-decoding-example-end
111*61c4878aSAndroid Build Coastguard Worker
112*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-nav-start
113*61c4878aSAndroid Build Coastguard Worker
114*61c4878aSAndroid Build Coastguard Worker.. grid:: 1
115*61c4878aSAndroid Build Coastguard Worker
116*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`rocket` Get started & guides
117*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_hdlc-guide
118*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
119*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-primary
120*61c4878aSAndroid Build Coastguard Worker
121*61c4878aSAndroid Build Coastguard Worker      How to set up and use ``pw_hdlc``
122*61c4878aSAndroid Build Coastguard Worker
123*61c4878aSAndroid Build Coastguard Worker.. grid:: 2
124*61c4878aSAndroid Build Coastguard Worker
125*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`code-square` API reference
126*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_hdlc-api
127*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
128*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard Worker      Reference details about the ``pw_hdlc`` API
131*61c4878aSAndroid Build Coastguard Worker
132*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`stack` Design
133*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_hdlc-design
134*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
135*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
136*61c4878aSAndroid Build Coastguard Worker
137*61c4878aSAndroid Build Coastguard Worker      Design details about ``pw_hdlc``
138*61c4878aSAndroid Build Coastguard Worker
139*61c4878aSAndroid Build Coastguard Worker.. grid:: 2
140*61c4878aSAndroid Build Coastguard Worker
141*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`graph` Code size analysis
142*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_hdlc-size
143*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
144*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
145*61c4878aSAndroid Build Coastguard Worker
146*61c4878aSAndroid Build Coastguard Worker      The code size impact of ``pw_hdlc``
147*61c4878aSAndroid Build Coastguard Worker
148*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`list-ordered` RPC over HDLC example
149*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_hdlc-rpc-example
150*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
151*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
152*61c4878aSAndroid Build Coastguard Worker
153*61c4878aSAndroid Build Coastguard Worker      A step-by-step example of sending RPCs over HDLC
154*61c4878aSAndroid Build Coastguard Worker
155*61c4878aSAndroid Build Coastguard Worker.. grid:: 1
156*61c4878aSAndroid Build Coastguard Worker
157*61c4878aSAndroid Build Coastguard Worker   .. grid-item-card:: :octicon:`workflow` Experimental async router
158*61c4878aSAndroid Build Coastguard Worker      :link: module-pw_hdlc-router
159*61c4878aSAndroid Build Coastguard Worker      :link-type: ref
160*61c4878aSAndroid Build Coastguard Worker      :class-item: sales-pitch-cta-secondary
161*61c4878aSAndroid Build Coastguard Worker
162*61c4878aSAndroid Build Coastguard Worker      An experimental asynchronous HDLC router using ``pw_channel``
163*61c4878aSAndroid Build Coastguard Worker
164*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-nav-end
165*61c4878aSAndroid Build Coastguard Worker
166*61c4878aSAndroid Build Coastguard Worker.. toctree::
167*61c4878aSAndroid Build Coastguard Worker   :maxdepth: 1
168*61c4878aSAndroid Build Coastguard Worker   :hidden:
169*61c4878aSAndroid Build Coastguard Worker
170*61c4878aSAndroid Build Coastguard Worker   guide
171*61c4878aSAndroid Build Coastguard Worker   api
172*61c4878aSAndroid Build Coastguard Worker   design
173*61c4878aSAndroid Build Coastguard Worker   size
174*61c4878aSAndroid Build Coastguard Worker   rpc_example/docs
175*61c4878aSAndroid Build Coastguard Worker   router
176*61c4878aSAndroid Build Coastguard Worker   Source code <https://cs.opensource.google/pigweed/pigweed/+/main:pw_hdlc/>
177