my ble test

Dependencies:   BLE_API mbed nRF51822

Committer:
hu_xgbn
Date:
Sat Sep 24 23:02:03 2016 +0000
Revision:
0:1d3fde478296
first setup;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hu_xgbn 0:1d3fde478296 1 /* mbed Microcontroller Library
hu_xgbn 0:1d3fde478296 2 * Copyright (c) 2006-2013 ARM Limited
hu_xgbn 0:1d3fde478296 3 *
hu_xgbn 0:1d3fde478296 4 * Licensed under the Apache License, Version 2.0 (the "License");
hu_xgbn 0:1d3fde478296 5 * you may not use this file except in compliance with the License.
hu_xgbn 0:1d3fde478296 6 * You may obtain a copy of the License at
hu_xgbn 0:1d3fde478296 7 *
hu_xgbn 0:1d3fde478296 8 * http://www.apache.org/licenses/LICENSE-2.0
hu_xgbn 0:1d3fde478296 9 *
hu_xgbn 0:1d3fde478296 10 * Unless required by applicable law or agreed to in writing, software
hu_xgbn 0:1d3fde478296 11 * distributed under the License is distributed on an "AS IS" BASIS,
hu_xgbn 0:1d3fde478296 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
hu_xgbn 0:1d3fde478296 13 * See the License for the specific language governing permissions and
hu_xgbn 0:1d3fde478296 14 * limitations under the License.
hu_xgbn 0:1d3fde478296 15 */
hu_xgbn 0:1d3fde478296 16
hu_xgbn 0:1d3fde478296 17 #include "mbed.h"
hu_xgbn 0:1d3fde478296 18 #include "ble/BLE.h"
hu_xgbn 0:1d3fde478296 19 #include "LEDService.h"
hu_xgbn 0:1d3fde478296 20
hu_xgbn 0:1d3fde478296 21
hu_xgbn 0:1d3fde478296 22 DigitalOut alivenessLED(LED1, 0);
hu_xgbn 0:1d3fde478296 23 DigitalOut actuatedLED(LED2, 0);
hu_xgbn 0:1d3fde478296 24 Serial pc(USBTX, USBRX);
hu_xgbn 0:1d3fde478296 25
hu_xgbn 0:1d3fde478296 26 const static char DEVICE_NAME[] = "LEDWTFFTW";
hu_xgbn 0:1d3fde478296 27 static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID};
hu_xgbn 0:1d3fde478296 28 const static char AdvData[]="Hello World!";
hu_xgbn 0:1d3fde478296 29 LEDService *ledServicePtr;
hu_xgbn 0:1d3fde478296 30
hu_xgbn 0:1d3fde478296 31 Ticker ticker;
hu_xgbn 0:1d3fde478296 32
hu_xgbn 0:1d3fde478296 33 void timeoutCallback(const Gap::TimeoutSource_t source){
hu_xgbn 0:1d3fde478296 34 BLE::Instance().gap().stopAdvertising();
hu_xgbn 0:1d3fde478296 35 pc.printf("got a timeout\r\n");
hu_xgbn 0:1d3fde478296 36 BLE::Instance().gap().startAdvertising();
hu_xgbn 0:1d3fde478296 37 }
hu_xgbn 0:1d3fde478296 38
hu_xgbn 0:1d3fde478296 39
hu_xgbn 0:1d3fde478296 40 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
hu_xgbn 0:1d3fde478296 41 {
hu_xgbn 0:1d3fde478296 42 pc.printf("disconnected\r\n");
hu_xgbn 0:1d3fde478296 43 BLE::Instance().gap().startAdvertising();
hu_xgbn 0:1d3fde478296 44 uint8_t deviceName[30] = {0};
hu_xgbn 0:1d3fde478296 45 unsigned lengthP = 0;
hu_xgbn 0:1d3fde478296 46 BLE::Instance().gap().getDeviceName(deviceName, &lengthP);
hu_xgbn 0:1d3fde478296 47 pc.printf("new device name is %s", deviceName);
hu_xgbn 0:1d3fde478296 48
hu_xgbn 0:1d3fde478296 49 }
hu_xgbn 0:1d3fde478296 50
hu_xgbn 0:1d3fde478296 51 void connectionCallback(const Gap::ConnectionCallbackParams_t *params){
hu_xgbn 0:1d3fde478296 52
hu_xgbn 0:1d3fde478296 53 pc.printf("connected\r\n");
hu_xgbn 0:1d3fde478296 54
hu_xgbn 0:1d3fde478296 55 }
hu_xgbn 0:1d3fde478296 56 void periodicCallback(void)
hu_xgbn 0:1d3fde478296 57 {
hu_xgbn 0:1d3fde478296 58 // pc.printf("got here\r\n");
hu_xgbn 0:1d3fde478296 59 alivenessLED = !alivenessLED; /* Do blinky on LED1 to indicate system aliveness. */
hu_xgbn 0:1d3fde478296 60 }
hu_xgbn 0:1d3fde478296 61
hu_xgbn 0:1d3fde478296 62 /**
hu_xgbn 0:1d3fde478296 63 * This callback allows the LEDService to receive updates to the ledState Characteristic.
hu_xgbn 0:1d3fde478296 64 *
hu_xgbn 0:1d3fde478296 65 * @param[in] params
hu_xgbn 0:1d3fde478296 66 * Information about the characterisitc being updated.
hu_xgbn 0:1d3fde478296 67 */
hu_xgbn 0:1d3fde478296 68 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
hu_xgbn 0:1d3fde478296 69 if ((params->handle == ledServicePtr->getValueHandle()) && (params->len == 1)) {
hu_xgbn 0:1d3fde478296 70 actuatedLED = *(params->data);
hu_xgbn 0:1d3fde478296 71 }
hu_xgbn 0:1d3fde478296 72 }
hu_xgbn 0:1d3fde478296 73
hu_xgbn 0:1d3fde478296 74
hu_xgbn 0:1d3fde478296 75 /**
hu_xgbn 0:1d3fde478296 76 * This function is called when the ble initialization process has failed
hu_xgbn 0:1d3fde478296 77 */
hu_xgbn 0:1d3fde478296 78 void onBleInitError(BLE &ble, ble_error_t error)
hu_xgbn 0:1d3fde478296 79 {
hu_xgbn 0:1d3fde478296 80 /* Initialization error handling should go here */
hu_xgbn 0:1d3fde478296 81 }
hu_xgbn 0:1d3fde478296 82
hu_xgbn 0:1d3fde478296 83 /**
hu_xgbn 0:1d3fde478296 84 * Callback triggered when the ble initialization process has finished
hu_xgbn 0:1d3fde478296 85 */
hu_xgbn 0:1d3fde478296 86 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
hu_xgbn 0:1d3fde478296 87 {
hu_xgbn 0:1d3fde478296 88 BLE& ble = params->ble;
hu_xgbn 0:1d3fde478296 89 ble_error_t error = params->error;
hu_xgbn 0:1d3fde478296 90
hu_xgbn 0:1d3fde478296 91 if (error != BLE_ERROR_NONE) {
hu_xgbn 0:1d3fde478296 92 /* In case of error, forward the error handling to onBleInitError */
hu_xgbn 0:1d3fde478296 93 onBleInitError(ble, error);
hu_xgbn 0:1d3fde478296 94 return;
hu_xgbn 0:1d3fde478296 95 }
hu_xgbn 0:1d3fde478296 96
hu_xgbn 0:1d3fde478296 97 /* Ensure that it is the default instance of BLE */
hu_xgbn 0:1d3fde478296 98 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
hu_xgbn 0:1d3fde478296 99 return;
hu_xgbn 0:1d3fde478296 100 }
hu_xgbn 0:1d3fde478296 101
hu_xgbn 0:1d3fde478296 102 ble.gap().onDisconnection(disconnectionCallback);
hu_xgbn 0:1d3fde478296 103 ble.gattServer().onDataWritten(onDataWrittenCallback);
hu_xgbn 0:1d3fde478296 104 ble.gap().onTimeout(timeoutCallback);
hu_xgbn 0:1d3fde478296 105
hu_xgbn 0:1d3fde478296 106 bool initialValueForLEDCharacteristic = false;
hu_xgbn 0:1d3fde478296 107 ledServicePtr = new LEDService(ble, initialValueForLEDCharacteristic);
hu_xgbn 0:1d3fde478296 108
hu_xgbn 0:1d3fde478296 109 /* setup advertising */
hu_xgbn 0:1d3fde478296 110 ble.gap().setDeviceName((uint8_t*)DEVICE_NAME);
hu_xgbn 0:1d3fde478296 111 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
hu_xgbn 0:1d3fde478296 112 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
hu_xgbn 0:1d3fde478296 113 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
hu_xgbn 0:1d3fde478296 114 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)AdvData, sizeof(AdvData));
hu_xgbn 0:1d3fde478296 115 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
hu_xgbn 0:1d3fde478296 116 ble.gap().setAdvertisingInterval(60000); /* you shall not pass */
hu_xgbn 0:1d3fde478296 117
hu_xgbn 0:1d3fde478296 118 ble.gap().setAdvertisingTimeout(900);
hu_xgbn 0:1d3fde478296 119 ble.gap().startAdvertising();
hu_xgbn 0:1d3fde478296 120 }
hu_xgbn 0:1d3fde478296 121
hu_xgbn 0:1d3fde478296 122 int main(void)
hu_xgbn 0:1d3fde478296 123 {
hu_xgbn 0:1d3fde478296 124 ticker.attach(periodicCallback, 1); /* Blink LED every second */
hu_xgbn 0:1d3fde478296 125
hu_xgbn 0:1d3fde478296 126 BLE &ble = BLE::Instance();
hu_xgbn 0:1d3fde478296 127 ble.init(bleInitComplete);
hu_xgbn 0:1d3fde478296 128
hu_xgbn 0:1d3fde478296 129 pc .baud(19200);
hu_xgbn 0:1d3fde478296 130 /* SpinWait for initialization to complete. This is necessary because the
hu_xgbn 0:1d3fde478296 131 * BLE object is used in the main loop below. */
hu_xgbn 0:1d3fde478296 132 while (ble.hasInitialized() == false) { /* spin loop */ }
hu_xgbn 0:1d3fde478296 133
hu_xgbn 0:1d3fde478296 134 while (true) {
hu_xgbn 0:1d3fde478296 135 // pc.printf("got here\r\n");
hu_xgbn 0:1d3fde478296 136 ble.waitForEvent();
hu_xgbn 0:1d3fde478296 137 }
hu_xgbn 0:1d3fde478296 138 }