3#include <nanopb/pb_decode.h>
4#include <nanopb/pb_encode.h>
26unsigned int Format(RepeatedSensorMeasurements* meas);
41 const SensorMeasurement meas[],
43 RepeatedSensorMeasurements* out);
46 if (left->ts != right->ts) {
49 if (left->logger_id != right->logger_id) {
52 if (left->cell_id != right->cell_id) {
59unsigned int Format(RepeatedSensorMeasurements* meas) {
60 unsigned int most_count = 1;
63 for (
int first = 0; first < meas->measurements_count; first++) {
64 unsigned int current_count = 1;
65 for (
int second = 0; second < meas->measurements_count; second++) {
67 if (first == second) {
72 Metadata* first_meta = &meas->measurements[first].meta;
73 Metadata* second_meta = &meas->measurements[second].meta;
80 if (current_count > most_count) {
81 most_count = current_count;
82 meas->meta = meas->measurements[first].meta;
92 meas->has_meta =
true;
93 for (
int i = 0;
i < meas->measurements_count;
i++) {
94 Metadata* current_meta = &meas->measurements[
i].meta;
96 meas->measurements[
i].has_meta =
false;
105 if (!meas->has_meta) {
106 for (
size_t i = 0;
i < meas->measurements_count;
i++) {
107 if (!meas->measurements[
i].has_meta) {
113 for (
size_t i = 0;
i < meas->measurements_count;
i++) {
114 if (!meas->measurements[
i].has_meta) {
115 meas->measurements[
i].meta = meas->meta;
116 meas->measurements[
i].has_meta =
true;
125 const SensorMeasurement meas[],
127 RepeatedSensorMeasurements* out) {
132 size_t max_count =
sizeof(out->measurements) /
sizeof(out->measurements[0]);
133 if (count > max_count) {
141 out->measurements_count = count;
142 for (
size_t i = 0;
i < count;
i++) {
143 out->measurements[
i] = meas[
i];
152 uint8_t*
buffer,
size_t* size) {
154 pb_ostream_t ostream = pb_ostream_from_buffer(
buffer, 256);
156 bool status = pb_encode(&ostream, SensorMeasurement_fields, meas);
162 *size = ostream.bytes_written;
167 const SensorMeasurement meas[],
168 size_t count, uint8_t*
buffer,
169 size_t size,
size_t* length) {
170 RepeatedSensorMeasurements rep_meas = RepeatedSensorMeasurements_init_zero;
176 return sensor_status;
180 pb_ostream_t ostream = pb_ostream_from_buffer(
buffer, size);
182 pb_encode(&ostream, RepeatedSensorMeasurements_fields, &rep_meas);
187 *length = ostream.bytes_written;
192 const SensorMeasurement meas[],
193 size_t count,
size_t* size) {
194 RepeatedSensorMeasurements rep_meas = RepeatedSensorMeasurements_init_zero;
200 return sensor_status;
205 pb_get_encoded_size(size, RepeatedSensorMeasurements_fields, &rep_meas);
214 SensorType type, uint8_t*
buffer,
216 SensorMeasurement meas = SensorMeasurement_init_zero;
220 meas.has_meta =
true;
223 meas.which_value = SensorMeasurement_unsigned_int_tag;
224 meas.value.unsigned_int = value;
230 SensorType type, uint8_t*
buffer,
232 SensorMeasurement meas = SensorMeasurement_init_zero;
235 meas.has_meta =
true;
238 meas.which_value = SensorMeasurement_signed_int_tag;
239 meas.value.signed_int = value;
245 SensorType type, uint8_t*
buffer,
247 SensorMeasurement meas = SensorMeasurement_init_zero;
250 meas.has_meta =
true;
253 meas.which_value = SensorMeasurement_decimal_tag;
254 meas.value.decimal = value;
260 SensorMeasurement* meas) {
261 pb_istream_t istream = pb_istream_from_buffer(
data, len);
262 bool status = pb_decode(&istream, SensorMeasurement_fields, meas);
271 const uint8_t*
data,
const size_t len,
272 RepeatedSensorMeasurements* measurements) {
273 pb_istream_t istream = pb_istream_from_buffer(
data, len);
275 pb_decode(&istream, RepeatedSensorMeasurements_fields, measurements);
280 return Parse(measurements);
284 const RepeatedSensorResponses responses, uint8_t*
buffer,
size_t* size) {
285 pb_ostream_t ostream = pb_ostream_from_buffer(
buffer, *size);
286 bool status = pb_encode(&ostream, RepeatedSensorResponses_fields, &responses);
291 *size = ostream.bytes_written;
296 RepeatedSensorResponses* resp) {
297 pb_istream_t istream = pb_istream_from_buffer(
data, len);
298 bool status = pb_decode(&istream, RepeatedSensorResponses_fields, resp);
308 if (resp->idx == 0) {
309 switch (resp->error) {
317 switch (resp->error) {
320 case SensorError_LOGGER:
321 case SensorError_CELL:
322 case SensorError_UNSUPPORTED:
333 printf(
" cell_id : %ld\n", meta->cell_id);
334 printf(
" logger_id: %ld\n", meta->logger_id);
335 printf(
" ts : %ld\n", meta->ts);
339 printf(
" idx: %ld\n", m->idx);
340 printf(
" has_meta: %s\n", m->has_meta ?
"true" :
"false");
343 printf(
" Metadata:\n");
347 printf(
" type: %d\n", m->type);
350 switch (m->which_value) {
351 case SensorMeasurement_unsigned_int_tag:
352 printf(
"%lu (unsigned)\n", m->value.unsigned_int);
355 case SensorMeasurement_signed_int_tag:
356 printf(
"%ld (signed)\n", m->value.signed_int);
359 case SensorMeasurement_decimal_tag:
360 printf(
"%f (decimal)\n", m->value.decimal);
370 printf(
"RepeatedSensorMeasurements\n");
371 printf(
" has_meta: %s\n", msg->has_meta ?
"true" :
"false");
374 printf(
" Metadata:\n");
378 printf(
" type: %d\n", msg->type);
379 printf(
" measurements_count: %u\n", (
unsigned)msg->measurements_count);
381 for (pb_size_t
i = 0;
i < msg->measurements_count;
i++) {
382 printf(
" Measurement[%u]\n", (
unsigned)
i);
SensorStatus DecodeSensorMeasurement(const uint8_t *data, const size_t len, SensorMeasurement *meas)
Decodes a sensor measurement from a buffer.
void PrintRepeatedSensorMeasurements(const RepeatedSensorMeasurements *msg)
SensorStatus EncodeSensorMeasurement(const SensorMeasurement *meas, uint8_t *buffer, size_t *size)
Encodes a single sensor measurement into a buffer.
SensorStatus RepeatedSensorMeasurementsSize(Metadata meta, const SensorMeasurement meas[], size_t count, size_t *size)
Gets the size of multiple repeated sensor measurements when encoded.
SensorStatus EncodeInt32Measurement(Metadata meta, int32_t value, SensorType type, uint8_t *buffer, size_t *size)
Encodes an int64_t sensor measurement into a buffer.
SensorStatus CheckSensorResponse(const SensorResponse *resp)
Checks a single sensor response for errors.
SensorStatus EncodeRepeatedSensorMeasurements(Metadata meta, const SensorMeasurement meas[], size_t count, uint8_t *buffer, size_t size, size_t *length)
Encodes multiple sensor measurements into a buffer.
SensorStatus EncodeDoubleMeasurement(Metadata meta, double value, SensorType type, uint8_t *buffer, size_t *size)
Encodes a double sensor measurement into a buffer.
SensorStatus DecodeRepeatedSensorReponses(const uint8_t *data, const size_t len, RepeatedSensorResponses *resp)
Decodes multiple sensor responses from a buffer.
SensorStatus EncodeRepeatedSensorResponses(const RepeatedSensorResponses responses, uint8_t *buffer, size_t *size)
Encodes multiple sensor responses into a buffer.
enum _SensorStatus SensorStatus
SensorStatus DecodeRepeatedSensorMeasurements(const uint8_t *data, const size_t len, RepeatedSensorMeasurements *measurements)
Decodes multiple sensor measurements from a buffer.
SensorStatus EncodeUint32Measurement(Metadata meta, uint32_t value, SensorType type, uint8_t *buffer, size_t *size)
Encodes a uint64_t sensor measurement into a buffer.
void PrintSensorMeasurement(const SensorMeasurement *m)
SensorStatus FormatRepeatedSensorMeasurements(Metadata meta, const SensorMeasurement meas[], size_t count, RepeatedSensorMeasurements *out)
SensorStatus Parse(RepeatedSensorMeasurements *meas)
Parses repeated sensor measurements to add metadata back to individual measurements.
void PrintMetadata(const Metadata *meta)
unsigned int Format(RepeatedSensorMeasurements *meas)
Optimizes repeated sensor measurements for size.
bool MetadataEqual(Metadata *left, Metadata *right)
Compares two Metadata structures for equality.
Library for sensor measurement encoding/decoding.