From e5f770c65b77bb5beeae15c903a2346d438f7750 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 23 Jul 2015 16:24:47 +0200 Subject: [PATCH 01/22] Revert "Disable systray" This reverts commit 222c2b5bb5d4f739f1927887ac01779bacf2fa7d. --- main.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.go b/main.go index 6b1019ee4..92b48b691 100755 --- a/main.go +++ b/main.go @@ -137,7 +137,6 @@ func main() { } func startDaemon() { - // setupSysTray() go func() { // autoextract self @@ -283,7 +282,7 @@ func startDaemon() { log.Fatal("Error ListenAndServe:", err) } }() - + setupSysTray() } var homeTemplate = template.Must(template.New("home").Parse(homeTemplateHtml)) From 5a549b55eb66b1deb7f9a28ec6883c248a6ba6ee Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 23 Jul 2015 16:28:56 +0200 Subject: [PATCH 02/22] Revert "Added deamon capabilities" This reverts commit cd4ab8b875a4d894ef81aa55a2841e0a6dff002c. --- main.go | 54 ------------------------------------------------------ 1 file changed, 54 deletions(-) diff --git a/main.go b/main.go index 92b48b691..fb00c2dab 100755 --- a/main.go +++ b/main.go @@ -16,7 +16,6 @@ import ( //"github.com/sanderhahn/gozip" "github.com/gin-gonic/gin" "github.com/itsjamie/gin-cors" - "github.com/kardianos/service" "github.com/vharitonsky/iniflags" "runtime/debug" "text/template" @@ -82,61 +81,8 @@ func launchSelfLater() { log.Println("Done waiting 5 secs. Now launching...") } -var logger service.Logger - -type program struct{} - -func (p *program) Start(s service.Service) error { - // Start should not block. Do the actual work async. - go p.run() - return nil -} -func (p *program) run() { - startDaemon() -} -func (p *program) Stop(s service.Service) error { - // Stop should not block. Return with a few seconds. - <-time.After(time.Second * 13) - return nil -} - func main() { - svcConfig := &service.Config{ - Name: "ArduinoCreateBridge", - DisplayName: "Arduino Create Bridge", - Description: "A bridge that allows Arduino Create to operate on the boards connected to the computer", - } - - prg := &program{} - s, err := service.New(prg, svcConfig) - if err != nil { - log.Fatal(err) - } - if len(os.Args) > 1 { - err = service.Control(s, os.Args[1]) - if err != nil { - log.Fatal(err) - } - return - } - - logger, err = s.Logger(nil) - if err != nil { - log.Fatal(err) - } - - err = s.Install() - if err != nil { - logger.Error(err) - } - - err = s.Run() - if err != nil { - logger.Error(err) - } -} -func startDaemon() { go func() { // autoextract self From 3efe2972760b830e5e9fb76e25ba877ef639571c Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 23 Jul 2015 17:36:19 +0200 Subject: [PATCH 03/22] enable clean operations using external installer --- compile_webidebridge.sh | 8 ++--- main.go | 69 +++++++++++++++++++++++------------------ utilities.go | 1 - 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/compile_webidebridge.sh b/compile_webidebridge.sh index a8dfd4398..1cb3998b4 100755 --- a/compile_webidebridge.sh +++ b/compile_webidebridge.sh @@ -34,10 +34,11 @@ createZipEmbeddableFileArduino() cd arduino zip -r arduino.zip arduino/* config.ini *.pem > /dev/null cd .. - cat arduino/arduino.zip >> $3 - zip --adjust-sfx $3 + #cat arduino/arduino.zip >> $3 + #zip --adjust-sfx $3 mkdir -p snapshot/$GOOS\_$GOARCH cp $3 snapshot/$GOOS\_$GOARCH/$3 + cp arduino/arduino.zip snapshot/$GOOS\_$GOARCH ls -la snapshot/$GOOS\_$GOARCH/$3 } @@ -53,7 +54,6 @@ bootstrapPlatforms() env CC_FOR_TARGET=i686-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=386 ./make.bash --no-clean } -set -x compilePlatform() { echo 'In compilePlatform' @@ -74,7 +74,7 @@ compilePlatform() fi echo createZipEmbeddableFileArduino $GOOS $GOARCH $NAME createZipEmbeddableFileArduino $GOOS $GOARCH $NAME - GOOS=$GOOS GOARCH=$GOARCH go-selfupdate $NAME $VERSION + #GOOS=$GOOS GOARCH=$GOARCH go-selfupdate $NAME $VERSION rm -rf $NAME* } diff --git a/main.go b/main.go index fb00c2dab..c5ef5dc76 100755 --- a/main.go +++ b/main.go @@ -23,10 +23,12 @@ import ( ) var ( - version = "1.83" - versionFloat = float32(1.83) - addr = flag.String("addr", ":8989", "http service address") - addrSSL = flag.String("addrSSL", ":8990", "https service address") + version = "1.83" + versionFloat = float32(1.83) + embedded_autoupdate = false + embedded_autoextract = false + addr = flag.String("addr", ":8989", "http service address") + addrSSL = flag.String("addrSSL", ":8990", "https service address") //assets = flag.String("assets", defaultAssetPath(), "path to assets") verbose = flag.Bool("v", true, "show debug logging") //verbose = flag.Bool("v", false, "show debug logging") @@ -89,19 +91,21 @@ func main() { src, _ := osext.Executable() dest := filepath.Dir(src) - // save the config.ini (if it exists) - if _, err := os.Stat(dest + "/" + *configIni); os.IsNotExist(err) { - fmt.Println("First run, unzipping self") - err := Unzip(src, dest) - fmt.Println("Self extraction, err:", err) - } + if embedded_autoextract { + // save the config.ini (if it exists) + if _, err := os.Stat(dest + "/" + *configIni); os.IsNotExist(err) { + fmt.Println("First run, unzipping self") + err := Unzip(src, dest) + fmt.Println("Self extraction, err:", err) + } - if _, err := os.Stat(dest + "/" + *configIni); os.IsNotExist(err) { - flag.Parse() - fmt.Println("No config.ini at", *configIni) - } else { - flag.Set("config", dest+"/"+*configIni) - iniflags.Parse() + if _, err := os.Stat(dest + "/" + *configIni); os.IsNotExist(err) { + flag.Parse() + fmt.Println("No config.ini at", *configIni) + } else { + flag.Set("config", dest+"/"+*configIni) + iniflags.Parse() + } } // setup logging @@ -112,23 +116,26 @@ func main() { launchSelfLater() } - var updater = &Updater{ - CurrentVersion: version, - ApiURL: *updateUrl, - BinURL: *updateUrl, - DiffURL: "", - Dir: "update/", - CmdName: *appName, - } + if embedded_autoupdate { - if updater != nil { - go updater.BackgroundRun() - } + var updater = &Updater{ + CurrentVersion: version, + ApiURL: *updateUrl, + BinURL: *updateUrl, + DiffURL: "", + Dir: "update/", + CmdName: *appName, + } - // data, err := Asset("arduino.zip") - // if err != nil { - // log.Println("arduino tools not found") - // } + if updater != nil { + go updater.BackgroundRun() + } + + // data, err := Asset("arduino.zip") + // if err != nil { + // log.Println("arduino tools not found") + // } + } createGlobalConfigMap(&globalConfigMap) diff --git a/utilities.go b/utilities.go index 4fa096825..d71620674 100644 --- a/utilities.go +++ b/utilities.go @@ -129,7 +129,6 @@ func pipe_commands(commands ...*exec.Cmd) ([]byte, error) { commands[i].Stderr = &errorBuffer if err := call(commands, pipeStack); err != nil { - logger.Errorf(string(errorBuffer.Bytes()), err) return nil, err } From 390029d5f428b8628d6a3137517377bd62dd3d1e Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 10:09:47 +0200 Subject: [PATCH 04/22] add agent version in tray icon --- trayicon.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/trayicon.go b/trayicon.go index ad6aa73b5..4fbc0a1a0 100644 --- a/trayicon.go +++ b/trayicon.go @@ -47,8 +47,11 @@ func setupSysTrayReal() { systray.SetIcon(icon.Data) mUrl := systray.AddMenuItem("Go to create.arduino.cc", "Arduino Create") + menuVer := systray.AddMenuItem("Agent version "+version, "") mQuit := systray.AddMenuItem("Quit", "Quit the bridge") + menuVer.Disable() + go func() { <-mQuit.ClickedCh systray.Quit() @@ -59,6 +62,6 @@ func setupSysTrayReal() { // We can manipulate the systray in other goroutines go func() { <-mUrl.ClickedCh - open.Run("http://create.arduino.cc") + open.Run("http://create-dev.arduino.cc") }() } From 7514f4a59767d7009113e0632f7601c92f682c7f Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 12:29:20 +0200 Subject: [PATCH 05/22] add installer icons --- installer_icons/Installer.png | Bin 0 -> 4872 bytes installer_icons/InstallerIcon.png | Bin 0 -> 1258 bytes installer_icons/InstallerSplash.png | Bin 0 -> 7166 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 installer_icons/Installer.png create mode 100644 installer_icons/InstallerIcon.png create mode 100644 installer_icons/InstallerSplash.png diff --git a/installer_icons/Installer.png b/installer_icons/Installer.png new file mode 100644 index 0000000000000000000000000000000000000000..ccdf286dd4e55dc0fe69ae561ee974e6121a232d GIT binary patch literal 4872 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 ZsAapKS!V%ZcRj@-($Un{`1-^){2zO=Z$bb7 literal 0 HcmV?d00001 diff --git a/installer_icons/InstallerIcon.png b/installer_icons/InstallerIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..8951a1a8ca3a9c2defed3b9e3b13424937a65fd6 GIT binary patch literal 1258 zcmV{&~0+b|HdgDeYJJwehFSUG`}6GT0Movylza)KzUw3|lRb=9aRsB?nICx{Gm zU*!aKmR-5S;4zpoLyDAKphZkzAY1$lhn#uy(Qv(94_->!8N8tOqJ-TIoiP0TWuG1i zQ4G?pCR!2A*YDreeK*GV=%;QCcvTV~nitXI6VWfCk2I!v>hrZ(T0}9-i6$Py?}!eU}YH0r69Uy13gXi37b@Ak%YJ|nA@F? zI!i%CD!jW15tM<0QrV@@eHJ39a(kdy;G@Q$3Oq8O2x{gtF;L(KkKw7~MsGodg--z+ z=WVP}*(K~)xYeesFMz;l%P?i5RZq7g9Ykym7h$hvlhn$!v6?oX83I={=Zb!w2;-L$ z7}5B`+^qV~cxQ$tNLrBqH^kU@-}4l^L^-)dSR3lb0-q6k7xm40R)fFSvcUHnZ<6a- z3pShfV$vRsS)(3fPk#g@g3rA)ULSHSkO0bb6-Oqj1qvED0*ohck=#mPle|dNhQ?KZ zUHPKqxMhqwh|+PW=b+LNv5f`bYq~~IPF1sPLXDqV!p^BhtCEl$*kK~iBEB8LFE-eW z*{%_|dsP{TYKuS%qeHHo|*7um)3;!!i;h8td#! zSTb+6n=PHJP%5livBZ#HEre8^OJW}vXnE+$3} zs!snW4&njmSYZ<*^l7b_vpUl)TW@V5G}c%crlN7-j?FJaTu+2W3w+?^cGsXp(!dQI zqfh6+3w9W_c0CLSa*Tg+Sq#)9)m@>lW(QsxwI}X+%Aik{+X!ka>{i%+w*3}h0NFNO UZJ&p#8~^|S07*qoM6N<$f=S*wIRF3v literal 0 HcmV?d00001 diff --git a/installer_icons/InstallerSplash.png b/installer_icons/InstallerSplash.png new file mode 100644 index 0000000000000000000000000000000000000000..8525f710ee465f50a9b857fbbddcba08e179064c GIT binary patch literal 7166 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 XZEiotzWj<9=mC@!H00}Kt=|0)f?J{M literal 0 HcmV?d00001 From 09db5dfaa1687e55d7e342e46c22398554ce3ba9 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 13:35:09 +0200 Subject: [PATCH 06/22] add windows ico --- installer_icons/tray_iconWin.ico | Bin 0 -> 15086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 installer_icons/tray_iconWin.ico diff --git a/installer_icons/tray_iconWin.ico b/installer_icons/tray_iconWin.ico new file mode 100644 index 0000000000000000000000000000000000000000..a0893f67d506dcc134633c8a880f28369c1c3c4a GIT binary patch literal 15086 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 literal 0 HcmV?d00001 From 811e56f20be40f74aed54114d68d767a78a6f347 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 14:35:17 +0200 Subject: [PATCH 07/22] restore service without install handled by installer on win and mac --- main.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/main.go b/main.go index c5ef5dc76..32faea6ba 100755 --- a/main.go +++ b/main.go @@ -16,7 +16,9 @@ import ( //"github.com/sanderhahn/gozip" "github.com/gin-gonic/gin" "github.com/itsjamie/gin-cors" + "github.com/kardianos/service" "github.com/vharitonsky/iniflags" + "runtime" "runtime/debug" "text/template" "time" @@ -83,8 +85,63 @@ func launchSelfLater() { log.Println("Done waiting 5 secs. Now launching...") } +var logger service.Logger + +type program struct{} + +func (p *program) Start(s service.Service) error { + // Start should not block. Do the actual work async. + go p.run() + return nil +} +func (p *program) run() { + startDaemon() +} +func (p *program) Stop(s service.Service) error { + // Stop should not block. Return with a few seconds. + <-time.After(time.Second * 13) + return nil +} + func main() { + svcConfig := &service.Config{ + Name: "ArduinoCreateAgent", + DisplayName: "Arduino Create Agent", + Description: "A bridge that allows Arduino Create to operate on the boards connected to the computer", + } + + prg := &program{} + s, err := service.New(prg, svcConfig) + if err != nil { + log.Fatal(err) + } + if len(os.Args) > 1 { + err = service.Control(s, os.Args[1]) + if err != nil { + log.Fatal(err) + } + return + } + + logger, err = s.Logger(nil) + if err != nil { + log.Fatal(err) + } + + if runtime.GOOS == "linux" { + err = s.Install() + if err != nil { + logger.Error(err) + } + } + + err = s.Run() + if err != nil { + logger.Error(err) + } +} +func startDaemon() { go func() { // autoextract self From 9ad0c8d6b226620766ba7c4d0097e82fc13c247a Mon Sep 17 00:00:00 2001 From: Matteo Suppo Date: Wed, 15 Jul 2015 16:52:09 +0200 Subject: [PATCH 08/22] Fix duplication issues --- serial.go | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/serial.go b/serial.go index 3773e572f..4f45421e7 100755 --- a/serial.go +++ b/serial.go @@ -472,22 +472,24 @@ func spListDual(network bool) { // happen on windows in a fallback scenario where an // open port can't be identified because it is locked, // so just solve that by manually inserting - for port := range sh.ports { + if network { + for port := range sh.ports { - isFound := false - for _, item := range list { - if strings.ToLower(port.portConf.Name) == strings.ToLower(item.Name) { - isFound = true + isFound := false + for _, item := range list { + if strings.ToLower(port.portConf.Name) == strings.ToLower(item.Name) { + isFound = true + } } - } - if !isFound { - // artificially push to front of port list - log.Println(fmt.Sprintf("Did not find an open port in the serial port list. We are going to artificially push it onto the list. port:%v", port.portConf.Name)) - var ossp OsSerialPort - ossp.Name = port.portConf.Name - ossp.FriendlyName = port.portConf.Name - list = append([]OsSerialPort{ossp}, list...) + if !isFound { + // artificially push to front of port list + log.Println(fmt.Sprintf("Did not find an open port in the serial port list. We are going to artificially push it onto the list. port:%v", port.portConf.Name)) + var ossp OsSerialPort + ossp.Name = port.portConf.Name + ossp.FriendlyName = port.portConf.Name + list = append([]OsSerialPort{ossp}, list...) + } } } From c5d5060f92eaf3a45e8503d730e127f925ce9bc8 Mon Sep 17 00:00:00 2001 From: Matteo Suppo Date: Tue, 21 Jul 2015 16:06:02 +0200 Subject: [PATCH 09/22] Remove fallback completely --- serial.go | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/serial.go b/serial.go index 4f45421e7..6fb94fd4f 100755 --- a/serial.go +++ b/serial.go @@ -472,26 +472,26 @@ func spListDual(network bool) { // happen on windows in a fallback scenario where an // open port can't be identified because it is locked, // so just solve that by manually inserting - if network { - for port := range sh.ports { - - isFound := false - for _, item := range list { - if strings.ToLower(port.portConf.Name) == strings.ToLower(item.Name) { - isFound = true - } - } - - if !isFound { - // artificially push to front of port list - log.Println(fmt.Sprintf("Did not find an open port in the serial port list. We are going to artificially push it onto the list. port:%v", port.portConf.Name)) - var ossp OsSerialPort - ossp.Name = port.portConf.Name - ossp.FriendlyName = port.portConf.Name - list = append([]OsSerialPort{ossp}, list...) - } - } - } + // if network { + // for port := range sh.ports { + + // isFound := false + // for _, item := range list { + // if strings.ToLower(port.portConf.Name) == strings.ToLower(item.Name) { + // isFound = true + // } + // } + + // if !isFound { + // // artificially push to front of port list + // log.Println(fmt.Sprintf("Did not find an open port in the serial port list. We are going to artificially push it onto the list. port:%v", port.portConf.Name)) + // var ossp OsSerialPort + // ossp.Name = port.portConf.Name + // ossp.FriendlyName = port.portConf.Name + // list = append([]OsSerialPort{ossp}, list...) + // } + // } + // } // we have a full clean list of ports now. iterate thru them // to append the open/close state, baud rates, etc to make From f87f90f2fbd93938545bcb22f00f12fbdac4b180 Mon Sep 17 00:00:00 2001 From: Matteo Suppo Date: Thu, 23 Jul 2015 16:11:26 +0200 Subject: [PATCH 10/22] Use a faster implementation to avoid crashes when reading a lot of data --- main.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index 32faea6ba..3f5302023 100755 --- a/main.go +++ b/main.go @@ -310,14 +310,18 @@ const homeTemplateHtml = ` var socket; var msg = $("#msg"); - var log = $("#log"); + var log = document.getElementById('log'); + var messages = []; function appendLog(msg) { - var d = log[0] - var doScroll = d.scrollTop == d.scrollHeight - d.clientHeight; - msg.appendTo(log) + messages.push(msg); + if (messages.length > 100) { + messages.shift(); + } + var doScroll = log.scrollTop == log.scrollHeight - log.clientHeight; + log.innerHTML = messages.join("
"); if (doScroll) { - d.scrollTop = d.scrollHeight - d.clientHeight; + log.scrollTop = log.scrollHeight - log.clientHeight; } } @@ -343,7 +347,7 @@ const homeTemplateHtml = ` appendLog($("
Connection closed.
")) }); socket.on("message", function(evt) { - appendLog($("
").text(evt)) + appendLog(evt); }); } else { appendLog($("
Your browser does not support WebSockets.
")) From 6e67a18612e8f4e74305f7d88fd661bf554cfa77 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 16:09:01 +0200 Subject: [PATCH 11/22] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ab03a34f..23fe3006d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,12 @@ serial-port-json-server ======================= -Get the latest version of the Bridge for all supported platforms: http://downloads.arduino.cc/CreateBridge/CreateBridge.zip +Get the latest version of the Bridge for all supported platforms: +[Linux x64](http://downloads.arduino.cc/CreateBridge/ArduinoCreateAgent-1.0-linux-x64-installer.run) + +[MacOSX](http://downloads.arduino.cc/CreateBridge/ArduinoCreateAgent-1.0-osx-installer.dmg) + +[Windows](http://downloads.arduino.cc/CreateBridge/ArduinoCreateAgent-1.0-windows-installer.exe) Version 1.82 From 7b1f84cde1d7ee1d583957c90201aa9d79b2847f Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 16:09:13 +0200 Subject: [PATCH 12/22] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 23fe3006d..9c41f8a30 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ serial-port-json-server ======================= Get the latest version of the Bridge for all supported platforms: + [Linux x64](http://downloads.arduino.cc/CreateBridge/ArduinoCreateAgent-1.0-linux-x64-installer.run) [MacOSX](http://downloads.arduino.cc/CreateBridge/ArduinoCreateAgent-1.0-osx-installer.dmg) From e7a5c38b9092d54ffe8ea1bc37b25f3add207696 Mon Sep 17 00:00:00 2001 From: John Lauer Date: Mon, 1 Jun 2015 22:59:32 -0700 Subject: [PATCH 13/22] Got related ports working for windows Former-commit-id: 75ceb7c27963d5fbf9b77a65947e51eb85d9e13a --- seriallist_windows.go | 79 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/seriallist_windows.go b/seriallist_windows.go index a8cea1afa..ea20378e2 100644 --- a/seriallist_windows.go +++ b/seriallist_windows.go @@ -116,6 +116,48 @@ func getListViaWmiPnpEntity() ([]OsSerialPort, os.SyscallError) { list := make([]OsSerialPort, count) for i := 0; i < count; i++ { + + // items we're looping thru look like below and + // thus we can query for any of these names + /* + __GENUS : 2 + __CLASS : Win32_PnPEntity + __SUPERCLASS : CIM_LogicalDevice + __DYNASTY : CIM_ManagedSystemElement + __RELPATH : Win32_PnPEntity.DeviceID="USB\\VID_1D50&PID_606D&MI_02\\6&2F09EA14&0&0002" + __PROPERTY_COUNT : 24 + __DERIVATION : {CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement} + __SERVER : JOHN-ATIV + __NAMESPACE : root\cimv2 + __PATH : \\JOHN-ATIV\root\cimv2:Win32_PnPEntity.DeviceID="USB\\VID_1D50&PID_606D&MI_02\\6&2F09EA14 + &0&0002" + Availability : + Caption : TinyG v2 (Data Channel) (COM12) + ClassGuid : {4d36e978-e325-11ce-bfc1-08002be10318} + CompatibleID : {USB\Class_02&SubClass_02&Prot_01, USB\Class_02&SubClass_02, USB\Class_02} + ConfigManagerErrorCode : 0 + ConfigManagerUserConfig : False + CreationClassName : Win32_PnPEntity + Description : TinyG v2 (Data Channel) + DeviceID : USB\VID_1D50&PID_606D&MI_02\6&2F09EA14&0&0002 + ErrorCleared : + ErrorDescription : + HardwareID : {USB\VID_1D50&PID_606D&REV_0097&MI_02, USB\VID_1D50&PID_606D&MI_02} + InstallDate : + LastErrorCode : + Manufacturer : Synthetos (www.synthetos.com) + Name : TinyG v2 (Data Channel) (COM12) + PNPDeviceID : USB\VID_1D50&PID_606D&MI_02\6&2F09EA14&0&0002 + PowerManagementCapabilities : + PowerManagementSupported : + Service : usbser + Status : OK + StatusInfo : + SystemCreationClassName : Win32_ComputerSystem + SystemName : JOHN-ATIV + PSComputerName : JOHN-ATIV + */ + // item is a SWbemObject, but really a Win32_Process itemRaw, _ := oleutil.CallMethod(result, "ItemIndex", i) item := itemRaw.ToIDispatch() @@ -133,14 +175,41 @@ func getListViaWmiPnpEntity() ([]OsSerialPort, os.SyscallError) { list[i].Name = s list[i].FriendlyName = asString.ToString() //} + + // get the deviceid so we can figure out related ports + // it will look similar to + // USB\VID_1D50&PID_606D&MI_00\6&2F09EA14&0&0000 + deviceIdStr, _ := oleutil.GetProperty(item, "DeviceID") + devIdItems := strings.Split(deviceIdStr.ToString(), "&") + log.Printf("DeviceId elements:%v", devIdItems) + list[i].SerialNumber = devIdItems[3] + list[i].IdProduct = strings.Replace(devIdItems[1], "PID_", "", 1) + list[i].IdVendor = strings.Replace(devIdItems[0], "USB\\VID_", "", 1) + + manufStr, _ := oleutil.GetProperty(item, "Manufacturer") + list[i].Manufacturer = manufStr.ToString() + descStr, _ := oleutil.GetProperty(item, "Description") + list[i].Product = descStr.ToString() + //classStr, _ := oleutil.GetProperty(item, "CreationClassName") + //list[i].DeviceClass = classStr.ToString() + } - /* - for index, element := range list { - log.Println("index ", index, " element ", element.Name+ - " friendly ", element.FriendlyName) + for index, element := range list { + + log.Printf("index:%v, name:%v, friendly:%v ", index, element.Name, element.FriendlyName) + + for index2, element2 := range list { + if index == index2 { + continue + } + if element.SerialNumber == element2.SerialNumber { + log.Printf("Found related element1:%v, element2:%v", element, element2) + list[index].RelatedNames = append(list[index].RelatedNames, element2.Name) + } } - */ + + } return list, err } From e3e2f6a5b9ab537ccc34e2206d9c41f1b564b799 Mon Sep 17 00:00:00 2001 From: John Lauer Date: Tue, 2 Jun 2015 00:04:35 -0700 Subject: [PATCH 14/22] Better metadata for Windows Former-commit-id: e0371d9f990902ebbea209042d2059e024af7e91 --- seriallist_windows.go | 45 +++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/seriallist_windows.go b/seriallist_windows.go index ea20378e2..11db1001b 100644 --- a/seriallist_windows.go +++ b/seriallist_windows.go @@ -6,7 +6,8 @@ import ( "github.com/mattn/go-ole" "github.com/mattn/go-ole/oleutil" //"github.com/tarm/goserial" - "github.com/johnlauer/goserial" + //"github.com/johnlauer/goserial" + "github.com/facchinm/go-serial" "log" "os" "strings" @@ -14,6 +15,7 @@ import ( "strconv" "sync" //"syscall" + "regexp" ) var ( @@ -41,10 +43,12 @@ func getList() ([]OsSerialPort, os.SyscallError) { // see if array has any data, if not fallback to the traditional // com port list model - if len(arr) == 0 { - // assume it failed - arr, sysCallErr = getListViaOpen() - } + /* + if len(arr) == 0 { + // assume it failed + arr, sysCallErr = getListViaOpen() + } + */ // see if array has any data, if not fallback to looking at // the registry list @@ -182,9 +186,25 @@ func getListViaWmiPnpEntity() ([]OsSerialPort, os.SyscallError) { deviceIdStr, _ := oleutil.GetProperty(item, "DeviceID") devIdItems := strings.Split(deviceIdStr.ToString(), "&") log.Printf("DeviceId elements:%v", devIdItems) - list[i].SerialNumber = devIdItems[3] - list[i].IdProduct = strings.Replace(devIdItems[1], "PID_", "", 1) - list[i].IdVendor = strings.Replace(devIdItems[0], "USB\\VID_", "", 1) + if len(devIdItems) > 3 { + list[i].SerialNumber = devIdItems[3] + list[i].IdProduct = strings.Replace(devIdItems[1], "PID_", "", 1) + list[i].IdVendor = strings.Replace(devIdItems[0], "USB\\VID_", "", 1) + } else { + list[i].SerialNumber = deviceIdStr.ToString() + pidMatch := regexp.MustCompile("PID_(\\d+)").FindAllStringSubmatch(deviceIdStr.ToString(), -1) + if len(pidMatch) > 0 { + if len(pidMatch[0]) > 1 { + list[i].IdProduct = pidMatch[0][1] + } + } + vidMatch := regexp.MustCompile("VID_(\\d+)").FindAllStringSubmatch(deviceIdStr.ToString(), -1) + if len(vidMatch) > 0 { + if len(vidMatch[0]) > 1 { + list[i].IdVendor = vidMatch[0][1] + } + } + } manufStr, _ := oleutil.GetProperty(item, "Manufacturer") list[i].Manufacturer = manufStr.ToString() @@ -222,8 +242,13 @@ func getListViaOpen() ([]OsSerialPort, os.SyscallError) { var igood int = 0 for i := 0; i < 100; i++ { prtname := "COM" + strconv.Itoa(i) - conf := &serial.Config{Name: prtname, Baud: 9600} - sp, err := serial.OpenPort(conf) + //conf := &serial.Config{Name: prtname, Baud: 1200} + mode := &serial.Mode{ + BaudRate: 1200, + Vmin: 0, + Vtimeout: 10, + } + sp, err := serial.OpenPort(prtname, mode) //log.Println("Just tried to open port", prtname) if err == nil { //log.Println("Able to open port", prtname) From 79805100cc42a479f0921502cc4c3e21a53d437b Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 17:30:54 +0200 Subject: [PATCH 15/22] add board filtering on windows --- seriallist_windows.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/seriallist_windows.go b/seriallist_windows.go index 11db1001b..7fa6a46d3 100644 --- a/seriallist_windows.go +++ b/seriallist_windows.go @@ -23,6 +23,7 @@ var ( ) func removeNonArduinoBoards(ports []OsSerialPort) []OsSerialPort { + ports, _ = getList() return ports } @@ -177,7 +178,6 @@ func getListViaWmiPnpEntity() ([]OsSerialPort, os.SyscallError) { s = "COM" + s s = strings.Split(s, ")")[0] list[i].Name = s - list[i].FriendlyName = asString.ToString() //} // get the deviceid so we can figure out related ports @@ -206,6 +206,14 @@ func getListViaWmiPnpEntity() ([]OsSerialPort, os.SyscallError) { } } + if list[i].IdVendor != "2341" { + list[i].FriendlyName = asString.ToString() + } else { + archBoardName, boardName, _ := getBoardName("0x" + list[i].IdProduct) + list[i].RelatedNames = append(list[i].RelatedNames, archBoardName) + list[i].FriendlyName = strings.Trim(boardName, "\n") + } + manufStr, _ := oleutil.GetProperty(item, "Manufacturer") list[i].Manufacturer = manufStr.ToString() descStr, _ := oleutil.GetProperty(item, "Description") From e338c25fe49072d7bd68705e212c782f09a14357 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 17:39:25 +0200 Subject: [PATCH 16/22] modify installer splash --- installer_icons/InstallerSplash.png | Bin 7166 -> 4647 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/installer_icons/InstallerSplash.png b/installer_icons/InstallerSplash.png index 8525f710ee465f50a9b857fbbddcba08e179064c..0eeeed06ca4a9bb1e95aecbec43c0b450d98a383 100644 GIT binary patch literal 4647 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 ASO5S3 literal 7166 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 XZEiotzWj<9=mC@!H00}Kt=|0)f?J{M From 1964f65cc8fe4771f0c1d09209834685b3638443 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 17:40:32 +0200 Subject: [PATCH 17/22] add installBuilder xml project --- ArduinoCreateAgent.xml | 221 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 ArduinoCreateAgent.xml diff --git a/ArduinoCreateAgent.xml b/ArduinoCreateAgent.xml new file mode 100644 index 000000000..4d0367107 --- /dev/null +++ b/ArduinoCreateAgent.xml @@ -0,0 +1,221 @@ + + ArduinoCreateAgent + arduino-create-agent + 1.0 + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/LICENSE.md + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/installer_icons/Installer.png + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/installer_icons/InstallerIcon.png + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/installer_icons/InstallerSplash.png + auto + + + default + Default Component + 1 + 1 + 1 + + + Program Files + ${installdir} + programfiles + all + + + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/fakecerts/cert.pem + + + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/fakecerts/key.pem + + + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/config.ini + + + + + Uninstall + ${installdir}/${uninstallerName} + + Uninstall ${product_fullname} + ${installdir} + all + 0 + 0 + ${installdir}/${uninstallerName}.exe + + + ${installdir} + + + + + Program Files + ${installdir} + programfileslinux + linux-x64 + + + 1 + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/linux_amd64/Arduino_Create_Bridge + + + /tmp/linux/arduino/arduino + + + + + Program Files + ${installdir} + programfileswindows + windows + + + 1 + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/windows_386/Arduino_Create_Bridge.exe + + + /tmp/windows/arduino/arduino + + + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/installer_icons/tray_iconWin.ico + + + + + Program Files + ${installdir} + programfilesosx + osx + + + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/darwin_amd64/Arduino_Create_Bridge + + + /tmp/macosx/arduino/arduino + + + + + + + Uninstall ${product_fullname} + Uninstall ${product_fullname} + 0 + 0 + ${installdir}/${uninstallerName}.exe + + + ${installdir}/ + + + + Arduino Create Agent + 0 + 0 + ${installdir}/Arduino_Create_Bridge + + ${installdir}/tray_IconWin.ico + + + + + + + + /tmp/linux/arduino + + + /tmp/macosx/arduino + + + /tmp/windows/arduino + + + /tmp/linux/Arduino_Create_Bridge + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/linux_amd64/Arduino_Create_Bridge + + + /tmp/macosx/Arduino_Create_Bridge + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/darwin_amd64/Arduino_Create_Bridge + + + /tmp/windows/Arduino_Create_Bridge.exe + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/windows_386/Arduino_Create_Bridge.exe + + + /tmp/linux/arduino/ + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/linux_amd64/arduino.zip + + + /tmp/macosx/arduino/ + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/darwin_amd64/arduino.zip + + + /tmp/windows/arduino/ + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/snapshot/windows_386/arduino.zip + + + + + + 1 + ${installdir}/Arduino_Create_Bridge + + ${product_shortname} + + + + Arduino Create Agent + ArduinoCreateAgent + ${installdir}/Arduino_Create_Bridge.exe + + ${product_shortname} + auto + + + 15000 + + ${product_shortname} + + + ${installdir}/Arduino_Create_Bridge + & + + + linux + + + + + + + ${product_shortname} + + + ${product_shortname} + ${product_shortname} + + + 1 + 1 + 1 + 1 + Arduino LLC + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/src/github.com/facchinm/systray/example/icon/iconwin.ico + + + installdir + Installer.Parameter.installdir.description + Installer.Parameter.installdir.explanation + + ${platform_install_prefix}/${product_shortname}-${product_version} + 0 + yes + prefix + yes + 0 + 30 + + + + From 31a906995c3c129ae251bc4e5c6d79eac9d327c8 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Jul 2015 18:51:06 +0200 Subject: [PATCH 18/22] compile windows executable without console --- compile_webidebridge.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compile_webidebridge.sh b/compile_webidebridge.sh index 1cb3998b4..50c7cdfa5 100755 --- a/compile_webidebridge.sh +++ b/compile_webidebridge.sh @@ -65,8 +65,9 @@ compilePlatform() if [ $GOOS == "windows" ] then NAME=$NAME".exe" + EXTRAFLAGS="-ldflags -Hwindowsgui" fi - env GOOS=$GOOS GOARCH=$GOARCH CC=$CC CXX=$CC CGO_ENABLED=$CGO_ENABLED go build -o=$NAME + env GOOS=$GOOS GOARCH=$GOARCH CC=$CC CXX=$CC CGO_ENABLED=$CGO_ENABLED go build -o=$NAME $EXTRAFLASG if [ $? != 0 ] then echo -e "${red}Target $GOOS, $GOARCH failed${NC}" From fb2366363e8ce97099acc8aa8bb14fa615e36691 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 27 Jul 2015 10:52:13 +0200 Subject: [PATCH 19/22] remove daemon installation also on Linux --- main.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/main.go b/main.go index 3f5302023..fca1eda94 100755 --- a/main.go +++ b/main.go @@ -18,7 +18,6 @@ import ( "github.com/itsjamie/gin-cors" "github.com/kardianos/service" "github.com/vharitonsky/iniflags" - "runtime" "runtime/debug" "text/template" "time" @@ -128,13 +127,6 @@ func main() { log.Fatal(err) } - if runtime.GOOS == "linux" { - err = s.Install() - if err != nil { - logger.Error(err) - } - } - err = s.Run() if err != nil { logger.Error(err) From 711f97cc2d2b1869fcafcc2624592f41e2bc88bd Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 27 Jul 2015 11:06:55 +0200 Subject: [PATCH 20/22] move url to create-staging.arduino.cc --- trayicon.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trayicon.go b/trayicon.go index 4fbc0a1a0..0d2cd58cf 100644 --- a/trayicon.go +++ b/trayicon.go @@ -46,7 +46,7 @@ func setupSysTray() { func setupSysTrayReal() { systray.SetIcon(icon.Data) - mUrl := systray.AddMenuItem("Go to create.arduino.cc", "Arduino Create") + mUrl := systray.AddMenuItem("Go to Create (staging)", "Arduino Create") menuVer := systray.AddMenuItem("Agent version "+version, "") mQuit := systray.AddMenuItem("Quit", "Quit the bridge") @@ -62,6 +62,6 @@ func setupSysTrayReal() { // We can manipulate the systray in other goroutines go func() { <-mUrl.ClickedCh - open.Run("http://create-dev.arduino.cc") + open.Run("http://create-staging.arduino.cc") }() } From b3c046e0114cd23797fe228c2323c048f90cbd0e Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 27 Jul 2015 12:55:40 +0200 Subject: [PATCH 21/22] fix linker script for windows console-less --- compile_webidebridge.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compile_webidebridge.sh b/compile_webidebridge.sh index 50c7cdfa5..e0349461e 100755 --- a/compile_webidebridge.sh +++ b/compile_webidebridge.sh @@ -65,9 +65,9 @@ compilePlatform() if [ $GOOS == "windows" ] then NAME=$NAME".exe" - EXTRAFLAGS="-ldflags -Hwindowsgui" + EXTRAFLAGS="-ldflags -H=windowsgui" fi - env GOOS=$GOOS GOARCH=$GOARCH CC=$CC CXX=$CC CGO_ENABLED=$CGO_ENABLED go build -o=$NAME $EXTRAFLASG + env GOOS=$GOOS GOARCH=$GOARCH CC=$CC CXX=$CC CGO_ENABLED=$CGO_ENABLED go build -o=$NAME $EXTRAFLAGS if [ $? != 0 ] then echo -e "${red}Target $GOOS, $GOARCH failed${NC}" From 974ab345645219f4f67cdf49d9f66e10daebcc22 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 27 Jul 2015 15:24:46 +0200 Subject: [PATCH 22/22] update installer xml --- ArduinoCreateAgent.xml | 127 +++++++++++++++++++++++++++++++++++------ 1 file changed, 108 insertions(+), 19 deletions(-) diff --git a/ArduinoCreateAgent.xml b/ArduinoCreateAgent.xml index 4d0367107..93b7783c7 100644 --- a/ArduinoCreateAgent.xml +++ b/ArduinoCreateAgent.xml @@ -14,6 +14,22 @@ 1 1 1 + + + + ${installdir}/Arduino_Create_Bridge + ${installdir}/InstallerIcon.png + Arduino Create Agent + + linux-x64 + 0 + 0 + + + + + + Program Files @@ -61,6 +77,9 @@ /tmp/linux/arduino/arduino + + /home/jenkins/jenkins/jobs/Create_Bridge_test/workspace/installer_icons/InstallerIcon.png + @@ -95,6 +114,50 @@ + + Autostart + /etc/xdg/autostart + xdgautostart + linux-x64 + + + + ${installdir}/Arduino_Create_Bridge & + ${installdir}/InstallerIcon.png + arduino-create-agent + + linux-x64 + 0 + 0 + + + + + + + + + Autostart + ${windows_folder_common_startup} + winautostart + windows + + + + + + Arduino Create Agent + + windows + 0 + 0 + ${installdir}/Arduino_Create_Bridge.exe + + + + + + @@ -158,43 +221,69 @@ - 1 + 0 ${installdir}/Arduino_Create_Bridge ${product_shortname} - - Arduino Create Agent - ArduinoCreateAgent - ${installdir}/Arduino_Create_Bridge.exe - - ${product_shortname} - auto - - - 15000 - - ${product_shortname} - ${installdir}/Arduino_Create_Bridge & - linux + 1 + windows + + + + + schtasks + /create /sc onlogon /tn ArduinoCreateAgent /rl highest /tr "${installdir}/Arduino_Create_Bridge.exe" + Creating startup task + + + windows-2000 + + ${installdir}/Arduino_Create_Bridge.exe + & + Launching Agent + 0 + ${installdir} + + + windows + + + + + HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run + ArduinoCreateAgent + REG_SZ + "${installdir}/Arduino_Create_Bridge.exe" + + + windows + + + ${product_shortname} - - ${product_shortname} - ${product_shortname} - + + schtasks + /delete /tn ArduinoCreateAgent /f + + + windows-2000 + + + 1 1