A basic demo where a message sent over a BLE UART gets displayed on a low-power eInk display.
Dependencies: BLE_API SharpLCD mbed nRF51822
Revision 0:6b62bf1cc2ba, committed 2014-07-30
- Comitter:
- rgrover1
- Date:
- Wed Jul 30 07:57:10 2014 +0000
- Child:
- 1:5f4043f4c997
- Commit message:
- Initial checkin for a demo based on BLE_UART and SharpLCD.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BLE_API.lib Wed Jul 30 07:57:10 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#8559a2da6f41
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SharpLCD.lib Wed Jul 30 07:57:10 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/rgrover1/code/SharpLCD/#270ee57c0367
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jul 30 07:57:10 2014 +0000 @@ -0,0 +1,134 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mbed.h" +#include "BLEDevice.h" +#include "SharpLCD.hpp" +#include "font.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 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. */ + +#if NEED_CONSOLE_OUTPUT +Serial pc(USBTX, USBRX); +#define DEBUG(...) { pc.printf(__VA_ARGS__); } +#else +#define DEBUG(...) /* nothing */ +#endif /* #if NEED_CONSOLE_OUTPUT */ + +BLEDevice ble; +DigitalOut led1(LED1); + +// The Nordic UART Service +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}; + +bool rxPayloadUpdated = false; +uint8_t rxPayload[20] = {0,}; +uint8_t txPayload[20] = {0,}; +GattCharacteristic rxCharacteristic (uart_tx_uuid, rxPayload, 1, sizeof(rxPayload), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE); +GattCharacteristic txCharacteristic (uart_rx_uuid, txPayload, 1, sizeof(txPayload), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); +GattCharacteristic *uartChars[] = {&rxCharacteristic, &txCharacteristic}; +GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *)); + + +uint8_t framebuffer[SharpLCD::SIZEOF_FRAMEBUFFER_FOR_ALLOC]; + +void disconnectionCallback(uint16_t handle) +{ + DEBUG("Disconnected!\n\r"); + DEBUG("Restarting the advertising process\n\r"); + ble.startAdvertising(); +} + +void onDataWritten(uint16_t charHandle) +{ + if (charHandle == rxCharacteristic.getHandle()) { + DEBUG("onDataWritten()\n\r"); + uint16_t bytesRead; + ble.readCharacteristicValue(rxCharacteristic.getHandle(), rxPayload, &bytesRead); + DEBUG("ECHO: %s\n\r", (char *)rxPayload); + ble.updateCharacteristicValue(txCharacteristic.getHandle(), rxPayload, bytesRead); + rxPayloadUpdated = true; + } +} + +void periodicCallback(void) +{ + led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ +} + +int main(void) +{ + led1 = 1; + Ticker ticker; + ticker.attach(periodicCallback, 1); + + DEBUG("Initialising the nRF51822\n\r"); + ble.init(); + ble.onDisconnection(disconnectionCallback); + ble.onDataWritten(onDataWritten); + + /* 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)); + + ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ + ble.startAdvertising(); + + ble.addService(uartService); + + SharpLCD lcd(p21 /* display enable */, SPI_PSELSS0, SPI_PSELMOSI0, SPI_PSELMISO0, SPI_PSELSCK0, NC); + SharpLCD::FrameBuffer fb(framebuffer); + + lcd.enableDisplay(); + lcd.clear(); + fb.printString(lookupFontFace("DejaVu Serif", 8), + 20, + 40, + BLACK, + "Init"); + lcd.drawFrameBuffer(fb); + + while (true) { + if (rxPayloadUpdated) { + fb.clear(); + lcd.drawFrameBuffer(fb); + fb.printString(lookupFontFace("DejaVu Serif", 8), + 20, + 40, + BLACK, + (const char *)rxPayload); + lcd.drawFrameBuffer(fb); + + rxPayloadUpdated = false; + } + + ble.waitForEvent(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Jul 30 07:57:10 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/6213f644d804 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nRF51822.lib Wed Jul 30 07:57:10 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#1e5c300cec7f