fermentord/vendor/github.com/JuulLabs-OSS/ble/darwin/cmgrdlg.go

72 lines
1.7 KiB
Go
Raw Normal View History

// cmgrdlg.go: Implements the CentralManagerDelegate interface. CoreBluetooth
// communicates events asynchronously via callbacks. This file implements a
// synchronous interface by translating these callbacks into channel
// operations.
package darwin
import (
"github.com/JuulLabs-OSS/ble"
"github.com/JuulLabs-OSS/cbgo"
)
func (d *Device) CentralManagerDidUpdateState(cmgr cbgo.CentralManager) {
d.evl.stateChanged.RxSignal(struct{}{})
}
func (d *Device) DidDiscoverPeripheral(cmgr cbgo.CentralManager, prph cbgo.Peripheral,
advFields cbgo.AdvFields, rssi int) {
if d.advHandler == nil {
return
}
a := &adv{
localName: advFields.LocalName,
rssi: int(rssi),
mfgData: advFields.ManufacturerData,
}
if advFields.Connectable != nil {
a.connectable = *advFields.Connectable
}
if advFields.TxPowerLevel != nil {
a.powerLevel = *advFields.TxPowerLevel
}
for _, u := range advFields.ServiceUUIDs {
a.svcUUIDs = append(a.svcUUIDs, ble.UUID(u))
}
for _, sd := range advFields.ServiceData {
a.svcData = append(a.svcData, ble.ServiceData{
UUID: ble.UUID(sd.UUID),
Data: sd.Data,
})
}
a.peerUUID = ble.UUID(prph.Identifier())
d.advHandler(a)
}
func (d *Device) DidConnectPeripheral(cmgr cbgo.CentralManager, prph cbgo.Peripheral) {
fail := func(err error) {
d.evl.connected.RxSignal(&eventConnected{
err: err,
})
}
c, err := newCentralConn(d, prph)
if err != nil {
fail(err)
}
d.evl.connected.RxSignal(&eventConnected{
conn: c,
})
}
func (d *Device) DidDisconnectPeripheral(cmgr cbgo.CentralManager, prph cbgo.Peripheral, err error) {
c := d.findConn(ble.NewAddr(prph.Identifier().String()))
if c != nil {
close(c.done)
}
}