is there a way to encode structs or classes with nanopb? I want to hold a struct an encode it with nanopb.
protofile
syntax = "proto2";
package genericgateway;
message Config {
required string deviceId = 1;
repeated DataConnection data = 2;
message DataConnection {
required string connectionName = 1;
required uint32 sampleTime = 2;
required uint32 uploadInterval = 3;
repeated Field fields = 4;
message Field {
required string name = 1;
required Datatype datatype = 2;
required uint32 dimension = 3;
optional string description = 4;
}
enum Datatype {
INTEGER = 1;
FLOAT = 2;
STRING = 3;
BYTES = 4;
TIMESTAMP = 5;
BOOLEAN = 6;
}
}
}
output generation from nanopb
/* Enum definitions */
typedef enum _genericgateway_Config_DataConnection_Datatype {
genericgateway_Config_DataConnection_Datatype_INTEGER = 1,
genericgateway_Config_DataConnection_Datatype_FLOAT = 2,
genericgateway_Config_DataConnection_Datatype_STRING = 3,
genericgateway_Config_DataConnection_Datatype_BYTES = 4,
genericgateway_Config_DataConnection_Datatype_TIMESTAMP = 5,
genericgateway_Config_DataConnection_Datatype_BOOLEAN = 6
} genericgateway_Config_DataConnection_Datatype;
/* Struct definitions */
typedef struct _genericgateway_Config {
pb_callback_t deviceId;
pb_callback_t data;
} genericgateway_Config;
typedef struct _genericgateway_Config_DataConnection {
pb_callback_t connectionName;
uint32_t sampleTime;
uint32_t uploadInterval;
pb_callback_t fields;
} genericgateway_Config_DataConnection;
typedef struct _genericgateway_Config_DataConnection_Field {
pb_callback_t name;
genericgateway_Config_DataConnection_Datatype datatype;
uint32_t dimension;
pb_callback_t description;
} genericgateway_Config_DataConnection_Field;
i want to hold the data in a struct like this
enum datatype_e {
INTEGER,
FLOAT,
STRING,
BYTES,
TIMESTAMP,
BOOLEAN,
};
typedef struct
{
const char *name;
datatype_e datatype;
uint32_t dimension;
const char *description;
} fields_t;
typedef struct
{
const char *deviceId;
const char *connectionName;
uint32_t sampleTime;
uint32_t uploadInterval;
fields_t fields[2];
} callback_context_t;
fill the struct
callback_context_t ctx;
ctx.deviceId = "iot-device";
ctx.connectionName = "dev";
ctx.sampleTime = 5000;
ctx.uploadInterval = 10;
ctx.fields[0].name = "sample_float";
ctx.fields[0].datatype = datatype_e::FLOAT;
ctx.fields[0].dimension = 1;
ctx.fields[0].description = "sample_description";
ctx.fields[1].name = "sample_integer";
ctx.fields[1].datatype = datatype_e::INTEGER;
ctx.fields[1].dimension = 1;
ctx.fields[1].description = "sample_description";
_genericgateway_Config config = genericgateway_Config_init_zero;
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
config.deviceId.arg = &ctx;
config.deviceId.funcs.encode = &encode_function???? how can look this
config.data.arg = &ctx;
config.data.funcs.encode = &encode_function;??? how can look this
if (!pb_encode(&stream, genericgateway_Config_fields, &config))
{
Serial.print("Decoding failed: ");
Serial.println(PB_GET_ERROR(&stream));
}
how can look the encode function? somthings like that... but how can i encode the rest?
bool encode_function(pb_ostream_t *stream, const pb_field_t *field, void *const *arg)
{
callback_context_t *ctx = (callback_context_t *)(*arg);
if (!pb_encode_tag_for_field(stream, field))
return false;
return pb_encode_string(stream, (uint8_t *)ctx->deviceId, strlen(ctx->deviceId));
}
Thanks a lot,
Regards Markus