1 #include <stdio.h>
2 #include <pb_encode.h>
3 #include <pb_decode.h>
4 #include "simple.pb.h"
5
main()6 int main()
7 {
8 /* This is the buffer where we will store our message. */
9 uint8_t buffer[128];
10 size_t message_length;
11 bool status;
12
13 /* Encode our message */
14 {
15 /* Allocate space on the stack to store the message data.
16 *
17 * Nanopb generates simple struct definitions for all the messages.
18 * - check out the contents of simple.pb.h!
19 * It is a good idea to always initialize your structures
20 * so that you do not have garbage data from RAM in there.
21 */
22 SimpleMessage message = SimpleMessage_init_zero;
23
24 /* Create a stream that will write to our buffer. */
25 pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
26
27 /* Fill in the lucky number */
28 message.lucky_number = 13;
29
30 /* Now we are ready to encode the message! */
31 status = pb_encode(&stream, SimpleMessage_fields, &message);
32 message_length = stream.bytes_written;
33
34 /* Then just check for any errors.. */
35 if (!status)
36 {
37 printf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
38 return 1;
39 }
40 }
41
42 /* Now we could transmit the message over network, store it in a file or
43 * wrap it to a pigeon's leg.
44 */
45
46 /* But because we are lazy, we will just decode it immediately. */
47
48 {
49 /* Allocate space for the decoded message. */
50 SimpleMessage message = SimpleMessage_init_zero;
51
52 /* Create a stream that reads from the buffer. */
53 pb_istream_t stream = pb_istream_from_buffer(buffer, message_length);
54
55 /* Now we are ready to decode the message. */
56 status = pb_decode(&stream, SimpleMessage_fields, &message);
57
58 /* Check for errors... */
59 if (!status)
60 {
61 printf("Decoding failed: %s\n", PB_GET_ERROR(&stream));
62 return 1;
63 }
64
65 /* Print the data contained in the message. */
66 printf("Your lucky number was %d!\n", (int)message.lucky_number);
67 }
68
69 return 0;
70 }
71
72