gjhn

Dependents:   BLE_GENERALE

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
Andrea Palmieri
Date:
Thu Jun 09 17:16:36 2016 +0200
Revision:
236:2a73f3a97452
Parent:
175:925e455f5e45
Child:
242:058b2e731adc
Child:
251:86df2c289e7c
Fix issue on ADV payload de-allocation

Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 132:51056160fa4a 1 /* mbed Microcontroller Library
Wolfgang Betz 132:51056160fa4a 2 * Copyright (c) 2006-2013 ARM Limited
Wolfgang Betz 132:51056160fa4a 3 *
Wolfgang Betz 132:51056160fa4a 4 * Licensed under the Apache License, Version 2.0 (the "License");
Wolfgang Betz 132:51056160fa4a 5 * you may not use this file except in compliance with the License.
Wolfgang Betz 132:51056160fa4a 6 * You may obtain a copy of the License at
Wolfgang Betz 132:51056160fa4a 7 *
Wolfgang Betz 132:51056160fa4a 8 * http://www.apache.org/licenses/LICENSE-2.0
Wolfgang Betz 132:51056160fa4a 9 *
Wolfgang Betz 132:51056160fa4a 10 * Unless required by applicable law or agreed to in writing, software
Wolfgang Betz 132:51056160fa4a 11 * distributed under the License is distributed on an "AS IS" BASIS,
Wolfgang Betz 132:51056160fa4a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Wolfgang Betz 132:51056160fa4a 13 * See the License for the specific language governing permissions and
Wolfgang Betz 132:51056160fa4a 14 * limitations under the License.
Wolfgang Betz 132:51056160fa4a 15 */
Wolfgang Betz 132:51056160fa4a 16
Wolfgang Betz 144:bdf5e8432131 17 #include "mbed-drivers/mbed.h"
Wolfgang Betz 175:925e455f5e45 18 #include "debug.h"
Wolfgang Betz 132:51056160fa4a 19
Wolfgang Betz 132:51056160fa4a 20 #ifndef __PAYLOAD_H__
Wolfgang Betz 132:51056160fa4a 21 #define __PAYLOAD_H__
Wolfgang Betz 132:51056160fa4a 22
Wolfgang Betz 132:51056160fa4a 23 class UnitPayload
Wolfgang Betz 132:51056160fa4a 24 {
Wolfgang Betz 132:51056160fa4a 25 public:
Wolfgang Betz 132:51056160fa4a 26 uint8_t length;
Wolfgang Betz 132:51056160fa4a 27 uint8_t id;
Wolfgang Betz 132:51056160fa4a 28 uint8_t *data;
Wolfgang Betz 132:51056160fa4a 29 uint8_t *idptr;
Wolfgang Betz 132:51056160fa4a 30
Wolfgang Betz 132:51056160fa4a 31
Wolfgang Betz 132:51056160fa4a 32
Wolfgang Betz 132:51056160fa4a 33 void set_length(uint8_t l) {
Wolfgang Betz 132:51056160fa4a 34 length=l;
Wolfgang Betz 132:51056160fa4a 35 }
Wolfgang Betz 132:51056160fa4a 36
Wolfgang Betz 132:51056160fa4a 37 void set_id(uint8_t i) {
Wolfgang Betz 132:51056160fa4a 38 id=i;
Wolfgang Betz 132:51056160fa4a 39 }
Wolfgang Betz 132:51056160fa4a 40
Wolfgang Betz 132:51056160fa4a 41 void set_data(uint8_t* data1) {
Wolfgang Betz 132:51056160fa4a 42 for(int j=0;j<length;j++)
Wolfgang Betz 132:51056160fa4a 43 {
Wolfgang Betz 132:51056160fa4a 44 data[j]=data1[j];
Wolfgang Betz 132:51056160fa4a 45 }
Wolfgang Betz 132:51056160fa4a 46 }
Wolfgang Betz 132:51056160fa4a 47
Wolfgang Betz 132:51056160fa4a 48 uint8_t get_length() {
Wolfgang Betz 132:51056160fa4a 49 return length;
Wolfgang Betz 132:51056160fa4a 50 }
Wolfgang Betz 132:51056160fa4a 51
Wolfgang Betz 132:51056160fa4a 52 uint8_t get_id() {
Wolfgang Betz 132:51056160fa4a 53 return id;
Wolfgang Betz 132:51056160fa4a 54 }
Wolfgang Betz 132:51056160fa4a 55
Wolfgang Betz 132:51056160fa4a 56 uint8_t* get_data() {
Wolfgang Betz 132:51056160fa4a 57 return data;
Wolfgang Betz 132:51056160fa4a 58 }
Wolfgang Betz 132:51056160fa4a 59
Wolfgang Betz 132:51056160fa4a 60 };
Wolfgang Betz 132:51056160fa4a 61
Wolfgang Betz 132:51056160fa4a 62 class Payload {
Wolfgang Betz 132:51056160fa4a 63 UnitPayload *payload;
Wolfgang Betz 132:51056160fa4a 64 int stringLength;
Wolfgang Betz 132:51056160fa4a 65 int payloadUnitCount;
Wolfgang Betz 132:51056160fa4a 66
Wolfgang Betz 132:51056160fa4a 67 public:
Wolfgang Betz 132:51056160fa4a 68 Payload(const uint8_t *tokenString, uint8_t string_ength);
Wolfgang Betz 132:51056160fa4a 69 Payload();
Andrea Palmieri 236:2a73f3a97452 70 ~Payload();
Wolfgang Betz 132:51056160fa4a 71 uint8_t getPayloadUnitCount();
Wolfgang Betz 132:51056160fa4a 72
Wolfgang Betz 132:51056160fa4a 73 uint8_t getIDAtIndex(int index);
Wolfgang Betz 132:51056160fa4a 74 uint8_t getLengthAtIndex(int index);
Wolfgang Betz 132:51056160fa4a 75 uint8_t* getDataAtIndex(int index);
Wolfgang Betz 132:51056160fa4a 76 int8_t getInt8AtIndex(int index);
Wolfgang Betz 132:51056160fa4a 77 uint16_t getUint16AtIndex(int index);
Wolfgang Betz 132:51056160fa4a 78 uint8_t* getSerializedAdDataAtIndex(int index);
Wolfgang Betz 132:51056160fa4a 79 };
Wolfgang Betz 132:51056160fa4a 80
Wolfgang Betz 132:51056160fa4a 81
Wolfgang Betz 132:51056160fa4a 82 class PayloadUnit {
Wolfgang Betz 132:51056160fa4a 83 private:
Wolfgang Betz 132:51056160fa4a 84 uint8_t* lenPtr;
Wolfgang Betz 132:51056160fa4a 85 uint8_t* adTypePtr;
Wolfgang Betz 132:51056160fa4a 86 uint8_t* dataPtr;
Wolfgang Betz 132:51056160fa4a 87
Wolfgang Betz 132:51056160fa4a 88 public:
Wolfgang Betz 132:51056160fa4a 89 PayloadUnit() {
Wolfgang Betz 132:51056160fa4a 90 lenPtr = NULL;
Wolfgang Betz 132:51056160fa4a 91 adTypePtr = NULL;
Wolfgang Betz 132:51056160fa4a 92 dataPtr = NULL;
Wolfgang Betz 132:51056160fa4a 93 }
Wolfgang Betz 132:51056160fa4a 94
Wolfgang Betz 132:51056160fa4a 95 PayloadUnit(uint8_t *len, uint8_t *adType, uint8_t* data) {
Wolfgang Betz 132:51056160fa4a 96 lenPtr = len;
Wolfgang Betz 132:51056160fa4a 97 adTypePtr = adType;
Wolfgang Betz 132:51056160fa4a 98 dataPtr = data;
Wolfgang Betz 132:51056160fa4a 99 }
Wolfgang Betz 132:51056160fa4a 100
Wolfgang Betz 132:51056160fa4a 101 void setLenPtr(uint8_t *len) {
Wolfgang Betz 132:51056160fa4a 102 lenPtr = len;
Wolfgang Betz 132:51056160fa4a 103 }
Wolfgang Betz 132:51056160fa4a 104
Wolfgang Betz 132:51056160fa4a 105 void setAdTypePtr(uint8_t *adType) {
Wolfgang Betz 132:51056160fa4a 106 adTypePtr = adType;
Wolfgang Betz 132:51056160fa4a 107 }
Wolfgang Betz 132:51056160fa4a 108
Wolfgang Betz 132:51056160fa4a 109 void setDataPtr(uint8_t *data) {
Wolfgang Betz 132:51056160fa4a 110 dataPtr = data;
Wolfgang Betz 132:51056160fa4a 111 }
Wolfgang Betz 132:51056160fa4a 112
Wolfgang Betz 132:51056160fa4a 113 uint8_t* getLenPtr() {
Wolfgang Betz 132:51056160fa4a 114 return lenPtr;
Wolfgang Betz 132:51056160fa4a 115 }
Wolfgang Betz 132:51056160fa4a 116
Wolfgang Betz 132:51056160fa4a 117 uint8_t* getAdTypePtr() {
Wolfgang Betz 132:51056160fa4a 118 return adTypePtr;
Wolfgang Betz 132:51056160fa4a 119 }
Wolfgang Betz 132:51056160fa4a 120
Wolfgang Betz 132:51056160fa4a 121 uint8_t* getDataPtr() {
Wolfgang Betz 132:51056160fa4a 122 return dataPtr;
Wolfgang Betz 132:51056160fa4a 123 }
Wolfgang Betz 132:51056160fa4a 124
Wolfgang Betz 132:51056160fa4a 125 void printDataAsHex() {
Wolfgang Betz 132:51056160fa4a 126 int i = 0;
Wolfgang Betz 175:925e455f5e45 127 PRINTF("AdData=");
Wolfgang Betz 132:51056160fa4a 128 for(i=0; i<*lenPtr-1; i++) {
Wolfgang Betz 175:925e455f5e45 129 PRINTF("0x%x ", dataPtr[i]);
Wolfgang Betz 132:51056160fa4a 130 }
Wolfgang Betz 175:925e455f5e45 131 PRINTF("\n");
Wolfgang Betz 132:51056160fa4a 132 }
Wolfgang Betz 132:51056160fa4a 133
Wolfgang Betz 132:51056160fa4a 134 void printDataAsString() {
Wolfgang Betz 132:51056160fa4a 135 int i = 0;
Wolfgang Betz 175:925e455f5e45 136 PRINTF("AdData=");
Wolfgang Betz 132:51056160fa4a 137 for(i=0; i<*lenPtr; i++) {
Wolfgang Betz 175:925e455f5e45 138 PRINTF("%c", dataPtr[i]);
Wolfgang Betz 132:51056160fa4a 139 }
Wolfgang Betz 175:925e455f5e45 140 PRINTF("\n");
Wolfgang Betz 132:51056160fa4a 141 }
Wolfgang Betz 132:51056160fa4a 142
Wolfgang Betz 132:51056160fa4a 143 };
Wolfgang Betz 132:51056160fa4a 144
Wolfgang Betz 132:51056160fa4a 145 class PayloadPtr {
Wolfgang Betz 132:51056160fa4a 146 private:
Wolfgang Betz 132:51056160fa4a 147 PayloadUnit *unit;
Wolfgang Betz 132:51056160fa4a 148 int payloadUnitCount;
Wolfgang Betz 132:51056160fa4a 149 public:
Wolfgang Betz 132:51056160fa4a 150 PayloadPtr(const uint8_t *tokenString, uint8_t string_ength) {
Wolfgang Betz 132:51056160fa4a 151 // initialize private data members
Wolfgang Betz 132:51056160fa4a 152 int stringLength = string_ength;
Wolfgang Betz 132:51056160fa4a 153 payloadUnitCount = 0;
Wolfgang Betz 132:51056160fa4a 154
Wolfgang Betz 132:51056160fa4a 155 int index = 0;
Wolfgang Betz 132:51056160fa4a 156 while(index!=stringLength) {
Wolfgang Betz 132:51056160fa4a 157 int len=tokenString[index];
Wolfgang Betz 132:51056160fa4a 158 index=index+1+len;
Wolfgang Betz 132:51056160fa4a 159 payloadUnitCount++;
Wolfgang Betz 132:51056160fa4a 160 }
Wolfgang Betz 132:51056160fa4a 161
Wolfgang Betz 132:51056160fa4a 162 // allocate memory to unit
Wolfgang Betz 132:51056160fa4a 163 unit = new PayloadUnit[payloadUnitCount];
Wolfgang Betz 132:51056160fa4a 164 int i = 0;
Wolfgang Betz 132:51056160fa4a 165 int nextUnitOffset = 0;
Wolfgang Betz 132:51056160fa4a 166
Wolfgang Betz 132:51056160fa4a 167 while(i<payloadUnitCount) {
Wolfgang Betz 132:51056160fa4a 168 unit[i].setLenPtr((uint8_t *)tokenString+nextUnitOffset);
Wolfgang Betz 132:51056160fa4a 169 unit[i].setAdTypePtr((uint8_t *)tokenString+nextUnitOffset+1);
Wolfgang Betz 132:51056160fa4a 170 unit[i].setDataPtr((uint8_t *)tokenString+nextUnitOffset+2);
Wolfgang Betz 132:51056160fa4a 171
Wolfgang Betz 132:51056160fa4a 172 nextUnitOffset += *unit[i].getLenPtr()+1;
Wolfgang Betz 132:51056160fa4a 173 i++;
Wolfgang Betz 132:51056160fa4a 174
Wolfgang Betz 132:51056160fa4a 175 }
Wolfgang Betz 132:51056160fa4a 176 }
Wolfgang Betz 132:51056160fa4a 177
Wolfgang Betz 132:51056160fa4a 178 PayloadUnit getUnitAtIndex(int index) {
Wolfgang Betz 132:51056160fa4a 179 return unit[index];
Wolfgang Betz 132:51056160fa4a 180 }
Wolfgang Betz 132:51056160fa4a 181
Wolfgang Betz 132:51056160fa4a 182 int getPayloadUnitCount() { return payloadUnitCount; }
Wolfgang Betz 132:51056160fa4a 183
Andrea Palmieri 236:2a73f3a97452 184 ~PayloadPtr() {
Andrea Palmieri 236:2a73f3a97452 185 if(unit) delete[] unit;
Andrea Palmieri 236:2a73f3a97452 186
Andrea Palmieri 236:2a73f3a97452 187 unit = NULL;
Andrea Palmieri 236:2a73f3a97452 188 }
Wolfgang Betz 132:51056160fa4a 189 };
Wolfgang Betz 132:51056160fa4a 190
Wolfgang Betz 132:51056160fa4a 191 #endif // __PAYLOAD_H__