Skip to content

Enable pluggable discovery #773

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

Closed
wants to merge 2 commits into from
Closed
Changes from all 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
9 changes: 7 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ go 1.19

require (
github.com/andela/gin-cors v0.0.0-20160928171741-e8c3436a37e2
github.com/arduino/arduino-cli v0.0.0-20210422154105-5aa424818026
github.com/arduino/arduino-cli v0.0.0-20230227214540-e7ba99f4007b
github.com/arduino/go-paths-helper v1.8.0
github.com/blang/semver v3.5.1+incompatible
github.com/codeclysm/extract/v3 v3.1.0
@@ -30,6 +30,7 @@ require (
)

require (
github.com/arduino/go-properties-orderedmap v1.7.1 // indirect
github.com/creack/goselect v0.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
@@ -47,6 +48,7 @@ require (
github.com/go-playground/validator/v10 v10.10.0 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/goccy/go-json v0.9.7 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/gxui v0.0.0-20151028112939-f85e0a97b3a4 // indirect
github.com/googollee/go-engine.io v0.0.0-20180829091931-e2f255711dcb // indirect
github.com/gorilla/websocket v1.4.0 // indirect
@@ -58,6 +60,7 @@ require (
github.com/kr/binarydist v0.1.0 // indirect
github.com/kr/fs v0.1.0 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/leonelquinteros/gotext v1.4.0 // indirect
github.com/manveru/faker v0.0.0-20171103152722-9fbc68a78c4d // indirect
github.com/manveru/gobdd v0.0.0-20131210092515-f1a17fdd710b // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
@@ -68,13 +71,15 @@ require (
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
github.com/pkg/sftp v1.13.4 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/smartystreets/goconvey v1.7.2 // indirect
github.com/ugorji/go v1.1.6 // indirect
github.com/ulikunitz/xz v0.5.11 // indirect
github.com/zach-klippenstein/goregen v0.0.0-20160303162051-795b5e3961ea // indirect
golang.org/x/net v0.5.0 // indirect
golang.org/x/text v0.6.0 // indirect
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect
google.golang.org/grpc v1.38.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
240 changes: 37 additions & 203 deletions go.sum

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
@@ -297,7 +297,7 @@ func loop() {
}

// list serial ports
portList, _ := GetList(false)
portList, _ := GetList()
log.Println("Your serial ports:")
if len(portList) == 0 {
log.Println("\tThere are no serial ports to list.")
40 changes: 7 additions & 33 deletions serial.go
Original file line number Diff line number Diff line change
@@ -23,8 +23,6 @@ import (
"strings"
"sync"
"time"

"github.com/arduino/arduino-create-agent/upload"
)

type writeRequest struct {
@@ -129,15 +127,9 @@ func write(wr writeRequest) {
func spList(network bool) {
var ls []byte
var err error
if network {
NetworkPorts.Mu.Lock()
ls, err = json.MarshalIndent(&NetworkPorts, "", "\t")
NetworkPorts.Mu.Unlock()
} else {
SerialPorts.Mu.Lock()
ls, err = json.MarshalIndent(&SerialPorts, "", "\t")
SerialPorts.Mu.Unlock()
}
SerialPorts.Mu.Lock()
ls, err = json.MarshalIndent(&SerialPorts, "", "\t")
SerialPorts.Mu.Unlock()
if err != nil {
//log.Println(err)
h.broadcastSys <- []byte("Error creating json on port list " +
@@ -153,19 +145,7 @@ func discoverLoop() {
SerialPorts.Network = false
SerialPorts.Ports = make([]SpPortItem, 0)
SerialPorts.Mu.Unlock()
NetworkPorts.Mu.Lock()
NetworkPorts.Network = true
NetworkPorts.Ports = make([]SpPortItem, 0)
NetworkPorts.Mu.Unlock()

go func() {
for {
if !upload.Busy {
spListDual(false)
}
time.Sleep(2 * time.Second)
}
}()
go func() {
for {
spListDual(true)
@@ -177,7 +157,7 @@ func discoverLoop() {
func spListDual(network bool) {

// call our os specific implementation of getting the serial list
list, err := GetList(network)
list, err := GetList()

//log.Println(list)
//log.Println(err)
@@ -249,15 +229,9 @@ func spListDual(network bool) {
ctr++
}

if network {
NetworkPorts.Mu.Lock()
NetworkPorts.Ports = spl
NetworkPorts.Mu.Unlock()
} else {
SerialPorts.Mu.Lock()
SerialPorts.Ports = spl
SerialPorts.Mu.Unlock()
}
SerialPorts.Mu.Lock()
SerialPorts.Ports = spl
SerialPorts.Mu.Unlock()
}

func spErr(err string) {
69 changes: 29 additions & 40 deletions seriallist.go
Original file line number Diff line number Diff line change
@@ -19,13 +19,14 @@ package main

import (
"fmt"
"regexp"
"strings"

log "github.com/sirupsen/logrus"
"go.bug.st/serial/enumerator"
"github.com/arduino/arduino-cli/arduino/discovery"
"github.com/arduino/arduino-cli/arduino/discovery/discoverymanager"
)

var discoveryManager *discoverymanager.DiscoveryManager

// OsSerialPort is the Os serial port
type OsSerialPort struct {
Name string
@@ -39,51 +40,39 @@ type OsSerialPort struct {
}

// GetList will return the OS serial port
func GetList(network bool) ([]OsSerialPort, error) {

if network {
netportList, err := GetNetworkList()
return netportList, err
}
func GetList() ([]OsSerialPort, error) {

// will timeout in 2 seconds
arrPorts := []OsSerialPort{}
ports, err := enumerator.GetDetailedPortsList()
if err != nil {
return arrPorts, err
}

for _, element := range ports {
if element.IsUSB {
vid := element.VID
pid := element.PID
vidString := fmt.Sprintf("0x%s", vid)
pidString := fmt.Sprintf("0x%s", pid)
if vid != "0000" && pid != "0000" {
arrPorts = append(arrPorts, OsSerialPort{Name: element.Name, IDVendor: vidString, IDProduct: pidString, ISerial: element.SerialNumber})
}
if discoveryManager == nil {
discoveryManager = discoverymanager.New()
Tools.Download("builtin", "serial-discovery", "latest", "keep")
Tools.Download("builtin", "mdns-discovery", "latest", "keep")
sd, err := Tools.GetLocation("serial-discovery")
if err == nil {
d := discovery.New("serial", sd+"/serial-discovery")
discoveryManager.Add(d)
}
md, err := Tools.GetLocation("mdns-discovery")
if err == nil {
d := discovery.New("mdns", md+"/mdns-discovery")
discoveryManager.Add(d)
}
discoveryManager.Start()
}

// see if we should filter the list
if len(*regExpFilter) > 0 {
// yes, user asked for a filter
reFilter := regexp.MustCompile("(?i)" + *regExpFilter)
fmt.Println("calling getList")
ports := discoveryManager.List()

newarrPorts := []OsSerialPort{}
for _, element := range arrPorts {
// if matches regex, include
if reFilter.MatchString(element.Name) {
newarrPorts = append(newarrPorts, element)
} else {
log.Debugf("serial port did not match. port: %v\n", element)
}
fmt.Println(ports)

}
arrPorts = newarrPorts
arrPorts := []OsSerialPort{}
for _, port := range ports {
vid := port.Properties.AsMap()["vid"]
pid := port.Properties.AsMap()["pid"]
arrPorts = append(arrPorts, OsSerialPort{Name: port.Address, IDVendor: vid, IDProduct: pid, ISerial: port.HardwareID})
}
fmt.Println(arrPorts)

return arrPorts, err
return arrPorts, nil
}

func findPortByName(portname string) (*serport, bool) {
2 changes: 1 addition & 1 deletion upload/upload.go
Original file line number Diff line number Diff line change
@@ -165,7 +165,7 @@ func Kill() {
// sometimes) and an error (usually because the port listing failed)
func reset(port string, wait bool, l Logger) (string, error) {
info(l, "Restarting in bootloader mode")
newPort, err := serialutils.Reset(port, wait, nil) // TODO use callbacks to print as the cli does
newPort, err := serialutils.Reset(port, wait, nil, false) // TODO use callbacks to print as the cli does
if err != nil {
info(l, err)
return "", err