collar/prototest.cpp

142 lines
4.2 KiB
C++

#include <iostream>
#include <cassert>
#include "pb_common.h"
#include "pb.h"
#include "pb_encode.h"
#include "pb_decode.h"
#include "gateway/message.pb.h"
/*
* Try to get repeating element to work with nanopb
* for coordinates
*/
using namespace std;
void print_buffer(uint8_t *buffer, int size) {
for(int i=0;i<size;i++) {
printf("%02x ", buffer[i]);
}
printf("\n");
}
int main() {
uint8_t buffer[1000] = {0};
pb_ostream_t stream;
pb_istream_t stream0;
int err;
// encode a coordinate
Fenceless_Coordinate coord = Fenceless_Coordinate_init_zero;
coord.x = 789;
coord.y = 123;
stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
err = pb_encode(&stream, Fenceless_Coordinate_fields, &coord);
assert(err);
print_buffer(buffer, stream.bytes_written);
// decode a coordinate from buffer
Fenceless_Coordinate coord0 = Fenceless_Coordinate_init_zero;
stream0 = pb_istream_from_buffer(buffer, stream.bytes_written);
err = pb_decode(&stream0, Fenceless_Coordinate_fields, &coord0);
assert(err);
// check result
assert(coord0.x == coord.x);
assert(coord0.y == coord.y);
// encode a coller response
Fenceless_CollarResponse collar = Fenceless_CollarResponse_init_zero;
collar.loc.x = 200;
collar.loc.y = 100;
stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
err = pb_encode(&stream, Fenceless_CollarResponse_fields, &collar);
assert(err);
print_buffer(buffer, stream.bytes_written);
Fenceless_CollarResponse collar0 = Fenceless_CollarResponse_init_zero;
stream0 = pb_istream_from_buffer(buffer, stream.bytes_written);
err = pb_decode(&stream0, Fenceless_CollarResponse_fields, &collar0);
assert(err);
// check result
assert(collar0.loc.x == collar.loc.x);
assert(collar0.loc.y == collar.loc.y);
// encode 10 coordinates
Fenceless_Coordinates coords;
coords.coord0.x = 1; coords.coord0.y = 2;
coords.coord1.x = 1; coords.coord1.y = 2;
coords.coord2.x = 1; coords.coord2.y = 2;
coords.coord3.x = 1; coords.coord3.y = 2;
coords.coord4.x = 1; coords.coord4.y = 2;
coords.coord5.x = 1; coords.coord5.y = 2;
coords.coord6.x = 1; coords.coord6.y = 2;
coords.coord7.x = 1; coords.coord7.y = 2;
coords.coord8.x = 1; coords.coord8.y = 2;
coords.coord9.x = 1; coords.coord9.y = 2;
coords.isr = 10;
stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
err = pb_encode(&stream, Fenceless_Coordinates_fields, &coords);
assert(err);
print_buffer(buffer, stream.bytes_written);
// encode multiple coordinates
//Fenceless_Coordinates coords = Fenceless_Coordinates_init_zero;
//coords.loc.funcs.encode = [](pb_ostream_t *stream, const pb_field_t *field, void * const * arg){
// cout << "encode called" << endl;
// int err;
// err = pb_encode_tag_for_field(stream , field);
// assert(err);
// Fenceless_Coordinate coord = Fenceless_Coordinate_init_zero;
// coord.x = 123;
// coord.y = 456;
// err = pb_encode_submessage(stream, Fenceless_Coordinate_fields, &coord);
// assert(err);
// err = pb_encode_tag_for_field(stream , field);
// assert(err);
// coord = Fenceless_Coordinate_init_zero;
// coord.x = 789;
// coord.y = 987;
// err = pb_encode_submessage(stream, Fenceless_Coordinate_fields, &coord);
// assert(err);
// return true;
//};
//memset(buffer, 0, sizeof(buffer)-1);
//stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
//err = pb_encode(&stream, Fenceless_Coordinates_fields, &coords);
//assert(err);
//print_buffer(buffer, stream.bytes_written);
//Fenceless_Coordinates coords0 = Fenceless_Coordinates_init_zero;
//coords0.loc.funcs.decode = [](pb_istream_t *stream, const pb_field_iter_t *field, void ** arg){
// cout << "decode called" << endl;
// printf("Array size: %d\n", field->array_size);
// bool eof;
// uint32_t tag;
// pb_wire_type_t t = PB_WT_STRING;
// pb_decode_tag(stream, &t, &tag, &eof);
// Fenceless_Coordinate coord;
// int err = pb_decode(stream, Fenceless_Coordinate_fields, &coord);
// assert(err);
// printf("%d %d", coord.x,coord.y);
// return false;
//};
//stream0 = pb_istream_from_buffer(buffer, stream.bytes_written);
//err = pb_decode(&stream0, Fenceless_Coordinates_fields, &coords0);
//assert(err);
return 0;
}