User | Revision | Line number | New contents of line |
jinu |
0:6ba9b94b8997
|
1
|
/* Copyright (c) Nordic Semiconductor ASA
|
jinu |
0:6ba9b94b8997
|
2
|
* All rights reserved.
|
jinu |
0:6ba9b94b8997
|
3
|
*
|
jinu |
0:6ba9b94b8997
|
4
|
* Redistribution and use in source and binary forms, with or without modification,
|
jinu |
0:6ba9b94b8997
|
5
|
* are permitted provided that the following conditions are met:
|
jinu |
0:6ba9b94b8997
|
6
|
*
|
jinu |
0:6ba9b94b8997
|
7
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
jinu |
0:6ba9b94b8997
|
8
|
* list of conditions and the following disclaimer.
|
jinu |
0:6ba9b94b8997
|
9
|
*
|
jinu |
0:6ba9b94b8997
|
10
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this
|
jinu |
0:6ba9b94b8997
|
11
|
* list of conditions and the following disclaimer in the documentation and/or
|
jinu |
0:6ba9b94b8997
|
12
|
* other materials provided with the distribution.
|
jinu |
0:6ba9b94b8997
|
13
|
*
|
jinu |
0:6ba9b94b8997
|
14
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of other
|
jinu |
0:6ba9b94b8997
|
15
|
* contributors to this software may be used to endorse or promote products
|
jinu |
0:6ba9b94b8997
|
16
|
* derived from this software without specific prior written permission.
|
jinu |
0:6ba9b94b8997
|
17
|
*
|
jinu |
0:6ba9b94b8997
|
18
|
* 4. This software must only be used in a processor manufactured by Nordic
|
jinu |
0:6ba9b94b8997
|
19
|
* Semiconductor ASA, or in a processor manufactured by a third party that
|
jinu |
0:6ba9b94b8997
|
20
|
* is used in combination with a processor manufactured by Nordic Semiconductor.
|
jinu |
0:6ba9b94b8997
|
21
|
*
|
jinu |
0:6ba9b94b8997
|
22
|
*
|
jinu |
0:6ba9b94b8997
|
23
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
jinu |
0:6ba9b94b8997
|
24
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
jinu |
0:6ba9b94b8997
|
25
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
jinu |
0:6ba9b94b8997
|
26
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
jinu |
0:6ba9b94b8997
|
27
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
jinu |
0:6ba9b94b8997
|
28
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
jinu |
0:6ba9b94b8997
|
29
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
jinu |
0:6ba9b94b8997
|
30
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
jinu |
0:6ba9b94b8997
|
31
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
jinu |
0:6ba9b94b8997
|
32
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
jinu |
0:6ba9b94b8997
|
33
|
*/
|
jinu |
0:6ba9b94b8997
|
34
|
#include "ble_serialization.h"
|
jinu |
0:6ba9b94b8997
|
35
|
#include "nrf_error.h"
|
jinu |
0:6ba9b94b8997
|
36
|
#include "app_util.h"
|
jinu |
0:6ba9b94b8997
|
37
|
#include <stddef.h>
|
jinu |
0:6ba9b94b8997
|
38
|
#include <string.h>
|
jinu |
0:6ba9b94b8997
|
39
|
|
jinu |
0:6ba9b94b8997
|
40
|
uint32_t ser_ble_cmd_rsp_status_code_enc(uint8_t op_code,
|
jinu |
0:6ba9b94b8997
|
41
|
uint32_t command_status,
|
jinu |
0:6ba9b94b8997
|
42
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
43
|
uint32_t * const p_buf_len)
|
jinu |
0:6ba9b94b8997
|
44
|
{
|
jinu |
0:6ba9b94b8997
|
45
|
SER_ASSERT_NOT_NULL(p_buf);
|
jinu |
0:6ba9b94b8997
|
46
|
SER_ASSERT_NOT_NULL(p_buf_len);
|
jinu |
0:6ba9b94b8997
|
47
|
uint32_t index = 0;
|
jinu |
0:6ba9b94b8997
|
48
|
|
jinu |
0:6ba9b94b8997
|
49
|
SER_ASSERT_LENGTH_LEQ(SER_CMD_RSP_HEADER_SIZE, *p_buf_len);
|
jinu |
0:6ba9b94b8997
|
50
|
|
jinu |
0:6ba9b94b8997
|
51
|
//Encode Op Code.
|
jinu |
0:6ba9b94b8997
|
52
|
p_buf[index++] = op_code;
|
jinu |
0:6ba9b94b8997
|
53
|
|
jinu |
0:6ba9b94b8997
|
54
|
//Encode Status.
|
jinu |
0:6ba9b94b8997
|
55
|
index += uint32_encode(command_status, &(p_buf[index]));
|
jinu |
0:6ba9b94b8997
|
56
|
*p_buf_len = index;
|
jinu |
0:6ba9b94b8997
|
57
|
|
jinu |
0:6ba9b94b8997
|
58
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
59
|
}
|
jinu |
0:6ba9b94b8997
|
60
|
|
jinu |
0:6ba9b94b8997
|
61
|
|
jinu |
0:6ba9b94b8997
|
62
|
uint32_t ser_ble_cmd_rsp_result_code_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
63
|
uint32_t * const p_pos,
|
jinu |
0:6ba9b94b8997
|
64
|
uint32_t packet_len,
|
jinu |
0:6ba9b94b8997
|
65
|
uint8_t op_code,
|
jinu |
0:6ba9b94b8997
|
66
|
uint32_t * const p_result_code)
|
jinu |
0:6ba9b94b8997
|
67
|
{
|
jinu |
0:6ba9b94b8997
|
68
|
SER_ASSERT_NOT_NULL(p_buf);
|
jinu |
0:6ba9b94b8997
|
69
|
SER_ASSERT_NOT_NULL(p_pos);
|
jinu |
0:6ba9b94b8997
|
70
|
SER_ASSERT_NOT_NULL(p_result_code);
|
jinu |
0:6ba9b94b8997
|
71
|
|
jinu |
0:6ba9b94b8997
|
72
|
if (packet_len < SER_CMD_RSP_HEADER_SIZE)
|
jinu |
0:6ba9b94b8997
|
73
|
{
|
jinu |
0:6ba9b94b8997
|
74
|
return NRF_ERROR_DATA_SIZE;
|
jinu |
0:6ba9b94b8997
|
75
|
}
|
jinu |
0:6ba9b94b8997
|
76
|
|
jinu |
0:6ba9b94b8997
|
77
|
if (p_buf[(*p_pos)] != op_code)
|
jinu |
0:6ba9b94b8997
|
78
|
{
|
jinu |
0:6ba9b94b8997
|
79
|
return NRF_ERROR_INVALID_DATA;
|
jinu |
0:6ba9b94b8997
|
80
|
}
|
jinu |
0:6ba9b94b8997
|
81
|
|
jinu |
0:6ba9b94b8997
|
82
|
*p_result_code = uint32_decode(&(p_buf[(*p_pos) + SER_POS_RSP_STATUS_CODE]));
|
jinu |
0:6ba9b94b8997
|
83
|
*p_pos += SER_CMD_RSP_HEADER_SIZE;
|
jinu |
0:6ba9b94b8997
|
84
|
|
jinu |
0:6ba9b94b8997
|
85
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
86
|
}
|
jinu |
0:6ba9b94b8997
|
87
|
|
jinu |
0:6ba9b94b8997
|
88
|
|
jinu |
0:6ba9b94b8997
|
89
|
uint32_t ser_ble_cmd_rsp_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
90
|
uint32_t packet_len,
|
jinu |
0:6ba9b94b8997
|
91
|
uint8_t op_code,
|
jinu |
0:6ba9b94b8997
|
92
|
uint32_t * const p_result_code)
|
jinu |
0:6ba9b94b8997
|
93
|
{
|
jinu |
0:6ba9b94b8997
|
94
|
uint32_t index = 0;
|
jinu |
0:6ba9b94b8997
|
95
|
uint32_t result_code = ser_ble_cmd_rsp_result_code_dec(p_buf, &index, packet_len, op_code,
|
jinu |
0:6ba9b94b8997
|
96
|
p_result_code);
|
jinu |
0:6ba9b94b8997
|
97
|
|
jinu |
0:6ba9b94b8997
|
98
|
if (result_code != NRF_SUCCESS)
|
jinu |
0:6ba9b94b8997
|
99
|
{
|
jinu |
0:6ba9b94b8997
|
100
|
return result_code;
|
jinu |
0:6ba9b94b8997
|
101
|
}
|
jinu |
0:6ba9b94b8997
|
102
|
|
jinu |
0:6ba9b94b8997
|
103
|
if (index != packet_len)
|
jinu |
0:6ba9b94b8997
|
104
|
{
|
jinu |
0:6ba9b94b8997
|
105
|
return NRF_ERROR_DATA_SIZE;
|
jinu |
0:6ba9b94b8997
|
106
|
}
|
jinu |
0:6ba9b94b8997
|
107
|
|
jinu |
0:6ba9b94b8997
|
108
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
109
|
}
|
jinu |
0:6ba9b94b8997
|
110
|
|
jinu |
0:6ba9b94b8997
|
111
|
uint32_t uint32_t_enc(void const * const p_field,
|
jinu |
0:6ba9b94b8997
|
112
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
113
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
114
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
115
|
{
|
jinu |
0:6ba9b94b8997
|
116
|
SER_ASSERT_NOT_NULL(p_buf);
|
jinu |
0:6ba9b94b8997
|
117
|
SER_ASSERT_NOT_NULL(p_field);
|
jinu |
0:6ba9b94b8997
|
118
|
SER_ASSERT_NOT_NULL(p_index);
|
jinu |
0:6ba9b94b8997
|
119
|
|
jinu |
0:6ba9b94b8997
|
120
|
uint32_t * p_uint32 = (uint32_t *)p_field;
|
jinu |
0:6ba9b94b8997
|
121
|
|
jinu |
0:6ba9b94b8997
|
122
|
SER_ASSERT_LENGTH_LEQ(4, buf_len - *p_index);
|
jinu |
0:6ba9b94b8997
|
123
|
|
jinu |
0:6ba9b94b8997
|
124
|
*p_index += uint32_encode(*p_uint32, &p_buf[*p_index]);
|
jinu |
0:6ba9b94b8997
|
125
|
|
jinu |
0:6ba9b94b8997
|
126
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
127
|
}
|
jinu |
0:6ba9b94b8997
|
128
|
|
jinu |
0:6ba9b94b8997
|
129
|
uint32_t uint32_t_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
130
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
131
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
132
|
void * p_field)
|
jinu |
0:6ba9b94b8997
|
133
|
{
|
jinu |
0:6ba9b94b8997
|
134
|
SER_ASSERT_NOT_NULL(p_buf);
|
jinu |
0:6ba9b94b8997
|
135
|
SER_ASSERT_NOT_NULL(p_index);
|
jinu |
0:6ba9b94b8997
|
136
|
SER_ASSERT_NOT_NULL(p_field);
|
jinu |
0:6ba9b94b8997
|
137
|
|
jinu |
0:6ba9b94b8997
|
138
|
uint32_t * p_uint32 = (uint32_t *)p_field;
|
jinu |
0:6ba9b94b8997
|
139
|
|
jinu |
0:6ba9b94b8997
|
140
|
SER_ASSERT_LENGTH_LEQ(4, ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
141
|
|
jinu |
0:6ba9b94b8997
|
142
|
*p_uint32 = uint32_decode(&p_buf[*p_index]);
|
jinu |
0:6ba9b94b8997
|
143
|
*p_index += 4;
|
jinu |
0:6ba9b94b8997
|
144
|
|
jinu |
0:6ba9b94b8997
|
145
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
146
|
}
|
jinu |
0:6ba9b94b8997
|
147
|
|
jinu |
0:6ba9b94b8997
|
148
|
uint32_t uint16_t_enc(const void * const p_field,
|
jinu |
0:6ba9b94b8997
|
149
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
150
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
151
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
152
|
{
|
jinu |
0:6ba9b94b8997
|
153
|
uint16_t * p_u16 = (uint16_t *)p_field;
|
jinu |
0:6ba9b94b8997
|
154
|
|
jinu |
0:6ba9b94b8997
|
155
|
SER_ASSERT_LENGTH_LEQ(2, buf_len - *p_index);
|
jinu |
0:6ba9b94b8997
|
156
|
|
jinu |
0:6ba9b94b8997
|
157
|
*p_index += uint16_encode(*p_u16, &p_buf[*p_index]);
|
jinu |
0:6ba9b94b8997
|
158
|
|
jinu |
0:6ba9b94b8997
|
159
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
160
|
}
|
jinu |
0:6ba9b94b8997
|
161
|
|
jinu |
0:6ba9b94b8997
|
162
|
uint32_t uint16_t_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
163
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
164
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
165
|
void * p_field)
|
jinu |
0:6ba9b94b8997
|
166
|
{
|
jinu |
0:6ba9b94b8997
|
167
|
uint16_t * p_u16 = (uint16_t *)p_field;
|
jinu |
0:6ba9b94b8997
|
168
|
|
jinu |
0:6ba9b94b8997
|
169
|
SER_ASSERT_LENGTH_LEQ(2, ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
170
|
|
jinu |
0:6ba9b94b8997
|
171
|
*p_u16 = uint16_decode(&p_buf[*p_index]);
|
jinu |
0:6ba9b94b8997
|
172
|
*p_index += 2;
|
jinu |
0:6ba9b94b8997
|
173
|
|
jinu |
0:6ba9b94b8997
|
174
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
175
|
}
|
jinu |
0:6ba9b94b8997
|
176
|
|
jinu |
0:6ba9b94b8997
|
177
|
void uint16_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
178
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
179
|
uint32_t * const index,
|
jinu |
0:6ba9b94b8997
|
180
|
uint16_t * const value)
|
jinu |
0:6ba9b94b8997
|
181
|
{
|
jinu |
0:6ba9b94b8997
|
182
|
SER_ASSERT_VOID_RETURN(*index + 2 <= buf_len);
|
jinu |
0:6ba9b94b8997
|
183
|
*value = uint16_decode(&p_buf[*index]);
|
jinu |
0:6ba9b94b8997
|
184
|
*index += 2;
|
jinu |
0:6ba9b94b8997
|
185
|
}
|
jinu |
0:6ba9b94b8997
|
186
|
|
jinu |
0:6ba9b94b8997
|
187
|
uint32_t uint8_t_enc(const void * const p_field,
|
jinu |
0:6ba9b94b8997
|
188
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
189
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
190
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
191
|
{
|
jinu |
0:6ba9b94b8997
|
192
|
SER_ASSERT_LENGTH_LEQ(1, buf_len - *p_index);
|
jinu |
0:6ba9b94b8997
|
193
|
|
jinu |
0:6ba9b94b8997
|
194
|
uint8_t * p_u8 = (uint8_t *)p_field;
|
jinu |
0:6ba9b94b8997
|
195
|
p_buf[*p_index] = *p_u8;
|
jinu |
0:6ba9b94b8997
|
196
|
*p_index += 1;
|
jinu |
0:6ba9b94b8997
|
197
|
|
jinu |
0:6ba9b94b8997
|
198
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
199
|
}
|
jinu |
0:6ba9b94b8997
|
200
|
|
jinu |
0:6ba9b94b8997
|
201
|
uint32_t uint8_t_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
202
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
203
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
204
|
void * p_field)
|
jinu |
0:6ba9b94b8997
|
205
|
{
|
jinu |
0:6ba9b94b8997
|
206
|
uint8_t * p_u8 = (uint8_t *)p_field;
|
jinu |
0:6ba9b94b8997
|
207
|
|
jinu |
0:6ba9b94b8997
|
208
|
SER_ASSERT_LENGTH_LEQ(1, ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
209
|
*p_u8 = p_buf[*p_index];
|
jinu |
0:6ba9b94b8997
|
210
|
*p_index += 1;
|
jinu |
0:6ba9b94b8997
|
211
|
|
jinu |
0:6ba9b94b8997
|
212
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
213
|
}
|
jinu |
0:6ba9b94b8997
|
214
|
|
jinu |
0:6ba9b94b8997
|
215
|
void uint8_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
216
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
217
|
uint32_t * const index,
|
jinu |
0:6ba9b94b8997
|
218
|
uint8_t * const value)
|
jinu |
0:6ba9b94b8997
|
219
|
{
|
jinu |
0:6ba9b94b8997
|
220
|
SER_ASSERT_VOID_RETURN(*index + 1 <= buf_len);
|
jinu |
0:6ba9b94b8997
|
221
|
*value = p_buf[*index];
|
jinu |
0:6ba9b94b8997
|
222
|
*index += 1;
|
jinu |
0:6ba9b94b8997
|
223
|
}
|
jinu |
0:6ba9b94b8997
|
224
|
|
jinu |
0:6ba9b94b8997
|
225
|
|
jinu |
0:6ba9b94b8997
|
226
|
void int8_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
227
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
228
|
uint32_t * const index,
|
jinu |
0:6ba9b94b8997
|
229
|
int8_t * const value)
|
jinu |
0:6ba9b94b8997
|
230
|
{
|
jinu |
0:6ba9b94b8997
|
231
|
SER_ASSERT_VOID_RETURN(*index + 1 <= buf_len);
|
jinu |
0:6ba9b94b8997
|
232
|
*value = p_buf[*index];
|
jinu |
0:6ba9b94b8997
|
233
|
*index += 1;
|
jinu |
0:6ba9b94b8997
|
234
|
}
|
jinu |
0:6ba9b94b8997
|
235
|
|
jinu |
0:6ba9b94b8997
|
236
|
uint32_t len8data_enc(uint8_t const * const p_data,
|
jinu |
0:6ba9b94b8997
|
237
|
uint8_t const dlen,
|
jinu |
0:6ba9b94b8997
|
238
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
239
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
240
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
241
|
{
|
jinu |
0:6ba9b94b8997
|
242
|
uint32_t err_code = NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
243
|
|
jinu |
0:6ba9b94b8997
|
244
|
err_code = uint8_t_enc(&dlen, p_buf, buf_len, p_index);
|
jinu |
0:6ba9b94b8997
|
245
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
246
|
|
jinu |
0:6ba9b94b8997
|
247
|
err_code = buf_enc(p_data, dlen, p_buf, buf_len, p_index);
|
jinu |
0:6ba9b94b8997
|
248
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
249
|
|
jinu |
0:6ba9b94b8997
|
250
|
return err_code;
|
jinu |
0:6ba9b94b8997
|
251
|
}
|
jinu |
0:6ba9b94b8997
|
252
|
|
jinu |
0:6ba9b94b8997
|
253
|
uint32_t len8data_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
254
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
255
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
256
|
uint8_t * * const pp_data,
|
jinu |
0:6ba9b94b8997
|
257
|
uint8_t * const p_len)
|
jinu |
0:6ba9b94b8997
|
258
|
{
|
jinu |
0:6ba9b94b8997
|
259
|
uint32_t err_code = NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
260
|
uint16_t out_buf_len = *p_len;
|
jinu |
0:6ba9b94b8997
|
261
|
|
jinu |
0:6ba9b94b8997
|
262
|
err_code = uint8_t_dec(p_buf, buf_len, p_index, p_len);
|
jinu |
0:6ba9b94b8997
|
263
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
264
|
|
jinu |
0:6ba9b94b8997
|
265
|
err_code = buf_dec(p_buf, buf_len, p_index, pp_data, out_buf_len, *p_len);
|
jinu |
0:6ba9b94b8997
|
266
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
267
|
|
jinu |
0:6ba9b94b8997
|
268
|
return err_code;
|
jinu |
0:6ba9b94b8997
|
269
|
}
|
jinu |
0:6ba9b94b8997
|
270
|
|
jinu |
0:6ba9b94b8997
|
271
|
uint32_t len16data_enc(uint8_t const * const p_data,
|
jinu |
0:6ba9b94b8997
|
272
|
uint16_t const dlen,
|
jinu |
0:6ba9b94b8997
|
273
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
274
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
275
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
276
|
{
|
jinu |
0:6ba9b94b8997
|
277
|
uint32_t err_code = NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
278
|
|
jinu |
0:6ba9b94b8997
|
279
|
err_code = uint16_t_enc(&dlen, p_buf, buf_len, p_index);
|
jinu |
0:6ba9b94b8997
|
280
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
281
|
|
jinu |
0:6ba9b94b8997
|
282
|
err_code = buf_enc(p_data, dlen, p_buf, buf_len, p_index);
|
jinu |
0:6ba9b94b8997
|
283
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
284
|
|
jinu |
0:6ba9b94b8997
|
285
|
return err_code;
|
jinu |
0:6ba9b94b8997
|
286
|
}
|
jinu |
0:6ba9b94b8997
|
287
|
|
jinu |
0:6ba9b94b8997
|
288
|
uint32_t len16data_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
289
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
290
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
291
|
uint8_t * * const pp_data,
|
jinu |
0:6ba9b94b8997
|
292
|
uint16_t * const p_dlen)
|
jinu |
0:6ba9b94b8997
|
293
|
{
|
jinu |
0:6ba9b94b8997
|
294
|
uint32_t err_code = NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
295
|
uint16_t out_buf_len = *p_dlen;
|
jinu |
0:6ba9b94b8997
|
296
|
|
jinu |
0:6ba9b94b8997
|
297
|
err_code = uint16_t_dec(p_buf, buf_len, p_index, p_dlen);
|
jinu |
0:6ba9b94b8997
|
298
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
299
|
|
jinu |
0:6ba9b94b8997
|
300
|
err_code = buf_dec(p_buf, buf_len, p_index, pp_data, out_buf_len, *p_dlen);
|
jinu |
0:6ba9b94b8997
|
301
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
302
|
|
jinu |
0:6ba9b94b8997
|
303
|
return err_code;
|
jinu |
0:6ba9b94b8997
|
304
|
}
|
jinu |
0:6ba9b94b8997
|
305
|
|
jinu |
0:6ba9b94b8997
|
306
|
uint32_t count16_cond_data16_enc(uint16_t const * const p_data,
|
jinu |
0:6ba9b94b8997
|
307
|
uint16_t const count,
|
jinu |
0:6ba9b94b8997
|
308
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
309
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
310
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
311
|
{
|
jinu |
0:6ba9b94b8997
|
312
|
uint32_t i = 0;
|
jinu |
0:6ba9b94b8997
|
313
|
|
jinu |
0:6ba9b94b8997
|
314
|
SER_ASSERT_LENGTH_LEQ(3, ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
315
|
*p_index += uint16_encode(count, &p_buf[*p_index]);
|
jinu |
0:6ba9b94b8997
|
316
|
|
jinu |
0:6ba9b94b8997
|
317
|
if (p_data)
|
jinu |
0:6ba9b94b8997
|
318
|
{
|
jinu |
0:6ba9b94b8997
|
319
|
SER_ASSERT_LENGTH_LEQ((2 * count + 1), ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
320
|
p_buf[*p_index] = RPC_BLE_FIELD_PRESENT;
|
jinu |
0:6ba9b94b8997
|
321
|
*p_index += 1;
|
jinu |
0:6ba9b94b8997
|
322
|
|
jinu |
0:6ba9b94b8997
|
323
|
//memcpy may fail in case of Endianness difference between application and connectivity processor
|
jinu |
0:6ba9b94b8997
|
324
|
for (i = 0; i < count; i++)
|
jinu |
0:6ba9b94b8997
|
325
|
{
|
jinu |
0:6ba9b94b8997
|
326
|
*p_index += uint16_encode(p_data[i], &p_buf[*p_index]);
|
jinu |
0:6ba9b94b8997
|
327
|
}
|
jinu |
0:6ba9b94b8997
|
328
|
}
|
jinu |
0:6ba9b94b8997
|
329
|
else
|
jinu |
0:6ba9b94b8997
|
330
|
{
|
jinu |
0:6ba9b94b8997
|
331
|
SER_ASSERT_LENGTH_LEQ((1), ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
332
|
p_buf[*p_index] = RPC_BLE_FIELD_NOT_PRESENT;
|
jinu |
0:6ba9b94b8997
|
333
|
*p_index += 1;
|
jinu |
0:6ba9b94b8997
|
334
|
}
|
jinu |
0:6ba9b94b8997
|
335
|
|
jinu |
0:6ba9b94b8997
|
336
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
337
|
}
|
jinu |
0:6ba9b94b8997
|
338
|
|
jinu |
0:6ba9b94b8997
|
339
|
uint32_t count16_cond_data16_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
340
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
341
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
342
|
uint16_t * * const pp_data,
|
jinu |
0:6ba9b94b8997
|
343
|
uint16_t * const p_count)
|
jinu |
0:6ba9b94b8997
|
344
|
|
jinu |
0:6ba9b94b8997
|
345
|
{
|
jinu |
0:6ba9b94b8997
|
346
|
uint16_t count = 0;
|
jinu |
0:6ba9b94b8997
|
347
|
uint8_t is_present = 0;
|
jinu |
0:6ba9b94b8997
|
348
|
uint16_t i;
|
jinu |
0:6ba9b94b8997
|
349
|
|
jinu |
0:6ba9b94b8997
|
350
|
SER_ASSERT_NOT_NULL(p_count);
|
jinu |
0:6ba9b94b8997
|
351
|
SER_ASSERT_NOT_NULL(pp_data);
|
jinu |
0:6ba9b94b8997
|
352
|
SER_ASSERT_NOT_NULL(*pp_data);
|
jinu |
0:6ba9b94b8997
|
353
|
|
jinu |
0:6ba9b94b8997
|
354
|
SER_ASSERT_LENGTH_LEQ(3, ((int32_t)buf_len - (*p_index)));
|
jinu |
0:6ba9b94b8997
|
355
|
|
jinu |
0:6ba9b94b8997
|
356
|
uint16_dec(p_buf, buf_len, p_index, &count);
|
jinu |
0:6ba9b94b8997
|
357
|
|
jinu |
0:6ba9b94b8997
|
358
|
if (count > *p_count)
|
jinu |
0:6ba9b94b8997
|
359
|
{
|
jinu |
0:6ba9b94b8997
|
360
|
return NRF_ERROR_DATA_SIZE;
|
jinu |
0:6ba9b94b8997
|
361
|
}
|
jinu |
0:6ba9b94b8997
|
362
|
|
jinu |
0:6ba9b94b8997
|
363
|
SER_ASSERT_LENGTH_LEQ(count, *p_count);
|
jinu |
0:6ba9b94b8997
|
364
|
|
jinu |
0:6ba9b94b8997
|
365
|
uint8_dec(p_buf, buf_len, p_index, &is_present);
|
jinu |
0:6ba9b94b8997
|
366
|
|
jinu |
0:6ba9b94b8997
|
367
|
if (!is_present)
|
jinu |
0:6ba9b94b8997
|
368
|
{
|
jinu |
0:6ba9b94b8997
|
369
|
*pp_data = NULL;
|
jinu |
0:6ba9b94b8997
|
370
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
371
|
}
|
jinu |
0:6ba9b94b8997
|
372
|
else
|
jinu |
0:6ba9b94b8997
|
373
|
{
|
jinu |
0:6ba9b94b8997
|
374
|
for (i = 0; i < count; i++ )
|
jinu |
0:6ba9b94b8997
|
375
|
{
|
jinu |
0:6ba9b94b8997
|
376
|
uint16_dec(p_buf, buf_len, p_index, &((&(**pp_data))[i]) );
|
jinu |
0:6ba9b94b8997
|
377
|
}
|
jinu |
0:6ba9b94b8997
|
378
|
*p_count = i;
|
jinu |
0:6ba9b94b8997
|
379
|
}
|
jinu |
0:6ba9b94b8997
|
380
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
381
|
}
|
jinu |
0:6ba9b94b8997
|
382
|
|
jinu |
0:6ba9b94b8997
|
383
|
|
jinu |
0:6ba9b94b8997
|
384
|
|
jinu |
0:6ba9b94b8997
|
385
|
uint32_t cond_len16_cond_data_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
386
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
387
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
388
|
uint8_t * * const pp_data,
|
jinu |
0:6ba9b94b8997
|
389
|
uint16_t * * const pp_len)
|
jinu |
0:6ba9b94b8997
|
390
|
{
|
jinu |
0:6ba9b94b8997
|
391
|
SER_ASSERT_NOT_NULL(pp_len);
|
jinu |
0:6ba9b94b8997
|
392
|
SER_ASSERT_NOT_NULL(*pp_len);
|
jinu |
0:6ba9b94b8997
|
393
|
SER_ASSERT_NOT_NULL(pp_data);
|
jinu |
0:6ba9b94b8997
|
394
|
SER_ASSERT_NOT_NULL(*pp_data);
|
jinu |
0:6ba9b94b8997
|
395
|
|
jinu |
0:6ba9b94b8997
|
396
|
SER_ASSERT_LENGTH_LEQ(2, ((int32_t)buf_len - (*p_index)));
|
jinu |
0:6ba9b94b8997
|
397
|
uint8_t is_present = 0;
|
jinu |
0:6ba9b94b8997
|
398
|
|
jinu |
0:6ba9b94b8997
|
399
|
uint8_dec(p_buf, buf_len, p_index, &is_present);
|
jinu |
0:6ba9b94b8997
|
400
|
|
jinu |
0:6ba9b94b8997
|
401
|
if (!is_present)
|
jinu |
0:6ba9b94b8997
|
402
|
{
|
jinu |
0:6ba9b94b8997
|
403
|
*pp_len = NULL; //if length field is not present
|
jinu |
0:6ba9b94b8997
|
404
|
(*p_index)++; //then data can not be present
|
jinu |
0:6ba9b94b8997
|
405
|
*pp_data = NULL;
|
jinu |
0:6ba9b94b8997
|
406
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
407
|
}
|
jinu |
0:6ba9b94b8997
|
408
|
else
|
jinu |
0:6ba9b94b8997
|
409
|
{
|
jinu |
0:6ba9b94b8997
|
410
|
return len16data_dec(p_buf, buf_len, p_index, pp_data, *pp_len);
|
jinu |
0:6ba9b94b8997
|
411
|
}
|
jinu |
0:6ba9b94b8997
|
412
|
}
|
jinu |
0:6ba9b94b8997
|
413
|
|
jinu |
0:6ba9b94b8997
|
414
|
uint32_t op_status_enc(uint8_t op_code,
|
jinu |
0:6ba9b94b8997
|
415
|
uint32_t return_code,
|
jinu |
0:6ba9b94b8997
|
416
|
uint8_t * const p_buff,
|
jinu |
0:6ba9b94b8997
|
417
|
uint32_t * const p_buff_len,
|
jinu |
0:6ba9b94b8997
|
418
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
419
|
{
|
jinu |
0:6ba9b94b8997
|
420
|
SER_ASSERT_NOT_NULL(p_buff);
|
jinu |
0:6ba9b94b8997
|
421
|
SER_ASSERT_NOT_NULL(p_buff_len);
|
jinu |
0:6ba9b94b8997
|
422
|
SER_ASSERT_NOT_NULL(p_index);
|
jinu |
0:6ba9b94b8997
|
423
|
SER_ASSERT_LENGTH_LEQ(SER_CMD_RSP_HEADER_SIZE, *p_buff_len - *p_index);
|
jinu |
0:6ba9b94b8997
|
424
|
|
jinu |
0:6ba9b94b8997
|
425
|
//Encode Op Code.
|
jinu |
0:6ba9b94b8997
|
426
|
p_buff[(*p_index)++] = op_code;
|
jinu |
0:6ba9b94b8997
|
427
|
//Encode Status.
|
jinu |
0:6ba9b94b8997
|
428
|
*p_index += uint32_encode(return_code, &(p_buff[*p_index]));
|
jinu |
0:6ba9b94b8997
|
429
|
//update size of used buffer
|
jinu |
0:6ba9b94b8997
|
430
|
*p_buff_len = *p_index;
|
jinu |
0:6ba9b94b8997
|
431
|
|
jinu |
0:6ba9b94b8997
|
432
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
433
|
}
|
jinu |
0:6ba9b94b8997
|
434
|
|
jinu |
0:6ba9b94b8997
|
435
|
uint32_t op_status_cond_uint16_enc(uint8_t op_code,
|
jinu |
0:6ba9b94b8997
|
436
|
uint32_t return_code,
|
jinu |
0:6ba9b94b8997
|
437
|
uint16_t value,
|
jinu |
0:6ba9b94b8997
|
438
|
uint8_t * const p_buff,
|
jinu |
0:6ba9b94b8997
|
439
|
uint32_t * const p_buff_len,
|
jinu |
0:6ba9b94b8997
|
440
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
441
|
{
|
jinu |
0:6ba9b94b8997
|
442
|
uint32_t status_code;
|
jinu |
0:6ba9b94b8997
|
443
|
uint32_t init_buff_len = *p_buff_len;
|
jinu |
0:6ba9b94b8997
|
444
|
|
jinu |
0:6ba9b94b8997
|
445
|
status_code = op_status_enc(op_code, return_code, p_buff, p_buff_len, p_index);
|
jinu |
0:6ba9b94b8997
|
446
|
SER_ASSERT(status_code == NRF_SUCCESS, status_code);
|
jinu |
0:6ba9b94b8997
|
447
|
|
jinu |
0:6ba9b94b8997
|
448
|
if (return_code == NRF_SUCCESS) //Add 16bit value when return_code is a success
|
jinu |
0:6ba9b94b8997
|
449
|
{
|
jinu |
0:6ba9b94b8997
|
450
|
*p_buff_len = init_buff_len; //restore original value - it has been modified by op_status_enc
|
jinu |
0:6ba9b94b8997
|
451
|
status_code = uint16_t_enc(&value, p_buff, *p_buff_len, p_index);
|
jinu |
0:6ba9b94b8997
|
452
|
*p_buff_len = *p_index;
|
jinu |
0:6ba9b94b8997
|
453
|
SER_ASSERT(status_code == NRF_SUCCESS, status_code);
|
jinu |
0:6ba9b94b8997
|
454
|
}
|
jinu |
0:6ba9b94b8997
|
455
|
|
jinu |
0:6ba9b94b8997
|
456
|
return status_code;
|
jinu |
0:6ba9b94b8997
|
457
|
}
|
jinu |
0:6ba9b94b8997
|
458
|
|
jinu |
0:6ba9b94b8997
|
459
|
uint32_t buf_enc(uint8_t const * const p_data,
|
jinu |
0:6ba9b94b8997
|
460
|
uint16_t const dlen,
|
jinu |
0:6ba9b94b8997
|
461
|
uint8_t * const p_buf,
|
jinu |
0:6ba9b94b8997
|
462
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
463
|
uint32_t * const p_index)
|
jinu |
0:6ba9b94b8997
|
464
|
{
|
jinu |
0:6ba9b94b8997
|
465
|
uint32_t err_code = NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
466
|
uint8_t is_present = (p_data == NULL) ? RPC_BLE_FIELD_NOT_PRESENT : RPC_BLE_FIELD_PRESENT;
|
jinu |
0:6ba9b94b8997
|
467
|
|
jinu |
0:6ba9b94b8997
|
468
|
err_code = uint8_t_enc(&is_present, p_buf, buf_len, p_index);
|
jinu |
0:6ba9b94b8997
|
469
|
SER_ASSERT(err_code == NRF_SUCCESS, err_code);
|
jinu |
0:6ba9b94b8997
|
470
|
|
jinu |
0:6ba9b94b8997
|
471
|
if (p_data)
|
jinu |
0:6ba9b94b8997
|
472
|
{
|
jinu |
0:6ba9b94b8997
|
473
|
SER_ASSERT_LENGTH_LEQ(dlen, ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
474
|
memcpy(&p_buf[*p_index], p_data, dlen);
|
jinu |
0:6ba9b94b8997
|
475
|
*p_index += dlen;
|
jinu |
0:6ba9b94b8997
|
476
|
}
|
jinu |
0:6ba9b94b8997
|
477
|
|
jinu |
0:6ba9b94b8997
|
478
|
return err_code;
|
jinu |
0:6ba9b94b8997
|
479
|
}
|
jinu |
0:6ba9b94b8997
|
480
|
|
jinu |
0:6ba9b94b8997
|
481
|
uint32_t buf_dec(uint8_t const * const p_buf,
|
jinu |
0:6ba9b94b8997
|
482
|
uint32_t buf_len,
|
jinu |
0:6ba9b94b8997
|
483
|
uint32_t * const p_index,
|
jinu |
0:6ba9b94b8997
|
484
|
uint8_t * * const pp_data,
|
jinu |
0:6ba9b94b8997
|
485
|
uint16_t data_len,
|
jinu |
0:6ba9b94b8997
|
486
|
uint16_t dlen)
|
jinu |
0:6ba9b94b8997
|
487
|
{
|
jinu |
0:6ba9b94b8997
|
488
|
uint8_t is_present = 0;
|
jinu |
0:6ba9b94b8997
|
489
|
|
jinu |
0:6ba9b94b8997
|
490
|
SER_ASSERT_LENGTH_LEQ(1, ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
491
|
uint8_dec(p_buf, buf_len, p_index, &is_present);
|
jinu |
0:6ba9b94b8997
|
492
|
|
jinu |
0:6ba9b94b8997
|
493
|
if (is_present == RPC_BLE_FIELD_PRESENT)
|
jinu |
0:6ba9b94b8997
|
494
|
{
|
jinu |
0:6ba9b94b8997
|
495
|
SER_ASSERT_NOT_NULL(pp_data);
|
jinu |
0:6ba9b94b8997
|
496
|
SER_ASSERT_NOT_NULL(*pp_data);
|
jinu |
0:6ba9b94b8997
|
497
|
SER_ASSERT_LENGTH_LEQ(dlen, data_len);
|
jinu |
0:6ba9b94b8997
|
498
|
SER_ASSERT_LENGTH_LEQ(dlen, ((int32_t)buf_len - *p_index));
|
jinu |
0:6ba9b94b8997
|
499
|
memcpy(*pp_data, &p_buf[*p_index], dlen);
|
jinu |
0:6ba9b94b8997
|
500
|
*p_index += dlen;
|
jinu |
0:6ba9b94b8997
|
501
|
}
|
jinu |
0:6ba9b94b8997
|
502
|
else
|
jinu |
0:6ba9b94b8997
|
503
|
{
|
jinu |
0:6ba9b94b8997
|
504
|
if (pp_data)
|
jinu |
0:6ba9b94b8997
|
505
|
{
|
jinu |
0:6ba9b94b8997
|
506
|
*pp_data = NULL;
|
jinu |
0:6ba9b94b8997
|
507
|
}
|
jinu |
0:6ba9b94b8997
|
508
|
}
|
jinu |
0:6ba9b94b8997
|
509
|
return NRF_SUCCESS;
|
jinu |
0:6ba9b94b8997
|
510
|
}
|
jinu |
0:6ba9b94b8997
|
511
|
|