On Thu, May 19, 2016 at 11:03:22AM -0700, Christopher Collins wrote:
> > > On May 19, 2016, at 10:11 AM, James Howarth <[email protected]> 
> > > wrote:
> [...]
> > > static int txpwer_to_set[1] ;
> > > memcpy(txpwer_to_set, ctxt->chr_access.data,
> > >         sizeof txpwer_to_set);
> > > 
> > > ble_phy_txpwr_set(*txpwer_to_set);

> ctxt->chr_access.data is a void*, so James has it right :).  If
> txpwer_to_set is a single byte, then I don't see any issues.  If it is
> larger than one byte, then you will need to worry about endianness.

Oops, now I understand the cause of (my) confusion.  James, you probably
don't want to declare txpwer_to_set as a single-element array of int.
Instead, I would just make it a single byte:

    static uint8_t txpwer_to_set;
    memcpy(&txpwer_to_set, ctxt->chr_access.data, sizeof txpwer_to_set);

Assuming the tx power is indeed a single byte.  If its size is larger
than one, you will probably want to think about endianness issues, as I
mentioned in the previous email (in practice it will work, since BLE and
your host processor both use little-endian).

One more thing: you should verify the length of the data being written
to the characteristic.  Something like:

    static uint8_t txpwer_to_set;
    if (ctxt->chr_access.len != sizeof txpwer_to_set) {
        return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
    }
    memcpy(&txpwer_to_set, ctxt->chr_access.data, sizeof txpwer_to_set);

Without that check, the peripheral will accept a write that contains too
much data.

Chris

Reply via email to