This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2640R2F: How to remove connection params updates sent from simple_peripheral project

Part Number: CC2640R2F

CC2640R2 (BLE5)

Note: The following instructions have been written for SDK 3_40_00_10 but can be adapted to quite any SDK version (that is why I provided the sources but also the diff files)

At the end of this instruction, you will get a project which is not anymore able to send requests to update the connection parameters. The project will still be able to answer a connection request.
The goal is to save flash space and CPU time.

How to do this?

 

  1. Import the project you want (the OOB ble5_simple_peripheral or the project where you have already removed the display function, the secondary advertisement and the auto PHY functionalities [see here])
  2.  Do the following in simple_peripheral.c

    • Remove SimplePeripheral_processParamUpdate() function. Remove the call to the function (you can basically remove all the treatment of the events SP_SEND_PARAM_UPDATE_EVT and GAP_LINK_PARAM_UPDATE_EVENT)
    • Modify the spConnRec_t structure to remove the elements pParamUpdateEventData and pUpdateClock. Remove the code using those elements too.
    • Remove the list paramUpdateList (and the code referring to). As a result you can remove the functions SimplePeripheral_clearPendingParamUpdate()
    • Remove the definition of the struct spConnHandleEntry_t
    • Remove the inclusion of the list library: #include <ti/drivers/utils/List.h>

 

>> Here are the diff file and the file you are supposed to get if you also removed the display, the secondary advertisement and the auto PHY functionalities:

simple_peripheral_remove_connection_params_update.diff
--- C:\ti\simplelink_cc2640r2_sdk_3_40_00_10\examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral_without_autoPHY.c	Wed Feb 12 13:02:31 2020
+++ C:\ti\simplelink_cc2640r2_sdk_3_40_00_10\examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\src\app\simple_peripheral_SIMPLE.c	Wed Feb 12 15:55:05 2020
@@ -59,8 +59,6 @@
 #include <intrinsics.h>
 #endif
 
-#include <ti/drivers/utils/List.h>
-
 #include <icall.h>
 #include "util.h"
 #include <bcomdef.h>
@@ -208,19 +206,10 @@
   uint8_t data[];
 } spClockEventData_t;
 
