BLE_API wrapper library for STMicroelectronics' BlueNRG Bluetooth Low Energy expansion board shield

Fork of X_NUCLEO_IDB0XA1 by ST Expansion SW Team

Revision:
209:d8e8cd4d4521
Parent:
202:08c4c85ca679
Child:
210:e02936f0d4c7
--- a/source/platform/btle.cpp	Thu Mar 31 11:12:14 2016 +0200
+++ b/source/platform/btle.cpp	Thu Mar 31 11:16:47 2016 +0200
@@ -74,16 +74,14 @@
 
 void HCI_Input(tHciDataPacket * hciReadPacket);
 
-//#define BDADDR_SIZE 6
-//tHalUint8 bdaddr[BDADDR_SIZE]= {0xaa, 0x00, 0x00, 0xE1, 0x80, 0x02};
-
 uint16_t g_gap_service_handle = 0;
 uint16_t g_appearance_char_handle = 0;
 uint16_t g_device_name_char_handle = 0;
 
 /* Private variables ---------------------------------------------------------*/
 volatile uint8_t set_connectable = 1;
-// ANDREA
+
+static char versionString[32];
 uint8_t bnrg_expansion_board = IDB04A1; /* at startup, suppose the X-NUCLEO-IDB04A1 is used */
 
 Gap::Address_t bleAddr;
@@ -99,9 +97,9 @@
     @returns void
 */
 /**************************************************************************/
-void btle_init(bool isSetAddress, uint8_t role)
+void btleInit(bool isSetAddress, uint8_t role)
 {
-    PRINTF("btle_init>>\n\r"); 
+    PRINTF("btleInit>>\n\r");
     
     int ret;
     uint8_t  hwVersion;
@@ -133,8 +131,11 @@
         bnrg_expansion_board = IDB05A1;
     }
 
+    /* set BLE version string */
+    setVersionString(hwVersion, fwVersion);
+
     /* The Nucleo board must be configured as SERVER */
-    //check if isSetAddress is set than set address.
+    //check if isSetAddress is set then set address.
     // ANDREA
     if(isSetAddress)
     {
@@ -161,7 +162,7 @@
         PRINTF("GATT_Init failed.\n");
     }
     if (bnrg_expansion_board == IDB05A1) {
-        ret = aci_gap_init_IDB05A1(GAP_PERIPHERAL_ROLE_IDB05A1|GAP_CENTRAL_ROLE_IDB05A1, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle);
+        ret = aci_gap_init_IDB05A1(GAP_PERIPHERAL_ROLE_IDB05A1|GAP_CENTRAL_ROLE_IDB05A1|GAP_OBSERVER_ROLE_IDB05A1, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle);
     } else {
         ret = aci_gap_init_IDB04A1(role, &service_handle, &dev_name_char_handle, &appearance_char_handle);
     }
@@ -218,6 +219,45 @@
 }
 #endif
 
+/* set BLE Version string */
+void setVersionString(uint8_t hwVersion, uint16_t fwVersion)
+{
+    if(bnrg_expansion_board == IDB04A1 || bnrg_expansion_board == IDB05A1) {
+        snprintf(versionString, sizeof(versionString), "ST BLE4.1 HW v%u.%u FW v%u.%u",
+                                                        hwVersion>>4, (hwVersion&0x0F),
+                                                        fwVersion>>8, (fwVersion&0x00F0)>>4);
+    } else {
+        snprintf(versionString, sizeof(versionString), "ST (unknown spec)");
+    }
+}
+
+/* get BLE Version string */
+const char* getVersionString(void)
+{
+    return versionString;
+}
+
+tBleStatus btleStartRadioScan(uint8_t scan_type,
+                              uint16_t scan_interval,
+                              uint16_t scan_window,
+                              uint8_t own_address_type)
+{
+  tBleStatus ret;
+
+  // Observer role is not supported by X-NUCLEO-IDB04A1, return BLE_ERROR_NOT_IMPLEMENTED
+  if(bnrg_expansion_board == IDB05A1) {
+      ret = aci_gap_start_observation_procedure(scan_interval,
+	                                        scan_window,
+                                                scan_type,
+		                                own_address_type,
+                                                1); // 1 to filter duplicates
+  } else {
+      ret = BLE_STATUS_INVALID_CID;
+  }
+
+  return ret;
+
+}
 
 /*!
     @brief  Not Used
@@ -536,8 +576,7 @@
             //printf("EVT_BLUE_GAP_PROCEDURE_COMPLETE (code=0x%02X)\n\r", pr->procedure_code);
             
             switch(pr->procedure_code) {
-            case GAP_LIMITED_DISCOVERY_PROC:
-            case GAP_GENERAL_DISCOVERY_PROC:
+            case GAP_OBSERVATION_PROC_IDB05A1:
               
               BlueNRGGap::getInstance().Discovery_CB(BlueNRGGap::DISCOVERY_COMPLETE, 0, NULL, NULL, NULL, NULL, NULL);
               break;