You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2017/03/03 03:19:46 UTC
[4/7] incubator-mynewt-newt git commit: MYNEWT-653 Use runtimeco gatt
fork.
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/central.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/central.go b/newtmgr/vendor/github.com/runtimeinc/gatt/central.go
deleted file mode 100644
index 55bd2c1..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/central.go
+++ /dev/null
@@ -1,152 +0,0 @@
-package gatt
-
-import (
- "bytes"
- "errors"
- "fmt"
- "sync"
-)
-
-// Central is the interface that represent a remote central device.
-type Central interface {
- ID() string // ID returns platform specific ID of the remote central device.
- Close() error // Close disconnects the connection.
- MTU() int // MTU returns the current connection mtu.
-}
-
-type ResponseWriter interface {
- // Write writes data to return as the characteristic value.
- Write([]byte) (int, error)
-
- // SetStatus reports the result of the read operation. See the Status* constants.
- SetStatus(byte)
-}
-
-// responseWriter is the default implementation of ResponseWriter.
-type responseWriter struct {
- capacity int
- buf *bytes.Buffer
- status byte
-}
-
-func newResponseWriter(c int) *responseWriter {
- return &responseWriter{
- capacity: c,
- buf: new(bytes.Buffer),
- status: StatusSuccess,
- }
-}
-
-func (w *responseWriter) Write(b []byte) (int, error) {
- if avail := w.capacity - w.buf.Len(); avail < len(b) {
- return 0, fmt.Errorf("requested write %d bytes, %d available", len(b), avail)
- }
- return w.buf.Write(b)
-}
-
-func (w *responseWriter) SetStatus(status byte) { w.status = status }
-func (w *responseWriter) bytes() []byte { return w.buf.Bytes() }
-
-// A ReadHandler handles GATT read requests.
-type ReadHandler interface {
- ServeRead(resp ResponseWriter, req *ReadRequest)
-}
-
-// ReadHandlerFunc is an adapter to allow the use of
-// ordinary functions as ReadHandlers. If f is a function
-// with the appropriate signature, ReadHandlerFunc(f) is a
-// ReadHandler that calls f.
-type ReadHandlerFunc func(resp ResponseWriter, req *ReadRequest)
-
-// ServeRead returns f(r, maxlen, offset).
-func (f ReadHandlerFunc) ServeRead(resp ResponseWriter, req *ReadRequest) {
- f(resp, req)
-}
-
-// A WriteHandler handles GATT write requests.
-// Write and WriteNR requests are presented identically;
-// the server will ensure that a response is sent if appropriate.
-type WriteHandler interface {
- ServeWrite(r Request, data []byte) (status byte)
-}
-
-// WriteHandlerFunc is an adapter to allow the use of
-// ordinary functions as WriteHandlers. If f is a function
-// with the appropriate signature, WriteHandlerFunc(f) is a
-// WriteHandler that calls f.
-type WriteHandlerFunc func(r Request, data []byte) byte
-
-// ServeWrite returns f(r, data).
-func (f WriteHandlerFunc) ServeWrite(r Request, data []byte) byte {
- return f(r, data)
-}
-
-// A NotifyHandler handles GATT notification requests.
-// Notifications can be sent using the provided notifier.
-type NotifyHandler interface {
- ServeNotify(r Request, n Notifier)
-}
-
-// NotifyHandlerFunc is an adapter to allow the use of
-// ordinary functions as NotifyHandlers. If f is a function
-// with the appropriate signature, NotifyHandlerFunc(f) is a
-// NotifyHandler that calls f.
-type NotifyHandlerFunc func(r Request, n Notifier)
-
-// ServeNotify calls f(r, n).
-func (f NotifyHandlerFunc) ServeNotify(r Request, n Notifier) {
- f(r, n)
-}
-
-// A Notifier provides a means for a GATT server to send
-// notifications about value changes to a connected device.
-// Notifiers are provided by NotifyHandlers.
-type Notifier interface {
- // Write sends data to the central.
- Write(data []byte) (int, error)
-
- // Done reports whether the central has requested not to
- // receive any more notifications with this notifier.
- Done() bool
-
- // Cap returns the maximum number of bytes that may be sent
- // in a single notification.
- Cap() int
-}
-
-type notifier struct {
- central *central
- a *attr
- maxlen int
- donemu sync.RWMutex
- done bool
-}
-
-func newNotifier(c *central, a *attr, maxlen int) *notifier {
- return ¬ifier{central: c, a: a, maxlen: maxlen}
-}
-
-func (n *notifier) Write(b []byte) (int, error) {
- n.donemu.RLock()
- defer n.donemu.RUnlock()
- if n.done {
- return 0, errors.New("central stopped notifications")
- }
- return n.central.sendNotification(n.a, b)
-}
-
-func (n *notifier) Cap() int {
- return n.maxlen
-}
-
-func (n *notifier) Done() bool {
- n.donemu.RLock()
- defer n.donemu.RUnlock()
- return n.done
-}
-
-func (n *notifier) stop() {
- n.donemu.Lock()
- n.done = true
- n.donemu.Unlock()
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/central_darwin.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/central_darwin.go b/newtmgr/vendor/github.com/runtimeinc/gatt/central_darwin.go
deleted file mode 100644
index e5eed0a..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/central_darwin.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package gatt
-
-import (
- "sync"
-
- "github.com/runtimeinc/gatt/xpc"
-)
-
-type central struct {
- dev *device
- uuid UUID
- mtu int
- notifiers map[uint16]*notifier
- notifiersmu *sync.Mutex
-}
-
-func newCentral(d *device, u UUID) *central {
- return ¢ral{
- dev: d,
- mtu: 23,
- uuid: u,
- notifiers: make(map[uint16]*notifier),
- notifiersmu: &sync.Mutex{},
- }
-}
-
-func (c *central) ID() string { return c.uuid.String() }
-func (c *central) Close() error { return nil }
-func (c *central) MTU() int { return c.mtu }
-
-func (c *central) sendNotification(a *attr, b []byte) (int, error) {
- data := make([]byte, len(b))
- copy(data, b) // have to make a copy, why?
- c.dev.sendCmd(15, xpc.Dict{
- // "kCBMsgArgUUIDs": [][]byte{reverse(c.uuid.b)}, // connection interrupted
- // "kCBMsgArgUUIDs": [][]byte{c.uuid.b}, // connection interrupted
- // "kCBMsgArgUUIDs": []xpc.UUID{xpc.UUID(reverse(c.uuid.b))},
- // "kCBMsgArgUUIDs": []xpc.UUID{xpc.UUID(c.uuid.b)},
- // "kCBMsgArgUUIDs": reverse(c.uuid.b),
- //
- // FIXME: Sigh... tried to targeting the central, but couldn't get work.
- // So, broadcast to all subscribed centrals. Either of the following works.
- // "kCBMsgArgUUIDs": []xpc.UUID{},
- "kCBMsgArgUUIDs": [][]byte{},
- "kCBMsgArgAttributeID": a.h,
- "kCBMsgArgData": data,
- })
- return len(b), nil
-}
-
-func (c *central) startNotify(a *attr, maxlen int) {
- c.notifiersmu.Lock()
- defer c.notifiersmu.Unlock()
- if _, found := c.notifiers[a.h]; found {
- return
- }
- n := newNotifier(c, a, maxlen)
- c.notifiers[a.h] = n
- char := a.pvt.(*Characteristic)
- go char.nhandler.ServeNotify(Request{Central: c}, n)
-}
-
-func (c *central) stopNotify(a *attr) {
- c.notifiersmu.Lock()
- defer c.notifiersmu.Unlock()
- if n, found := c.notifiers[a.h]; found {
- n.stop()
- delete(c.notifiers, a.h)
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/central_linux.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/central_linux.go b/newtmgr/vendor/github.com/runtimeinc/gatt/central_linux.go
deleted file mode 100644
index 3ae6994..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/central_linux.go
+++ /dev/null
@@ -1,446 +0,0 @@
-package gatt
-
-import (
- "encoding/binary"
- "io"
- "net"
- "sync"
-)
-
-type security int
-
-const (
- securityLow = iota
- securityMed
- securityHigh
-)
-
-type central struct {
- attrs *attrRange
- mtu uint16
- addr net.HardwareAddr
- security security
- l2conn io.ReadWriteCloser
- notifiers map[uint16]*notifier
- notifiersmu *sync.Mutex
-}
-
-func newCentral(a *attrRange, addr net.HardwareAddr, l2conn io.ReadWriteCloser) *central {
- return ¢ral{
- attrs: a,
- mtu: 23,
- addr: addr,
- security: securityLow,
- l2conn: l2conn,
- notifiers: make(map[uint16]*notifier),
- notifiersmu: &sync.Mutex{},
- }
-}
-
-func (c *central) ID() string {
- return c.addr.String()
-}
-
-func (c *central) Close() error {
- c.notifiersmu.Lock()
- defer c.notifiersmu.Unlock()
- for _, n := range c.notifiers {
- n.stop()
- }
- return c.l2conn.Close()
-}
-
-func (c *central) MTU() int {
- return int(c.mtu)
-}
-
-func (c *central) loop() {
- for {
- // L2CAP implementations shall support a minimum MTU size of 48 bytes.
- // The default value is 672 bytes
- b := make([]byte, 672)
- n, err := c.l2conn.Read(b)
- if n == 0 || err != nil {
- c.Close()
- break
- }
- if rsp := c.handleReq(b[:n]); rsp != nil {
- c.l2conn.Write(rsp)
- }
- }
-}
-
-// handleReq dispatches a raw request from the central shim
-// to an appropriate handler, based on its type.
-// It panics if len(b) == 0.
-func (c *central) handleReq(b []byte) []byte {
- var resp []byte
- switch reqType, req := b[0], b[1:]; reqType {
- case attOpMtuReq:
- resp = c.handleMTU(req)
- case attOpFindInfoReq:
- resp = c.handleFindInfo(req)
- case attOpFindByTypeValueReq:
- resp = c.handleFindByTypeValue(req)
- case attOpReadByTypeReq:
- resp = c.handleReadByType(req)
- case attOpReadReq:
- resp = c.handleRead(req)
- case attOpReadBlobReq:
- resp = c.handleReadBlob(req)
- case attOpReadByGroupReq:
- resp = c.handleReadByGroup(req)
- case attOpWriteReq, attOpWriteCmd:
- resp = c.handleWrite(reqType, req)
- case attOpReadMultiReq, attOpPrepWriteReq, attOpExecWriteReq, attOpSignedWriteCmd:
- fallthrough
- default:
- resp = attErrorRsp(reqType, 0x0000, attEcodeReqNotSupp)
- }
- return resp
-}
-
-func (c *central) handleMTU(b []byte) []byte {
- c.mtu = binary.LittleEndian.Uint16(b[:2])
- if c.mtu < 23 {
- c.mtu = 23
- }
- if c.mtu >= 256 {
- c.mtu = 256
- }
- return []byte{attOpMtuRsp, uint8(c.mtu), uint8(c.mtu >> 8)}
-}
-
-// REQ: FindInfoReq(0x04), StartHandle, EndHandle
-// RSP: FindInfoRsp(0x05), UUIDFormat, Handle, UUID, Handle, UUID, ...
-func (c *central) handleFindInfo(b []byte) []byte {
- start, end := readHandleRange(b[:4])
-
- w := newL2capWriter(c.mtu)
- w.WriteByteFit(attOpFindInfoRsp)
-
- uuidLen := -1
- for _, a := range c.attrs.Subrange(start, end) {
- if uuidLen == -1 {
- uuidLen = a.typ.Len()
- if uuidLen == 2 {
- w.WriteByteFit(0x01) // TODO: constants for 16bit vs 128bit uuid magic numbers here
- } else {
- w.WriteByteFit(0x02)
- }
- }
- if a.typ.Len() != uuidLen {
- break
- }
- w.Chunk()
- w.WriteUint16Fit(a.h)
- w.WriteUUIDFit(a.typ)
- if ok := w.Commit(); !ok {
- break
- }
- }
-
- if uuidLen == -1 {
- return attErrorRsp(attOpFindInfoReq, start, attEcodeAttrNotFound)
- }
- return w.Bytes()
-}
-
-// REQ: FindByTypeValueReq(0x06), StartHandle, EndHandle, Type(UUID), Value
-// RSP: FindByTypeValueRsp(0x07), AttrHandle, GroupEndHandle, AttrHandle, GroupEndHandle, ...
-func (c *central) handleFindByTypeValue(b []byte) []byte {
- start, end := readHandleRange(b[:4])
- t := UUID{b[4:6]}
- u := UUID{b[6:]}
-
- // Only support the ATT ReadByGroupReq for GATT Primary Service Discovery.
- // More sepcifically, the "Discover Primary Services By Service UUID" sub-procedure
- if !t.Equal(attrPrimaryServiceUUID) {
- return attErrorRsp(attOpFindByTypeValueReq, start, attEcodeAttrNotFound)
- }
-
- w := newL2capWriter(c.mtu)
- w.WriteByteFit(attOpFindByTypeValueRsp)
-
- var wrote bool
- for _, a := range c.attrs.Subrange(start, end) {
- if !a.typ.Equal(attrPrimaryServiceUUID) {
- continue
- }
- if !(UUID{a.value}.Equal(u)) {
- continue
- }
- s := a.pvt.(*Service)
- w.Chunk()
- w.WriteUint16Fit(s.h)
- w.WriteUint16Fit(s.endh)
- if ok := w.Commit(); !ok {
- break
- }
- wrote = true
- }
- if !wrote {
- return attErrorRsp(attOpFindByTypeValueReq, start, attEcodeAttrNotFound)
- }
-
- return w.Bytes()
-}
-
-// REQ: ReadByType(0x08), StartHandle, EndHandle, Type(UUID)
-// RSP: ReadByType(0x09), LenOfEachDataField, DataField, DataField, ...
-func (c *central) handleReadByType(b []byte) []byte {
- start, end := readHandleRange(b[:4])
- t := UUID{b[4:]}
-
- w := newL2capWriter(c.mtu)
- w.WriteByteFit(attOpReadByTypeRsp)
- uuidLen := -1
- for _, a := range c.attrs.Subrange(start, end) {
- if !a.typ.Equal(t) {
- continue
- }
- if (a.secure&CharRead) != 0 && c.security > securityLow {
- return attErrorRsp(attOpReadByTypeReq, start, attEcodeAuthentication)
- }
- v := a.value
- if v == nil {
- rsp := newResponseWriter(int(c.mtu - 1))
- req := &ReadRequest{
- Request: Request{Central: c},
- Cap: int(c.mtu - 1),
- Offset: 0,
- }
- if c, ok := a.pvt.(*Characteristic); ok {
- c.rhandler.ServeRead(rsp, req)
- } else if d, ok := a.pvt.(*Descriptor); ok {
- d.rhandler.ServeRead(rsp, req)
- }
- v = rsp.bytes()
- }
- if uuidLen == -1 {
- uuidLen = len(v)
- w.WriteByteFit(byte(uuidLen) + 2)
- }
- if len(v) != uuidLen {
- break
- }
- w.Chunk()
- w.WriteUint16Fit(a.h)
- w.WriteFit(v)
- if ok := w.Commit(); !ok {
- break
- }
- }
- if uuidLen == -1 {
- return attErrorRsp(attOpReadByTypeReq, start, attEcodeAttrNotFound)
- }
- return w.Bytes()
-}
-
-// REQ: ReadReq(0x0A), Handle
-// RSP: ReadRsp(0x0B), Value
-func (c *central) handleRead(b []byte) []byte {
- h := binary.LittleEndian.Uint16(b)
- a, ok := c.attrs.At(h)
- if !ok {
- return attErrorRsp(attOpReadReq, h, attEcodeInvalidHandle)
- }
- if a.props&CharRead == 0 {
- return attErrorRsp(attOpReadReq, h, attEcodeReadNotPerm)
- }
- if a.secure&CharRead != 0 && c.security > securityLow {
- return attErrorRsp(attOpReadReq, h, attEcodeAuthentication)
- }
- v := a.value
- if v == nil {
- req := &ReadRequest{
- Request: Request{Central: c},
- Cap: int(c.mtu - 1),
- Offset: 0,
- }
- rsp := newResponseWriter(int(c.mtu - 1))
- if c, ok := a.pvt.(*Characteristic); ok {
- c.rhandler.ServeRead(rsp, req)
- } else if d, ok := a.pvt.(*Descriptor); ok {
- d.rhandler.ServeRead(rsp, req)
- }
- v = rsp.bytes()
- }
-
- w := newL2capWriter(c.mtu)
- w.WriteByteFit(attOpReadRsp)
- w.Chunk()
- w.WriteFit(v)
- w.CommitFit()
- return w.Bytes()
-}
-
-// FIXME: check this, untested, might be broken
-func (c *central) handleReadBlob(b []byte) []byte {
- h := binary.LittleEndian.Uint16(b)
- offset := binary.LittleEndian.Uint16(b[2:])
- a, ok := c.attrs.At(h)
- if !ok {
- return attErrorRsp(attOpReadBlobReq, h, attEcodeInvalidHandle)
- }
- if a.props&CharRead == 0 {
- return attErrorRsp(attOpReadBlobReq, h, attEcodeReadNotPerm)
- }
- if a.secure&CharRead != 0 && c.security > securityLow {
- return attErrorRsp(attOpReadBlobReq, h, attEcodeAuthentication)
- }
- v := a.value
- if v == nil {
- req := &ReadRequest{
- Request: Request{Central: c},
- Cap: int(c.mtu - 1),
- Offset: int(offset),
- }
- rsp := newResponseWriter(int(c.mtu - 1))
- if c, ok := a.pvt.(*Characteristic); ok {
- c.rhandler.ServeRead(rsp, req)
- } else if d, ok := a.pvt.(*Descriptor); ok {
- d.rhandler.ServeRead(rsp, req)
- }
- v = rsp.bytes()
- offset = 0 // the server has already adjusted for the offset
- }
- w := newL2capWriter(c.mtu)
- w.WriteByteFit(attOpReadBlobRsp)
- w.Chunk()
- w.WriteFit(v)
- if ok := w.ChunkSeek(offset); !ok {
- return attErrorRsp(attOpReadBlobReq, h, attEcodeInvalidOffset)
- }
- w.CommitFit()
- return w.Bytes()
-}
-
-func (c *central) handleReadByGroup(b []byte) []byte {
- start, end := readHandleRange(b)
- t := UUID{b[4:]}
-
- // Only support the ATT ReadByGroupReq for GATT Primary Service Discovery.
- // More specifically, the "Discover All Primary Services" sub-procedure.
- if !t.Equal(attrPrimaryServiceUUID) {
- return attErrorRsp(attOpReadByGroupReq, start, attEcodeUnsuppGrpType)
- }
-
- w := newL2capWriter(c.mtu)
- w.WriteByteFit(attOpReadByGroupRsp)
- uuidLen := -1
- for _, a := range c.attrs.Subrange(start, end) {
- if !a.typ.Equal(attrPrimaryServiceUUID) {
- continue
- }
- if uuidLen == -1 {
- uuidLen = len(a.value)
- w.WriteByteFit(byte(uuidLen + 4))
- }
- if uuidLen != len(a.value) {
- break
- }
- s := a.pvt.(*Service)
- w.Chunk()
- w.WriteUint16Fit(s.h)
- w.WriteUint16Fit(s.endh)
- w.WriteFit(a.value)
- if ok := w.Commit(); !ok {
- break
- }
- }
- if uuidLen == -1 {
- return attErrorRsp(attOpReadByGroupReq, start, attEcodeAttrNotFound)
- }
- return w.Bytes()
-}
-
-func (c *central) handleWrite(reqType byte, b []byte) []byte {
- h := binary.LittleEndian.Uint16(b[:2])
- value := b[2:]
-
- a, ok := c.attrs.At(h)
- if !ok {
- return attErrorRsp(reqType, h, attEcodeInvalidHandle)
- }
-
- noRsp := reqType == attOpWriteCmd
- charFlag := CharWrite
- if noRsp {
- charFlag = CharWriteNR
- }
- if a.props&charFlag == 0 {
- return attErrorRsp(reqType, h, attEcodeWriteNotPerm)
- }
- if a.secure&charFlag == 0 && c.security > securityLow {
- return attErrorRsp(reqType, h, attEcodeAuthentication)
- }
-
- // Props of Service and Characteristic declration are read only.
- // So we only need deal with writable descriptors here.
- // (Characteristic's value is implemented with descriptor)
- if !a.typ.Equal(attrClientCharacteristicConfigUUID) {
- // Regular write, not CCC
- r := Request{Central: c}
- if c, ok := a.pvt.(*Characteristic); ok {
- c.whandler.ServeWrite(r, value)
- } else if d, ok := a.pvt.(*Characteristic); ok {
- d.whandler.ServeWrite(r, value)
- }
- if noRsp {
- return nil
- } else {
- return []byte{attOpWriteRsp}
- }
- }
-
- // CCC/descriptor write
- if len(value) != 2 {
- return attErrorRsp(reqType, h, attEcodeInvalAttrValueLen)
- }
- ccc := binary.LittleEndian.Uint16(value)
- // char := a.pvt.(*Descriptor).char
- if ccc&(gattCCCNotifyFlag|gattCCCIndicateFlag) != 0 {
- c.startNotify(&a, int(c.mtu-3))
- } else {
- c.stopNotify(&a)
- }
- if noRsp {
- return nil
- }
- return []byte{attOpWriteRsp}
-}
-
-func (c *central) sendNotification(a *attr, data []byte) (int, error) {
- w := newL2capWriter(c.mtu)
- w.WriteByteFit(attOpHandleNotify)
- w.WriteUint16Fit(a.pvt.(*Descriptor).char.vh)
- w.WriteFit(data)
- return c.l2conn.Write(w.Bytes())
-}
-
-func readHandleRange(b []byte) (start, end uint16) {
- return binary.LittleEndian.Uint16(b), binary.LittleEndian.Uint16(b[2:])
-}
-
-func (c *central) startNotify(a *attr, maxlen int) {
- c.notifiersmu.Lock()
- defer c.notifiersmu.Unlock()
- if _, found := c.notifiers[a.h]; found {
- return
- }
- char := a.pvt.(*Descriptor).char
- n := newNotifier(c, a, maxlen)
- c.notifiers[a.h] = n
- go char.nhandler.ServeNotify(Request{Central: c}, n)
-}
-
-func (c *central) stopNotify(a *attr) {
- c.notifiersmu.Lock()
- defer c.notifiersmu.Unlock()
- // char := a.pvt.(*Characteristic)
- if n, found := c.notifiers[a.h]; found {
- n.stop()
- delete(c.notifiers, a.h)
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/common.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/common.go b/newtmgr/vendor/github.com/runtimeinc/gatt/common.go
deleted file mode 100644
index 4fa2389..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/common.go
+++ /dev/null
@@ -1,399 +0,0 @@
-package gatt
-
-// Supported statuses for GATT characteristic read/write operations.
-// These correspond to att constants in the BLE spec
-const (
- StatusSuccess = 0
- StatusInvalidOffset = 1
- StatusUnexpectedError = 2
-)
-
-// A Request is the context for a request from a connected central device.
-// TODO: Replace this with more general context, such as:
-// http://godoc.org/golang.org/x/net/context
-type Request struct {
- Central Central
-}
-
-// A ReadRequest is a characteristic read request from a connected device.
-type ReadRequest struct {
- Request
- Cap int // maximum allowed reply length
- Offset int // request value offset
-}
-
-type Property int
-
-// Characteristic property flags (spec 3.3.3.1)
-const (
- CharBroadcast Property = 0x01 // may be brocasted
- CharRead Property = 0x02 // may be read
- CharWriteNR Property = 0x04 // may be written to, with no reply
- CharWrite Property = 0x08 // may be written to, with a reply
- CharNotify Property = 0x10 // supports notifications
- CharIndicate Property = 0x20 // supports Indications
- CharSignedWrite Property = 0x40 // supports signed write
- CharExtended Property = 0x80 // supports extended properties
-)
-
-func (p Property) String() (result string) {
- if (p & CharBroadcast) != 0 {
- result += "broadcast "
- }
- if (p & CharRead) != 0 {
- result += "read "
- }
- if (p & CharWriteNR) != 0 {
- result += "writeWithoutResponse "
- }
- if (p & CharWrite) != 0 {
- result += "write "
- }
- if (p & CharNotify) != 0 {
- result += "notify "
- }
- if (p & CharIndicate) != 0 {
- result += "indicate "
- }
- if (p & CharSignedWrite) != 0 {
- result += "authenticateSignedWrites "
- }
- if (p & CharExtended) != 0 {
- result += "extendedProperties "
- }
- return
-}
-
-// A Service is a BLE service.
-type Service struct {
- uuid UUID
- chars []*Characteristic
-
- h uint16
- endh uint16
-}
-
-// NewService creates and initialize a new Service using u as it's UUID.
-func NewService(u UUID) *Service {
- return &Service{uuid: u}
-}
-
-// AddCharacteristic adds a characteristic to a service.
-// AddCharacteristic panics if the service already contains another
-// characteristic with the same UUID.
-func (s *Service) AddCharacteristic(u UUID) *Characteristic {
- for _, c := range s.chars {
- if c.uuid.Equal(u) {
- panic("service already contains a characteristic with uuid " + u.String())
- }
- }
- c := &Characteristic{uuid: u, svc: s}
- s.chars = append(s.chars, c)
- return c
-}
-
-// UUID returns the UUID of the service.
-func (s *Service) UUID() UUID { return s.uuid }
-
-// Name returns the specificatin name of the service according to its UUID.
-// If the UUID is not assigne, Name returns an empty string.
-func (s *Service) Name() string {
- return knownServices[s.uuid.String()].Name
-}
-
-// Handle returns the Handle of the service.
-func (s *Service) Handle() uint16 { return s.h }
-
-// EndHandle returns the End Handle of the service.
-func (s *Service) EndHandle() uint16 { return s.endh }
-
-// SetHandle sets the Handle of the service.
-func (s *Service) SetHandle(h uint16) { s.h = h }
-
-// SetEndHandle sets the End Handle of the service.
-func (s *Service) SetEndHandle(endh uint16) { s.endh = endh }
-
-// SetCharacteristics sets the Characteristics of the service.
-func (s *Service) SetCharacteristics(chars []*Characteristic) { s.chars = chars }
-
-// Characteristic returns the contained characteristic of this service.
-func (s *Service) Characteristics() []*Characteristic { return s.chars }
-
-// A Characteristic is a BLE characteristic.
-type Characteristic struct {
- uuid UUID
- props Property // enabled properties
- secure Property // security enabled properties
- svc *Service
- cccd *Descriptor
- descs []*Descriptor
-
- value []byte
-
- // All the following fields are only used in peripheral/server implementation.
- rhandler ReadHandler
- whandler WriteHandler
- nhandler NotifyHandler
-
- h uint16
- vh uint16
- endh uint16
-}
-
-// NewCharacteristic creates and returns a Characteristic.
-func NewCharacteristic(u UUID, s *Service, props Property, h uint16, vh uint16) *Characteristic {
- c := &Characteristic{
- uuid: u,
- svc: s,
- props: props,
- h: h,
- vh: vh,
- }
-
- return c
-}
-
-// Handle returns the Handle of the characteristic.
-func (c *Characteristic) Handle() uint16 { return c.h }
-
-// VHandle returns the Value Handle of the characteristic.
-func (c *Characteristic) VHandle() uint16 { return c.vh }
-
-// EndHandle returns the End Handle of the characteristic.
-func (c *Characteristic) EndHandle() uint16 { return c.endh }
-
-// Descriptor returns the Descriptor of the characteristic.
-func (c *Characteristic) Descriptor() *Descriptor { return c.cccd }
-
-// SetHandle sets the Handle of the characteristic.
-func (c *Characteristic) SetHandle(h uint16) { c.h = h }
-
-// SetVHandle sets the Value Handle of the characteristic.
-func (c *Characteristic) SetVHandle(vh uint16) { c.vh = vh }
-
-// SetEndHandle sets the End Handle of the characteristic.
-func (c *Characteristic) SetEndHandle(endh uint16) { c.endh = endh }
-
-// SetDescriptor sets the Descriptor of the characteristic.
-func (c *Characteristic) SetDescriptor(cccd *Descriptor) { c.cccd = cccd }
-
-// SetDescriptors sets the list of Descriptor of the characteristic.
-func (c *Characteristic) SetDescriptors(descs []*Descriptor) { c.descs = descs }
-
-// UUID returns the UUID of the characteristic.
-func (c *Characteristic) UUID() UUID {
- return c.uuid
-}
-
-// Name returns the specificatin name of the characteristic.
-// If the UUID is not assigned, Name returns empty string.
-func (c *Characteristic) Name() string {
- return knownCharacteristics[c.uuid.String()].Name
-}
-
-// Service returns the containing service of this characteristic.
-func (c *Characteristic) Service() *Service {
- return c.svc
-}
-
-// Properties returns the properties of this characteristic.
-func (c *Characteristic) Properties() Property {
- return c.props
-}
-
-// Descriptors returns the contained descriptors of this characteristic.
-func (c *Characteristic) Descriptors() []*Descriptor {
- return c.descs
-}
-
-// AddDescriptor adds a descriptor to a characteristic.
-// AddDescriptor panics if the characteristic already contains another
-// descriptor with the same UUID.
-func (c *Characteristic) AddDescriptor(u UUID) *Descriptor {
- for _, d := range c.descs {
- if d.uuid.Equal(u) {
- panic("service already contains a characteristic with uuid " + u.String())
- }
- }
- d := &Descriptor{uuid: u, char: c}
- c.descs = append(c.descs, d)
- return d
-}
-
-// SetValue makes the characteristic support read requests, and returns a
-// static value. SetValue must be called before the containing service is
-// added to a server.
-// SetValue panics if the characteristic has been configured with a ReadHandler.
-func (c *Characteristic) SetValue(b []byte) {
- if c.rhandler != nil {
- panic("charactristic has been configured with a read handler")
- }
- c.props |= CharRead
- // c.secure |= CharRead
- c.value = make([]byte, len(b))
- copy(c.value, b)
-}
-
-// HandleRead makes the characteristic support read requests, and routes read
-// requests to h. HandleRead must be called before the containing service is
-// added to a server.
-// HandleRead panics if the characteristic has been configured with a static value.
-func (c *Characteristic) HandleRead(h ReadHandler) {
- if c.value != nil {
- panic("charactristic has been configured with a static value")
- }
- c.props |= CharRead
- // c.secure |= CharRead
- c.rhandler = h
-}
-
-// HandleReadFunc calls HandleRead(ReadHandlerFunc(f)).
-func (c *Characteristic) HandleReadFunc(f func(rsp ResponseWriter, req *ReadRequest)) {
- c.HandleRead(ReadHandlerFunc(f))
-}
-
-// HandleWrite makes the characteristic support write and write-no-response
-// requests, and routes write requests to h.
-// The WriteHandler does not differentiate between write and write-no-response
-// requests; it is handled automatically.
-// HandleWrite must be called before the containing service is added to a server.
-func (c *Characteristic) HandleWrite(h WriteHandler) {
- c.props |= CharWrite | CharWriteNR
- // c.secure |= CharWrite | CharWriteNR
- c.whandler = h
-}
-
-// HandleWriteFunc calls HandleWrite(WriteHandlerFunc(f)).
-func (c *Characteristic) HandleWriteFunc(f func(r Request, data []byte) (status byte)) {
- c.HandleWrite(WriteHandlerFunc(f))
-}
-
-// HandleNotify makes the characteristic support notify requests, and routes
-// notification requests to h. HandleNotify must be called before the
-// containing service is added to a server.
-func (c *Characteristic) HandleNotify(h NotifyHandler) {
- if c.cccd != nil {
- return
- }
- p := CharNotify | CharIndicate
- c.props |= p
- c.nhandler = h
-
- // add ccc (client characteristic configuration) descriptor
- secure := Property(0)
- // If the characteristic requested secure notifications,
- // then set ccc security to r/w.
- if c.secure&p != 0 {
- secure = CharRead | CharWrite
- }
- cd := &Descriptor{
- uuid: attrClientCharacteristicConfigUUID,
- props: CharRead | CharWrite | CharWriteNR,
- secure: secure,
- // FIXME: currently, we always return 0, which is inaccurate.
- // Each connection should have it's own copy of this value.
- value: []byte{0x00, 0x00},
- char: c,
- }
- c.cccd = cd
- c.descs = append(c.descs, cd)
-}
-
-// HandleNotifyFunc calls HandleNotify(NotifyHandlerFunc(f)).
-func (c *Characteristic) HandleNotifyFunc(f func(r Request, n Notifier)) {
- c.HandleNotify(NotifyHandlerFunc(f))
-}
-
-// TODO
-// func (c *Characteristic) SubscribedCentrals() []Central{
-// }
-
-// Descriptor is a BLE descriptor
-type Descriptor struct {
- uuid UUID
- char *Characteristic
- props Property // enabled properties
- secure Property // security enabled properties
-
- h uint16
- value []byte
-
- rhandler ReadHandler
- whandler WriteHandler
-}
-
-// Handle returns the Handle of the descriptor.
-func (d *Descriptor) Handle() uint16 { return d.h }
-
-// SetHandle sets the Handle of the descriptor.
-func (d *Descriptor) SetHandle(h uint16) { d.h = h }
-
-// NewDescriptor creates and returns a Descriptor.
-func NewDescriptor(u UUID, h uint16, char *Characteristic) *Descriptor {
- cd := &Descriptor{
- uuid: u,
- h: h,
- char: char,
- }
- return cd
-}
-
-// UUID returns the UUID of the descriptor.
-func (d *Descriptor) UUID() UUID {
- return d.uuid
-}
-
-// Name returns the specificatin name of the descriptor.
-// If the UUID is not assigned, returns an empty string.
-func (d *Descriptor) Name() string {
- return knownDescriptors[d.uuid.String()].Name
-}
-
-// Characteristic returns the containing characteristic of the descriptor.
-func (d *Descriptor) Characteristic() *Characteristic {
- return d.char
-}
-
-// SetValue makes the descriptor support read requests, and returns a static value.
-// SetValue must be called before the containing service is added to a server.
-// SetValue panics if the descriptor has already configured with a ReadHandler.
-func (d *Descriptor) SetValue(b []byte) {
- if d.rhandler != nil {
- panic("descriptor has been configured with a read handler")
- }
- d.props |= CharRead
- // d.secure |= CharRead
- d.value = make([]byte, len(b))
- copy(d.value, b)
-}
-
-// HandleRead makes the descriptor support read requests, and routes read requests to h.
-// HandleRead must be called before the containing service is added to a server.
-// HandleRead panics if the descriptor has been configured with a static value.
-func (d *Descriptor) HandleRead(h ReadHandler) {
- if d.value != nil {
- panic("descriptor has been configured with a static value")
- }
- d.props |= CharRead
- // d.secure |= CharRead
- d.rhandler = h
-}
-
-// HandleReadFunc calls HandleRead(ReadHandlerFunc(f)).
-func (d *Descriptor) HandleReadFunc(f func(rsp ResponseWriter, req *ReadRequest)) {
- d.HandleRead(ReadHandlerFunc(f))
-}
-
-// HandleWrite makes the descriptor support write and write-no-response requests, and routes write requests to h.
-// The WriteHandler does not differentiate between write and write-no-response requests; it is handled automatically.
-// HandleWrite must be called before the containing service is added to a server.
-func (d *Descriptor) HandleWrite(h WriteHandler) {
- d.props |= CharWrite | CharWriteNR
- // d.secure |= CharWrite | CharWriteNR
- d.whandler = h
-}
-
-// HandleWriteFunc calls HandleWrite(WriteHandlerFunc(f)).
-func (d *Descriptor) HandleWriteFunc(f func(r Request, data []byte) (status byte)) {
- d.HandleWrite(WriteHandlerFunc(f))
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/const.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/const.go b/newtmgr/vendor/github.com/runtimeinc/gatt/const.go
deleted file mode 100644
index 4a04b04..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/const.go
+++ /dev/null
@@ -1,153 +0,0 @@
-package gatt
-
-// This file includes constants from the BLE spec.
-
-var (
- attrGAPUUID = UUID16(0x1800)
- attrGATTUUID = UUID16(0x1801)
-
- attrPrimaryServiceUUID = UUID16(0x2800)
- attrSecondaryServiceUUID = UUID16(0x2801)
- attrIncludeUUID = UUID16(0x2802)
- attrCharacteristicUUID = UUID16(0x2803)
-
- attrClientCharacteristicConfigUUID = UUID16(0x2902)
- attrServerCharacteristicConfigUUID = UUID16(0x2903)
-
- attrDeviceNameUUID = UUID16(0x2A00)
- attrAppearanceUUID = UUID16(0x2A01)
- attrPeripheralPrivacyUUID = UUID16(0x2A02)
- attrReconnectionAddrUUID = UUID16(0x2A03)
- attrPeferredParamsUUID = UUID16(0x2A04)
- attrServiceChangedUUID = UUID16(0x2A05)
-)
-
-const (
- gattCCCNotifyFlag = 0x0001
- gattCCCIndicateFlag = 0x0002
-)
-
-const (
- attOpError = 0x01
- attOpMtuReq = 0x02
- attOpMtuRsp = 0x03
- attOpFindInfoReq = 0x04
- attOpFindInfoRsp = 0x05
- attOpFindByTypeValueReq = 0x06
- attOpFindByTypeValueRsp = 0x07
- attOpReadByTypeReq = 0x08
- attOpReadByTypeRsp = 0x09
- attOpReadReq = 0x0a
- attOpReadRsp = 0x0b
- attOpReadBlobReq = 0x0c
- attOpReadBlobRsp = 0x0d
- attOpReadMultiReq = 0x0e
- attOpReadMultiRsp = 0x0f
- attOpReadByGroupReq = 0x10
- attOpReadByGroupRsp = 0x11
- attOpWriteReq = 0x12
- attOpWriteRsp = 0x13
- attOpWriteCmd = 0x52
- attOpPrepWriteReq = 0x16
- attOpPrepWriteRsp = 0x17
- attOpExecWriteReq = 0x18
- attOpExecWriteRsp = 0x19
- attOpHandleNotify = 0x1b
- attOpHandleInd = 0x1d
- attOpHandleCnf = 0x1e
- attOpSignedWriteCmd = 0xd2
-)
-
-type attEcode byte
-
-const (
- attEcodeSuccess attEcode = 0x00 // Success
- attEcodeInvalidHandle attEcode = 0x01 // The attribute handle given was not valid on this server.
- attEcodeReadNotPerm attEcode = 0x02 // The attribute cannot be read.
- attEcodeWriteNotPerm attEcode = 0x03 // The attribute cannot be written.
- attEcodeInvalidPDU attEcode = 0x04 // The attribute PDU was invalid.
- attEcodeAuthentication attEcode = 0x05 // The attribute requires authentication before it can be read or written.
- attEcodeReqNotSupp attEcode = 0x06 // Attribute server does not support the request received from the client.
- attEcodeInvalidOffset attEcode = 0x07 // Offset specified was past the end of the attribute.
- attEcodeAuthorization attEcode = 0x08 // The attribute requires authorization before it can be read or written.
- attEcodePrepQueueFull attEcode = 0x09 // Too many prepare writes have been queued.
- attEcodeAttrNotFound attEcode = 0x0a // No attribute found within the given attribute handle range.
- attEcodeAttrNotLong attEcode = 0x0b // The attribute cannot be read or written using the Read Blob Request.
- attEcodeInsuffEncrKeySize attEcode = 0x0c // The Encryption Key Size used for encrypting this link is insufficient.
- attEcodeInvalAttrValueLen attEcode = 0x0d // The attribute value length is invalid for the operation.
- attEcodeUnlikely attEcode = 0x0e // The attribute request that was requested has encountered an error that was unlikely, and therefore could not be completed as requested.
- attEcodeInsuffEnc attEcode = 0x0f // The attribute requires encryption before it can be read or written.
- attEcodeUnsuppGrpType attEcode = 0x10 // The attribute type is not a supported grouping attribute as defined by a higher layer specification.
- attEcodeInsuffResources attEcode = 0x11 // Insufficient Resources to complete the request.
-)
-
-func (a attEcode) Error() string {
- switch i := int(a); {
- case i < 0x11:
- return attEcodeName[a]
- case i >= 0x12 && i <= 0x7F: // Reserved for future use
- return "reserved error code"
- case i >= 0x80 && i <= 0x9F: // Application Error, defined by higher level
- return "reserved error code"
- case i >= 0xA0 && i <= 0xDF: // Reserved for future use
- return "reserved error code"
- case i >= 0xE0 && i <= 0xFF: // Common profile and service error codes
- return "profile or service error"
- default: // can't happen, just make compiler happy
- return "unkown error"
- }
-}
-
-var attEcodeName = map[attEcode]string{
- attEcodeSuccess: "success",
- attEcodeInvalidHandle: "invalid handle",
- attEcodeReadNotPerm: "read not permitted",
- attEcodeWriteNotPerm: "write not permitted",
- attEcodeInvalidPDU: "invalid PDU",
- attEcodeAuthentication: "insufficient authentication",
- attEcodeReqNotSupp: "request not supported",
- attEcodeInvalidOffset: "invalid offset",
- attEcodeAuthorization: "insufficient authorization",
- attEcodePrepQueueFull: "prepare queue full",
- attEcodeAttrNotFound: "attribute not found",
- attEcodeAttrNotLong: "attribute not long",
- attEcodeInsuffEncrKeySize: "insufficient encryption key size",
- attEcodeInvalAttrValueLen: "invalid attribute value length",
- attEcodeUnlikely: "unlikely error",
- attEcodeInsuffEnc: "insufficient encryption",
- attEcodeUnsuppGrpType: "unsupported group type",
- attEcodeInsuffResources: "insufficient resources",
-}
-
-func attErrorRsp(op byte, h uint16, s attEcode) []byte {
- return attErr{opcode: op, attr: h, status: s}.Marshal()
-}
-
-// attRspFor maps from att request
-// codes to att response codes.
-var attRspFor = map[byte]byte{
- attOpMtuReq: attOpMtuRsp,
- attOpFindInfoReq: attOpFindInfoRsp,
- attOpFindByTypeValueReq: attOpFindByTypeValueRsp,
- attOpReadByTypeReq: attOpReadByTypeRsp,
- attOpReadReq: attOpReadRsp,
- attOpReadBlobReq: attOpReadBlobRsp,
- attOpReadMultiReq: attOpReadMultiRsp,
- attOpReadByGroupReq: attOpReadByGroupRsp,
- attOpWriteReq: attOpWriteRsp,
- attOpPrepWriteReq: attOpPrepWriteRsp,
- attOpExecWriteReq: attOpExecWriteRsp,
-}
-
-type attErr struct {
- opcode uint8
- attr uint16
- status attEcode
-}
-
-// TODO: Reformulate in a way that lets the caller avoid allocs.
-// Accept a []byte? Write directly to an io.Writer?
-func (e attErr) Marshal() []byte {
- // little-endian encoding for attr
- return []byte{attOpError, e.opcode, byte(e.attr), byte(e.attr >> 8), byte(e.status)}
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/device.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/device.go b/newtmgr/vendor/github.com/runtimeinc/gatt/device.go
deleted file mode 100644
index eba96cf..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/device.go
+++ /dev/null
@@ -1,161 +0,0 @@
-package gatt
-
-import "errors"
-
-var notImplemented = errors.New("not implemented")
-
-type State int
-
-const (
- StateUnknown State = 0
- StateResetting State = 1
- StateUnsupported State = 2
- StateUnauthorized State = 3
- StatePoweredOff State = 4
- StatePoweredOn State = 5
-)
-
-func (s State) String() string {
- str := []string{
- "Unknown",
- "Resetting",
- "Unsupported",
- "Unauthorized",
- "PoweredOff",
- "PoweredOn",
- }
- return str[int(s)]
-}
-
-// Device defines the interface for a BLE device.
-// Since an interface can't define fields(properties). To implement the
-// callback support for cerntain events, deviceHandler is defined and
-// implementation of Device on different platforms should embed it in
-// order to keep have keep compatible in API level.
-// Package users can use the Handler to set these handlers.
-type Device interface {
- Init(stateChanged func(Device, State)) error
-
- // Advertise advertise AdvPacket
- Advertise(a *AdvPacket) error
-
- // AdvertiseNameAndServices advertises device name, and specified service UUIDs.
- // It tres to fit the UUIDs in the advertising packet as much as possible.
- // If name doesn't fit in the advertising packet, it will be put in scan response.
- AdvertiseNameAndServices(name string, ss []UUID) error
-
- // AdvertiseIBeaconData advertise iBeacon with given manufacturer data.
- AdvertiseIBeaconData(b []byte) error
-
- // AdvertisingIbeacon advertises iBeacon with specified parameters.
- AdvertiseIBeacon(u UUID, major, minor uint16, pwr int8) error
-
- // StopAdvertising stops advertising.
- StopAdvertising() error
-
- // RemoveAllServices removes all services that are currently in the database.
- RemoveAllServices() error
-
- // Add Service add a service to database.
- AddService(s *Service) error
-
- // SetServices set the specified service to the database.
- // It removes all currently added services, if any.
- SetServices(ss []*Service) error
-
- // Scan discovers surounding remote peripherals that have the Service UUID specified in ss.
- // If ss is set to nil, all devices scanned are reported.
- // dup specifies weather duplicated advertisement should be reported or not.
- // When a remote peripheral is discovered, the PeripheralDiscovered Handler is called.
- Scan(ss []UUID, dup bool)
-
- // StopScanning stops scanning.
- StopScanning()
-
- // Connect connects to a remote peripheral.
- Connect(p Peripheral)
-
- // CancelConnection disconnects a remote peripheral.
- CancelConnection(p Peripheral)
-
- // Handle registers the specified handlers.
- Handle(h ...Handler)
-
- // Stop HCI Connection
- Stop() error
-
- // Option sets the options specified.
- Option(o ...Option) error
-}
-
-// deviceHandler is the handlers(callbacks) of the Device.
-type deviceHandler struct {
- // stateChanged is called when the device states changes.
- stateChanged func(d Device, s State)
-
- // connect is called when a remote central device connects to the device.
- centralConnected func(c Central)
-
- // disconnect is called when a remote central device disconnects to the device.
- centralDisconnected func(c Central)
-
- // peripheralDiscovered is called when a remote peripheral device is found during scan procedure.
- peripheralDiscovered func(p Peripheral, a *Advertisement, rssi int)
-
- // peripheralConnected is called when a remote peripheral is conneted.
- peripheralConnected func(p Peripheral, err error)
-
- // peripheralConnected is called when a remote peripheral is disconneted.
- peripheralDisconnected func(p Peripheral, err error)
-}
-
-// A Handler is a self-referential function, which registers the options specified.
-// See http://commandcenter.blogspot.com.au/2014/01/self-referential-functions-and-design.html for more discussion.
-type Handler func(Device)
-
-// Handle registers the specified handlers.
-func (d *device) Handle(hh ...Handler) {
- for _, h := range hh {
- h(d)
- }
-}
-
-// CentralConnected returns a Handler, which sets the specified function to be called when a device connects to the server.
-func CentralConnected(f func(Central)) Handler {
- return func(d Device) { d.(*device).centralConnected = f }
-}
-
-// CentralDisconnected returns a Handler, which sets the specified function to be called when a device disconnects from the server.
-func CentralDisconnected(f func(Central)) Handler {
- return func(d Device) { d.(*device).centralDisconnected = f }
-}
-
-// PeripheralDiscovered returns a Handler, which sets the specified function to be called when a remote peripheral device is found during scan procedure.
-func PeripheralDiscovered(f func(Peripheral, *Advertisement, int)) Handler {
- return func(d Device) { d.(*device).peripheralDiscovered = f }
-}
-
-// PeripheralConnected returns a Handler, which sets the specified function to be called when a remote peripheral device connects.
-func PeripheralConnected(f func(Peripheral, error)) Handler {
- return func(d Device) { d.(*device).peripheralConnected = f }
-}
-
-// PeripheralDisconnected returns a Handler, which sets the specified function to be called when a remote peripheral device disconnects.
-func PeripheralDisconnected(f func(Peripheral, error)) Handler {
- return func(d Device) { d.(*device).peripheralDisconnected = f }
-}
-
-// An Option is a self-referential function, which sets the option specified.
-// Most Options are platform-specific, which gives more fine-grained control over the device at a cost of losing portibility.
-// See http://commandcenter.blogspot.com.au/2014/01/self-referential-functions-and-design.html for more discussion.
-type Option func(Device) error
-
-// Option sets the options specified.
-// Some options can only be set before the device is initialized; they are best used with NewDevice instead of Option.
-func (d *device) Option(opts ...Option) error {
- var err error
- for _, opt := range opts {
- err = opt(d)
- }
- return err
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/device_darwin.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/device_darwin.go b/newtmgr/vendor/github.com/runtimeinc/gatt/device_darwin.go
deleted file mode 100644
index 5401057..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/device_darwin.go
+++ /dev/null
@@ -1,513 +0,0 @@
-package gatt
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "fmt"
- "log"
- "sync"
- "time"
-
- "github.com/runtimeinc/gatt/xpc"
-)
-
-const (
- peripheralDiscovered = 37
- peripheralConnected = 38
- peripheralDisconnected = 40
- // below constants for Yosemite
- rssiRead = 55
- includedServicesDiscovered = 63
- serviceDiscovered = 56
- characteristicsDiscovered = 64
- characteristicRead = 71
- characteristicWritten = 72
- notificationValueSet = 74
- descriptorsDiscovered = 76
- descriptorRead = 79
- descriptorWritten = 80
-)
-
-type device struct {
- deviceHandler
-
- conn xpc.XPC
-
- role int // 1: peripheralManager (server), 0: centralManager (client)
-
- reqc chan message
- rspc chan message
-
- // Only used in client/centralManager implementation
- plist map[string]*peripheral
- plistmu *sync.Mutex
-
- // Only used in server/peripheralManager implementation
-
- attrN int
- attrs map[int]*attr
-
- subscribers map[string]*central
-}
-
-func NewDevice(opts ...Option) (Device, error) {
- d := &device{
- reqc: make(chan message),
- rspc: make(chan message),
- plist: map[string]*peripheral{},
- plistmu: &sync.Mutex{},
-
- attrN: 1,
- attrs: make(map[int]*attr),
-
- subscribers: make(map[string]*central),
- }
- d.Option(opts...)
- d.conn = xpc.XpcConnect("com.apple.blued", d)
- return d, nil
-}
-
-func (d *device) Init(f func(Device, State)) error {
- go d.loop()
- rsp := d.sendReq(1, xpc.Dict{
- "kCBMsgArgName": fmt.Sprintf("gopher-%v", time.Now().Unix()),
- "kCBMsgArgOptions": xpc.Dict{"kCBInitOptionShowPowerAlert": 1},
- "kCBMsgArgType": d.role,
- })
- d.stateChanged = f
- go d.stateChanged(d, State(rsp.MustGetInt("kCBMsgArgState")))
- return nil
-}
-
-func (d *device) Advertise(a *AdvPacket) error {
- rsp := d.sendReq(8, xpc.Dict{
- "kCBAdvDataAppleMfgData": a.b, // not a.Bytes(). should be slice
- })
-
- if res := rsp.MustGetInt("kCBMsgArgResult"); res != 0 {
- return errors.New("FIXME: Advertise error")
- }
- return nil
-}
-
-func (d *device) AdvertiseNameAndServices(name string, ss []UUID) error {
- us := uuidSlice(ss)
- rsp := d.sendReq(8, xpc.Dict{
- "kCBAdvDataLocalName": name,
- "kCBAdvDataServiceUUIDs": us},
- )
- if res := rsp.MustGetInt("kCBMsgArgResult"); res != 0 {
- return errors.New("FIXME: Advertise error")
- }
- return nil
-}
-
-func (d *device) AdvertiseIBeaconData(data []byte) error {
- var utsname xpc.Utsname
- xpc.Uname(&utsname)
-
- var rsp xpc.Dict
-
- if utsname.Release >= "14." {
- l := len(data)
- buf := bytes.NewBuffer([]byte{byte(l + 5), 0xFF, 0x4C, 0x00, 0x02, byte(l)})
- buf.Write(data)
- rsp = d.sendReq(8, xpc.Dict{"kCBAdvDataAppleMfgData": buf.Bytes()})
- } else {
- rsp = d.sendReq(8, xpc.Dict{"kCBAdvDataAppleBeaconKey": data})
- }
-
- if res := rsp.MustGetInt("kCBMsgArgResult"); res != 0 {
- return errors.New("FIXME: Advertise error")
- }
-
- return nil
-}
-
-func (d *device) AdvertiseIBeacon(u UUID, major, minor uint16, pwr int8) error {
- b := make([]byte, 21)
- copy(b, reverse(u.b)) // Big endian
- binary.BigEndian.PutUint16(b[16:], major) // Big endian
- binary.BigEndian.PutUint16(b[18:], minor) // Big endian
- b[20] = uint8(pwr) // Measured Tx Power
- return d.AdvertiseIBeaconData(b)
-}
-
-func (d *device) StopAdvertising() error {
- rsp := d.sendReq(9, nil)
- if res := rsp.MustGetInt("kCBMsgArgResult"); res != 0 {
- return errors.New("FIXME: Stop Advertise error")
- }
- return nil
-}
-
-func (d *device) RemoveAllServices() error {
- d.sendCmd(12, nil)
- return nil
-}
-
-func (d *device) AddService(s *Service) error {
- if s.uuid.Equal(attrGAPUUID) || s.uuid.Equal(attrGATTUUID) {
- // skip GATT and GAP services
- return nil
- }
-
- xs := xpc.Dict{
- "kCBMsgArgAttributeID": d.attrN,
- "kCBMsgArgAttributeIDs": []int{},
- "kCBMsgArgCharacteristics": nil,
- "kCBMsgArgType": 1, // 1 => primary, 0 => excluded
- "kCBMsgArgUUID": reverse(s.uuid.b),
- }
- d.attrN++
-
- xcs := xpc.Array{}
- for _, c := range s.Characteristics() {
- props := 0
- perm := 0
- if c.props&CharRead != 0 {
- props |= 0x02
- if CharRead&c.secure != 0 {
- perm |= 0x04
- } else {
- perm |= 0x01
- }
- }
- if c.props&CharWriteNR != 0 {
- props |= 0x04
- if c.secure&CharWriteNR != 0 {
- perm |= 0x08
- } else {
- perm |= 0x02
- }
- }
- if c.props&CharWrite != 0 {
- props |= 0x08
- if c.secure&CharWrite != 0 {
- perm |= 0x08
- } else {
- perm |= 0x02
- }
- }
- if c.props&CharNotify != 0 {
- if c.secure&CharNotify != 0 {
- props |= 0x100
- } else {
- props |= 0x10
- }
- }
- if c.props&CharIndicate != 0 {
- if c.secure&CharIndicate != 0 {
- props |= 0x200
- } else {
- props |= 0x20
- }
- }
-
- xc := xpc.Dict{
- "kCBMsgArgAttributeID": d.attrN,
- "kCBMsgArgUUID": reverse(c.uuid.b),
- "kCBMsgArgAttributePermissions": perm,
- "kCBMsgArgCharacteristicProperties": props,
- "kCBMsgArgData": c.value,
- }
- d.attrs[d.attrN] = &attr{h: uint16(d.attrN), value: c.value, pvt: c}
- d.attrN++
-
- xds := xpc.Array{}
- for _, d := range c.Descriptors() {
- if d.uuid.Equal(attrClientCharacteristicConfigUUID) {
- // skip CCCD
- continue
- }
- xd := xpc.Dict{
- "kCBMsgArgData": d.value,
- "kCBMsgArgUUID": reverse(d.uuid.b),
- }
- xds = append(xds, xd)
- }
- xc["kCBMsgArgDescriptors"] = xds
- xcs = append(xcs, xc)
- }
- xs["kCBMsgArgCharacteristics"] = xcs
-
- rsp := d.sendReq(10, xs)
- if res := rsp.MustGetInt("kCBMsgArgResult"); res != 0 {
- return errors.New("FIXME: Add Srvice error")
- }
- return nil
-}
-
-func (d *device) SetServices(ss []*Service) error {
- d.RemoveAllServices()
- for _, s := range ss {
- d.AddService(s)
- }
- return nil
-}
-
-func (d *device) Scan(ss []UUID, dup bool) {
- args := xpc.Dict{
- "kCBMsgArgUUIDs": uuidSlice(ss),
- "kCBMsgArgOptions": xpc.Dict{
- "kCBScanOptionAllowDuplicates": map[bool]int{true: 1, false: 0}[dup],
- },
- }
- d.sendCmd(29, args)
-}
-
-func (d *device) StopScanning() {
- d.sendCmd(30, nil)
-}
-
-func (d *device) Connect(p Peripheral) {
- pp := p.(*peripheral)
- d.plist[pp.id.String()] = pp
- d.sendCmd(31,
- xpc.Dict{
- "kCBMsgArgDeviceUUID": pp.id,
- "kCBMsgArgOptions": xpc.Dict{
- "kCBConnectOptionNotifyOnDisconnection": 1,
- },
- })
-}
-
-func (d *device) respondToRequest(id int, args xpc.Dict) {
-
- switch id {
- case 19: // ReadRequest
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- t := args.MustGetInt("kCBMsgArgTransactionID")
- a := args.MustGetInt("kCBMsgArgAttributeID")
- o := args.MustGetInt("kCBMsgArgOffset")
-
- attr := d.attrs[a]
- v := attr.value
- if v == nil {
- c := newCentral(d, u)
- req := &ReadRequest{
- Request: Request{Central: c},
- Cap: int(c.mtu - 1),
- Offset: o,
- }
- rsp := newResponseWriter(int(c.mtu - 1))
- if c, ok := attr.pvt.(*Characteristic); ok {
- c.rhandler.ServeRead(rsp, req)
- v = rsp.bytes()
- }
- }
-
- d.sendCmd(13, xpc.Dict{
- "kCBMsgArgAttributeID": a,
- "kCBMsgArgData": v,
- "kCBMsgArgTransactionID": t,
- "kCBMsgArgResult": 0,
- })
-
- case 20: // WriteRequest
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- t := args.MustGetInt("kCBMsgArgTransactionID")
- a := 0
- noRsp := false
- xxws := args.MustGetArray("kCBMsgArgATTWrites")
- for _, xxw := range xxws {
- xw := xxw.(xpc.Dict)
- if a == 0 {
- a = xw.MustGetInt("kCBMsgArgAttributeID")
- }
- o := xw.MustGetInt("kCBMsgArgOffset")
- i := xw.MustGetInt("kCBMsgArgIgnoreResponse")
- b := xw.MustGetBytes("kCBMsgArgData")
- _ = o
- attr := d.attrs[a]
- c := newCentral(d, u)
- r := Request{Central: c}
- attr.pvt.(*Characteristic).whandler.ServeWrite(r, b)
- if i == 1 {
- noRsp = true
- }
-
- }
- if noRsp {
- break
- }
- d.sendCmd(13, xpc.Dict{
- "kCBMsgArgAttributeID": a,
- "kCBMsgArgData": nil,
- "kCBMsgArgTransactionID": t,
- "kCBMsgArgResult": 0,
- })
-
- case 21: // subscribed
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- a := args.MustGetInt("kCBMsgArgAttributeID")
- attr := d.attrs[a]
- c := newCentral(d, u)
- d.subscribers[u.String()] = c
- c.startNotify(attr, c.mtu)
-
- case 22: // unubscribed
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- a := args.MustGetInt("kCBMsgArgAttributeID")
- attr := d.attrs[a]
- if c := d.subscribers[u.String()]; c != nil {
- c.stopNotify(attr)
- }
-
- case 23: // notificationSent
- }
-}
-
-/*
- * OSX GATT library currently doesn't work for Mynewt, so adding this stub to keep
- * it buildable for OSX.
- */
-func (d *device) Stop() error {
- return nil
-}
-
-func (d *device) CancelConnection(p Peripheral) {
- d.sendCmd(32, xpc.Dict{"kCBMsgArgDeviceUUID": p.(*peripheral).id})
-}
-
-// process device events and asynchronous errors
-// (implements XpcEventHandler)
-func (d *device) HandleXpcEvent(event xpc.Dict, err error) {
- if err != nil {
- log.Println("error:", err)
- return
- }
-
- id := event.MustGetInt("kCBMsgId")
- args := event.MustGetDict("kCBMsgArgs")
- //log.Printf(">> %d, %v", id, args)
-
- switch id {
- case // device event
- 6, // StateChanged
- 16, // AdvertisingStarted
- 17, // AdvertisingStopped
- 18: // ServiceAdded
- d.rspc <- message{id: id, args: args}
-
- case
- 19, // ReadRequest
- 20, // WriteRequest
- 21, // Subscribe
- 22, // Unubscribe
- 23: // Confirmation
- d.respondToRequest(id, args)
-
- case peripheralDiscovered:
- xa := args.MustGetDict("kCBMsgArgAdvertisementData")
- if len(xa) == 0 {
- return
- }
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- a := &Advertisement{
- LocalName: xa.GetString("kCBAdvDataLocalName", args.GetString("kCBMsgArgName", "")),
- TxPowerLevel: xa.GetInt("kCBAdvDataTxPowerLevel", 0),
- ManufacturerData: xa.GetBytes("kCBAdvDataManufacturerData", nil),
- }
-
- rssi := args.MustGetInt("kCBMsgArgRssi")
-
- if xu, ok := xa["kCBAdvDataServiceUUIDs"]; ok {
- for _, xs := range xu.(xpc.Array) {
- s := UUID{reverse(xs.([]byte))}
- a.Services = append(a.Services, s)
- }
- }
- if xsds, ok := xa["kCBAdvDataServiceData"]; ok {
- xsd := xsds.(xpc.Array)
- for i := 0; i < len(xsd); i += 2 {
- sd := ServiceData{
- UUID: UUID{xsd[i].([]byte)},
- Data: xsd[i+1].([]byte),
- }
- a.ServiceData = append(a.ServiceData, sd)
- }
- }
- if d.peripheralDiscovered != nil {
- go d.peripheralDiscovered(&peripheral{id: xpc.UUID(u.b), d: d}, a, rssi)
- }
-
- case peripheralConnected:
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- p := &peripheral{
- id: xpc.UUID(u.b),
- d: d,
- reqc: make(chan message),
- rspc: make(chan message),
- quitc: make(chan struct{}),
- sub: newSubscriber(),
- }
- d.plistmu.Lock()
- d.plist[u.String()] = p
- d.plistmu.Unlock()
- go p.loop()
-
- if d.peripheralConnected != nil {
- go d.peripheralConnected(p, nil)
- }
-
- case peripheralDisconnected:
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- d.plistmu.Lock()
- p := d.plist[u.String()]
- delete(d.plist, u.String())
- d.plistmu.Unlock()
- if d.peripheralDisconnected != nil {
- d.peripheralDisconnected(p, nil) // TODO: Get Result as error?
- }
- close(p.quitc)
-
- case // Peripheral events
- rssiRead,
- serviceDiscovered,
- includedServicesDiscovered,
- characteristicsDiscovered,
- characteristicRead,
- characteristicWritten,
- notificationValueSet,
- descriptorsDiscovered,
- descriptorRead,
- descriptorWritten:
-
- u := UUID{args.MustGetUUID("kCBMsgArgDeviceUUID")}
- d.plistmu.Lock()
- p := d.plist[u.String()]
- d.plistmu.Unlock()
- p.rspc <- message{id: id, args: args}
-
- default:
- log.Printf("Unhandled event: %#v", event)
- }
-}
-
-func (d *device) sendReq(id int, args xpc.Dict) xpc.Dict {
- m := message{id: id, args: args, rspc: make(chan xpc.Dict)}
- d.reqc <- m
- return <-m.rspc
-}
-
-func (d *device) sendCmd(id int, args xpc.Dict) {
- d.reqc <- message{id: id, args: args}
-}
-
-func (d *device) loop() {
- for req := range d.reqc {
- d.sendCBMsg(req.id, req.args)
- if req.rspc == nil {
- continue
- }
- m := <-d.rspc
- req.rspc <- m.args
- }
-}
-
-func (d *device) sendCBMsg(id int, args xpc.Dict) {
- // log.Printf("<< %d, %v", id, args)
- d.conn.Send(xpc.Dict{"kCBMsgId": id, "kCBMsgArgs": args}, false)
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/device_linux.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/device_linux.go b/newtmgr/vendor/github.com/runtimeinc/gatt/device_linux.go
deleted file mode 100644
index d723e40..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/device_linux.go
+++ /dev/null
@@ -1,240 +0,0 @@
-package gatt
-
-import (
- "encoding/binary"
- "net"
-
- "github.com/runtimeinc/gatt/linux"
- "github.com/runtimeinc/gatt/linux/cmd"
-)
-
-type device struct {
- deviceHandler
-
- hci *linux.HCI
- state State
-
- // All the following fields are only used peripheralManager (server) implementation.
- svcs []*Service
- attrs *attrRange
-
- devID int
- chkLE bool
- maxConn int
-
- advData *cmd.LESetAdvertisingData
- scanResp *cmd.LESetScanResponseData
- advParam *cmd.LESetAdvertisingParameters
- scanParam *cmd.LESetScanParameters
-}
-
-func NewDevice(opts ...Option) (Device, error) {
- d := &device{
- maxConn: 1, // Support 1 connection at a time.
- devID: -1, // Find an available HCI device.
- chkLE: true, // Check if the device supports LE.
-
- advParam: &cmd.LESetAdvertisingParameters{
- AdvertisingIntervalMin: 0x800, // [0x0800]: 0.625 ms * 0x0800 = 1280.0 ms
- AdvertisingIntervalMax: 0x800, // [0x0800]: 0.625 ms * 0x0800 = 1280.0 ms
- AdvertisingType: 0x00, // [0x00]: ADV_IND, 0x01: DIRECT(HIGH), 0x02: SCAN, 0x03: NONCONN, 0x04: DIRECT(LOW)
- OwnAddressType: 0x00, // [0x00]: public, 0x01: random
- DirectAddressType: 0x00, // [0x00]: public, 0x01: random
- DirectAddress: [6]byte{}, // Public or Random Address of the device to be connected
- AdvertisingChannelMap: 0x7, // [0x07] 0x01: ch37, 0x2: ch38, 0x4: ch39
- AdvertisingFilterPolicy: 0x00,
- },
- scanParam: &cmd.LESetScanParameters{
- LEScanType: 0x01, // [0x00]: passive, 0x01: active
- LEScanInterval: 0x0010, // [0x10]: 0.625ms * 16
- LEScanWindow: 0x0010, // [0x10]: 0.625ms * 16
- OwnAddressType: 0x00, // [0x00]: public, 0x01: random
- ScanningFilterPolicy: 0x00, // [0x00]: accept all, 0x01: ignore non-white-listed.
- },
- }
-
- d.Option(opts...)
- h, err := linux.NewHCI(d.devID, d.chkLE, d.maxConn)
- if err != nil {
- return nil, err
- }
-
- d.hci = h
- return d, nil
-}
-
-func (d *device) Init(f func(Device, State)) error {
- d.hci.AcceptMasterHandler = func(pd *linux.PlatData) {
- a := pd.Address
- c := newCentral(d.attrs, net.HardwareAddr([]byte{a[5], a[4], a[3], a[2], a[1], a[0]}), pd.Conn)
- if d.centralConnected != nil {
- d.centralConnected(c)
- }
- c.loop()
- if d.centralDisconnected != nil {
- d.centralDisconnected(c)
- }
- }
- d.hci.AcceptSlaveHandler = func(pd *linux.PlatData) {
- p := &peripheral{
- d: d,
- pd: pd,
- l2c: pd.Conn,
- reqc: make(chan message),
- quitc: make(chan struct{}),
- sub: newSubscriber(),
- }
- if d.peripheralConnected != nil {
- go d.peripheralConnected(p, nil)
- }
- p.loop()
- if d.peripheralDisconnected != nil {
- d.peripheralDisconnected(p, nil)
- }
- }
- d.hci.AdvertisementHandler = func(pd *linux.PlatData) {
- a := &Advertisement{}
- a.unmarshall(pd.Data)
- a.Connectable = pd.Connectable
- a.Address = pd.Address
- a.AddressType = pd.AddressType
- p := &peripheral{pd: pd, d: d}
- if d.peripheralDiscovered != nil {
- pd.Name = a.LocalName
- d.peripheralDiscovered(p, a, int(pd.RSSI))
- }
- }
- d.state = StatePoweredOn
- d.stateChanged = f
- go d.stateChanged(d, d.state)
- return nil
-}
-
-func (d *device) Stop() error {
- d.state = StatePoweredOff
- defer d.stateChanged(d, d.state)
- return d.hci.Close()
-}
-
-func (d *device) AddService(s *Service) error {
- d.svcs = append(d.svcs, s)
- d.attrs = generateAttributes(d.svcs, uint16(1)) // ble attrs start at 1
- return nil
-}
-
-func (d *device) RemoveAllServices() error {
- d.svcs = nil
- d.attrs = nil
- return nil
-}
-
-func (d *device) SetServices(s []*Service) error {
- d.RemoveAllServices()
- d.svcs = append(d.svcs, s...)
- d.attrs = generateAttributes(d.svcs, uint16(1)) // ble attrs start at 1
- return nil
-}
-
-func (d *device) Advertise(a *AdvPacket) error {
- d.advData = &cmd.LESetAdvertisingData{
- AdvertisingDataLength: uint8(a.Len()),
- AdvertisingData: a.Bytes(),
- }
-
- if err := d.update(); err != nil {
- return err
- }
-
- return d.hci.SetAdvertiseEnable(true)
-}
-
-func (d *device) AdvertiseNameAndServices(name string, uu []UUID) error {
- a := &AdvPacket{}
- a.AppendFlags(flagGeneralDiscoverable | flagLEOnly)
- a.AppendUUIDFit(uu)
-
- if len(a.b)+len(name)+2 < MaxEIRPacketLength {
- a.AppendName(name)
- d.scanResp = nil
- } else {
- a := &AdvPacket{}
- a.AppendName(name)
- d.scanResp = &cmd.LESetScanResponseData{
- ScanResponseDataLength: uint8(a.Len()),
- ScanResponseData: a.Bytes(),
- }
- }
-
- return d.Advertise(a)
-}
-
-func (d *device) AdvertiseIBeaconData(b []byte) error {
- a := &AdvPacket{}
- a.AppendFlags(flagGeneralDiscoverable | flagLEOnly)
- a.AppendManufacturerData(0x004C, b)
- d.advData = &cmd.LESetAdvertisingData{
- AdvertisingDataLength: uint8(a.Len()),
- AdvertisingData: a.Bytes(),
- }
-
- return d.Advertise(a)
-}
-
-func (d *device) AdvertiseIBeacon(u UUID, major, minor uint16, pwr int8) error {
- b := make([]byte, 23)
- b[0] = 0x02 // Data type: iBeacon
- b[1] = 0x15 // Data length: 21 bytes
- copy(b[2:], reverse(u.b)) // Big endian
- binary.BigEndian.PutUint16(b[18:], major) // Big endian
- binary.BigEndian.PutUint16(b[20:], minor) // Big endian
- b[22] = uint8(pwr) // Measured Tx Power
- return d.AdvertiseIBeaconData(b)
-}
-
-func (d *device) StopAdvertising() error {
- return d.hci.SetAdvertiseEnable(false)
-}
-
-func (d *device) Scan(ss []UUID, dup bool) {
- // TODO: filter
- d.hci.SetScanEnable(true, dup)
-}
-
-func (d *device) StopScanning() {
- d.hci.SetScanEnable(false, true)
-}
-
-func (d *device) Connect(p Peripheral) {
- d.hci.Connect(p.(*peripheral).pd)
-}
-
-func (d *device) CancelConnection(p Peripheral) {
- d.hci.CancelConnection(p.(*peripheral).pd)
-}
-
-func (d *device) SendHCIRawCommand(c cmd.CmdParam) ([]byte, error) {
- return d.hci.SendRawCommand(c)
-}
-
-// Flush pending advertising settings to the device.
-func (d *device) update() error {
- if d.advParam != nil {
- if err := d.hci.SendCmdWithAdvOff(d.advParam); err != nil {
- return err
- }
- d.advParam = nil
- }
- if d.scanResp != nil {
- if err := d.hci.SendCmdWithAdvOff(d.scanResp); err != nil {
- return err
- }
- d.scanResp = nil
- }
- if d.advData != nil {
- if err := d.hci.SendCmdWithAdvOff(d.advData); err != nil {
- return err
- }
- d.advData = nil
- }
- return nil
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/doc.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/doc.go b/newtmgr/vendor/github.com/runtimeinc/gatt/doc.go
deleted file mode 100644
index c34a3e9..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/doc.go
+++ /dev/null
@@ -1,88 +0,0 @@
-// Package gatt provides a Bluetooth Low Energy gatt implementation.
-//
-// Gatt (Generic Attribute Profile) is the protocol used to write
-// BLE peripherals (servers) and centrals (clients).
-//
-// STATUS
-//
-// This package is a work in progress. The API will change.
-//
-// As a peripheral, you can create services, characteristics, and descriptors,
-// advertise, accept connections, and handle requests.
-// As a central, you can scan, connect, discover services, and make requests.
-//
-// SETUP
-//
-// gatt supports both Linux and OS X.
-//
-// On Linux:
-// To gain complete and exclusive control of the HCI device, gatt uses
-// HCI_CHANNEL_USER (introduced in Linux v3.14) instead of HCI_CHANNEL_RAW.
-// Those who must use an older kernel may patch in these relevant commits
-// from Marcel Holtmann:
-//
-// Bluetooth: Introduce new HCI socket channel for user operation
-// Bluetooth: Introduce user channel flag for HCI devices
-// Bluetooth: Refactor raw socket filter into more readable code
-//
-// Note that because gatt uses HCI_CHANNEL_USER, once gatt has opened the
-// device no other program may access it.
-//
-// Before starting a gatt program, make sure that your BLE device is down:
-//
-// sudo hciconfig
-// sudo hciconfig hci0 down # or whatever hci device you want to use
-//
-// If you have BlueZ 5.14+ (or aren't sure), stop the built-in
-// bluetooth server, which interferes with gatt, e.g.:
-//
-// sudo service bluetooth stop
-//
-// Because gatt programs administer network devices, they must
-// either be run as root, or be granted appropriate capabilities:
-//
-// sudo <executable>
-// # OR
-// sudo setcap 'cap_net_raw,cap_net_admin=eip' <executable>
-// <executable>
-//
-// USAGE
-//
-// # Start a simple server.
-// sudo go run example/server.go
-//
-// # Discover surrounding peripherals.
-// sudo go run example/discoverer.go
-//
-// # Connect to and explorer a peripheral device.
-// sudo go run example/explorer.go <peripheral ID>
-//
-// See the server.go, discoverer.go, and explorer.go in the examples/
-// directory for writing server or client programs that run on Linux
-// and OS X.
-//
-// Users, especially on Linux platforms, seeking finer-grained control
-// over the devices can see the examples/server_lnx.go for the usage
-// of Option, which are platform specific.
-//
-// See the rest of the docs for other options and finer-grained control.
-//
-// Note that some BLE central devices, particularly iOS, may aggressively
-// cache results from previous connections. If you change your services or
-// characteristics, you may need to reboot the other device to pick up the
-// changes. This is a common source of confusion and apparent bugs. For an
-// OS X central, see http://stackoverflow.com/questions/20553957.
-//
-//
-// REFERENCES
-//
-// gatt started life as a port of bleno, to which it is indebted:
-// https://github.com/sandeepmistry/bleno. If you are having
-// problems with gatt, particularly around installation, issues
-// filed with bleno might also be helpful references.
-//
-// To try out your GATT server, it is useful to experiment with a
-// generic BLE client. LightBlue is a good choice. It is available
-// free for both iOS and OS X.
-//
-package gatt
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/known_uuid.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/known_uuid.go b/newtmgr/vendor/github.com/runtimeinc/gatt/known_uuid.go
deleted file mode 100644
index 2146af5..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/known_uuid.go
+++ /dev/null
@@ -1,122 +0,0 @@
-package gatt
-
-// A dictionary of known service names and type (keyed by service uuid)
-var knownServices = map[string]struct{ Name, Type string }{
- "1800": {Name: "Generic Access", Type: "org.bluetooth.service.generic_access"},
- "1801": {Name: "Generic Attribute", Type: "org.bluetooth.service.generic_attribute"},
- "1802": {Name: "Immediate Alert", Type: "org.bluetooth.service.immediate_alert"},
- "1803": {Name: "Link Loss", Type: "org.bluetooth.service.link_loss"},
- "1804": {Name: "Tx Power", Type: "org.bluetooth.service.tx_power"},
- "1805": {Name: "Current Time Service", Type: "org.bluetooth.service.current_time"},
- "1806": {Name: "Reference Time Update Service", Type: "org.bluetooth.service.reference_time_update"},
- "1807": {Name: "Next DST Change Service", Type: "org.bluetooth.service.next_dst_change"},
- "1808": {Name: "Glucose", Type: "org.bluetooth.service.glucose"},
- "1809": {Name: "Health Thermometer", Type: "org.bluetooth.service.health_thermometer"},
- "180a": {Name: "Device Information", Type: "org.bluetooth.service.device_information"},
- "180d": {Name: "Heart Rate", Type: "org.bluetooth.service.heart_rate"},
- "180e": {Name: "Phone Alert Status Service", Type: "org.bluetooth.service.phone_alert_service"},
- "180f": {Name: "Battery Service", Type: "org.bluetooth.service.battery_service"},
- "1810": {Name: "Blood Pressure", Type: "org.bluetooth.service.blood_pressuer"},
- "1811": {Name: "Alert Notification Service", Type: "org.bluetooth.service.alert_notification"},
- "1812": {Name: "Human Interface Device", Type: "org.bluetooth.service.human_interface_device"},
- "1813": {Name: "Scan Parameters", Type: "org.bluetooth.service.scan_parameters"},
- "1814": {Name: "Running Speed and Cadence", Type: "org.bluetooth.service.running_speed_and_cadence"},
- "1815": {Name: "Cycling Speed and Cadence", Type: "org.bluetooth.service.cycling_speed_and_cadence"},
-}
-
-// A dictionary of known descriptor names and type (keyed by attribute uuid)
-var knownAttributes = map[string]struct{ Name, Type string }{
- "2800": {Name: "Primary Service", Type: "org.bluetooth.attribute.gatt.primary_service_declaration"},
- "2801": {Name: "Secondary Service", Type: "org.bluetooth.attribute.gatt.secondary_service_declaration"},
- "2802": {Name: "Include", Type: "org.bluetooth.attribute.gatt.include_declaration"},
- "2803": {Name: "Characteristic", Type: "org.bluetooth.attribute.gatt.characteristic_declaration"},
-}
-
-// A dictionary of known descriptor names and type (keyed by descriptor uuid)
-var knownDescriptors = map[string]struct{ Name, Type string }{
- "2900": {Name: "Characteristic Extended Properties", Type: "org.bluetooth.descriptor.gatt.characteristic_extended_properties"},
- "2901": {Name: "Characteristic User Description", Type: "org.bluetooth.descriptor.gatt.characteristic_user_description"},
- "2902": {Name: "Client Characteristic Configuration", Type: "org.bluetooth.descriptor.gatt.client_characteristic_configuration"},
- "2903": {Name: "Server Characteristic Configuration", Type: "org.bluetooth.descriptor.gatt.server_characteristic_configuration"},
- "2904": {Name: "Characteristic Presentation Format", Type: "org.bluetooth.descriptor.gatt.characteristic_presentation_format"},
- "2905": {Name: "Characteristic Aggregate Format", Type: "org.bluetooth.descriptor.gatt.characteristic_aggregate_format"},
- "2906": {Name: "Valid Range", Type: "org.bluetooth.descriptor.valid_range"},
- "2907": {Name: "External Report Reference", Type: "org.bluetooth.descriptor.external_report_reference"},
- "2908": {Name: "Report Reference", Type: "org.bluetooth.descriptor.report_reference"},
-}
-
-// A dictionary of known characteristic names and type (keyed by characteristic uuid)
-var knownCharacteristics = map[string]struct{ Name, Type string }{
- "2a00": {Name: "Device Name", Type: "org.bluetooth.characteristic.gap.device_name"},
- "2a01": {Name: "Appearance", Type: "org.bluetooth.characteristic.gap.appearance"},
- "2a02": {Name: "Peripheral Privacy Flag", Type: "org.bluetooth.characteristic.gap.peripheral_privacy_flag"},
- "2a03": {Name: "Reconnection Address", Type: "org.bluetooth.characteristic.gap.reconnection_address"},
- "2a04": {Name: "Peripheral Preferred Connection Parameters", Type: "org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters"},
- "2a05": {Name: "Service Changed", Type: "org.bluetooth.characteristic.gatt.service_changed"},
- "2a06": {Name: "Alert Level", Type: "org.bluetooth.characteristic.alert_level"},
- "2a07": {Name: "Tx Power Level", Type: "org.bluetooth.characteristic.tx_power_level"},
- "2a08": {Name: "Date Time", Type: "org.bluetooth.characteristic.date_time"},
- "2a09": {Name: "Day of Week", Type: "org.bluetooth.characteristic.day_of_week"},
- "2a0a": {Name: "Day Date Time", Type: "org.bluetooth.characteristic.day_date_time"},
- "2a0c": {Name: "Exact Time 256", Type: "org.bluetooth.characteristic.exact_time_256"},
- "2a0d": {Name: "DST Offset", Type: "org.bluetooth.characteristic.dst_offset"},
- "2a0e": {Name: "Time Zone", Type: "org.bluetooth.characteristic.time_zone"},
- "2a0f": {Name: "Local Time Information", Type: "org.bluetooth.characteristic.local_time_information"},
- "2a11": {Name: "Time with DST", Type: "org.bluetooth.characteristic.time_with_dst"},
- "2a12": {Name: "Time Accuracy", Type: "org.bluetooth.characteristic.time_accuracy"},
- "2a13": {Name: "Time Source", Type: "org.bluetooth.characteristic.time_source"},
- "2a14": {Name: "Reference Time Information", Type: "org.bluetooth.characteristic.reference_time_information"},
- "2a16": {Name: "Time Update Control Point", Type: "org.bluetooth.characteristic.time_update_control_point"},
- "2a17": {Name: "Time Update State", Type: "org.bluetooth.characteristic.time_update_state"},
- "2a18": {Name: "Glucose Measurement", Type: "org.bluetooth.characteristic.glucose_measurement"},
- "2a19": {Name: "Battery Level", Type: "org.bluetooth.characteristic.battery_level"},
- "2a1c": {Name: "Temperature Measurement", Type: "org.bluetooth.characteristic.temperature_measurement"},
- "2a1d": {Name: "Temperature Type", Type: "org.bluetooth.characteristic.temperature_type"},
- "2a1e": {Name: "Intermediate Temperature", Type: "org.bluetooth.characteristic.intermediate_temperature"},
- "2a21": {Name: "Measurement Interval", Type: "org.bluetooth.characteristic.measurement_interval"},
- "2a22": {Name: "Boot Keyboard Input Report", Type: "org.bluetooth.characteristic.boot_keyboard_input_report"},
- "2a23": {Name: "System ID", Type: "org.bluetooth.characteristic.system_id"},
- "2a24": {Name: "Model Number String", Type: "org.bluetooth.characteristic.model_number_string"},
- "2a25": {Name: "Serial Number String", Type: "org.bluetooth.characteristic.serial_number_string"},
- "2a26": {Name: "Firmware Revision String", Type: "org.bluetooth.characteristic.firmware_revision_string"},
- "2a27": {Name: "Hardware Revision String", Type: "org.bluetooth.characteristic.hardware_revision_string"},
- "2a28": {Name: "Software Revision String", Type: "org.bluetooth.characteristic.software_revision_string"},
- "2a29": {Name: "Manufacturer Name String", Type: "org.bluetooth.characteristic.manufacturer_name_string"},
- "2a2a": {Name: "IEEE 11073-20601 Regulatory Certification Data List", Type: "org.bluetooth.characteristic.ieee_11073-20601_regulatory_certification_data_list"},
- "2a2b": {Name: "Current Time", Type: "org.bluetooth.characteristic.current_time"},
- "2a31": {Name: "Scan Refresh", Type: "org.bluetooth.characteristic.scan_refresh"},
- "2a32": {Name: "Boot Keyboard Output Report", Type: "org.bluetooth.characteristic.boot_keyboard_output_report"},
- "2a33": {Name: "Boot Mouse Input Report", Type: "org.bluetooth.characteristic.boot_mouse_input_report"},
- "2a34": {Name: "Glucose Measurement Context", Type: "org.bluetooth.characteristic.glucose_measurement_context"},
- "2a35": {Name: "Blood Pressure Measurement", Type: "org.bluetooth.characteristic.blood_pressure_measurement"},
- "2a36": {Name: "Intermediate Cuff Pressure", Type: "org.bluetooth.characteristic.intermediate_blood_pressure"},
- "2a37": {Name: "Heart Rate Measurement", Type: "org.bluetooth.characteristic.heart_rate_measurement"},
- "2a38": {Name: "Body Sensor Location", Type: "org.bluetooth.characteristic.body_sensor_location"},
- "2a39": {Name: "Heart Rate Control Point", Type: "org.bluetooth.characteristic.heart_rate_control_point"},
- "2a3f": {Name: "Alert Status", Type: "org.bluetooth.characteristic.alert_status"},
- "2a40": {Name: "Ringer Control Point", Type: "org.bluetooth.characteristic.ringer_control_point"},
- "2a41": {Name: "Ringer Setting", Type: "org.bluetooth.characteristic.ringer_setting"},
- "2a42": {Name: "Alert Category ID Bit Mask", Type: "org.bluetooth.characteristic.alert_category_id_bit_mask"},
- "2a43": {Name: "Alert Category ID", Type: "org.bluetooth.characteristic.alert_category_id"},
- "2a44": {Name: "Alert Notification Control Point", Type: "org.bluetooth.characteristic.alert_notification_control_point"},
- "2a45": {Name: "Unread Alert Status", Type: "org.bluetooth.characteristic.unread_alert_status"},
- "2a46": {Name: "New Alert", Type: "org.bluetooth.characteristic.new_alert"},
- "2a47": {Name: "Supported New Alert Category", Type: "org.bluetooth.characteristic.supported_new_alert_category"},
- "2a48": {Name: "Supported Unread Alert Category", Type: "org.bluetooth.characteristic.supported_unread_alert_category"},
- "2a49": {Name: "Blood Pressure Feature", Type: "org.bluetooth.characteristic.blood_pressure_feature"},
- "2a4a": {Name: "HID Information", Type: "org.bluetooth.characteristic.hid_information"},
- "2a4b": {Name: "Report Map", Type: "org.bluetooth.characteristic.report_map"},
- "2a4c": {Name: "HID Control Point", Type: "org.bluetooth.characteristic.hid_control_point"},
- "2a4d": {Name: "Report", Type: "org.bluetooth.characteristic.report"},
- "2a4e": {Name: "Protocol Mode", Type: "org.bluetooth.characteristic.protocol_mode"},
- "2a4f": {Name: "Scan Interval Window", Type: "org.bluetooth.characteristic.scan_interval_window"},
- "2a50": {Name: "PnP ID", Type: "org.bluetooth.characteristic.pnp_id"},
- "2a51": {Name: "Glucose Feature", Type: "org.bluetooth.characteristic.glucose_feature"},
- "2a52": {Name: "Record Access Control Point", Type: "org.bluetooth.characteristic.record_access_control_point"},
- "2a53": {Name: "RSC Measurement", Type: "org.bluetooth.characteristic.rsc_measurement"},
- "2a54": {Name: "RSC Feature", Type: "org.bluetooth.characteristic.rsc_feature"},
- "2a55": {Name: "SC Control Point", Type: "org.bluetooth.characteristic.sc_control_point"},
- "2a5b": {Name: "CSC Measurement", Type: "org.bluetooth.characteristic.csc_measurement"},
- "2a5c": {Name: "CSC Feature", Type: "org.bluetooth.characteristic.csc_feature"},
- "2a5d": {Name: "Sensor Location", Type: "org.bluetooth.characteristic.sensor_location"},
-}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/abf65d3a/newtmgr/vendor/github.com/runtimeinc/gatt/l2cap_writer_linux.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/l2cap_writer_linux.go b/newtmgr/vendor/github.com/runtimeinc/gatt/l2cap_writer_linux.go
deleted file mode 100644
index f5cecaf..0000000
--- a/newtmgr/vendor/github.com/runtimeinc/gatt/l2cap_writer_linux.go
+++ /dev/null
@@ -1,156 +0,0 @@
-package gatt
-
-import "encoding/binary"
-
-// l2capWriter helps create l2cap responses.
-// It is not meant to be used with large writes.
-// TODO: benchmark the number of allocs here.
-// Reduce by letting WriteByteFit, WriteUint16Fit, etc.
-// extend b/chunk and write into it directly.
-type l2capWriter struct {
- mtu int
- b []byte
- chunk []byte
- chunked bool
-}
-
-func newL2capWriter(mtu uint16) *l2capWriter {
- return &l2capWriter{mtu: int(mtu), b: make([]byte, 0, mtu)}
-}
-
-// Chunk starts writing a new chunk. This chunk
-// is not committed until Commit is called.
-// Chunk panics if another chunk has already been
-// started and not committed.
-func (w *l2capWriter) Chunk() {
- if w.chunked {
- panic("l2capWriter: chunk called twice without committing")
- }
- w.chunked = true
- if w.chunk == nil {
- w.chunk = make([]byte, 0, w.mtu)
- }
-}
-
-// Commit writes the current chunk and reports whether the
-// write succeeded. The write succeeds iff there is enough room.
-// Commit panics if no chunk has been started.
-func (w *l2capWriter) Commit() bool {
- if !w.chunked {
- panic("l2capWriter: commit without starting a chunk")
- }
- var success bool
- if len(w.b)+len(w.chunk) <= w.mtu {
- success = true
- w.b = append(w.b, w.chunk...)
- }
- w.chunk = w.chunk[:0]
- w.chunked = false
- return success
-}
-
-// CommitFit writes as much of the current chunk as possible,
-// truncating as needed.
-// CommitFit panics if no chunk has been started.
-func (w *l2capWriter) CommitFit() {
- if !w.chunked {
- panic("l2capWriter: CommitFit without starting a chunk")
- }
- writeable := w.mtu - len(w.b)
- if writeable > len(w.chunk) {
- writeable = len(w.chunk)
- }
- w.b = append(w.b, w.chunk[:writeable]...)
- w.chunk = w.chunk[:0]
- w.chunked = false
-}
-
-// WriteByteFit writes b.
-// It reports whether the write succeeded,
-// using the criteria of WriteFit.
-func (w *l2capWriter) WriteByteFit(b byte) bool {
- return w.WriteFit([]byte{b})
-}
-
-// WriteUint16Fit writes v using BLE (LittleEndian) encoding.
-// It reports whether the write succeeded, using the
-// criteria of WriteFit.
-func (w *l2capWriter) WriteUint16Fit(v uint16) bool {
- b := make([]byte, 2)
- binary.LittleEndian.PutUint16(b, v)
- return w.WriteFit(b)
-}
-
-// WriteUUIDFit writes uuid using BLE (reversed) encoding.
-// It reports whether the write succeeded, using the
-// criteria of WriteFit.
-func (w *l2capWriter) WriteUUIDFit(u UUID) bool {
- return w.WriteFit(u.b)
-}
-
-// Writeable returns the number of bytes from b
-// that would be written if pad bytes were written,
-// then as much of b as fits were written. When
-// writing to a chunk, any amount of bytes may be
-// written.
-func (w *l2capWriter) Writeable(pad int, b []byte) int {
- if w.chunked {
- return len(b)
- }
- avail := w.mtu - len(w.b) - pad
- if avail > len(b) {
- return len(b)
- }
- if avail < 0 {
- return 0
- }
- return avail
-}
-
-// WriteFit writes as much of b as fits.
-// It reports whether the write succeeded without
-// truncation. A write succeeds without truncation
-// iff a chunk write is in progress or the entire
-// contents were written (without exceeding the mtu).
-func (w *l2capWriter) WriteFit(b []byte) bool {
- if w.chunked {
- w.chunk = append(w.chunk, b...)
- return true
- }
- avail := w.mtu - len(w.b)
- if avail >= len(b) {
- w.b = append(w.b, b...)
- return true
- }
- w.b = append(w.b, b[:avail]...)
- return false
-}
-
-// ChunkSeek discards the first offset bytes from the
-// current chunk. It reports whether there were at least
-// offset bytes available to discard.
-// It panics if a chunked write is not in progress.
-func (w *l2capWriter) ChunkSeek(offset uint16) bool {
- if !w.chunked {
- panic("l2capWriter: ChunkSeek requested without chunked write in progress")
- }
- if len(w.chunk) < int(offset) {
- w.chunk = w.chunk[:0]
- return false
- }
- w.chunk = w.chunk[offset:]
- return true
-}
-
-// Bytes returns the written bytes.
-// It will panic if a chunked write
-// is in progress.
-// It is meant to be used when writing
-// is completed. It does not return a copy.
-// Don't abuse this, it's not worth it.
-func (w *l2capWriter) Bytes() []byte {
- if w.chunked {
- panic("l2capWriter: Bytes requested while chunked write in progress")
- }
- return w.b
-}