kindlebt
Bluetooth functionality for Kindle 11th gen and up
Loading...
Searching...
No Matches
compat_ace_utils.c
1#include <kindlebt/compat_ace_utils.h>
2
3#include <stddef.h>
4#include <stdio.h>
5
6#include "log.h"
7
8#include <kindlebt/compat_ace_internals.h>
9
10void dump_hex(const void* ptr, size_t size) {
11 const unsigned char* data = (const unsigned char*)ptr;
12
13 // Each byte is "XX ", 3 chars. One '\n' every 16 bytes, and a final '\0'
14 size_t lines = (size + 15) / 16;
15 size_t buf_len = (size * 3) + lines + 1;
16 char* buf = malloc(buf_len);
17 if (!buf) return;
18
19 char* p = buf;
20 for (size_t i = 0; i < size; ++i) {
21 p += snprintf(p, buf + buf_len - p, "%02x ", data[i]);
22
23 // Newline every 16 bytes
24 if ((i + 1) % 16 == 0) *p++ = '\n';
25 }
26 *p = '\0';
27 log_debug("Dumping hex:\n%s", buf);
28 free(buf);
29}
30
31void dump_registerCbackGattcData(const registerCbackGattcData_t* data) {
32 if (data == NULL) {
33 log_warn("Dumping registerCbackGattcData_t: NULL");
34 return;
35 }
36
37 log_debug(
38 "Dumping registerCbackGattcData_t {\n"
39 " size: %u\n"
40 " session_handle: %p\n"
41 " callback_mask: %u\n"
42 " is_unregister: %u\n"
43 " app_id: %d\n"
44 " out_status: %d\n"
45 "}",
46 data->size, data->session_handle, data->callback_mask, data->is_unregister, data->app_id,
47 data->out_status
48 );
49}
50
51void dump_gattc_get_db_data_t(const gattc_get_db_data_t* data) {
52 if (data == NULL) {
53 log_warn("Dumping gattc_get_db_data_t: NULL");
54 return;
55 }
56
57 log_debug(
58 "Dumping gattc_get_db_data_t {\n"
59 " size: %d\n"
60 " conn_handle: %p\n"
61 " uuid: %p\n"
62 "}",
63 data->size, data->conn_handle, data->uuid
64 );
65}
66
67void dump_aceAipc_parameter_t(aceAipc_parameter_t* task) {
68 if (task == NULL) {
69 log_warn("Dumping aceAipc_parameter_t: NULL");
70 return;
71 }
72
73 log_debug(
74 "Dumping aceAipc_parameter_t {\n"
75 " reserved0 %u (%p)\n"
76 " size %u (%p)\n"
77 " msg_type %u (%p)\n"
78 " function_id %u (%p)\n"
79 " cb1 %p\n"
80 " cb2 %p\n"
81 " buffer %p\n"
82 " reserved1 %u (%p)\n"
83 " reserved2 %u (%p)\n"
84 " reserved3 %u (%p)\n"
85 " flags %u (%p)\n"
86 " reserved4 %u (%p)\n"
87 " callback_id %u (%p)\n"
88 " server_id %u (%p)\n"
89 "}",
90 task->reserved0, task->reserved0, task->size, task->size, task->msg_type, task->msg_type,
91 task->function_id, task->function_id, task->cb1, task->cb2, task->buffer, task->reserved1,
92 task->reserved1, task->reserved2, task->reserved2, task->reserved3, task->reserved3,
93 task->flags, task->flags, task->reserved4, task->reserved4, task->callback_id,
94 task->callback_id, task->server_id, task->server_id
95 );
96}
97
98void dump_mask_bits(uint16_t mask) {
99 const int len = 64;
100 char* buf = malloc(len);
101 if (!buf) return;
102
103 char* p = buf;
104 for (int i = 15; i >= 0; --i) {
105 *p++ = (mask & (1u << i)) ? '1' : '0';
106 // Add spacing every 4 bits
107 if (i % 4 == 0 && i != 0) *p++ = ' ';
108 }
109 *p = '\0';
110
111 log_debug("Dumping mask: 0x%04x (binary: %s)", mask, buf);
112 free(buf);
113}
114
115void dump_aipc_handle(aipcHandles_t aipc_handle) {
116 log_debug(
117 "aipc_handle {\n callback_server_id: %u (0x%04x),\n server_id: %u (0x%04x)\n}",
118 aipc_handle.callback_server_id, aipc_handle.callback_server_id, aipc_handle.server_id,
119 aipc_handle.server_id
120 );
121}
122
123void dump_uuid2(const uuid_t* uuid) {
124 log_debug(
125 "[%s()]: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
126 __func__, uuid->uu[0], uuid->uu[1], uuid->uu[2], uuid->uu[3], uuid->uu[4], uuid->uu[5],
127 uuid->uu[6], uuid->uu[7], uuid->uu[8], uuid->uu[9], uuid->uu[10], uuid->uu[11],
128 uuid->uu[12], uuid->uu[13], uuid->uu[14], uuid->uu[15]
129 );
130}
131
132void dump_bleGattBlobValue_t(const bleGattBlobValue_t* value) {
133 log_debug("Dumping bleGattBlobValue_t");
134 log_debug(
135 "bleGattBlobValue {\n"
136 " size %d\n"
137 " offset %d\n"
138 " data NEXT\n"
139 "}",
140 value->size, value->offset
141 );
142 printf("bleGattBlobValue.data = ");
143 for (uint16_t i = 0; i < value->size; ++i) {
144 printf("0x%02X ", value->data[i]);
145 }
146 printf("\n");
147}
148
149void dump_bleGattRecord_t(const bleGattRecord_t* record) {
150 log_debug("Dumping bleGattRecord_t");
151 dump_uuid2(&record->uuid);
152 log_debug(
153 "bleGattRecord_t {\n"
154 " uuid PREV\n"
155 " attProp %d\n"
156 " attPerm %d\n"
157 " handle %d (%p)\n"
158 "}",
159 record->attProp, record->attPerm, record->handle, record->handle
160 );
161}
162
163void dump_bleGattDescriptor_t(const bleGattDescriptor_t* descriptor) {
164 if (descriptor == NULL) {
165 log_debug("Dumping bleGattDescriptor_t: NULL");
166 return;
167 }
168
169 log_debug("Dumping bleGattDescriptor_t");
170 log_debug(
171 "bleGattDescriptor_t {\n"
172 " gattRecord NEXT\n"
173 " blobValue NEXT\n"
174 " is_set %d\n"
175 " is_notify %d\n"
176 " desc_auth_retry %d\n"
177 " write_type %d\n"
178 "}",
179 descriptor->is_set, descriptor->is_notify, descriptor->desc_auth_retry,
180 descriptor->write_type
181 );
182
183 dump_bleGattRecord_t(&descriptor->gattRecord);
184 dump_bleGattBlobValue_t(&descriptor->blobValue);
185}
186
187void dump_bleGattCharacteristicsValue_t(const bleGattCharacteristicsValue_t chars_value) {
188 log_debug("Dumping bleGattCharacteristicsValue_t");
189 log_debug(
190 "bleGattCharacteristicsValue_t {\n"
191 " format %d\n"
192 " gattRecord NEXT\n"
193 " gattDescriptor NEXT\n"
194 " auth_retry %d\n"
195 " read_auth_retry %d\n"
196 " write_type %d\n"
197 " descList NEXT\n"
198 " multiDescCount %d\n"
199 "}",
200 chars_value.format, chars_value.auth_retry, chars_value.read_auth_retry,
201 chars_value.write_type, chars_value.multiDescCount
202 );
203
204 if (chars_value.format == 255) {
205 dump_bleGattBlobValue_t(&chars_value.blobValue);
206 }
207
208 dump_bleGattRecord_t(&chars_value.gattRecord);
209 log_debug("Main descriptor:");
210 dump_bleGattDescriptor_t(&chars_value.gattDescriptor);
211
212 log_debug("Linked list descriptors:");
213 if (chars_value.multiDescCount) {
214 struct aceBT_gattDescRec_t* desc_rec = NULL;
215 STAILQ_FOREACH(desc_rec, &chars_value.descList, link) {
216 dump_bleGattDescriptor_t(&desc_rec->value);
217 }
218 }
219 log_debug("Done linked list descriptors");
220}
221
222void dump_notify_data_t(const notify_data_t* data) {
223 log_debug("Dumping notify_data_t");
224 log_debug(
225 "notify_data_t {\n"
226 " size %d\n"
227 " conn_handle %d (%p)\n"
228 " session_handle %d (%p)\n"
229 // " confirm %d\n"
230 " value NEXT\n"
231 " data_len %d\n"
232 " data %p SKIPPED\n"
233 "}",
234 data->size, data->conn_handle, data->conn_handle, data->session_handle,
235 data->session_handle,
236 // data->confirm,
237 data->data_len, data->data
238 );
239
240 dump_bleGattCharacteristicsValue_t(data->value);
241}
aceBT_bleGattRecord_t bleGattRecord_t
BLE GATT Record (ATT attributes)
aceBT_bleGattBlobValue_t bleGattBlobValue_t
BLE blob value.
aceBT_bleGattDescriptor_t bleGattDescriptor_t
BLE GATT Descriptor.
aceBT_uuid_t uuid_t
Bluetooth UUID struct.
aceBT_bleGattCharacteristicsValue_t bleGattCharacteristicsValue_t
BLE GATT Characteristic.