BTstack.cpp (5611a760af48d1ce1beea59c7908be73bd2393f1) BTstack.cpp (f8fbdce0c5067e7e7edd3a29934b1f9b79c8ff2d)
1/**
2 * Arduino Wrapper for BTstack
3 */
4
5#include <Arduino.h>
6#include <SPI.h>
7
8#ifdef __AVR__

--- 134 unchanged lines hidden (view full) ---

143 le_peripheral_todos |= SET_ADVERTISEMENT_PARAMS
144 | SET_ADVERTISEMENT_DATA
145 | SET_ADVERTISEMENT_ENABLED;
146 }
147 break;
148
149 case HCI_EVENT_DISCONNECTION_COMPLETE:
150 if (bleDeviceDisconnectedCallback) {
1/**
2 * Arduino Wrapper for BTstack
3 */
4
5#include <Arduino.h>
6#include <SPI.h>
7
8#ifdef __AVR__

--- 134 unchanged lines hidden (view full) ---

143 le_peripheral_todos |= SET_ADVERTISEMENT_PARAMS
144 | SET_ADVERTISEMENT_DATA
145 | SET_ADVERTISEMENT_ENABLED;
146 }
147 break;
148
149 case HCI_EVENT_DISCONNECTION_COMPLETE:
150 if (bleDeviceDisconnectedCallback) {
151 handle = READ_BT_16(packet, 3);
151 handle = little_endian_read_16(packet, 3);
152 BLEDevice device(handle);
153 (*bleDeviceDisconnectedCallback)(&device);
154 }
155 le_peripheral_todos |= SET_ADVERTISEMENT_ENABLED;
156 break;
157
158 case GAP_LE_EVENT_ADVERTISING_REPORT: {
159 if (bleAdvertismentCallback) {

--- 9 unchanged lines hidden (view full) ---

169 printf("Local Address: %s\n", bd_addr_to_str(addr));
170 break;
171 }
172 break;
173
174 case HCI_EVENT_LE_META:
175 switch (packet[2]) {
176 case HCI_SUBEVENT_LE_CONNECTION_COMPLETE:
152 BLEDevice device(handle);
153 (*bleDeviceDisconnectedCallback)(&device);
154 }
155 le_peripheral_todos |= SET_ADVERTISEMENT_ENABLED;
156 break;
157
158 case GAP_LE_EVENT_ADVERTISING_REPORT: {
159 if (bleAdvertismentCallback) {

--- 9 unchanged lines hidden (view full) ---

169 printf("Local Address: %s\n", bd_addr_to_str(addr));
170 break;
171 }
172 break;
173
174 case HCI_EVENT_LE_META:
175 switch (packet[2]) {
176 case HCI_SUBEVENT_LE_CONNECTION_COMPLETE:
177 handle = READ_BT_16(packet, 4);
177 handle = little_endian_read_16(packet, 4);
178 printf("Connection complete, handle 0x%04x\n", handle);
179 btstack_run_loop_remove_timer(&connection_timer);
180 if (!bleDeviceConnectedCallback) break;
181 if (packet[3]){
182 (*bleDeviceConnectedCallback)(BLE_STATUS_CONNECTION_ERROR, NULL);
183 } else {
184 BLEDevice device(handle);
185 (*bleDeviceConnectedCallback)(BLE_STATUS_OK, &device);

--- 6 unchanged lines hidden (view full) ---

192 }
193 }
194 // if (client_packet_handler){
195 // (*client_packet_handler)(packet_type, channel, packet, size);
196 // }
197}
198
199static void extract_service(le_service_t * service, uint8_t * packet){
178 printf("Connection complete, handle 0x%04x\n", handle);
179 btstack_run_loop_remove_timer(&connection_timer);
180 if (!bleDeviceConnectedCallback) break;
181 if (packet[3]){
182 (*bleDeviceConnectedCallback)(BLE_STATUS_CONNECTION_ERROR, NULL);
183 } else {
184 BLEDevice device(handle);
185 (*bleDeviceConnectedCallback)(BLE_STATUS_OK, &device);

--- 6 unchanged lines hidden (view full) ---

192 }
193 }
194 // if (client_packet_handler){
195 // (*client_packet_handler)(packet_type, channel, packet, size);
196 // }
197}
198
199static void extract_service(le_service_t * service, uint8_t * packet){
200 service->start_group_handle = READ_BT_16(packet, 4);
201 service->end_group_handle = READ_BT_16(packet, 6);
200 service->start_group_handle = little_endian_read_16(packet, 4);
201 service->end_group_handle = little_endian_read_16(packet, 6);
202 service->uuid16 = 0;
203 swap128(&packet[8], service->uuid128);
204 if (sdp_has_blueooth_base_uuid(service->uuid128)){
202 service->uuid16 = 0;
203 swap128(&packet[8], service->uuid128);
204 if (sdp_has_blueooth_base_uuid(service->uuid128)){
205 service->uuid16 = READ_NET_32(service->uuid128, 0);
205 service->uuid16 = bit_endian_read_32(service->uuid128, 0);
206 }
207}
208
209static void extract_characteristic(le_characteristic_t * characteristic, uint8_t * packet){
206 }
207}
208
209static void extract_characteristic(le_characteristic_t * characteristic, uint8_t * packet){
210 characteristic->start_handle = READ_BT_16(packet, 4);
211 characteristic->value_handle = READ_BT_16(packet, 6);
212 characteristic->end_handle = READ_BT_16(packet, 8);
213 characteristic->properties = READ_BT_16(packet, 10);
210 characteristic->start_handle = little_endian_read_16(packet, 4);
211 characteristic->value_handle = little_endian_read_16(packet, 6);
212 characteristic->end_handle = little_endian_read_16(packet, 8);
213 characteristic->properties = little_endian_read_16(packet, 10);
214 characteristic->uuid16 = 0;
215 swap128(&packet[12], characteristic->uuid128);
216 if (sdp_has_blueooth_base_uuid(characteristic->uuid128)){
214 characteristic->uuid16 = 0;
215 swap128(&packet[12], characteristic->uuid128);
216 if (sdp_has_blueooth_base_uuid(characteristic->uuid128)){
217 characteristic->uuid16 = READ_NET_32(characteristic->uuid128, 0);
217 characteristic->uuid16 = bit_endian_read_32(characteristic->uuid128, 0);
218 }
219}
220
221static void gatt_client_callback(uint8_t packet_type, uint8_t * packet, uint16_t size){
222
223 // if (hci) event is not 4-byte aligned, event->handle causes crash
224 // workaround: check event type, assuming GATT event types are contagious
225 if (packet[0] < GATT_EVENT_QUERY_COMPLETE) return;
226 if (packet[0] > GATT_EVENT_MTU) return;
227
218 }
219}
220
221static void gatt_client_callback(uint8_t packet_type, uint8_t * packet, uint16_t size){
222
223 // if (hci) event is not 4-byte aligned, event->handle causes crash
224 // workaround: check event type, assuming GATT event types are contagious
225 if (packet[0] < GATT_EVENT_QUERY_COMPLETE) return;
226 if (packet[0] > GATT_EVENT_MTU) return;
227
228 uint16_t con_handle = READ_BT_16(packet, 2);
228 uint16_t con_handle = little_endian_read_16(packet, 2);
229 uint8_t status;
230 uint8_t * value;
231 uint16_t value_handle;
232 uint16_t value_length;
233
234 BLEDevice device(con_handle);
235 switch(packet[0]){
236 case GATT_EVENT_SERVICE_QUERY_RESULT:

--- 8 unchanged lines hidden (view full) ---

245 if (gattCharacteristicDiscoveredCallback){
246 le_characteristic_t characteristic;
247 extract_characteristic(&characteristic, packet);
248 BLECharacteristic bleCharacteristic(characteristic);
249 (*gattCharacteristicDiscoveredCallback)(BLE_STATUS_OK, &device, &bleCharacteristic);
250 }
251 break;
252 case GATT_EVENT_QUERY_COMPLETE:
229 uint8_t status;
230 uint8_t * value;
231 uint16_t value_handle;
232 uint16_t value_length;
233
234 BLEDevice device(con_handle);
235 switch(packet[0]){
236 case GATT_EVENT_SERVICE_QUERY_RESULT:

--- 8 unchanged lines hidden (view full) ---

245 if (gattCharacteristicDiscoveredCallback){
246 le_characteristic_t characteristic;
247 extract_characteristic(&characteristic, packet);
248 BLECharacteristic bleCharacteristic(characteristic);
249 (*gattCharacteristicDiscoveredCallback)(BLE_STATUS_OK, &device, &bleCharacteristic);
250 }
251 break;
252 case GATT_EVENT_QUERY_COMPLETE:
253 status = READ_BT_16(packet, 4);
253 status = little_endian_read_16(packet, 4);
254 switch (gattAction){
255 case gattActionWrite:
256 if (gattCharacteristicWrittenCallback) gattCharacteristicWrittenCallback(status ? BLE_STATUS_OTHER_ERROR : BLE_STATUS_OK, &device);
257 break;
258 case gattActionSubscribe:
259 if (gattCharacteristicSubscribedCallback) gattCharacteristicSubscribedCallback(status ? BLE_STATUS_OTHER_ERROR : BLE_STATUS_OK, &device);
260 break;
261 case gattActionUnsubscribe:

--- 6 unchanged lines hidden (view full) ---

268 if (gattCharacteristicDiscoveredCallback) gattCharacteristicDiscoveredCallback(BLE_STATUS_DONE, &device, NULL);
269 break;
270 default:
271 break;
272 };
273 break;
274 case GATT_EVENT_NOTIFICATION:
275 if (gattCharacteristicNotificationCallback) {
254 switch (gattAction){
255 case gattActionWrite:
256 if (gattCharacteristicWrittenCallback) gattCharacteristicWrittenCallback(status ? BLE_STATUS_OTHER_ERROR : BLE_STATUS_OK, &device);
257 break;
258 case gattActionSubscribe:
259 if (gattCharacteristicSubscribedCallback) gattCharacteristicSubscribedCallback(status ? BLE_STATUS_OTHER_ERROR : BLE_STATUS_OK, &device);
260 break;
261 case gattActionUnsubscribe:

--- 6 unchanged lines hidden (view full) ---

268 if (gattCharacteristicDiscoveredCallback) gattCharacteristicDiscoveredCallback(BLE_STATUS_DONE, &device, NULL);
269 break;
270 default:
271 break;
272 };
273 break;
274 case GATT_EVENT_NOTIFICATION:
275 if (gattCharacteristicNotificationCallback) {
276 value_handle = READ_BT_16(packet, 4);
277 value_length = READ_BT_16(packet, 6);
276 value_handle = little_endian_read_16(packet, 4);
277 value_length = little_endian_read_16(packet, 6);
278 value = &packet[8];
279 (*gattCharacteristicNotificationCallback)(&device, value_handle, value, value_length);
280 }
281 break;
282 case GATT_EVENT_INDICATION:
283 if (gattCharacteristicIndicationCallback) {
278 value = &packet[8];
279 (*gattCharacteristicNotificationCallback)(&device, value_handle, value, value_length);
280 }
281 break;
282 case GATT_EVENT_INDICATION:
283 if (gattCharacteristicIndicationCallback) {
284 value_handle = READ_BT_16(packet, 4);
285 value_length = READ_BT_16(packet, 6);
284 value_handle = little_endian_read_16(packet, 4);
285 value_length = little_endian_read_16(packet, 6);
286 value = &packet[8];
287 (*gattCharacteristicIndicationCallback)(&device, value_handle, value, value_length);
288 }
289 break;
290 case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT:
291 if (gattCharacteristicReadCallback) {
286 value = &packet[8];
287 (*gattCharacteristicIndicationCallback)(&device, value_handle, value, value_length);
288 }
289 break;
290 case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT:
291 if (gattCharacteristicReadCallback) {
292 value_handle = READ_BT_16(packet, 4);
293 value_length = READ_BT_16(packet, 6);
292 value_handle = little_endian_read_16(packet, 4);
293 value_length = little_endian_read_16(packet, 6);
294 value = &packet[8];
295 (*gattCharacteristicReadCallback)(BLE_STATUS_OK, &device, value, value_length);
296 }
297 break;
298 default:
299 break;
300 }
301}

--- 57 unchanged lines hidden (view full) ---

359const uint8_t * UUID::getUuid(void) const {
360 return uuid;
361}
362
363static char uuid16_buffer[5];
364const char * UUID::getUuidString() const {
365 // TODO: fix sdp_has_blueooth_base_uuid call to use const
366 if (sdp_has_blueooth_base_uuid((uint8_t*)uuid)){
294 value = &packet[8];
295 (*gattCharacteristicReadCallback)(BLE_STATUS_OK, &device, value, value_length);
296 }
297 break;
298 default:
299 break;
300 }
301}

--- 57 unchanged lines hidden (view full) ---

359const uint8_t * UUID::getUuid(void) const {
360 return uuid;
361}
362
363static char uuid16_buffer[5];
364const char * UUID::getUuidString() const {
365 // TODO: fix sdp_has_blueooth_base_uuid call to use const
366 if (sdp_has_blueooth_base_uuid((uint8_t*)uuid)){
367 sprintf(uuid16_buffer, "%04x", (uint16_t) READ_NET_32(uuid, 0));
367 sprintf(uuid16_buffer, "%04x", (uint16_t) bit_endian_read_32(uuid, 0));
368 return uuid16_buffer;
369 } else {
370 // TODO: fix uuid128_to_str
371 return uuid128_to_str((uint8_t*)uuid);
372 }
373}
374
375const char * UUID::getUuid128String() const {

--- 92 unchanged lines hidden (view full) ---

468
469const UUID * BLEAdvertisement::getIBeaconUUID(void){
470 if (!iBeacon_UUID){
471 iBeacon_UUID = new UUID(&data[9]);
472 }
473 return iBeacon_UUID;
474};
475uint16_t BLEAdvertisement::getIBeaconMajorID(void){
368 return uuid16_buffer;
369 } else {
370 // TODO: fix uuid128_to_str
371 return uuid128_to_str((uint8_t*)uuid);
372 }
373}
374
375const char * UUID::getUuid128String() const {

--- 92 unchanged lines hidden (view full) ---

468
469const UUID * BLEAdvertisement::getIBeaconUUID(void){
470 if (!iBeacon_UUID){
471 iBeacon_UUID = new UUID(&data[9]);
472 }
473 return iBeacon_UUID;
474};
475uint16_t BLEAdvertisement::getIBeaconMajorID(void){
476 return READ_NET_16(data, 25);
476 return big_endian_read_16(data, 25);
477};
478uint16_t BLEAdvertisement::getIBecaonMinorID(void){
477};
478uint16_t BLEAdvertisement::getIBecaonMinorID(void){
479 return READ_NET_16(data, 27);
479 return big_endian_read_16(data, 27);
480};
481uint8_t BLEAdvertisement::getiBeaconMeasuredPower(void){
482 return data[29];
483}
484
485
486BLECharacteristic::BLECharacteristic(void){
487}

--- 366 unchanged lines hidden (view full) ---

854void BTstackManager::stopAdvertising(){
855 gap_advertisements_enable(0);
856}
857void BTstackManager::iBeaconConfigure(UUID * uuid, uint16_t major_id, uint16_t minor_id, uint8_t measured_power){
858 memcpy(adv_data, iBeaconAdvertisement01, sizeof(iBeaconAdvertisement01));
859 adv_data[2] = 0x06;
860 memcpy(&adv_data[3], iBeaconAdvertisement38, sizeof(iBeaconAdvertisement38));
861 memcpy(&adv_data[9], uuid->getUuid(), 16);
480};
481uint8_t BLEAdvertisement::getiBeaconMeasuredPower(void){
482 return data[29];
483}
484
485
486BLECharacteristic::BLECharacteristic(void){
487}

--- 366 unchanged lines hidden (view full) ---

854void BTstackManager::stopAdvertising(){
855 gap_advertisements_enable(0);
856}
857void BTstackManager::iBeaconConfigure(UUID * uuid, uint16_t major_id, uint16_t minor_id, uint8_t measured_power){
858 memcpy(adv_data, iBeaconAdvertisement01, sizeof(iBeaconAdvertisement01));
859 adv_data[2] = 0x06;
860 memcpy(&adv_data[3], iBeaconAdvertisement38, sizeof(iBeaconAdvertisement38));
861 memcpy(&adv_data[9], uuid->getUuid(), 16);
862 net_store_16(adv_data, 25, major_id);
863 net_store_16(adv_data, 27, minor_id);
862 big_endian_store_16(adv_data, 25, major_id);
863 big_endian_store_16(adv_data, 27, minor_id);
864 adv_data[29] = measured_power;
865 adv_data_len = 30;
866 gap_advertisements_set_data(adv_data_len, adv_data);
867}
868// 02 01 06 1A FF 4C 00 02 15 -- F8 97 17 7B AE E8 47 67 8E CC CC 69 4F D5 FC EE -- 12 67 00 02 00 00
869// 02 01 06 1a ff 4c 00 02 15 -- FB 0B 57 A2 82 28 44 CD 91 3A 94 A1 22 BA 12 06 -- 00 01 00 02 D1 00
870
871
872BTstackManager BTstack;
873
864 adv_data[29] = measured_power;
865 adv_data_len = 30;
866 gap_advertisements_set_data(adv_data_len, adv_data);
867}
868// 02 01 06 1A FF 4C 00 02 15 -- F8 97 17 7B AE E8 47 67 8E CC CC 69 4F D5 FC EE -- 12 67 00 02 00 00
869// 02 01 06 1a ff 4c 00 02 15 -- FB 0B 57 A2 82 28 44 CD 91 3A 94 A1 22 BA 12 06 -- 00 01 00 02 D1 00
870
871
872BTstackManager BTstack;
873