Button initiated config service
Dependencies: BLE_API_EddystoneConfigService_2 mbed nRF51822
Fork of BLE_EddystoneBeaconConfigService_3 by
Diff: main.cpp
- Revision:
- 67:345bc62c748d
- Parent:
- 63:2478203aa555
- Child:
- 68:f7f7ec038494
--- a/main.cpp Thu Sep 24 00:19:02 2015 +0000 +++ b/main.cpp Sun Oct 11 22:46:57 2015 +0000 @@ -19,11 +19,58 @@ #include "EddystoneConfigService.h" #include "ConfigParamsPersistence.h" +//#include "BLEDevice.h" +#include "DeviceInformationService.h" BLE ble; EddystoneConfigService *EddystoneBeaconConfig; EddystoneConfigService::Params_t params; +Serial pc(USBTX,USBRX); // uncomment to use printf(...) + +#define TINYBLE false +#define SEEEDARCH true + +#if TINYBLE +int ledOn = 0; +int ledOff = 1; + +InterruptIn button1(P0_17); +DigitalOut ledRed(P0_22); +DigitalOut ledGreen(P0_21); +DigitalOut ledBlue(P0_23); +#endif + +#if SEEEDARCH +int ledOn = 1; +int ledOff = 0; + +InterruptIn button1(P0_17); +InterruptIn mysw1(P0_18); +DigitalOut ledRed(P0_12); +DigitalOut ledGreen(P0_15); +DigitalOut ledBlue(P0_16); +#endif + +// Make sure to turn off before and after animation +// to separate it from the LED which may already be on +void ledRebootAnimation(void) { + ledRed = ledOff; + wait(0.1); + ledRed = ledOn; + wait(0.1); + ledRed = ledOff; + wait(0.1); + ledRed = ledOn; + wait(0.1); + ledRed = ledOff; + wait(0.1); + ledRed = ledOn; + wait(0.1); + ledRed = ledOff; + wait(0.1); +} + /** * URIBeaconConfig service can operate in two modes: a configuration mode which * allows a user to update settings over a connection; and normal URIBeacon mode @@ -33,7 +80,7 @@ * * The following help with this switch. */ -static const int CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS = 30; // Duration after power-on that config service is available. +static const int CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS = 10; // Duration after power-on that config service is available. Ticker configAdvertisementTimeout; @@ -42,6 +89,7 @@ */ void timeout(void) { + ledRed = ledOff; Gap::GapState_t state; state = ble.getGapState(); if (!state.connected) { /* don't switch if we're in a connected state. */ @@ -55,6 +103,7 @@ */ void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) { + ledRed = ledOff; if (true == params.isConfigured){ // end advertising, the beacon is configured timeout(); @@ -64,12 +113,32 @@ ble.gap().startAdvertising(); } } +int reboot = false; // global used later to reboot the beacon +int dirty = false; // global used to mark params is dirty and needs to be saved + +void handle_button1() { + printf("handle_button1\n\r"); + ble.gap().stopAdvertising(); + params.deepSleep = !params.deepSleep; + dirty = true; + } + +extern void pstorageSetup(); int main(void) { + printf("main\n\r"); + ledRed = ledOff; + ledGreen = ledOff; + ledBlue = ledOff; ble.init(); ble.gap().onDisconnection(disconnectionCallback); + // Initialize button1 and pull up + // set interrupt callback for button1 + button1.fall(&handle_button1); + button1.mode(PullUp); + /* * Load parameters from (platform specific) persistent storage. Parameters * can be set to non-default values while the URIBeacon is in configuration @@ -79,28 +148,41 @@ */ bool fetchedFromPersistentStorage = loadURIBeaconConfigParams(¶ms); + // only setup beacon if device is NOT in deepSleep // Set UID and TLM frame data - EddystoneConfigService::UIDNamespaceID_t uidNamespaceID = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}; // 10Byte Namespace UUID - EddystoneConfigService::UIDInstanceID_t uidInstanceID = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; // 6Byte Instance ID - uint8_t tlmVersion = 0x00; + //EddystoneConfigService::UIDNamespaceID_t uidNamespaceID = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}; // 10Byte Namespace UUID + //EddystoneConfigService::UIDInstanceID_t uidInstanceID = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; // 6Byte Instance ID + //uint8_t tlmVersion = 0x00; /* Initialize a EddystoneBeaconConfig service providing config params, default URI, and power levels. */ static EddystoneConfigService::PowerLevels_t defaultAdvPowerLevels = {-47, -33, -21, -13}; // Values for ADV packets related to firmware levels, calibrated based on measured values at 1m static EddystoneConfigService::PowerLevels_t radioPowerLevels = {-30, -16, -4, 4}; // Values for radio power levels, provided by manufacturer. EddystoneBeaconConfig = new EddystoneConfigService(ble, params, defaultAdvPowerLevels, radioPowerLevels); EddystoneBeaconConfig->setDefaultURIFrameData("http://mbed.org",2); - EddystoneBeaconConfig->setDefaultUIDFrameData(&uidNamespaceID, &uidInstanceID,5); - EddystoneBeaconConfig->setDefaultTLMFrameData(tlmVersion,10); + //EddystoneBeaconConfig->setDefaultUIDFrameData(&uidNamespaceID, &uidInstanceID,5); + //EddystoneBeaconConfig->setDefaultTLMFrameData(tlmVersion,10); EddystoneBeaconConfig->start(!fetchedFromPersistentStorage); if (!EddystoneBeaconConfig->initSuccessfully()) { error("failed to accommodate URI"); } - configAdvertisementTimeout.attach(timeout, CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS); - - ble.gap().startAdvertising(); /* Set the whole thing in motion. After this call a GAP central can scan the EddystoneBeaconConfig - * service. This can then be switched to the normal URIBeacon functionality after a timeout. */ + if (!params.deepSleep) { + printf("deepSleep is false\n\r"); + ledRed = ledOn; + configAdvertisementTimeout.attach(timeout, CONFIG_ADVERTISEMENT_TIMEOUT_SECONDS); + ble.gap().startAdvertising(); /* Set the whole thing in motion. After this call a GAP central can scan the EddystoneBeaconConfig + * service. This can then be switched to the normal URIBeacon functionality after a timeout. */ + void pstorageSetup(); + } + else { + printf("deepSleep is true\n\r"); + ledRed = ledOff; + } + while (true) { ble.waitForEvent(); + if (dirty) { + saveURIBeaconConfigParams(¶ms); + } } }