Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822
Fork of BLE_Button by
Diff: main.cpp
- Revision:
- 11:80f2c19ecbce
- Parent:
- 10:7943b5c1117a
- Child:
- 12:0d0ca44397dd
--- a/main.cpp Wed Dec 30 09:54:06 2015 +0000
+++ b/main.cpp Sat Jan 07 23:48:53 2017 +0000
@@ -1,125 +1,125 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+// T08N_Smart_Button - Smart Button Node with Button Service
+
+#include "bricks/bricks.h"
+#include "LightSwitch.h" // light switch service
+
+//==============================================================================
+// Button Handling
+//==============================================================================
-#include "mbed.h"
-#include "ble/BLE.h"
-#include "ButtonService.h"
+ enum
+ {
+ OFF = 0,
+ ON,
+ NONE
+ };
-DigitalOut led1(LED1);
-InterruptIn button(BUTTON1);
+ InterruptIn button(BUTTON1);
+
+ static Digital buttonState = NONE;
+ static Bool switchState = 0;
-const static char DEVICE_NAME[] = "Button";
-static const uint16_t uuid16_list[] = {ButtonService::BUTTON_SERVICE_UUID};
+ void cbButtonPress() // executes in interupt mode - keep short!
+ {
+ buttonState = ON;
+ }
+
+ void cbButtonRelease()
+ {
+ buttonState = OFF;
+ }
-enum {
- RELEASED = 0,
- PRESSED,
- IDLE
-};
-static uint8_t buttonState = IDLE;
+ void enrollButton(Blob &o) // enroll button functionality
+ {
+ button.fall(cbButtonPress); // setup button press callback
+ button.rise(cbButtonRelease); // setup button release callback
+ }
-static ButtonService *buttonServicePtr;
+//==============================================================================
+// Light Switch Service Setup
+//==============================================================================
-void buttonPressedCallback(void)
-{
- /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
- * BLE device API from the main thread. */
- buttonState = PRESSED;
-}
+ static LightSwitch *lightSwitchPtr;
-void buttonReleasedCallback(void)
-{
- /* Note that the buttonReleasedCallback() executes in interrupt context, so it is safer to access
- * BLE device API from the main thread. */
- buttonState = RELEASED;
-}
+ void enrollService(Blob &o)
+ {
+ lightSwitchPtr = new LightSwitch(o,false); // auto-enrolls service
+ }
+
+//==============================================================================
+// BLE Callbacks
+//==============================================================================
-void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
-{
- BLE::Instance().gap().startAdvertising();
-}
+ void onError(Blob &o) // Error Reporting Callback
+ {
+ (void) o; // Avoid compiler warnings
+ blink(FAULT); // indicate advertising
+ }
-void periodicCallback(void)
-{
- led1 = !led1; /* Do blinky on LED1 to indicate system aliveness. */
-}
+ void onConnect(Blob &blue) // Connection Callback
+ {
+ blink("x x x ",CONNECTED); // indicate advertising
+ }
-/**
- * This function is called when the ble initialization process has failled
- */
-void onBleInitError(BLE &ble, ble_error_t error)
-{
- /* Initialization error handling should go here */
-}
+ void onDisconnect(Blob &o) // Disconnection Callback
+ {
+ o.start(); // start advertising on client disconnect
+ blink(ADVERTISE); // indicate advertising
+ }
-/**
- * Callback triggered when the ble initialization process has finished
- */
-void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
-{
- BLE& ble = params->ble;
- ble_error_t error = params->error;
+ void onSetup(Blob &o)
+ {
+ o.onConnect(onConnect); // setup connection callback
+ o.onDisconnect(onDisconnect); // setup disconnection callback
- if (error != BLE_ERROR_NONE) {
- /* In case of error, forward the error handling to onBleInitError */
- onBleInitError(ble, error);
- return;
- }
+ enrollButton(o); // enroll button functionality
+ enrollService(o); // enroll service functionality
+
+ name(o,"T09N#1.0 Light Switch"); // setup advertising name
+ device(o,"Light Switch"); // setup device name
+ data(o,"ABCDEF"); // setup advertising data
+
+ peripheral(o,"C:ng",100); // start advertising @ 100 msec interval
+ blink(ADVERTISE); // show that board is advertising
- /* Ensure that it is the default instance of BLE */
- if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
- return;
- }
-
- ble.gap().onDisconnection(disconnectionCallback);
-
- /* Setup primary service */
- buttonServicePtr = new ButtonService(ble, false /* initial value for button pressed */);
+ //buttonServicePtr = new ButtonService(ble, false /* initial value for button pressed */);
+ }
- /* setup advertising */
- ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
- ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
- ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
- ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
- ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
- ble.gap().startAdvertising();
-
-}
+ main(void)
+ {
+ Digital currentState, debounceState;
+ Digital shadowState = NONE;
+
+ verbose(); // print all verbose messages
+ blink(IDLE); // idle blinking - just started!
-int main(void)
-{
- led1 = 1;
- Ticker ticker;
- ticker.attach(periodicCallback, 1);
- button.fall(buttonPressedCallback);
- button.rise(buttonReleasedCallback);
+ Blob o; // declare a blob (BLE OBject)
+ o.init(onSetup,onError); // init BLE base layer, always do first
+
+ while (true) // Infinite loop waiting for BLE events
+ {
+ if (o.hasInitialized())
+ {
+ currentState = buttonState;
+ wait(0.01);
+ debounceState = buttonState;
+
+ if ((currentState==debounceState) && (currentState != shadowState))
+ {
+ if (currentState == ON)
+ {
+ switchState = !switchState;
+ lightSwitchPtr->setSwitch(o,switchState);
+ lightSwitchPtr->setState(o,switchState);
- BLE &ble = BLE::Instance();
- ble.init(bleInitComplete);
-
- /* SpinWait for initialization to complete. This is necessary because the
- * BLE object is used in the main loop below. */
- while (ble.hasInitialized() == false) { /* spin loop */ }
-
- while (true) {
- if (buttonState != IDLE) {
- buttonServicePtr->updateButtonState(buttonState);
- buttonState = IDLE;
- }
-
- ble.waitForEvent();
- }
-}
+ if (switchState == ON)
+ blink("xxxx xxxx ");
+ else
+ blink("x x ");
+ }
+ shadowState = currentState;
+ }
+ }
+ o.sleep(); // low power waiting for BLE events
+ }
+ }
