copy2

Committer:
Vincent Coubard
Date:
Tue Jul 26 14:19:17 2016 +0100
Revision:
0:8113e6c77cd7
Child:
2:18b05b3173a8
Update example at tag mbed-os-5.0.1-rc1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vincent Coubard 0:8113e6c77cd7 1 /* mbed Microcontroller Library
Vincent Coubard 0:8113e6c77cd7 2 * Copyright (c) 2006-2014 ARM Limited
Vincent Coubard 0:8113e6c77cd7 3 *
Vincent Coubard 0:8113e6c77cd7 4 * Licensed under the Apache License, Version 2.0 (the "License");
Vincent Coubard 0:8113e6c77cd7 5 * you may not use this file except in compliance with the License.
Vincent Coubard 0:8113e6c77cd7 6 * You may obtain a copy of the License at
Vincent Coubard 0:8113e6c77cd7 7 *
Vincent Coubard 0:8113e6c77cd7 8 * http://www.apache.org/licenses/LICENSE-2.0
Vincent Coubard 0:8113e6c77cd7 9 *
Vincent Coubard 0:8113e6c77cd7 10 * Unless required by applicable law or agreed to in writing, software
Vincent Coubard 0:8113e6c77cd7 11 * distributed under the License is distributed on an "AS IS" BASIS,
Vincent Coubard 0:8113e6c77cd7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Vincent Coubard 0:8113e6c77cd7 13 * See the License for the specific language governing permissions and
Vincent Coubard 0:8113e6c77cd7 14 * limitations under the License.
Vincent Coubard 0:8113e6c77cd7 15 */
Vincent Coubard 0:8113e6c77cd7 16
Vincent Coubard 0:8113e6c77cd7 17 #include <mbed-events/events.h>
Vincent Coubard 0:8113e6c77cd7 18 #include <mbed.h>
Vincent Coubard 0:8113e6c77cd7 19 #include "ble/BLE.h"
Vincent Coubard 0:8113e6c77cd7 20 #include "ble/Gap.h"
Vincent Coubard 0:8113e6c77cd7 21 #include "ble/services/BatteryService.h"
Vincent Coubard 0:8113e6c77cd7 22
Vincent Coubard 0:8113e6c77cd7 23 DigitalOut led1(LED1, 1);
Vincent Coubard 0:8113e6c77cd7 24
Vincent Coubard 0:8113e6c77cd7 25 const static char DEVICE_NAME[] = "BATTERY";
Vincent Coubard 0:8113e6c77cd7 26 static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE};
Vincent Coubard 0:8113e6c77cd7 27
Vincent Coubard 0:8113e6c77cd7 28 static uint8_t batteryLevel = 50;
Vincent Coubard 0:8113e6c77cd7 29 static BatteryService* batteryServicePtr;
Vincent Coubard 0:8113e6c77cd7 30
Vincent Coubard 0:8113e6c77cd7 31 static EventQueue eventQueue(
Vincent Coubard 0:8113e6c77cd7 32 /* event count */ 16 * /* event size */ 32
Vincent Coubard 0:8113e6c77cd7 33 );
Vincent Coubard 0:8113e6c77cd7 34
Vincent Coubard 0:8113e6c77cd7 35 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
Vincent Coubard 0:8113e6c77cd7 36 {
Vincent Coubard 0:8113e6c77cd7 37 BLE::Instance().gap().startAdvertising();
Vincent Coubard 0:8113e6c77cd7 38 }
Vincent Coubard 0:8113e6c77cd7 39
Vincent Coubard 0:8113e6c77cd7 40 void updateSensorValue() {
Vincent Coubard 0:8113e6c77cd7 41 batteryLevel++;
Vincent Coubard 0:8113e6c77cd7 42 if (batteryLevel > 100) {
Vincent Coubard 0:8113e6c77cd7 43 batteryLevel = 20;
Vincent Coubard 0:8113e6c77cd7 44 }
Vincent Coubard 0:8113e6c77cd7 45
Vincent Coubard 0:8113e6c77cd7 46 batteryServicePtr->updateBatteryLevel(batteryLevel);
Vincent Coubard 0:8113e6c77cd7 47 }
Vincent Coubard 0:8113e6c77cd7 48
Vincent Coubard 0:8113e6c77cd7 49 void blinkCallback(void)
Vincent Coubard 0:8113e6c77cd7 50 {
Vincent Coubard 0:8113e6c77cd7 51 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
Vincent Coubard 0:8113e6c77cd7 52
Vincent Coubard 0:8113e6c77cd7 53 BLE &ble = BLE::Instance();
Vincent Coubard 0:8113e6c77cd7 54 if (ble.gap().getState().connected) {
Vincent Coubard 0:8113e6c77cd7 55 eventQueue.post(updateSensorValue);
Vincent Coubard 0:8113e6c77cd7 56 }
Vincent Coubard 0:8113e6c77cd7 57 }
Vincent Coubard 0:8113e6c77cd7 58
Vincent Coubard 0:8113e6c77cd7 59 /**
Vincent Coubard 0:8113e6c77cd7 60 * This function is called when the ble initialization process has failled
Vincent Coubard 0:8113e6c77cd7 61 */
Vincent Coubard 0:8113e6c77cd7 62 void onBleInitError(BLE &ble, ble_error_t error)
Vincent Coubard 0:8113e6c77cd7 63 {
Vincent Coubard 0:8113e6c77cd7 64 /* Initialization error handling should go here */
Vincent Coubard 0:8113e6c77cd7 65 }
Vincent Coubard 0:8113e6c77cd7 66
Vincent Coubard 0:8113e6c77cd7 67 /**
Vincent Coubard 0:8113e6c77cd7 68 * Callback triggered when the ble initialization process has finished
Vincent Coubard 0:8113e6c77cd7 69 */
Vincent Coubard 0:8113e6c77cd7 70 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
Vincent Coubard 0:8113e6c77cd7 71 {
Vincent Coubard 0:8113e6c77cd7 72 BLE& ble = params->ble;
Vincent Coubard 0:8113e6c77cd7 73 ble_error_t error = params->error;
Vincent Coubard 0:8113e6c77cd7 74
Vincent Coubard 0:8113e6c77cd7 75 if (error != BLE_ERROR_NONE) {
Vincent Coubard 0:8113e6c77cd7 76 /* In case of error, forward the error handling to onBleInitError */
Vincent Coubard 0:8113e6c77cd7 77 onBleInitError(ble, error);
Vincent Coubard 0:8113e6c77cd7 78 return;
Vincent Coubard 0:8113e6c77cd7 79 }
Vincent Coubard 0:8113e6c77cd7 80
Vincent Coubard 0:8113e6c77cd7 81 /* Ensure that it is the default instance of BLE */
Vincent Coubard 0:8113e6c77cd7 82 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
Vincent Coubard 0:8113e6c77cd7 83 return;
Vincent Coubard 0:8113e6c77cd7 84 }
Vincent Coubard 0:8113e6c77cd7 85
Vincent Coubard 0:8113e6c77cd7 86 ble.gap().onDisconnection(disconnectionCallback);
Vincent Coubard 0:8113e6c77cd7 87
Vincent Coubard 0:8113e6c77cd7 88 /* Setup primary service */
Vincent Coubard 0:8113e6c77cd7 89 batteryServicePtr = new BatteryService(ble, batteryLevel);
Vincent Coubard 0:8113e6c77cd7 90
Vincent Coubard 0:8113e6c77cd7 91 /* Setup advertising */
Vincent Coubard 0:8113e6c77cd7 92 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
Vincent Coubard 0:8113e6c77cd7 93 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
Vincent Coubard 0:8113e6c77cd7 94 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
Vincent Coubard 0:8113e6c77cd7 95 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Vincent Coubard 0:8113e6c77cd7 96 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
Vincent Coubard 0:8113e6c77cd7 97 ble.gap().startAdvertising();
Vincent Coubard 0:8113e6c77cd7 98 }
Vincent Coubard 0:8113e6c77cd7 99
Vincent Coubard 0:8113e6c77cd7 100 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
Vincent Coubard 0:8113e6c77cd7 101 BLE &ble = BLE::Instance();
Vincent Coubard 0:8113e6c77cd7 102 eventQueue.post(Callback<void()>(&ble, &BLE::processEvents));
Vincent Coubard 0:8113e6c77cd7 103 }
Vincent Coubard 0:8113e6c77cd7 104
Vincent Coubard 0:8113e6c77cd7 105 int main()
Vincent Coubard 0:8113e6c77cd7 106 {
Vincent Coubard 0:8113e6c77cd7 107 eventQueue.post_every(blinkCallback, 500);
Vincent Coubard 0:8113e6c77cd7 108
Vincent Coubard 0:8113e6c77cd7 109 BLE &ble = BLE::Instance();
Vincent Coubard 0:8113e6c77cd7 110 ble.onEventsToProcess(scheduleBleEventsProcessing);
Vincent Coubard 0:8113e6c77cd7 111 ble.init(bleInitComplete);
Vincent Coubard 0:8113e6c77cd7 112
Vincent Coubard 0:8113e6c77cd7 113 while (true) {
Vincent Coubard 0:8113e6c77cd7 114 eventQueue.dispatch();
Vincent Coubard 0:8113e6c77cd7 115 }
Vincent Coubard 0:8113e6c77cd7 116
Vincent Coubard 0:8113e6c77cd7 117 return 0;
Vincent Coubard 0:8113e6c77cd7 118 }