![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
This is a demo for controlling your ShieldBot using your mobile phone
Dependencies: BLE_API ShieldBot_v12 mbed nRF51822
Fork of BLE_LoopbackUART by
Diff: main.cpp
- Revision:
- 2:e060367b9024
- Parent:
- 0:e910d9bb040f
- Child:
- 5:4bc41267a03a
diff -r 73a5e28ff0ab -r e060367b9024 main.cpp --- a/main.cpp Fri Jun 13 08:48:43 2014 +0000 +++ b/main.cpp Fri Jun 13 11:19:22 2014 +0100 @@ -15,143 +15,87 @@ */ #include "mbed.h" -#include "nRF51822n.h" +#include "BLEDevice.h" -#define BLE_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */ -#define BLE_UUID_NUS_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */ -#define BLE_UUID_NUS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */ +#define BLE_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */ +#define BLE_UUID_NUS_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */ +#define BLE_UUID_NUS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */ -#ifdef DEBUG -#define LOG(args...) pc.printf(args) +#define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console; + * it will have an impact on code-size and power consumption. */ -Serial pc(USBTX, USBRX); +#if NEED_CONSOLE_OUTPUT +Serial pc(USBTX, USBRX); +#define DEBUG(...) { pc.printf(__VA_ARGS__); } #else -#define LOG(args...) -#endif +#define DEBUG(...) /* nothing */ +#endif /* #if NEED_CONSOLE_OUTPUT */ -nRF51822n nrf; /* BLE radio driver */ - -DigitalOut led1(p1); -DigitalOut advertisingStateLed(p30); +BLEDevice ble; +DigitalOut led1(LED1); // The Nordic UART Service -uint8_t uart_base_uuid[] = {0x6e, 0x40, 0x01, 0x00, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5,0x0e, 0x24, 0xdc, 0xca, 0x9e}; +static const uint8_t uart_base_uuid[] = {0x6e, 0x40, 0x00, 0x01, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5,0x0e, 0x24, 0xdc, 0xca, 0x9e}; +static const uint8_t uart_tx_uuid[] = {0x6e, 0x40, 0x00, 0x02, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5,0x0e, 0x24, 0xdc, 0xca, 0x9e}; +static const uint8_t uart_rx_uuid[] = {0x6e, 0x40, 0x00, 0x03, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5,0x0e, 0x24, 0xdc, 0xca, 0x9e}; +static const uint8_t uart_base_uuid_rev[] = {0x9e, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0, 0x93, 0xf3, 0xa3, 0xb5, 0x01, 0x00, 0x40, 0x6e}; uint8_t txPayload[8] = {0,}; uint8_t rxPayload[8] = {0,}; -GattService uartService (uart_base_uuid); -GattCharacteristic txCharacteristic (BLE_UUID_NUS_TX_CHARACTERISTIC, 1, 8, - GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE); -GattCharacteristic rxCharacteristic (BLE_UUID_NUS_RX_CHARACTERISTIC, 1, 8, - GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); - -/* Advertising data and parameters */ -GapAdvertisingData advData; -GapAdvertisingData scanResponse; -GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED ); - -uint16_t uuid16_list[] = {BLE_UUID_NUS_SERVICE}; +GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, 8, + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE); +GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, 8, + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); +GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic}; +GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *)); -/**************************************************************************/ -/*! - @brief This custom class can be used to override any GapEvents - that you are interested in handling on an application level. -*/ -/**************************************************************************/ -class GapEventHandler : public GapEvents +void disconnectionCallback(void) { - //virtual void onTimeout(void) {} - - virtual void onConnected(void) { - advertisingStateLed = 0; - LOG("Connected!\n\r"); - } - - /* When a client device disconnects we need to start advertising again. */ - virtual void onDisconnected(void) { - nrf.getGap().startAdvertising(advParams); - advertisingStateLed = 1; - LOG("Disconnected!\n\r"); - LOG("Restarting the advertising process\n\r"); - } -}; + DEBUG("Disconnected!\n\r"); + DEBUG("Restarting the advertising process\n\r"); + ble.startAdvertising(); +} -/**************************************************************************/ -/*! - @brief This custom class can be used to override any GattServerEvents - that you are interested in handling on an application level. -*/ -/**************************************************************************/ -class GattServerEventHandler : public GattServerEvents +void onDataWritten(uint16_t charHandle) { - virtual void onDataSent(uint16_t charHandle) { - if (charHandle == txCharacteristic.handle) { - LOG("onDataSend()\n\r"); - - } + if (charHandle == txCharacteristic.getHandle()) { + DEBUG("onDataWritten()\n\r"); + uint16_t bytesRead; + ble.readCharacteristicValue(txCharacteristic.getHandle(), txPayload, &bytesRead); + DEBUG("ECHO: %s\n\r", (char *)txPayload); + ble.updateCharacteristicValue(rxCharacteristic.getHandle(), txPayload, bytesRead); } +} - virtual void onDataWritten(uint16_t charHandle) { - if (charHandle == txCharacteristic.handle) { - LOG("onDataWritten()\n\r"); - nrf.getGattServer().readValue(txCharacteristic.handle, txPayload, 8); // Current APIs don't provide the length of the payload - LOG("ECHO: %s\n\r", (char *)txPayload); - nrf.getGattServer().updateValue(rxCharacteristic.handle, txPayload, 8); - } - } - - virtual void onUpdatesEnabled(uint16_t charHandle) { - LOG("onUpdateEnabled\n\r"); - } +void periodicCallback(void) +{ + led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ +} - virtual void onUpdatesDisabled(uint16_t charHandle) { - LOG("onUpdatesDisabled\n\r"); - } - - //virtual void onConfirmationReceived(uint16_t charHandle) {} -}; - -/**************************************************************************/ -/*! - @brief Program entry point -*/ -/**************************************************************************/ int main(void) { - - /* Setup an event handler for GAP events i.e. Client/Server connection events. */ - nrf.getGap().setEventHandler(new GapEventHandler()); - nrf.getGattServer().setEventHandler(new GattServerEventHandler()); - - /* Initialise the nRF51822 */ - nrf.init(); + led1 = 1; + Ticker ticker; + ticker.attach(periodicCallback, 1); - /* Make sure we get a clean start */ - nrf.reset(); - - /* Add BLE-Only flag and complete service list to the advertising data */ - advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED); - advData.addData(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, - (uint8_t*)uuid16_list, sizeof(uuid16_list)); + DEBUG("Initialising the nRF51822\n\r"); + ble.init(); + ble.onDisconnection(disconnectionCallback); + ble.onDataWritten(onDataWritten); - advData.addData(GapAdvertisingData::SHORTENED_LOCAL_NAME, - (uint8_t*)"BLE UART", sizeof("BLE UART") - 1); - - advData.addAppearance(GapAdvertisingData::UNKNOWN); - nrf.getGap().setAdvertisingData(advData, scanResponse); + /* setup advertising */ + ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); + ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, + (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1); + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, + (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid)); - /* UART Service */ - uartService.addCharacteristic(rxCharacteristic); - uartService.addCharacteristic(txCharacteristic); - nrf.getGattServer().addService(uartService); + ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ + ble.startAdvertising(); - /* Start advertising (make sure you've added all your data first) */ - nrf.getGap().startAdvertising(advParams); - - advertisingStateLed = 1; + ble.addService(uartService); - /* Do blinky on LED1 while we're waiting for BLE events */ - for (;;) { - led1 = !led1; - wait(1); + while (true) { + ble.waitForEvent(); } }