72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
|
// 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)
|
||
|
}
|
||
|
}
|