diff options
Diffstat (limited to 'docs/encoding.rst')
-rw-r--r-- | docs/encoding.rst | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/docs/encoding.rst b/docs/encoding.rst new file mode 100644 index 00000000..e4e0cd7f --- /dev/null +++ b/docs/encoding.rst @@ -0,0 +1,39 @@ +========================= +Nanopb: Encoding messages +========================= + +The basic way to encode messages is to: + +1) Write a callback function for whatever stream you want to write the message to. +2) Fill a structure with your data. +3) Call pb_encode with the stream, a pointer to *const pb_field_t* array and a pointer to your structure. + +A few extra steps are necessary if you need to know the size of the message beforehand, or if you have dynamically sized fields. + +Output streams +============== + +This is the contents of *pb_ostream_t* structure:: + + typedef struct _pb_ostream_t pb_ostream_t; + struct _pb_ostream_t + { + bool (*callback)(pb_ostream_t *stream, const uint8_t *buf, size_t count); + void *state; + size_t max_size; + size_t bytes_written; + }; + +This, combined with the pb_write function, provides a light-weight abstraction +for whatever destination you want to write data to. + +*callback* should be a pointer to your callback function. These are the rules for it: + +1) Return false on IO errors. This will cause encoding to abort. + * + * 2) You can use state to store your own data (e.g. buffer pointer). + * + * 3) pb_write will update bytes_written after your callback runs. + * + * 4) Substreams will modify max_size and bytes_written. Don't use them to + * calculate any pointers.
\ No newline at end of file |