1*a36ca8dcSMatthias Ringwald /* 2*a36ca8dcSMatthias Ringwald * Copyright (C) 2024 BlueKitchen GmbH 3*a36ca8dcSMatthias Ringwald * 4*a36ca8dcSMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*a36ca8dcSMatthias Ringwald * modification, are permitted provided that the following conditions 6*a36ca8dcSMatthias Ringwald * are met: 7*a36ca8dcSMatthias Ringwald * 8*a36ca8dcSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*a36ca8dcSMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*a36ca8dcSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*a36ca8dcSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*a36ca8dcSMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*a36ca8dcSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*a36ca8dcSMatthias Ringwald * contributors may be used to endorse or promote products derived 15*a36ca8dcSMatthias Ringwald * from this software without specific prior written permission. 16*a36ca8dcSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*a36ca8dcSMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*a36ca8dcSMatthias Ringwald * monetary gain. 19*a36ca8dcSMatthias Ringwald * 20*a36ca8dcSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*a36ca8dcSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*a36ca8dcSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*a36ca8dcSMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24*a36ca8dcSMatthias Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*a36ca8dcSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*a36ca8dcSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*a36ca8dcSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*a36ca8dcSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*a36ca8dcSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*a36ca8dcSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*a36ca8dcSMatthias Ringwald * SUCH DAMAGE. 32*a36ca8dcSMatthias Ringwald * 33*a36ca8dcSMatthias Ringwald * Please inquire about commercial licensing options at 34*a36ca8dcSMatthias Ringwald * [email protected] 35*a36ca8dcSMatthias Ringwald * 36*a36ca8dcSMatthias Ringwald */ 37*a36ca8dcSMatthias Ringwald 38*a36ca8dcSMatthias Ringwald /** 39*a36ca8dcSMatthias Ringwald * @brief TODO 40*a36ca8dcSMatthias Ringwald */ 41*a36ca8dcSMatthias Ringwald 42*a36ca8dcSMatthias Ringwald #ifndef BTSTACK_LTV_BUILDER_H 43*a36ca8dcSMatthias Ringwald #define BTSTACK_LTV_BUILDER_H 44*a36ca8dcSMatthias Ringwald 45*a36ca8dcSMatthias Ringwald #include <stdint.h> 46*a36ca8dcSMatthias Ringwald 47*a36ca8dcSMatthias Ringwald #if defined __cplusplus 48*a36ca8dcSMatthias Ringwald extern "C" { 49*a36ca8dcSMatthias Ringwald #endif 50*a36ca8dcSMatthias Ringwald 51*a36ca8dcSMatthias Ringwald 52*a36ca8dcSMatthias Ringwald /* API_START */ 53*a36ca8dcSMatthias Ringwald 54*a36ca8dcSMatthias Ringwald typedef struct { 55*a36ca8dcSMatthias Ringwald uint8_t * buffer; 56*a36ca8dcSMatthias Ringwald uint16_t size; 57*a36ca8dcSMatthias Ringwald uint16_t len_pos; 58*a36ca8dcSMatthias Ringwald uint16_t write_pos; 59*a36ca8dcSMatthias Ringwald } btstack_ltv_builder_context_t; 60*a36ca8dcSMatthias Ringwald 61*a36ca8dcSMatthias Ringwald /** 62*a36ca8dcSMatthias Ringwald * @brief Initialize Length/Tag/Value builder with buffer and size for 8-bit tag and length fields 63*a36ca8dcSMatthias Ringwald * 64*a36ca8dcSMatthias Ringwald * @param context 65*a36ca8dcSMatthias Ringwald * @param buffer 66*a36ca8dcSMatthias Ringwald * @param size 67*a36ca8dcSMatthias Ringwald */ 68*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_init(btstack_ltv_builder_context_t * context, uint8_t * buffer, uint16_t size); 69*a36ca8dcSMatthias Ringwald 70*a36ca8dcSMatthias Ringwald /** 71*a36ca8dcSMatthias Ringwald * @brief Query remaining space in buffer 72*a36ca8dcSMatthias Ringwald * 73*a36ca8dcSMatthias Ringwald * @param context 74*a36ca8dcSMatthias Ringwald * @return number of bytes that can be added 75*a36ca8dcSMatthias Ringwald */ 76*a36ca8dcSMatthias Ringwald uint16_t btstack_ltv_builder_remaining_space(btstack_ltv_builder_context_t * context); 77*a36ca8dcSMatthias Ringwald 78*a36ca8dcSMatthias Ringwald /** 79*a36ca8dcSMatthias Ringwald * @brief Get constructed event length 80*a36ca8dcSMatthias Ringwald * @param context 81*a36ca8dcSMatthias Ringwald * @return number of bytes in event 82*a36ca8dcSMatthias Ringwald */ 83*a36ca8dcSMatthias Ringwald uint16_t btstack_ltv_builder_get_length(btstack_ltv_builder_context_t * context); 84*a36ca8dcSMatthias Ringwald 85*a36ca8dcSMatthias Ringwald /** 86*a36ca8dcSMatthias Ringwald * @brief Add tag 87*a36ca8dcSMatthias Ringwald * @param context 88*a36ca8dcSMatthias Ringwald * @return number of bytes in event 89*a36ca8dcSMatthias Ringwald */ 90*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_add_tag(btstack_ltv_builder_context_t * context, uint8_t tag); 91*a36ca8dcSMatthias Ringwald 92*a36ca8dcSMatthias Ringwald /** 93*a36ca8dcSMatthias Ringwald * @bbrief Add uint8_t to current tag 94*a36ca8dcSMatthias Ringwald * @param context 95*a36ca8dcSMatthias Ringwald * @param value 96*a36ca8dcSMatthias Ringwald */ 97*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_add_08(btstack_ltv_builder_context_t * context, uint8_t value); 98*a36ca8dcSMatthias Ringwald 99*a36ca8dcSMatthias Ringwald /** 100*a36ca8dcSMatthias Ringwald * @bbrief Add uint16_t value to current tag 101*a36ca8dcSMatthias Ringwald * @param context 102*a36ca8dcSMatthias Ringwald * @param value 103*a36ca8dcSMatthias Ringwald */ 104*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_add_little_endian_16(btstack_ltv_builder_context_t * context, uint16_t value); 105*a36ca8dcSMatthias Ringwald 106*a36ca8dcSMatthias Ringwald /** 107*a36ca8dcSMatthias Ringwald * @bbrief Add 24 bit from uint32_t byte to current tag 108*a36ca8dcSMatthias Ringwald * @param context 109*a36ca8dcSMatthias Ringwald * @param value 110*a36ca8dcSMatthias Ringwald */ 111*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_add_little_endian_24(btstack_ltv_builder_context_t * context, uint32_t value); 112*a36ca8dcSMatthias Ringwald 113*a36ca8dcSMatthias Ringwald /** 114*a36ca8dcSMatthias Ringwald * @bbrief Add uint32_t to current tag 115*a36ca8dcSMatthias Ringwald * @param context 116*a36ca8dcSMatthias Ringwald * @param value 117*a36ca8dcSMatthias Ringwald */ 118*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_add_little_endian_32(btstack_ltv_builder_context_t * context, uint32_t value); 119*a36ca8dcSMatthias Ringwald 120*a36ca8dcSMatthias Ringwald /** 121*a36ca8dcSMatthias Ringwald * @bbrief Add byte sequence to current tag 122*a36ca8dcSMatthias Ringwald * @param context 123*a36ca8dcSMatthias Ringwald * @param value 124*a36ca8dcSMatthias Ringwald */ 125*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_add_bytes(btstack_ltv_builder_context_t * context, const uint8_t * data, uint16_t length); 126*a36ca8dcSMatthias Ringwald 127*a36ca8dcSMatthias Ringwald /** 128*a36ca8dcSMatthias Ringwald * @bbrief Add string to current tag 129*a36ca8dcSMatthias Ringwald * @param context 130*a36ca8dcSMatthias Ringwald * @param value 131*a36ca8dcSMatthias Ringwald */ 132*a36ca8dcSMatthias Ringwald void btstack_ltv_builder_add_string(btstack_ltv_builder_context_t * context, const char * text); 133*a36ca8dcSMatthias Ringwald 134*a36ca8dcSMatthias Ringwald #if defined __cplusplus 135*a36ca8dcSMatthias Ringwald } 136*a36ca8dcSMatthias Ringwald #endif 137*a36ca8dcSMatthias Ringwald #endif // BTSTACK_LTV_BUILDER_H 138