example firmware for nRF51-Dongle to use with Opentrigger

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_Button by Bluetooth Low Energy

http://www.opentrigger.com

Committer:
0xf10
Date:
Tue Jun 07 14:40:36 2016 +0000
Revision:
12:2cb903df877d
Parent:
11:5b6d98e98127
Child:
13:0f26a3fc1f32
tokencube PIR support

Who changed what in which revision?

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