Button initiated config service

Dependencies:   BLE_API_EddystoneConfigService_2 mbed nRF51822

Fork of BLE_EddystoneBeaconConfigService_3 by URIBeacon

Committer:
scottjenson
Date:
Sun Oct 11 22:46:57 2015 +0000
Revision:
67:345bc62c748d
Parent:
63:2478203aa555
Child:
68:f7f7ec038494
This is my version of the config image. Works on nRF USB dongle, now trying to get it to work on minewtech board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:c04d932e96c9 1 /* mbed Microcontroller Library
screamer 0:c04d932e96c9 2 * Copyright (c) 2006-2013 ARM Limited
screamer 0:c04d932e96c9 3 *
screamer 0:c04d932e96c9 4 * Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:c04d932e96c9 5 * you may not use this file except in compliance with the License.
screamer 0:c04d932e96c9 6 * You may obtain a copy of the License at
screamer 0:c04d932e96c9 7 *
screamer 0:c04d932e96c9 8 * http://www.apache.org/licenses/LICENSE-2.0
screamer 0:c04d932e96c9 9 *
screamer 0:c04d932e96c9 10 * Unless required by applicable law or agreed to in writing, software
screamer 0:c04d932e96c9 11 * distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:c04d932e96c9 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:c04d932e96c9 13 * See the License for the specific language governing permissions and
screamer 0:c04d932e96c9 14 * limitations under the License.
screamer 0:c04d932e96c9 15 */
screamer 0:c04d932e96c9 16
screamer 0:c04d932e96c9 17 #include "mbed.h"
rgrover1 7:e9800c45e065 18 #include "BLE.h"
mbedAustin 23:05e9bb3b13af 19 #include "EddystoneConfigService.h"
mbedAustin 34:5876fbb1aa62 20
rgrover1 2:8020d6d4455a 21 #include "ConfigParamsPersistence.h"
scottjenson 67:345bc62c748d 22 //#include "BLEDevice.h"
scottjenson 67:345bc62c748d 23 #include "DeviceInformationService.h"
screamer 0:c04d932e96c9 24
rgrover1 8:1a21308e5008 25 BLE ble;
mbedAustin 24:8edfe6730cc2 26 EddystoneConfigService *EddystoneBeaconConfig;
mbedAustin 39:2c73bc1ff4f5 27 EddystoneConfigService::Params_t params;
screamer 0:c04d932e96c9 28
scottjenson 67:345bc62c748d 29 Serial pc(USBTX,USBRX); // uncomment to use printf(...)
scottjenson 67:345bc62c748d 30
scottjenson 67:345bc62c748d 31 #define TINYBLE false
scottjenson 67:345bc62c748d 32 #define SEEEDARCH true
scottjenson 67:345bc62c748d 33
scottjenson 67:345bc62c748d 34 #if TINYBLE
scottjenson 67:345bc62c748d 35 int ledOn = 0;
scottjenson 67:345bc62c748d 36 int ledOff = 1;
scottjenson 67:345bc62c748d 37
scottjenson 67:345bc62c748d 38 InterruptIn button1(P0_17);
scottjenson 67:345bc62c748d 39 DigitalOut ledRed(P0_22);
scottjenson 67:345bc62c748d 40 DigitalOut ledGreen(P0_21);
scottjenson 67:345bc62c748d 41 DigitalOut ledBlue(P0_23);
scottjenson 67:345bc62c748d 42 #endif
scottjenson 67:345bc62c748d 43
scottjenson 67:345bc62c748d 44 #if SEEEDARCH
scottjenson 67:345bc62c748d 45 int ledOn = 1;
scottjenson 67:345bc62c748d 46 int ledOff = 0;
scottjenson 67:345bc62c748d 47
scottjenson 67:345bc62c748d 48 InterruptIn button1(P0_17);
scottjenson 67:345bc62c748d 49 InterruptIn mysw1(P0_18);
scottjenson 67:345bc62c748d 50 DigitalOut ledRed(P0_12);
scottjenson 67:345bc62c748d 51 DigitalOut ledGreen(P0_15);
scottjenson 67:345bc62c748d 52 DigitalOut ledBlue(P0_16);
scottjenson 67:345bc62c748d 53 #endif
scottjenson 67:345bc62c748d 54
scottjenson 67:345bc62c748d 55 // Make sure to turn off before and after animation
scottjenson 67:345bc62c748d 56 // to separate it from the LED which may already be on
scottjenson 67:345bc62c748d 57 void ledRebootAnimation(void) {
scottjenson 67:345bc62c748d 58 ledRed = ledOff;
scottjenson 67:345bc62c748d 59 wait(0.1);
scottjenson 67:345bc62c748d 60 ledRed = ledOn;
scottjenson 67:345bc62c748d 61 wait(0.1);
scottjenson 67:345bc62c748d 62 ledRed = ledOff;
scottjenson 67:345bc62c748d 63 wait(0.1);
scottjenson 67:345bc62c748d 64 ledRed = ledOn;
scottjenson 67:345bc62c748d 65 wait(0.1);
scottjenson 67:345bc62c748d 66 ledRed = ledOff;
scottjenson 67:345bc62c748d 67 wait(0.1);
scottjenson 67:345bc62c748d 68 ledRed = ledOn;
scottjenson 67:345bc62c748d 69 wait(0.1);
scottjenson 67:345bc62c748d 70 ledRed = ledOff;
scottjenson 67:345bc62c748d 71 wait(0.1);
scottjenson 67:345bc62c748d 72 }
scottjenson 67:345bc62c748d 73
screamer 0:c04d932e96c9 74 /**
screamer 0:c04d932e96c9 75 * URIBeaconConfig service can operate in two modes: a configuration mode which
screamer 0:c04d932e96c9 76 * allows a user to update settings over a connection; and normal URIBeacon mode
screamer 0:c04d932e96c9 77 * which involves advertising a URI. Constructing an object from URIBeaconConfig
screamer 0:c04d932e96c9 78 * service sets up advertisements for the configuration mode. It is then up to
screamer 0:c04d932e96c9 79 * the application to switch to URIBeacon mode based on some timeout.
screamer 0:c04d932e96c9 80 *
screamer 0:c04d932e96c9 81 * The following help with this switch.
screamer 0:c04d932e96c9 82 */
scottjenson 67:345bc62c748d 83 static const int CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS = 10; // Duration after power-on that config service is available.
mbedAustin 55:3818a9fa827d 84
mbedAustin 24:8edfe6730cc2 85 Ticker configAdvertisementTimeout;
screamer 0:c04d932e96c9 86
screamer 0:c04d932e96c9 87 /**
mbedAustin 19:f7c33fa88ca5 88 * Stop advertising the Config Service after a delay; and switch to a non-connectable advertising mode only beacon.
screamer 0:c04d932e96c9 89 */
screamer 0:c04d932e96c9 90 void timeout(void)
screamer 0:c04d932e96c9 91 {
scottjenson 67:345bc62c748d 92 ledRed = ledOff;
screamer 0:c04d932e96c9 93 Gap::GapState_t state;
screamer 0:c04d932e96c9 94 state = ble.getGapState();
screamer 0:c04d932e96c9 95 if (!state.connected) { /* don't switch if we're in a connected state. */
mbedAustin 24:8edfe6730cc2 96 configAdvertisementTimeout.detach(); /* disable the callback from the timeout Ticker. */
mbedAustin 50:52a8b18d5bf1 97 EddystoneBeaconConfig->setupEddystoneAdvertisements();
screamer 0:c04d932e96c9 98 }
screamer 0:c04d932e96c9 99 }
screamer 0:c04d932e96c9 100
screamer 0:c04d932e96c9 101 /**
mbedAustin 40:6f39aee31205 102 * Callback triggered upon a disconnection event.
screamer 0:c04d932e96c9 103 */
screamer 0:c04d932e96c9 104 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
screamer 0:c04d932e96c9 105 {
scottjenson 67:345bc62c748d 106 ledRed = ledOff;
mbedAustin 39:2c73bc1ff4f5 107 if (true == params.isConfigured){
mbedAustin 39:2c73bc1ff4f5 108 // end advertising, the beacon is configured
mbedAustin 39:2c73bc1ff4f5 109 timeout();
mbedAustin 39:2c73bc1ff4f5 110 }
mbedAustin 39:2c73bc1ff4f5 111 else{
mbedAustin 40:6f39aee31205 112 // eddystone is not configured, continue advertising
mbedAustin 39:2c73bc1ff4f5 113 ble.gap().startAdvertising();
mbedAustin 39:2c73bc1ff4f5 114 }
screamer 0:c04d932e96c9 115 }
scottjenson 67:345bc62c748d 116 int reboot = false; // global used later to reboot the beacon
scottjenson 67:345bc62c748d 117 int dirty = false; // global used to mark params is dirty and needs to be saved
scottjenson 67:345bc62c748d 118
scottjenson 67:345bc62c748d 119 void handle_button1() {
scottjenson 67:345bc62c748d 120 printf("handle_button1\n\r");
scottjenson 67:345bc62c748d 121 ble.gap().stopAdvertising();
scottjenson 67:345bc62c748d 122 params.deepSleep = !params.deepSleep;
scottjenson 67:345bc62c748d 123 dirty = true;
scottjenson 67:345bc62c748d 124 }
scottjenson 67:345bc62c748d 125
scottjenson 67:345bc62c748d 126 extern void pstorageSetup();
screamer 0:c04d932e96c9 127
screamer 0:c04d932e96c9 128 int main(void)
screamer 0:c04d932e96c9 129 {
scottjenson 67:345bc62c748d 130 printf("main\n\r");
scottjenson 67:345bc62c748d 131 ledRed = ledOff;
scottjenson 67:345bc62c748d 132 ledGreen = ledOff;
scottjenson 67:345bc62c748d 133 ledBlue = ledOff;
screamer 0:c04d932e96c9 134 ble.init();
rgrover1 8:1a21308e5008 135 ble.gap().onDisconnection(disconnectionCallback);
screamer 0:c04d932e96c9 136
scottjenson 67:345bc62c748d 137 // Initialize button1 and pull up
scottjenson 67:345bc62c748d 138 // set interrupt callback for button1
scottjenson 67:345bc62c748d 139 button1.fall(&handle_button1);
scottjenson 67:345bc62c748d 140 button1.mode(PullUp);
scottjenson 67:345bc62c748d 141
screamer 0:c04d932e96c9 142 /*
screamer 0:c04d932e96c9 143 * Load parameters from (platform specific) persistent storage. Parameters
screamer 0:c04d932e96c9 144 * can be set to non-default values while the URIBeacon is in configuration
screamer 0:c04d932e96c9 145 * mode (within the first 60 seconds of power-up). Thereafter, parameters
screamer 0:c04d932e96c9 146 * get copied out to persistent storage before switching to normal URIBeacon
screamer 0:c04d932e96c9 147 * operation.
screamer 0:c04d932e96c9 148 */
rgrover1 2:8020d6d4455a 149 bool fetchedFromPersistentStorage = loadURIBeaconConfigParams(&params);
mbedAustin 44:0e27ee7800b8 150
scottjenson 67:345bc62c748d 151 // only setup beacon if device is NOT in deepSleep
mbedAustin 44:0e27ee7800b8 152 // Set UID and TLM frame data
scottjenson 67:345bc62c748d 153 //EddystoneConfigService::UIDNamespaceID_t uidNamespaceID = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}; // 10Byte Namespace UUID
scottjenson 67:345bc62c748d 154 //EddystoneConfigService::UIDInstanceID_t uidInstanceID = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; // 6Byte Instance ID
scottjenson 67:345bc62c748d 155 //uint8_t tlmVersion = 0x00;
mbedAustin 31:11e7a505a4be 156
mbedAustin 24:8edfe6730cc2 157 /* Initialize a EddystoneBeaconConfig service providing config params, default URI, and power levels. */
mbedAustin 63:2478203aa555 158 static EddystoneConfigService::PowerLevels_t defaultAdvPowerLevels = {-47, -33, -21, -13}; // Values for ADV packets related to firmware levels, calibrated based on measured values at 1m
mbedAustin 63:2478203aa555 159 static EddystoneConfigService::PowerLevels_t radioPowerLevels = {-30, -16, -4, 4}; // Values for radio power levels, provided by manufacturer.
mbedAustin 55:3818a9fa827d 160 EddystoneBeaconConfig = new EddystoneConfigService(ble, params, defaultAdvPowerLevels, radioPowerLevels);
mbedAustin 63:2478203aa555 161 EddystoneBeaconConfig->setDefaultURIFrameData("http://mbed.org",2);
scottjenson 67:345bc62c748d 162 //EddystoneBeaconConfig->setDefaultUIDFrameData(&uidNamespaceID, &uidInstanceID,5);
scottjenson 67:345bc62c748d 163 //EddystoneBeaconConfig->setDefaultTLMFrameData(tlmVersion,10);
mbedAustin 44:0e27ee7800b8 164 EddystoneBeaconConfig->start(!fetchedFromPersistentStorage);
mbedAustin 44:0e27ee7800b8 165
mbedAustin 39:2c73bc1ff4f5 166 if (!EddystoneBeaconConfig->initSuccessfully()) {
screamer 0:c04d932e96c9 167 error("failed to accommodate URI");
screamer 0:c04d932e96c9 168 }
scottjenson 67:345bc62c748d 169 if (!params.deepSleep) {
scottjenson 67:345bc62c748d 170 printf("deepSleep is false\n\r");
scottjenson 67:345bc62c748d 171 ledRed = ledOn;
scottjenson 67:345bc62c748d 172 configAdvertisementTimeout.attach(timeout, CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS);
scottjenson 67:345bc62c748d 173 ble.gap().startAdvertising(); /* Set the whole thing in motion. After this call a GAP central can scan the EddystoneBeaconConfig
scottjenson 67:345bc62c748d 174 * service. This can then be switched to the normal URIBeacon functionality after a timeout. */
scottjenson 67:345bc62c748d 175 void pstorageSetup();
scottjenson 67:345bc62c748d 176 }
scottjenson 67:345bc62c748d 177 else {
scottjenson 67:345bc62c748d 178 printf("deepSleep is true\n\r");
scottjenson 67:345bc62c748d 179 ledRed = ledOff;
scottjenson 67:345bc62c748d 180 }
scottjenson 67:345bc62c748d 181
screamer 0:c04d932e96c9 182 while (true) {
screamer 0:c04d932e96c9 183 ble.waitForEvent();
scottjenson 67:345bc62c748d 184 if (dirty) {
scottjenson 67:345bc62c748d 185 saveURIBeaconConfigParams(&params);
scottjenson 67:345bc62c748d 186 }
screamer 0:c04d932e96c9 187 }
screamer 0:c04d932e96c9 188 }