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/08/29 19:03:17 UTC
[mynewt-newtmgr] 01/03: nmxact - Ignore failed devices during scan.
This is an automated email from the ASF dual-hosted git repository.
ccollins pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newtmgr.git
commit 708262c5307831179177c9ca95b5df03d9970a08
Author: Christopher Collins <cc...@apache.org>
AuthorDate: Mon Aug 28 18:09:30 2017 -0700
nmxact - Ignore failed devices during scan.
---
nmxact/nmble/ble_scanner.go | 75 +++++++++++++++++++++++++++------------------
1 file changed, 45 insertions(+), 30 deletions(-)
diff --git a/nmxact/nmble/ble_scanner.go b/nmxact/nmble/ble_scanner.go
index 43ff678..f99d533 100644
--- a/nmxact/nmble/ble_scanner.go
+++ b/nmxact/nmble/ble_scanner.go
@@ -43,7 +43,8 @@ type BleScanner struct {
bx *BleXport
discoverer *Discoverer
reportedDevs map[BleDev]string
- bos *BleSesn
+ failedDevs map[BleDev]struct{}
+ ses *BleSesn
enabled bool
scanBlocker nmxutil.Blocker
suspendBlocker nmxutil.Blocker
@@ -56,6 +57,7 @@ func NewBleScanner(bx *BleXport) *BleScanner {
return &BleScanner{
bx: bx,
reportedDevs: map[BleDev]string{},
+ failedDevs: map[BleDev]struct{}{},
}
}
@@ -73,13 +75,15 @@ func (s *BleScanner) discover() (*BleDev, error) {
var dev *BleDev
advRptCb := func(r BleAdvReport) {
- if s.cfg.Ble.ScanPred(r) {
- s.mtx.Lock()
+ if dev == nil {
+ if s.cfg.Ble.ScanPred(r) {
+ s.mtx.Lock()
- dev = &r.Sender
- s.discoverer.Stop()
+ dev = &r.Sender
+ s.discoverer.Stop()
- s.mtx.Unlock()
+ s.mtx.Unlock()
+ }
}
}
if err := s.discoverer.Start(advRptCb); err != nil {
@@ -97,10 +101,10 @@ func (s *BleScanner) connect(dev BleDev) error {
}
s.mtx.Lock()
- s.bos = bs
+ s.ses = bs
s.mtx.Unlock()
- if err := s.bos.Open(); err != nil {
+ if err := s.ses.Open(); err != nil {
return err
}
@@ -112,7 +116,7 @@ func (s *BleScanner) readHwId() (string, error) {
c.Path = "dev"
c.Typ = sesn.RES_TYPE_PUBLIC
- res, err := c.Run(s.bos)
+ res, err := c.Run(s.ses)
if err != nil {
return "", fmt.Errorf("failed to read hardware ID; %s", err.Error())
}
@@ -160,31 +164,36 @@ func (s *BleScanner) scan() (*scan.ScanPeer, error) {
if err := s.connect(*dev); err != nil {
return nil, err
}
- defer s.bos.Close()
+ defer s.ses.Close()
+
+ // Now that we have successfully connected to this device, we will report
+ // it regardless of success or failure.
+ peer := scan.ScanPeer{
+ HwId: "",
+ PeerSpec: sesn.PeerSpec{
+ Ble: *dev,
+ },
+ }
- // Now we are connected (and paired if required). Read the peer's hardware
- // ID and report it upstream.
hwId, err := s.readHwId()
if err != nil {
- return nil, err
+ return &peer, err
}
- desc, err := s.bos.ConnInfo()
- if err != nil {
- return nil, err
+ peer.HwId = hwId
+ return &peer, nil
+}
+
+func (s *BleScanner) seenDevice(dev BleDev) bool {
+ if _, ok := s.reportedDevs[dev]; ok {
+ return true
}
- peer := scan.ScanPeer{
- HwId: hwId,
- PeerSpec: sesn.PeerSpec{
- Ble: BleDev{
- AddrType: desc.PeerIdAddrType,
- Addr: desc.PeerIdAddr,
- },
- },
+ if _, ok := s.failedDevs[dev]; ok {
+ return true
}
- return &peer, nil
+ return false
}
func (s *BleScanner) Start(cfg scan.Cfg) error {
@@ -197,7 +206,7 @@ func (s *BleScanner) Start(cfg scan.Cfg) error {
cfg.Ble.ScanPred = func(adv BleAdvReport) bool {
// Filter devices that have already been reported.
s.mtx.Lock()
- seen := s.reportedDevs[adv.Sender] != ""
+ seen := s.seenDevice(adv.Sender)
s.mtx.Unlock()
if seen {
@@ -223,6 +232,9 @@ func (s *BleScanner) Start(cfg scan.Cfg) error {
p, err := s.scan()
if err != nil {
log.Debugf("Scan error: %s", err.Error())
+ if p != nil {
+ s.failedDevs[p.PeerSpec.Ble] = struct{}{}
+ }
time.Sleep(scanRetryRate)
} else if p != nil {
s.mtx.Lock()
@@ -242,21 +254,21 @@ func (s *BleScanner) suspend() error {
defer s.suspendBlocker.Unblock(nil)
discoverer := s.discoverer
- bos := s.bos
+ ses := s.ses
if discoverer != nil {
discoverer.Stop()
}
- if bos != nil {
- bos.Close()
+ if ses != nil {
+ ses.Close()
}
// Block until scan is fully terminated.
s.scanBlocker.Wait(nmxutil.DURATION_FOREVER, nil)
s.discoverer = nil
- s.bos = nil
+ s.ses = nil
return nil
}
@@ -313,4 +325,7 @@ func (s *BleScanner) ForgetAllDevices() {
for discoverer, _ := range s.reportedDevs {
delete(s.reportedDevs, discoverer)
}
+ for discoverer, _ := range s.failedDevs {
+ delete(s.failedDevs, discoverer)
+ }
}
--
To stop receiving notification emails like this one, please contact
"commits@mynewt.apache.org" <co...@mynewt.apache.org>.