Tested and connected with nRF Control panel in android device

Committer:
Vincent Coubard
Date:
Thu Jul 28 23:10:39 2016 +0100
Revision:
1:0802a5f8c9d3
Parent:
0:a27dfda81620
Child:
2:cc8349878a7d
Sync with mbed-os-5.1.0-rc3

Who changed what in which revision?

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