diff --git a/README.md b/README.md index 13222cc..643d9dc 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Go Bluetooth -[![CircleCI](https://circleci.com/gh/tinygo-org/bluetooth/tree/master.svg?style=svg)](https://circleci.com/gh/tinygo-org/bluetooth/tree/master) +[![CircleCI](https://circleci.com/gh/tinygo-org/bluetooth/tree/dev.svg?style=svg)](https://circleci.com/gh/tinygo-org/bluetooth/tree/dev) [![GoDoc](https://godoc.org/github.com/tinygo-org/bluetooth?status.svg)](https://godoc.org/github.com/tinygo-org/bluetooth) This package attempts to build a cross-platform Bluetooth Low Energy module for Go. It currently supports the following systems: @@ -11,7 +11,7 @@ This package attempts to build a cross-platform Bluetooth Low Energy module for | Scanning | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Connect to peripheral | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Write peripheral characteristics | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| Receive notifications | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | +| Receive notifications | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Advertisement | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | | Local services | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | | Local characteristics | :x: | :heavy_check_mark: | :heavy_check_mark: | :x: | @@ -52,7 +52,7 @@ Flashing will then need to be done a bit differently, using the CMSIS-DAP interf ## API stability -**The API is not stable!** Because many features are not yet implemented and some platforms (e.g. MacOS) are not yet supported, it's hard to say what a good API will be. Therefore, if you want stability you should pick a particular git commit and use that. Go modules can be useful for this purpose. +**The API is not stable!** Because many features are not yet implemented and some platforms (e.g. Windows and macOS) are not yet fully supported, it's hard to say what a good API will be. Therefore, if you want stability you should pick a particular git commit and use that. Go modules can be useful for this purpose. Some things that will probably change: diff --git a/gap_darwin.go b/gap_darwin.go index 039f3ff..46413c9 100644 --- a/gap_darwin.go +++ b/gap_darwin.go @@ -85,6 +85,9 @@ type Device struct { servicesChan chan error charsChan chan error + + services map[UUID]*DeviceService + characteristics map[UUID]*DeviceCharacteristic } // Connect starts a connection attempt to the given peripheral device address. @@ -142,5 +145,10 @@ func (pd *peripheralDelegate) DidDiscoverCharacteristics(prph cbgo.Peripheral, s // DidUpdateValueForCharacteristic is called when the characteristic for a Service // for a Peripheral receives a notification with a new value. func (pd *peripheralDelegate) DidUpdateValueForCharacteristic(prph cbgo.Peripheral, chr cbgo.Characteristic, err error) { - // TODO: implement this + uuid, _ := ParseUUID(chr.UUID().String()) + if char, ok := pd.d.characteristics[uuid]; ok { + if char != nil && char.callback != nil { + go char.callback(chr.Value()) + } + } } diff --git a/gattc_darwin.go b/gattc_darwin.go index ad4a685..6beba58 100644 --- a/gattc_darwin.go +++ b/gattc_darwin.go @@ -20,6 +20,9 @@ func (d *Device) DiscoverServices(uuids []UUID) ([]DeviceService, error) { d.prph.DiscoverServices(cbuuids) + // clear cache of services + d.services = make(map[UUID]*DeviceService) + // wait on channel for service discovery select { case <-d.servicesChan: @@ -32,6 +35,7 @@ func (d *Device) DiscoverServices(uuids []UUID) ([]DeviceService, error) { service: dsvc, } svcs = append(svcs, svc) + d.services[svc.UUID] = &svc } return svcs, nil case <-time.NewTimer(10 * time.Second).C: @@ -63,6 +67,9 @@ func (s *DeviceService) DiscoverCharacteristics(uuids []UUID) ([]DeviceCharacter s.device.prph.DiscoverCharacteristics(cbuuids, s.service) + // clear cache of characteristics + s.device.characteristics = make(map[UUID]*DeviceCharacteristic) + // wait on channel for characteristic discovery select { case <-s.device.charsChan: @@ -75,6 +82,7 @@ func (s *DeviceService) DiscoverCharacteristics(uuids []UUID) ([]DeviceCharacter characteristic: dchar, } chars = append(chars, char) + s.device.characteristics[char.UUID] = &char } return chars, nil case <-time.NewTimer(10 * time.Second).C: