just a fork

Fork of BLE_API by Bluetooth Low Energy

Files at this revision

API Documentation at this revision

Comitter:
vcoubard
Date:
Wed Apr 06 19:15:42 2016 +0100
Parent:
1187:231e4007429a
Child:
1189:740911150041
Commit message:
Synchronized with git rev bdfcd49c
Author: Andres Amaya Garcia
Gap doesnt commit adv payload changes on failure

Gap function members that modify the advertising and scan payload use the
underlying stack to test if the new payload is sane. If any errors are
generated, then the changes are not committed to copy of the payload in BLE API.

Changed in this revision

ble/Gap.h Show annotated file Show diff for this revision Revisions of this file
--- a/ble/Gap.h	Wed Apr 06 19:15:41 2016 +0100
+++ b/ble/Gap.h	Wed Apr 06 19:15:42 2016 +0100
@@ -948,7 +948,7 @@
      */
     void clearAdvertisingPayload(void) {
         _advPayload.clear();
-        setAdvertisingData();
+        setAdvertisingData(_advPayload, _scanResponse);
     }
 
     /**
@@ -966,12 +966,18 @@
      *         advertising payload.
      */
     ble_error_t accumulateAdvertisingPayload(uint8_t flags) {
+        GapAdvertisingData advPayloadCopy = _advPayload;
         ble_error_t rc;
-        if ((rc = _advPayload.addFlags(flags)) != BLE_ERROR_NONE) {
+        if ((rc = advPayloadCopy.addFlags(flags)) != BLE_ERROR_NONE) {
             return rc;
         }
 
-        return setAdvertisingData();
+        rc = setAdvertisingData(advPayloadCopy, _scanResponse);
+        if (rc == BLE_ERROR_NONE) {
+            _advPayload = advPayloadCopy;
+        }
+
+        return rc;
     }
 
     /**
@@ -987,14 +993,18 @@
      *         advertising payload.
      */
     ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::Appearance app) {
-        setAppearance(app);
-
+        GapAdvertisingData advPayloadCopy = _advPayload;
         ble_error_t rc;
-        if ((rc = _advPayload.addAppearance(app)) != BLE_ERROR_NONE) {
+        if ((rc = advPayloadCopy.addAppearance(app)) != BLE_ERROR_NONE) {
             return rc;
         }
 
-        return setAdvertisingData();
+        rc = setAdvertisingData(advPayloadCopy, _scanResponse);
+        if (rc == BLE_ERROR_NONE) {
+            _advPayload = advPayloadCopy;
+        }
+
+        return rc;
     }
 
     /**
@@ -1010,12 +1020,16 @@
      *         advertising payload.
      */
     ble_error_t accumulateAdvertisingPayloadTxPower(int8_t power) {
+        if (power < -100 || power > 20) {
+            return BLE_ERROR_PARAM_OUT_OF_RANGE;
+        }
+
         ble_error_t rc;
         if ((rc = _advPayload.addTxPower(power)) != BLE_ERROR_NONE) {
             return rc;
         }
 
-        return setAdvertisingData();
+        return setAdvertisingData(_advPayload, _scanResponse);
     }
 
     /**
@@ -1042,16 +1056,18 @@
      *       payload.
      */
     ble_error_t accumulateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
-        if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
-            setDeviceName(data);
-        }
-
+        GapAdvertisingData advPayloadCopy = _advPayload;
         ble_error_t rc;
-        if ((rc = _advPayload.addData(type, data, len)) != BLE_ERROR_NONE) {
+        if ((rc = advPayloadCopy.addData(type, data, len)) != BLE_ERROR_NONE) {
             return rc;
         }
 
-        return setAdvertisingData();
+        rc = setAdvertisingData(advPayloadCopy, _scanResponse);
+        if (rc == BLE_ERROR_NONE) {
+            _advPayload = advPayloadCopy;
+        }
+
+        return rc;
     }
 
     /**
@@ -1071,16 +1087,18 @@
      *         matching AD type; otherwise, an appropriate error.
      */
     ble_error_t updateAdvertisingPayload(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
-        if (type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
-            setDeviceName(data);
-        }
-
+        GapAdvertisingData advPayloadCopy = _advPayload;
         ble_error_t rc;
-        if ((rc = _advPayload.updateData(type, data, len)) != BLE_ERROR_NONE) {
+        if ((rc = advPayloadCopy.updateData(type, data, len)) != BLE_ERROR_NONE) {
             return rc;
         }
 
-        return setAdvertisingData();
+        rc = setAdvertisingData(advPayloadCopy, _scanResponse);
+        if (rc == BLE_ERROR_NONE) {
+            _advPayload = advPayloadCopy;
+        }
+
+        return rc;
     }
 
     /**
@@ -1097,8 +1115,13 @@
      *         set.
      */
     ble_error_t setAdvertisingPayload(const GapAdvertisingData &payload) {
+        ble_error_t rc = setAdvertisingData(_advPayload, _scanResponse);
+        if (rc != BLE_ERROR_NONE) {
+            /* The payload has a problem, do not store it */
+            return rc;
+        }
         _advPayload = payload;
-        return setAdvertisingData();
+        return BLE_ERROR_NONE;
     }
 
     /**
@@ -1127,12 +1150,18 @@
      *         response payload.
      */
     ble_error_t accumulateScanResponse(GapAdvertisingData::DataType type, const uint8_t *data, uint8_t len) {
+        GapAdvertisingData scanResponseCopy = _scanResponse;
         ble_error_t rc;
-        if ((rc = _scanResponse.addData(type, data, len)) != BLE_ERROR_NONE) {
+        if ((rc = scanResponseCopy.addData(type, data, len)) != BLE_ERROR_NONE) {
             return rc;
         }
 
-        return setAdvertisingData();
+        rc = setAdvertisingData(_advPayload, scanResponseCopy);
+        if (rc == BLE_ERROR_NONE) {
+            _scanResponse = scanResponseCopy;
+        }
+
+        return rc;
     }
 
     /**
@@ -1144,7 +1173,7 @@
      */
     void clearScanResponse(void) {
         _scanResponse.clear();
-        setAdvertisingData();
+        setAdvertisingData(_advPayload, _scanResponse);
     }
 
     /**
@@ -1375,16 +1404,6 @@
 
 private:
     /**
-     * Helper function used to set the advertising data in the underlying BLE stack.
-     *
-     * @return BLE_ERROR_NONE if the advertising data was successfully set.
-     */
-    ble_error_t setAdvertisingData(void) {
-        return setAdvertisingData(_advPayload, _scanResponse);
-    }
-
-private:
-    /**
      * Functionality that is BLE stack-dependent and must be implemented by the
      * ported. This is a helper function to set the advertising data in the
      * BLE stack.