c034fbca54
Instead of attempting to allocate multiple advertisement instances, only use one by default. If needed, a NewAdvertisement method could be added in the future for devices that actually do support multiple advertisements at a time. The motivation for this change is fix an inconsistency with the nrf51 (which already had the behavior of DefaultAdvertisement) and the discovery that nrf52 devices also don't seem to support more than one advertisement instance, even though their API does allow for multiple instances. But the primary motivation is that for consistency with hosted systems, it would be best if the nrf port would automatically re-enable advertisement when a connection is lost (or made). While BlueZ does support more than one instance, it is implemented by simply iterating through the active advertisement instances so could also be implemented by doing that manually. I haven't checked the behavior of Windows and MacOS - but as always, the API is not yet stable and can be changed if needed.
52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
// +build softdevice,s110v8
|
|
|
|
package bluetooth
|
|
|
|
/*
|
|
// Define SoftDevice functions as regular function declarations (not inline
|
|
// static functions).
|
|
#define SVCALL_AS_NORMAL_FUNCTION
|
|
|
|
#include "ble_gap.h"
|
|
*/
|
|
import "C"
|
|
|
|
// Advertisement encapsulates a single advertisement instance.
|
|
type Advertisement struct {
|
|
interval AdvertisementInterval
|
|
}
|
|
|
|
var defaultAdvertisement Advertisement
|
|
|
|
// DefaultAdvertisement returns the default advertisement instance but does not
|
|
// configure it.
|
|
func (a *Adapter) DefaultAdvertisement() *Advertisement {
|
|
return &defaultAdvertisement
|
|
}
|
|
|
|
// Configure this advertisement.
|
|
func (a *Advertisement) Configure(options AdvertisementOptions) error {
|
|
var payload rawAdvertisementPayload
|
|
payload.addFlags(0x06)
|
|
if options.LocalName != "" {
|
|
if !payload.addCompleteLocalName(options.LocalName) {
|
|
return errAdvertisementPacketTooBig
|
|
}
|
|
}
|
|
errCode := C.sd_ble_gap_adv_data_set(&payload.data[0], payload.len, nil, 0)
|
|
a.interval = options.Interval
|
|
return makeError(errCode)
|
|
}
|
|
|
|
// Start advertisement. May only be called after it has been configured.
|
|
func (a *Advertisement) Start() error {
|
|
params := C.ble_gap_adv_params_t{
|
|
_type: C.BLE_GAP_ADV_TYPE_ADV_IND,
|
|
fp: C.BLE_GAP_ADV_FP_ANY,
|
|
interval: uint16(a.interval),
|
|
timeout: 0, // no timeout
|
|
}
|
|
errCode := C.sd_ble_gap_adv_start(¶ms)
|
|
return makeError(errCode)
|
|
}
|