You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/08/12 16:41:06 UTC

[plc4x] 05/06: feat(plc4xbrowser): added discover command

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit dc05bfa79a61b222bf7c94906da1b0a89a581d52
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Aug 12 18:38:30 2022 +0200

    feat(plc4xbrowser): added discover command
---
 plc4go/tools/plc4xbrowser/ui/actions.go  | 45 ++++++++++++++++++++++++--------
 plc4go/tools/plc4xbrowser/ui/commands.go | 22 ++++++++++++++++
 plc4go/tools/plc4xbrowser/ui/common.go   |  4 ++-
 plc4go/tools/plc4xbrowser/ui/ui.go       |  9 +++++--
 4 files changed, 66 insertions(+), 14 deletions(-)

diff --git a/plc4go/tools/plc4xbrowser/ui/actions.go b/plc4go/tools/plc4xbrowser/ui/actions.go
index 25fce0a5f..144201ff6 100644
--- a/plc4go/tools/plc4xbrowser/ui/actions.go
+++ b/plc4go/tools/plc4xbrowser/ui/actions.go
@@ -80,23 +80,46 @@ func validateDriverParam(driver string) error {
 	return errors.Errorf("protocol %s not found", driver)
 }
 
-func registerDriver(driver string) error {
-	switch driver {
+var tcpRegistered, udpRegistered bool
+
+func registerDriver(driverId string) error {
+	if _, ok := registeredDrivers[driverId]; ok {
+		return errors.Errorf("%s already registered", driverId)
+	}
+	var driver plc4go.PlcDriver
+	switch driverId {
 	case "ads":
-		driverManager.RegisterDriver(ads.NewDriver())
-		transports.RegisterTcpTransport(driverManager)
+		driver = ads.NewDriver()
+		driverManager.RegisterDriver(driver)
+		if !tcpRegistered {
+			transports.RegisterTcpTransport(driverManager)
+			tcpRegistered = true
+		}
 	case "bacnetip":
-		driverManager.RegisterDriver(bacnetip.NewDriver())
-		transports.RegisterUdpTransport(driverManager)
+		driver = bacnetip.NewDriver()
+		driverManager.RegisterDriver(driver)
+		if !udpRegistered {
+			transports.RegisterUdpTransport(driverManager)
+			udpRegistered = true
+		}
 	case "c-bus":
-		driverManager.RegisterDriver(cbus.NewDriver())
-		transports.RegisterTcpTransport(driverManager)
+		driver = cbus.NewDriver()
+		driverManager.RegisterDriver(driver)
+		if !tcpRegistered {
+			transports.RegisterTcpTransport(driverManager)
+			tcpRegistered = true
+		}
 	case "s7":
-		driverManager.RegisterDriver(s7.NewDriver())
-		transports.RegisterTcpTransport(driverManager)
+		driver = s7.NewDriver()
+		driverManager.RegisterDriver(driver)
+		if !tcpRegistered {
+			transports.RegisterTcpTransport(driverManager)
+			tcpRegistered = true
+		}
 	default:
-		return errors.Errorf("Unknown driver %s", driver)
+		return errors.Errorf("Unknown driver %s", driverId)
 	}
+	registeredDrivers[driverId] = driver
 	go driverAdded(driver)
 	return nil
 }
diff --git a/plc4go/tools/plc4xbrowser/ui/commands.go b/plc4go/tools/plc4xbrowser/ui/commands.go
index 1daee5800..95c48e2a4 100644
--- a/plc4go/tools/plc4xbrowser/ui/commands.go
+++ b/plc4go/tools/plc4xbrowser/ui/commands.go
@@ -44,6 +44,28 @@ var commands = map[inputMode]Command{
 var rootCommand = Command{
 	Name: rootCommandIndicator,
 	subCommands: []Command{
+		{
+			Name:        "discover",
+			Description: "Discovers devices",
+			action: func(_ Command, driverId string) error {
+				if driver, ok := registeredDrivers[driverId]; ok {
+					if !driver.SupportsDiscovery() {
+						return errors.Errorf("%s doesn't support discovery", driverId)
+					}
+					return driver.Discover(func(event model.PlcDiscoveryEvent) {
+						_, _ = fmt.Fprintf(messageOutput, "%v\n", event)
+					})
+				} else {
+					return errors.Errorf("%s not registered", driverId)
+				}
+			},
+			parameterSuggestions: func(currentText string) (entries []string) {
+				for _, protocol := range protocolList {
+					entries = append(entries, protocol)
+				}
+				return
+			},
+		},
 		{
 			Name:        "connect",
 			Description: "Connects to a device",
diff --git a/plc4go/tools/plc4xbrowser/ui/common.go b/plc4go/tools/plc4xbrowser/ui/common.go
index 78e5f7070..ee7b61a59 100644
--- a/plc4go/tools/plc4xbrowser/ui/common.go
+++ b/plc4go/tools/plc4xbrowser/ui/common.go
@@ -36,7 +36,8 @@ var protocolList = strings.Split(protocols, ",")
 var plc4xBrowserLog = zerolog.Nop()
 
 var driverManager plc4go.PlcDriverManager
-var driverAdded func(string)
+var registeredDrivers map[string]plc4go.PlcDriver
+var driverAdded func(driver plc4go.PlcDriver)
 var connections map[string]plc4go.PlcConnection
 var connectionsChanged func()
 
@@ -63,6 +64,7 @@ const (
 
 func init() {
 	hasShutdown = false
+	registeredDrivers = make(map[string]plc4go.PlcDriver)
 	connections = make(map[string]plc4go.PlcConnection)
 }
 
diff --git a/plc4go/tools/plc4xbrowser/ui/ui.go b/plc4go/tools/plc4xbrowser/ui/ui.go
index 7d3c30caf..fc53e0e6d 100644
--- a/plc4go/tools/plc4xbrowser/ui/ui.go
+++ b/plc4go/tools/plc4xbrowser/ui/ui.go
@@ -21,6 +21,7 @@ package ui
 
 import (
 	"fmt"
+	plc4go "github.com/apache/plc4x/plc4go/pkg/api"
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/gdamore/tcell/v2"
 	"github.com/pkg/errors"
@@ -92,9 +93,9 @@ func buildConnectionArea(newPrimitive func(text string) tview.Primitive, applica
 				AddItem(registeredDriverAreaHeader, 0, 0, 1, 1, 0, 0, false)
 			{
 				driverList := tview.NewList()
-				driverAdded = func(driver string) {
+				driverAdded = func(driver plc4go.PlcDriver) {
 					application.QueueUpdateDraw(func() {
-						driverList.AddItem(driver, "", 0x0, func() {
+						driverList.AddItem(driver.GetProtocolCode(), tview.Escape(fmt.Sprintf("%s", driver)), 0x0, func() {
 							//TODO: disconnect popup
 						})
 					})
@@ -138,6 +139,10 @@ func buildCommandArea(newPrimitive func(text string) tview.Primitive, applicatio
 				commandInputField.SetText("")
 				application.SetFocus(commandInputField)
 				return nil
+			case tcell.KeyCtrlD:
+				// TODO: maybe add a modal here
+				application.Stop()
+				return nil
 			}
 			return event
 		})