BLE_Button fork

Dependencies:   BLE_API mbed nRF51822

Committer:
rojer
Date:
Fri Jun 08 12:57:49 2018 +0000
Revision:
0:dee22ba79e2a
jhgjhgjh;

Who changed what in which revision?

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