Hugo Pristauz / Mbed 2 deprecated M18_LED_Switch

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_Button by Bluetooth Low Energy

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 
+      }
+   }