Nora Vazbyte / Mbed 2 deprecated DevBranch

Dependencies:   BLE_API mbed nRF51822

Committer:
vazbyte
Date:
Sun Oct 28 12:15:46 2018 +0000
Revision:
0:7a9eb6b6ae60
dev;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vazbyte 0:7a9eb6b6ae60 1 /* mbed Microcontroller Library
vazbyte 0:7a9eb6b6ae60 2 * Copyright (c) 2006-2013 ARM Limited
vazbyte 0:7a9eb6b6ae60 3 *
vazbyte 0:7a9eb6b6ae60 4 * Licensed under the Apache License, Version 2.0 (the "License");
vazbyte 0:7a9eb6b6ae60 5 * you may not use this file except in compliance with the License.
vazbyte 0:7a9eb6b6ae60 6 * You may obtain a copy of the License at
vazbyte 0:7a9eb6b6ae60 7 *
vazbyte 0:7a9eb6b6ae60 8 * http://www.apache.org/licenses/LICENSE-2.0
vazbyte 0:7a9eb6b6ae60 9 *
vazbyte 0:7a9eb6b6ae60 10 * Unless required by applicable law or agreed to in writing, software
vazbyte 0:7a9eb6b6ae60 11 * distributed under the License is distributed on an "AS IS" BASIS,
vazbyte 0:7a9eb6b6ae60 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vazbyte 0:7a9eb6b6ae60 13 * See the License for the specific language governing permissions and
vazbyte 0:7a9eb6b6ae60 14 * limitations under the License.
vazbyte 0:7a9eb6b6ae60 15 */
vazbyte 0:7a9eb6b6ae60 16
vazbyte 0:7a9eb6b6ae60 17 #include "mbed.h"
vazbyte 0:7a9eb6b6ae60 18 #include "ble/BLE.h"
vazbyte 0:7a9eb6b6ae60 19 #include "ButtonService.h"
vazbyte 0:7a9eb6b6ae60 20
vazbyte 0:7a9eb6b6ae60 21 DigitalOut led1(LED1);
vazbyte 0:7a9eb6b6ae60 22 InterruptIn button(BUTTON1);
vazbyte 0:7a9eb6b6ae60 23
vazbyte 0:7a9eb6b6ae60 24 const static char DEVICE_NAME[] = "Button";
vazbyte 0:7a9eb6b6ae60 25 static const uint16_t uuid16_list[] = {ButtonService::BUTTON_SERVICE_UUID};
vazbyte 0:7a9eb6b6ae60 26
vazbyte 0:7a9eb6b6ae60 27 enum {
vazbyte 0:7a9eb6b6ae60 28 RELEASED = 0,
vazbyte 0:7a9eb6b6ae60 29 PRESSED,
vazbyte 0:7a9eb6b6ae60 30 IDLE
vazbyte 0:7a9eb6b6ae60 31 };
vazbyte 0:7a9eb6b6ae60 32 static uint8_t buttonState = IDLE;
vazbyte 0:7a9eb6b6ae60 33
vazbyte 0:7a9eb6b6ae60 34 static ButtonService *buttonServicePtr;
vazbyte 0:7a9eb6b6ae60 35
vazbyte 0:7a9eb6b6ae60 36 void buttonPressedCallback(void)
vazbyte 0:7a9eb6b6ae60 37 {
vazbyte 0:7a9eb6b6ae60 38 /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
vazbyte 0:7a9eb6b6ae60 39 * BLE device API from the main thread. */
vazbyte 0:7a9eb6b6ae60 40 buttonState = PRESSED;
vazbyte 0:7a9eb6b6ae60 41 }
vazbyte 0:7a9eb6b6ae60 42
vazbyte 0:7a9eb6b6ae60 43 void buttonReleasedCallback(void)
vazbyte 0:7a9eb6b6ae60 44 {
vazbyte 0:7a9eb6b6ae60 45 /* Note that the buttonReleasedCallback() executes in interrupt context, so it is safer to access
vazbyte 0:7a9eb6b6ae60 46 * BLE device API from the main thread. */
vazbyte 0:7a9eb6b6ae60 47 buttonState = RELEASED;
vazbyte 0:7a9eb6b6ae60 48 }
vazbyte 0:7a9eb6b6ae60 49
vazbyte 0:7a9eb6b6ae60 50 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
vazbyte 0:7a9eb6b6ae60 51 {
vazbyte 0:7a9eb6b6ae60 52 BLE::Instance().gap().startAdvertising();
vazbyte 0:7a9eb6b6ae60 53 }
vazbyte 0:7a9eb6b6ae60 54
vazbyte 0:7a9eb6b6ae60 55 void periodicCallback(void)
vazbyte 0:7a9eb6b6ae60 56 {
vazbyte 0:7a9eb6b6ae60 57 led1 = !led1; /* Do blinky on LED1 to indicate system aliveness. */
vazbyte 0:7a9eb6b6ae60 58 }
vazbyte 0:7a9eb6b6ae60 59
vazbyte 0:7a9eb6b6ae60 60 /**
vazbyte 0:7a9eb6b6ae60 61 * This function is called when the ble initialization process has failled
vazbyte 0:7a9eb6b6ae60 62 */
vazbyte 0:7a9eb6b6ae60 63 void onBleInitError(BLE &ble, ble_error_t error)
vazbyte 0:7a9eb6b6ae60 64 {
vazbyte 0:7a9eb6b6ae60 65 /* Initialization error handling should go here */
vazbyte 0:7a9eb6b6ae60 66 }
vazbyte 0:7a9eb6b6ae60 67
vazbyte 0:7a9eb6b6ae60 68 /**
vazbyte 0:7a9eb6b6ae60 69 * Callback triggered when the ble initialization process has finished
vazbyte 0:7a9eb6b6ae60 70 */
vazbyte 0:7a9eb6b6ae60 71 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
vazbyte 0:7a9eb6b6ae60 72 {
vazbyte 0:7a9eb6b6ae60 73 BLE& ble = params->ble;
vazbyte 0:7a9eb6b6ae60 74 ble_error_t error = params->error;
vazbyte 0:7a9eb6b6ae60 75
vazbyte 0:7a9eb6b6ae60 76 if (error != BLE_ERROR_NONE) {
vazbyte 0:7a9eb6b6ae60 77 /* In case of error, forward the error handling to onBleInitError */
vazbyte 0:7a9eb6b6ae60 78 onBleInitError(ble, error);
vazbyte 0:7a9eb6b6ae60 79 return;
vazbyte 0:7a9eb6b6ae60 80 }
vazbyte 0:7a9eb6b6ae60 81
vazbyte 0:7a9eb6b6ae60 82 /* Ensure that it is the default instance of BLE */
vazbyte 0:7a9eb6b6ae60 83 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
vazbyte 0:7a9eb6b6ae60 84 return;
vazbyte 0:7a9eb6b6ae60 85 }
vazbyte 0:7a9eb6b6ae60 86
vazbyte 0:7a9eb6b6ae60 87 ble.gap().onDisconnection(disconnectionCallback);
vazbyte 0:7a9eb6b6ae60 88
vazbyte 0:7a9eb6b6ae60 89 /* Setup primary service */
vazbyte 0:7a9eb6b6ae60 90 buttonServicePtr = new ButtonService(ble, false /* initial value for button pressed */);
vazbyte 0:7a9eb6b6ae60 91
vazbyte 0:7a9eb6b6ae60 92 /* setup advertising */
vazbyte 0:7a9eb6b6ae60 93 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
vazbyte 0:7a9eb6b6ae60 94 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
vazbyte 0:7a9eb6b6ae60 95 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
vazbyte 0:7a9eb6b6ae60 96 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
vazbyte 0:7a9eb6b6ae60 97 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
vazbyte 0:7a9eb6b6ae60 98 ble.gap().startAdvertising();
vazbyte 0:7a9eb6b6ae60 99
vazbyte 0:7a9eb6b6ae60 100 }
vazbyte 0:7a9eb6b6ae60 101
vazbyte 0:7a9eb6b6ae60 102 int main(void)
vazbyte 0:7a9eb6b6ae60 103 {
vazbyte 0:7a9eb6b6ae60 104 led1 = 1;
vazbyte 0:7a9eb6b6ae60 105 Ticker ticker;
vazbyte 0:7a9eb6b6ae60 106 ticker.attach(periodicCallback, 1);
vazbyte 0:7a9eb6b6ae60 107 button.fall(buttonPressedCallback);
vazbyte 0:7a9eb6b6ae60 108 button.rise(buttonReleasedCallback);
vazbyte 0:7a9eb6b6ae60 109
vazbyte 0:7a9eb6b6ae60 110 BLE &ble = BLE::Instance();
vazbyte 0:7a9eb6b6ae60 111 ble.init(bleInitComplete);
vazbyte 0:7a9eb6b6ae60 112
vazbyte 0:7a9eb6b6ae60 113 /* SpinWait for initialization to complete. This is necessary because the
vazbyte 0:7a9eb6b6ae60 114 * BLE object is used in the main loop below. */
vazbyte 0:7a9eb6b6ae60 115 while (ble.hasInitialized() == false) { /* spin loop */ }
vazbyte 0:7a9eb6b6ae60 116
vazbyte 0:7a9eb6b6ae60 117 while (true) {
vazbyte 0:7a9eb6b6ae60 118 if (buttonState != IDLE) {
vazbyte 0:7a9eb6b6ae60 119 buttonServicePtr->updateButtonState(buttonState);
vazbyte 0:7a9eb6b6ae60 120 buttonState = IDLE;
vazbyte 0:7a9eb6b6ae60 121 }
vazbyte 0:7a9eb6b6ae60 122
vazbyte 0:7a9eb6b6ae60 123 ble.waitForEvent();
vazbyte 0:7a9eb6b6ae60 124 }
vazbyte 0:7a9eb6b6ae60 125 }