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 |