Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upload port detector improvements #2288

Merged
merged 4 commits into from
Aug 31, 2023
Merged
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions commands/upload/upload.go
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,8 @@ func runProgramAction(pme *packagemanager.Explorer,

updatedPort := updatedUploadPort.Await()
if updatedPort == nil {
return nil, nil
// If the algorithms can not detect the new port, fallback to the user-provided port.
return userPort, nil
}
return updatedPort.ToRPC(), nil
}
Expand All @@ -526,7 +527,7 @@ func detectUploadPort(
result f.Future[*discovery.Port],
) {
log := logrus.WithField("task", "port_detection")
log.Tracef("Detecting new board port after upload")
log.Debugf("Detecting new board port after upload")

candidate := uploadPort.Clone()
defer func() {
Expand All @@ -542,11 +543,11 @@ func detectUploadPort(
return
}
if candidate != nil && ev.Type == "remove" && ev.Port.Equals(candidate) {
log.WithField("event", ev).Trace("User-specified port has been disconnected, forcing wait for upload port")
log.WithField("event", ev).Debug("User-specified port has been disconnected, forcing wait for upload port")
waitForUploadPort = true
candidate = nil
} else {
log.WithField("event", ev).Trace("Ignored watcher event before upload")
log.WithField("event", ev).Debug("Ignored watcher event before upload")
}
continue
case <-uploadCtx.Done():
Expand All @@ -568,17 +569,20 @@ func detectUploadPort(
return
}
if candidate != nil && ev.Type == "remove" && candidate.Equals(ev.Port) {
log.WithField("event", ev).Trace("Candidate port is no longer available")
log.WithField("event", ev).Debug("Candidate port is no longer available")
candidate = nil
if !waitForUploadPort {
waitForUploadPort = true
timeout = time.After(5 * time.Second)
log.Trace("User-specified port has been disconnected, now waiting for upload port, timeout extended by 5 seconds")
log.Debug("User-specified port has been disconnected, now waiting for upload port, timeout extended by 5 seconds")
} else {
timeout = time.After(time.Second)
log.Debug("Candidate port has been disconnected, timeout extended by 1 second")
}
continue
}
if ev.Type != "add" {
log.WithField("event", ev).Trace("Ignored non-add event")
log.WithField("event", ev).Debug("Ignored non-add event")
continue
}

Expand All @@ -601,21 +605,21 @@ func detectUploadPort(
evPortPriority := portPriority(ev.Port)
candidatePriority := portPriority(candidate)
if evPortPriority <= candidatePriority {
log.WithField("event", ev).Tracef("New upload port candidate is worse than the current one (prio=%d)", evPortPriority)
log.WithField("event", ev).Debugf("New upload port candidate is worse than the current one (prio=%d)", evPortPriority)
continue
}
log.WithField("event", ev).Tracef("Found new upload port candidate (prio=%d)", evPortPriority)
log.WithField("event", ev).Debugf("Found new upload port candidate (prio=%d)", evPortPriority)
candidate = ev.Port

// If the current candidate have the desired HW-ID return it quickly.
if candidate.HardwareID == ev.Port.HardwareID {
timeout = time.After(time.Second)
log.Trace("New candidate port match the desired HW ID, timeout reduced to 1 second.")
log.Debug("New candidate port match the desired HW ID, timeout reduced to 1 second.")
continue
}

case <-timeout:
log.WithField("selected_port", candidate).Trace("Timeout waiting for candidate port")
log.WithField("selected_port", candidate).Debug("Timeout waiting for candidate port")
return
}
}
Expand Down