Exercise 6 BLE UART
Dependencies: BLE_API X_NUCLEO_IDB0XA1 mbed
Fork of BLE_UART_IDB0XA1 by
Diff: main.cpp
- Revision:
- 7:8490fe113598
- Parent:
- 3:e0efdb741bd4
- Child:
- 8:60033323cbcb
--- a/main.cpp Fri Sep 16 10:36:43 2016 +0000 +++ b/main.cpp Tue Apr 25 15:26:50 2017 +0000 @@ -16,44 +16,77 @@ #include "mbed.h" #include "ble/BLE.h" -#include "LEDService.h" +#include "ble/services/UARTService.h" +#include "Serial.h" + +#define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN*10) -DigitalOut actuatedLED(LED1, 0); - -const static char DEVICE_NAME[] = "LED"; -static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID}; +const static char DEVICE_NAME[] = "UART"; +UARTService *uartServicePtr; +static uint8_t uartBuff[UART_BUFFER]; +static uint8_t uartBuffPos=0; -LEDService *ledServicePtr; +void onBleError(ble_error_t error); + +DigitalOut led1(LED1); +Serial uart1(USBTX,USBRX); +Ticker ticker; -void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) +#define DEBUG uart1.printf + +/* Ticker */ +void periodicCallback(void) { - (void)params; - BLE::Instance().gap().startAdvertising(); // restart advertising + led1 = !led1; } -/** - * This callback allows the LEDService to receive updates to the ledState Characteristic. - * - * @param[in] params - * Information about the characterisitc being updated. - */ -void onDataWrittenCallback(const GattWriteCallbackParams *params) { - if ((params->handle == ledServicePtr->getValueHandle()) && (params->len == 1)) { - actuatedLED = *(params->data); +/* UART */ +void uartRx(void) +{ + if(uart1.readable()){ + uartBuff[uartBuffPos] = uart1.getc(); + if((uartBuff[uartBuffPos] == '\r') || (uartBuff[uartBuffPos] == '\n') || (uartBuffPos >= UART_BUFFER)) { + uartBuff[uartBuffPos] = '\0'; + /* We are sending the whole string even if less than BLE_UART_SERVICE_MAX_DATA_LEN otherwise we need to wait */ + uartServicePtr->write(uartBuff, (uartBuffPos/UARTService::BLE_UART_SERVICE_MAX_DATA_LEN +1) * UARTService::BLE_UART_SERVICE_MAX_DATA_LEN); + DEBUG("TX : %s\r\n", uartBuff); + memset(uartBuff, 0, UART_BUFFER); + uartBuffPos = 0; + } + else + uartBuffPos++; } } -/** - * This function is called when the ble initialization process has failled - */ -void onBleInitError(BLE &ble, ble_error_t error) -{ - /* Initialization error handling should go here */ + +/* BLE */ +void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params) { + DEBUG("BLE Client Connected!\n\r"); + DEBUG("Please type a string and press return\r\n"); + + ticker.attach(periodicCallback, 1); +} + +void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) +{ + (void)params; + DEBUG("BLE Client Disconnected!\r\n"); + ticker.detach(); + BLE::Instance().gap().startAdvertising(); // restart advertising + led1=0; +} + +void BleOnDataWrittenCallback(const GattWriteCallbackParams *params) { + if (params->handle == uartServicePtr->getTXCharacteristicHandle()){ + DEBUG("RX: %s\r\n", params->data); + } +} + +void onBleError(ble_error_t error) { + DEBUG("BLE Error: %d\r\n"); + /* Handle error now */ } -/** - * Callback triggered when the ble initialization process has finished - */ void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { BLE& ble = params->ble; @@ -61,7 +94,7 @@ if (error != BLE_ERROR_NONE) { /* In case of error, forward the error handling to onBleInitError */ - onBleInitError(ble, error); + onBleError(error); return; } @@ -70,18 +103,22 @@ return; } - ble.gap().onDisconnection(disconnectionCallback); - ble.gattServer().onDataWritten(onDataWrittenCallback); + ble.gap().onConnection(BleConnectionCallback); + ble.gap().onDisconnection(BleDisconnectionCallback); + ble.gattServer().onDataWritten(BleOnDataWrittenCallback); - bool initialValueForLEDCharacteristic = true; - ledServicePtr = new LEDService(ble, initialValueForLEDCharacteristic); + DEBUG("BLE UARTService: "); + /* Setup primary service. */ + UARTService uartService(ble); + uartServicePtr = &uartService; + DEBUG("Started\r\n"); /* setup advertising */ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); - ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); - ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ + ble.gap().setAdvertisingInterval(500); /* 500ms. */ ble.gap().startAdvertising(); while (true) { @@ -91,8 +128,11 @@ int main(void) { + led1=0; + + uart1.baud(9600); + uart1.attach(uartRx,Serial::RxIrq); BLE &ble = BLE::Instance(); - ble.init(bleInitComplete); }