A single signed 8-bit integer will cover most radios I'm familiar with, yes.
On 19/05/16 20:12, James Howarth wrote:
Hi Chris,
I think it needs to be a signed int right, as txpwer can be negative, does
that sound right?
Cheers
James
On Thu, May 19, 2016 at 11:10 AM, Christopher Collins <[email protected]>
wrote:
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