/ bm_seapoint_turbidity_data_msg.cpp
bm_seapoint_turbidity_data_msg.cpp
  1  #include "bm_seapoint_turbidity_data_msg.h"
  2  #include <math.h>
  3  
  4  namespace BmSeapointTurbidityDataMsg {
  5  
  6  CborError encode(Data &d, uint8_t *cbor_buffer, size_t size,
  7                   size_t *encoded_len) {
  8    CborError err;
  9    CborEncoder encoder, map_encoder;
 10    cbor_encoder_init(&encoder, cbor_buffer, size, 0);
 11  
 12    do {
 13      err = cbor_encoder_create_map(&encoder, &map_encoder, NUM_FIELDS);
 14      if (err != CborNoError) {
 15        printf("cbor_encoder_create_map failed: %d\n", err);
 16        if (err != CborErrorOutOfMemory) {
 17          break;
 18        }
 19      }
 20  
 21      // sensor_header_msg
 22      err = SensorHeaderMsg::encode(map_encoder, d.header);
 23      if (err != CborNoError) {
 24        printf("SensorHeaderMsg::encode failed: %d\n", err);
 25        if (err != CborErrorOutOfMemory) {
 26          break;
 27        }
 28      }
 29  
 30      // s_signal
 31      err = cbor_encode_text_stringz(&map_encoder, "s_signal");
 32      if (err != CborNoError) {
 33        printf("cbor_encode_text_stringz failed for s_signal key: %d\n",
 34               err);
 35        if (err != CborErrorOutOfMemory) {
 36          break;
 37        }
 38      }
 39      err = cbor_encode_double(&map_encoder, d.s_signal);
 40      if (err != CborNoError) {
 41        printf("cbor_encode_double failed for s_signal value: %d\n",
 42               err);
 43        if (err != CborErrorOutOfMemory) {
 44          break;
 45        }
 46      }
 47  
 48      // r_signal
 49      err = cbor_encode_text_stringz(&map_encoder, "r_signal");
 50      if (err != CborNoError) {
 51        printf("cbor_encode_text_stringz failed for r_signal key: %d\n",
 52               err);
 53        if (err != CborErrorOutOfMemory) {
 54          break;
 55        }
 56      }
 57      err = cbor_encode_double(&map_encoder, d.r_signal);
 58      if (err != CborNoError) {
 59        printf("cbor_encode_double failed for r_signal value: %d\n",
 60               err);
 61        if (err != CborErrorOutOfMemory) {
 62          break;
 63        }
 64      }
 65  
 66      err = cbor_encoder_close_container(&encoder, &map_encoder);
 67      if (err == CborNoError) {
 68        *encoded_len = cbor_encoder_get_buffer_size(&encoder, cbor_buffer);
 69      } else {
 70        printf("cbor_encoder_close_container failed: %d\n", err);
 71  
 72        if (err != CborErrorOutOfMemory) {
 73          break;
 74        }
 75        size_t extra_bytes_needed = cbor_encoder_get_extra_bytes_needed(&encoder);
 76        printf("extra_bytes_needed: %zu\n", extra_bytes_needed);
 77      }
 78    } while (0);
 79  
 80    return err;
 81  }
 82  
 83  CborError decode(Data &d, const uint8_t *cbor_buffer, size_t size) {
 84    CborParser parser;
 85    CborValue map;
 86    CborError err = cbor_parser_init(cbor_buffer, size, 0, &parser, &map);
 87  
 88    do {
 89      if (err != CborNoError) {
 90        break;
 91      }
 92      err = cbor_value_validate_basic(&map);
 93      if (err != CborNoError) {
 94        break;
 95      }
 96      if (!cbor_value_is_map(&map)) {
 97        err = CborErrorIllegalType;
 98        break;
 99      }
100  
101      size_t num_fields;
102      err = cbor_value_get_map_length(&map, &num_fields);
103      if (err != CborNoError) {
104        break;
105      }
106      if (num_fields != NUM_FIELDS) {
107        err = CborErrorUnknownLength;
108        printf("expected %zu fields but got %zu\n", NUM_FIELDS, num_fields);
109        break;
110      }
111  
112      CborValue value;
113      err = cbor_value_enter_container(&map, &value);
114      if (err != CborNoError) {
115        break;
116      }
117  
118      // header
119      err = SensorHeaderMsg::decode(value, d.header);
120      if (err != CborNoError) {
121        break;
122      }
123  
124      // s_signal
125      if (!cbor_value_is_text_string(&value)) {
126        err = CborErrorIllegalType;
127        printf("expected string key but got something else\n");
128        break;
129      }
130      err = cbor_value_advance(&value);
131      if (err != CborNoError) {
132        break;
133      }
134      err = cbor_value_get_double(&value, &d.s_signal);
135      if (err != CborNoError) {
136        break;
137      }
138      err = cbor_value_advance(&value);
139      if (err != CborNoError) {
140        break;
141      }
142  
143      // r_signal
144      if (!cbor_value_is_text_string(&value)) {
145        err = CborErrorIllegalType;
146        printf("expected string key but got something else\n");
147        break;
148      }
149      err = cbor_value_advance(&value);
150      if (err != CborNoError) {
151        break;
152      }
153      err = cbor_value_get_double(&value, &d.r_signal);
154      if (err != CborNoError) {
155        break;
156      }
157      err = cbor_value_advance(&value);
158      if (err != CborNoError) {
159        break;
160      }
161  
162      if (err == CborNoError) {
163        err = cbor_value_leave_container(&map, &value);
164        if (err != CborNoError) {
165          break;
166        }
167        if (!cbor_value_at_end(&map)) {
168          err = CborErrorGarbageAtEnd;
169          break;
170        }
171      }
172    } while (0);
173  
174    return err;
175  }
176  
177  } // namespace BmSeapointTurbidityDataMsg