Example for GPS with SDT BLE Board

Committer:
group-Sigma-Delta-Technologies
Date:
Mon Sep 17 03:41:49 2018 +0000
Revision:
0:f3a4601deaa5
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-Sigma-Delta-Technologies 0:f3a4601deaa5 1 /* SDT-example-ble-uart-gps
group-Sigma-Delta-Technologies 0:f3a4601deaa5 2 *
group-Sigma-Delta-Technologies 0:f3a4601deaa5 3 * Copyright (c) 2018 Sigma Delta Technologies Inc.
group-Sigma-Delta-Technologies 0:f3a4601deaa5 4 *
group-Sigma-Delta-Technologies 0:f3a4601deaa5 5 * MIT License
group-Sigma-Delta-Technologies 0:f3a4601deaa5 6 *
group-Sigma-Delta-Technologies 0:f3a4601deaa5 7 * Permission is hereby granted, free of charge, to any person
group-Sigma-Delta-Technologies 0:f3a4601deaa5 8 * obtaining a copy of this software and associated documentation
group-Sigma-Delta-Technologies 0:f3a4601deaa5 9 * files (the "Software"), to deal in the Software without
group-Sigma-Delta-Technologies 0:f3a4601deaa5 10 * restriction, including without limitation the rights to use,
group-Sigma-Delta-Technologies 0:f3a4601deaa5 11 * copy, modify, merge, publish, distribute, sublicense, and/or sell
group-Sigma-Delta-Technologies 0:f3a4601deaa5 12 * copies of the Software, and to permit persons to whom the
group-Sigma-Delta-Technologies 0:f3a4601deaa5 13 * Software is furnished to do so, subject to the following
group-Sigma-Delta-Technologies 0:f3a4601deaa5 14 * conditions:
group-Sigma-Delta-Technologies 0:f3a4601deaa5 15 *
group-Sigma-Delta-Technologies 0:f3a4601deaa5 16 * The above copyright notice and this permission notice shall be
group-Sigma-Delta-Technologies 0:f3a4601deaa5 17 * included in all copies or substantial portions of the Software.
group-Sigma-Delta-Technologies 0:f3a4601deaa5 18 *
group-Sigma-Delta-Technologies 0:f3a4601deaa5 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
group-Sigma-Delta-Technologies 0:f3a4601deaa5 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
group-Sigma-Delta-Technologies 0:f3a4601deaa5 21 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
group-Sigma-Delta-Technologies 0:f3a4601deaa5 22 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
group-Sigma-Delta-Technologies 0:f3a4601deaa5 23 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
group-Sigma-Delta-Technologies 0:f3a4601deaa5 24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
group-Sigma-Delta-Technologies 0:f3a4601deaa5 25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
group-Sigma-Delta-Technologies 0:f3a4601deaa5 26 * OTHER DEALINGS IN THE SOFTWARE.
group-Sigma-Delta-Technologies 0:f3a4601deaa5 27 */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 28
group-Sigma-Delta-Technologies 0:f3a4601deaa5 29 #include "mbed.h"
group-Sigma-Delta-Technologies 0:f3a4601deaa5 30 #include "features/FEATURE_BLE/ble/BLE.h"
group-Sigma-Delta-Technologies 0:f3a4601deaa5 31 #include "features/FEATURE_BLE/ble/services/UARTService.h"
group-Sigma-Delta-Technologies 0:f3a4601deaa5 32
group-Sigma-Delta-Technologies 0:f3a4601deaa5 33 /* Serial */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 34 #define BAUDRATE 9600
group-Sigma-Delta-Technologies 0:f3a4601deaa5 35 Serial g_Serial_pc(USBTX, USBRX, BAUDRATE);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 36
group-Sigma-Delta-Technologies 0:f3a4601deaa5 37 /* DigitalOut */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 38 #define LED_ON 0
group-Sigma-Delta-Technologies 0:f3a4601deaa5 39 #define LED_OFF 1
group-Sigma-Delta-Technologies 0:f3a4601deaa5 40 DigitalOut g_DO_LedRed(LED_RED, LED_OFF);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 41 DigitalOut g_DO_LedGreen(LED_GREEN, LED_OFF);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 42 DigitalOut g_DO_LedBlue(LED_BLUE, LED_OFF);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 43 DigitalOut* g_pDO_Led = &g_DO_LedBlue;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 44
group-Sigma-Delta-Technologies 0:f3a4601deaa5 45 /* Ticker */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 46 Ticker g_Ticker;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 47
group-Sigma-Delta-Technologies 0:f3a4601deaa5 48 /* EventQueue */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 49 EventQueue g_EventQueue(/* event count */ 16 * /* event size */ 32);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 50
group-Sigma-Delta-Technologies 0:f3a4601deaa5 51 /* BLE */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 52 #define BLE_DEVICE_NAME "SDT Device"
group-Sigma-Delta-Technologies 0:f3a4601deaa5 53 BLE& g_pBle = BLE::Instance(); // you can't use this name, 'ble', because this name is already declared in UARTService.h
group-Sigma-Delta-Technologies 0:f3a4601deaa5 54
group-Sigma-Delta-Technologies 0:f3a4601deaa5 55 /* UART service */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 56 #define UARTSERVICE_WRITE_DATA_MAX 20
group-Sigma-Delta-Technologies 0:f3a4601deaa5 57 UARTService* g_pUartService;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 58
group-Sigma-Delta-Technologies 0:f3a4601deaa5 59 /* Variable */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 60 bool g_b_BleConnect = false;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 61 bool g_b_UartStart = false;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 62 unsigned char g_puc_UartRxBuf[50] = {'\0', }; // DataBuffer to write by BLE
group-Sigma-Delta-Technologies 0:f3a4601deaa5 63
group-Sigma-Delta-Technologies 0:f3a4601deaa5 64
group-Sigma-Delta-Technologies 0:f3a4601deaa5 65
group-Sigma-Delta-Technologies 0:f3a4601deaa5 66 void callbackTicker(void) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 67 // g_Serial_pc.printf("LED Toggle\n");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 68 *g_pDO_Led = !(*g_pDO_Led);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 69 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 70
group-Sigma-Delta-Technologies 0:f3a4601deaa5 71 void readWriteData(void) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 72 if (g_b_UartStart) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 73 char data = g_Serial_pc.getc();
group-Sigma-Delta-Technologies 0:f3a4601deaa5 74
group-Sigma-Delta-Technologies 0:f3a4601deaa5 75 if (data == '$') { // GPS data is $GPxxxxxxxxxx
group-Sigma-Delta-Technologies 0:f3a4601deaa5 76 unsigned char rxBufIndex = 0;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 77
group-Sigma-Delta-Technologies 0:f3a4601deaa5 78 while (true) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 79 data = g_Serial_pc.getc();
group-Sigma-Delta-Technologies 0:f3a4601deaa5 80 if (data != '$') {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 81 g_puc_UartRxBuf[rxBufIndex++] = data;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 82 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 83 else {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 84 break;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 85 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 86 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 87 g_Serial_pc.printf("%s\n", g_puc_UartRxBuf); // For debug
group-Sigma-Delta-Technologies 0:f3a4601deaa5 88
group-Sigma-Delta-Technologies 0:f3a4601deaa5 89 if (g_pUartService) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 90 g_pUartService->write(g_puc_UartRxBuf, UARTSERVICE_WRITE_DATA_MAX); // Elements of first parameter(const void *_buffer) are copied to 'sendBuffer' in write() just as much second parameter(size_t length).
group-Sigma-Delta-Technologies 0:f3a4601deaa5 91 // When the number of elements in sendBuffer is 20, the data of sendBuffer will be transmitted by BLE.
group-Sigma-Delta-Technologies 0:f3a4601deaa5 92 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 93 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 94 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 95 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 96
group-Sigma-Delta-Technologies 0:f3a4601deaa5 97 void callbackPeriodicEvent(void) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 98 if (g_pBle.gap().getState().connected) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 99 g_EventQueue.call(readWriteData);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 100 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 101 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 102
group-Sigma-Delta-Technologies 0:f3a4601deaa5 103 void callbackEventsToProcess(BLE::OnEventsToProcessCallbackContext* context) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 104 g_EventQueue.call(Callback<void()>(&g_pBle, &BLE::processEvents));
group-Sigma-Delta-Technologies 0:f3a4601deaa5 105 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 106
group-Sigma-Delta-Technologies 0:f3a4601deaa5 107 void callbackBleDataWritten(const GattWriteCallbackParams* params) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 108 if ((g_pUartService != NULL) && (params->handle == g_pUartService->getTXCharacteristicHandle())) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 109 // uint16_t bytesRead = params->len;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 110 const unsigned char* pBleRxBuf = params->data;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 111 // g_Serial_pc.printf("data from BLE : %s\r\n", params->data); // For debug
group-Sigma-Delta-Technologies 0:f3a4601deaa5 112
group-Sigma-Delta-Technologies 0:f3a4601deaa5 113 if (pBleRxBuf[0] == 's') {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 114 g_b_UartStart = true;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 115 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 116 else if (pBleRxBuf[0] == 'p') {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 117 g_b_UartStart = false;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 118 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 119 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 120 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 121
group-Sigma-Delta-Technologies 0:f3a4601deaa5 122 void callbackBleConnection(const Gap::ConnectionCallbackParams_t* params) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 123 // g_Serial_pc.printf("Connected!\n");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 124 g_b_BleConnect = true;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 125 *g_pDO_Led = LED_OFF;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 126 g_pDO_Led = &g_DO_LedGreen;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 127 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 128
group-Sigma-Delta-Technologies 0:f3a4601deaa5 129 void callbackBleDisconnection(const Gap::DisconnectionCallbackParams_t* params) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 130 g_Serial_pc.printf("Disconnected!\n");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 131 g_Serial_pc.printf("Restarting the advertising process\n\r");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 132 g_b_BleConnect = false;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 133 *g_pDO_Led = LED_OFF;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 134 g_pDO_Led = &g_DO_LedBlue;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 135 g_pBle.gap().startAdvertising();
group-Sigma-Delta-Technologies 0:f3a4601deaa5 136 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 137
group-Sigma-Delta-Technologies 0:f3a4601deaa5 138 void callbackBleInitComplete(BLE::InitializationCompleteCallbackContext* params) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 139 BLE& ble = params->ble; // 'ble' equals g_pBle declared in global
group-Sigma-Delta-Technologies 0:f3a4601deaa5 140 ble_error_t error = params->error; // 'error' has BLE_ERROR_NONE if the initialization procedure started successfully.
group-Sigma-Delta-Technologies 0:f3a4601deaa5 141
group-Sigma-Delta-Technologies 0:f3a4601deaa5 142 if (error == BLE_ERROR_NONE) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 143 // g_Serial_pc.printf("Initialization completed successfully\n");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 144 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 145 else {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 146 /* In case of error, forward the error handling to onBleInitError */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 147 // g_Serial_pc.printf("Initialization failled\n");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 148 return;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 149 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 150
group-Sigma-Delta-Technologies 0:f3a4601deaa5 151 /* Ensure that it is the default instance of BLE */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 152 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 153 // g_Serial_pc.printf("ID of BLE instance is not DEFAULT_INSTANCE\n");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 154 return;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 155 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 156
group-Sigma-Delta-Technologies 0:f3a4601deaa5 157 /* Setup UARTService */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 158 g_pUartService = new UARTService(ble);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 159
group-Sigma-Delta-Technologies 0:f3a4601deaa5 160 /* Setup and start advertising */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 161 ble.gattServer().onDataWritten(callbackBleDataWritten);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 162 ble.gap().onConnection(callbackBleConnection);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 163 ble.gap().onDisconnection(callbackBleDisconnection);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 164 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 165 ble.gap().setAdvertisingInterval(1000); // Advertising interval in units of milliseconds
group-Sigma-Delta-Technologies 0:f3a4601deaa5 166 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 167 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)BLE_DEVICE_NAME, sizeof(BLE_DEVICE_NAME) - 1);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 168 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
group-Sigma-Delta-Technologies 0:f3a4601deaa5 169 ble.gap().startAdvertising();
group-Sigma-Delta-Technologies 0:f3a4601deaa5 170 // g_Serial_pc.printf("Start advertising\n");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 171 }
group-Sigma-Delta-Technologies 0:f3a4601deaa5 172
group-Sigma-Delta-Technologies 0:f3a4601deaa5 173 int main(void) {
group-Sigma-Delta-Technologies 0:f3a4601deaa5 174 // g_Serial_pc.printf("< Sigma Delta Technologies Inc. >\n\r");
group-Sigma-Delta-Technologies 0:f3a4601deaa5 175
group-Sigma-Delta-Technologies 0:f3a4601deaa5 176 /* Init BLE */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 177 g_pBle.onEventsToProcess(callbackEventsToProcess);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 178 g_pBle.init(callbackBleInitComplete);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 179
group-Sigma-Delta-Technologies 0:f3a4601deaa5 180 /* Check whether IC is running or not */
group-Sigma-Delta-Technologies 0:f3a4601deaa5 181 g_Ticker.attach(callbackTicker, 1);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 182
group-Sigma-Delta-Technologies 0:f3a4601deaa5 183 g_EventQueue.call_every(300, callbackPeriodicEvent);
group-Sigma-Delta-Technologies 0:f3a4601deaa5 184 g_EventQueue.dispatch_forever();
group-Sigma-Delta-Technologies 0:f3a4601deaa5 185
group-Sigma-Delta-Technologies 0:f3a4601deaa5 186 return 0;
group-Sigma-Delta-Technologies 0:f3a4601deaa5 187 }