High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Revision:
4:50a31ff5f974
Parent:
3:46de446e82ed
Child:
5:7635f81a8e09
--- a/GapAdvertisingData.h	Wed Dec 11 22:15:59 2013 +0000
+++ b/GapAdvertisingData.h	Thu Dec 12 02:20:54 2013 +0000
@@ -10,13 +10,17 @@
     @brief
     This class provides several helper functions to generate properly
     formatted GAP Advertising and Scan Response data payloads
-    
+
+    @note See Bluetooth Specification 4.0 (Vol. 3), Part C, Section 11 and 18
+    for further information on Advertising and Scan Response data.
+        
     @section Advertising and Scan Response Payloads
     
     @para
     Advertising data and Scan Response data are organized around a set of
-    data types called 'AD types' in the Bluetooth 4.0 specification.
-            
+    data types called 'AD types' in Bluetooth 4.0 (see the Bluetooth Core
+    Specification v4.0, Vol. 3, Part C, Sections 11 and 18).
+
     @para
     Each AD type has it's own standardized 'assigned number', as defined
     by the Bluetooth SIG:
@@ -24,24 +28,23 @@
     
     @para
     For convenience sake, all appropriate AD types have been encapsulated
-    into an enum at \ref ble_gap_adv_datatype_t.
+    into an enum at \ref DataType.
     
     @para
-    Raw Advertising or Scan Response payloads are formatted as follows:
+    Before the AD Types and their payload (if any) can be inserted into
+    the Advertising or Scan Response frames, they need to be formatted as
+    follows:
     
     - Record length (1 byte)
     - AD Type (1 byte)
     - AD payload (optional, only present if record length > 1)
-    
+
     @para
-    When multiple AD types are present, the individual records are simply
+    When multiple AD records are present, the individual records are
     appended one after the other, up to the maximum payload length of 31
-    bytes.
+    bytes, as can be seen in the example payload below.
     
-    @note See Bluetooth Specification 4.0 (Vol. 3) Section 11, 18 for
-    further information on Advertising and Scan Response data.
-    
-    @section Sample Advertising Payload
+    @section Sample Raw Advertising Payload
     
     // Two record payload containing BLE_GAP_ADV_DATATYPE_FLAGS (0x01) and 
     // BLE_GAP_ADV_DATATYPE_COMPLETE_LOCAL_NAME (0x09) fields
