8
8
"io"
9
9
"net"
10
10
"strings"
11
+ "time"
11
12
12
13
"github.com/fako1024/gatt/linux"
13
14
)
@@ -61,7 +62,7 @@ func (p *peripheral) DiscoverServices(s []UUID) ([]*Service, error) {
61
62
binary .LittleEndian .PutUint16 (b [3 :5 ], 0xFFFF )
62
63
binary .LittleEndian .PutUint16 (b [5 :7 ], 0x2800 )
63
64
64
- b = p .sendReq (op , b )
65
+ b , _ = p .sendReq (op , b )
65
66
if b == nil {
66
67
return nil , ErrDisconnected
67
68
}
@@ -112,7 +113,7 @@ func (p *peripheral) DiscoverCharacteristics(cs []UUID, s *Service) ([]*Characte
112
113
binary .LittleEndian .PutUint16 (b [3 :5 ], s .endh )
113
114
binary .LittleEndian .PutUint16 (b [5 :7 ], 0x2803 )
114
115
115
- b = p .sendReq (op , b )
116
+ b , _ = p .sendReq (op , b )
116
117
if b == nil {
117
118
return nil , ErrDisconnected
118
119
}
@@ -175,7 +176,7 @@ func (p *peripheral) DiscoverDescriptors(ds []UUID, c *Characteristic) ([]*Descr
175
176
binary .LittleEndian .PutUint16 (b [1 :3 ], start )
176
177
binary .LittleEndian .PutUint16 (b [3 :5 ], c .endh )
177
178
178
- b = p .sendReq (op , b )
179
+ b , _ = p .sendReq (op , b )
179
180
if b == nil {
180
181
return nil , ErrDisconnected
181
182
}
@@ -217,7 +218,7 @@ func (p *peripheral) ReadCharacteristic(c *Characteristic) ([]byte, error) {
217
218
b [0 ] = op
218
219
binary .LittleEndian .PutUint16 (b [1 :3 ], c .vh )
219
220
220
- b = p .sendReq (op , b )
221
+ b , _ = p .sendReq (op , b )
221
222
if b == nil {
222
223
return nil , ErrDisconnected
223
224
}
@@ -248,7 +249,7 @@ func (p *peripheral) ReadLongCharacteristic(c *Characteristic) ([]byte, error) {
248
249
binary .LittleEndian .PutUint16 (b [1 :3 ], c .vh )
249
250
binary .LittleEndian .PutUint16 (b [3 :5 ], off )
250
251
251
- b = p .sendReq (op , b )
252
+ b , _ = p .sendReq (op , b )
252
253
if b == nil {
253
254
return nil , ErrDisconnected
254
255
}
@@ -279,7 +280,7 @@ func (p *peripheral) WriteCharacteristic(c *Characteristic, value []byte, noRsp
279
280
p .sendCmd (op , b )
280
281
return nil
281
282
}
282
- b = p .sendReq (op , b )
283
+ b , _ = p .sendReq (op , b )
283
284
if b == nil {
284
285
return ErrDisconnected
285
286
}
@@ -294,7 +295,7 @@ func (p *peripheral) ReadDescriptor(d *Descriptor) ([]byte, error) {
294
295
b [0 ] = op
295
296
binary .LittleEndian .PutUint16 (b [1 :3 ], d .h )
296
297
297
- b = p .sendReq (op , b )
298
+ b , _ = p .sendReq (op , b )
298
299
if b == nil {
299
300
return nil , ErrDisconnected
300
301
}
@@ -310,7 +311,7 @@ func (p *peripheral) WriteDescriptor(d *Descriptor, value []byte) error {
310
311
binary .LittleEndian .PutUint16 (b [1 :3 ], d .h )
311
312
copy (b [3 :], value )
312
313
313
- b = p .sendReq (op , b )
314
+ b , _ = p .sendReq (op , b )
314
315
if b == nil {
315
316
return ErrDisconnected
316
317
}
@@ -335,7 +336,7 @@ func (p *peripheral) setNotifyValue(c *Characteristic, flag uint16,
335
336
binary .LittleEndian .PutUint16 (b [1 :3 ], c .cccd .h )
336
337
binary .LittleEndian .PutUint16 (b [3 :5 ], ccc )
337
338
338
- b = p .sendReq (op , b )
339
+ b , _ = p .sendReq (op , b )
339
340
if b == nil {
340
341
return ErrDisconnected
341
342
}
@@ -378,14 +379,28 @@ type message struct {
378
379
rspc chan []byte
379
380
}
380
381
381
- func (p * peripheral ) sendCmd (op byte , b []byte ) {
382
- p .reqc <- message {op : op , b : b }
382
+ func (p * peripheral ) sendCmd (op byte , b []byte ) error {
383
+ select {
384
+ case p .reqc <- message {op : op , b : b }:
385
+ return nil
386
+ case <- time .After (p .d .msgTimeout ):
387
+ return ErrTimeout
388
+ }
383
389
}
384
390
385
- func (p * peripheral ) sendReq (op byte , b []byte ) []byte {
391
+ func (p * peripheral ) sendReq (op byte , b []byte ) ( []byte , error ) {
386
392
m := message {op : op , b : b , rspc : make (chan []byte )}
387
- p .reqc <- m
388
- return <- m .rspc
393
+ select {
394
+ case p .reqc <- m :
395
+ select {
396
+ case res := <- m .rspc :
397
+ return res , nil
398
+ case <- time .After (p .d .msgTimeout ):
399
+ return nil , ErrTimeout
400
+ }
401
+ case <- time .After (p .d .msgTimeout ):
402
+ return nil , ErrTimeout
403
+ }
389
404
}
390
405
391
406
func (p * peripheral ) loop () {
@@ -463,7 +478,7 @@ func (p *peripheral) SetMTU(mtu uint16) error {
463
478
b [0 ] = op
464
479
binary .LittleEndian .PutUint16 (b [1 :3 ], uint16 (mtu ))
465
480
466
- b = p .sendReq (op , b )
481
+ b , _ = p .sendReq (op , b )
467
482
if b == nil {
468
483
return ErrDisconnected
469
484
}
0 commit comments