SDT Inc.
/
SDT-example-ble-uart-echo
Example for Healthcare Kit
Diff: main.cpp
- Revision:
- 0:5ed42babfd71
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Sep 17 02:26:52 2018 +0000 @@ -0,0 +1,161 @@ +/* SDT-example-ble-uart-echo + * + * Copyright (c) 2018 Sigma Delta Technologies Inc. + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "mbed.h" +#include "features/FEATURE_BLE/ble/BLE.h" +#include "features/FEATURE_BLE/ble/services/UARTService.h" + +/* Serial */ +#define BAUDRATE 9600 +Serial g_Serial_pc(USBTX, USBRX, BAUDRATE); + +/* DigitalOut */ +#define LED_ON 0 +#define LED_OFF 1 +DigitalOut g_DO_LedRed(LED_RED, LED_OFF); +DigitalOut g_DO_LedGreen(LED_GREEN, LED_OFF); +DigitalOut g_DO_LedBlue(LED_BLUE, LED_OFF); +DigitalOut* g_pDO_Led = &g_DO_LedBlue; + +/* Ticker */ +Ticker g_Ticker; + +/* BLE */ +#define BLE_DEVICE_NAME "SDT Device" +BLE& g_pBle = BLE::Instance(); // you can't use this name, 'ble', because this name is already declared in UARTService.h + +/* UART service */ +UARTService* g_pUartService; + +/* Variable */ +bool g_b_BleConnect = false; + + + +void callbackTicker(void) { + g_Serial_pc.printf("LED Toggle\n"); + // *g_pDO_Led = !(*g_pDO_Led); +} + +void setLED(char data) { + if (data <= 0) { + return; + } + + if (data == 'R' || data == 'r') { + g_DO_LedRed = 0; g_DO_LedGreen = 1; g_DO_LedBlue = 1; + } + else if (data == 'G' || data == 'g') { + g_DO_LedRed = 1; g_DO_LedGreen = 0; g_DO_LedBlue = 1; + } + else if (data == 'B' || data == 'b') { + g_DO_LedRed = 1; g_DO_LedGreen = 1; g_DO_LedBlue = 0; + } + else { + g_DO_LedRed = 1; g_DO_LedGreen = 1; g_DO_LedBlue = 1; + } +} + +void callbackBleDataWritten(const GattWriteCallbackParams* params) { + if ((g_pUartService != NULL) && (params->handle == g_pUartService->getTXCharacteristicHandle())) { + uint16_t bytesRead = params->len; + const uint8_t* pBleRxBuf = params->data; + g_Serial_pc.printf("data from BLE: %s\r\n", pBleRxBuf); + + g_pBle.gattServer().write(g_pUartService->getRXCharacteristicHandle(), pBleRxBuf, bytesRead); + setLED(pBleRxBuf[0]); + } +} + +void callbackBleConnection(const Gap::ConnectionCallbackParams_t* params) { + g_Serial_pc.printf("Connected!\n"); + g_b_BleConnect = true; + *g_pDO_Led = LED_OFF; + g_pDO_Led = &g_DO_LedGreen; +} + +void callbackBleDisconnection(const Gap::DisconnectionCallbackParams_t* params) { + g_Serial_pc.printf("Disconnected!\n"); + g_Serial_pc.printf("Restarting the advertising process\n\r"); + g_b_BleConnect = false; + *g_pDO_Led = LED_OFF; + g_pDO_Led = &g_DO_LedBlue; + g_pBle.gap().startAdvertising(); +} + +void callbackBleInitComplete(BLE::InitializationCompleteCallbackContext* params) { + BLE& ble = params->ble; // 'ble' equals g_pBle declared in global + ble_error_t error = params->error; // 'error' has BLE_ERROR_NONE if the initialization procedure started successfully. + + if (error == BLE_ERROR_NONE) { + g_Serial_pc.printf("Initialization completed successfully\n"); + } + else { + /* In case of error, forward the error handling to onBleInitError */ + g_Serial_pc.printf("Initialization failled\n"); + return; + } + + /* Ensure that it is the default instance of BLE */ + if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { + g_Serial_pc.printf("ID of BLE instance is not DEFAULT_INSTANCE\n"); + return; + } + + /* Setup UARTService */ + g_pUartService = new UARTService(ble); + + /* Setup and start advertising */ + ble.gattServer().onDataWritten(callbackBleDataWritten); + ble.gap().onConnection(callbackBleConnection); + ble.gap().onDisconnection(callbackBleDisconnection); + ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + ble.gap().setAdvertisingInterval(1000); // Advertising interval in units of milliseconds + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)BLE_DEVICE_NAME, sizeof(BLE_DEVICE_NAME) - 1); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); + ble.gap().startAdvertising(); + g_Serial_pc.printf("Start advertising\n"); +} + +int main(void) { + g_Serial_pc.printf("< Sigma Delta Technologies Inc. >\n\r"); + + /* Init BLE */ + // g_pBle.onEventsToProcess(callbackEventsToProcess); + g_pBle.init(callbackBleInitComplete); + + /* Check whether IC is running or not */ + g_Ticker.attach(callbackTicker, 1); + + while (true) { + g_pBle.waitForEvent(); + } + + return 0; +}