DongKeun Kang / Mbed OS mbed-os-example-ble-UARTConsol
Committer:
mirika
Date:
Sat May 12 02:42:06 2018 +0000
Revision:
2:ce6be5c83dde
Parent:
1:2237580e56f1
receive ???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mirika 0:f046a5fadbe8 1 /* mbed Microcontroller Library
mirika 0:f046a5fadbe8 2 * Copyright (c) 2006-2014 ARM Limited
mirika 0:f046a5fadbe8 3 *
mirika 0:f046a5fadbe8 4 * Licensed under the Apache License, Version 2.0 (the "License");
mirika 0:f046a5fadbe8 5 * you may not use this file except in compliance with the License.
mirika 0:f046a5fadbe8 6 * You may obtain a copy of the License at
mirika 0:f046a5fadbe8 7 *
mirika 0:f046a5fadbe8 8 * http://www.apache.org/licenses/LICENSE-2.0
mirika 0:f046a5fadbe8 9 *
mirika 0:f046a5fadbe8 10 * Unless required by applicable law or agreed to in writing, software
mirika 0:f046a5fadbe8 11 * distributed under the License is distributed on an "AS IS" BASIS,
mirika 0:f046a5fadbe8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mirika 0:f046a5fadbe8 13 * See the License for the specific language governing permissions and
mirika 0:f046a5fadbe8 14 * limitations under the License.
mirika 0:f046a5fadbe8 15 */
mirika 0:f046a5fadbe8 16
mirika 0:f046a5fadbe8 17 #include <events/mbed_events.h>
mirika 0:f046a5fadbe8 18 #include <mbed.h>
mirika 0:f046a5fadbe8 19 #include "ble/BLE.h"
mirika 0:f046a5fadbe8 20 #include "ble/Gap.h"
mirika 1:2237580e56f1 21 #include "ble/services/UARTService.h"
mirika 0:f046a5fadbe8 22
mirika 0:f046a5fadbe8 23 DigitalOut led1(LED1, 1);
mirika 1:2237580e56f1 24 DigitalOut led2(LED2, 1);
mirika 0:f046a5fadbe8 25
mirika 2:ce6be5c83dde 26 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
mirika 2:ce6be5c83dde 27 * it will have an impact on code-size and power consumption. */
mirika 2:ce6be5c83dde 28
mirika 2:ce6be5c83dde 29 #if NEED_CONSOLE_OUTPUT
mirika 2:ce6be5c83dde 30 #define DEBUG(STR) { if (uartServicePtr) uartServicePtr->write(STR, strlen(STR)); }
mirika 2:ce6be5c83dde 31 #else
mirika 2:ce6be5c83dde 32 #define DEBUG(...) /* nothing */
mirika 2:ce6be5c83dde 33 #endif /* #if NEED_CONSOLE_OUTPUT */
mirika 2:ce6be5c83dde 34
mirika 2:ce6be5c83dde 35
mirika 2:ce6be5c83dde 36
mirika 2:ce6be5c83dde 37
mirika 1:2237580e56f1 38 static UARTService* uartServicePtr;
mirika 0:f046a5fadbe8 39
mirika 0:f046a5fadbe8 40 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
mirika 0:f046a5fadbe8 41
mirika 0:f046a5fadbe8 42 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
mirika 0:f046a5fadbe8 43 {
mirika 0:f046a5fadbe8 44 BLE::Instance().gap().startAdvertising();
mirika 0:f046a5fadbe8 45 }
mirika 0:f046a5fadbe8 46
mirika 0:f046a5fadbe8 47
mirika 2:ce6be5c83dde 48 void dataReadCallback( const GattReadCallbackParams *params )
mirika 2:ce6be5c83dde 49 {
mirika 2:ce6be5c83dde 50 DEBUG("Receive\r\n");
mirika 2:ce6be5c83dde 51 }
mirika 0:f046a5fadbe8 52
mirika 0:f046a5fadbe8 53 void blinkCallback(void)
mirika 0:f046a5fadbe8 54 {
mirika 0:f046a5fadbe8 55 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
mirika 0:f046a5fadbe8 56
mirika 0:f046a5fadbe8 57 BLE &ble = BLE::Instance();
mirika 0:f046a5fadbe8 58 if (ble.gap().getState().connected) {
mirika 2:ce6be5c83dde 59 // DEBUG("Ping \r\n");
mirika 0:f046a5fadbe8 60 }
mirika 0:f046a5fadbe8 61 }
mirika 0:f046a5fadbe8 62
mirika 0:f046a5fadbe8 63 /**
mirika 0:f046a5fadbe8 64 * This function is called when the ble initialization process has failled
mirika 0:f046a5fadbe8 65 */
mirika 0:f046a5fadbe8 66 void onBleInitError(BLE &ble, ble_error_t error)
mirika 0:f046a5fadbe8 67 {
mirika 0:f046a5fadbe8 68 /* Initialization error handling should go here */
mirika 0:f046a5fadbe8 69 }
mirika 0:f046a5fadbe8 70
mirika 2:ce6be5c83dde 71
mirika 2:ce6be5c83dde 72
mirika 0:f046a5fadbe8 73
mirika 0:f046a5fadbe8 74 /**
mirika 0:f046a5fadbe8 75 * Callback triggered when the ble initialization process has finished
mirika 0:f046a5fadbe8 76 */
mirika 0:f046a5fadbe8 77 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mirika 0:f046a5fadbe8 78 {
mirika 0:f046a5fadbe8 79 BLE& ble = params->ble;
mirika 0:f046a5fadbe8 80 ble_error_t error = params->error;
mirika 0:f046a5fadbe8 81
mirika 0:f046a5fadbe8 82 if (error != BLE_ERROR_NONE) {
mirika 0:f046a5fadbe8 83 /* In case of error, forward the error handling to onBleInitError */
mirika 0:f046a5fadbe8 84 onBleInitError(ble, error);
mirika 0:f046a5fadbe8 85 return;
mirika 0:f046a5fadbe8 86 }
mirika 0:f046a5fadbe8 87
mirika 0:f046a5fadbe8 88 /* Ensure that it is the default instance of BLE */
mirika 0:f046a5fadbe8 89 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mirika 0:f046a5fadbe8 90 return;
mirika 0:f046a5fadbe8 91 }
mirika 0:f046a5fadbe8 92
mirika 0:f046a5fadbe8 93 ble.gap().onDisconnection(disconnectionCallback);
mirika 2:ce6be5c83dde 94 //ble.gattServer().onDataRead( dataReadCallback ); //const DataReadCallback_t & callback)
mirika 2:ce6be5c83dde 95 ble.onDataRead( dataReadCallback);
mirika 2:ce6be5c83dde 96
mirika 2:ce6be5c83dde 97 // ble.gap().onDataWritten( DataWriteCallback );
mirika 2:ce6be5c83dde 98 // ble.gap().onDataRead( DataReadCallback );
mirika 0:f046a5fadbe8 99
mirika 0:f046a5fadbe8 100 /* Setup primary service */
mirika 1:2237580e56f1 101 uartServicePtr = new UARTService(ble);
mirika 0:f046a5fadbe8 102
mirika 0:f046a5fadbe8 103 /* Setup advertising */
mirika 1:2237580e56f1 104 #if 0
mirika 0:f046a5fadbe8 105 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
mirika 0:f046a5fadbe8 106 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
mirika 0:f046a5fadbe8 107 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
mirika 0:f046a5fadbe8 108 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mirika 1:2237580e56f1 109
mirika 1:2237580e56f1 110 #else
mirika 1:2237580e56f1 111
mirika 1:2237580e56f1 112 /* setup advertising */
mirika 1:2237580e56f1 113 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
mirika 1:2237580e56f1 114 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mirika 1:2237580e56f1 115 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
mirika 1:2237580e56f1 116 (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
mirika 1:2237580e56f1 117 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
mirika 1:2237580e56f1 118 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
mirika 1:2237580e56f1 119 #endif
mirika 2:ce6be5c83dde 120 ble.gap().setAdvertisingInterval(100); /* 1000ms */
mirika 0:f046a5fadbe8 121 ble.gap().startAdvertising();
mirika 1:2237580e56f1 122
mirika 2:ce6be5c83dde 123 // printMacAddress();
mirika 0:f046a5fadbe8 124 }
mirika 0:f046a5fadbe8 125
mirika 0:f046a5fadbe8 126 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mirika 0:f046a5fadbe8 127 BLE &ble = BLE::Instance();
mirika 0:f046a5fadbe8 128 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
mirika 0:f046a5fadbe8 129 }
mirika 0:f046a5fadbe8 130
mirika 0:f046a5fadbe8 131 int main()
mirika 0:f046a5fadbe8 132 {
mirika 0:f046a5fadbe8 133 eventQueue.call_every(500, blinkCallback);
mirika 0:f046a5fadbe8 134
mirika 0:f046a5fadbe8 135 BLE &ble = BLE::Instance();
mirika 0:f046a5fadbe8 136 ble.onEventsToProcess(scheduleBleEventsProcessing);
mirika 0:f046a5fadbe8 137 ble.init(bleInitComplete);
mirika 0:f046a5fadbe8 138
mirika 0:f046a5fadbe8 139 eventQueue.dispatch_forever();
mirika 0:f046a5fadbe8 140
mirika 0:f046a5fadbe8 141 return 0;
mirika 0:f046a5fadbe8 142 }