jagannath a / Mbed 2 deprecated BLE_Button

Dependencies:   mbed BLE_API nRF51822

Committer:
mesoln
Date:
Tue Sep 17 15:49:42 2019 +0000
Revision:
0:e6839efb5545
Child:
1:950af3c28eef
blebutton_check

Who changed what in which revision?

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