DongKeun Kang / Mbed OS mbed-os-example-ble-UARTConsol
Committer:
mirika
Date:
Thu May 10 14:09:22 2018 +0000
Revision:
0:f046a5fadbe8
Child:
1:2237580e56f1
start version control of mbed5 ble uart console

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 0:f046a5fadbe8 21 #include "ble/services/BatteryService.h"
mirika 0:f046a5fadbe8 22
mirika 0:f046a5fadbe8 23 DigitalOut led1(LED1, 1);
mirika 0:f046a5fadbe8 24
mirika 0:f046a5fadbe8 25 const static char DEVICE_NAME[] = "BATTERY";
mirika 0:f046a5fadbe8 26 static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE};
mirika 0:f046a5fadbe8 27
mirika 0:f046a5fadbe8 28 static uint8_t batteryLevel = 50;
mirika 0:f046a5fadbe8 29 static BatteryService* batteryServicePtr;
mirika 0:f046a5fadbe8 30
mirika 0:f046a5fadbe8 31 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
mirika 0:f046a5fadbe8 32
mirika 0:f046a5fadbe8 33 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
mirika 0:f046a5fadbe8 34 {
mirika 0:f046a5fadbe8 35 BLE::Instance().gap().startAdvertising();
mirika 0:f046a5fadbe8 36 }
mirika 0:f046a5fadbe8 37
mirika 0:f046a5fadbe8 38 void updateSensorValue() {
mirika 0:f046a5fadbe8 39 batteryLevel++;
mirika 0:f046a5fadbe8 40 if (batteryLevel > 100) {
mirika 0:f046a5fadbe8 41 batteryLevel = 20;
mirika 0:f046a5fadbe8 42 }
mirika 0:f046a5fadbe8 43
mirika 0:f046a5fadbe8 44 batteryServicePtr->updateBatteryLevel(batteryLevel);
mirika 0:f046a5fadbe8 45 }
mirika 0:f046a5fadbe8 46
mirika 0:f046a5fadbe8 47 void blinkCallback(void)
mirika 0:f046a5fadbe8 48 {
mirika 0:f046a5fadbe8 49 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
mirika 0:f046a5fadbe8 50
mirika 0:f046a5fadbe8 51 BLE &ble = BLE::Instance();
mirika 0:f046a5fadbe8 52 if (ble.gap().getState().connected) {
mirika 0:f046a5fadbe8 53 eventQueue.call(updateSensorValue);
mirika 0:f046a5fadbe8 54 }
mirika 0:f046a5fadbe8 55 }
mirika 0:f046a5fadbe8 56
mirika 0:f046a5fadbe8 57 /**
mirika 0:f046a5fadbe8 58 * This function is called when the ble initialization process has failled
mirika 0:f046a5fadbe8 59 */
mirika 0:f046a5fadbe8 60 void onBleInitError(BLE &ble, ble_error_t error)
mirika 0:f046a5fadbe8 61 {
mirika 0:f046a5fadbe8 62 /* Initialization error handling should go here */
mirika 0:f046a5fadbe8 63 }
mirika 0:f046a5fadbe8 64
mirika 0:f046a5fadbe8 65 void printMacAddress()
mirika 0:f046a5fadbe8 66 {
mirika 0:f046a5fadbe8 67 /* Print out device MAC address to the console*/
mirika 0:f046a5fadbe8 68 Gap::AddressType_t addr_type;
mirika 0:f046a5fadbe8 69 Gap::Address_t address;
mirika 0:f046a5fadbe8 70 BLE::Instance().gap().getAddress(&addr_type, address);
mirika 0:f046a5fadbe8 71 printf("DEVICE MAC ADDRESS: ");
mirika 0:f046a5fadbe8 72 for (int i = 5; i >= 1; i--){
mirika 0:f046a5fadbe8 73 printf("%02x:", address[i]);
mirika 0:f046a5fadbe8 74 }
mirika 0:f046a5fadbe8 75 printf("%02x\r\n", address[0]);
mirika 0:f046a5fadbe8 76 }
mirika 0:f046a5fadbe8 77
mirika 0:f046a5fadbe8 78 /**
mirika 0:f046a5fadbe8 79 * Callback triggered when the ble initialization process has finished
mirika 0:f046a5fadbe8 80 */
mirika 0:f046a5fadbe8 81 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mirika 0:f046a5fadbe8 82 {
mirika 0:f046a5fadbe8 83 BLE& ble = params->ble;
mirika 0:f046a5fadbe8 84 ble_error_t error = params->error;
mirika 0:f046a5fadbe8 85
mirika 0:f046a5fadbe8 86 if (error != BLE_ERROR_NONE) {
mirika 0:f046a5fadbe8 87 /* In case of error, forward the error handling to onBleInitError */
mirika 0:f046a5fadbe8 88 onBleInitError(ble, error);
mirika 0:f046a5fadbe8 89 return;
mirika 0:f046a5fadbe8 90 }
mirika 0:f046a5fadbe8 91
mirika 0:f046a5fadbe8 92 /* Ensure that it is the default instance of BLE */
mirika 0:f046a5fadbe8 93 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mirika 0:f046a5fadbe8 94 return;
mirika 0:f046a5fadbe8 95 }
mirika 0:f046a5fadbe8 96
mirika 0:f046a5fadbe8 97 ble.gap().onDisconnection(disconnectionCallback);
mirika 0:f046a5fadbe8 98
mirika 0:f046a5fadbe8 99 /* Setup primary service */
mirika 0:f046a5fadbe8 100 batteryServicePtr = new BatteryService(ble, batteryLevel);
mirika 0:f046a5fadbe8 101
mirika 0:f046a5fadbe8 102 /* Setup advertising */
mirika 0:f046a5fadbe8 103 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
mirika 0:f046a5fadbe8 104 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
mirika 0:f046a5fadbe8 105 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
mirika 0:f046a5fadbe8 106 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mirika 0:f046a5fadbe8 107 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
mirika 0:f046a5fadbe8 108 ble.gap().startAdvertising();
mirika 0:f046a5fadbe8 109
mirika 0:f046a5fadbe8 110 printMacAddress();
mirika 0:f046a5fadbe8 111 }
mirika 0:f046a5fadbe8 112
mirika 0:f046a5fadbe8 113 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mirika 0:f046a5fadbe8 114 BLE &ble = BLE::Instance();
mirika 0:f046a5fadbe8 115 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
mirika 0:f046a5fadbe8 116 }
mirika 0:f046a5fadbe8 117
mirika 0:f046a5fadbe8 118 int main()
mirika 0:f046a5fadbe8 119 {
mirika 0:f046a5fadbe8 120 eventQueue.call_every(500, blinkCallback);
mirika 0:f046a5fadbe8 121
mirika 0:f046a5fadbe8 122 BLE &ble = BLE::Instance();
mirika 0:f046a5fadbe8 123 ble.onEventsToProcess(scheduleBleEventsProcessing);
mirika 0:f046a5fadbe8 124 ble.init(bleInitComplete);
mirika 0:f046a5fadbe8 125
mirika 0:f046a5fadbe8 126 eventQueue.dispatch_forever();
mirika 0:f046a5fadbe8 127
mirika 0:f046a5fadbe8 128 return 0;
mirika 0:f046a5fadbe8 129 }