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
})