Lightly modified version of the BLE stack, that doesn't bring up a DFUService by default... as we have our own.

Fork of BLE_API by Bluetooth Low Energy

Revision:
288:1956023d42fb
Parent:
286:898ff71b9502
--- a/services/iBeaconService.h	Fri Feb 13 16:37:42 2015 +0000
+++ b/services/iBeaconService.h	Fri Feb 13 16:37:42 2015 +0000
@@ -16,6 +16,7 @@
 #ifndef __BLE_IBEACON_SERVICE_H__
 #define __BLE_IBEACON_SERVICE_H__
 
+#include "core_cmInstr.h"
 #include "BLEDevice.h"
 
 /**
@@ -26,33 +27,9 @@
 class iBeaconService
 {
 public:
-    iBeaconService(BLEDevice &_ble, uint8_t proxUUID[16],uint16_t majNum,uint16_t minNum,uint8_t txP=0xC8, uint16_t compID=0x004C):
-        ble(_ble)
-    {
-        data.ID =  0x02;         // Optional ID field
-        data.len = 0x15;         // Len of remaining stuff (16B UUID, 2B Maj, 2B Min, 1B TxP)
-        data.majorNumber = ((majNum<<8) | (majNum >>8));
-        data.minorNumber = ((minNum<<8) | (minNum >>8));
-        data.txPower = txP;      // The user should calibrate this to ~1meter fromt he device
-        data.companyID = compID; // Note: all iBeacons use the Apple ID of 0x004C
+    typedef const uint8_t LocationUUID_t[16];
 
-        // copy across proximity UUID
-        for(int x=0; x<sizeof(data.proximityUUID); x++) {
-            data.proximityUUID[x]=proxUUID[x];
-        }
-
-        // Set up iBeacon data
-        // Generate the 0x020106 part of the iBeacon Prefix
-        ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
-        // Generate the 0x1AFF part of the iBeacon Prefix
-        ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, data.raw, sizeof(data.raw));
-
-        // Set advertising type
-        ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
-    }
-
-public:
-    union {
+    union Payload {
         uint8_t raw[25];
         struct {
             uint16_t companyID;
@@ -63,11 +40,35 @@
             uint16_t minorNumber;
             uint8_t txPower;
         };
-    } data;
+
+        Payload(LocationUUID_t uuid, uint16_t majNum, uint16_t minNum, uint8_t transmitPower, uint16_t companyIDIn) :
+            companyID(companyIDIn), ID(0x02), len(0x15), majorNumber(__REV16(majNum)), minorNumber(__REV16(minNum)), txPower(transmitPower)
+        {
+            memcpy(proximityUUID, uuid, sizeof(LocationUUID_t));
+        }
+    };
+
+public:
+    iBeaconService(BLEDevice      &_ble,
+                   LocationUUID_t  uuid,
+                   uint16_t        majNum,
+                   uint16_t        minNum,
+                   uint8_t         txP    = 0xC8,
+                   uint16_t        compID = 0x004C) :
+        ble(_ble), data(uuid, majNum, minNum, txP, compID)
+    {
+        // Generate the 0x020106 part of the iBeacon Prefix
+        ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
+        // Generate the 0x1AFF part of the iBeacon Prefix
+        ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, data.raw, sizeof(data.raw));
+
+        // Set advertising type
+        ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
+    }
 
 private:
     BLEDevice &ble;
-
+    Payload   data;
 };
 
 #endif //__BLE_IBEACON_SERVICE_H__
\ No newline at end of file