@@ -62,14 +65,105 @@
 /**************************************************************************/
 class GapAdvertisingData
 {
-public:    
+  public:
+    /* Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18 */
+    /* https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile */
+    enum DataType
+    {
+      FLAGS                                             = 0x01,
+      INCOMPLETE_LIST_16BIT_SERVICE_IDS                 = 0x02,
+      COMPLETE_LIST_16BIT_SERVICE_IDS                   = 0x03,
+      INCOMPLETE_LIST_32BIT_SERVICE_IDS                 = 0x04,
+      COMPLETE_LIST_32BIT_SERVICE_IDS                   = 0x05,
+      INCOMPLETE_LIST_128BIT_SERVICE_IDS                = 0x06,
+      COMPLETE_LIST_128BIT_SERVICE_IDS                  = 0x07,
+      SHORTENED_LOCAL_NAME                              = 0x08,
+      COMPLETE_LOCAL_NAME                               = 0x09,
+      TX_POWER_LEVEL                                    = 0x0A,
+      DEVICE_ID                                         = 0x10,
+      SLAVE_CONNECTION_INTERVAL_RANGE                   = 0x12,
+      SERVICE_DATA                                      = 0x16,
+      APPEARANCE                                        = 0x19,
+      ADVERTISING_INTERVAL                              = 0x1A,
+      MANUFACTURER_SPECIFIC_DATA                        = 0xFF
+    };
+    
+    /* Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 18.1 */
+    enum Flags
+    {
+      LE_LIMITED_DISCOVERABLE                           = 0x01,
+      LE_GENERAL_DISCOVERABLE                           = 0x02,
+      BREDR_NOT_SUPPORTED                               = 0x04,
+      SIMULTANEOUS_LE_BREDR_C                           = 0x08,
+      SIMULTANEOUS_LE_BREDR_H                           = 0x10
+    };
+
+    /* Bluetooth Core Specification Supplement, Part A, Section 1.12 */
+    /* Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 12.2 */
+    /* https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml */
+    enum Appearance
+    {
+      UNKNOWN                                           = 0,
+      GENERIC_PHONE                                     = 64,
+      GENERIC_COMPUTER                                  = 128,
+      GENERIC_WATCH                                     = 192,
+      WATCH_SPORTS_WATCH                                = 193,
+      GENERIC_CLOCK                                     = 256,
+      GENERIC_DISPLAY                                   = 320,
+      GENERIC_REMOTE_CONTROL                            = 384,
+      GENERIC_EYE_GLASSES                               = 448,
+      GENERIC_TAG                                       = 512,
+      GENERIC_KEYRING                                   = 576,
+      GENERIC_MEDIA_PLAYER                              = 640,
+      GENERIC_BARCODE_SCANNER                           = 704,
+      GENERIC_THERMOMETER                               = 768,
+      THERMOMETER_EAR                                   = 769,
+      GENERIC_HEART_RATE_SENSOR                         = 832,
+      HEART_RATE_SENSOR_HEART_RATE_BELT                 = 833,
+      GENERIC_BLOOD_PRESSURE                            = 896,
+      BLOOD_PRESSURE_ARM                                = 897,
+      BLOOD_PRESSURE_WRIST                              = 898,
+      HUMAN_INTERFACE_DEVICE_HID                        = 960,
+      KEYBOARD                                          = 961,
+      MOUSE                                             = 962,
+      JOYSTICK                                          = 963,
+      GAMEPAD                                           = 964,
+      DIGITIZER_TABLET                                  = 965,
+      CARD_READER                                       = 966,
+      DIGITAL_PEN                                       = 967,
+      BARCODE_SCANNER                                   = 968,
+      GENERIC_GLUCOSE_METER                             = 1024,
+      GENERIC_RUNNING_WALKING_SENSOR                    = 1088,
+      RUNNING_WALKING_SENSOR_IN_SHOE                    = 1089,
+      RUNNING_WALKING_SENSOR_ON_SHOE                    = 1090,
+      RUNNING_WALKING_SENSOR_ON_HIP                     = 1091,
+      GENERIC_CYCLING                                   = 1152,
+      CYCLING_CYCLING_COMPUTER                          = 1153,
+      CYCLING_SPEED_SENSOR                              = 1154,
+      CYCLING_CADENCE_SENSOR                            = 1155,
+      CYCLING_POWER_SENSOR                              = 1156,
+      CYCLING_SPEED_AND_CADENCE_SENSOR                  = 1157,
+      PULSE_OXIMETER_GENERIC                            = 3136,
+      PULSE_OXIMETER_FINGERTIP                          = 3137,
+      PULSE_OXIMETER_WRIST_WORN                         = 3138,
+      OUTDOOR_GENERIC                                   = 5184,
+      OUTDOOR_LOCATION_DISPLAY_DEVICE                   = 5185,
+      OUTDOOR_LOCATION_AND_NAVIGATION_DISPLAY_DEVICE    = 5186,
+      OUTDOOR_LOCATION_POD                              = 5187,
+      OUTDOOR_LOCATION_AND_NAVIGATION_POD               = 5188
+    };
+
     GapAdvertisingData(void);
     virtual ~GapAdvertisingData(void);
 
-    ble_error_t addData(ble_gap_adv_datatype_t, uint8_t *, uint8_t);
+    ble_error_t addData(DataType, uint8_t *, uint8_t);
+    ble_error_t addAppearance(Appearance appearance = UNKNOWN);
+    ble_error_t addFlags(Flags flag = LE_GENERAL_DISCOVERABLE);
+    ble_error_t addTxPower(int8_t txPower);
+    void        clear(void);
     uint8_t     getPayloadLen(void);
-    
-private:
+
+  private:
     uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD];
     uint8_t _payloadLen;
 };