The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 143:86740a56073b 1 /*
AnnaBridge 143:86740a56073b 2 * Copyright (c) 2012 Nordic Semiconductor ASA
AnnaBridge 143:86740a56073b 3 * All rights reserved.
AnnaBridge 143:86740a56073b 4 *
AnnaBridge 143:86740a56073b 5 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 143:86740a56073b 6 * are permitted provided that the following conditions are met:
AnnaBridge 143:86740a56073b 7 *
AnnaBridge 143:86740a56073b 8 * 1. Redistributions of source code must retain the above copyright notice, this list
AnnaBridge 143:86740a56073b 9 * of conditions and the following disclaimer.
AnnaBridge 143:86740a56073b 10 *
AnnaBridge 143:86740a56073b 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
AnnaBridge 143:86740a56073b 12 * integrated circuit in a product or a software update for such product, must reproduce
AnnaBridge 143:86740a56073b 13 * the above copyright notice, this list of conditions and the following disclaimer in
AnnaBridge 143:86740a56073b 14 * the documentation and/or other materials provided with the distribution.
AnnaBridge 143:86740a56073b 15 *
AnnaBridge 143:86740a56073b 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
AnnaBridge 143:86740a56073b 17 * used to endorse or promote products derived from this software without specific prior
AnnaBridge 143:86740a56073b 18 * written permission.
AnnaBridge 143:86740a56073b 19 *
AnnaBridge 143:86740a56073b 20 * 4. This software, with or without modification, must only be used with a
AnnaBridge 143:86740a56073b 21 * Nordic Semiconductor ASA integrated circuit.
AnnaBridge 143:86740a56073b 22 *
AnnaBridge 143:86740a56073b 23 * 5. Any software provided in binary or object form under this license must not be reverse
AnnaBridge 143:86740a56073b 24 * engineered, decompiled, modified and/or disassembled.
AnnaBridge 143:86740a56073b 25 *
AnnaBridge 143:86740a56073b 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
AnnaBridge 143:86740a56073b 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
AnnaBridge 143:86740a56073b 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 143:86740a56073b 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
AnnaBridge 143:86740a56073b 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
AnnaBridge 143:86740a56073b 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
AnnaBridge 143:86740a56073b 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
AnnaBridge 143:86740a56073b 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
AnnaBridge 143:86740a56073b 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
AnnaBridge 143:86740a56073b 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 143:86740a56073b 36 *
AnnaBridge 143:86740a56073b 37 */
AnnaBridge 143:86740a56073b 38
AnnaBridge 143:86740a56073b 39
AnnaBridge 143:86740a56073b 40 /** @file
AnnaBridge 143:86740a56073b 41 *
AnnaBridge 143:86740a56073b 42 * @defgroup app_util Utility Functions and Definitions
AnnaBridge 143:86740a56073b 43 * @{
AnnaBridge 143:86740a56073b 44 * @ingroup app_common
AnnaBridge 143:86740a56073b 45 *
AnnaBridge 143:86740a56073b 46 * @brief Various types and definitions available to all applications.
AnnaBridge 143:86740a56073b 47 */
AnnaBridge 143:86740a56073b 48
AnnaBridge 143:86740a56073b 49 #ifndef APP_UTIL_BDS_H__
AnnaBridge 143:86740a56073b 50 #define APP_UTIL_BDS_H__
AnnaBridge 143:86740a56073b 51
AnnaBridge 143:86740a56073b 52 #include <stdint.h>
AnnaBridge 143:86740a56073b 53 #include <string.h>
AnnaBridge 143:86740a56073b 54 #include <stdbool.h>
AnnaBridge 143:86740a56073b 55 #include "compiler_abstraction.h"
AnnaBridge 143:86740a56073b 56 #include "app_util.h"
AnnaBridge 143:86740a56073b 57 #include "ble_srv_common.h"
AnnaBridge 143:86740a56073b 58 #include "nordic_common.h"
AnnaBridge 143:86740a56073b 59
AnnaBridge 143:86740a56073b 60 typedef uint8_t nibble_t;
AnnaBridge 143:86740a56073b 61 typedef uint32_t uint24_t;
AnnaBridge 143:86740a56073b 62 typedef uint64_t uint40_t;
AnnaBridge 143:86740a56073b 63
AnnaBridge 143:86740a56073b 64 /**@brief IEEE 11073-20601 Regulatory Certification Data List Structure */
AnnaBridge 143:86740a56073b 65 typedef struct
AnnaBridge 143:86740a56073b 66 {
AnnaBridge 143:86740a56073b 67 uint8_t * p_list; /**< Pointer the byte array containing the encoded opaque structure based on IEEE 11073-20601 specification. */
AnnaBridge 143:86740a56073b 68 uint8_t list_len; /**< Length of the byte array. */
AnnaBridge 143:86740a56073b 69 } regcertdatalist_t;
AnnaBridge 143:86740a56073b 70
AnnaBridge 143:86740a56073b 71 /**@brief SFLOAT format (IEEE-11073 16-bit FLOAT, meaning 4 bits for exponent (base 10) and 12 bits mantissa) */
AnnaBridge 143:86740a56073b 72 typedef struct
AnnaBridge 143:86740a56073b 73 {
AnnaBridge 143:86740a56073b 74 int8_t exponent; /**< Base 10 exponent, should be using only 4 bits */
AnnaBridge 143:86740a56073b 75 int16_t mantissa; /**< Mantissa, should be using only 12 bits */
AnnaBridge 143:86740a56073b 76 } sfloat_t;
AnnaBridge 143:86740a56073b 77
AnnaBridge 143:86740a56073b 78 /**@brief Date and Time structure. */
AnnaBridge 143:86740a56073b 79 typedef struct
AnnaBridge 143:86740a56073b 80 {
AnnaBridge 143:86740a56073b 81 uint16_t year;
AnnaBridge 143:86740a56073b 82 uint8_t month;
AnnaBridge 143:86740a56073b 83 uint8_t day;
AnnaBridge 143:86740a56073b 84 uint8_t hours;
AnnaBridge 143:86740a56073b 85 uint8_t minutes;
AnnaBridge 143:86740a56073b 86 uint8_t seconds;
AnnaBridge 143:86740a56073b 87 } ble_date_time_t;
AnnaBridge 143:86740a56073b 88
AnnaBridge 143:86740a56073b 89
AnnaBridge 143:86740a56073b 90 /**@brief Function for encoding a uint16 value.
AnnaBridge 143:86740a56073b 91 *
AnnaBridge 143:86740a56073b 92 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 93 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 94 *
AnnaBridge 143:86740a56073b 95 * @return Number of bytes written.
AnnaBridge 143:86740a56073b 96 */
AnnaBridge 143:86740a56073b 97 static __INLINE uint8_t bds_uint16_encode(const uint16_t * p_value, uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 98 {
AnnaBridge 143:86740a56073b 99 p_encoded_data[0] = (uint8_t) ((*p_value & 0x00FF) >> 0);
AnnaBridge 143:86740a56073b 100 p_encoded_data[1] = (uint8_t) ((*p_value & 0xFF00) >> 8);
AnnaBridge 143:86740a56073b 101 return sizeof(uint16_t);
AnnaBridge 143:86740a56073b 102 }
AnnaBridge 143:86740a56073b 103
AnnaBridge 143:86740a56073b 104 static __INLINE uint8_t bds_int16_encode(const int16_t * p_value, uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 105 {
AnnaBridge 143:86740a56073b 106 uint16_t tmp = *p_value;
AnnaBridge 143:86740a56073b 107 return bds_uint16_encode(&tmp, p_encoded_data);
AnnaBridge 143:86740a56073b 108 }
AnnaBridge 143:86740a56073b 109
AnnaBridge 143:86740a56073b 110 /**@brief Function for encoding a uint24 value.
AnnaBridge 143:86740a56073b 111 *
AnnaBridge 143:86740a56073b 112 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 113 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 114 *
AnnaBridge 143:86740a56073b 115 * @return Number of bytes written.
AnnaBridge 143:86740a56073b 116 */
AnnaBridge 143:86740a56073b 117 static __INLINE uint8_t bds_uint24_encode(const uint32_t * p_value, uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 118 {
AnnaBridge 143:86740a56073b 119 p_encoded_data[0] = (uint8_t) ((*p_value & 0x000000FF) >> 0);
AnnaBridge 143:86740a56073b 120 p_encoded_data[1] = (uint8_t) ((*p_value & 0x0000FF00) >> 8);
AnnaBridge 143:86740a56073b 121 p_encoded_data[2] = (uint8_t) ((*p_value & 0x00FF0000) >> 16);
AnnaBridge 143:86740a56073b 122 return (3);
AnnaBridge 143:86740a56073b 123 }
AnnaBridge 143:86740a56073b 124
AnnaBridge 143:86740a56073b 125
AnnaBridge 143:86740a56073b 126 /**@brief Function for encoding a uint32 value.
AnnaBridge 143:86740a56073b 127 *
AnnaBridge 143:86740a56073b 128 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 129 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 130 *
AnnaBridge 143:86740a56073b 131 * @return Number of bytes written.
AnnaBridge 143:86740a56073b 132 */
AnnaBridge 143:86740a56073b 133 static __INLINE uint8_t bds_uint32_encode(const uint32_t * p_value, uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 134 {
AnnaBridge 143:86740a56073b 135 p_encoded_data[0] = (uint8_t) ((*p_value & 0x000000FF) >> 0);
AnnaBridge 143:86740a56073b 136 p_encoded_data[1] = (uint8_t) ((*p_value & 0x0000FF00) >> 8);
AnnaBridge 143:86740a56073b 137 p_encoded_data[2] = (uint8_t) ((*p_value & 0x00FF0000) >> 16);
AnnaBridge 143:86740a56073b 138 p_encoded_data[3] = (uint8_t) ((*p_value & 0xFF000000) >> 24);
AnnaBridge 143:86740a56073b 139 return sizeof(uint32_t);
AnnaBridge 143:86740a56073b 140 }
AnnaBridge 143:86740a56073b 141
AnnaBridge 143:86740a56073b 142
AnnaBridge 143:86740a56073b 143 /**@brief Function for encoding a uint40 value.
AnnaBridge 143:86740a56073b 144 *
AnnaBridge 143:86740a56073b 145 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 146 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 147 *
AnnaBridge 143:86740a56073b 148 * @return Number of bytes written.
AnnaBridge 143:86740a56073b 149 */
AnnaBridge 143:86740a56073b 150 static __INLINE uint8_t bds_uint40_encode(const uint64_t * p_value, uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 151 {
AnnaBridge 143:86740a56073b 152 p_encoded_data[0] = (uint8_t) ((*p_value & 0x00000000000000FF) >> 0);
AnnaBridge 143:86740a56073b 153 p_encoded_data[1] = (uint8_t) ((*p_value & 0x000000000000FF00) >> 8);
AnnaBridge 143:86740a56073b 154 p_encoded_data[2] = (uint8_t) ((*p_value & 0x0000000000FF0000) >> 16);
AnnaBridge 143:86740a56073b 155 p_encoded_data[3] = (uint8_t) ((*p_value & 0x00000000FF000000) >> 24);
AnnaBridge 143:86740a56073b 156 p_encoded_data[4] = (uint8_t) ((*p_value & 0x000000FF00000000) >> 32);
AnnaBridge 143:86740a56073b 157 return 5;
AnnaBridge 143:86740a56073b 158 }
AnnaBridge 143:86740a56073b 159
AnnaBridge 143:86740a56073b 160 /**@brief Function for encoding a sfloat value.
AnnaBridge 143:86740a56073b 161 *
AnnaBridge 143:86740a56073b 162 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 163 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 164 *
AnnaBridge 143:86740a56073b 165 * @return Number of bytes written.
AnnaBridge 143:86740a56073b 166 */
AnnaBridge 143:86740a56073b 167 static __INLINE uint8_t bds_sfloat_encode(const sfloat_t * p_value, uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 168 {
AnnaBridge 143:86740a56073b 169 uint16_t encoded_val;
AnnaBridge 143:86740a56073b 170
AnnaBridge 143:86740a56073b 171 encoded_val = ((p_value->exponent << 12) & 0xF000) |
AnnaBridge 143:86740a56073b 172 ((p_value->mantissa << 0) & 0x0FFF);
AnnaBridge 143:86740a56073b 173
AnnaBridge 143:86740a56073b 174 return(bds_uint16_encode(&encoded_val, p_encoded_data));
AnnaBridge 143:86740a56073b 175 }
AnnaBridge 143:86740a56073b 176
AnnaBridge 143:86740a56073b 177
AnnaBridge 143:86740a56073b 178 /**@brief Function for encoding a uint8_array value.
AnnaBridge 143:86740a56073b 179 *
AnnaBridge 143:86740a56073b 180 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 181 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 182 */
AnnaBridge 143:86740a56073b 183 static __INLINE uint8_t bds_uint8_array_encode(const uint8_array_t * p_value,
AnnaBridge 143:86740a56073b 184 uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 185 {
AnnaBridge 143:86740a56073b 186 memcpy(p_encoded_data, p_value->p_data, p_value->size);
AnnaBridge 143:86740a56073b 187 return p_value->size;
AnnaBridge 143:86740a56073b 188 }
AnnaBridge 143:86740a56073b 189
AnnaBridge 143:86740a56073b 190
AnnaBridge 143:86740a56073b 191 /**@brief Function for encoding a utf8_str value.
AnnaBridge 143:86740a56073b 192 *
AnnaBridge 143:86740a56073b 193 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 194 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 195
AnnaBridge 143:86740a56073b 196 */
AnnaBridge 143:86740a56073b 197 static __INLINE uint8_t bds_ble_srv_utf8_str_encode(const ble_srv_utf8_str_t * p_value,
AnnaBridge 143:86740a56073b 198 uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 199 {
AnnaBridge 143:86740a56073b 200 memcpy(p_encoded_data, p_value->p_str, p_value->length);
AnnaBridge 143:86740a56073b 201 return p_value->length;
AnnaBridge 143:86740a56073b 202 }
AnnaBridge 143:86740a56073b 203
AnnaBridge 143:86740a56073b 204 /**@brief Function for encoding a regcertdatalist value.
AnnaBridge 143:86740a56073b 205 *
AnnaBridge 143:86740a56073b 206 * @param[in] p_value Value to be encoded.
AnnaBridge 143:86740a56073b 207 * @param[out] p_encoded_data Buffer where the encoded data is to be written.
AnnaBridge 143:86740a56073b 208
AnnaBridge 143:86740a56073b 209 */
AnnaBridge 143:86740a56073b 210 static __INLINE uint8_t bds_regcertdatalist_encode(const regcertdatalist_t * p_value,
AnnaBridge 143:86740a56073b 211 uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 212 {
AnnaBridge 143:86740a56073b 213 memcpy(p_encoded_data, p_value->p_list, p_value->list_len);
AnnaBridge 143:86740a56073b 214 return p_value->list_len;
AnnaBridge 143:86740a56073b 215 }
AnnaBridge 143:86740a56073b 216
AnnaBridge 143:86740a56073b 217
AnnaBridge 143:86740a56073b 218 /**@brief Function for decoding a date_time value.
AnnaBridge 143:86740a56073b 219 *
AnnaBridge 143:86740a56073b 220 * @param[in] p_date_time pointer to the date_time structure to encode.
AnnaBridge 143:86740a56073b 221 * @param[in] p_encoded_data pointer to the encoded data
AnnaBridge 143:86740a56073b 222 * @return length of the encoded field.
AnnaBridge 143:86740a56073b 223 */
AnnaBridge 143:86740a56073b 224 static __INLINE uint8_t bds_ble_date_time_encode(const ble_date_time_t * p_date_time,
AnnaBridge 143:86740a56073b 225 uint8_t * p_encoded_data)
AnnaBridge 143:86740a56073b 226 {
AnnaBridge 143:86740a56073b 227 uint8_t len = bds_uint16_encode(&p_date_time->year, &p_encoded_data[0]);
AnnaBridge 143:86740a56073b 228
AnnaBridge 143:86740a56073b 229 p_encoded_data[len++] = p_date_time->month;
AnnaBridge 143:86740a56073b 230 p_encoded_data[len++] = p_date_time->day;
AnnaBridge 143:86740a56073b 231 p_encoded_data[len++] = p_date_time->hours;
AnnaBridge 143:86740a56073b 232 p_encoded_data[len++] = p_date_time->minutes;
AnnaBridge 143:86740a56073b 233 p_encoded_data[len++] = p_date_time->seconds;
AnnaBridge 143:86740a56073b 234
AnnaBridge 143:86740a56073b 235 return len;
AnnaBridge 143:86740a56073b 236 }
AnnaBridge 143:86740a56073b 237
AnnaBridge 143:86740a56073b 238
AnnaBridge 143:86740a56073b 239 /**@brief Function for decoding a uint16 value.
AnnaBridge 143:86740a56073b 240 *
AnnaBridge 143:86740a56073b 241 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 242 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 243 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 244 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 245 */
AnnaBridge 143:86740a56073b 246 static __INLINE uint8_t bds_uint16_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 247 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 248 uint16_t * p_decoded_val)
AnnaBridge 143:86740a56073b 249 {
AnnaBridge 143:86740a56073b 250 UNUSED_VARIABLE(len);
AnnaBridge 143:86740a56073b 251 *p_decoded_val = (((uint16_t)((uint8_t *)p_encoded_data)[0])) |
AnnaBridge 143:86740a56073b 252 (((uint16_t)((uint8_t *)p_encoded_data)[1]) << 8 );
AnnaBridge 143:86740a56073b 253 return (sizeof(uint16_t));
AnnaBridge 143:86740a56073b 254 }
AnnaBridge 143:86740a56073b 255
AnnaBridge 143:86740a56073b 256
AnnaBridge 143:86740a56073b 257 /**@brief Function for decoding a int16 value.
AnnaBridge 143:86740a56073b 258 *
AnnaBridge 143:86740a56073b 259 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 260 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 261 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 262 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 263 */
AnnaBridge 143:86740a56073b 264 static __INLINE uint8_t bds_int16_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 265 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 266 int16_t * p_decoded_val)
AnnaBridge 143:86740a56073b 267 {
AnnaBridge 143:86740a56073b 268 UNUSED_VARIABLE(len);
AnnaBridge 143:86740a56073b 269 uint16_t tmp = 0;
AnnaBridge 143:86740a56073b 270 uint8_t retval = bds_uint16_decode(len, p_encoded_data, &tmp);
AnnaBridge 143:86740a56073b 271 *p_decoded_val = (int16_t)tmp;
AnnaBridge 143:86740a56073b 272 return retval;
AnnaBridge 143:86740a56073b 273 }
AnnaBridge 143:86740a56073b 274
AnnaBridge 143:86740a56073b 275
AnnaBridge 143:86740a56073b 276 /**@brief Function for decoding a uint24 value.
AnnaBridge 143:86740a56073b 277 *
AnnaBridge 143:86740a56073b 278 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 279 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 280 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 281 *
AnnaBridge 143:86740a56073b 282 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 283 */
AnnaBridge 143:86740a56073b 284 static __INLINE uint8_t bds_uint24_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 285 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 286 uint32_t * p_decoded_val)
AnnaBridge 143:86740a56073b 287 {
AnnaBridge 143:86740a56073b 288 UNUSED_VARIABLE(len);
AnnaBridge 143:86740a56073b 289 *p_decoded_val = (((uint32_t)((uint8_t *)p_encoded_data)[0]) << 0) |
AnnaBridge 143:86740a56073b 290 (((uint32_t)((uint8_t *)p_encoded_data)[1]) << 8) |
AnnaBridge 143:86740a56073b 291 (((uint32_t)((uint8_t *)p_encoded_data)[2]) << 16);
AnnaBridge 143:86740a56073b 292 return (3);
AnnaBridge 143:86740a56073b 293 }
AnnaBridge 143:86740a56073b 294
AnnaBridge 143:86740a56073b 295
AnnaBridge 143:86740a56073b 296 /**@brief Function for decoding a uint32 value.
AnnaBridge 143:86740a56073b 297 *
AnnaBridge 143:86740a56073b 298 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 299 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 300 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 301 *
AnnaBridge 143:86740a56073b 302 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 303 */
AnnaBridge 143:86740a56073b 304 static __INLINE uint8_t bds_uint32_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 305 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 306 uint32_t * p_decoded_val)
AnnaBridge 143:86740a56073b 307 {
AnnaBridge 143:86740a56073b 308 UNUSED_VARIABLE(len);
AnnaBridge 143:86740a56073b 309 *p_decoded_val = (((uint32_t)((uint8_t *)p_encoded_data)[0]) << 0) |
AnnaBridge 143:86740a56073b 310 (((uint32_t)((uint8_t *)p_encoded_data)[1]) << 8) |
AnnaBridge 143:86740a56073b 311 (((uint32_t)((uint8_t *)p_encoded_data)[2]) << 16) |
AnnaBridge 143:86740a56073b 312 (((uint32_t)((uint8_t *)p_encoded_data)[3]) << 24 );
AnnaBridge 143:86740a56073b 313 return (sizeof(uint32_t));
AnnaBridge 143:86740a56073b 314 }
AnnaBridge 143:86740a56073b 315
AnnaBridge 143:86740a56073b 316
AnnaBridge 143:86740a56073b 317 /**@brief Function for decoding a uint40 value.
AnnaBridge 143:86740a56073b 318 *
AnnaBridge 143:86740a56073b 319 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 320 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 321 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 322 *
AnnaBridge 143:86740a56073b 323 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 324 */
AnnaBridge 143:86740a56073b 325 static __INLINE uint8_t bds_uint40_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 326 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 327 uint64_t * p_decoded_val)
AnnaBridge 143:86740a56073b 328 {
AnnaBridge 143:86740a56073b 329 UNUSED_VARIABLE(len);
AnnaBridge 143:86740a56073b 330 *p_decoded_val = (((uint64_t)((uint8_t *)p_encoded_data)[0]) << 0) |
AnnaBridge 143:86740a56073b 331 (((uint64_t)((uint8_t *)p_encoded_data)[1]) << 8) |
AnnaBridge 143:86740a56073b 332 (((uint64_t)((uint8_t *)p_encoded_data)[2]) << 16) |
AnnaBridge 143:86740a56073b 333 (((uint64_t)((uint8_t *)p_encoded_data)[3]) << 24 )|
AnnaBridge 143:86740a56073b 334 (((uint64_t)((uint8_t *)p_encoded_data)[4]) << 32 );
AnnaBridge 143:86740a56073b 335 return (40);
AnnaBridge 143:86740a56073b 336 }
AnnaBridge 143:86740a56073b 337
AnnaBridge 143:86740a56073b 338
AnnaBridge 143:86740a56073b 339 /**@brief Function for decoding a sfloat value.
AnnaBridge 143:86740a56073b 340 *
AnnaBridge 143:86740a56073b 341 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 342 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 343 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 344 *
AnnaBridge 143:86740a56073b 345 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 346
AnnaBridge 143:86740a56073b 347 */
AnnaBridge 143:86740a56073b 348 static __INLINE uint8_t bds_sfloat_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 349 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 350 sfloat_t * p_decoded_val)
AnnaBridge 143:86740a56073b 351 {
AnnaBridge 143:86740a56073b 352
AnnaBridge 143:86740a56073b 353 p_decoded_val->exponent = 0;
AnnaBridge 143:86740a56073b 354 bds_uint16_decode(len, p_encoded_data, (uint16_t*)&p_decoded_val->mantissa);
AnnaBridge 143:86740a56073b 355 p_decoded_val->exponent = (uint8_t)((p_decoded_val->mantissa & 0xF000) >> 12);
AnnaBridge 143:86740a56073b 356 p_decoded_val->mantissa &= 0x0FFF;
AnnaBridge 143:86740a56073b 357 return len;
AnnaBridge 143:86740a56073b 358 }
AnnaBridge 143:86740a56073b 359
AnnaBridge 143:86740a56073b 360
AnnaBridge 143:86740a56073b 361 /**@brief Function for decoding a uint8_array value.
AnnaBridge 143:86740a56073b 362 *
AnnaBridge 143:86740a56073b 363 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 364 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 365 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 366 *
AnnaBridge 143:86740a56073b 367 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 368 */
AnnaBridge 143:86740a56073b 369 static __INLINE uint8_t bds_uint8_array_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 370 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 371 uint8_array_t * p_decoded_val)
AnnaBridge 143:86740a56073b 372 {
AnnaBridge 143:86740a56073b 373 memcpy(p_decoded_val->p_data, p_encoded_data, len);
AnnaBridge 143:86740a56073b 374 p_decoded_val->size = len;
AnnaBridge 143:86740a56073b 375 return p_decoded_val->size;
AnnaBridge 143:86740a56073b 376 }
AnnaBridge 143:86740a56073b 377
AnnaBridge 143:86740a56073b 378
AnnaBridge 143:86740a56073b 379 /**@brief Function for decoding a utf8_str value.
AnnaBridge 143:86740a56073b 380 *
AnnaBridge 143:86740a56073b 381 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 382 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 383 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 384 *
AnnaBridge 143:86740a56073b 385 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 386 */
AnnaBridge 143:86740a56073b 387 static __INLINE uint8_t bds_ble_srv_utf8_str_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 388 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 389 ble_srv_utf8_str_t * p_decoded_val)
AnnaBridge 143:86740a56073b 390 {
AnnaBridge 143:86740a56073b 391 p_decoded_val->p_str = (uint8_t*)p_encoded_data;
AnnaBridge 143:86740a56073b 392 p_decoded_val->length = len;
AnnaBridge 143:86740a56073b 393 return p_decoded_val->length;
AnnaBridge 143:86740a56073b 394 }
AnnaBridge 143:86740a56073b 395
AnnaBridge 143:86740a56073b 396
AnnaBridge 143:86740a56073b 397 /**@brief Function for decoding a regcertdatalist value.
AnnaBridge 143:86740a56073b 398 *
AnnaBridge 143:86740a56073b 399 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 400 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 401 * @param[in] p_decoded_val pointer to the decoded value
AnnaBridge 143:86740a56073b 402 *
AnnaBridge 143:86740a56073b 403 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 404 */
AnnaBridge 143:86740a56073b 405 static __INLINE uint8_t bds_regcertdatalist_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 406 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 407 regcertdatalist_t * p_decoded_val)
AnnaBridge 143:86740a56073b 408 {
AnnaBridge 143:86740a56073b 409 memcpy(p_decoded_val->p_list, p_encoded_data, len);
AnnaBridge 143:86740a56073b 410 p_decoded_val->list_len = len;
AnnaBridge 143:86740a56073b 411 return p_decoded_val->list_len;
AnnaBridge 143:86740a56073b 412 }
AnnaBridge 143:86740a56073b 413
AnnaBridge 143:86740a56073b 414
AnnaBridge 143:86740a56073b 415 /**@brief Function for decoding a date_time value.
AnnaBridge 143:86740a56073b 416 *
AnnaBridge 143:86740a56073b 417 * @param[in] len length of the field to be decoded.
AnnaBridge 143:86740a56073b 418 * @param[in] p_encoded_data Buffer where the encoded data is stored.
AnnaBridge 143:86740a56073b 419 * @param[in] p_date_time pointer to the decoded value
AnnaBridge 143:86740a56073b 420 *
AnnaBridge 143:86740a56073b 421 * @return length of the decoded field.
AnnaBridge 143:86740a56073b 422 */
AnnaBridge 143:86740a56073b 423 static __INLINE uint8_t bds_ble_date_time_decode(const uint8_t len,
AnnaBridge 143:86740a56073b 424 const uint8_t * p_encoded_data,
AnnaBridge 143:86740a56073b 425 ble_date_time_t * p_date_time)
AnnaBridge 143:86740a56073b 426 {
AnnaBridge 143:86740a56073b 427 UNUSED_VARIABLE(len);
AnnaBridge 143:86740a56073b 428 uint8_t pos = bds_uint16_decode(len, &p_encoded_data[0], &p_date_time->year);
AnnaBridge 143:86740a56073b 429 p_date_time->month = p_encoded_data[pos++];
AnnaBridge 143:86740a56073b 430 p_date_time->day = p_encoded_data[pos++];
AnnaBridge 143:86740a56073b 431 p_date_time->hours = p_encoded_data[pos++];
AnnaBridge 143:86740a56073b 432 p_date_time->minutes = p_encoded_data[pos++];
AnnaBridge 143:86740a56073b 433 p_date_time->seconds = p_encoded_data[pos++];
AnnaBridge 143:86740a56073b 434
AnnaBridge 143:86740a56073b 435 return pos;
AnnaBridge 143:86740a56073b 436 }
AnnaBridge 143:86740a56073b 437
AnnaBridge 143:86740a56073b 438 #endif // APP_UTIL_BDS_H__
AnnaBridge 143:86740a56073b 439
AnnaBridge 143:86740a56073b 440 /** @} */