diff --git a/ble_darwin.go b/ble_darwin.go index 3d1e59c..fa499a2 100644 --- a/ble_darwin.go +++ b/ble_darwin.go @@ -10,6 +10,7 @@ import ( "time" "unsafe" + "git.wow.st/gmp/ble/gatt" "git.wow.st/gmp/ble/ns" ) @@ -29,6 +30,8 @@ type BLE struct { var cdLookup map[unsafe.Pointer]*BLE var pdLookup map[unsafe.Pointer]*BLE +var pcache map[unsafe.Pointer]*Peripheral + type State string @@ -50,11 +53,20 @@ func peripheralName(p *ns.CBPeripheral) string { } func newPeripheral(x *ns.CBPeripheral) Peripheral { - return Peripheral{ + if pcache == nil { + pcache = make(map[unsafe.Pointer]*Peripheral) + } else { + if ret,ok := pcache[x.Ptr()]; ok { + return *ret + } + } + ret := Peripheral{ Name: peripheralName(x), Identifier: x.Identifier().UUIDString().String(), p: x, } + pcache[x.Ptr()] = &ret + return ret } type PeripheralListItem struct { @@ -135,10 +147,23 @@ type UpdateStateEvent struct { State string } -type DiscoverEvent struct { +type DiscoverPeripheralEvent struct { Peripheral Peripheral } +type DiscoverServiceEvent struct { + Peripheral Peripheral + Gatt gatt.Service + Service *ns.CBService +} + +type DiscoverCharacteristicEvent struct { + Peripheral Peripheral + Gatt gatt.Characteristic + Service *ns.CBService + Characteristic *ns.CBCharacteristic +} + type ConnectEvent struct { Peripheral Peripheral } @@ -146,6 +171,11 @@ type ConnectTimeoutEvent struct { Peripheral Peripheral } +type UpdageValueEvent struct { + Peripheral Peripheral + Characteristic gatt.Characteristic +} + func (b *BLE) Events() chan interface{} { return b.events } @@ -298,7 +328,7 @@ func discoverPeripheral(c *ns.CBCentralManager, p *ns.CBPeripheral, d *ns.NSDict } if ok := b.peripherals.Add(peripheral); ok { pdLookup[p.Ptr()] = b - b.events <- DiscoverEvent{Peripheral: peripheral} + b.events <- DiscoverPeripheralEvent{Peripheral: peripheral} } } @@ -335,7 +365,7 @@ func connectPeripheral(c *ns.CBCentralManager, p *ns.CBPeripheral) { fmt.Printf("Go: connectPeripheral returning\n") } -func DiscoverServices(x Peripheral) { +func (x Peripheral) DiscoverServices() { fmt.Printf("Discovering services on %s\n", x.Name) p := x.p @@ -345,19 +375,15 @@ func DiscoverServices(x Peripheral) { } func discoverServices(p *ns.CBPeripheral, e *ns.NSError) { + b := pdLookup[p.Ptr()] fmt.Printf("Did discover services\n") p.Services().ObjectEnumerator().ForIn(func(o *ns.Id) bool { serv := o.CBService() - uuid := serv.UUID() - switch { - case uuid.IsEqualTo(hrm_uuid): - fmt.Printf("--heart rate monitor service\n") - p.DiscoverCharacteristics(nil, serv) - case uuid.IsEqualTo(info_uuid): - fmt.Printf("--device information service\n") - p.DiscoverCharacteristics(nil, serv) - default: - fmt.Printf("--unknown service\n") + uuid := serv.UUID().UUIDString().String() + b.events <-DiscoverServiceEvent{ + Peripheral: newPeripheral(p), + Gatt: gatt.Service{uuid}, + Service: serv, } return true }) @@ -377,26 +403,32 @@ func hr(d *ns.NSData) int { } } +func (p Peripheral) DiscoverCharacteristics(serv *ns.CBService) { + p.p.DiscoverCharacteristics(nil, serv) +} + func discoverCharacteristics(p *ns.CBPeripheral, s *ns.CBService, e *ns.NSError) { + b := pdLookup[p.Ptr()] fmt.Printf("Did discover characteristics\n") - uuid := s.UUID() - fmt.Printf("----%s\n", uuid.UUIDString()) - if uuid.IsEqualTo(hrm_uuid) { - s.Characteristics().ObjectEnumerator().ForIn(func(o *ns.Id) bool { - chr := o.CBCharacteristic() - chuuid := chr.UUID() - fmt.Printf("------%s\n", chuuid.UUIDString()) - if chuuid.IsEqualTo(hrv_uuid) { - p.SetNotifyValue(1, chr) - v := chr.Value() - fmt.Println(hr(v)) - } - return true - }) - } + s.Characteristics().ObjectEnumerator().ForIn(func(o *ns.Id) bool { + chr := o.CBCharacteristic() + chuuid := chr.UUID() + fmt.Printf("------%s\n", chuuid.UUIDString()) + b.events <-DiscoverCharacteristicEvent{ + Peripheral: newPeripheral(p), + Service: s, + Characteristic: chr, + Gatt: gatt.Characteristic{chuuid.UUIDString().String()}, + } + return true + }) fmt.Printf("Go: discoverCharacteristics returning\n") } +func (p Peripheral) SetNotifyValue(c *ns.CBCharacteristic) { + p.p.SetNotifyValue(1, c) +} + func updateValue(p *ns.CBPeripheral, chr *ns.CBCharacteristic, e *ns.NSError) { //ble := pdLookup[p] ble := gble diff --git a/gatt/main.go b/gatt/main.go new file mode 100644 index 0000000..a69e110 --- /dev/null +++ b/gatt/main.go @@ -0,0 +1,17 @@ +package gatt + +import ( +) + +type Service struct { + UUID string +} + +type Descriptor struct { + UUID string +} + +type Characteristic struct { + UUID string +} +