diff options
| author | Bright Pan <[email protected]> | 2015-03-10 18:07:33 +0800 |
|---|---|---|
| committer | Bright Pan <[email protected]> | 2015-03-10 18:24:17 +0800 |
| commit | a61d228b764baa422ad39dc14f91e80f225369df (patch) | |
| tree | 2799cb8e13517f6c65acea34f71dfef8519defb1 /examples | |
| parent | 0b5958d7006faf711fcf7fe33a4992bfb588aeee (diff) | |
Nanopb is a plain-C implementation of Google's Protocol Buffers data
format. It is targeted at 32 bit microcontrollers, but is also fit for
other embedded systems with tight (2-10 kB ROM, <1 kB RAM) memory
constraints.(http://koti.kapsi.fi/jpa/nanopb/)
How to use the example:
1. move examples/nanopb to bsp/xxxx/
2. enable macro RT_USING_NANOPB in rtconfig.h
3. regenerate the project file (scons --target=xxxx)
4. rebuild the project
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/nanopb/SConscript | 13 | ||||
| -rw-r--r-- | examples/nanopb/simple.c | 73 | ||||
| -rw-r--r-- | examples/nanopb/simple.options | 1 | ||||
| -rw-r--r-- | examples/nanopb/simple.pb.c | 18 | ||||
| -rw-r--r-- | examples/nanopb/simple.pb.h | 45 | ||||
| -rw-r--r-- | examples/nanopb/simple.proto | 10 |
6 files changed, 160 insertions, 0 deletions
diff --git a/examples/nanopb/SConscript b/examples/nanopb/SConscript new file mode 100644 index 0000000000..7c8bce9f26 --- /dev/null +++ b/examples/nanopb/SConscript @@ -0,0 +1,13 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +src = Split(''' +simple.c +simple.pb.c +''') +CPPPATH = [RTT_ROOT + '/examples/nanopb'] + +group = DefineGroup('Nanopb_test', src, depend = ['RT_USING_NANOPB'], CPPPATH = CPPPATH) + +Return('group')
\ No newline at end of file diff --git a/examples/nanopb/simple.c b/examples/nanopb/simple.c new file mode 100644 index 0000000000..2b793c014f --- /dev/null +++ b/examples/nanopb/simple.c @@ -0,0 +1,73 @@ +#include <rthw.h> +#include <stm32f10x.h> +#include <pb_encode.h> +#include <pb_decode.h> +#include "simple.pb.h" + +int nanopb_test() +{ + /* This is the buffer where we will store our message. */ + uint8_t buffer[128]; + size_t message_length; + bool status; + + /* Encode our message */ + { + /* Allocate space on the stack to store the message data. + * + * Nanopb generates simple struct definitions for all the messages. + * - check out the contents of simple.pb.h! */ + SimpleMessage message = SimpleMessage_init_zero; + + /* Create a stream that will write to our buffer. */ + pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); + + /* Fill in the lucky number */ + message.lucky_number = 13; + + /* Now we are ready to encode the message! */ + status = pb_encode(&stream, SimpleMessage_fields, &message); + message_length = stream.bytes_written; + + /* Then just check for any errors.. */ + if (!status) + { + rt_kprintf("Encoding failed: %s\n", PB_GET_ERROR(&stream)); + return 1; + } + } + + /* Now we could transmit the message over network, store it in a file or + * wrap it to a pigeon's leg. + */ + + /* But because we are lazy, we will just decode it immediately. */ + + { + /* Allocate space for the decoded message. */ + SimpleMessage message; + + /* Create a stream that reads from the buffer. */ + pb_istream_t stream = pb_istream_from_buffer(buffer, message_length); + + /* Now we are ready to decode the message. */ + status = pb_decode(&stream, SimpleMessage_fields, &message); + + /* Check for errors... */ + if (!status) + { + rt_kprintf("Decoding failed: %s\n", PB_GET_ERROR(&stream)); + return 1; + } + + /* Print the data contained in the message. */ + rt_kprintf("Your lucky number was %d!\n", message.lucky_number); + } + + return 0; +} + +#ifdef RT_USING_FINSH +#include <finsh.h> +FINSH_FUNCTION_EXPORT(nanopb_test, nanopb encode/decode test.) +#endif diff --git a/examples/nanopb/simple.options b/examples/nanopb/simple.options new file mode 100644 index 0000000000..90960d0d34 --- /dev/null +++ b/examples/nanopb/simple.options @@ -0,0 +1 @@ +SimpleMessage.name max_size:16
\ No newline at end of file diff --git a/examples/nanopb/simple.pb.c b/examples/nanopb/simple.pb.c new file mode 100644 index 0000000000..eaf09e58da --- /dev/null +++ b/examples/nanopb/simple.pb.c @@ -0,0 +1,18 @@ +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.1 at Tue Mar 10 01:16:15 2015. */ + +#include "simple.pb.h" + +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t SimpleMessage_fields[3] = { + PB_FIELD( 1, INT32 , REQUIRED, STATIC , FIRST, SimpleMessage, lucky_number, lucky_number, 0), + PB_FIELD( 2, BYTES , REQUIRED, STATIC , OTHER, SimpleMessage, name, lucky_number, 0), + PB_LAST_FIELD +}; + + diff --git a/examples/nanopb/simple.pb.h b/examples/nanopb/simple.pb.h new file mode 100644 index 0000000000..47521dee69 --- /dev/null +++ b/examples/nanopb/simple.pb.h @@ -0,0 +1,45 @@ +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.1 at Tue Mar 10 01:16:15 2015. */ + +#ifndef PB_SIMPLE_PB_H_INCLUDED +#define PB_SIMPLE_PB_H_INCLUDED +#include <pb.h> + +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Enum definitions */ +/* Struct definitions */ +typedef PB_BYTES_ARRAY_T(16) SimpleMessage_name_t; + +typedef struct _SimpleMessage { + int32_t lucky_number; + SimpleMessage_name_t name; +} SimpleMessage; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define SimpleMessage_init_default {0, {0, {0}}} +#define SimpleMessage_init_zero {0, {0, {0}}} + +/* Field tags (for use in manual encoding/decoding) */ +#define SimpleMessage_lucky_number_tag 1 +#define SimpleMessage_name_tag 2 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t SimpleMessage_fields[3]; + +/* Maximum encoded size of messages (where known) */ +#define SimpleMessage_size 29 + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/examples/nanopb/simple.proto b/examples/nanopb/simple.proto new file mode 100644 index 0000000000..1905d0e50b --- /dev/null +++ b/examples/nanopb/simple.proto @@ -0,0 +1,10 @@ +// A very simple protocol definition, consisting of only +// one message. + +message SimpleMessage { + required int32 lucky_number = 1; + required bytes name = 2; +} + + + |
