You are here

Writing the Device Name Characteristic? (almost there!) | Cypress Semiconductor

Writing the Device Name Characteristic? (almost there!)

Summary: 4 Replies, Latest post by Pat Dolan on 20 Oct 2016 04:31 PM PDT
Verified Answers: 2
Last post
Log in to post new comments.
Pat Dolan's picture
User
29 posts

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-characterist..., 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.

 

 

 

pvkv's picture
Cypress Employee
82 posts

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. 

 

 

Pat Dolan's picture
User
29 posts

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.

 

Pat Dolan's picture
User
29 posts

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[i];

}

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.

Pat Dolan's picture
User
29 posts

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

Log in to post new comments.