ble example
Dependencies: BLE_API mbed nRF51822
Fork of BLE_LEDBlinker by
Diff: main.cpp
- Revision:
- 12:96caa9a52bb3
- Parent:
- 11:023d96b0e427
--- a/main.cpp Tue Jan 12 10:49:03 2016 +0000 +++ b/main.cpp Thu Jan 19 12:40:00 2017 +0000 @@ -18,44 +18,69 @@ #include "ble/BLE.h" #include "ble/DiscoveredCharacteristic.h" #include "ble/DiscoveredService.h" - +#include "ble/Gap.h" +static const uint16_t UNIT_1_25_MS = 1250; +static const uint16_t UNIT_10_MS = 10000; +#define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION)) +#define MIN_CONNECTION_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS) +#define MAX_CONNECTION_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) +#define SLAVE_LATENCY 0 +#define SUPERVISION_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) DigitalOut alivenessLED(LED1, 1); bool triggerLedCharacteristic = false; DiscoveredCharacteristic ledCharacteristic; +static const Gap::ConnectionParams_t m_conn_params ={ + (uint16_t)MIN_CONNECTION_INTERVAL, + (uint16_t)MAX_CONNECTION_INTERVAL, + (uint16_t)SLAVE_LATENCY, + (uint16_t)SUPERVISION_TIMEOUT +}; Ticker ticker; - +Serial pc(USBTX, USBRX); void periodicCallback(void) { alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */ } void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { - if (params->peerAddr[0] != 0x37) { /* !ALERT! Alter this filter to suit your device. */ + uint8_t con_status =0; + Gap::GapState_t con_state; + if (params->peerAddr[0] != 0x2F) { /* !ALERT! Alter this filter to suit your device. */ return; } - printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n", + pc.printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n", params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0], params->rssi, params->isScanResponse, params->type); - - BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL); + // con_state = BLE::Instance().gap().getState(); + //pc.printf("Connection state : %d\r\n",con_state); + uint8_t count=0; + // while(!con_status) + // { + pc.printf("Count : %d",count++); + con_status = BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, &m_conn_params, NULL); + pc.printf("Connection Status : %d\r\n",con_status); + con_state = BLE::Instance().gap().getState(); + pc.printf("Connection state : %d\r\n",con_state); + // } + BLE::Instance().gap().stopScan(); } void serviceDiscoveryCallback(const DiscoveredService *service) { if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) { - printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle()); + pc.printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle()); } else { - printf("S UUID-"); + pc.printf("S UUID-"); const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID(); for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) { printf("%02x", longUUIDBytes[i]); } - printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle()); + pc.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle()); } } void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) { - printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast()); + pc.printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast()); if (characteristicP->getUUID().getShortUUID() == 0xa001) { /* !ALERT! Alter this filter to suit your device. */ ledCharacteristic = *characteristicP; triggerLedCharacteristic = true; @@ -63,10 +88,11 @@ } void discoveryTerminationCallback(Gap::Handle_t connectionHandle) { - printf("terminated SD for handle %u\r\n", connectionHandle); + pc.printf("terminated SD for handle %u\r\n", connectionHandle); } void connectionCallback(const Gap::ConnectionCallbackParams_t *params) { + pc.printf("Connection Callback\n\r"); if (params->role == Gap::CENTRAL) { BLE::Instance().gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback); BLE::Instance().gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xa000, 0xa001); @@ -80,7 +106,7 @@ for (unsigned index = 0; index < response->len; index++) { printf("%c[%02x]", response->data[index], response->data[index]); } - printf("\r\n"); + pc.printf("\r\n"); #endif uint8_t toggledValue = response->data[0] ^ 0x1; @@ -95,7 +121,7 @@ } void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { - printf("disconnected\r\n"); + pc.printf("disconnected\r\n"); } /** @@ -120,6 +146,7 @@ return; } + pc.printf("Ble Init\n\r"); /* Ensure that it is the default instance of BLE */ if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; @@ -137,9 +164,14 @@ int main(void) { ticker.attach(periodicCallback, 1); - + pc.baud(9600); + wait(8.0); + pc.printf("Start\n\r"); BLE &ble = BLE::Instance(); + + ble.init(bleInitComplete); + ble.gap().setDeviceName("Samy"); /* SpinWait for initialization to complete. This is necessary because the * BLE object is used in the main loop below. */