/ 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