BLE UART example for Nucloe board and Bluetooth LE Nucleo shield.

Dependencies:   Nucleo_BLE_API Nucleo_BLE_BlueNRG mbed

Warning: Deprecated!

Supported drivers and applications can be found at this link.

Revision:
1:69e44344edaa
Parent:
0:3e2ce2bb50b9
--- a/main.cpp	Fri Dec 19 19:53:05 2014 +0000
+++ b/main.cpp	Wed Dec 24 18:05:05 2014 +0000
@@ -16,87 +16,148 @@
  
 #include "mbed.h"
 #include "BLEDevice.h"
+#include "DeviceInformationService.h"
 #include "UARTService.h"
 #include "Utils.h"
 
+const static char     DEVICE_NAME[]        = "BlueNRG_UART";
+uint8_t c = 'A';
 
-#define BLE_UART_SEND(STR) { if (uartServicePtr) uartServicePtr->write(STR, strlen(STR)); }
-
+extern bool user_button_pressed;
+bool connected = false;
+bool UpdatedEnabled = false;
 
 BLEDevice  ble;
-DigitalOut led1(LED1);
-DigitalIn mybutton(USER_BUTTON);
+UARTService *uartServicePtr;
 
-bool connected = false;
-
-UARTService *uartServicePtr;
- 
+/* Callback called when the device is disconnected */
 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
 {
-    DEBUG("Disconnected!\n\r");
-    DEBUG("Restarting the advertising process\n\r");
-    ble.startAdvertising();
-    connected = false;
+  DEBUG("Disconnected!\n\r");
+  DEBUG("Restarting the advertising process\n\r");
+
+  ble.startAdvertising();
+  connected = false;
 }
 
+/* Callback called when the device is connected */
 void connectionCallback(Gap::Handle_t handle, const Gap::ConnectionParams_t *reason)
 {
   DEBUG("Connected\r\n");
+
   connected = true;
 }
 
+/* Not working */
+void onDataSent(unsigned count)
+{
+  DEBUG("onDataSent\r\n");
+}
+
+/* Not working */
 void onDataWritten(const GattCharacteristicWriteCBParams *params)
 {
-    if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
-        uint16_t bytesRead = params->len;
-        DEBUG("received %u bytes\n\r", bytesRead);
-        ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
+  DEBUG("--onDataWritten\r\n");
+  DEBUG("---charHandle               : %d\r\n", params->charHandle);
+  DEBUG("---getTXCharacteristicHandle: %d\r\n", uartServicePtr->getTXCharacteristicHandle());
+  DEBUG("---len: %d\r\n", params->len);
+    
+  if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) 
+  {
+    DEBUG("received %u bytes\n\r", params->len);
+             
+    if(params->data[0] == 0x00)
+    {
+      //Do something
     }
+    else
+    {
+      //Do something else
+    }
+  }
+}
+
+/* Callback called when the client enables updates */
+void onUpdatesEnabled(uint16_t attributeHandle)
+{
+  DEBUG("**onUpdatesEnabled**\r\n");
+  UpdatedEnabled = true;
+}
+
+/* Callback called when the client disable updates */
+void onUpdatesDisabled(uint16_t attributeHandle)
+{
+  DEBUG("**onUpdatesDisabled**\r\n");
+  UpdatedEnabled = false;
 }
  
-void periodicCallback(void)
-{
-    led1 = !led1;
-}
- 
+/* Main */
 int main(void)
 {
-    led1 = 1;
-    Ticker ticker;
-    ticker.attach(periodicCallback, 1);
+  DEBUG("Initialising \n\r");
+  ble.init();
+#if 1
+/* Set callback functions */
+  ble.onDisconnection(disconnectionCallback);
+  ble.onConnection(connectionCallback);
+  ble.onDataWritten(onDataWritten);
+  ble.onDataSent(onDataSent);
+  ble.onUpdatesEnabled(onUpdatesEnabled);
+  ble.onUpdatesDisabled(onUpdatesDisabled);
  
-    DEBUG("Initialising \n\r");
-    ble.init();
-    ble.onDisconnection(disconnectionCallback);
-    ble.onConnection(connectionCallback);
-    ble.onDataWritten(onDataWritten);
- 
-    /* setup advertising */
-    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
-    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
-    ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
-    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
- 
-    ble.setAdvertisingInterval(160);
-    ble.startAdvertising();
+  DeviceInformationService deviceInfo(ble, "ST", "Nucleo", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
+  /* setup advertising */
+  ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
+  ble.setAdvertisingType          (GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    
+  ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME            , (const uint8_t *)"BlueNRG_UART"          , sizeof("BlueNRG_UART") - 1);
+  ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
+  ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME             , (uint8_t *)DEVICE_NAME                   , sizeof(DEVICE_NAME));
+
+  /* Start advertising */
+  ble.setAdvertisingInterval(160);
+  ble.startAdvertising();
  
-    UARTService uartService(ble);
-    uartServicePtr = &uartService;
- 
- 
-    while (true) 
+  UARTService uartService(ble);
+  uartServicePtr = &uartService;
+
+
+  while (true) 
+  {
+    ble.waitForEvent();
+        
+    if(connected == true)
     {
-        ble.waitForEvent();
-        
-        if(connected == true)
+      if ((user_button_pressed == true) && (UpdatedEnabled == true))
+      {
+        user_button_pressed = false;
+        DEBUG("Current Char: %c\r\n",c);
+        ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), &c, 1);
+                
+        c++;
+                
+        if(c == ('Z'+1))
         {
-            if (mybutton == 0)
-            {
-                DEBUG("ABCDEFGHIJKLMNOPQRST");
-                BLE_UART_SEND("ABCDEFGHIJKLMNOPQRST");
-
-                while(mybutton == 0);
-            }
+          c = 'A';
         }
+      }
     }
+  }
+#else
+  while (true) 
+  {
+    if (user_button_pressed == true)
+    {
+      user_button_pressed = false;
+      DEBUG("Current Char: %c\r\n",c);
+                
+      c++;
+                
+      if(c == ('Z'+1))
+      {
+        c = 'A';
+      }
+    }
+  }
+#endif
 }