Test

Dependencies:   BLE_API mbed nRF51822

Committer:
niklasjakob
Date:
Mon Jun 12 15:10:24 2017 +0000
Revision:
0:21763f3c9ec5
Test

Who changed what in which revision?

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