-// List element for parameter update and PHY command status lists
-typedef struct
-{
-  List_Elem elem;
-  uint16_t  connHandle;
-} spConnHandleEntry_t;
-
 // Connected device information
 typedef struct
 {
   uint16_t              connHandle;                        // Connection Handle
-  spClockEventData_t*   pParamUpdateEventData;
-  Clock_Struct*         pUpdateClock;                      // pointer to clock struct
 } spConnRec_t;
 
 /*********************************************************************
@@ -267,9 +256,6 @@
 
 // Per-handle connection info
 static spConnRec_t connList[MAX_NUM_BLE_CONNS];
-
-// List to store connection handles for queued param updates
-static List_List paramUpdateList;
 
 // GAP GATT Attributes
 static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "Simple Peripheral";
@@ -370,7 +356,6 @@
 static uint8_t SimplePeripheral_addConn(uint16_t connHandle);
 static uint8_t SimplePeripheral_getConnIndex(uint16_t connHandle);
 static uint8_t SimplePeripheral_removeConn(uint16_t connHandle);
-static void SimplePeripheral_processParamUpdate(uint16_t connHandle);
 static uint8_t SimplePeripheral_clearConnListEntry(uint16_t connHandle);
 #ifdef PTM_MODE
 void simple_peripheral_handleNPIRxInterceptEvent(uint8_t *pMsg);      // Declaration
@@ -843,18 +828,6 @@
       SimplePeripheral_updateRPA();
       break;
 #endif // PRIVACY_1_2_CFG
-
-    case SP_SEND_PARAM_UPDATE_EVT:
-    {
-      // Extract connection handle from data
-      uint16_t connHandle = *(uint16_t *)(((spClockEventData_t *)pMsg->pData)->data);
-
-      SimplePeripheral_processParamUpdate(connHandle);
-
-      // This data is not dynamically allocated
-      dealloc = FALSE;
-      break;
-    }
 
     default:
       // Do nothing.
@@ -1031,28 +1004,6 @@
       break;
     }
 
-    case GAP_LINK_PARAM_UPDATE_EVENT:
-    {
-      gapLinkUpdateEvent_t *pPkt = (gapLinkUpdateEvent_t *)pMsg;
-
-      // Get the address from the connection handle
-      linkDBInfo_t linkInfo;
-      linkDB_GetInfo(pPkt->connectionHandle, &linkInfo);
-
-      // Check if there are any queued parameter updates
-      spConnHandleEntry_t *connHandleEntry = (spConnHandleEntry_t *)List_get(&paramUpdateList);
-      if (connHandleEntry != NULL)
-      {
-        // Attempt to send queued update now
-        SimplePeripheral_processParamUpdate(connHandleEntry->connHandle);
-
-        // Free list element
-        ICall_free(connHandleEntry);
-      }
-
-      break;
-    }
-
     default:
       break;
   }
@@ -1438,35 +1389,6 @@
       // Found available entry to put a new connection info in
       connList[i].connHandle = connHandle;
 
-      // Allocate data to send through clock handler
-      connList[i].pParamUpdateEventData = ICall_malloc(sizeof(spClockEventData_t) +
-                                                       sizeof (uint16_t));
-      if(connList[i].pParamUpdateEventData)
-      {
-        connList[i].pParamUpdateEventData->event = SP_SEND_PARAM_UPDATE_EVT;
-        *((uint16_t *)connList[i].pParamUpdateEventData->data) = connHandle;
-
-        // Create a clock object and start
-        connList[i].pUpdateClock
-          = (Clock_Struct*) ICall_malloc(sizeof(Clock_Struct));
-
-        if (connList[i].pUpdateClock)
-        {
-          Util_constructClock(connList[i].pUpdateClock,
-                              SimplePeripheral_clockHandler,
-                              SP_SEND_PARAM_UPDATE_DELAY, 0, true,
-                              (UArg) (connList[i].pParamUpdateEventData));
-        }
-        else
-        {
-            ICall_free(connList[i].pParamUpdateEventData);
-        }
-      }
-      else
-      {
-        status = bleMemAllocError;
-      }
-
       break;
     }
   }
@@ -1534,28 +1456,6 @@
 }
 
 /*********************************************************************
- * @fn      SimplePeripheral_clearPendingParamUpdate
- *
- * @brief   clean pending param update request in the paramUpdateList list
- *
- * @param   connHandle - connection handle to clean
- *
- * @return  none
- */
-void SimplePeripheral_clearPendingParamUpdate(uint16_t connHandle)
-{
-  List_Elem *curr;
-
-  for (curr = List_head(&paramUpdateList); curr != NULL; curr = List_next(curr)) 
-  {
-    if (((spConnHandleEntry_t *)curr)->connHandle == connHandle)
-    {
-      List_remove(&paramUpdateList, curr);
-    }
-  }
-}
-
-/*********************************************************************
  * @fn      SimplePeripheral_removeConn
  *
  * @brief   Remove a device from the connected device list
@@ -1570,83 +1470,11 @@
 
   if(connIndex != MAX_NUM_BLE_CONNS)
   {
-    Clock_Struct* pUpdateClock = connList[connIndex].pUpdateClock;
-
-    if (pUpdateClock != NULL)
-    {
-      // Stop and destruct the RTOS clock if it's still alive
-      if (Util_isActive(pUpdateClock))
-      {
-        Util_stopClock(pUpdateClock);
-      }
-
-      // Destruct the clock object
-      Clock_destruct(pUpdateClock);
-      // Free clock struct
-      ICall_free(pUpdateClock);
-      // Free ParamUpdateEventData
-      ICall_free(connList[connIndex].pParamUpdateEventData);
-    }
-    // Clear pending update requests from paramUpdateList
-    SimplePeripheral_clearPendingParamUpdate(connHandle);
     // Clear Connection List Entry
     SimplePeripheral_clearConnListEntry(connHandle);
   }
 
   return connIndex;
-}
-
-/*********************************************************************
- * @fn      SimplePeripheral_processParamUpdate
- *
- * @brief   Process a parameters update request
- *
- * @return  None
- */
-static void SimplePeripheral_processParamUpdate(uint16_t connHandle)
-{
-  gapUpdateLinkParamReq_t req;
-  uint8_t connIndex;
-
-  req.connectionHandle = connHandle;
-  req.connLatency = DEFAULT_DESIRED_SLAVE_LATENCY;
-  req.connTimeout = DEFAULT_DESIRED_CONN_TIMEOUT;
-  req.intervalMin = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
-  req.intervalMax = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
-
-  connIndex = SimplePeripheral_getConnIndex(connHandle);
-  if (connIndex >= MAX_NUM_BLE_CONNS)
-  {
-    return;
-  }
-
-
-  // Deconstruct the clock object
-  Clock_destruct(connList[connIndex].pUpdateClock);
-  // Free clock struct, only in case it is not NULL
-  if (connList[connIndex].pUpdateClock != NULL)
-  {
-    ICall_free(connList[connIndex].pUpdateClock);
-    connList[connIndex].pUpdateClock = NULL;
-  }
-  // Free ParamUpdateEventData, only in case it is not NULL
-  if (connList[connIndex].pParamUpdateEventData != NULL)
-    ICall_free(connList[connIndex].pParamUpdateEventData);
-
-  // Send parameter update
-  bStatus_t status = GAP_UpdateLinkParamReq(&req);
-
-  // If there is an ongoing update, queue this for when the udpate completes
-  if (status == bleAlreadyInRequestedMode)
-  {
-    spConnHandleEntry_t *connHandleEntry = ICall_malloc(sizeof(spConnHandleEntry_t));
-    if (connHandleEntry)
-    {
-      connHandleEntry->connHandle = connHandle;
-
-      List_put(&paramUpdateList, (List_Elem *)connHandleEntry);
-    }
-  }
 }
 
 #ifdef PTM_MODE
   3157.simple_peripheral_SIMPLE.C

Build and test your program. Everything should build and work smoothly.