diff --git a/gattc.go b/gattc.go new file mode 100644 index 0000000..640a8fb --- /dev/null +++ b/gattc.go @@ -0,0 +1,5 @@ +package bluetooth + +import "errors" + +var ErrCannotSendWriteWithoutResponse = errors.New("cannot send write without response") diff --git a/gattc_darwin.go b/gattc_darwin.go index 2d737da..983fb25 100644 --- a/gattc_darwin.go +++ b/gattc_darwin.go @@ -199,9 +199,13 @@ func (c DeviceCharacteristic) Write(p []byte) (n int, err error) { // WriteWithoutResponse replaces the characteristic value with a new value. The // call will return before all data has been written. A limited number of such -// writes can be in flight at any given time. This call is also known as a -// "write command" (as opposed to a write request). -func (c DeviceCharacteristic) WriteWithoutResponse(p []byte) (n int, err error) { +// writes can be in flight at any given time. +// If the client is not ready to send write without response requests at this time, ErrCannotSendWriteWithoutResponse is returned. +func (c DeviceCharacteristic) WriteWithoutResponse(p []byte) (int, error) { + if !c.service.device.prph.CanSendWriteWithoutResponse() { + return 0, ErrCannotSendWriteWithoutResponse + } + c.service.device.prph.WriteCharacteristic(p, c.characteristic, false) return len(p), nil @@ -227,6 +231,14 @@ func (c DeviceCharacteristic) GetMTU() (uint16, error) { return uint16(c.service.device.prph.MaximumWriteValueLength(false)), nil } +// CanSendWriteWithoutResponse returns whether a WriteWithoutResponse can be sent +// at this time. If this returns false, you must wait for some time before +// sending another WriteWithoutResponse. This is typically because the internal +// buffer is full. +func (c DeviceCharacteristic) CanSendWriteWithoutResponse() bool { + return c.service.device.prph.CanSendWriteWithoutResponse() +} + // Read reads the current characteristic value. func (c *deviceCharacteristic) Read(data []byte) (n int, err error) { c.readChan = make(chan error)