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.

LP-CC1352P7: Remove two button menu and replace Uart command

Part Number: LP-CC1352P7

I successfully ran the Simple Central SDK on my development board.

It's working fine, but I need to change two buttons( take lots of memo ) in the menu to UART-based commands. 

For example, I want to send commands like 'scan,' 'connect,' 'reset,' etc. Do you have any suggestions on how to do this

#define SC_ITEM_SCANPHY TBM_ITEM(0) // "Set Scanning PHY"
#define SC_ITEM_STARTDISC TBM_ITEM(1) // "Discover Devices"
#define SC_ITEM_STOPDISC TBM_ITEM(2) // "Stop Discovering"
#define SC_ITEM_CONNECT TBM_ITEM(3) // "Connect To"
#define SC_ITEM_CANCELCONN TBM_ITEM(4) // "Cancel Connecting"
#define SC_ITEM_SELECTCONN TBM_ITEM(5) // "Work With"
#define SC_ITEM_AUTOCONNECT TBM_ITEM(6) // "Auto Connect"

#define SC_ITEM_GATTREAD TBM_ITEM(0) // "GATT Read"
#define SC_ITEM_GATTWRITE TBM_ITEM(1) // "GATT Write"
#define SC_ITEM_STRTRSSI TBM_ITEM(2) // "Start RSSI Reading"
#define SC_ITEM_STOPRSSI TBM_ITEM(3) // "Stop RSSI Reading"
#define SC_ITEM_UPDATE TBM_ITEM(4) // "Connection Update"
#define SC_ITEM_CONNPHY TBM_ITEM(5) // "Set Connection PHY"
#define SC_ITEM_DISCONNECT TBM_ITEM(6) // "Disconnect"

 

  • Hi Vishal,

    We have a section in the User's Guide on how to remove the Two-button menu:

    https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_7_10_02_23/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/optimization-cc13xx_cc26xx.html#remove-the-two-buttons-menu-and-display

    In the same page you will find several suggestions for RAM and Flash optimization.

    If you want to send serial commands such as scan and connect, I would suggest taking a look at Host test and the Host-Controller Interface (HCI). 

    Cheers,

    Marie H

  • i read this link and i do changes as per -> https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_7_10_02_23/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/optimization-cc13xx_cc26xx.html#remove-the-two-buttons-menu-and-display  

    where i need read serial data and give into event list 

    how i handle  -> switch (pMsg->hdr.event) on uart like 

    #define SC_EVT_KEY_CHANGE 0x01
    #define SC_EVT_SCAN_ENABLED 0x02
    #define SC_EVT_SCAN_DISABLED 0x03
    #define SC_EVT_ADV_REPORT 0x04
    #define SC_EVT_SVC_DISC 0x05
    #define SC_EVT_READ_RSSI 0x06
    #define SC_EVT_PAIR_STATE 0x07
    #define SC_EVT_PASSCODE_NEEDED 0x08
    #define SC_EVT_READ_RPA 0x09
    #define SC_EVT_INSUFFICIENT_MEM 0x0A

    #define APP_EVT_EVENT_MAX 0xA

    char *appEventStrings[] = {


    "APP_EVT_ZERO ",
    "APP_EVT_KEY_CHANGE ",
    "APP_EVT_SCAN_ENABLED ",
    "APP_EVT_SCAN_DISABLED ",
    "APP_EVT_ADV_REPORT ",
    "APP_EVT_SVC_DISC ",
    "APP_EVT_READ_RSSI ",
    "APP_EVT_PAIR_STATE ",
    "APP_EVT_PASSCODE_NEEDED ",
    "APP_EVT_READ_RPA ",
    "APP_EVT_INSUFFICIENT_MEM ",
    };



    static void SimpleCentral_init(void)
    {
    
    
        char input;
        const char echoPrompt[] = "SuperUS_Ble_\r\n";
        int32_t semStatus;
        uint32_t status = UART2_STATUS_SUCCESS;
        GPIO_init();
        /* Create a UART in CALLBACK read mode */
        UART2_Params_init(&uartParams);
        uartParams.readMode     = UART2_Mode_CALLBACK;
        uartParams.readCallback = callbackFxn;
        uartParams.baudRate     = 115200;
        uart = UART2_open(0, &uartParams);
    
    
      uint8_t i;
    
      BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- init ", SC_TASK_PRIORITY);
      // Create the menu
     // SimpleCentral_buildMenu();
    
      // ******************************************************************
      // N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp
      // ******************************************************************
      // Register the current thread as an ICall dispatcher application
      // so that the application can send and receive messages.
      ICall_registerApp(&selfEntity, &syncEvent);
    
      // Create an RTOS queue for message from profile to be sent to app.
      appMsgQueue = Util_constructQueue(&appMsg);
    
      // Initialize internal data
      for (i = 0; i < MAX_NUM_BLE_CONNS; i++)
      {
        connList[i].connHandle = LINKDB_CONNHANDLE_INVALID;
        connList[i].pRssiClock = NULL;
      }
    
     // Board_initKeys(SimpleCentral_keyChangeHandler);
    
      GGS_SetParameter(GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN,
                       (void *)attDeviceName);
    
      //Set default values for Data Length Extension
      //Extended Data Length Feature is already enabled by default
      //in build_config.opt in stack project.
      {
        //Change initial values of RX/TX PDU and Time, RX is set to max. by default(251 octets, 2120us)
        #define APP_SUGGESTED_RX_PDU_SIZE 251     //default is 251 octets(RX)
        #define APP_SUGGESTED_RX_TIME     17000   //default is 17000us(RX)
        #define APP_SUGGESTED_TX_PDU_SIZE 27      //default is 27 octets(TX)
        #define APP_SUGGESTED_TX_TIME     328     //default is 328us(TX)
    
        //This API is documented in hci.h
        //See the LE Data Length Extension section in the BLE5-Stack User's Guide for information on using this command:
        //http://software-dl.ti.com/lprf/ble5stack-latest/
        HCI_EXT_SetMaxDataLenCmd(APP_SUGGESTED_TX_PDU_SIZE, APP_SUGGESTED_TX_TIME, APP_SUGGESTED_RX_PDU_SIZE, APP_SUGGESTED_RX_TIME);
      }
    
      // Initialize GATT Client
      VOID GATT_InitClient();
    
      // Register to receive incoming ATT Indications/Notifications
      GATT_RegisterForInd(selfEntity);
    
      // Initialize GATT attributes
      GGS_AddService(GAP_SERVICE);               // GAP
      GATTServApp_AddService(GATT_ALL_SERVICES); // GATT attributes
    
      // Register for GATT local events and ATT Responses pending for transmission
      GATT_RegisterForMsgs(selfEntity);
    
      // Set Bond Manager parameters
      setBondManagerParameters();
    
      // Start Bond Manager and register callback
      // This must be done before initialing the GAP layer
      VOID GAPBondMgr_Register(&bondMgrCBs);
    
      // Accept all parameter update requests
      GAP_SetParamValue(GAP_PARAM_LINK_UPDATE_DECISION, GAP_UPDATE_REQ_ACCEPT_ALL);
    
      // Register with GAP for HCI/Host messages (for RSSI)
      GAP_RegisterForMsgs(selfEntity);
    
      BLE_LOG_INT_TIME(0, BLE_LOG_MODULE_APP, "APP : ---- call GAP_DeviceInit", GAP_PROFILE_CENTRAL);
      // Initialize GAP layer for Central role and register to receive GAP events
      GAP_DeviceInit(GAP_PROFILE_CENTRAL, selfEntity, addrMode, &pRandomAddress);
    
      UART2_write(uart, echoPrompt, sizeof(echoPrompt), NULL);
      SimpleCentral_doDiscoverDevices();
    
    }
        case SC_EVT_ADV_REPORT:
        {
          GapScan_Evt_AdvRpt_t* pAdvRpt = (GapScan_Evt_AdvRpt_t*) (pMsg->pData);
    
          //Auto connect is enabled
          if (autoConnect)
          {
            if (numGroupMembers == MAX_NUM_BLE_CONNS)
            {
              GapScan_disable();
              break;
            }
            //Check if advertiser is part of the group
            if (SimpleCentral_isMember(pAdvRpt->pData , acGroup, GROUP_NAME_LENGTH))
    	      {
              groupListElem_t *tempMember;
              //Traverse list to search if advertiser already in list.
              for (tempMember = (groupListElem_t *)osal_list_head(&groupList); tempMember != NULL; tempMember = (groupListElem_t *)osal_list_next((osal_list_elem *)tempMember))
              {
                if (osal_memcmp((uint8_t *)tempMember->addr ,(uint8_t *)pAdvRpt->addr,B_ADDR_LEN))
                {
                  break;
                }
              }
              //If tempMemer is NULL this meams advertiser not in list.
              if (tempMember == NULL)
              {
                groupListElem_t *groupMember = (groupListElem_t *)ICall_malloc(sizeof(groupListElem_t));
                if (groupMember != NULL)
                {
                  //Copy member's details into Member's list.
                  osal_memcpy((uint8_t *)groupMember->addr , (uint8_t *)pAdvRpt->addr,B_ADDR_LEN);
                  groupMember->addrType = pAdvRpt->addrType;
                  groupMember->status = GROUP_MEMBER_INITIALIZED;
                  groupMember->connHandle = GROUP_INITIALIZED_CONNECTION_HANDLE;
                  //Add group member into list.
                  osal_list_putHead(&groupList,(osal_list_elem *)groupMember);
                  numGroupMembers++;
                }
                else
                {
              //    Display_printf(dispHandle, SC_ROW_AC, 0, "AutoConnect: Allocation failed!");
                  break;
                }
              }
            }
          }
    #if (DEFAULT_DEV_DISC_BY_SVC_UUID == TRUE)
          if (SimpleCentral_findSvcUuid(SIMPLEPROFILE_SERV_UUID,
                                        pAdvRpt->pData, pAdvRpt->dataLen))
          {
            uint8_t* Name_ble = pAdvRpt->pData;  // 
            Name_ble += 5;                         //
            Name_ble[8] = '\0';                    //
            SimpleCentral_addScanInfo(pAdvRpt->addr, pAdvRpt->addrType);
      // Usage:
            // Assuming pAdvRpt is your structure holding the RSSI value
            char rssi_string[4]; // Adjust buffer size according to the max RSSI value you expect
            rssiToString(pAdvRpt->rssi, rssi_string, sizeof(rssi_string));
    
    
            UART2_write(uart, "Discovered : ", 13, NULL);
            UART2_write(uart, Util_convertBdAddr2Str(pAdvRpt->addr), 14, NULL);
            UART2_write(uart, " ", 1, NULL);
            UART2_write(uart, "RSSI: ", 5, NULL);
            UART2_write(uart, rssi_string, strlen(rssi_string), NULL);
            UART2_write(uart, " ", 1, NULL);
            UART2_write(uart, "Name: ", 5, NULL);
            UART2_write(uart, Name_ble, 8, NULL);
            UART2_write(uart, "\n\r", 2, NULL);
    
    
    
          // Free report payload data
          if (pAdvRpt->pData != NULL)
          {
            ICall_free(pAdvRpt->pData);
          }
          break;
        }