Writing the Device Name Characteristic? (almost there!)

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
PaDo_1228851
Level 3
Level 3
25 replies posted 10 replies posted 10 questions asked

I am able to write a new device name to a peripheral from an iOS device and have it appear in the advertising data using this code:

   

char newName[] = "any new name";

   

Cyble_GapSetLocalName(newName);

   

Cyble_GapUpdateAdvData(cyBle_discoveryModeInfo.advData,  CyBle_discoveryModeInfo.scanRspData);

   

And following Zadek's method at http://www.cypress.com/forum/psoc-4-ble/writing-device-name-characteristic?source=search&keywords=PS..., I have also made a GATT characteristic for the new device name which I can easily write to with an iOS device.  Here is that code:

   

case CYBLE_EVT_GATTS_WRITE_REQ:

   

     wrReqParam = (CYBLE_GATTS_WRITE_REQ_PARAM_T *)eventParam;

   

     if( wrReqParam->handleValPair.attrHandle == CYBLE_MY_SERVICE_DEVICE_NAME_CHAR_HANDLE ){

   

     CyBle_GattsWriteAttributeValue( &wrReqParam->handleValPair, 0, &connectionHandle,         CYBLE_GATT_DB_LOCALLY_INITIATED);

   

     CyBle_GattsWriteRsp( connectionHandle );

   

     };

   

Do I now use a Cyble_GattsRead AttributeValue() on my device name characteristic so that I may assign the read-response to my char newName[] variable?  If so, what does that code look like?  Thanks.

   

 

   

Also, I would like to put the new name in the SFLASH as Zadek did, so that it survives power downs.  What does that code look like?  (the link provided no longer works) Thanks again.

0 Likes
1 Solution
Anonymous
Not applicable

You can update device name for advertisement as below. 

   

cyBle_discoveryModeInfo.cyBle_discoveryData[5] = newName[0];

   

cyBle_discoveryModeInfo.cyBle_discoveryData[5] = newName[1];

   

 

   

and so on. 

   

 

   

You also need to change cyBle_discoveryModeInfo.cyBle_discoveryData[3] to length of name. 

View solution in original post

0 Likes
4 Replies
Anonymous
Not applicable

You can update device name for advertisement as below. 

   

cyBle_discoveryModeInfo.cyBle_discoveryData[5] = newName[0];

   

cyBle_discoveryModeInfo.cyBle_discoveryData[5] = newName[1];

   

 

   

and so on. 

   

 

   

You also need to change cyBle_discoveryModeInfo.cyBle_discoveryData[3] to length of name. 

0 Likes
PaDo_1228851
Level 3
Level 3
25 replies posted 10 replies posted 10 questions asked

Thanks pvkv.  Working fine.  I can write a new name from my phone to the peripheral and have that new name appear in the advertising packet.  Now I want to flash that new name to the SFLASH so that the new name survives the peripheral's  power downs.  I have had a look at the User_SFLASH_Write-2 project and have added WriteUserSFLASH.c and .h to my project.  And I've calculated my useable SFLASH row numbers to be from 562 to 1023 (does that sound right?)  I've not yet been able to flash to memory.

   

How should I use WriteUserFlashRow()?  Like this WriteUserFlashRow(563, &newName);?

   

And how do I get newName[] back into the advData upon power up?

   

Thanks.

0 Likes
PaDo_1228851
Level 3
Level 3
25 replies posted 10 replies posted 10 questions asked

I can write to a characteristic and then have that characteristic update the peripheral's local name using the following code:

   

___________________________________________

   

Stack_Handler( uint32 eventCode, void *eventParam )

   

{

   

CYBLE_GATTS_WRITE_REQ_PARAM_T *wrReqParam;

   

switch ( eventCode )

   

{

   

......

   

case CYBLE_EVT_GATTS_WRITE_REQ:

   

wrReqParam = (

   

CYBLE_GATTS_WRITE_REQ_PARAM_T *)eventParam;

   

switch ( wrReqParam->handleValPair.attrHandle )

   

{

   

case CYBLE_TOW_SERVICE_ID_CHAR_HANDLE:

   

sensorNameHandle.attrHandle =

   

CYBLE_TOW_SERVICE_ID_CHAR_HANDLE;

   

sensorNameHandle.value.val =

   

"";

   

sensorNameHandle.value.len = 19;

   

CyBle_GattsWriteAttributeValue( &sensorNameHandle, 0, &connectionHandle,

   

CYBLE_GATT_DB_LOCALLY_INITIATED);

   

CyBle_GattsWriteAttributeValue( &wrReqParam->handleValPair, 0, &connectionHandle,

   

CYBLE_GATT_DB_LOCALLY_INITIATED);

   

CyBle_GattsWriteRsp(connectionHandle);

   

uint8 name[19] = {""};

   

sensorNameHandle.attrHandle =

   

CYBLE_TOW_SERVICE_ID_CHAR_HANDLE;

   

sensorNameHandle.value.val = name;

   

sensorNameHandle.value.len = 19;

   

CyBle_GattsReadAttributeValue(&sensorNameHandle,&connectionHandle,

   

CYBLE_GATT_DB_LOCALLY_INITIATED);

   

int length = sizeof(name);

   

int i;

   

for(i=0; i<length; i++){

   

cyBle_discoveryData.advData[i+5] = name;

   

}

   

cyBle_discoveryData.advData[3] = length;

   

CyBle_GapSetLocalName((

   

const char *)name);

   

DynamicADVPayloadUpdate();

   

break;

   

_________________________________________________________

   

But I can only successfully set 12 characters of the local name.  If I try to write more than 12 characters from my iOS device then the local name isn't reset.  Also if I send less than 12 characters, say I send 9 characters, then the final 3 characters from the previous local name still remain as part of the new local name.  I've worked with the iOS code and am pretty sure that the problem is in my peripheral's code.  Any ideas what is happening?  There is enough room in my advertising scan response packet for 20 characters, all of which show upon the first read by the iOS upon the peripheral's power up.  The 12 character problem only shows up after the first write from the iOS to the peripheral.

0 Likes
PaDo_1228851
Level 3
Level 3
25 replies posted 10 replies posted 10 questions asked

Please disregard the above problem.  I am headed in another directions.  thanks.