You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2024/04/04 19:46:39 UTC
(plc4x) 01/01: refactor: Moved the examples, integrations and other extra stuff into the new plc4x-extras repository
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/moving-stuff-to-extras
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit e1a3b8c39a5649302ca0da09779b5e3bad04bf3b
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Thu Apr 4 21:46:23 2024 +0200
refactor: Moved the examples, integrations and other extra stuff into the new plc4x-extras repository
---
plc4c/CMakeLists.txt | 2 -
plc4c/examples/CMakeLists.txt | 22 -
plc4c/examples/hello-subscriptions/CMakeLists.txt | 41 -
.../hello-subscriptions/src/hello_subscriptions.c | 285 ----
plc4c/examples/hello-world-modbus/CMakeLists.txt | 44 -
.../hello-world-modbus/src/hello_world_modbus.c | 355 -----
plc4c/examples/hello-world-s7/CMakeLists.txt | 69 -
plc4c/examples/hello-world-s7/src/hello_world_s7.c | 381 -----
.../hello-world-s7/src/hello_world_s7_loopback.c | 350 -----
plc4c/integrations/CMakeLists.txt | 20 -
plc4c/integrations/apache-mynewt/CMakeLists.txt | 23 -
.../testing/protocols/eip/DriverTestsuite.xml | 2 +-
plc4go/examples/ads/browse/Browse.go | 44 -
plc4go/examples/ads/discovery/Discovery.go | 36 -
plc4go/examples/ads/read/Read.go | 72 -
plc4go/examples/ads/subscribe/Subscribe.go | 70 -
plc4go/examples/ads/write/Write.go | 113 --
.../hello_world_plc4go_bacnet_discovery.go | 91 --
plc4go/examples/doc.go | 21 -
.../discovery/hello_world_plc4go_knx_discovery.go | 204 ---
.../hello_world_plc4go_knx_read_group_address.go | 95 --
.../hello_world_plc4go_knx_subscription.go | 123 --
plc4go/examples/read/hello_world_plc4go_read.go | 80 --
plc4go/examples/write/hello_world_plc4go_write.go | 77 -
.../bacnetip/readwrite/model/BACnetVendorId.go | 96 ++
.../knxnetip/readwrite/model/KnxManufacturer.go | 26 +-
plc4go/tools/plc4xbrowser/doc.go | 26 -
plc4go/tools/plc4xbrowser/main.go | 35 -
plc4go/tools/plc4xbrowser/ui/actions.go | 159 ---
plc4go/tools/plc4xbrowser/ui/commands.go | 803 -----------
plc4go/tools/plc4xbrowser/ui/common.go | 85 --
plc4go/tools/plc4xbrowser/ui/config.go | 186 ---
plc4go/tools/plc4xbrowser/ui/ui.go | 300 ----
plc4go/tools/plc4xpcapanalyzer/cmd/analyze.go | 82 --
plc4go/tools/plc4xpcapanalyzer/cmd/bacnet.go | 63 -
plc4go/tools/plc4xpcapanalyzer/cmd/cbus.go | 73 -
plc4go/tools/plc4xpcapanalyzer/cmd/extract.go | 66 -
plc4go/tools/plc4xpcapanalyzer/cmd/root.go | 128 --
plc4go/tools/plc4xpcapanalyzer/cmd/ui.go | 71 -
.../plc4xpcapanalyzer/config/AnalyzeConfig.go | 31 -
.../tools/plc4xpcapanalyzer/config/BacnetConfig.go | 31 -
.../tools/plc4xpcapanalyzer/config/CBusConfig.go | 41 -
.../plc4xpcapanalyzer/config/ExtractConfig.go | 39 -
.../tools/plc4xpcapanalyzer/config/PcapConfig.go | 34 -
.../tools/plc4xpcapanalyzer/config/RootConfig.go | 30 -
plc4go/tools/plc4xpcapanalyzer/doc.go | 26 -
.../internal/analyzer/analyzer.go | 271 ----
.../internal/bacnetanalyzer/analyzer.go | 52 -
.../internal/cbusanalyzer/analyzer.go | 340 -----
.../plc4xpcapanalyzer/internal/common/common.go | 72 -
.../internal/common/mock_FilteredPackage_test.go | 703 ---------
.../internal/extractor/extractor.go | 180 ---
.../internal/pcaphandler/pcaphandler.go | 86 --
plc4go/tools/plc4xpcapanalyzer/main.go | 26 -
plc4go/tools/plc4xpcapanalyzer/ui/actions.go | 153 --
plc4go/tools/plc4xpcapanalyzer/ui/commands.go | 724 ----------
plc4go/tools/plc4xpcapanalyzer/ui/common.go | 88 --
plc4go/tools/plc4xpcapanalyzer/ui/config.go | 203 ---
plc4go/tools/plc4xpcapanalyzer/ui/ui.go | 318 -----
.../java/bacnetip/readwrite/BACnetVendorId.java | 10 +
.../java/eip/{readwrite => base}/EIPDriverIT.java | 4 +-
.../EIPParserSerializerBigEndianTest.java | 4 +-
.../EIPParserSerializerLittleEndianTest.java | 4 +-
.../ManualEipTest.java} | 29 +-
.../plc4x/java/eip/base/tag/EipTagTest.java} | 12 +-
.../CompactLogixSimpleReadTest.java | 4 +-
.../eip/{readwrite => logix}/ManualEipIoTest.java | 4 +-
.../java/knxnetip/readwrite/KnxManufacturer.java | 5 +-
plc4j/examples/hello-ads-telemetry/pom.xml | 74 -
.../helloads/telemetry/DeviceManagerConstants.java | 55 -
.../helloads/telemetry/EtherCatDevice.java | 56 -
.../telemetry/EtherCatMasterConstants.java | 100 --
.../telemetry/HelloAdsEtherCatTelemetry.java | 175 ---
.../helloads/telemetry/HelloAdsTelemetry.java | 96 --
.../src/main/resources/logback.xml | 34 -
plc4j/examples/hello-cloud-azure/pom.xml | 59 -
.../java/examples/cloud/azure/CliOptions.java | 98 --
.../cloud/azure/S7PlcToAzureIoTHubSample.java | 97 --
plc4j/examples/hello-cloud-google/README.md | 61 -
plc4j/examples/hello-cloud-google/pom.xml | 89 --
.../java/examples/cloud/google/CliOptions.java | 221 ---
.../cloud/google/S7PlcToGoogleIoTCoreSample.java | 286 ----
.../src/main/resources/logback.xml | 34 -
.../hello-connectivity-mqtt/mqtt-connector.yml | 35 -
plc4j/examples/hello-connectivity-mqtt/pom.xml | 102 --
.../examples/connectivity/mqtt/MqttConnector.java | 155 --
.../connectivity/mqtt/model/Configuration.java | 56 -
.../connectivity/mqtt/model/MqttConfig.java | 56 -
.../connectivity/mqtt/model/PlcConfig.java | 57 -
.../connectivity/mqtt/model/PlcMemoryBlock.java | 41 -
.../connectivity/mqtt/model/PlcTagConfig.java | 69 -
.../src/main/resources/logback.xml | 34 -
plc4j/examples/hello-discovery/pom.xml | 80 --
.../java/examples/hellodiscovery/CliOptions.java | 72 -
.../examples/hellodiscovery/HelloDiscovery.java | 69 -
.../hello-discovery/src/main/resources/logback.xml | 36 -
plc4j/examples/hello-docker/Dockerfile | 116 --
.../hello-influx-data-collection/README.adoc | 36 -
.../example.properties | 32 -
.../examples/hello-influx-data-collection/pom.xml | 72 -
.../java/examples/helloinflux/HelloInflux.java | 160 ---
.../src/main/resources/logback.xml | 34 -
plc4j/examples/hello-integration-iotdb/pom.xml | 106 --
.../examples/integration/iotdb/CliOptions.java | 206 ---
.../examples/integration/iotdb/IIoTDBWriter.java | 26 -
.../integration/iotdb/IoTDBWriterWithJDBC.java | 86 --
.../integration/iotdb/IoTDBWriterWithSession.java | 88 --
.../java/examples/integration/iotdb/PlcLogger.java | 124 --
.../src/main/resources/logback.xml | 34 -
.../hello-kafka-connect-elasticsearch/README.md | 61 -
.../elasticsearch-sink.properties | 24 -
.../elasticsearch-worker.properties | 29 -
.../kafka-connect-config/plc4x-source.properties | 53 -
.../kafka-connect-config/plc4x-worker.properties | 29 -
plc4j/examples/hello-nats/pom.xml | 83 --
.../plc4x/java/examples/hellonats/CliOptions.java | 98 --
.../plc4x/java/examples/hellonats/HelloNats.java | 106 --
.../hello-nats/src/main/resources/logback.xml | 34 -
plc4j/examples/hello-opm/pom.xml | 81 --
.../plc4x/java/examples/helloopm/HelloOpm.java | 141 --
.../hello-opm/src/main/resources/logback.xml | 34 -
plc4j/examples/hello-webservice/README.adoc | 24 -
plc4j/examples/hello-webservice/pom.xml | 91 --
.../java/examples/hellowebservice/CliOptions.java | 98 --
.../examples/hellowebservice/HelloWebservice.java | 169 ---
.../src/main/resources/logback-test.xml | 36 -
plc4j/examples/hello-world-kotlin/pom.xml | 167 ---
.../java/examples/hellokotlin/ReadModbusPal.kt | 63 -
.../hello-world-plc4x-discover-and-browse/pom.xml | 81 --
.../HelloPlc4xDiscoverAndBrowse.java | 87 --
.../src/main/resources/logback.xml | 41 -
plc4j/examples/hello-world-plc4x-read/pom.xml | 80 --
.../java/examples/helloplc4x/read/CliOptions.java | 83 --
.../examples/helloplc4x/read/HelloPlc4xRead.java | 118 --
.../src/main/resources/logback.xml | 36 -
plc4j/examples/hello-world-plc4x-subscribe/pom.xml | 86 --
.../examples/helloplc4x/subscribe/CliOptions.java | 83 --
.../subscribe/HelloPlc4xSubscription.java | 131 --
.../src/main/resources/logback.xml | 36 -
plc4j/examples/hello-world-plc4x-write/pom.xml | 81 --
.../java/examples/helloplc4x/write/CliOptions.java | 98 --
.../examples/helloplc4x/write/HelloPlc4xWrite.java | 95 --
.../src/main/resources/logback.xml | 36 -
plc4j/examples/plc4j-s7event/pom.xml | 104 --
.../plc4j/s7event/PLcSetAndGetRtClock.java | 30 -
.../plc4j/s7event/PlcCycSubscriptionS7400H.java | 351 -----
.../plc4j/s7event/PlcEventSubscriptionS7400H.java | 116 --
.../plc4j/s7event/PlcReadAndWriteVIPA.java | 38 -
.../examples/plc4j/s7event/PlcReadDataS7400H.java | 300 ----
.../examples/plc4j/s7event/PlcReadS71200.java | 265 ----
.../plc4j/s7event/PlcReadWriteStrings.java | 434 ------
.../plc4j/s7event/PlcSzlRequestS7400H.java | 89 --
.../examples/plc4j/s7event/PlcWriteDataS7400H.java | 31 -
.../examples/plc4j/s7event/PlcWriteS71200.java | 31 -
plc4j/examples/poll-loop/pom.xml | 71 -
.../apache/plc4x/java/examples/pollloop/Main.java | 44 -
.../plc4x/java/examples/pollloop/PollLoop.java | 227 ---
plc4j/examples/pom.xml | 142 --
plc4j/integrations/apache-calcite/pom.xml | 110 --
.../main/java/org/apache/plc4x/Plc4xBaseTable.java | 198 ---
.../main/java/org/apache/plc4x/Plc4xSchema.java | 105 --
.../java/org/apache/plc4x/Plc4xSchemaFactory.java | 69 -
.../java/org/apache/plc4x/Plc4xStreamTable.java | 45 -
.../src/main/java/org/apache/plc4x/Plc4xTable.java | 39 -
.../java/org/apache/plc4x/DriverManagerTest.java | 87 --
.../java/org/apache/plc4x/Plc4XBaseTableTest.java | 52 -
.../org/apache/plc4x/Plc4xSchemaFactoryTest.java | 35 -
.../apache-calcite/src/test/resources/example.yml | 32 -
.../src/test/resources/logback-test.xml | 36 -
.../apache-calcite/src/test/resources/model.json | 24 -
plc4j/integrations/apache-kafka/README.md | 229 ---
.../apache-kafka/config/plc4x-sink.properties | 77 -
.../apache-kafka/config/plc4x-source.properties | 83 --
plc4j/integrations/apache-kafka/pom.xml | 195 ---
.../org/apache/plc4x/kafka/Plc4xSinkConnector.java | 122 --
.../java/org/apache/plc4x/kafka/Plc4xSinkTask.java | 268 ----
.../apache/plc4x/kafka/Plc4xSourceConnector.java | 141 --
.../org/apache/plc4x/kafka/Plc4xSourceTask.java | 333 -----
.../org/apache/plc4x/kafka/config/Constants.java | 92 --
.../java/org/apache/plc4x/kafka/config/Job.java | 95 --
.../apache/plc4x/kafka/config/JobReference.java | 64 -
.../java/org/apache/plc4x/kafka/config/Sink.java | 133 --
.../org/apache/plc4x/kafka/config/SinkConfig.java | 84 --
.../java/org/apache/plc4x/kafka/config/Source.java | 139 --
.../apache/plc4x/kafka/config/SourceConfig.java | 133 --
.../java/org/apache/plc4x/kafka/config/Tag.java | 59 -
.../org/apache/plc4x/kafka/util/VersionUtil.java | 32 -
.../apache-kafka/src/remote-resources/LICENSE | 7 -
.../apache-kafka/src/remote-resources/NOTICE | 4 -
.../apache/plc4x/kafka/config/SinkConfigTest.java | 130 --
.../apache/plc4x/kafka/config/SinkTaskTest.java | 145 --
.../plc4x/kafka/config/SourceConfigTest.java | 232 ---
.../apache/plc4x/kafka/config/SourceTaskTest.java | 101 --
.../kafka/properties/sink_task_no_error.properties | 62 -
.../properties/source_task_no_error.properties | 62 -
.../src/test/resources/logback-test.xml | 36 -
plc4j/integrations/apache-nifi/README.md | 180 ---
.../apache-nifi/nifi-plc4x-nar/bin/.gitignore | 2 -
.../apache-nifi/nifi-plc4x-nar/pom.xml | 89 --
.../apache-nifi/nifi-plc4x-processors/pom.xml | 179 ---
.../org/apache/plc4x/nifi/BasePlc4xProcessor.java | 388 -----
.../plc4x/nifi/Plc4xListenRecordProcessor.java | 308 ----
.../org/apache/plc4x/nifi/Plc4xSinkProcessor.java | 109 --
.../plc4x/nifi/Plc4xSinkRecordProcessor.java | 195 ---
.../apache/plc4x/nifi/Plc4xSourceProcessor.java | 118 --
.../plc4x/nifi/Plc4xSourceRecordProcessor.java | 203 ---
.../nifi/address/AddressesAccessStrategy.java | 47 -
.../plc4x/nifi/address/AddressesAccessUtils.java | 96 --
.../plc4x/nifi/address/BaseAccessStrategy.java | 124 --
.../address/DynamicPropertyAccessStrategy.java | 70 -
.../nifi/address/FilePropertyAccessStrategy.java | 79 --
.../nifi/address/TextPropertyAccessStrategy.java | 70 -
.../record/Plc4xFullReadResponseRowCallback.java | 32 -
.../nifi/record/Plc4xReadResponseRecordSet.java | 191 ---
.../nifi/record/Plc4xReadResponseRowCallback.java | 27 -
.../org/apache/plc4x/nifi/record/Plc4xWriter.java | 83 --
.../plc4x/nifi/record/RecordPlc4xWriter.java | 196 ---
.../org/apache/plc4x/nifi/record/SchemaCache.java | 139 --
.../nifi/subscription/Plc4xListenerDispatcher.java | 152 --
.../nifi/subscription/Plc4xSubscriptionType.java | 25 -
.../org/apache/plc4x/nifi/util/Plc4xCommon.java | 199 ---
.../services/org.apache.nifi.processor.Processor | 19 -
.../plc4x/nifi/Plc4xListenRecordProcessorTest.java | 80 --
.../apache/plc4x/nifi/Plc4xSinkProcessorTest.java | 93 --
.../plc4x/nifi/Plc4xSinkRecordProcessorTest.java | 110 --
.../plc4x/nifi/Plc4xSourceProcessorTest.java | 88 --
.../plc4x/nifi/Plc4xSourceRecordProcessorTest.java | 98 --
.../plc4x/nifi/address/AccessStrategyTest.java | 206 ---
.../apache/plc4x/nifi/record/SchemaCacheTest.java | 174 ---
.../apache/plc4x/nifi/util/Plc4xCommonTest.java | 214 ---
.../src/test/resources/logback-test.xml | 36 -
plc4j/integrations/apache-nifi/pom.xml | 159 ---
plc4j/integrations/pom.xml | 46 -
plc4j/pom.xml | 2 -
plc4j/tools/opcua-server/pom.xml | 208 ---
.../apache/plc4x/java/opcuaserver/OPCUAServer.java | 382 -----
.../opcuaserver/backend/Plc4xCommunication.java | 281 ----
.../java/opcuaserver/backend/Plc4xNamespace.java | 221 ---
.../opcuaserver/configuration/Configuration.java | 76 -
.../configuration/DeviceConfiguration.java | 49 -
.../configuration/PasswordConfiguration.java | 87 --
.../plc4x/java/opcuaserver/configuration/Tag.java | 41 -
.../plc4x/java/opcuaserver/configuration/User.java | 96 --
.../opcuaserver/context/CertificateGenerator.java | 127 --
.../opcuaserver/context/CertificateKeyPair.java | 37 -
.../opcua-server/src/main/resources/config.yml | 103 --
.../opcua-server/src/main/resources/logback.xml | 34 -
.../plc4x/java/opcuaserver/OpcuaPlcDriverTest.java | 244 ----
.../opcua-server/src/test/resources/config.yml | 103 --
.../src/test/resources/logback-test.xml | 36 -
plc4j/tools/plc4x-server/pom.xml | 161 ---
.../plc4x/java/tools/plc4xserver/Plc4xServer.java | 175 ---
.../plc4xserver/protocol/Plc4xServerAdapter.java | 176 ---
.../java/tools/plc4xserver/Plc4xServerTest.java | 131 --
plc4j/tools/pom.xml | 19 -
plc4j/tools/ui/application/pom.xml | 179 ---
.../java/tools/ui/Plc4xUiBackendApplication.java | 34 -
.../src/main/resources/application-dev.properties | 18 -
.../src/main/resources/application.properties | 31 -
.../ui/application/src/main/resources/logback.xml | 39 -
.../tools/ui/Plc4xUiBackendApplicationTests.java | 34 -
.../src/test/resources/application-test.properties | 19 -
plc4j/tools/ui/backend/pom.xml | 161 ---
.../tools/ui/configuration/Plc4xConfiguration.java | 34 -
.../tools/ui/configuration/WebSocketConfig.java | 43 -
.../java/tools/ui/controller/DeviceController.java | 64 -
.../java/tools/ui/controller/DriverController.java | 51 -
.../plc4x/java/tools/ui/event/DeviceEvent.java | 30 -
.../plc4x/java/tools/ui/event/EventType.java | 28 -
.../java/tools/ui/event/UiApplicationEvent.java | 42 -
.../java/tools/ui/handler/WebSocketHandler.java | 107 --
.../java/tools/ui/model/ConfigurationOption.java | 52 -
.../apache/plc4x/java/tools/ui/model/Device.java | 109 --
.../apache/plc4x/java/tools/ui/model/Driver.java | 49 -
.../plc4x/java/tools/ui/model/Transport.java | 49 -
.../java/tools/ui/repository/DeviceRepository.java | 30 -
.../plc4x/java/tools/ui/service/DeviceService.java | 82 --
.../plc4x/java/tools/ui/service/DriverService.java | 119 --
plc4j/tools/ui/backend/ws.html | 36 -
plc4j/tools/ui/frontend/pom.xml | 222 ---
plc4j/tools/ui/frontend/project/.eslintrc.cjs | 37 -
plc4j/tools/ui/frontend/project/.gitignore | 25 -
plc4j/tools/ui/frontend/project/README.md | 49 -
plc4j/tools/ui/frontend/project/index.html | 32 -
plc4j/tools/ui/frontend/project/package.json | 51 -
.../ui/frontend/project/public/plc4x-favicon.png | Bin 6065 -> 0 bytes
plc4j/tools/ui/frontend/project/src/App.css | 19 -
plc4j/tools/ui/frontend/project/src/App.tsx | 106 --
.../ui/frontend/project/src/assets/plc4x-logo.svg | 1494 --------------------
.../tools/ui/frontend/project/src/assets/react.svg | 23 -
.../project/src/components/DeviceDialog.tsx | 184 ---
.../project/src/components/NavigationTree.tsx | 221 ---
.../project/src/components/PlcConnection.tsx | 45 -
.../src/generated/plc4j-tools-ui-frontend.ts | 208 ---
plc4j/tools/ui/frontend/project/src/index.css | 102 --
.../ui/frontend/project/src/layouts/MainLayout.tsx | 73 -
plc4j/tools/ui/frontend/project/src/main.tsx | 37 -
.../ui/frontend/project/src/model/TreeItemData.ts | 37 -
.../tools/ui/frontend/project/src/pages/About.tsx | 24 -
.../ui/frontend/project/src/pages/Inspect.tsx | 140 --
plc4j/tools/ui/frontend/project/src/pages/Mqtt.tsx | 24 -
.../tools/ui/frontend/project/src/pages/OpcUa.tsx | 24 -
.../ui/frontend/project/src/pages/Settings.tsx | 24 -
plc4j/tools/ui/frontend/project/src/store/index.ts | 91 --
plc4j/tools/ui/frontend/project/src/vite-env.d.ts | 20 -
plc4j/tools/ui/frontend/project/tsconfig.json | 25 -
plc4j/tools/ui/frontend/project/tsconfig.node.json | 10 -
plc4j/tools/ui/frontend/project/vite.config.ts | 26 -
plc4j/tools/ui/pom.xml | 113 --
.../knxnetip/readwrite/model/KnxManufacturer.cs | 19 +-
.../protocols/bacnetip/bacnet-vendorids.mspec | 6 +
.../resources/protocols/eip/DriverTestsuite.xml | 2 +-
.../protocols/knxnetip/knx-master-data.mspec | 5 +-
.../src/main/resources/protocols/s7/messages.xml | 105 ++
reactors/all-drivers/pom.xml | 43 -
src/site/asciidoc/developers/building.adoc | 12 +-
src/site/asciidoc/developers/preparing/index.adoc | 8 +-
src/site/asciidoc/plc4go/index.adoc | 151 --
src/site/asciidoc/plc4j/index.adoc | 100 --
.../asciidoc/users/getting-started/plc4go.adoc | 2 +-
.../asciidoc/users/integrations/apache-iotdb.adoc | 2 +-
321 files changed, 306 insertions(+), 33104 deletions(-)
diff --git a/plc4c/CMakeLists.txt b/plc4c/CMakeLists.txt
index cf37df2fc2..6b8323442e 100644
--- a/plc4c/CMakeLists.txt
+++ b/plc4c/CMakeLists.txt
@@ -84,5 +84,3 @@ add_subdirectory(spi)
add_subdirectory(transports)
add_subdirectory(drivers)
add_subdirectory(tools)
-#add_subdirectory(integrations)
-add_subdirectory(examples)
diff --git a/plc4c/examples/CMakeLists.txt b/plc4c/examples/CMakeLists.txt
deleted file mode 100644
index 879651bdcb..0000000000
--- a/plc4c/examples/CMakeLists.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-#[[
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-]]
-
-add_subdirectory(hello-subscriptions)
-add_subdirectory(hello-world-modbus)
-add_subdirectory(hello-world-s7)
diff --git a/plc4c/examples/hello-subscriptions/CMakeLists.txt b/plc4c/examples/hello-subscriptions/CMakeLists.txt
deleted file mode 100644
index 67d72a8a63..0000000000
--- a/plc4c/examples/hello-subscriptions/CMakeLists.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-#[[
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-]]
-
-file(GLOB sources "src/*.c")
-
-add_executable(plc4c-examples-hello-subscriptions ${sources} src/hello_subscriptions.c)
-
-target_include_directories(plc4c-examples-hello-subscriptions
- PUBLIC
- "../../api/include"
- "../../drivers/simulated/include"
- "../../transports/dummy/include")
-
-IF (NOT WIN32)
- target_link_libraries(plc4c-examples-hello-subscriptions
- plc4c-spi plc4c-driver-simulated
- plc4c-transport-dummy
- m
- )
-ELSE()
- target_link_libraries(plc4c-examples-hello-subscriptions
- plc4c-spi plc4c-driver-simulated
- plc4c-transport-dummy
- )
-ENDIF()
diff --git a/plc4c/examples/hello-subscriptions/src/hello_subscriptions.c b/plc4c/examples/hello-subscriptions/src/hello_subscriptions.c
deleted file mode 100644
index e95f778e67..0000000000
--- a/plc4c/examples/hello-subscriptions/src/hello_subscriptions.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#include <plc4c/driver_simulated.h>
-#include <plc4c/plc4c.h>
-#include <plc4c/transport_dummy.h>
-#include <plc4c/utils/list.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../../../spi/include/plc4c/spi/types_private.h"
-
-enum plc4c_connection_state_t {
- CONNECTING,
- CONNECTED,
- SUBSCRIPTION_REQUEST_SENT,
- SUBSCRIPTION_RESPONSE_RECEIVED,
- READING_EVENTS,
- DISCONNECTING,
- DISCONNECTED
-};
-typedef enum plc4c_connection_state_t plc4c_connection_state;
-
-#pragma clang diagnostic push
-#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
-
-int main() {
- bool loop = true;
- plc4c_system *system = NULL;
- plc4c_connection *connection = NULL;
- plc4c_subscription_request *subscription_request = NULL;
- plc4c_subscription_request_execution *subscription_request_execution = NULL;
- int num_events = 0;
- void *subscription_handle = NULL;
-
- // Create a new uninitialized plc4c_system
- printf("Creating new PLC4C System (Initializing inner data-structures) ... ");
- plc4c_return_code result = plc4c_system_create(&system);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Manually register the "simulated" driver with the system.
- printf("Registering driver for the 'simulated' protocol ... ");
- plc4c_driver *simulated_driver = plc4c_driver_simulated_create();
- result = plc4c_system_add_driver(system, simulated_driver);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- printf("Registering transport for the 'dummy' transport ... ");
- plc4c_transport *dummy_transport = plc4c_transport_dummy_create();
- result = plc4c_system_add_transport(system, dummy_transport);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Initialize the plc4c_system (loading of drivers, setting up other stuff,
- // ...)
- printf(
- "Initializing the PLC4C system (Loading of drivers and transports) ... ");
- result = plc4c_system_init(system);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Establish connections to remote devices
- // you may or may not care about the connection handle
- printf("Connecting to 'simulated://foo' ... ");
- result = plc4c_system_connect(system, "simulated://foo", &connection);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
-
- // Central program loop ...
- plc4c_connection_state state = CONNECTING;
- while (loop) {
- printf("* ");
-
- // Give plc4c a chance to do something.
- // This is where all I/O is being done.
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- break;
- }
-
- // Depending on the current state, implement some logic.
- switch (state) {
- case CONNECTING: {
- // Check if the connection is established:
- if (plc4c_connection_get_connected(connection)) {
- printf("SUCCESS\n");
- state = CONNECTED;
- } else if (plc4c_connection_has_error(connection)) {
- printf("FAILED\n");
- return -1;
- }
- break;
- }
- case CONNECTED: {
- // Create a new subscription-request.
- printf("Preparing a subscription-request ... ");
- result = plc4c_connection_create_subscription_request(
- connection, &subscription_request);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- printf("Adding cyclic item for 'RANDOM/foo:INTEGER' ... ");
- result = plc4c_subscription_request_add_cyclic_item(
- subscription_request, "RANDOM/foo:INTEGER", 500);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Execute the subscription-request.
- printf("Executing a subscription-request ... ");
- result = plc4c_subscription_request_execute(
- subscription_request, &subscription_request_execution);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- } else {
- state = SUBSCRIPTION_REQUEST_SENT;
- }
- break;
- }
- // Wait until the read-request execution is finished.
- case SUBSCRIPTION_REQUEST_SENT: {
- if (plc4c_subscription_request_execution_check_finished_successfully(
- subscription_request_execution)) {
- printf("SUCCESS\n");
- state = SUBSCRIPTION_RESPONSE_RECEIVED;
- } else if (
- plc4c_subscription_request_execution_check_finished_with_error(
- subscription_request_execution)) {
- printf("FAILED\n");
- return -1;
- }
- break;
- }
- case SUBSCRIPTION_RESPONSE_RECEIVED: {
- // Get the response for the given subscription-request.
- plc4c_subscription_response *subscription_response =
- plc4c_subscription_request_execution_get_response(
- subscription_request_execution);
- if (subscription_response == NULL) {
- printf("FAILED (No Response)\n");
- return -1;
- }
-
- // Save the subsciption handle.
- plc4c_list_element *cur_element =
- plc4c_utils_list_head(subscription_response->response_items);
- plc4c_response_subscription_item *subscription_item_item =
- cur_element->value;
- printf("Value %s (%s):", subscription_item_item->item->name,
- plc4c_response_code_to_message(
- subscription_item_item->response_code));
- // Check if the response was ok.
- if (subscription_item_item->response_code == OK) {
- // Save the subscription handles...
- subscription_handle = subscription_item_item->subscription_handle;
- } else {
- printf("FAILED (No Response)\n");
- return -1;
- }
-
- // Clean up the subscription..
- plc4c_subscription_response_destroy(subscription_response);
- plc4c_subscription_request_execution_destroy(
- subscription_request_execution);
- plc4c_subscription_request_destroy(subscription_request);
-
- state = READING_EVENTS;
- break;
- }
- // Wait for 10 incoming events.
- case READING_EVENTS: {
- // Check if an event is available ...
- printf("Checking Events ... ");
- if (plc4c_subscription_check_data_available(subscription_handle)) {
- printf("New events available.\n");
-
- printf("Getting Events ... ");
- plc4c_list *events = NULL;
- result = plc4c_subscription_get_subscription_events(
- subscription_handle, &events);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- plc4c_list_element *cur_element = plc4c_utils_list_head(events);
- while (cur_element != NULL) {
- plc4c_response_subscription_item *subscription_event_item =
- cur_element->value;
-
- // TODO: Do something with the event ...
- printf("Got Event %s", subscription_event_item->item->name);
-
- // Increment the number of processed events.
- num_events++;
-
- cur_element = cur_element->next;
- }
-
- // If at least 10 events have been processed, disconnect.
- if (num_events > 10) {
- // Disconnect.
- printf("Disconnecting ... ");
- result = plc4c_connection_disconnect(connection);
- if (result != OK) {
- printf("FAILED");
- return -1;
- }
- state = DISCONNECTING;
- }
- } else {
- printf("No events.\n");
- }
- break;
- }
- // Wait until the connection is disconnected
- case DISCONNECTING: {
- if (!plc4c_connection_get_connected(connection)) {
- printf("SUCCESS\n");
- // we could let the system shut this down,
- // or do it ourselves
- plc4c_system_remove_connection(system, connection);
- plc4c_connection_destroy(connection);
- state = DISCONNECTED;
-
- // Terminate the main program loop.
- loop = false;
- }
- break;
- }
- case DISCONNECTED: {
- // End the loop.
- loop = false;
- break;
- }
- }
- }
-
- // Make sure everything is cleaned up correctly.
- plc4c_system_shutdown(system);
-
- // Finally destroy the plc4c_system, freeing up all memory allocated by plc4c.
- plc4c_system_destroy(system);
-
- return 0;
-}
-
-#pragma clang diagnostic pop
diff --git a/plc4c/examples/hello-world-modbus/CMakeLists.txt b/plc4c/examples/hello-world-modbus/CMakeLists.txt
deleted file mode 100644
index 8d73360bcb..0000000000
--- a/plc4c/examples/hello-world-modbus/CMakeLists.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-#[[
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-]]
-
-add_executable(plc4c-examples-hello-world-modbus
- src/hello_world_modbus.c
- )
-
-target_include_directories(plc4c-examples-hello-world-modbus
- PUBLIC
- "../../api/include"
- "../../spi/include"
- "../../drivers/modbus/include"
- "../../transports/tcp/include")
-
-IF (NOT WIN32)
- target_link_libraries(plc4c-examples-hello-world-modbus
- plc4c-spi
- plc4c-driver-modbus
- plc4c-transport-tcp
- m
- )
-ELSE()
- target_link_libraries(plc4c-examples-hello-world-modbus
- plc4c-spi
- plc4c-driver-modbus
- plc4c-transport-tcp
- )
-ENDIF()
diff --git a/plc4c/examples/hello-world-modbus/src/hello_world_modbus.c b/plc4c/examples/hello-world-modbus/src/hello_world_modbus.c
deleted file mode 100644
index 91b5d26b00..0000000000
--- a/plc4c/examples/hello-world-modbus/src/hello_world_modbus.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#include <plc4c/driver_modbus.h>
-#include <plc4c/plc4c.h>
-#include <plc4c/transport_tcp.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../../../spi/include/plc4c/spi/types_private.h"
-
-int numOpenConnections = 0;
-
-/**
- * Here we could implement something that keeps track of all open connections.
- * For example on embedded devices using the W5100 SPI Network device, this can
- * only handle 4 simultaneous connections.
- *
- * @param connection the connection that was just established
- */
-void onGlobalConnect(plc4c_connection *cur_connection) {
- printf("Connected to %s",
- plc4c_connection_get_connection_string(cur_connection));
- numOpenConnections++;
-}
-
-void onGlobalDisconnect(plc4c_connection *cur_connection) {
- printf("Disconnected from %s",
- plc4c_connection_get_connection_string(cur_connection));
- numOpenConnections--;
-}
-
-enum plc4c_connection_state_t {
- CONNECTING,
- CONNECTED,
- READ_REQUEST_SENT,
- READ_RESPONSE_RECEIVED,
- DISCONNECTING,
- DISCONNECTED
-};
-typedef enum plc4c_connection_state_t plc4c_connection_state;
-
-//#pragma clang diagnostic push
-//#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
-
-int main() {
- bool loop = true;
- plc4c_system *system = NULL;
- plc4c_connection *connection = NULL;
- plc4c_read_request *read_request = NULL;
- plc4c_read_request_execution *read_request_execution = NULL;
-
- // Create a new uninitialized plc4c_system
- printf("Creating new PLC4C System (Initializing inner data-structures) ... ");
- plc4c_return_code result = plc4c_system_create(&system);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Manually register the "simulated" driver with the system.
- printf("Registering driver for the 'modbus' protocol ... ");
- plc4c_driver *modbus_driver = plc4c_driver_modbus_create();
- result = plc4c_system_add_driver(system, modbus_driver);
- if (result != OK) {
- printf("FAILED adding modbus driver\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- plc4c_transport *tcp_transport = plc4c_transport_tcp_create();
- result = plc4c_system_add_transport(system, tcp_transport);
- if (result != OK) {
- printf("FAILED adding tcp transport\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Initialize the plc4c_system
- // (loading of drivers, setting up other stuff ...)
- printf(
- "Initializing the PLC4C system (Loading of drivers and transports) ... ");
- result = plc4c_system_init(system);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Register the global callbacks.
- plc4c_system_set_on_connect_success_callback(system, &onGlobalConnect);
- plc4c_system_set_on_disconnect_success_callback(system, &onGlobalDisconnect);
-
- // Establish connections to remote devices
- // you may or may not care about the connection handle
- printf("Connecting to 'modbus-tcp://192.168.23.30' ... ");
- result = plc4c_system_connect(system, "modbus-tcp://192.168.23.30:502", &connection);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
-
- // Central program loop ...
- plc4c_connection_state state = CONNECTING;
- while (loop) {
- printf("* ");
-
- // Give plc4c a chance to do something.
- // This is where all I/O is being done.
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- break;
- }
-
- // Depending on the current state, implement some logic.
- switch (state) {
- case CONNECTING: {
- // Check if the connection is established:
- if (plc4c_connection_get_connected(connection)) {
- printf("SUCCESS\n");
- state = CONNECTED;
- } else if (plc4c_connection_has_error(connection)) {
- printf("FAILED\n");
- return -1;
- }
- break;
- }
- case CONNECTED: {
- // Create a new read-request.
- printf("Preparing a read-request ... ");
- result =
- plc4c_connection_create_read_request(connection, &read_request);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- result = plc4c_read_request_add_tag_address(read_request, "BOOL",
- "holding-register:1:BOOL");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "BYTE",
- "holding-register:2:BYTE");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "WORD",
- "holding-register:3:WORD");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "DWORD",
- "holding-register:4:DWORD");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "LWORD",
- "holding-register:6:LWORD");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "SINT",
- "holding-register:10:SINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(
- read_request, "USINT", "holding-register:11:USINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "INT",
- "holding-register:12:INT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "UINT",
- "holding-register:13:UINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "DINT",
- "holding-register:14:DINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(
- read_request, "UDINT", "holding-register:16:UDINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "LINT",
- "holding-register:18:LINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(
- read_request, "ULINT", "holding-register:22:ULINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "REAL",
- "holding-register:26:REAL");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(
- read_request, "REAL", "holding-register:28:LREAL");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- // UTF-16 doesn't work well in a portable way
- printf("SUCCESS\n");
-
- // Execute the read-request.
- printf("Executing a read-request ... ");
- result =
- plc4c_read_request_execute(read_request, &read_request_execution);
-
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- } else {
- state = READ_REQUEST_SENT;
- }
- break;
- }
- // Wait until the read-request execution is finished.
- case READ_REQUEST_SENT: {
- if (plc4c_read_request_execution_check_finished_successfully(
- read_request_execution)) {
- printf("SUCCESS\n");
- state = READ_RESPONSE_RECEIVED;
- } else if (plc4c_read_request_execution_check_finished_with_error(
- read_request_execution)) {
- printf("FAILED\n");
- return -1;
- }
- break;
- }
- case READ_RESPONSE_RECEIVED: {
- // Get the response for the given read-request.
- plc4c_read_response *read_response =
- plc4c_read_request_execution_get_response(read_request_execution);
- if (read_response == NULL) {
- printf("FAILED (No Response)\n");
- return -1;
- }
-
- // Iterate over all returned items.
- plc4c_list_element *cur_element =
- plc4c_utils_list_tail(read_response->items);
- while (cur_element != NULL) {
- plc4c_response_value_item *value_item = cur_element->value;
-
- printf("Value %s (%s): ", value_item->item->name,
- plc4c_response_code_to_message(value_item->response_code));
- plc4c_data_printf(value_item->value);
- if (strcmp(value_item->item->name, "TIME") == 0) {
- printf(" (Duration in ms)");
- } else if (strcmp(value_item->item->name, "DATE") == 0) {
- printf(" (Days since 1990-01-01)");
- } else if ((strcmp(value_item->item->name, "TIME_OF_DAY") == 0) ||
- (strcmp(value_item->item->name, "TOD") == 0)) {
- printf(" (Number of ms since midnight)");
- }
- printf("\n");
-
- cur_element = cur_element->next;
- }
-
- // Clean up.
- plc4c_read_response_destroy(read_response);
- plc4c_read_request_execution_destroy(read_request_execution);
- plc4c_read_request_destroy(read_request);
-
- // Disconnect.
- printf("Disconnecting ... ");
- result = plc4c_connection_disconnect(connection);
- if (result != OK) {
- printf("FAILED");
- return -1;
- }
- state = DISCONNECTING;
-
- break;
- }
- // Wait until the connection is disconnected
- case DISCONNECTING: {
- if (!plc4c_connection_get_connected(connection)) {
- printf("SUCCESS\n");
- // we could let the system shut this down,
- // or do it ourselves
- plc4c_system_remove_connection(system, connection);
- plc4c_connection_destroy(connection);
- state = DISCONNECTED;
-
- // Terminate the main program loop.
- loop = false;
- }
- break;
- }
- case DISCONNECTED: {
- // End the loop.
- loop = false;
- break;
- }
- default: {
- }
- }
- }
-
- // Make sure everything is cleaned up correctly.
- plc4c_system_shutdown(system);
-
- // Finally destroy the plc4c_system, freeing up all memory allocated by plc4c.
- plc4c_system_destroy(system);
-
- return 0;
-}
-
-//#pragma clang diagnostic pop
diff --git a/plc4c/examples/hello-world-s7/CMakeLists.txt b/plc4c/examples/hello-world-s7/CMakeLists.txt
deleted file mode 100644
index cebad4f243..0000000000
--- a/plc4c/examples/hello-world-s7/CMakeLists.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-#[[
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-]]
-
-add_executable(plc4c-examples-hello-world-s7
- src/hello_world_s7.c
- )
-
-target_include_directories(
- plc4c-examples-hello-world-s7
- PUBLIC
- "../../api/include"
- "../../spi/include"
- "../../drivers/s7/include"
- "../../transports/tcp/include" )
-
-add_executable(plc4c-examples-loopback-s7
- src/hello_world_s7_loopback.c
- )
-
-target_include_directories(
- plc4c-examples-loopback-s7
- PUBLIC
- "../../api/include"
- "../../spi/include"
- "../../drivers/s7/include"
- "../../transports/tcp/include" )
-
-IF (NOT WIN32)
- target_link_libraries(plc4c-examples-hello-world-s7
- plc4c-spi
- plc4c-driver-s7
- plc4c-transport-tcp
- m
- )
- target_link_libraries(plc4c-examples-loopback-s7
- plc4c-spi
- plc4c-driver-s7
- plc4c-transport-tcp
- m
- )
-ELSE()
- target_link_libraries(plc4c-examples-hello-world-s7
- plc4c-spi
- plc4c-driver-s7
- plc4c-transport-tcp
- )
- target_link_libraries(plc4c-examples-loopback-s7
- plc4c-spi
- plc4c-driver-s7
- plc4c-transport-tcp
- )
-ENDIF()
-
diff --git a/plc4c/examples/hello-world-s7/src/hello_world_s7.c b/plc4c/examples/hello-world-s7/src/hello_world_s7.c
deleted file mode 100644
index dd8f4f4ea8..0000000000
--- a/plc4c/examples/hello-world-s7/src/hello_world_s7.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#include <plc4c/driver_s7.h>
-#include <plc4c/plc4c.h>
-#include <plc4c/transport_tcp.h>
-#include <stdio.h>
-#include <string.h>
-
-
-#include "../../../spi/include/plc4c/spi/types_private.h"
-
-#define DEFAULT_CONNECTION_TEST_STRING "s7:tcp://192.168.23.30:102"
-
-int numOpenConnections = 0;
-
-/**
- * Here we could implement something that keeps track of all open connections.
- * For example on embedded devices using the W5100 SPI Network device, this can
- * only handle 4 simultaneous connections.
- *
- * @param connection the connection that was just established
- */
-void onGlobalConnect(plc4c_connection *cur_connection) {
- printf("Connected to %s",
- plc4c_connection_get_connection_string(cur_connection));
- numOpenConnections++;
-}
-
-void onGlobalDisconnect(plc4c_connection *cur_connection) {
- printf("Disconnected from %s",
- plc4c_connection_get_connection_string(cur_connection));
- numOpenConnections--;
-}
-
-enum plc4c_connection_state_t {
- CONNECTING,
- CONNECTED,
- READ_REQUEST_SENT,
- READ_RESPONSE_RECEIVED,
- DISCONNECTING,
- DISCONNECTED
-};
-typedef enum plc4c_connection_state_t plc4c_connection_state;
-
-//#pragma clang diagnostic push
-//#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
-
-int main(int argc, char** argv) {
-
- char* connection_test_string;
- bool loop = true;
- plc4c_system *system = NULL;
- plc4c_connection *connection = NULL;
- plc4c_read_request *read_request = NULL;
- plc4c_read_request_execution *read_request_execution = NULL;
-
- if (argc == 1)
- connection_test_string = DEFAULT_CONNECTION_TEST_STRING;
- else
- connection_test_string = argv[1];
-
- // Create a new uninitialized plc4c_system
- printf("Creating new PLC4C System (Initializing inner data-structures) ... ");
- plc4c_return_code result = plc4c_system_create(&system);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Manually register the "s7" driver with the system.
- printf("Registering driver for the 's7' protocol ... ");
- plc4c_driver *s7_driver = plc4c_driver_s7_create();
- result = plc4c_system_add_driver(system, s7_driver);
- if (result != OK) {
- printf("FAILED adding s7 driver\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- printf("Registering driver for 'tcp' transport ... ");
- plc4c_transport *tcp_transport = plc4c_transport_tcp_create();
- result = plc4c_system_add_transport(system, tcp_transport);
- if (result != OK) {
- printf("FAILED adding tcp transport\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Initialize the plc4c_system
- // (loading of drivers, setting up other stuff ...)
- printf(
- "Initializing the PLC4C system (Loading of drivers and transports) ... ");
- result = plc4c_system_init(system);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- // Register the global callbacks.
- plc4c_system_set_on_connect_success_callback(system, &onGlobalConnect);
- plc4c_system_set_on_disconnect_success_callback(system, &onGlobalDisconnect);
-
- // Establish connections to remote devices
- // you may or may not care about the connection handle
-
- printf("Connecting to '%s' ... ", connection_test_string);
- result = plc4c_system_connect(system, connection_test_string, &connection);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
-
- // Central program loop ...
- plc4c_connection_state state = CONNECTING;
- while (loop) {
- printf("* ");
-
- // Give plc4c a chance to do something.
- // This is where all I/O is being done.
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- break;
- }
-
- // Depending on the current state, implement some logic.
- switch (state) {
- case CONNECTING: {
- // Check if the connection is established:
- if (plc4c_connection_get_connected(connection)) {
- printf("SUCCESS\n");
- state = CONNECTED;
- } else if (plc4c_connection_has_error(connection)) {
- printf("FAILED\n");
- return -1;
- }
- break;
- }
- case CONNECTED: {
- // Create a new read-request.
- printf("Preparing a read-request ... ");
- result =
- plc4c_connection_create_read_request(connection, &read_request);
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- printf("SUCCESS\n");
-
- result = plc4c_read_request_add_tag_address(read_request, "BOOL",
- "%DB4:0.0:BOOL");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "BYTE",
- "%DB4.1:BYTE");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "WORD",
- "%DB4.2:WORD");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "DWORD",
- "%DB4.4:DWORD");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "SINT",
- "%DB4.16:SINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "USINT",
- "%DB4.17:USINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "INT",
- "%DB4.18:INT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "UINT",
- "%DB4.20:UINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "DINT",
- "%DB4.22:DINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "UDINT",
- "%DB4.26:UDINT");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_tag_address(read_request, "REAL",
- "%DB4.46:REAL");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
-/* result =
- plc4c_read_request_add_item(read_request, "TIME", "%DB4:58:TIME");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result =
- plc4c_read_request_add_item(read_request, "DATE", "%DB4:70:DATE");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result = plc4c_read_request_add_item(read_request, "TIME_OF_DAY",
- "%DB4:72:TIME_OF_DAY");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result =
- plc4c_read_request_add_item(read_request, "TOD", "%DB4:76:TOD");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- result =
- plc4c_read_request_add_item(read_request, "CHAR", "%DB4:136:CHAR");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }
- // UTF-16 doesn't work well in a portable way
- result = plc4c_read_request_add_tag_address(read_request, "STRING",
- "%DB4:140:STRING(10)");
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- }*/
- // UTF-16 doesn't work well in a portable way
- printf("SUCCESS\n");
-
- // Execute the read-request.
- printf("Executing a read-request ... ");
- result =
- plc4c_read_request_execute(read_request, &read_request_execution);
-
- if (result != OK) {
- printf("FAILED\n");
- return -1;
- } else {
- state = READ_REQUEST_SENT;
- }
- break;
- }
- // Wait until the read-request execution is finished.
- case READ_REQUEST_SENT: {
- if (plc4c_read_request_execution_check_finished_successfully(
- read_request_execution)) {
- printf("SUCCESS\n");
- state = READ_RESPONSE_RECEIVED;
- } else if (plc4c_read_request_execution_check_finished_with_error(
- read_request_execution)) {
- printf("FAILED\n");
- return -1;
- }
- break;
- }
- case READ_RESPONSE_RECEIVED: {
- // Get the response for the given read-request.
- plc4c_read_response *read_response =
- plc4c_read_request_execution_get_response(read_request_execution);
- if (read_response == NULL) {
- printf("FAILED (No Response)\n");
- return -1;
- }
-
- // Iterate over all returned items.
- plc4c_list_element *cur_element =
- plc4c_utils_list_tail(read_response->items);
- while (cur_element != NULL) {
- plc4c_response_value_item *value_item = cur_element->value;
-
- printf("Value %s (%s): ", value_item->item->name,
- plc4c_response_code_to_message(value_item->response_code));
- plc4c_data_printf(value_item->value);
- if (strcmp(value_item->item->name, "TIME") == 0) {
- printf(" (Duration in ms)");
- } else if (strcmp(value_item->item->name, "DATE") == 0) {
- printf(" (Days since 1990-01-01)");
- } else if ((strcmp(value_item->item->name, "TIME_OF_DAY") == 0) ||
- (strcmp(value_item->item->name, "TOD") == 0)) {
- printf(" (Number of ms since midnight)");
- }
- printf("\n");
-
- cur_element = cur_element->next;
- }
-
- // Clean up.
- plc4c_read_response_destroy(read_response);
- plc4c_read_request_execution_destroy(read_request_execution);
- plc4c_read_request_destroy(read_request);
-
- // Disconnect.
- printf("Disconnecting ... ");
- result = plc4c_connection_disconnect(connection);
- if (result != OK) {
- printf("FAILED");
- return -1;
- }
- state = DISCONNECTING;
-
- break;
- }
- // Wait until the connection is disconnected
- case DISCONNECTING: {
- if (!plc4c_connection_get_connected(connection)) {
- printf("SUCCESS\n");
- // we could let the system shut this down,
- // or do it ourselves
- plc4c_system_remove_connection(system, connection);
- plc4c_connection_destroy(connection);
- state = DISCONNECTED;
-
- // Terminate the main program loop.
- loop = false;
- }
- break;
- }
- case DISCONNECTED: {
- // End the loop.
- loop = false;
- break;
- }
- default: {
- }
- }
-
- }
-
- // Make sure everything is cleaned up correctly.
- plc4c_system_shutdown(system);
-
- // Finally destroy the plc4c_system, freeing up all memory allocated by plc4c.
- plc4c_system_destroy(system);
-
- return 0;
-}
-
-//#pragma clang diagnostic pop
diff --git a/plc4c/examples/hello-world-s7/src/hello_world_s7_loopback.c b/plc4c/examples/hello-world-s7/src/hello_world_s7_loopback.c
deleted file mode 100644
index 8e5ff5b1dc..0000000000
--- a/plc4c/examples/hello-world-s7/src/hello_world_s7_loopback.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#define _GNU_SOURCE
-/*#ifndef CLOCK_MONOTONIC
-#define CLOCK_MONOTONIC 1
-#endif*/
-
-
-#include <plc4c/driver_s7.h>
-#include <plc4c/plc4c.h>
-#include <plc4c/transport_tcp.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "../../../spi/include/plc4c/spi/types_private.h"
-
-#define DEFAULT_CONNECTION_TEST_STRING "s7:tcp://0.0.0.0:102"
-#define TEST_DOUBLE_INT
-int numOpenConnections = 0;
-
-#ifndef _WIN32
- #include <unistd.h>
- #include <time.h>
- #define S7_LOOPBACK_TIME_IO
-#endif
-
-/**
- * Here we could implement something that keeps track of all open connections.
- * For example on embedded devices using the W5100 SPI Network device, this can
- * only handle 4 simultaneous connections.
- *
- * @param connection the connection that was just established
- */
-void onGlobalConnect(plc4c_connection *cur_connection) {
- printf("Connected to %s",
- plc4c_connection_get_connection_string(cur_connection));
- numOpenConnections++;
-}
-
-void onGlobalDisconnect(plc4c_connection *cur_connection) {
- printf("Disconnected from %s",
- plc4c_connection_get_connection_string(cur_connection));
- numOpenConnections--;
-}
-
-
-bool syncBoolLoop(plc4c_connection *conn,
- bool (passCallback)(plc4c_connection* conn),
- bool (failCallback)(plc4c_connection *conn) ) {
-
- plc4c_system *system;
- system = plc4c_connection_get_system(conn);
- while (true) {
- if (passCallback(conn))
- return EXIT_SUCCESS;
- else if (failCallback(conn))
- return EXIT_FAILURE;
- if (plc4c_system_loop(system) != OK)
- return EXIT_FAILURE;
- }
-}
-
-//#pragma clang diagnostic push
-//#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
-
-#define CHECK_RESULT(chk, ret, fs) do {if (chk) {printf(fs); return(ret);}} while(0)
-
-void get_user_loopback_values(int argc, char **argv, long *value) {
- int count = 0;
- while (count < argc)
- value[count++] = atol(argv[count]);
-}
-
-int main(int argc, char** argv) {
-
-#ifdef S7_LOOPBACK_TIME_IO
- struct timespec start, finish;
- long delta_us, diff_s, diff_ns;
-#endif
-
- char* connection_test_string;
- plc4c_return_code result;
- bool errorFlag = false;
- int idx = 0;
- plc4c_system *system = NULL;
- plc4c_connection *connection = NULL;
-
- plc4c_read_request *read_request = NULL;
- plc4c_read_request_execution *read_request_execution = NULL;
- plc4c_read_response *read_response;
-
- plc4c_write_request *write_request = NULL;
- plc4c_write_request_execution *write_request_execution = NULL;
- plc4c_write_response *write_response;
-
- plc4c_list_element *cur_element;
- plc4c_response_value_item *value_item;
-
- long loopback_value[7] = {0,0,0,0,0};
- plc4c_data *loopback_data;
-
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- bool doRead = 1;
- bool doWrite = 1;
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- // Connection string argument and do_write test arg (defaults to off as
- // not currently working)
- connection_test_string = DEFAULT_CONNECTION_TEST_STRING;
-
- // Initialisation and startup sequence
- result = plc4c_system_create(&system);
- CHECK_RESULT(result != OK, result, "plc4c_system_create failed\n");
- plc4c_driver *s7_driver = plc4c_driver_s7_create();
- result = plc4c_system_add_driver(system, s7_driver);
- CHECK_RESULT(result != OK, result, "plc4c_system_add_driver failed\n");
- plc4c_transport *tcp_transport = plc4c_transport_tcp_create();
- result = plc4c_system_add_transport(system, tcp_transport);
- CHECK_RESULT(result != OK, result, "plc4c_system_add_transport failed\n");
- result = plc4c_system_init(system);
- CHECK_RESULT(result != OK, result, "plc4c_system_init failed\n");
-
- // Register the global callbacks
- plc4c_system_set_on_connect_success_callback(system, &onGlobalConnect);
- plc4c_system_set_on_disconnect_success_callback(system, &onGlobalDisconnect);
-
- // Establish connections to remote devices
- result = plc4c_system_connect(system, connection_test_string, &connection);
- CHECK_RESULT(result != OK, result, "plc4c_system_connect failed\n");
-
- unsigned int loopTimes;
- if (argc >= 2)
- loopTimes = (unsigned int) atoi(argv[1]);
- else
- loopTimes = 1;
-
- unsigned int loopCount = 0;
- #define NREAD 3
- float valuetowrite[NREAD] = {1.1 ,2.2, 3.3};//, 5.5};
-
- #define ITEM_STR "%DB2:4.0:REAL[3]"
-
- // Central program loop ...
- syncBoolLoop(connection, plc4c_connection_get_connected, plc4c_connection_has_error);
- bool rtMalloc = false;
-
- while ( (!errorFlag) && (loopCount++ < loopTimes)) {
- if (doWrite) {
- { // Write request create scope
- if (loopCount == 1 || rtMalloc) {
- result = plc4c_connection_create_write_request(connection, &write_request);
- CHECK_RESULT(result != OK, result,"plc4c_connection_create_write_request failed\n");
- loopback_data = plc4c_data_create_real_array(valuetowrite,NREAD);
- valuetowrite[(loopCount-1)%NREAD]++;
- result = plc4c_write_request_add_item(write_request, ITEM_STR, loopback_data);
- } else {
- plc4c_data_update_values(loopback_data, valuetowrite);
- valuetowrite[(loopCount-1)%NREAD]++;
- //valuetowrite++;
- }
-
-
- #ifdef S7_LOOPBACK_TIME_IO
- clock_gettime(CLOCK_MONOTONIC,&start);
- #endif
-
- result = plc4c_write_request_execute(write_request, &write_request_execution);
-
- CHECK_RESULT(result != OK, result,"plc4c_write_request_execute failed\n");
-
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- break;
- }
- }
-
- { // Write request sent scope
- while(1) {
- if (plc4c_write_request_check_finished_successfully(write_request_execution)) {
- break;
- } else if (plc4c_write_request_execution_check_completed_with_error(write_request_execution)) {
- printf("FAILED\n");
- errorFlag = true;
- break;
- }
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- errorFlag = true;
- break;
- }
- }
- }
-
- { // WRITE_RESPONSE_RECEIVED scope
- write_response = plc4c_write_request_execution_get_response(write_request_execution);
- CHECK_RESULT(write_response == NULL, -1,"plc4c_write_request_execution_get_response failed (no response)\n");
- cur_element = plc4c_utils_list_tail(write_response->response_items);
- idx = 0;
- while (cur_element != NULL) {
- plc4c_response_item *checker = (plc4c_response_item*) cur_element->value;
- printf("Write item %d status: '%s'\n", idx++,
- plc4c_response_code_to_message(checker->response_code));
- cur_element = cur_element->next;
- }
-
- #ifdef S7_LOOPBACK_TIME_IO
- clock_gettime(CLOCK_MONOTONIC,&finish);
- diff_s = finish.tv_sec - start.tv_sec;
- diff_ns = finish.tv_nsec - start.tv_nsec;
- delta_us = (diff_s * 1000000L) + (diff_ns / 1000L);
- printf("Write %ldus%c", delta_us, doRead ? '\t' : '\n');
- #endif
-
- if (rtMalloc)
- plc4c_write_request_destroy(write_request);
-
- plc4c_write_response_destroy(write_response);
- plc4c_write_request_execution_destroy(write_request_execution);
-
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- break;
- }
- }
- } // end of doWrite
-
-
- if (doRead) {
- { // READ_REQUEST_CREATE scope
-
- result = plc4c_connection_create_read_request(connection, &read_request);
- CHECK_RESULT(result != OK, result, "plc4c_connection_create_read_request failed\n");
-
- result = plc4c_read_request_add_tag_address(read_request, "A_REQUEST",
- ITEM_STR);
- CHECK_RESULT(result != OK, result, "plc4c_read_request_add_tag_address failed\n");
-
- result = plc4c_read_request_execute(read_request, &read_request_execution);
- CHECK_RESULT(result != OK, result, "plc4c_read_request_execute failed\n");
-
- #ifdef S7_LOOPBACK_TIME_IO
- clock_gettime(CLOCK_MONOTONIC,&start);
- #endif
-
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- break;
- }
- }
-
-
- { // READ_REQUEST_SENT scope
- while(true) {
- if (plc4c_read_request_execution_check_finished_successfully(read_request_execution)) {
- #ifdef S7_LOOPBACK_TIME_IO
- clock_gettime(CLOCK_MONOTONIC,&finish);
- diff_s = finish.tv_sec - start.tv_sec;
- diff_ns = finish.tv_nsec - start.tv_nsec;
- delta_us = (diff_s * 1000000L) + (diff_ns / 1000L);
- printf("Read %ldus\n", delta_us);
- #endif
- break;
- } else if (plc4c_read_request_execution_check_finished_with_error(read_request_execution)) {
- printf("plc4c_read_request_execution_check_finished_with_error FAILED\n");
- errorFlag= true;
- break;
- }
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- errorFlag = true;
- break;
- }
- }
- }
-
-
- { // READ_RESPONSE_RECEIVED scope
-
- read_response = plc4c_read_request_execution_get_response(read_request_execution);
- CHECK_RESULT(read_response == NULL, -1, "plc4c_read_request_execution_get_response failed (No Response)\n");
-
- // Iterate over all returned items.
- cur_element = plc4c_utils_list_tail(read_response->items);
- while (cur_element != NULL) {
- value_item = cur_element->value;
- printf("Value %s (%s): ", value_item->item->name,
- plc4c_response_code_to_message(value_item->response_code));
- plc4c_data_printf(value_item->value);
- printf("\n");
- cur_element = cur_element->next;
- }
-
- plc4c_read_response_destroy(read_response);
- plc4c_read_request_execution_destroy(read_request_execution);
- plc4c_read_request_destroy(read_request);
-
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- errorFlag = true;
- break;
- }
- }
- } // end of do read
- }
-
- if (!rtMalloc && doWrite)
- plc4c_write_request_destroy(write_request);
-
- // Start disconnecting, break on error or dis-connection
- result = plc4c_connection_disconnect(connection);
- CHECK_RESULT(result != OK, -1,"plc4c_connection_disconnect failed\n");
-
- while (true) {
- if (plc4c_system_loop(system) != OK) {
- printf("ERROR in the system loop\n");
- return EXIT_FAILURE;
- } else if (!plc4c_connection_get_connected(connection)) {
- plc4c_system_remove_connection(system, connection);
- plc4c_connection_destroy(connection);
- break;
- }
- }
-
- // Make sure everything is cleaned up correctly then destroy the
- // plc4c_system, freeing up all memory allocated by plc4
- plc4c_system_shutdown(system);
- plc4c_system_destroy(system);
- return 0;
-}
-
-//#pragma clang diagnostic pop
diff --git a/plc4c/integrations/CMakeLists.txt b/plc4c/integrations/CMakeLists.txt
deleted file mode 100644
index 646d39b21f..0000000000
--- a/plc4c/integrations/CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-#[[
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-]]
-
-add_subdirectory(apache-mynewt)
diff --git a/plc4c/integrations/apache-mynewt/CMakeLists.txt b/plc4c/integrations/apache-mynewt/CMakeLists.txt
deleted file mode 100644
index daa62aa59a..0000000000
--- a/plc4c/integrations/apache-mynewt/CMakeLists.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-#[[
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-]]
-
-add_library(plc4c-integrations-apache-mynewt
- )
-
-target_link_libraries(plc4c-integrations-apache-mynewt ${CMAKE_DL_LIBS})
\ No newline at end of file
diff --git a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
index 4a41ee8f6f..8b478236db 100644
--- a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
@@ -245,7 +245,7 @@
<tags isList="true">
<tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
<name>hurz</name>
- <address>%rate</address>
+ <address>%A0:2</address>
</tag>
</tags>
</TestReadRequest>
diff --git a/plc4go/examples/ads/browse/Browse.go b/plc4go/examples/ads/browse/Browse.go
deleted file mode 100644
index c7c3bf268f..0000000000
--- a/plc4go/examples/ads/browse/Browse.go
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
-)
-
-func main() {
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterAdsDriver(driverManager)
- connectionChan := driverManager.GetConnection("ads:tcp://192.168.23.20?sourceAmsNetId=192.168.23.200.1.1&sourceAmsPort=65534&targetAmsNetId=192.168.23.20.1.1&targetAmsPort=851")
- connection := <-connectionChan
- browseRequest, err := connection.GetConnection().BrowseRequestBuilder().AddQuery("all", "MAIN.rivianTest01.RotationalPosition").Build()
- if err != nil {
- panic(err)
- }
- browseResponseChannel := browseRequest.Execute()
- browseResponse := <-browseResponseChannel
- print(browseResponse)
-}
diff --git a/plc4go/examples/ads/discovery/Discovery.go b/plc4go/examples/ads/discovery/Discovery.go
deleted file mode 100644
index e19cc19680..0000000000
--- a/plc4go/examples/ads/discovery/Discovery.go
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "context"
- "time"
-
- "github.com/apache/plc4x/plc4go/internal/ads"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-)
-
-func main() {
- discoverer := ads.NewDiscoverer()
- _ = discoverer.Discover(context.Background(), func(event apiModel.PlcDiscoveryItem) {
- print(event)
- })
- time.Sleep(time.Second * 5)
-}
diff --git a/plc4go/examples/ads/read/Read.go b/plc4go/examples/ads/read/Read.go
deleted file mode 100644
index 96d82afcf7..0000000000
--- a/plc4go/examples/ads/read/Read.go
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
-)
-
-func main() {
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterAdsDriver(driverManager)
- connectionChan := driverManager.GetConnection("ads:tcp://192.168.23.20?sourceAmsNetId=192.168.23.200.1.1&sourceAmsPort=65534&targetAmsNetId=192.168.23.20.1.1&targetAmsPort=851")
- connection := <-connectionChan
- readRequest, err := connection.GetConnection().ReadRequestBuilder().
- AddTagAddress("value-bool", "MAIN.hurz_BOOL").
- AddTagAddress("value-byte", "MAIN.hurz_BYTE").
- AddTagAddress("value-word", "MAIN.hurz_WORD").
- AddTagAddress("value-dword", "MAIN.hurz_DWORD").
- AddTagAddress("value-lword", "MAIN.hurz_LWORD").
- AddTagAddress("value-sint", "MAIN.hurz_SINT").
- AddTagAddress("value-usint", "MAIN.hurz_USINT").
- AddTagAddress("value-int", "MAIN.hurz_INT").
- AddTagAddress("value-uint", "MAIN.hurz_UINT").
- AddTagAddress("value-dint", "MAIN.hurz_DINT").
- AddTagAddress("value-udint", "MAIN.hurz_UDINT").
- AddTagAddress("value-lint", "MAIN.hurz_LINT").
- AddTagAddress("value-ulint", "MAIN.hurz_ULINT").
- AddTagAddress("value-real", "MAIN.hurz_REAL").
- AddTagAddress("value-lreal", "MAIN.hurz_LREAL").
- AddTagAddress("value-string", "MAIN.hurz_STRING").
- AddTagAddress("value-wstring", "MAIN.hurz_WSTRING").
- AddTagAddress("value-time", "MAIN.hurz_TIME").
- AddTagAddress("value-ltime", "MAIN.hurz_LTIME").
- AddTagAddress("value.date", "MAIN.hurz_DATE").
- AddTagAddress("value-time-of-day", "MAIN.hurz_TIME_OF_DAY").
- AddTagAddress("value-date-and-time", "MAIN.hurz_DATE_AND_TIME").
- AddTagAddress("value-struct", "MAIN.hurz_Struct").
- Build()
- if err != nil {
- panic(err)
- }
- readResponseChannel := readRequest.Execute()
- readResult := <-readResponseChannel
- readResponse := readResult.GetResponse()
- for _, tagName := range readResponse.GetTagNames() {
- plcValue := readResponse.GetValue(tagName)
- print(plcValue)
- }
-}
diff --git a/plc4go/examples/ads/subscribe/Subscribe.go b/plc4go/examples/ads/subscribe/Subscribe.go
deleted file mode 100644
index c39eb30dbb..0000000000
--- a/plc4go/examples/ads/subscribe/Subscribe.go
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "time"
-
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
-)
-
-func main() {
- zerolog.SetGlobalLevel(zerolog.InfoLevel)
-
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterAdsDriver(driverManager)
- connectionChan := driverManager.GetConnection("ads:tcp://192.168.23.20?sourceAmsNetId=192.168.23.200.1.1&sourceAmsPort=65534&targetAmsNetId=192.168.23.20.1.1&targetAmsPort=851")
- connection := <-connectionChan
-
- subscriptionRequest, err := connection.GetConnection().SubscriptionRequestBuilder().
- AddChangeOfStateTagAddress("value-int", "MAIN.rivianTest01.HorizontalPosition").
- AddPreRegisteredConsumer("value-int", func(event apiModel.PlcSubscriptionEvent) {
- value := event.GetValue("value-int")
- log.Info().Uint16("value", value.GetUint16()).Msg("Got value")
- }).
- Build()
- if err != nil {
- panic(err)
- }
- subscriptionResponseChannel := subscriptionRequest.Execute()
- subscriptionResult := <-subscriptionResponseChannel
- if subscriptionResult.GetErr() != nil {
- log.Error().Err(subscriptionResult.GetErr()).Msg("error in response")
- return
- }
- subscriptionResponse := subscriptionResult.GetResponse()
- for _, tagName := range subscriptionResponse.GetTagNames() {
- responseCode := subscriptionResponse.GetResponseCode(tagName)
- print(responseCode)
- }
-
- time.Sleep(200 * time.Second)
-
-}
diff --git a/plc4go/examples/ads/write/Write.go b/plc4go/examples/ads/write/Write.go
deleted file mode 100644
index a14eb53c1e..0000000000
--- a/plc4go/examples/ads/write/Write.go
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "time"
-
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- apiValues "github.com/apache/plc4x/plc4go/pkg/api/values"
- spiValues "github.com/apache/plc4x/plc4go/spi/values"
-
- "github.com/rs/zerolog/log"
-)
-
-func main() {
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterAdsDriver(driverManager)
- connectionChan := driverManager.GetConnection("ads:tcp://192.168.23.20?sourceAmsNetId=192.168.23.200.1.1&sourceAmsPort=65534&targetAmsNetId=192.168.23.20.1.1&targetAmsPort=851")
- connection := <-connectionChan
-
- duration, _ := time.ParseDuration("1.234S")
- lduration, _ := time.ParseDuration("24015H23M12.034002044S")
- date, _ := time.Parse("2014-11-12", "1978-03-28")
- timeOfDay, _ := time.Parse("11:45:26.371Z", "15:36:30.123")
- dateAndTime, _ := time.Parse("2014-11-12T11:45:26.371Z", "1996-05-06T15:36:30")
-
- // Prepare the data structure for a custom type.
- children := map[string]apiValues.PlcValue{}
- children["hurz_BOOL"] = spiValues.NewPlcBOOL(true)
- children["hurz_BYTE"] = spiValues.NewPlcBYTE(1)
- children["hurz_WORD"] = spiValues.NewPlcWORD(2)
- children["hurz_DWORD"] = spiValues.NewPlcDWORD(3)
- children["hurz_LWORD"] = spiValues.NewPlcLWORD(4)
- children["hurz_SINT"] = spiValues.NewPlcSINT(5)
- children["hurz_USINT"] = spiValues.NewPlcUSINT(6)
- children["hurz_INT"] = spiValues.NewPlcINT(7)
- children["hurz_UINT"] = spiValues.NewPlcUINT(8)
- children["hurz_DINT"] = spiValues.NewPlcDINT(9)
- children["hurz_UDINT"] = spiValues.NewPlcUDINT(10)
- children["hurz_LINT"] = spiValues.NewPlcLINT(11)
- children["hurz_ULINT"] = spiValues.NewPlcULINT(12)
- children["hurz_REAL"] = spiValues.NewPlcREAL(13.0)
- children["hurz_LREAL"] = spiValues.NewPlcLREAL(14.0)
- children["hurz_STRING"] = spiValues.NewPlcSTRING("hurz")
- children["hurz_WSTRING"] = spiValues.NewPlcWSTRING("wolf")
- children["hurz_TIME"] = spiValues.NewPlcTIME(duration)
- children["hurz_LTIME"] = spiValues.NewPlcLTIME(lduration)
- children["hurz_DATE"] = spiValues.NewPlcDATE(date)
- children["hurz_TIME_OF_DAY"] = spiValues.NewPlcTIME_OF_DAY(timeOfDay)
- children["hurz_DATE_AND_TIME"] = spiValues.NewPlcDATE_AND_TIME(dateAndTime)
- writeRequest, err := connection.GetConnection().WriteRequestBuilder().
- AddTagAddress("value-bool", "MAIN.hurz_BOOL", spiValues.NewPlcBOOL(true)). // 1
- AddTagAddress("value-byte", "MAIN.hurz_BYTE", spiValues.NewPlcBYTE(42)). // 1
- AddTagAddress("value-word", "MAIN.hurz_WORD", spiValues.NewPlcWORD(42424)). // 2
- AddTagAddress("value-dword", "MAIN.hurz_DWORD", spiValues.NewPlcDWORD(4242442424)). // 4
- AddTagAddress("value-lword", "MAIN.hurz_LWORD", spiValues.NewPlcLWORD(4242442424242424242)). // 8
- AddTagAddress("value-sint", "MAIN.hurz_SINT", spiValues.NewPlcSINT(-42)). // 1
- AddTagAddress("value-usint", "MAIN.hurz_USINT", spiValues.NewPlcUSINT(42)). // 1
- AddTagAddress("value-int", "MAIN.hurz_INT", spiValues.NewPlcINT(-2424)). // 2
- AddTagAddress("value-uint", "MAIN.hurz_UINT", spiValues.NewPlcUINT(42424)). // 2
- AddTagAddress("value-dint", "MAIN.hurz_DINT", spiValues.NewPlcDINT(-242442424)). // 4
- AddTagAddress("value-udint", "MAIN.hurz_UDINT", spiValues.NewPlcUDINT(4242442424)). // 4
- AddTagAddress("value-lint", "MAIN.hurz_LINT", spiValues.NewPlcLINT(-4242442424242424242)). // 8
- AddTagAddress("value-ulint", "MAIN.hurz_ULINT", spiValues.NewPlcULINT(4242442424242424242)). // 8
- AddTagAddress("value-real", "MAIN.hurz_REAL", spiValues.NewPlcREAL(3.14159265359)). // 4
- AddTagAddress("value-lreal", "MAIN.hurz_LREAL", spiValues.NewPlcLREAL(2.71828182846)). // 8
- AddTagAddress("value-string", "MAIN.hurz_STRING", spiValues.NewPlcSTRING("hurz")). // 4
- AddTagAddress("value-wstring", "MAIN.hurz_WSTRING", spiValues.NewPlcWSTRING("wolf")). // 8
- AddTagAddress("value-time", "MAIN.hurz_TIME", spiValues.NewPlcTIME(duration)).
- AddTagAddress("value-ltime", "MAIN.hurz_LTIME", spiValues.NewPlcLTIME(lduration)).
- AddTagAddress("value.date", "MAIN.hurz_DATE", spiValues.NewPlcDATE(date)).
- AddTagAddress("value-time-of-day", "MAIN.hurz_TIME_OF_DAY", spiValues.NewPlcTIME_OF_DAY(timeOfDay)).
- AddTagAddress("value-date-and-time", "MAIN.hurz_DATE_AND_TIME", spiValues.NewPlcDATE_AND_TIME(dateAndTime)).
- AddTagAddress("value-struct", "MAIN.hurz_Struct", spiValues.NewPlcStruct(children)).
- Build()
- if err != nil {
- panic(err)
- }
- writeResponseChannel := writeRequest.Execute()
- writeResult := <-writeResponseChannel
- if writeResult.GetErr() != nil {
- log.Error().Err(writeResult.GetErr()).Msg("error in response")
- return
- }
- writeResponse := writeResult.GetResponse()
- for _, tagName := range writeResponse.GetTagNames() {
- responseCode := writeResponse.GetResponseCode(tagName)
- print(responseCode)
- }
-}
diff --git a/plc4go/examples/bacnet/discovery/hello_world_plc4go_bacnet_discovery.go b/plc4go/examples/bacnet/discovery/hello_world_plc4go_bacnet_discovery.go
deleted file mode 100644
index 4e2c77b0a7..0000000000
--- a/plc4go/examples/bacnet/discovery/hello_world_plc4go_bacnet_discovery.go
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "fmt"
- "github.com/apache/plc4x/plc4go/spi/options"
- "os"
- "time"
-
- "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-
- "github.com/rs/zerolog/log"
-)
-
-func main() {
- logger := log.With().Str("myCustomLogger", "example").Logger()
-
- driverManager := plc4go.NewPlcDriverManager(
- options.WithCustomLogger(logger),
- options.WithTraceTransactionManagerTransactions(true),
- )
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterBacnetDriver(driverManager)
-
- var connectionStrings []string
- if len(os.Args) < 2 {
- // Try to auto-find bacnet devices via broadcast-message discovery
- if err := driverManager.Discover(func(event apiModel.PlcDiscoveryItem) {
- connStr := event.GetProtocolCode() + "://" + event.GetTransportUrl().Host
- log.Info().Str("connection string", connStr).Stringer("event", event.(fmt.Stringer)).Msg("Found Bacnet Gateway")
-
- connectionStrings = append(connectionStrings, connStr)
- },
- plc4go.WithDiscoveryOptionProtocolSpecific("who-is-low-limit", 0),
- plc4go.WithDiscoveryOptionProtocolSpecific("who-is-high-limit", "255"),
- plc4go.WithDiscoveryOptionProtocolSpecific("who-has-device-instance-range-low-limit", "0"),
- plc4go.WithDiscoveryOptionProtocolSpecific("who-has-device-instance-range-high-limit", "255"),
- // Either use name or the 2 identifier tuple below
- plc4go.WithDiscoveryOptionProtocolSpecific("who-has-object-name", "john"),
- //plc4go.WithDiscoveryOptionProtocolSpecific("who-has-object-identifier-type", "DEVICE"),
- //plc4go.WithDiscoveryOptionProtocolSpecific("who-has-object-identifier-instance", "133"),
- ); err != nil {
- panic(err)
- }
- // Wait for 5 seconds for incoming responses
- time.Sleep(time.Second * 50)
- } else {
- connStr := "bacnet-ip://" + os.Args[1] + ":47808"
- log.Info().Str("connection string", connStr).Msg("Using manually provided bacnet gateway")
- connectionStrings = append(connectionStrings, connStr)
- }
-
- for _, connStr := range connectionStrings {
- log.Info().Str("connection string", connStr).Msg("Connecting")
- crc := driverManager.GetConnection(connStr)
-
- // Wait for the driver to connect (or not)
- connectionResult := <-crc
- if connectionResult.GetErr() != nil {
- log.Error().Err(connectionResult.GetErr()).Msg("error connecting to PLC")
- return
- }
- log.Info().Str("connection string", connStr).Msg("Connected")
- connection := connectionResult.GetConnection()
- connection.BlockingClose()
- }
-}
diff --git a/plc4go/examples/doc.go b/plc4go/examples/doc.go
deleted file mode 100644
index e37a6323c5..0000000000
--- a/plc4go/examples/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Package examples contains some examples how to use plc4go (go part of plc4x)
-package examples
diff --git a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
deleted file mode 100644
index 2ccd9eeaf0..0000000000
--- a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "fmt"
- "os"
- "time"
-
- "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- "github.com/apache/plc4x/plc4go/pkg/api/logging"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
- "github.com/apache/plc4x/plc4go/spi/utils"
-
- "github.com/rs/zerolog/log"
-)
-
-func main() {
- // Set logging to INFO
- logging.InfoLevel()
-
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterKnxDriver(driverManager)
-
- var connectionStrings []string
- if len(os.Args) < 2 {
- // Try to auto-find KNX gateways via broadcast-message discovery
- _ = driverManager.Discover(func(event apiModel.PlcDiscoveryItem) {
- connStr := event.GetProtocolCode() + "://" + event.GetTransportUrl().Host
- log.Info().Str("connection string", connStr).Msg("Found KNX Gateway")
-
- connectionStrings = append(connectionStrings, connStr)
- })
- // Wait for 5 seconds for incoming responses
- time.Sleep(time.Second * 5)
- } else {
- connStr := "knxnet-ip://" + os.Args[1] + ":3671"
- log.Info().Str("connection string", connStr).Msg("Using manually provided KNX Gateway")
- connectionStrings = append(connectionStrings, connStr)
- }
-
- for _, connStr := range connectionStrings {
- log.Info().Str("connection string", connStr).Msg("Connecting")
- crc := driverManager.GetConnection(connStr)
-
- // Wait for the driver to connect (or not)
- connectionResult := <-crc
- if connectionResult.GetErr() != nil {
- log.Error().Err(connectionResult.GetErr()).Msg("error connecting to PLC")
- return
- }
- log.Info().Str("connection string", connStr).Msg("Connected")
- connection := connectionResult.GetConnection()
- connection.BlockingClose()
-
- // Try to find all KNX devices on the current network
- browseRequest, err := connection.BrowseRequestBuilder().
- AddQuery("allDevices", "[1-15].[1-15].[0-255]").
- //AddQuery("allMyDevices", "[1-3].[1-6].[0-60]").
- //AddQuery("onlyOneDevice", "1.1.20")
- Build()
- if err != nil {
- log.Error().Err(err).Msg("error creating browse request")
- return
- }
- brr := browseRequest.ExecuteWithInterceptor(func(result apiModel.PlcBrowseItem) bool {
- knxTag := result.GetTag()
- knxAddress := knxTag.GetAddressString()
- log.Info().Str("knxAddress", knxAddress).Msg("Inspecting detected Device at KNX Address")
-
- // Try to get all the com-objects and the group addresses they are attached to.
- browseRequest, err := connection.BrowseRequestBuilder().
- AddQuery("comObjects", knxAddress+"#com-obj").
- Build()
- if err != nil {
- log.Error().Err(err).Msg("error creating read request")
- return false
- }
- brr := browseRequest.Execute()
- browseResult := <-brr
- if browseResult.GetErr() != nil {
- log.Error().Err(browseResult.GetErr()).Msg("error executing the browse request for com-objects")
- return false
- }
- for _, result := range browseResult.GetResponse().GetQueryResults("comObjects") {
- permissions := ""
- if result.IsReadable() {
- permissions += "R"
- } else {
- permissions += " "
- }
- if result.IsWritable() {
- permissions += "W"
- } else {
- permissions += " "
- }
- if result.IsSubscribable() {
- permissions += "S"
- } else {
- permissions += " "
- }
- log.Info().
- Str("addressString", fmt.Sprintf("%15s", result.GetTag().GetAddressString())).
- Str("permissions", permissions).
- Str("name", result.GetName()).
- Msg(" - addressString (permissions) name")
- }
-
- readRequest, err := connection.ReadRequestBuilder().
- AddTagAddress("applicationProgramVersion", knxAddress+"#3/13").
- AddTagAddress("interfaceProgramVersion", knxAddress+"#4/13").
- Build()
- if err != nil {
- log.Error().Str("knxAddress", knxAddress).Msg("Error creating read request for scanning")
- return false
- }
-
- rrr := readRequest.Execute()
- readRequestResult := <-rrr
-
- if readRequestResult.GetErr() != nil {
- log.Error().Str("knxAddress", knxAddress).Msg("Error executing read request for reading device identification information")
- return false
- }
- readResponse := readRequestResult.GetResponse()
- var programVersion []byte
- if readResponse.GetResponseCode("applicationProgramVersion") == apiModel.PlcResponseCode_OK {
- programVersion = utils.PlcValueUint8ListToByteArray(readResponse.GetValue("applicationProgramVersion"))
- } else if readResponse.GetResponseCode("interfaceProgramVersion") == apiModel.PlcResponseCode_OK {
- programVersion = utils.PlcValueUint8ListToByteArray(readResponse.GetValue("interfaceProgramVersion"))
- }
- rb := utils.NewReadBufferByteBased(programVersion)
- manufacturerId := uint16(0)
- applicationId := uint16(0)
- applicationVersionMajor := uint8(0)
- applicationVersionMinor := uint8(0)
- if rb.GetTotalBytes() == 5 {
- manufacturerId, err = rb.ReadUint16("manufacturerId", 16)
- if err != nil {
- log.Error().Err(err).Msg("Error reading manufacturer id from")
- return false
- }
- applicationId, err = rb.ReadUint16("applicationId", 16)
- if err != nil {
- log.Error().Err(err).Msg("Error reading application id from")
- return false
- }
- applicationVersionMajor, err = rb.ReadUint8("applicationVersionMajor", 4)
- if err != nil {
- log.Error().Err(err).Str("knxAddress", knxAddress).Msg("Error reading application version major from knxAddress")
- return false
- }
- applicationVersionMinor, err = rb.ReadUint8("applicationVersionMinor", 4)
- if err != nil {
- log.Error().Err(err).Str("knxAddress", knxAddress).Msg("Error reading application version minor from knxAddress")
- return false
- }
- }
-
- log.Info().
- Uint16("manufacturerId", manufacturerId).
- Msg(" manufacturer id: manufacturerId")
- log.Info().
- Uint16("applicationId", applicationId).
- Uint8("applicationVersionMajor", applicationVersionMajor).
- Uint8("applicationVersionMinor", applicationVersionMinor).
- Msg(" program id: applicationId version applicationVersionMajor.applicationVersionMinor")
-
- return true
- })
- if brr == nil {
- log.Error().Msg("error executing browse request")
- return
- }
- select {
- case browseRequestResult := <-brr:
- log.Info().Stringer("browseRequestResult", browseRequestResult).Msg("Browse Request Result")
- }
- return
- }
-}
diff --git a/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go b/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go
deleted file mode 100644
index 9572ed5293..0000000000
--- a/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "fmt"
-
- "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- "github.com/apache/plc4x/plc4go/pkg/api/logging"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-)
-
-func main() {
- // Set logging to INFO
- logging.InfoLevel()
-
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterKnxDriver(driverManager)
-
- // Get a connection to a remote PLC
- crc := driverManager.GetConnection("knxnet-ip:udp://192.168.42.11")
-
- // Wait for the driver to connect (or not)
- connectionResult := <-crc
- if connectionResult.GetErr() != nil {
- fmt.Printf("error connecting to PLC: %s", connectionResult.GetErr().Error())
- return
- }
- connection := connectionResult.GetConnection()
-
- // Make sure the connection is closed at the end
- defer connection.BlockingClose()
-
- // Prepare a read-request
- readRequest, err := connection.ReadRequestBuilder().
- AddTagAddress("firstFlorTemperatures", "2/[1,2,4,6]/10:DPT_Value_Temp").
- AddTagAddress("secondFlorTemperatures", "3/[2,3,4,6]/10:DPT_Value_Temp").
- Build()
- if err != nil {
- fmt.Printf("error preparing read-request: %s", connectionResult.GetErr().Error())
- return
- }
-
- // Execute a read-request
- rrc := readRequest.Execute()
-
- // Wait for the response to finish
- rrr := <-rrc
- if rrr.GetErr() != nil {
- fmt.Printf("error executing read-request: %s", rrr.GetErr().Error())
- return
- }
-
- // Do something with the response
- for _, tagName := range rrr.GetResponse().GetTagNames() {
- if rrr.GetResponse().GetResponseCode(tagName) != apiModel.PlcResponseCode_OK {
- fmt.Printf("error an non-ok return code for tag %s: %s\n", tagName, rrr.GetResponse().GetResponseCode(tagName).GetName())
- continue
- }
-
- value := rrr.GetResponse().GetValue(tagName)
- if value == nil {
- fmt.Printf("Got nil for tag %s\n", tagName)
- } else if value.GetStruct() != nil {
- for address, structValue := range value.GetStruct() {
- fmt.Printf("Got result for tag %s with address: %s: %s °C\n", tagName, address, structValue.GetString())
- }
- } else {
- fmt.Printf("Got result for tag %s: %s °C\n", tagName, value.GetString())
- }
- }
-}
diff --git a/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go b/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go
deleted file mode 100644
index 8a0dafe7b6..0000000000
--- a/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "fmt"
- "strings"
- "time"
-
- "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- "github.com/apache/plc4x/plc4go/pkg/api/logging"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
- apiValues "github.com/apache/plc4x/plc4go/pkg/api/values"
-)
-
-func main() {
- // Set logging to INFO
- logging.InfoLevel()
-
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterKnxDriver(driverManager)
-
- // Get a connection to a remote PLC
- crc := driverManager.GetConnection("knxnet-ip:udp://192.168.42.11")
-
- // Wait for the driver to connect (or not)
- connectionResult := <-crc
- if connectionResult.GetErr() != nil {
- fmt.Printf("error connecting to PLC: %s", connectionResult.GetErr().Error())
- return
- }
- connection := connectionResult.GetConnection()
-
- // Make sure the connection is closed at the end
- defer connection.BlockingClose()
-
- // Prepare a subscription-request
- if subscriptionRequest, err := connection.SubscriptionRequestBuilder().
- // Intentionally catching all without datatype and the temperature apiValues of the first floor with type
- AddChangeOfStateTagAddress("all", "*/*/*").
- AddChangeOfStateTagAddress("firstFlorTemperatures", "2/[1,2,4,6]/10:DPT_Value_Temp").
- AddPreRegisteredConsumer("all", func(event apiModel.PlcSubscriptionEvent) {
- // Iterate over all tags that were triggered in the current event.
- for _, tagName := range event.GetTagNames() {
- if event.GetResponseCode(tagName) == apiModel.PlcResponseCode_OK {
- address := event.GetAddress(tagName)
- value := event.GetValue(tagName)
- // If the plc-value was a raw-plcValue, we will try lazily decode the value
- // In my installation all group addresses ending with "/10" are temperature apiValues
- // and ending on "/0" are light switch actions.
- // So if I find a group address ending on that, decode it with a given type name,
- // If not, simply output it as array of USINT apiValues.
- switch value.(type) {
- case apiValues.RawPlcValue:
- rawValue := value.(apiValues.RawPlcValue)
- datatypeName := "USINT"
- if strings.HasSuffix(address, "/10") {
- datatypeName = "DPT_Value_Temp"
- } else if strings.HasSuffix(address, "/0") {
- datatypeName = "BOOL"
- }
- fmt.Printf("Got raw-value event for address %s: ", address)
- if !rawValue.RawHasMore() {
- fmt.Printf("nothing")
- }
- for rawValue.RawHasMore() {
- value = rawValue.RawDecodeValue(datatypeName)
- fmt.Printf(" '%s'", value.GetString())
- }
- fmt.Printf("\n")
- default:
- fmt.Printf("Got event for address %s: %s\n", address, value.GetString())
- }
- }
- }
- }).Build(); err == nil {
- // Execute a subscription-request
- rrc := subscriptionRequest.Execute()
-
- // Wait for the response to finish
- rrr := <-rrc
- if rrr.GetErr() != nil {
- fmt.Printf("error executing subscription-request: %s", rrr.GetErr().Error())
- return
- }
-
- // Do something with the response
- for _, tagName := range rrr.GetResponse().GetTagNames() {
- if rrr.GetResponse().GetResponseCode(tagName) != apiModel.PlcResponseCode_OK {
- fmt.Printf("error an non-ok return code for tag %s: %s\n", tagName, rrr.GetResponse().GetResponseCode(tagName).GetName())
- continue
- }
- }
-
- time.Sleep(time.Minute * 5)
- } else {
- fmt.Printf("error preparing subscription-request: %s", connectionResult.GetErr().Error())
- return
- }
-}
diff --git a/plc4go/examples/read/hello_world_plc4go_read.go b/plc4go/examples/read/hello_world_plc4go_read.go
deleted file mode 100644
index dfe89e4960..0000000000
--- a/plc4go/examples/read/hello_world_plc4go_read.go
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "fmt"
-
- "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-)
-
-func main() {
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterModbusTcpDriver(driverManager)
-
- // Get a connection to a remote PLC
- crc := driverManager.GetConnection("modbus-tcp://192.168.23.30")
-
- // Wait for the driver to connect (or not)
- connectionResult := <-crc
- if connectionResult.GetErr() != nil {
- fmt.Printf("error connecting to PLC: %s", connectionResult.GetErr().Error())
- return
- }
- connection := connectionResult.GetConnection()
-
- // Make sure the connection is closed at the end
- defer connection.BlockingClose()
-
- // Prepare a read-request
- readRequest, err := connection.ReadRequestBuilder().
- AddTagAddress("tag", "holding-register:26:REAL").
- Build()
- if err != nil {
- fmt.Printf("error preparing read-request: %s", connectionResult.GetErr().Error())
- return
- }
-
- // Execute a read-request
- rrc := readRequest.Execute()
-
- // Wait for the response to finish
- rrr := <-rrc
- if rrr.GetErr() != nil {
- fmt.Printf("error executing read-request: %s", rrr.GetErr().Error())
- return
- }
-
- // Do something with the response
- if rrr.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK {
- fmt.Printf("error an non-ok return code: %s", rrr.GetResponse().GetResponseCode("tag").GetName())
- return
- }
-
- value := rrr.GetResponse().GetValue("tag")
- fmt.Printf("Got result %f", value.GetFloat32())
-}
diff --git a/plc4go/examples/write/hello_world_plc4go_write.go b/plc4go/examples/write/hello_world_plc4go_write.go
deleted file mode 100644
index 6f5765c82f..0000000000
--- a/plc4go/examples/write/hello_world_plc4go_write.go
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "fmt"
-
- "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/drivers"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-)
-
-func main() {
- driverManager := plc4go.NewPlcDriverManager()
- defer func() {
- if err := driverManager.Close(); err != nil {
- panic(err)
- }
- }()
- drivers.RegisterModbusTcpDriver(driverManager)
-
- // Get a connection to a remote PLC
- crc := driverManager.GetConnection("modbus-tcp://192.168.23.30")
-
- // Wait for the driver to connect (or not)
- connectionResult := <-crc
- if connectionResult.GetErr() != nil {
- fmt.Printf("error connecting to PLC: %s", connectionResult.GetErr().Error())
- return
- }
- connection := connectionResult.GetConnection()
-
- // Make sure the connection is closed at the end
- defer connection.BlockingClose()
-
- // Prepare a write-request
- writeRequest, err := connection.WriteRequestBuilder().
- AddTagAddress("tag", "holding-register:26:REAL", 2.7182818284).
- Build()
- if err != nil {
- fmt.Printf("error preparing read-request: %s", connectionResult.GetErr().Error())
- return
- }
-
- // Execute a read-request
- wrc := writeRequest.Execute()
-
- // Wait for the response to finish
- wrr := <-wrc
- if wrr.GetErr() != nil {
- fmt.Printf("error executing write-request: %s", wrr.GetErr().Error())
- return
- }
-
- if wrr.GetResponse().GetResponseCode("tag") != apiModel.PlcResponseCode_OK {
- fmt.Printf("error an non-ok return code: %s", wrr.GetResponse().GetResponseCode("tag").GetName())
- return
- }
- fmt.Print("Result: SUCCESS\n")
-}
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
index 5a66ba6653..63bf3d4e03 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
@@ -1503,6 +1503,12 @@ const (
BACnetVendorId_VERGE_SENSE BACnetVendorId = 1466
BACnetVendorId_SYSTEMAIR_MFG_INC BACnetVendorId = 1467
BACnetVendorId_SEELEY_INTERNATIONAL BACnetVendorId = 1468
+ BACnetVendorId_CRANE_BUILDING_SERVICES_UTILITIES BACnetVendorId = 1469
+ BACnetVendorId_BRADY_CORPORATION BACnetVendorId = 1470
+ BACnetVendorId_QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD BACnetVendorId = 1471
+ BACnetVendorId_GOLDEN_QUALITY_CO_LTD BACnetVendorId = 1472
+ BACnetVendorId_ELVACOAB BACnetVendorId = 1473
+ BACnetVendorId_STRONG_TECHNOLOGYLLC BACnetVendorId = 1474
BACnetVendorId_UNKNOWN_VENDOR BACnetVendorId = 0xFFFF
)
@@ -2971,6 +2977,12 @@ func init() {
BACnetVendorId_VERGE_SENSE,
BACnetVendorId_SYSTEMAIR_MFG_INC,
BACnetVendorId_SEELEY_INTERNATIONAL,
+ BACnetVendorId_CRANE_BUILDING_SERVICES_UTILITIES,
+ BACnetVendorId_BRADY_CORPORATION,
+ BACnetVendorId_QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD,
+ BACnetVendorId_GOLDEN_QUALITY_CO_LTD,
+ BACnetVendorId_ELVACOAB,
+ BACnetVendorId_STRONG_TECHNOLOGYLLC,
BACnetVendorId_UNKNOWN_VENDOR,
}
}
@@ -5061,10 +5073,34 @@ func (e BACnetVendorId) VendorId() uint16 {
{ /* '1468' */
return 1468
}
+ case 1469:
+ { /* '1469' */
+ return 1469
+ }
case 147:
{ /* '147' */
return 147
}
+ case 1470:
+ { /* '1470' */
+ return 1470
+ }
+ case 1471:
+ { /* '1471' */
+ return 1471
+ }
+ case 1472:
+ { /* '1472' */
+ return 1472
+ }
+ case 1473:
+ { /* '1473' */
+ return 1473
+ }
+ case 1474:
+ { /* '1474' */
+ return 1474
+ }
case 148:
{ /* '148' */
return 148
@@ -10923,10 +10959,34 @@ func (e BACnetVendorId) VendorName() string {
{ /* '1468' */
return "Seeley International"
}
+ case 1469:
+ { /* '1469' */
+ return "Crane Building Services & Utilities"
+ }
case 147:
{ /* '147' */
return "Integrated Information Systems, Inc."
}
+ case 1470:
+ { /* '1470' */
+ return "Brady Corporation"
+ }
+ case 1471:
+ { /* '1471' */
+ return "Qingdao Hisense Hitachi Air-Conditioning Systems Co., Ltd."
+ }
+ case 1472:
+ { /* '1472' */
+ return "Golden Quality Co. Ltd."
+ }
+ case 1473:
+ { /* '1473' */
+ return "Elvaco AB"
+ }
+ case 1474:
+ { /* '1474' */
+ return "Strong Technology, LLC"
+ }
case 148:
{ /* '148' */
return "Temco Controls, Ltd."
@@ -15742,8 +15802,20 @@ func BACnetVendorIdByValue(value uint16) (enum BACnetVendorId, ok bool) {
return BACnetVendorId_SYSTEMAIR_MFG_INC, true
case 1468:
return BACnetVendorId_SEELEY_INTERNATIONAL, true
+ case 1469:
+ return BACnetVendorId_CRANE_BUILDING_SERVICES_UTILITIES, true
case 147:
return BACnetVendorId_INTEGRATED_INFORMATION_SYSTEMS_INC, true
+ case 1470:
+ return BACnetVendorId_BRADY_CORPORATION, true
+ case 1471:
+ return BACnetVendorId_QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD, true
+ case 1472:
+ return BACnetVendorId_GOLDEN_QUALITY_CO_LTD, true
+ case 1473:
+ return BACnetVendorId_ELVACOAB, true
+ case 1474:
+ return BACnetVendorId_STRONG_TECHNOLOGYLLC, true
case 148:
return BACnetVendorId_TEMCO_CONTROLS_LTD, true
case 149:
@@ -18670,8 +18742,20 @@ func BACnetVendorIdByName(value string) (enum BACnetVendorId, ok bool) {
return BACnetVendorId_SYSTEMAIR_MFG_INC, true
case "SEELEY_INTERNATIONAL":
return BACnetVendorId_SEELEY_INTERNATIONAL, true
+ case "CRANE_BUILDING_SERVICES_UTILITIES":
+ return BACnetVendorId_CRANE_BUILDING_SERVICES_UTILITIES, true
case "INTEGRATED_INFORMATION_SYSTEMS_INC":
return BACnetVendorId_INTEGRATED_INFORMATION_SYSTEMS_INC, true
+ case "BRADY_CORPORATION":
+ return BACnetVendorId_BRADY_CORPORATION, true
+ case "QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD":
+ return BACnetVendorId_QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD, true
+ case "GOLDEN_QUALITY_CO_LTD":
+ return BACnetVendorId_GOLDEN_QUALITY_CO_LTD, true
+ case "ELVACOAB":
+ return BACnetVendorId_ELVACOAB, true
+ case "STRONG_TECHNOLOGYLLC":
+ return BACnetVendorId_STRONG_TECHNOLOGYLLC, true
case "TEMCO_CONTROLS_LTD":
return BACnetVendorId_TEMCO_CONTROLS_LTD, true
case "AIRTEK_INTERNATIONAL_INC":
@@ -21659,8 +21743,20 @@ func (e BACnetVendorId) PLC4XEnumName() string {
return "SYSTEMAIR_MFG_INC"
case BACnetVendorId_SEELEY_INTERNATIONAL:
return "SEELEY_INTERNATIONAL"
+ case BACnetVendorId_CRANE_BUILDING_SERVICES_UTILITIES:
+ return "CRANE_BUILDING_SERVICES_UTILITIES"
case BACnetVendorId_INTEGRATED_INFORMATION_SYSTEMS_INC:
return "INTEGRATED_INFORMATION_SYSTEMS_INC"
+ case BACnetVendorId_BRADY_CORPORATION:
+ return "BRADY_CORPORATION"
+ case BACnetVendorId_QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD:
+ return "QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD"
+ case BACnetVendorId_GOLDEN_QUALITY_CO_LTD:
+ return "GOLDEN_QUALITY_CO_LTD"
+ case BACnetVendorId_ELVACOAB:
+ return "ELVACOAB"
+ case BACnetVendorId_STRONG_TECHNOLOGYLLC:
+ return "STRONG_TECHNOLOGYLLC"
case BACnetVendorId_TEMCO_CONTROLS_LTD:
return "TEMCO_CONTROLS_LTD"
case BACnetVendorId_AIRTEK_INTERNATIONAL_INC:
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
index 69017a2f08..1205d80193 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
@@ -714,8 +714,9 @@ const (
KnxManufacturer_M_MUTLUSAN_ELECTRIC KnxManufacturer = 668
KnxManufacturer_M_HANGZHOU_BROADLINK_TECHNOLOGY_CO__LTD_ KnxManufacturer = 669
KnxManufacturer_M_MARLEY_DEUTSCHLAND_GMBH KnxManufacturer = 670
- KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 671
- KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 672
+ KnxManufacturer_M_CREATROL KnxManufacturer = 671
+ KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 672
+ KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 673
)
var KnxManufacturerValues []KnxManufacturer
@@ -1394,6 +1395,7 @@ func init() {
KnxManufacturer_M_MUTLUSAN_ELECTRIC,
KnxManufacturer_M_HANGZHOU_BROADLINK_TECHNOLOGY_CO__LTD_,
KnxManufacturer_M_MARLEY_DEUTSCHLAND_GMBH,
+ KnxManufacturer_M_CREATROL,
KnxManufacturer_M_ABB___RESERVED,
KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED,
}
@@ -3947,10 +3949,14 @@ func (e KnxManufacturer) Number() uint16 {
}
case 671:
{ /* '671' */
- return 43954
+ return 729
}
case 672:
{ /* '672' */
+ return 43954
+ }
+ case 673:
+ { /* '673' */
return 43959
}
case 68:
@@ -6657,10 +6663,14 @@ func (e KnxManufacturer) Name() string {
}
case 671:
{ /* '671' */
- return "ABB - reserved"
+ return "Creatrol"
}
case 672:
{ /* '672' */
+ return "ABB - reserved"
+ }
+ case 673:
+ { /* '673' */
return "Busch-Jaeger Elektro - reserved"
}
case 68:
@@ -8093,8 +8103,10 @@ func KnxManufacturerByValue(value uint16) (enum KnxManufacturer, ok bool) {
case 670:
return KnxManufacturer_M_MARLEY_DEUTSCHLAND_GMBH, true
case 671:
- return KnxManufacturer_M_ABB___RESERVED, true
+ return KnxManufacturer_M_CREATROL, true
case 672:
+ return KnxManufacturer_M_ABB___RESERVED, true
+ case 673:
return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED, true
case 68:
return KnxManufacturer_M_WAREMA_RENKHOFF_SE, true
@@ -9444,6 +9456,8 @@ func KnxManufacturerByName(value string) (enum KnxManufacturer, ok bool) {
return KnxManufacturer_M_EIBMARKT_GMBH, true
case "M_MARLEY_DEUTSCHLAND_GMBH":
return KnxManufacturer_M_MARLEY_DEUTSCHLAND_GMBH, true
+ case "M_CREATROL":
+ return KnxManufacturer_M_CREATROL, true
case "M_ABB___RESERVED":
return KnxManufacturer_M_ABB___RESERVED, true
case "M_BUSCH_JAEGER_ELEKTRO___RESERVED":
@@ -10857,6 +10871,8 @@ func (e KnxManufacturer) PLC4XEnumName() string {
return "M_EIBMARKT_GMBH"
case KnxManufacturer_M_MARLEY_DEUTSCHLAND_GMBH:
return "M_MARLEY_DEUTSCHLAND_GMBH"
+ case KnxManufacturer_M_CREATROL:
+ return "M_CREATROL"
case KnxManufacturer_M_ABB___RESERVED:
return "M_ABB___RESERVED"
case KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED:
diff --git a/plc4go/tools/plc4xbrowser/doc.go b/plc4go/tools/plc4xbrowser/doc.go
deleted file mode 100644
index 3f26eb2bb3..0000000000
--- a/plc4go/tools/plc4xbrowser/doc.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*
- Package main contains the code for the plc4xbrowser
-
-The plc4xbrowser can be used to interactively talk to a plc using the plc4x api. Therefor it can be used by users to
-evaluate different API requests in a REPL style format.
-*/
-package main
diff --git a/plc4go/tools/plc4xbrowser/main.go b/plc4go/tools/plc4xbrowser/main.go
deleted file mode 100644
index 0427d9c399..0000000000
--- a/plc4go/tools/plc4xbrowser/main.go
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import (
- "github.com/apache/plc4x/plc4go/tools/plc4xbrowser/ui"
-)
-
-func main() {
- ui.LoadConfig()
- application := ui.SetupApplication()
- ui.InitSubsystem()
-
- if err := application.Run(); err != nil {
- panic(err)
- }
- ui.Shutdown()
-}
diff --git a/plc4go/tools/plc4xbrowser/ui/actions.go b/plc4go/tools/plc4xbrowser/ui/actions.go
deleted file mode 100644
index 2a9b442d10..0000000000
--- a/plc4go/tools/plc4xbrowser/ui/actions.go
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "bytes"
- "fmt"
- "github.com/apache/plc4x/plc4go/internal/ads"
- "github.com/apache/plc4x/plc4go/internal/bacnetip"
- "github.com/apache/plc4x/plc4go/internal/cbus"
- "github.com/apache/plc4x/plc4go/internal/opcua"
- "github.com/apache/plc4x/plc4go/internal/s7"
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/pkg/api/transports"
- "github.com/pkg/errors"
- "github.com/rivo/tview"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
- "strings"
-)
-
-func InitSubsystem() {
- logLevel := zerolog.InfoLevel
- if configuredLevel := config.LogLevel; configuredLevel != "" {
- if parsedLevel, err := zerolog.ParseLevel(configuredLevel); err != nil {
- panic(err)
- } else {
- logLevel = parsedLevel
- }
- }
-
- log.Logger = log.
- //// Enable below if you want to see the filenames
- //With().Caller().Logger().
- Output(zerolog.NewConsoleWriter(
- func(w *zerolog.ConsoleWriter) {
- w.Out = tview.ANSIWriter(consoleOutput)
- },
- func(w *zerolog.ConsoleWriter) {
- w.FormatFieldValue = func(i interface{}) string {
- if aString, ok := i.(string); ok && strings.Contains(aString, "\\n") {
- return fmt.Sprintf("\x1b[%dm%v\x1b[0m", 31, "see below")
- }
- return fmt.Sprintf("%s", i)
- }
- w.FormatExtra = func(m map[string]interface{}, buffer *bytes.Buffer) error {
- for key, i := range m {
- if aString, ok := i.(string); ok && strings.Contains(aString, "\n") {
- buffer.WriteString("\n")
- buffer.WriteString(fmt.Sprintf("\x1b[%dm%v\x1b[0m", 32, "field "+key))
- buffer.WriteString(":\n" + aString)
- }
- }
- return nil
- }
- },
- ),
- ).
- Level(logLevel)
-
- driverManager = plc4go.NewPlcDriverManager()
-
- // We offset the commands executed with the last commands
- commandsExecuted = len(config.History.Last10Commands)
- outputCommandHistory()
-
- for _, driver := range config.AutoRegisterDrivers {
- log.Info().Str("driver", driver).Msg("Auto register driver")
- if err := validateDriverParam(driver); err != nil {
- log.Err(err).Msg("Invalid configuration")
- continue
- }
- _ = registerDriver(driver)
- }
-}
-
-func outputCommandHistory() {
- _, _ = fmt.Fprintln(commandOutput, "[#0000ff]Last 10 commands[white]")
- for i, command := range config.History.Last10Commands {
- _, _ = fmt.Fprintf(commandOutput, " [#00ff00]%d[white]: [\"%d\"]%s[\"\"]\n", i, i, tview.Escape(command))
- }
-}
-
-func validateDriverParam(driver string) error {
- for _, protocol := range protocolList {
- if protocol == driver {
- return nil
- }
- }
- return errors.Errorf("protocol %s not found", 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":
- driver = ads.NewDriver()
- driverManager.RegisterDriver(driver)
- if !tcpRegistered {
- transports.RegisterTcpTransport(driverManager)
- tcpRegistered = true
- }
- case "bacnetip":
- driver = bacnetip.NewDriver()
- driverManager.RegisterDriver(driver)
- if !udpRegistered {
- transports.RegisterUdpTransport(driverManager)
- udpRegistered = true
- }
- case "c-bus":
- driver = cbus.NewDriver()
- driverManager.RegisterDriver(driver)
- if !tcpRegistered {
- transports.RegisterTcpTransport(driverManager)
- tcpRegistered = true
- }
- case "s7":
- driver = s7.NewDriver()
- driverManager.RegisterDriver(driver)
- if !tcpRegistered {
- transports.RegisterTcpTransport(driverManager)
- tcpRegistered = true
- }
- case "opcua":
- driver = opcua.NewDriver()
- driverManager.RegisterDriver(driver)
- if !tcpRegistered {
- transports.RegisterTcpTransport(driverManager)
- tcpRegistered = true
- }
- default:
- 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
deleted file mode 100644
index 0d13f30198..0000000000
--- a/plc4go/tools/plc4xbrowser/ui/commands.go
+++ /dev/null
@@ -1,803 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "fmt"
- "net/url"
- "runtime/debug"
- "strings"
- "time"
-
- plc4xConfig "github.com/apache/plc4x/plc4go/pkg/api/config"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-
- "github.com/pkg/errors"
- "github.com/rivo/tview"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
-)
-
-const rootCommandIndicator = "rootCommand"
-
-var commands = map[inputMode]Command{
- normalMode: rootCommand,
- readEditMode: rootCommand,
- writeEditMode: rootCommand,
- subscribeEditMode: rootCommand,
-}
-
-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 apiModel.PlcDiscoveryItem) {
- _, _ = 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",
- action: func(_ Command, connectionString string) error {
- log.Info().Str("connectionString", connectionString).Msg("connect connectionString")
- connectionUrl, err := url.Parse(connectionString)
- if err != nil {
- return errors.Wrapf(err, "can't parse connection url %s", connectionString)
- }
- addHostHistoryEntry(connectionUrl.Host)
- connectionId := fmt.Sprintf("%s://%s", connectionUrl.Scheme, connectionUrl.Host)
- if _, ok := connections[connectionId]; ok {
- return errors.Errorf("%s already connected", connectionId)
- }
- connectionResult := <-driverManager.GetConnection(connectionString)
- if err := connectionResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s can't connect to", connectionUrl.Host)
- }
- log.Info().Str("connectionId", connectionId).Msg("connected")
- connections[connectionId] = connectionResult.GetConnection()
- connectionsChanged()
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, protocol := range protocolList {
- if strings.HasPrefix(currentText, protocol) {
- for _, host := range config.History.Last10Hosts {
- entries = append(entries, protocol+"://"+host)
- }
- entries = append(entries, currentText)
- } else {
- entries = append(entries, protocol)
- }
- }
- return
- },
- },
- {
- Name: "disconnect",
- Description: "Disconnect a connection",
- action: func(_ Command, connectionString string) error {
- if connection, ok := connections[connectionString]; !ok {
- return errors.Errorf("%s not connected", connectionString)
- } else {
- closeResult := <-connection.Close()
- log.Info().Str("connectionString", connectionString).Msg("connectionString disconnected")
- delete(connections, connectionString)
- connectionsChanged()
- if err := closeResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s can't close", connectionString)
- }
- }
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- entries = append(entries, connectionsString)
- }
- return
- },
- },
- {
- Name: "read",
- Description: "Starts a read request (switched mode to read edit)",
- action: func(_ Command, connectionsString string) error {
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- return errors.Errorf("%s mode switch not yet implemented", connection)
- }
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- entries = append(entries, connectionsString)
- }
- return
- },
- },
- {
- Name: "read-direct",
- Description: "Builds a read request with the supplied field",
- action: func(c Command, connectionsStringAndFieldQuery string) error {
- split := strings.Split(connectionsStringAndFieldQuery, " ")
- if len(split) != 2 {
- return errors.Errorf("%s expects exactly two arguments [connection url] [fieldQuery]", c)
- }
- connectionsString := split[0]
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- start := time.Now()
- readRequest, err := connection.ReadRequestBuilder().
- AddTagAddress("readField", split[1]).
- Build()
- if err != nil {
- return errors.Wrapf(err, "%s can't read", connectionsString)
- }
- readRequestResult := <-readRequest.Execute()
- if err := readRequestResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s can't read", connectionsString)
- }
- plc4xBrowserLog.Debug().TimeDiff("runtime", time.Now(), start).Msg("read took runtime")
- if err := readRequestResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s error reading", connectionsString)
- }
- numberOfMessagesReceived++
- messageReceived(numberOfMessagesReceived, time.Now(), readRequestResult.GetResponse())
- }
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- if strings.HasPrefix(currentText, connectionsString+"") {
- parse, _ := url.Parse(connectionsString)
- switch parse.Scheme {
- // TODO: add to protocol suggestor so it can be reused.
-
- }
- } else {
- entries = append(entries, connectionsString)
- }
- }
- return
- },
- },
- {
- Name: "write",
- Description: "Starts a write request (switched mode to write edit)",
- action: func(_ Command, connectionsString string) error {
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- return errors.Errorf("%s mode switch not yet implemented", connection)
- }
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- entries = append(entries, connectionsString)
- }
- return
- },
- },
- {
- Name: "write-direct",
- Description: "Builds a write request with the supplied field",
- action: func(c Command, connectionsStringAndFieldQuery string) error {
- split := strings.Split(connectionsStringAndFieldQuery, " ")
- if len(split) != 3 {
- return errors.Errorf("%s expects exactly three arguments [connection url] [fieldQuery] [value]", c)
- }
- connectionsString := split[0]
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- start := time.Now()
- writeRequest, err := connection.WriteRequestBuilder().
- AddTagAddress("writeField", split[1], split[2]).
- Build()
- if err != nil {
- return errors.Wrapf(err, "%s can't write", connectionsString)
- }
- writeRequestResult := <-writeRequest.Execute()
- if err := writeRequestResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s can't write", connectionsString)
- }
- plc4xBrowserLog.Debug().TimeDiff("runtime", time.Now(), start).Msg("write took runtime")
- if err := writeRequestResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s error writing", connectionsString)
- }
- numberOfMessagesReceived++
- messageReceived(numberOfMessagesReceived, time.Now(), writeRequestResult.GetResponse())
- }
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- if strings.HasPrefix(currentText, connectionsString+"") {
- parse, _ := url.Parse(connectionsString)
- switch parse.Scheme {
- // TODO: add to protocol suggestor so it can be reused.
-
- }
- } else {
- entries = append(entries, connectionsString)
- }
- }
- return
- },
- },
- {
- Name: "browse",
- Description: "Starts a browse request (switched mode to browse edit)",
- action: func(_ Command, connectionsString string) error {
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- return errors.Errorf("%s mode switch not yet implemented", connection)
- }
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- entries = append(entries, connectionsString)
- }
- return
- },
- },
- {
- Name: "browse-direct",
- Description: "Builds a browse request with the supplied field",
- action: func(c Command, connectionsStringAndFieldQuery string) error {
- split := strings.Split(connectionsStringAndFieldQuery, " ")
- if len(split) != 2 {
- return errors.Errorf("%s expects exactly three arguments [connection url] [fieldQuery]", c)
- }
- connectionsString := split[0]
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- start := time.Now()
- browseRequest, err := connection.BrowseRequestBuilder().
- AddQuery("browseField", split[1]).
- Build()
- if err != nil {
- return errors.Wrapf(err, "%s can't browse", connectionsString)
- }
- browseRequestResult := <-browseRequest.ExecuteWithInterceptor(func(result apiModel.PlcBrowseItem) bool {
- // TODO: Disabled for now ... not quite sure what this is for ...
- //numberOfMessagesReceived++
- //messageReceived(numberOfMessagesReceived, time.Now(), result)
- return true
- })
- if err := browseRequestResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s can't browse", connectionsString)
- }
- plc4xBrowserLog.Debug().TimeDiff("runtime", time.Now(), start).Msg("write took runtime")
- if err := browseRequestResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s error browse", connectionsString)
- }
- numberOfMessagesReceived++
- messageReceived(numberOfMessagesReceived, time.Now(), browseRequestResult.GetResponse())
- }
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- if strings.HasPrefix(currentText, connectionsString+"") {
- parse, _ := url.Parse(connectionsString)
- switch parse.Scheme {
- // TODO: add to protocol suggestor so it can be reused.
- case "c-bus":
- entries = append(entries, connectionsString+" info/*/*")
- }
- } else {
- entries = append(entries, connectionsString)
- }
- }
- return
- },
- },
- {
- Name: "register",
- Description: "register a driver in the subsystem",
- action: func(_ Command, driver string) error {
- return registerDriver(driver)
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, protocol := range protocolList {
- if strings.HasPrefix(protocol, currentText) {
- entries = append(entries, protocol)
- }
- }
- return
- },
- },
- {
- Name: "subscribe",
- Description: "Starts a subscription request (switched mode to subscribe edit)",
- action: func(_ Command, connectionsString string) error {
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- return errors.Errorf("%s mode switch not yet implemented", connection)
- }
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- entries = append(entries, connectionsString)
- }
- return
- },
- },
- {
- Name: "subscribe-direct",
- Description: "Builds a subscriptions request with the supplied field",
- action: func(c Command, connectionsStringAndFieldQuery string) error {
- split := strings.Split(connectionsStringAndFieldQuery, " ")
- if len(split) != 2 {
- return errors.Errorf("%s expects exactly two arguments [connection url] [fieldQuery]", c)
- }
- connectionsString := split[0]
- if connection, ok := connections[connectionsString]; !ok {
- return errors.Errorf("%s not connected", connectionsString)
- } else {
- subscriptionRequest, err := connection.SubscriptionRequestBuilder().
- AddEventTagAddress("subscriptionField", split[1]).
- AddPreRegisteredConsumer("subscriptionField", func(event apiModel.PlcSubscriptionEvent) {
- numberOfMessagesReceived++
- messageReceived(numberOfMessagesReceived, time.Now(), event)
- }).
- Build()
- if err != nil {
- return errors.Wrapf(err, "%s can't subscribe", connectionsString)
- }
- subscriptionRequestResult := <-subscriptionRequest.Execute()
- if err := subscriptionRequestResult.GetErr(); err != nil {
- return errors.Wrapf(err, "%s can't subscribe", connectionsString)
- }
- log.Info().Stringer("response", subscriptionRequestResult.GetResponse()).Msg("subscription result")
- }
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for connectionsString := range connections {
- entries = append(entries, connectionsString)
- if strings.HasPrefix(currentText, connectionsString) {
- parse, _ := url.Parse(connectionsString)
- switch parse.Scheme {
- // TODO: add to protocol suggestor so it can be reused.
- case "c-bus":
- entries = append(entries, connectionsString+" salmonitor/*/*")
- entries = append(entries, connectionsString+" mmimonitor/*/*")
- }
- }
- }
- return
- },
- },
- {
- Name: "quit",
- Description: "Quits the application",
- },
- {
- Name: "log",
- Description: "Log related operations",
- subCommands: []Command{
- {
- Name: "get",
- Description: "Get a log level",
- action: func(_ Command, _ string) error {
- _, _ = fmt.Fprintf(commandOutput, "Current log level %s", log.Logger.GetLevel())
- return nil
- },
- },
- {
- Name: "set",
- Description: "Sets a log level",
- action: func(_ Command, level string) error {
- parseLevel, err := zerolog.ParseLevel(level)
- if err != nil {
- return errors.Wrapf(err, "Error setting log level")
- }
- setLevel(parseLevel)
- log.Logger = log.Logger.Level(parseLevel)
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- levels := []string{
- zerolog.LevelTraceValue,
- zerolog.LevelDebugValue,
- zerolog.LevelInfoValue,
- zerolog.LevelWarnValue,
- zerolog.LevelErrorValue,
- zerolog.LevelFatalValue,
- zerolog.LevelPanicValue,
- }
- for _, level := range levels {
- entries = append(entries, level)
- }
- return
- },
- },
- },
- },
- {
- Name: "plc4x-conf",
- Description: "plc4x related settings",
- subCommands: []Command{
- {
- Name: "TraceTransactionManagerWorkers",
- Description: "print information about transaction manager workers",
- subCommands: []Command{
- {
- Name: "on",
- Description: "trace on",
- action: func(_ Command, _ string) error {
- plc4xConfig.TraceTransactionManagerWorkers = true
- return nil
- },
- },
- {
- Name: "off",
- Description: "trace off",
- action: func(_ Command, _ string) error {
- plc4xConfig.TraceTransactionManagerWorkers = false
- return nil
- },
- },
- },
- },
- {
- Name: "TraceTransactionManagerTransactions",
- Description: "print information about transaction manager transactions",
- subCommands: []Command{
- {
- Name: "on",
- Description: "trace on",
- action: func(_ Command, _ string) error {
- plc4xConfig.TraceTransactionManagerTransactions = true
- return nil
- },
- },
- {
- Name: "off",
- Description: "trace off",
- action: func(_ Command, _ string) error {
- plc4xConfig.TraceTransactionManagerTransactions = false
- return nil
- },
- },
- },
- },
- {
- Name: "TraceDefaultMessageCodecWorker",
- Description: "print information about message codec workers",
- subCommands: []Command{
- {
- Name: "on",
- Description: "trace on",
- action: func(_ Command, _ string) error {
- plc4xConfig.TraceDefaultMessageCodecWorker = true
- return nil
- },
- },
- {
- Name: "off",
- Description: "trace off",
- action: func(_ Command, _ string) error {
- plc4xConfig.TraceDefaultMessageCodecWorker = false
- return nil
- },
- },
- },
- },
- {
- Name: "plc4xbrowser-debug",
- Description: "Prints out debug information of the browser itself",
- subCommands: []Command{
- {
- Name: "on",
- Description: "debug on",
- action: func(_ Command, _ string) error {
- plc4xBrowserLog = zerolog.New(zerolog.ConsoleWriter{Out: tview.ANSIWriter(consoleOutput)})
- return nil
- },
- },
- {
- Name: "off",
- Description: "debug off",
- action: func(_ Command, _ string) error {
- plc4xBrowserLog = zerolog.Nop()
- return nil
- },
- },
- },
- },
- {
- Name: "auto-register",
- Description: "autoregister driver at startup",
- subCommands: []Command{
- {
- Name: "list",
- action: func(currentCommand Command, argument string) error {
- _, _ = fmt.Fprintf(commandOutput, "Auto-register enabled drivers:\n %s\n", strings.Join(config.AutoRegisterDrivers, "\n "))
- return nil
- },
- },
- {
- Name: "enable",
- action: func(_ Command, argument string) error {
- return enableAutoRegister(argument)
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, protocol := range protocolList {
- if strings.HasPrefix(protocol, currentText) {
- entries = append(entries, protocol)
- }
- }
- return
- },
- },
- {
- Name: "disable",
- action: func(_ Command, argument string) error {
- return disableAutoRegister(argument)
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, protocol := range protocolList {
- if strings.HasPrefix(protocol, currentText) {
- entries = append(entries, protocol)
- }
- }
- return
- },
- },
- },
- },
- },
- },
- {
- Name: "history",
- Description: "outputs the last commands",
- action: func(_ Command, _ string) error {
- outputCommandHistory()
- return nil
- },
- },
- {
- Name: "clear",
- Description: "clear all outputs",
- action: func(_ Command, _ string) error {
- messageOutputClear()
- consoleOutputClear()
- commandOutputClear()
- return nil
- },
- subCommands: []Command{
- {
- Name: "message",
- Description: "clears message output",
- action: func(_ Command, _ string) error {
- messageOutputClear()
- return nil
- },
- },
- {
- Name: "console",
- Description: "clears console output",
- action: func(_ Command, _ string) error {
- consoleOutputClear()
- return nil
- },
- },
- {
- Name: "command",
- Description: "clears command output",
- action: func(_ Command, _ string) error {
- commandOutputClear()
- return nil
- },
- },
- },
- },
- },
-}
-
-func init() {
- // Because of the cycle we need to define the help command here as it needs access to the to command
- rootCommand.subCommands = append(rootCommand.subCommands, Command{
- Name: "help",
- Description: "prints out this help",
- action: func(_ Command, _ string) error {
- _, _ = fmt.Fprintf(commandOutput, "[#0000ff]Available commands[white]\n")
- rootCommand.visit(0, func(currentIndent int, command Command) {
- indentString := strings.Repeat(" ", currentIndent)
- description := command.Description
- if description == "" {
- description = command.Name + "s"
- }
- _, _ = fmt.Fprintf(commandOutput, "%s [#00ff00]%s[white]: %s\n", indentString, command.Name, description)
- })
- return nil
- },
- })
-}
-
-var NotDirectlyExecutable = errors.New("Not directly executable")
-
-type Command struct {
- Name string
- Description string
- action func(currentCommand Command, argument string) error
- subCommands []Command
- parameterSuggestions func(currentText string) (entries []string)
-}
-
-func (c Command) Completions(currentCommandText string) (entries []string) {
- if c.Name == rootCommandIndicator && len(currentCommandText) == 0 {
- // We don't return anything here to not pollute the command text by default
- return
- }
- if c.acceptsCurrentText(currentCommandText) {
- currentCommandPrefix := c.currentCommandPrefix()
- doesCommandTextTargetSubCommand := c.doesCommandTextTargetSubCommand(currentCommandPrefix)
- if c.hasDirectExecution() && !doesCommandTextTargetSubCommand {
- if c.parameterSuggestions != nil {
- preparedForParameters := c.prepareForParameters(currentCommandText)
- for _, parameterSuggestion := range c.parameterSuggestions(preparedForParameters) {
- entries = append(entries, currentCommandPrefix+parameterSuggestion)
- }
- } else {
- entries = append(entries, c.Name)
- }
- }
- if doesCommandTextTargetSubCommand {
- remainder := c.prepareForSubCommand(currentCommandText)
- for _, command := range c.subCommands {
- for _, subCommandCompletions := range command.Completions(remainder) {
- entries = append(entries, currentCommandPrefix+subCommandCompletions)
- }
- }
- }
- } else if strings.HasPrefix(c.Name, currentCommandText) {
- // Suggest ourselves if we start with the current letter
- entries = append(entries, c.Name)
- }
- return
-}
-
-func (c Command) acceptsCurrentText(currentCommandText string) bool {
- if c.Name == rootCommandIndicator {
- return true
- }
- hasThePrefix := strings.HasPrefix(currentCommandText, c.Name)
- hasNoMatchingAlternative := !strings.HasPrefix(currentCommandText, c.Name+"-")
- accepts := hasThePrefix && hasNoMatchingAlternative
- plc4xBrowserLog.Debug().
- Stringer("c", c).
- Bool("accepts", accepts).
- Msg("c accepts")
- return accepts
-}
-
-func (c Command) doesCommandTextTargetSubCommand(currentCommandText string) bool {
- if c.Name == rootCommandIndicator {
- return true
- }
- if len(c.subCommands) == 0 {
- return false
- }
- return strings.HasPrefix(currentCommandText, c.currentCommandPrefix())
-}
-
-func (c Command) prepareForParameters(currentCommandText string) string {
- return strings.TrimPrefix(currentCommandText, c.currentCommandPrefix())
-}
-func (c Command) prepareForSubCommand(currentCommandText string) string {
- return strings.TrimPrefix(currentCommandText, c.currentCommandPrefix())
-}
-
-func (c Command) currentCommandPrefix() string {
- if c.Name == rootCommandIndicator {
- return ""
- }
- return c.Name + " "
-}
-
-func (c Command) hasDirectExecution() bool {
- return c.action != nil
-}
-
-func Execute(commandText string) error {
- err := rootCommand.Execute(commandText)
- if err == nil {
- addCommandHistoryEntry(commandText)
- }
- return err
-}
-
-func (c Command) Execute(commandText string) (err error) {
- defer func() {
- if recoveredErr := recover(); recoveredErr != nil {
- if log.Debug().Enabled() {
- log.Error().
- Str("stack", string(debug.Stack())).
- Interface("err", err).
- Msg("panic-ed")
- }
- err = errors.Errorf("panic occurred: %v.", recoveredErr)
- }
- }()
- plc4xBrowserLog.Debug().
- Stringer("c", c).
- Str("commandText", commandText).
- Msg("%s executes %s")
- if !c.acceptsCurrentText(commandText) {
- return errors.Errorf("%s doesn't understand %s", c.Name, commandText)
- }
- if c.doesCommandTextTargetSubCommand(commandText) {
- prepareForSubCommandForSubCommand := c.prepareForSubCommand(commandText)
- for _, command := range c.subCommands {
- if command.acceptsCurrentText(prepareForSubCommandForSubCommand) {
- plc4xBrowserLog.Debug().
- Stringer("c", c).
- Stringer("command", command).
- Msg("c delegates to sub command")
- return command.Execute(prepareForSubCommandForSubCommand)
- }
- }
- return errors.Errorf("%s not accepted by any subcommands of %s", commandText, c.Name)
- } else {
- if c.action == nil {
- return NotDirectlyExecutable
- }
- plc4xBrowserLog.Debug().
- Stringer("c", c).
- Str("commandText", commandText).
- Msg("c executes commandText directly")
- preparedForParameters := c.prepareForParameters(commandText)
- return c.action(c, preparedForParameters)
- }
-}
-
-func (c Command) visit(i int, f func(currentIndent int, command Command)) {
- f(i, c)
- for _, subCommand := range c.subCommands {
- subCommand.visit(i+1, f)
- }
-}
-
-func (c Command) String() string {
- return c.Name
-}
diff --git a/plc4go/tools/plc4xbrowser/ui/common.go b/plc4go/tools/plc4xbrowser/ui/common.go
deleted file mode 100644
index c052901f5d..0000000000
--- a/plc4go/tools/plc4xbrowser/ui/common.go
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- plc4goModel "github.com/apache/plc4x/plc4go/pkg/api/model"
- "github.com/rs/zerolog"
- "io"
- "strings"
- "sync"
- "time"
-)
-
-const protocols = "ads,bacnetip,c-bus,opcua,s7"
-
-var protocolList = strings.Split(protocols, ",")
-
-var plc4xBrowserLog = zerolog.Nop()
-
-var driverManager plc4go.PlcDriverManager
-var registeredDrivers map[string]plc4go.PlcDriver
-var driverAdded func(driver plc4go.PlcDriver)
-var connections map[string]plc4go.PlcConnection
-var connectionsChanged func()
-
-var messageReceived func(messageNumber int, receiveTime time.Time, message plc4goModel.PlcMessage)
-var numberOfMessagesReceived int
-var messageOutput io.Writer
-var messageOutputClear func()
-
-var consoleOutput io.Writer
-var consoleOutputClear func()
-
-var commandsExecuted int
-var commandOutput io.Writer
-var commandOutputClear func()
-
-type inputMode int
-
-const (
- normalMode inputMode = iota
- readEditMode
- writeEditMode
- subscribeEditMode
-)
-
-func init() {
- hasShutdown = false
- registeredDrivers = make(map[string]plc4go.PlcDriver)
- connections = make(map[string]plc4go.PlcConnection)
-}
-
-var shutdownMutex sync.Mutex
-var hasShutdown bool
-
-func Shutdown() {
- shutdownMutex.Lock()
- defer shutdownMutex.Unlock()
- if hasShutdown {
- return
- }
- for _, connection := range connections {
- connection.Close()
- }
- hasShutdown = true
- saveConfig()
-}
diff --git a/plc4go/tools/plc4xbrowser/ui/config.go b/plc4go/tools/plc4xbrowser/ui/config.go
deleted file mode 100644
index 47a325b46d..0000000000
--- a/plc4go/tools/plc4xbrowser/ui/config.go
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "github.com/pkg/errors"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
- "gopkg.in/yaml.v3"
- "os"
- "path"
- "sync"
- "time"
-)
-
-var plc4xBrowserConfigDir string
-var configFile string
-var config = Config{
- MaxConsoleLines: 500,
- MaxOutputLines: 500,
-}
-
-type Config struct {
- History struct {
- Last10Hosts []string `yaml:"last_hosts"`
- Last10Commands []string `yaml:"last_commands"`
- }
- AutoRegisterDrivers []string `yaml:"auto_register_driver"`
- LastUpdated time.Time `yaml:"last_updated"`
- LogLevel string `yaml:"log_level"`
- MaxConsoleLines int `yaml:"max_console_lines"`
- MaxOutputLines int `yaml:"max_output_lines"`
-}
-
-func init() {
- userConfigDir, err := os.UserConfigDir()
- if err != nil {
- panic(err)
- }
- plc4xBrowserConfigDir = path.Join(userConfigDir, "plc4xbrowser")
- if _, err := os.Stat(plc4xBrowserConfigDir); os.IsNotExist(err) {
- err := os.Mkdir(plc4xBrowserConfigDir, os.ModeDir|os.ModePerm)
- if err != nil {
- panic(err)
- }
- }
- configFile = path.Join(plc4xBrowserConfigDir, "config.yml")
-}
-
-func LoadConfig() {
- f, err := os.Open(configFile)
- if err != nil {
- log.Info().Err(err).Msg("No config file found")
- return
- }
- defer func(f *os.File) {
- err := f.Close()
- if err != nil {
- log.Error().Err(err).Msg("Error closing config file")
- }
- }(f)
-
- decoder := yaml.NewDecoder(f)
- if err = decoder.Decode(&config); err != nil {
- log.Warn().Err(err).Msg("Can't decode config file")
- return
- }
-}
-
-var saveMutex sync.Mutex
-
-func saveConfig() {
- saveMutex.Lock()
- defer saveMutex.Unlock()
- config.LastUpdated = time.Now()
- f, err := os.OpenFile(configFile, os.O_RDWR|os.O_CREATE, 0755)
- if err != nil {
- log.Warn().Err(err).Msg("Can't save config file")
- return
- }
- encoder := yaml.NewEncoder(f)
- defer func(encoder *yaml.Encoder) {
- err := encoder.Close()
- if err != nil {
- log.Error().Err(err).Msg("Error closing config file")
- }
- }(encoder)
- if err := encoder.Encode(config); err != nil {
- log.Warn().Err(err).Msg("Can't encode config file")
- panic(err)
- }
-}
-
-func addHostHistoryEntry(host string) {
- existingIndex := -1
- for i, lastHost := range config.History.Last10Hosts {
- if lastHost == host {
- existingIndex = i
- break
- }
- }
- if existingIndex >= 0 {
- config.History.Last10Hosts = append(config.History.Last10Hosts[:existingIndex], config.History.Last10Hosts[existingIndex+1:]...)
- }
- if len(config.History.Last10Hosts) >= 10 {
- config.History.Last10Hosts = config.History.Last10Hosts[1:]
- }
- config.History.Last10Hosts = append(config.History.Last10Hosts, host)
-}
-
-func addCommandHistoryEntry(command string) {
- switch command {
- case "clear":
- return
- case "history":
- return
- }
- existingIndex := -1
- for i, lastCommand := range config.History.Last10Commands {
- if lastCommand == command {
- existingIndex = i
- break
- }
- }
- if existingIndex >= 0 {
- config.History.Last10Commands = append(config.History.Last10Commands[:existingIndex], config.History.Last10Commands[existingIndex+1:]...)
- }
- if len(config.History.Last10Commands) >= 10 {
- config.History.Last10Commands = config.History.Last10Commands[1:]
- }
- config.History.Last10Commands = append(config.History.Last10Commands, command)
-}
-
-func setLevel(level zerolog.Level) {
- config.LogLevel = level.String()
-}
-
-func enableAutoRegister(driver string) error {
- if err := validateDriverParam(driver); err != nil {
- return err
- }
- for _, autoRegisterDriver := range config.AutoRegisterDrivers {
- if autoRegisterDriver == driver {
- return errors.Errorf("%s already registered for auto register", driver)
- }
- }
- config.AutoRegisterDrivers = append(config.AutoRegisterDrivers, driver)
- log.Info().Str("driver", driver).Msg("Auto register enabled")
- return nil
-}
-
-func disableAutoRegister(driver string) error {
- if err := validateDriverParam(driver); err != nil {
- return err
- }
- index := -1
- for i, autoRegisterDriver := range config.AutoRegisterDrivers {
- if autoRegisterDriver == driver {
- index = i
- break
- }
- }
- if index < 0 {
- return errors.Errorf("%s not registered for auto register", driver)
- }
- config.AutoRegisterDrivers = append(config.AutoRegisterDrivers[:index], config.AutoRegisterDrivers[index+1:]...)
- log.Info().Str("driver", driver).Msg("Auto register disabled")
- return nil
-}
diff --git a/plc4go/tools/plc4xbrowser/ui/ui.go b/plc4go/tools/plc4xbrowser/ui/ui.go
deleted file mode 100644
index 92de8f483c..0000000000
--- a/plc4go/tools/plc4xbrowser/ui/ui.go
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "fmt"
- "regexp"
- "strconv"
- "time"
-
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
-
- "github.com/gdamore/tcell/v2"
- "github.com/pkg/errors"
- "github.com/rivo/tview"
-)
-
-func SetupApplication() *tview.Application {
- application := tview.NewApplication()
-
- newPrimitive := func(text string) tview.Primitive {
- return tview.NewTextView().
- SetTextAlign(tview.AlignCenter).
- SetText(text)
- }
- connectionArea := buildConnectionArea(newPrimitive, application)
- outputArea := buildOutputArea(newPrimitive, application)
- commandArea := buildCommandArea(newPrimitive, application)
-
- grid := tview.NewGrid().
- SetRows(1, 0, 1).
- SetColumns(30, 0, 30).
- SetBorders(true).
- AddItem(newPrimitive("PLC4X Browser"), 0, 0, 1, 3, 0, 0, false).
- AddItem(newPrimitive("https://github.com/apache/plc4x"), 2, 0, 1, 3, 0, 0, false)
-
- // Layout for screens narrower than 100 cells (connectionArea and side bar are hidden).
- grid.AddItem(connectionArea, 0, 0, 0, 0, 0, 0, false).
- AddItem(outputArea, 1, 0, 1, 3, 0, 0, false).
- AddItem(commandArea, 0, 0, 0, 0, 0, 0, true)
-
- // Layout for screens wider than 100 cells.
- grid.AddItem(connectionArea, 1, 0, 1, 1, 0, 100, false).
- AddItem(outputArea, 1, 1, 1, 1, 0, 100, false).
- AddItem(commandArea, 1, 2, 1, 1, 0, 100, false)
-
- application.SetRoot(grid, true).EnableMouse(true)
-
- return application
-}
-
-func buildConnectionArea(newPrimitive func(text string) tview.Primitive, application *tview.Application) tview.Primitive {
- connectionAreaHeader := newPrimitive("Connections")
- connectionArea := tview.NewGrid().
- SetRows(3, 0, 10).
- SetColumns(0).
- AddItem(connectionAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- connectionList := tview.NewList()
- connectionsChanged = func() {
- application.QueueUpdateDraw(func() {
- connectionList.Clear()
- for connectionString, connection := range connections {
- connectionList.AddItem(connectionString, "", 0x0, func() {
- //TODO: disconnect popup
- _ = connection
- })
- }
- })
- }
- connectionArea.AddItem(connectionList, 1, 0, 1, 1, 0, 0, false)
- {
- registeredDriverAreaHeader := newPrimitive("Registered drivers")
- registeredDriverArea := tview.NewGrid().
- SetRows(3, 0).
- SetColumns(0).
- AddItem(registeredDriverAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- driverList := tview.NewList()
- driverAdded = func(driver plc4go.PlcDriver) {
- application.QueueUpdateDraw(func() {
- driverList.AddItem(driver.GetProtocolCode(), tview.Escape(fmt.Sprintf("%s", driver)), 0x0, func() {
- //TODO: disconnect popup
- })
- })
- }
- registeredDriverArea.AddItem(driverList, 1, 0, 1, 1, 0, 0, false)
- }
- connectionArea.AddItem(registeredDriverArea, 2, 0, 1, 1, 0, 0, false)
- }
-
- }
- return connectionArea
-}
-
-func buildCommandArea(newPrimitive func(text string) tview.Primitive, application *tview.Application) tview.Primitive {
- commandAreaHeader := newPrimitive("Commands")
- commandArea := tview.NewGrid().
- SetRows(3, 0, 3).
- SetColumns(0).
- AddItem(commandAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- enteredCommandsView := tview.NewTextView().
- SetDynamicColors(true).
- SetRegions(true).
- SetWordWrap(true).
- SetChangedFunc(func() {
- application.Draw()
- })
- commandOutput = enteredCommandsView
- commandOutputClear = func() {
- enteredCommandsView.SetText("")
- }
-
- commandArea.AddItem(enteredCommandsView, 1, 0, 1, 1, 0, 0, false)
-
- commandInputField := tview.NewInputField().
- SetLabel("$").
- SetFieldWidth(30)
- application.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
- switch event.Key() {
- case tcell.KeyCtrlC:
- commandInputField.SetText("")
- application.SetFocus(commandInputField)
- return nil
- case tcell.KeyCtrlD:
- // TODO: maybe add a modal here
- application.Stop()
- return nil
- }
- return event
- })
- commandInputField.
- SetDoneFunc(func(key tcell.Key) {
- commandText := commandInputField.GetText()
- if commandText == "quit" {
- // TODO: maybe add a modal here
- application.Stop()
- return
- }
- commandsExecuted++
- go func() {
- commandHistoryShortcut, _ := regexp.Compile("^[0-9]$")
- if commandHistoryShortcut.MatchString(commandText) {
- atoi, _ := strconv.Atoi(commandHistoryShortcut.FindString(commandText))
- if atoi < len(config.History.Last10Commands) {
- commandText = config.History.Last10Commands[atoi]
- } else {
- _, _ = fmt.Fprintf(enteredCommandsView, "[#ff0000]%s %s[white]\n", time.Now().Format("04:05"), errors.Errorf("No such elements %d in command history", atoi))
- return
- }
- }
- _, _ = fmt.Fprintf(enteredCommandsView, "%s [\"%d\"]%s[\"\"]\n", time.Now().Format("04:05"), commandsExecuted, commandText)
- if err := Execute(commandText); err != nil {
- _, _ = fmt.Fprintf(enteredCommandsView, "[#ff0000]%s %s[white]\n", time.Now().Format("04:05"), err)
- return
- }
- application.QueueUpdateDraw(func() {
- commandInputField.SetText("")
- })
- }()
- })
- commandInputField.SetAutocompleteFunc(rootCommand.Completions)
-
- enteredCommandsView.SetDoneFunc(func(key tcell.Key) {
- currentSelection := enteredCommandsView.GetHighlights()
- if key == tcell.KeyEnter {
- if len(currentSelection) > 0 {
- enteredCommandsView.Highlight()
- } else {
- enteredCommandsView.Highlight("0").ScrollToHighlight()
- }
- if len(currentSelection) == 1 {
- commandInputField.SetText(enteredCommandsView.GetRegionText(currentSelection[0]))
- application.SetFocus(commandInputField)
- }
- } else if len(currentSelection) > 0 {
- index, _ := strconv.Atoi(currentSelection[0])
- if key == tcell.KeyTab {
- index = (index + 1) % commandsExecuted
- } else if key == tcell.KeyBacktab {
- index = (index - 1 + commandsExecuted) % commandsExecuted
- } else {
- return
- }
- enteredCommandsView.Highlight(strconv.Itoa(index)).ScrollToHighlight()
- }
- })
-
- commandArea.AddItem(commandInputField, 2, 0, 1, 1, 0, 0, true)
- }
- return commandArea
-}
-
-func buildOutputArea(newPrimitive func(text string) tview.Primitive, application *tview.Application) *tview.Grid {
- outputAreaHeader := newPrimitive("Output")
- outputArea := tview.NewGrid().
- SetRows(3, 0, 10).
- SetColumns(0, 30).
- AddItem(outputAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- var jumpToMessageItem func(messageNumber int) bool
- {
- outputView := tview.NewTextView().
- SetDynamicColors(true).
- SetRegions(true).
- SetWordWrap(false).
- SetWrap(false).
- SetChangedFunc(func() {
- application.Draw()
- })
- jumpToMessageItem = func(messageNumber int) bool {
- regionId := strconv.Itoa(messageNumber)
- if outputView.GetRegionText(regionId) == "" {
- return false
- }
- outputView.Highlight(regionId).ScrollToHighlight()
- return true
- }
- messageOutput = outputView
- messageOutputClear = func() {
- outputView.SetText("")
- }
-
- outputView.SetDoneFunc(func(key tcell.Key) {
- currentSelection := outputView.GetHighlights()
- if key == tcell.KeyEnter {
- if len(currentSelection) > 0 {
- outputView.Highlight()
- } else {
- outputView.Highlight("0").ScrollToHighlight()
- }
- } else if len(currentSelection) > 0 {
- index, _ := strconv.Atoi(currentSelection[0])
- if key == tcell.KeyTab {
- index = (index + 1) % numberOfMessagesReceived
- } else if key == tcell.KeyBacktab {
- index = (index - 1 + numberOfMessagesReceived) % numberOfMessagesReceived
- } else {
- return
- }
- outputView.Highlight(strconv.Itoa(index)).ScrollToHighlight()
- }
- })
- outputView.SetBorder(false)
- outputArea.AddItem(outputView, 1, 0, 1, 1, 0, 0, false)
- }
-
- {
- consoleView := tview.NewTextView().
- SetDynamicColors(true).
- SetMaxLines(config.MaxConsoleLines).
- SetChangedFunc(func() {
- application.Draw()
- })
- consoleOutput = consoleView
- consoleOutputClear = func() {
- consoleView.SetText("")
- }
-
- consoleView.SetBorder(false)
- outputArea.AddItem(consoleView, 2, 0, 1, 1, 0, 0, false)
- }
-
- {
- receivedMessagesList := tview.NewList()
- messageReceived = func(messageNumber int, receiveTime time.Time, message apiModel.PlcMessage) {
- application.QueueUpdateDraw(func() {
- receivedMessagesList.AddItem(fmt.Sprintf("No %d @%s", messageNumber, receiveTime.Format("15:04:05.999999")), "", 0x0, func() {
- if ok := jumpToMessageItem(messageNumber); !ok {
- plc4xBrowserLog.Debug().Msg("Adding new message to console output")
- _, _ = fmt.Fprintf(messageOutput, "Message nr: %d\n[\"%d\"]%s[\"\"]\n", messageNumber, messageNumber, message)
- jumpToMessageItem(messageNumber)
- }
- })
- })
- }
- outputArea.AddItem(receivedMessagesList, 0, 1, 3, 1, 0, 0, false)
- }
- }
- return outputArea
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/cmd/analyze.go b/plc4go/tools/plc4xpcapanalyzer/cmd/analyze.go
deleted file mode 100644
index fa0c11977f..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/cmd/analyze.go
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package cmd
-
-import (
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/analyzer"
- "github.com/pkg/errors"
- "math"
- "os"
-
- "github.com/spf13/cobra"
-)
-
-var validProtocolType = map[string]any{
- "bacnet": nil,
- "c-bus": nil,
-}
-
-// analyzeCmd represents the analyze command
-var analyzeCmd = &cobra.Command{
- Use: "analyze [protocolType] [pcapfile]",
- Short: "analyzes a pcap file using a driver supplied driver",
- Long: `Analyzes a pcap file using a driver
-TODO: document me
-`,
- Args: func(cmd *cobra.Command, args []string) error {
- if len(args) < 2 {
- return errors.New("requires exactly two arguments")
- }
- if _, ok := validProtocolType[args[0]]; !ok {
- return errors.Errorf("Only following protocols are supported %v", validProtocolType)
- }
- pcapFile := args[1]
- if _, err := os.Stat(pcapFile); errors.Is(err, os.ErrNotExist) {
- return errors.Errorf("Pcap file not found %s", pcapFile)
- }
- return nil
- },
- Run: func(cmd *cobra.Command, args []string) {
- protocolType := args[0]
- pcapFile := args[1]
- if err := analyzer.Analyze(pcapFile, protocolType); err != nil {
- panic(err)
- }
- println("Done")
- },
-}
-
-func init() {
- rootCmd.AddCommand(analyzeCmd)
-
- addAnalyzeFlags(analyzeCmd)
-}
-
-func addAnalyzeFlags(command *cobra.Command) {
- command.Flags().StringVarP(&config.AnalyzeConfigInstance.Filter, "filter", "f", "", "BFF filter to apply")
- command.Flags().BoolVarP(&config.AnalyzeConfigInstance.NoFilter, "no-filter", "n", false, "disable filter")
- command.Flags().BoolVarP(&config.AnalyzeConfigInstance.OnlyParse, "only-parse", "o", false, "only parse messaged")
- command.Flags().BoolVarP(&config.AnalyzeConfigInstance.NoBytesCompare, "no-bytes-compare", "b", false, "don't compare original bytes with serialized bytes")
- command.Flags().BoolVarP(&config.AnalyzeConfigInstance.NoCustomMapping, "no-custom-mapping", "", false, "don't use the custom mapper for protocols")
- command.Flags().StringVarP(&config.AnalyzeConfigInstance.Client, "client", "c", "", "The client ip (this is useful for protocols where request/response is different e.g. modbus, cbus)")
- command.Flags().UintVarP(&config.AnalyzeConfigInstance.StartPackageNumber, "start-package-umber", "s", 0, "Defines with what package number should be started")
- command.Flags().UintVarP(&config.AnalyzeConfigInstance.PackageNumberLimit, "package-number-limit", "l", math.MaxUint, "Defines how many packages should be parsed")
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/cmd/bacnet.go b/plc4go/tools/plc4xpcapanalyzer/cmd/bacnet.go
deleted file mode 100644
index b268414e1b..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/cmd/bacnet.go
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package cmd
-
-import (
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/analyzer"
- "github.com/pkg/errors"
- "os"
-
- "github.com/spf13/cobra"
-)
-
-// bacnetCmd represents the bacnet command
-var bacnetCmd = &cobra.Command{
- Use: "bacnet [pcapfile]",
- Short: "analyzes a pcap file using a bacnet driver",
- Long: `Analyzes a pcap file using a bacnet driver
-TODO: document me
-`,
- Args: func(cmd *cobra.Command, args []string) error {
- if len(args) < 1 {
- return errors.New("requires exactly one arguments")
- }
- pcapFile := args[0]
- if _, err := os.Stat(pcapFile); errors.Is(err, os.ErrNotExist) {
- return errors.Errorf("Pcap file not found %s", pcapFile)
- }
- return nil
- },
- Run: func(cmd *cobra.Command, args []string) {
- pcapFile := args[0]
- if err := analyzer.Analyze(pcapFile, "bacnet"); err != nil {
- panic(err)
- }
- println("Done")
- },
-}
-
-func init() {
- analyzeCmd.AddCommand(bacnetCmd)
-
- bacnetCmd.PersistentFlags().StringVarP(&config.BacnetConfigInstance.BacnetFilter, "default-bacnet-filter", "", "udp port 47808 and udp[4:2] > 29", "Defines the default filter when bacnet is selected")
-
- addAnalyzeFlags(bacnetCmd)
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/cmd/cbus.go b/plc4go/tools/plc4xpcapanalyzer/cmd/cbus.go
deleted file mode 100644
index 5c76e98445..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/cmd/cbus.go
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package cmd
-
-import (
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/analyzer"
- "github.com/pkg/errors"
- "os"
-
- "github.com/spf13/cobra"
-)
-
-// cbusCmd represents the cbus command
-var cbusCmd = &cobra.Command{
- Use: "c-bus [pcapfile]",
- Short: "analyzes a pcap file using a c-bus driver",
- Long: `Analyzes a pcap file using a c-bus driver
-TODO: document me
-`,
- Args: func(cmd *cobra.Command, args []string) error {
- if len(args) < 1 {
- return errors.New("requires exactly one arguments")
- }
- pcapFile := args[0]
- if _, err := os.Stat(pcapFile); errors.Is(err, os.ErrNotExist) {
- return errors.Errorf("Pcap file not found %s", pcapFile)
- }
- return nil
- },
- Run: func(cmd *cobra.Command, args []string) {
- pcapFile := args[0]
- if err := analyzer.Analyze(pcapFile, "c-bus"); err != nil {
- panic(err)
- }
- println("Done")
- },
-}
-
-func init() {
- analyzeCmd.AddCommand(cbusCmd)
-
- cbusCmd.PersistentFlags().StringVarP(&config.CBusConfigInstance.CBusFilter, "default-cbus-filter", "", "tcp port 10001", "Defines the default filter when c-bus is selected")
-
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Connect, "cbus-connect", "", false, "Defines that SAL messages can occur at any time")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Smart, "cbus-smart", "", false, "Disable echo of characters. When used with connect SAL have a long option. Select long from of most CAL replies")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Idmon, "cbus-idmon", "", false, "only works with smart. Select long form of CAL messages")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Exstat, "cbus-exstat", "", false, "useful with smart. Select long form, extended format for all monitored and initiated status requests")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Monitor, "cbus-monitor", "", false, "monitors all traffic for status requests. Status requests will be returned as CAL. Replies are modified by exstat. Usually used in conjunction with connect.")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Monall, "cbus-monall", "", false, "Same as connect. In addition it will return remote network SAL")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Pun, "cbus-pun", "", false, "Serial interface will emit a power up notification")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Pcn, "cbus-pcn", "", false, "causes parameter change notifications to be emitted.")
- cbusCmd.Flags().BoolVarP(&config.CBusConfigInstance.Srchk, "cbus-srchk", "", false, "forces the checksum checks from the beginning")
-
- addAnalyzeFlags(cbusCmd)
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/cmd/extract.go b/plc4go/tools/plc4xpcapanalyzer/cmd/extract.go
deleted file mode 100644
index 441d1a9aa5..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/cmd/extract.go
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package cmd
-
-import (
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/extractor"
- "github.com/pkg/errors"
- "os"
-
- "github.com/spf13/cobra"
-)
-
-// extractCmd represents the extract command
-var extractCmd = &cobra.Command{
- Use: "extract [protocolType] [pcapfile]",
- Short: "extract a pcap file using a driver supplied driver",
- Long: `Extract a pcap file using a driver
-TODO: document me
-`,
- Args: func(cmd *cobra.Command, args []string) error {
- if len(args) < 2 {
- return errors.New("requires exactly two arguments")
- }
- if _, ok := validProtocolType[args[0]]; !ok {
- return errors.Errorf("Only following protocols are supported %v", validProtocolType)
- }
- pcapFile := args[1]
- if _, err := os.Stat(pcapFile); errors.Is(err, os.ErrNotExist) {
- return errors.Errorf("Pcap file not found %s", pcapFile)
- }
- return nil
- },
- Run: func(cmd *cobra.Command, args []string) {
- protocolType := args[0]
- pcapFile := args[1]
- if err := extractor.Extract(pcapFile, protocolType); err != nil {
- panic(err)
- }
- println("Done")
- },
-}
-
-func init() {
- rootCmd.AddCommand(extractCmd)
-
- extractCmd.Flags().StringVarP(&config.ExtractConfigInstance.Client, "client", "c", "", "The client ip (this is useful for protocols where request/response is different e.g. modbus, cbus)")
- extractCmd.Flags().BoolVarP(&config.ExtractConfigInstance.ShowDirectionalIndicators, "show-directional-indicators", "", true, "Indicates if directional markers should be printed")
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/cmd/root.go b/plc4go/tools/plc4xpcapanalyzer/cmd/root.go
deleted file mode 100644
index 4132f48009..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/cmd/root.go
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package cmd
-
-import (
- "bytes"
- "fmt"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
- "github.com/rs/zerolog/pkgerrors"
- "os"
- "strings"
-
- "github.com/spf13/cobra"
- "github.com/spf13/viper"
-)
-
-// rootCmd represents the base command when called without any subcommands
-var rootCmd = &cobra.Command{
- Use: "plc4xpcapanalyzer",
- Short: "analyzes pcaps with plc4x",
- Long: `todo describe me`,
- // Uncomment the following line if your bare application
- // has an action associated with it:
- // Run: func(cmd *cobra.Command, args []string) { },
-}
-
-// Execute adds all child commands to the root command and sets flags appropriately.
-// This is called by main.main(). It only needs to happen once to the rootCmd.
-func Execute() {
- err := rootCmd.Execute()
- if err != nil {
- os.Exit(1)
- }
-}
-
-func init() {
- cobra.OnInitialize(initConfig)
-
- rootCmd.PersistentFlags().StringVar(&config.RootConfigInstance.CfgFile, "config", "", "config file (default is $HOME/.plc4xpcapanalyzer.yaml)")
- rootCmd.PersistentFlags().StringVar(&config.RootConfigInstance.LogType, "log-type", "text", "define how the log will be evaluated")
- rootCmd.PersistentFlags().StringVar(&config.RootConfigInstance.LogLevel, "log-level", "error", "define the log Level")
- rootCmd.PersistentFlags().CountVarP(&config.RootConfigInstance.Verbosity, "verbose", "v", "counted verbosity")
- rootCmd.PersistentFlags().BoolVarP(&config.RootConfigInstance.HideProgressBar, "hide-progress-bar", "", false, "hides the progress bar")
-
- rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
-}
-
-// initConfig reads in config file and ENV variables if set.
-func initConfig() {
- if config.RootConfigInstance.CfgFile != "" {
- // Use config file from the flag.
- viper.SetConfigFile(config.RootConfigInstance.CfgFile)
- } else {
- // Find user config directory.
- home, err := os.UserConfigDir()
- cobra.CheckErr(err)
-
- viper.AddConfigPath(home)
- viper.SetConfigType("yaml")
- viper.SetConfigName("plc4xpcapanalyzer-viper")
- }
-
- viper.AutomaticEnv() // read in environment variables that match
-
- // If a config file is found, read it in.
- if err := viper.ReadInConfig(); err == nil {
- _, _ = fmt.Fprintln(os.Stderr, "Using config file:", viper.ConfigFileUsed())
- }
-
- zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
- if config.RootConfigInstance.LogType == "text" {
- log.Logger = log.
- //// Enable below if you want to see the filenames
- //With().Caller().Logger().
- Output(zerolog.NewConsoleWriter(
- func(w *zerolog.ConsoleWriter) {
- w.Out = os.Stderr
- },
- func(w *zerolog.ConsoleWriter) {
- w.FormatFieldValue = func(i interface{}) string {
- if aString, ok := i.(string); ok && strings.Contains(aString, "\\n") {
- return fmt.Sprintf("\x1b[%dm%v\x1b[0m", 31, "see below")
- }
- return fmt.Sprintf("%s", i)
- }
- w.FormatExtra = func(m map[string]interface{}, buffer *bytes.Buffer) error {
- for key, i := range m {
- if aString, ok := i.(string); ok && strings.Contains(aString, "\n") {
- buffer.WriteString("\n")
- buffer.WriteString(fmt.Sprintf("\x1b[%dm%v\x1b[0m", 32, "field "+key))
- buffer.WriteString(":\n" + aString)
- }
- }
- return nil
- }
- },
- ),
- ).
- Level(parseLogLevel())
- }
-}
-
-func parseLogLevel() zerolog.Level {
- level, err := zerolog.ParseLevel(config.RootConfigInstance.LogLevel)
- if err != nil {
- log.Fatal().Err(err).Str("level", config.RootConfigInstance.LogLevel).Msg("Unknown log level")
- }
- return level
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/cmd/ui.go b/plc4go/tools/plc4xpcapanalyzer/cmd/ui.go
deleted file mode 100644
index 3d3f83ae09..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/cmd/ui.go
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package cmd
-
-import (
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/ui"
- "github.com/pkg/errors"
- "github.com/rs/zerolog/log"
- "os"
-
- "github.com/spf13/cobra"
-)
-
-// uiCmd represents the ui command
-var uiCmd = &cobra.Command{
- Use: "ui [pcapfile]",
- Short: "Start the ui with optional pcapfile",
- Long: `Analyzes a pcap file using a bacnet driver
-TODO: document me
-`,
- Args: func(cmd *cobra.Command, args []string) error {
- if len(args) < 1 {
- return nil
- }
- pcapFile := args[0]
- if _, err := os.Stat(pcapFile); errors.Is(err, os.ErrNotExist) {
- return errors.Errorf("Pcap file not found %s", pcapFile)
- }
- return nil
- },
- Run: func(cmd *cobra.Command, args []string) {
- ui.LoadConfig()
- application := ui.SetupApplication()
- ui.InitSubsystem()
- if len(args) > 0 {
- pcapFile := args[0]
- go func() {
- err := ui.OpenFile(pcapFile)
- if err != nil {
- log.Error().Err(err).Msg("Error opening argument file")
- }
- }()
- }
-
- defer ui.Shutdown()
- if err := application.Run(); err != nil {
- panic(err)
- }
- },
-}
-
-func init() {
- rootCmd.AddCommand(uiCmd)
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/config/AnalyzeConfig.go b/plc4go/tools/plc4xpcapanalyzer/config/AnalyzeConfig.go
deleted file mode 100644
index 1c6f25377a..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/config/AnalyzeConfig.go
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package config
-
-type AnalyzeConfig struct {
- *PcapConfig `json:"-"`
- NoFilter, OnlyParse, NoBytesCompare, NoCustomMapping bool
-}
-
-var AnalyzeConfigInstance = AnalyzeConfig{}
-
-func init() {
- AnalyzeConfigInstance.PcapConfig = &PcapConfigInstance
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/config/BacnetConfig.go b/plc4go/tools/plc4xpcapanalyzer/config/BacnetConfig.go
deleted file mode 100644
index b662daf917..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/config/BacnetConfig.go
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package config
-
-type BacnetConfig struct {
- *AnalyzeConfig `json:"-"`
- BacnetFilter string
-}
-
-var BacnetConfigInstance = BacnetConfig{}
-
-func init() {
- BacnetConfigInstance.AnalyzeConfig = &AnalyzeConfigInstance
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/config/CBusConfig.go b/plc4go/tools/plc4xpcapanalyzer/config/CBusConfig.go
deleted file mode 100644
index 42bbd4a47f..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/config/CBusConfig.go
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package config
-
-type CBusConfig struct {
- *AnalyzeConfig `json:"-"`
- CBusFilter string
-
- Connect bool
- Smart bool
- Idmon bool
- Exstat bool
- Monitor bool
- Monall bool
- Pun bool
- Pcn bool
- Srchk bool
-}
-
-var CBusConfigInstance = CBusConfig{}
-
-func init() {
- CBusConfigInstance.AnalyzeConfig = &AnalyzeConfigInstance
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/config/ExtractConfig.go b/plc4go/tools/plc4xpcapanalyzer/config/ExtractConfig.go
deleted file mode 100644
index 6f101aa99b..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/config/ExtractConfig.go
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package config
-
-type ExtractType uint
-
-const (
- HEX ExtractType = iota
- ASCII
-)
-
-type ExtractConfig struct {
- *PcapConfig `json:"-"`
- ShowDirectionalIndicators bool
- ExtractType ExtractType
-}
-
-var ExtractConfigInstance = ExtractConfig{}
-
-func init() {
- ExtractConfigInstance.PcapConfig = &PcapConfigInstance
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/config/PcapConfig.go b/plc4go/tools/plc4xpcapanalyzer/config/PcapConfig.go
deleted file mode 100644
index c399c633e5..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/config/PcapConfig.go
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package config
-
-type PcapConfig struct {
- *RootConfig `json:"-"`
- Filter string
- Client string
- StartPackageNumber uint
- PackageNumberLimit uint
-}
-
-var PcapConfigInstance = PcapConfig{}
-
-func init() {
- PcapConfigInstance.RootConfig = &RootConfigInstance
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/config/RootConfig.go b/plc4go/tools/plc4xpcapanalyzer/config/RootConfig.go
deleted file mode 100644
index 35b1730d8e..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/config/RootConfig.go
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package config
-
-type RootConfig struct {
- CfgFile string
- LogType string
- LogLevel string
- Verbosity int
- HideProgressBar bool
-}
-
-var RootConfigInstance = RootConfig{}
diff --git a/plc4go/tools/plc4xpcapanalyzer/doc.go b/plc4go/tools/plc4xpcapanalyzer/doc.go
deleted file mode 100644
index 7be81349ce..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/doc.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*
- Package main contains the code for the plc4xpcapanalyzer
-
-The plc4xpcapanalyzer is meant to be used for internal plc4x development. It can be used to analyze pcap files using the
-parser/serializers of plc4x.
-*/
-package main
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/analyzer/analyzer.go b/plc4go/tools/plc4xpcapanalyzer/internal/analyzer/analyzer.go
deleted file mode 100644
index de4972954c..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/internal/analyzer/analyzer.go
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package analyzer
-
-import (
- "bytes"
- "context"
- "encoding/hex"
- "fmt"
- "github.com/apache/plc4x/plc4go/spi"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/bacnetanalyzer"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/common"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/pcaphandler"
- "github.com/gopacket/gopacket"
- "github.com/gopacket/gopacket/layers"
- "github.com/k0kubun/go-ansi"
- "github.com/pkg/errors"
- "github.com/rs/zerolog/log"
- "github.com/schollz/progressbar/v3"
- "io"
- "net"
- "os"
- "time"
-)
-
-func Analyze(pcapFile, protocolType string) error {
- return AnalyzeWithOutput(pcapFile, protocolType, os.Stdout, os.Stderr)
-}
-
-func AnalyzeWithOutput(pcapFile, protocolType string, stdout, stderr io.Writer) error {
- return AnalyzeWithOutputAndCallback(context.TODO(), pcapFile, protocolType, stdout, stderr, nil)
-}
-
-func AnalyzeWithOutputAndCallback(ctx context.Context, pcapFile, protocolType string, stdout, stderr io.Writer, messageCallback func(parsed spi.Message)) error {
- var filterExpression = config.AnalyzeConfigInstance.Filter
- if filterExpression != "" {
- log.Info().Str("filterExpression", filterExpression).Msg("Using global filter")
- }
- var mapPackets = func(in chan gopacket.Packet, packetInformationCreator func(packet gopacket.Packet) common.PacketInformation) chan gopacket.Packet {
- return in
- }
- var packageParse func(common.PacketInformation, []byte) (spi.Message, error)
- var serializePackage func(spi.Message) ([]byte, error)
- var prettyPrint = func(item spi.Message) {
- _, _ = fmt.Fprintf(stdout, "%v\n", item)
- }
- var byteOutput = hex.Dump
- switch protocolType {
- case "bacnetip":
- if !config.AnalyzeConfigInstance.NoFilter {
- if config.AnalyzeConfigInstance.Filter == "" && config.BacnetConfigInstance.BacnetFilter != "" {
- log.Debug().Str("filter", config.BacnetConfigInstance.Filter).Msg("Setting bacnet filter")
- filterExpression = config.BacnetConfigInstance.BacnetFilter
- }
- } else {
- log.Info().Msg("All filtering disabled")
- }
- packageParse = bacnetanalyzer.PackageParse
- serializePackage = bacnetanalyzer.SerializePackage
- case "c-bus":
- if !config.AnalyzeConfigInstance.NoFilter {
- if config.AnalyzeConfigInstance.Filter == "" && config.CBusConfigInstance.CBusFilter != "" {
- log.Debug().Str("filter", config.CBusConfigInstance.Filter).Msg("Setting cbus filter")
- filterExpression = config.CBusConfigInstance.CBusFilter
- }
- } else {
- log.Info().Msg("All filtering disabled")
- }
- analyzer := cbusanalyzer.Analyzer{Client: net.ParseIP(config.AnalyzeConfigInstance.Client)}
- analyzer.Init()
- packageParse = analyzer.PackageParse
- serializePackage = analyzer.SerializePackage
- mapPackets = analyzer.MapPackets
- if !config.AnalyzeConfigInstance.NoCustomMapping {
- byteOutput = analyzer.ByteOutput
- } else {
- log.Info().Msg("Custom mapping disabled")
- }
- default:
- return errors.Errorf("Unsupported protocol type %s", protocolType)
- }
-
- log.Info().
- Str("pcapFile", pcapFile).
- Str("protocolType", protocolType).
- Str("filterExpression", filterExpression).
- Msg("Analyzing pcap file pcapFile with protocolType and filter filterExpression now")
- handle, numberOfPackage, timestampToIndexMap, err := pcaphandler.GetIndexedPcapHandle(pcapFile, filterExpression)
- if err != nil {
- return errors.Wrap(err, "Error getting handle")
- }
- log.Info().Int("numberOfPackage", numberOfPackage).Msg("Starting to analyze numberOfPackage packages")
- defer handle.Close()
- log.Debug().Interface("handle", handle).Int("numberOfPackage", numberOfPackage).Msg("got handle")
- source := pcaphandler.GetPacketSource(handle)
- bar := progressbar.NewOptions(numberOfPackage, progressbar.OptionSetWriter(ansi.NewAnsiStderr()),
- progressbar.OptionSetVisibility(!config.RootConfigInstance.HideProgressBar),
- progressbar.OptionEnableColorCodes(true),
- progressbar.OptionShowBytes(false),
- progressbar.OptionSetWidth(15),
- progressbar.OptionSetDescription("[cyan][1/3][reset] Analyzing packages..."),
- progressbar.OptionSetTheme(progressbar.Theme{
- Saucer: "[green]=[reset]",
- SaucerHead: "[green]>[reset]",
- SaucerPadding: " ",
- BarStart: "[",
- BarEnd: "]",
- }))
- currentPackageNum := uint(0)
- parseFails := 0
- serializeFails := 0
- compareFails := 0
- for packet := range mapPackets(source.Packets(), func(packet gopacket.Packet) common.PacketInformation {
- return createPacketInformation(pcapFile, packet, timestampToIndexMap)
- }) {
- if err := ctx.Err(); err != nil {
- log.Info().Err(err).Uint("currentPackageNum", currentPackageNum).Msg("Aborted after currentPackageNum packages")
- break
- }
- currentPackageNum++
- if currentPackageNum < config.AnalyzeConfigInstance.StartPackageNumber {
- log.Debug().
- Uint("currentPackageNum", currentPackageNum).
- Uint("startPackageNum", config.AnalyzeConfigInstance.StartPackageNumber).
- Msg("Skipping package number currentPackageNum (till no. startPackageNum)")
- continue
- }
- if currentPackageNum > config.AnalyzeConfigInstance.PackageNumberLimit {
- log.Warn().
- Uint("PackageNumberLimit", config.AnalyzeConfigInstance.PackageNumberLimit).
- Msg("Aborting reading packages because we hit the limit of packageNumberLimit")
- break
- }
- if packet == nil {
- log.Debug().Msg("Done reading packages. (nil returned)")
- break
- }
- if err := bar.Add(1); err != nil {
- log.Warn().Err(err).Msg("Error updating progressBar")
- }
- packetInformation := createPacketInformation(pcapFile, packet, timestampToIndexMap)
- realPacketNumber := packetInformation.PacketNumber
- if filteredPackage, ok := packet.(common.FilteredPackage); ok {
- log.Info().Err(filteredPackage.FilterReason()).
- Int("realPacketNumber", realPacketNumber).Msg("No.[realPacketNumber] was filtered")
- continue
- }
-
- applicationLayer := packet.ApplicationLayer()
- if applicationLayer == nil {
- log.Info().Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Msg("No.[realPacketNumber] No application layer")
- continue
- }
- payload := applicationLayer.Payload()
- if parsed, err := packageParse(packetInformation, payload); err != nil {
- switch err {
- case common.ErrUnterminatedPackage:
- log.Info().Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Msg("No.[realPacketNumber] is unterminated")
- case common.ErrEmptyPackage:
- log.Info().Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Msg("No.[realPacketNumber] is empty")
- case common.ErrEcho:
- log.Info().Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Msg("No.[realPacketNumber] is echo")
- default:
- parseFails++
- // TODO: write report to xml or something
- log.Error().
- Err(err).
- Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Str("byteOutput", byteOutput(payload)).
- Msg("No.[realPacketNumber] Error parsing package.")
- }
- continue
- } else {
- if messageCallback != nil {
- messageCallback(parsed)
- }
- log.Info().
- Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Msg("No.[realPacketNumber] Parsed")
- if config.AnalyzeConfigInstance.Verbosity > 1 {
- prettyPrint(parsed)
- }
- if config.AnalyzeConfigInstance.OnlyParse {
- log.Trace().Msg("only parsing")
- continue
- }
- serializedBytes, err := serializePackage(parsed)
- if err != nil {
- serializeFails++
- // TODO: write report to xml or something
- log.Warn().
- Err(err).
- Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Msg("No.[realPacketNumber] Error serializing")
- continue
- }
- if config.AnalyzeConfigInstance.NoBytesCompare {
- log.Trace().Msg("not comparing bytes")
- continue
- }
- if compareResult := bytes.Compare(payload, serializedBytes); compareResult != 0 {
- compareFails++
- // TODO: write report to xml or something
- log.Warn().
- Stringer("packetInformation", packetInformation).
- Int("realPacketNumber", realPacketNumber).
- Str("byteOutputPayload", byteOutput(payload)).
- Str("byteSerializedBytes", byteOutput(serializedBytes)).
- Msg("No.[realPacketNumber] Bytes don't match.")
- if config.AnalyzeConfigInstance.Verbosity > 0 {
- _, _ = fmt.Fprintf(stdout, "Original bytes\n%s\n%s\n", hex.Dump(payload), hex.Dump(serializedBytes))
- }
- }
- }
- }
-
- log.Info().
- Uint("currentPackageNum", currentPackageNum).
- Int("numberOfPackage", numberOfPackage).
- Int("parseFails", parseFails).
- Int("serializeFails", serializeFails).
- Int("compareFails", compareFails).
- Msg("Done evaluating currentPackageNum of numberOfPackage packages (parseFails failed to parse, serializeFails failed to serialize and compareFails failed in byte comparison)")
- return nil
-}
-
-func createPacketInformation(pcapFile string, packet gopacket.Packet, timestampToIndexMap map[time.Time]int) common.PacketInformation {
- packetTimestamp := packet.Metadata().Timestamp
- realPacketNumber := timestampToIndexMap[packetTimestamp]
- description := fmt.Sprintf("No.[%d] timestamp: %v, %s", realPacketNumber, packetTimestamp, pcapFile)
- packetInformation := common.PacketInformation{
- PacketNumber: realPacketNumber,
- PacketTimestamp: packetTimestamp,
- Description: description,
- }
- if networkLayer, ok := packet.NetworkLayer().(*layers.IPv4); ok {
- packetInformation.SrcIp = networkLayer.SrcIP
- packetInformation.DstIp = networkLayer.DstIP
- }
- return packetInformation
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/bacnetanalyzer/analyzer.go b/plc4go/tools/plc4xpcapanalyzer/internal/bacnetanalyzer/analyzer.go
deleted file mode 100644
index f7a5d8b5d3..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/internal/bacnetanalyzer/analyzer.go
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package bacnetanalyzer
-
-import (
- "context"
- "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
- "github.com/apache/plc4x/plc4go/spi"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/common"
- "github.com/pkg/errors"
- "github.com/rs/zerolog/log"
-)
-
-func PackageParse(packetInformation common.PacketInformation, payload []byte) (spi.Message, error) {
- log.Debug().Stringer("packetInformation", packetInformation).Msg("Parsing")
- parse, err := model.BVLCParse(context.TODO(), payload)
- if err != nil {
- return nil, errors.Wrap(err, "Error parsing bvlc")
- }
- log.Debug().Stringer("parse", parse).Msg("Parsed bvlc")
- return parse, nil
-}
-
-func SerializePackage(bvlc spi.Message) ([]byte, error) {
- if bvlc, ok := bvlc.(model.BVLC); !ok {
- log.Fatal().Type("bvlc", bvlc).Msg("Unsupported type supplied")
- panic("unreachable statement")
- } else {
- theBytes, err := bvlc.Serialize()
- if err != nil {
- return nil, errors.Wrap(err, "Error serializing")
- }
- return theBytes, nil
- }
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go b/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go
deleted file mode 100644
index bef46f481b..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package cbusanalyzer
-
-import (
- "context"
- "fmt"
- "net"
- "reflect"
-
- "github.com/apache/plc4x/plc4go/internal/cbus"
- "github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
- "github.com/apache/plc4x/plc4go/spi"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/common"
- "github.com/gopacket/gopacket"
- "github.com/pkg/errors"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
-)
-
-type Analyzer struct {
- Client net.IP
- requestContext model.RequestContext
- cBusOptions model.CBusOptions
- initialized bool
- currentInboundPayloads map[string][]byte
- currentPrefilterInboundPayloads map[string][]byte
- mappedPacketChan chan gopacket.Packet
-
- lastParsePayload []byte
- lastMapPayload []byte
-}
-
-func (a *Analyzer) Init() {
- if a.initialized {
- return
- }
- a.requestContext = model.NewRequestContext(false)
- a.cBusOptions = model.NewCBusOptions(config.CBusConfigInstance.Connect, config.CBusConfigInstance.Smart, config.CBusConfigInstance.Idmon, config.CBusConfigInstance.Exstat, config.CBusConfigInstance.Monitor, config.CBusConfigInstance.Monall, config.CBusConfigInstance.Pun, config.CBusConfigInstance.Pcn, config.CBusConfigInstance.Srchk)
- a.currentInboundPayloads = make(map[string][]byte)
- a.currentPrefilterInboundPayloads = make(map[string][]byte)
- a.initialized = true
-}
-
-func (a *Analyzer) PackageParse(packetInformation common.PacketInformation, payload []byte) (spi.Message, error) {
- if !a.initialized {
- log.Warn().Msg("Not initialized... doing that now")
- a.Init()
- }
- cBusOptions := a.cBusOptions
- log.Debug().
- Stringer("packetInformation", packetInformation).
- Stringer("requestContext", a.requestContext).
- Stringer("cBusOptions", cBusOptions).
- Bytes("payload", payload).
- Msg("Parsing")
- isResponse := a.isResponse(packetInformation)
- if isResponse {
- // Responses should have a checksum
- cBusOptions = model.NewCBusOptions(
- cBusOptions.GetConnect(),
- cBusOptions.GetSmart(),
- cBusOptions.GetIdmon(),
- cBusOptions.GetExstat(),
- cBusOptions.GetMonitor(),
- cBusOptions.GetMonall(),
- cBusOptions.GetPun(),
- cBusOptions.GetPcn(),
- true,
- )
- }
- mergeCallback := func(index int) {
- log.Warn().Stringer("packetInformation", packetInformation).Int("index", index).Msg("we have a split at index")
- }
- currentPayload, err := a.getCurrentPayload(packetInformation, payload, mergeCallback, a.currentInboundPayloads, &a.lastParsePayload)
- if err != nil {
- return nil, err
- }
- if reflect.DeepEqual(currentPayload, a.lastParsePayload) {
- return nil, common.ErrEcho
- }
- a.lastParsePayload = currentPayload
- parse, err := model.CBusMessageParse(context.TODO(), currentPayload, isResponse, a.requestContext, cBusOptions)
- if err != nil {
- if secondParse, err := model.CBusMessageParse(context.TODO(), currentPayload, isResponse, model.NewRequestContext(false), model.NewCBusOptions(false, false, false, false, false, false, false, false, false)); err != nil {
- log.Debug().Err(err).Msg("Second parse failed too")
- return nil, errors.Wrap(err, "Error parsing CBusCommand")
- } else {
- log.Warn().
- Stringer("packetInformation", packetInformation).
- Stringer("secondParse", secondParse).
- Msg("package got overridden by second parse... probably a MMI")
- parse = secondParse
- }
- }
- a.requestContext = cbus.CreateRequestContextWithInfoCallback(parse, func(infoString string) {
- log.Debug().
- Int("packetNumber", packetInformation.PacketNumber).
- Str("infoString", infoString).
- Msg("No.[packetNumber] infoString")
- })
- log.Debug().Stringer("parse", parse).Msg("Parsed c-bus command")
- return parse, nil
-}
-
-func (a *Analyzer) isResponse(packetInformation common.PacketInformation) bool {
- isResponse := packetInformation.DstIp.Equal(a.Client)
- log.Debug().Stringer("packetInformation", packetInformation).Bool("isResponse", isResponse).Msg("isResponse")
- return isResponse
-}
-
-func (a *Analyzer) getCurrentPayload(packetInformation common.PacketInformation, payload []byte, mergeCallback func(int), currentInboundPayloads map[string][]byte, lastPayload *[]byte) ([]byte, error) {
- srcUip := packetInformation.SrcIp.String()
- payload = filterXOnXOff(payload)
- if len(payload) == 0 {
- return nil, common.ErrEmptyPackage
- }
- currentPayload := currentInboundPayloads[srcUip]
- if currentPayload != nil {
- log.Debug().Func(func(e *zerolog.Event) {
- e.
- Bytes("currentPayload", currentPayload).
- Bytes("actualPayload", payload).
- Interface("allPayload", append(currentPayload, payload...)).
- Msg("Prepending current payload currentPayload to actual payload actualPayload: allPayload")
- })
- currentPayload = append(currentPayload, payload...)
- } else {
- currentPayload = payload
- }
- if len(currentPayload) == 1 && currentPayload[0] == '!' {
- // This is an errormessage from the server
- return currentPayload, nil
- }
- containsError := false
- // We ensure that there are no random ! in the string
- currentPayload, containsError = filterOneServerError(currentPayload)
- if containsError {
- // Save the current inbound payload for the next try
- currentInboundPayloads[srcUip] = currentPayload
- return []byte{'!'}, nil
- }
- // Check if we have a termination in the middle
- isMergedMessage, shouldClearInboundPayload := mergeCheck(¤tPayload, srcUip, mergeCallback, currentInboundPayloads, lastPayload)
- if !isMergedMessage {
- // When we have a merge message we already set the current payload to the tail
- currentInboundPayloads[srcUip] = currentPayload
- } else {
- log.Debug().Stringer("packetInformation", packetInformation).
- Interface("remainder", currentInboundPayloads[srcUip]).
- Msg("Remainder %+q")
- }
- if lastElement := currentPayload[len(currentPayload)-1]; (lastElement != '\r') && (lastElement != '\n') {
- return nil, common.ErrUnterminatedPackage
- } else {
- log.Debug().Stringer("packetInformation", packetInformation).
- Uint8("lastElement", lastElement).
- Msg("Last element")
- if shouldClearInboundPayload {
- if currentSavedPayload := currentInboundPayloads[srcUip]; currentSavedPayload != nil {
- // We remove our current payload from the beginning of the cache
- for i, b := range currentPayload {
- if currentSavedPayload[i] != b {
- panic("programming error... at this point they should start with the identical bytes")
- }
- }
- }
- currentInboundPayloads[srcUip] = nil
- }
- }
- log.Debug().Stringer("packetInformation", packetInformation).
- Bytes("currentPayload", currentPayload).
- Msg("Returning payload")
- return currentPayload, nil
-}
-
-func mergeCheck(currentPayload *[]byte, srcUip string, mergeCallback func(int), currentInboundPayloads map[string][]byte, lastPayload *[]byte) (isMergedMessage, shouldClearInboundPayload bool) {
- // Check if we have a merged message
- for i, b := range *currentPayload {
- if i == 0 {
- // we ignore the first byte as this is typical for reset etc... so maybe this is good or bad we will see
- continue
- }
- switch b {
- case 0x0D:
- if i+1 < len(*currentPayload) && (*currentPayload)[i+1] == 0x0A {
- // If we know the next is a newline we jump to that index...
- i++
- }
- // ... other than that the logic is the same
- fallthrough
- case 0x0A:
- // We have a merged message if we are not at the end
- if i < len(*currentPayload)-1 {
- headPayload := (*currentPayload)[:i+1]
- tailPayload := (*currentPayload)[i+1:]
- if reflect.DeepEqual(headPayload, *lastPayload) {
- // This means that we have a merge where the last payload is an echo. In that case we discard that here to not offset all numbers
- *currentPayload = tailPayload
- log.Debug().Bytes("headPayload", headPayload).Msg("We cut the echo message %s out of the response to keep numbering")
- return mergeCheck(currentPayload, srcUip, mergeCallback, currentInboundPayloads, lastPayload)
- } else {
- if mergeCallback != nil {
- mergeCallback(i)
- }
- // In this case we need to put the tail into our "buffer"
- currentInboundPayloads[srcUip] = tailPayload
- // and use the beginning as current payload
- *currentPayload = headPayload
- return true, false
- }
- }
- }
- }
- return false, true
-}
-
-func filterXOnXOff(payload []byte) []byte {
- n := 0
- for i, b := range payload {
- switch b {
- case 0x11: // Filter XON
- fallthrough
- case 0x13: // Filter XOFF
- log.Trace().
- Uint8("b", b).
- Int("i", i).
- Bytes("payload", payload).
- Msg("Filtering b at i for payload")
- default:
- payload[n] = b
- n++
- }
- }
- return payload[:n]
-}
-
-func filterOneServerError(unfilteredPayload []byte) (filteredPayload []byte, containsError bool) {
- for i, b := range unfilteredPayload {
- if b == '!' {
- return append(unfilteredPayload[:i], unfilteredPayload[i+1:]...), true
-
- }
- }
- return unfilteredPayload, false
-}
-
-func (a *Analyzer) SerializePackage(message spi.Message) ([]byte, error) {
- if message, ok := message.(model.CBusMessage); !ok {
- log.Fatal().Type("message", message).Msg("Unsupported type supplied")
- panic("unreachable statement")
- } else {
- theBytes, err := message.Serialize()
- if err != nil {
- return nil, errors.Wrap(err, "Error serializing")
- }
- return theBytes, nil
- }
-}
-
-// MapPackets reorders the packages as they were not split
-func (a *Analyzer) MapPackets(in chan gopacket.Packet, packetInformationCreator func(packet gopacket.Packet) common.PacketInformation) chan gopacket.Packet {
- if a.mappedPacketChan == nil {
- a.mappedPacketChan = make(chan gopacket.Packet)
- go func() {
- defer close(a.mappedPacketChan)
- mappingLoop:
- for packet := range in {
- switch {
- case packet == nil:
- log.Debug().Msg("Done reading packages. (nil returned)")
- a.mappedPacketChan <- nil
- break mappingLoop
- case packet.ApplicationLayer() == nil:
- a.mappedPacketChan <- packet
- default:
- packetInformation := packetInformationCreator(packet)
- mergeCallback := func(index int) {
- log.Warn().Stringer("packetInformation", packetInformation).
- Int("index", index).
- Msg("we have a split at index")
- }
- if payload, err := a.getCurrentPayload(packetInformation, packet.ApplicationLayer().Payload(), mergeCallback, a.currentPrefilterInboundPayloads, &a.lastMapPayload); err != nil {
- log.Debug().Err(err).Stringer("packetInformation", packetInformation).Msg("Filtering message")
- a.mappedPacketChan <- common.NewFilteredPackage(err, packet)
- } else {
- currentApplicationLayer := packet.ApplicationLayer()
- newPayload := gopacket.Payload(payload)
- if !reflect.DeepEqual(currentApplicationLayer.Payload(), payload) {
- log.Debug().
- Bytes("currentPayload", currentApplicationLayer.Payload()).
- Bytes("payload", payload).
- Msg("Replacing payload currentPayload with payload")
- packet = &manipulatedPackage{Packet: packet, newApplicationLayer: newPayload}
- }
- a.lastMapPayload = payload
- a.mappedPacketChan <- packet
- }
- }
- }
- }()
- }
- return a.mappedPacketChan
-}
-
-// ByteOutput returns the string representation as usually this is ASCII over serial... so this output is much more useful in that context
-func (a *Analyzer) ByteOutput(data []byte) string {
- return fmt.Sprintf("%+q\n", data)
-}
-
-type manipulatedPackage struct {
- gopacket.Packet
- newApplicationLayer gopacket.ApplicationLayer
-}
-
-func (p *manipulatedPackage) SetApplicationLayer(l gopacket.ApplicationLayer) {
- p.newApplicationLayer = l
-}
-
-func (p *manipulatedPackage) ApplicationLayer() gopacket.ApplicationLayer {
- return p.newApplicationLayer
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/common/common.go b/plc4go/tools/plc4xpcapanalyzer/internal/common/common.go
deleted file mode 100644
index afab92d181..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/internal/common/common.go
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package common
-
-import (
- "fmt"
- "github.com/gopacket/gopacket"
- "github.com/pkg/errors"
- "net"
- "time"
-)
-
-type PacketInformation struct {
- PacketNumber int
- PacketTimestamp time.Time
- Description string
- SrcIp net.IP
- DstIp net.IP
-}
-
-func (p PacketInformation) String() string {
- return fmt.Sprintf("%s (SrcIp:%v, DstIp:%v)", p.Description, p.SrcIp, p.DstIp)
-}
-
-// ErrUnterminatedPackage is used when a transmission is incomplete (usually when package is split)
-var ErrUnterminatedPackage = errors.New("ErrUnterminatedPackage")
-
-// ErrEmptyPackage is used when there is no payload
-var ErrEmptyPackage = errors.New("ErrEmptyPackage")
-
-// ErrEcho is used when the package is a echo from the previous
-var ErrEcho = errors.New("ErrEcho")
-
-type FilteredPackage interface {
- gopacket.Packet
- IsFilteredPackage() bool
- FilterReason() error
-}
-
-func NewFilteredPackage(err error, packet gopacket.Packet) FilteredPackage {
- return &filteredPackage{Packet: packet, err: err}
-}
-
-type filteredPackage struct {
- gopacket.Packet
- err error
-}
-
-func (f *filteredPackage) IsFilteredPackage() bool {
- return true
-}
-
-func (f *filteredPackage) FilterReason() error {
- return f.err
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/common/mock_FilteredPackage_test.go b/plc4go/tools/plc4xpcapanalyzer/internal/common/mock_FilteredPackage_test.go
deleted file mode 100644
index e7cb049dfe..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/internal/common/mock_FilteredPackage_test.go
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by mockery v2.32.4. DO NOT EDIT.
-
-package common
-
-import (
- gopacket "github.com/gopacket/gopacket"
- mock "github.com/stretchr/testify/mock"
-)
-
-// MockFilteredPackage is an autogenerated mock type for the FilteredPackage type
-type MockFilteredPackage struct {
- mock.Mock
-}
-
-type MockFilteredPackage_Expecter struct {
- mock *mock.Mock
-}
-
-func (_m *MockFilteredPackage) EXPECT() *MockFilteredPackage_Expecter {
- return &MockFilteredPackage_Expecter{mock: &_m.Mock}
-}
-
-// ApplicationLayer provides a mock function with given fields:
-func (_m *MockFilteredPackage) ApplicationLayer() gopacket.ApplicationLayer {
- ret := _m.Called()
-
- var r0 gopacket.ApplicationLayer
- if rf, ok := ret.Get(0).(func() gopacket.ApplicationLayer); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(gopacket.ApplicationLayer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_ApplicationLayer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplicationLayer'
-type MockFilteredPackage_ApplicationLayer_Call struct {
- *mock.Call
-}
-
-// ApplicationLayer is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) ApplicationLayer() *MockFilteredPackage_ApplicationLayer_Call {
- return &MockFilteredPackage_ApplicationLayer_Call{Call: _e.mock.On("ApplicationLayer")}
-}
-
-func (_c *MockFilteredPackage_ApplicationLayer_Call) Run(run func()) *MockFilteredPackage_ApplicationLayer_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_ApplicationLayer_Call) Return(_a0 gopacket.ApplicationLayer) *MockFilteredPackage_ApplicationLayer_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_ApplicationLayer_Call) RunAndReturn(run func() gopacket.ApplicationLayer) *MockFilteredPackage_ApplicationLayer_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// Data provides a mock function with given fields:
-func (_m *MockFilteredPackage) Data() []byte {
- ret := _m.Called()
-
- var r0 []byte
- if rf, ok := ret.Get(0).(func() []byte); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).([]byte)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_Data_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Data'
-type MockFilteredPackage_Data_Call struct {
- *mock.Call
-}
-
-// Data is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) Data() *MockFilteredPackage_Data_Call {
- return &MockFilteredPackage_Data_Call{Call: _e.mock.On("Data")}
-}
-
-func (_c *MockFilteredPackage_Data_Call) Run(run func()) *MockFilteredPackage_Data_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_Data_Call) Return(_a0 []byte) *MockFilteredPackage_Data_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_Data_Call) RunAndReturn(run func() []byte) *MockFilteredPackage_Data_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// Dump provides a mock function with given fields:
-func (_m *MockFilteredPackage) Dump() string {
- ret := _m.Called()
-
- var r0 string
- if rf, ok := ret.Get(0).(func() string); ok {
- r0 = rf()
- } else {
- r0 = ret.Get(0).(string)
- }
-
- return r0
-}
-
-// MockFilteredPackage_Dump_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Dump'
-type MockFilteredPackage_Dump_Call struct {
- *mock.Call
-}
-
-// Dump is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) Dump() *MockFilteredPackage_Dump_Call {
- return &MockFilteredPackage_Dump_Call{Call: _e.mock.On("Dump")}
-}
-
-func (_c *MockFilteredPackage_Dump_Call) Run(run func()) *MockFilteredPackage_Dump_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_Dump_Call) Return(_a0 string) *MockFilteredPackage_Dump_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_Dump_Call) RunAndReturn(run func() string) *MockFilteredPackage_Dump_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// ErrorLayer provides a mock function with given fields:
-func (_m *MockFilteredPackage) ErrorLayer() gopacket.ErrorLayer {
- ret := _m.Called()
-
- var r0 gopacket.ErrorLayer
- if rf, ok := ret.Get(0).(func() gopacket.ErrorLayer); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(gopacket.ErrorLayer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_ErrorLayer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ErrorLayer'
-type MockFilteredPackage_ErrorLayer_Call struct {
- *mock.Call
-}
-
-// ErrorLayer is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) ErrorLayer() *MockFilteredPackage_ErrorLayer_Call {
- return &MockFilteredPackage_ErrorLayer_Call{Call: _e.mock.On("ErrorLayer")}
-}
-
-func (_c *MockFilteredPackage_ErrorLayer_Call) Run(run func()) *MockFilteredPackage_ErrorLayer_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_ErrorLayer_Call) Return(_a0 gopacket.ErrorLayer) *MockFilteredPackage_ErrorLayer_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_ErrorLayer_Call) RunAndReturn(run func() gopacket.ErrorLayer) *MockFilteredPackage_ErrorLayer_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// FilterReason provides a mock function with given fields:
-func (_m *MockFilteredPackage) FilterReason() error {
- ret := _m.Called()
-
- var r0 error
- if rf, ok := ret.Get(0).(func() error); ok {
- r0 = rf()
- } else {
- r0 = ret.Error(0)
- }
-
- return r0
-}
-
-// MockFilteredPackage_FilterReason_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterReason'
-type MockFilteredPackage_FilterReason_Call struct {
- *mock.Call
-}
-
-// FilterReason is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) FilterReason() *MockFilteredPackage_FilterReason_Call {
- return &MockFilteredPackage_FilterReason_Call{Call: _e.mock.On("FilterReason")}
-}
-
-func (_c *MockFilteredPackage_FilterReason_Call) Run(run func()) *MockFilteredPackage_FilterReason_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_FilterReason_Call) Return(_a0 error) *MockFilteredPackage_FilterReason_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_FilterReason_Call) RunAndReturn(run func() error) *MockFilteredPackage_FilterReason_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// IsFilteredPackage provides a mock function with given fields:
-func (_m *MockFilteredPackage) IsFilteredPackage() bool {
- ret := _m.Called()
-
- var r0 bool
- if rf, ok := ret.Get(0).(func() bool); ok {
- r0 = rf()
- } else {
- r0 = ret.Get(0).(bool)
- }
-
- return r0
-}
-
-// MockFilteredPackage_IsFilteredPackage_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsFilteredPackage'
-type MockFilteredPackage_IsFilteredPackage_Call struct {
- *mock.Call
-}
-
-// IsFilteredPackage is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) IsFilteredPackage() *MockFilteredPackage_IsFilteredPackage_Call {
- return &MockFilteredPackage_IsFilteredPackage_Call{Call: _e.mock.On("IsFilteredPackage")}
-}
-
-func (_c *MockFilteredPackage_IsFilteredPackage_Call) Run(run func()) *MockFilteredPackage_IsFilteredPackage_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_IsFilteredPackage_Call) Return(_a0 bool) *MockFilteredPackage_IsFilteredPackage_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_IsFilteredPackage_Call) RunAndReturn(run func() bool) *MockFilteredPackage_IsFilteredPackage_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// Layer provides a mock function with given fields: _a0
-func (_m *MockFilteredPackage) Layer(_a0 gopacket.LayerType) gopacket.Layer {
- ret := _m.Called(_a0)
-
- var r0 gopacket.Layer
- if rf, ok := ret.Get(0).(func(gopacket.LayerType) gopacket.Layer); ok {
- r0 = rf(_a0)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(gopacket.Layer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_Layer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Layer'
-type MockFilteredPackage_Layer_Call struct {
- *mock.Call
-}
-
-// Layer is a helper method to define mock.On call
-// - _a0 gopacket.LayerType
-func (_e *MockFilteredPackage_Expecter) Layer(_a0 interface{}) *MockFilteredPackage_Layer_Call {
- return &MockFilteredPackage_Layer_Call{Call: _e.mock.On("Layer", _a0)}
-}
-
-func (_c *MockFilteredPackage_Layer_Call) Run(run func(_a0 gopacket.LayerType)) *MockFilteredPackage_Layer_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(gopacket.LayerType))
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_Layer_Call) Return(_a0 gopacket.Layer) *MockFilteredPackage_Layer_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_Layer_Call) RunAndReturn(run func(gopacket.LayerType) gopacket.Layer) *MockFilteredPackage_Layer_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// LayerClass provides a mock function with given fields: _a0
-func (_m *MockFilteredPackage) LayerClass(_a0 gopacket.LayerClass) gopacket.Layer {
- ret := _m.Called(_a0)
-
- var r0 gopacket.Layer
- if rf, ok := ret.Get(0).(func(gopacket.LayerClass) gopacket.Layer); ok {
- r0 = rf(_a0)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(gopacket.Layer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_LayerClass_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LayerClass'
-type MockFilteredPackage_LayerClass_Call struct {
- *mock.Call
-}
-
-// LayerClass is a helper method to define mock.On call
-// - _a0 gopacket.LayerClass
-func (_e *MockFilteredPackage_Expecter) LayerClass(_a0 interface{}) *MockFilteredPackage_LayerClass_Call {
- return &MockFilteredPackage_LayerClass_Call{Call: _e.mock.On("LayerClass", _a0)}
-}
-
-func (_c *MockFilteredPackage_LayerClass_Call) Run(run func(_a0 gopacket.LayerClass)) *MockFilteredPackage_LayerClass_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(gopacket.LayerClass))
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_LayerClass_Call) Return(_a0 gopacket.Layer) *MockFilteredPackage_LayerClass_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_LayerClass_Call) RunAndReturn(run func(gopacket.LayerClass) gopacket.Layer) *MockFilteredPackage_LayerClass_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// Layers provides a mock function with given fields:
-func (_m *MockFilteredPackage) Layers() []gopacket.Layer {
- ret := _m.Called()
-
- var r0 []gopacket.Layer
- if rf, ok := ret.Get(0).(func() []gopacket.Layer); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).([]gopacket.Layer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_Layers_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Layers'
-type MockFilteredPackage_Layers_Call struct {
- *mock.Call
-}
-
-// Layers is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) Layers() *MockFilteredPackage_Layers_Call {
- return &MockFilteredPackage_Layers_Call{Call: _e.mock.On("Layers")}
-}
-
-func (_c *MockFilteredPackage_Layers_Call) Run(run func()) *MockFilteredPackage_Layers_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_Layers_Call) Return(_a0 []gopacket.Layer) *MockFilteredPackage_Layers_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_Layers_Call) RunAndReturn(run func() []gopacket.Layer) *MockFilteredPackage_Layers_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// LinkLayer provides a mock function with given fields:
-func (_m *MockFilteredPackage) LinkLayer() gopacket.LinkLayer {
- ret := _m.Called()
-
- var r0 gopacket.LinkLayer
- if rf, ok := ret.Get(0).(func() gopacket.LinkLayer); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(gopacket.LinkLayer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_LinkLayer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LinkLayer'
-type MockFilteredPackage_LinkLayer_Call struct {
- *mock.Call
-}
-
-// LinkLayer is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) LinkLayer() *MockFilteredPackage_LinkLayer_Call {
- return &MockFilteredPackage_LinkLayer_Call{Call: _e.mock.On("LinkLayer")}
-}
-
-func (_c *MockFilteredPackage_LinkLayer_Call) Run(run func()) *MockFilteredPackage_LinkLayer_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_LinkLayer_Call) Return(_a0 gopacket.LinkLayer) *MockFilteredPackage_LinkLayer_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_LinkLayer_Call) RunAndReturn(run func() gopacket.LinkLayer) *MockFilteredPackage_LinkLayer_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// Metadata provides a mock function with given fields:
-func (_m *MockFilteredPackage) Metadata() *gopacket.PacketMetadata {
- ret := _m.Called()
-
- var r0 *gopacket.PacketMetadata
- if rf, ok := ret.Get(0).(func() *gopacket.PacketMetadata); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(*gopacket.PacketMetadata)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_Metadata_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Metadata'
-type MockFilteredPackage_Metadata_Call struct {
- *mock.Call
-}
-
-// Metadata is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) Metadata() *MockFilteredPackage_Metadata_Call {
- return &MockFilteredPackage_Metadata_Call{Call: _e.mock.On("Metadata")}
-}
-
-func (_c *MockFilteredPackage_Metadata_Call) Run(run func()) *MockFilteredPackage_Metadata_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_Metadata_Call) Return(_a0 *gopacket.PacketMetadata) *MockFilteredPackage_Metadata_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_Metadata_Call) RunAndReturn(run func() *gopacket.PacketMetadata) *MockFilteredPackage_Metadata_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// NetworkLayer provides a mock function with given fields:
-func (_m *MockFilteredPackage) NetworkLayer() gopacket.NetworkLayer {
- ret := _m.Called()
-
- var r0 gopacket.NetworkLayer
- if rf, ok := ret.Get(0).(func() gopacket.NetworkLayer); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(gopacket.NetworkLayer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_NetworkLayer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NetworkLayer'
-type MockFilteredPackage_NetworkLayer_Call struct {
- *mock.Call
-}
-
-// NetworkLayer is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) NetworkLayer() *MockFilteredPackage_NetworkLayer_Call {
- return &MockFilteredPackage_NetworkLayer_Call{Call: _e.mock.On("NetworkLayer")}
-}
-
-func (_c *MockFilteredPackage_NetworkLayer_Call) Run(run func()) *MockFilteredPackage_NetworkLayer_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_NetworkLayer_Call) Return(_a0 gopacket.NetworkLayer) *MockFilteredPackage_NetworkLayer_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_NetworkLayer_Call) RunAndReturn(run func() gopacket.NetworkLayer) *MockFilteredPackage_NetworkLayer_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// String provides a mock function with given fields:
-func (_m *MockFilteredPackage) String() string {
- ret := _m.Called()
-
- var r0 string
- if rf, ok := ret.Get(0).(func() string); ok {
- r0 = rf()
- } else {
- r0 = ret.Get(0).(string)
- }
-
- return r0
-}
-
-// MockFilteredPackage_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String'
-type MockFilteredPackage_String_Call struct {
- *mock.Call
-}
-
-// String is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) String() *MockFilteredPackage_String_Call {
- return &MockFilteredPackage_String_Call{Call: _e.mock.On("String")}
-}
-
-func (_c *MockFilteredPackage_String_Call) Run(run func()) *MockFilteredPackage_String_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_String_Call) Return(_a0 string) *MockFilteredPackage_String_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_String_Call) RunAndReturn(run func() string) *MockFilteredPackage_String_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// TransportLayer provides a mock function with given fields:
-func (_m *MockFilteredPackage) TransportLayer() gopacket.TransportLayer {
- ret := _m.Called()
-
- var r0 gopacket.TransportLayer
- if rf, ok := ret.Get(0).(func() gopacket.TransportLayer); ok {
- r0 = rf()
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(gopacket.TransportLayer)
- }
- }
-
- return r0
-}
-
-// MockFilteredPackage_TransportLayer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransportLayer'
-type MockFilteredPackage_TransportLayer_Call struct {
- *mock.Call
-}
-
-// TransportLayer is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) TransportLayer() *MockFilteredPackage_TransportLayer_Call {
- return &MockFilteredPackage_TransportLayer_Call{Call: _e.mock.On("TransportLayer")}
-}
-
-func (_c *MockFilteredPackage_TransportLayer_Call) Run(run func()) *MockFilteredPackage_TransportLayer_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_TransportLayer_Call) Return(_a0 gopacket.TransportLayer) *MockFilteredPackage_TransportLayer_Call {
- _c.Call.Return(_a0)
- return _c
-}
-
-func (_c *MockFilteredPackage_TransportLayer_Call) RunAndReturn(run func() gopacket.TransportLayer) *MockFilteredPackage_TransportLayer_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// VerifyChecksums provides a mock function with given fields:
-func (_m *MockFilteredPackage) VerifyChecksums() (error, []gopacket.ChecksumMismatch) {
- ret := _m.Called()
-
- var r0 error
- var r1 []gopacket.ChecksumMismatch
- if rf, ok := ret.Get(0).(func() (error, []gopacket.ChecksumMismatch)); ok {
- return rf()
- }
- if rf, ok := ret.Get(0).(func() error); ok {
- r0 = rf()
- } else {
- r0 = ret.Error(0)
- }
-
- if rf, ok := ret.Get(1).(func() []gopacket.ChecksumMismatch); ok {
- r1 = rf()
- } else {
- if ret.Get(1) != nil {
- r1 = ret.Get(1).([]gopacket.ChecksumMismatch)
- }
- }
-
- return r0, r1
-}
-
-// MockFilteredPackage_VerifyChecksums_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'VerifyChecksums'
-type MockFilteredPackage_VerifyChecksums_Call struct {
- *mock.Call
-}
-
-// VerifyChecksums is a helper method to define mock.On call
-func (_e *MockFilteredPackage_Expecter) VerifyChecksums() *MockFilteredPackage_VerifyChecksums_Call {
- return &MockFilteredPackage_VerifyChecksums_Call{Call: _e.mock.On("VerifyChecksums")}
-}
-
-func (_c *MockFilteredPackage_VerifyChecksums_Call) Run(run func()) *MockFilteredPackage_VerifyChecksums_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run()
- })
- return _c
-}
-
-func (_c *MockFilteredPackage_VerifyChecksums_Call) Return(_a0 error, _a1 []gopacket.ChecksumMismatch) *MockFilteredPackage_VerifyChecksums_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *MockFilteredPackage_VerifyChecksums_Call) RunAndReturn(run func() (error, []gopacket.ChecksumMismatch)) *MockFilteredPackage_VerifyChecksums_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// NewMockFilteredPackage creates a new instance of MockFilteredPackage. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
-// The first argument is typically a *testing.T value.
-func NewMockFilteredPackage(t interface {
- mock.TestingT
- Cleanup(func())
-}) *MockFilteredPackage {
- mock := &MockFilteredPackage{}
- mock.Mock.Test(t)
-
- t.Cleanup(func() { mock.AssertExpectations(t) })
-
- return mock
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/extractor/extractor.go b/plc4go/tools/plc4xpcapanalyzer/internal/extractor/extractor.go
deleted file mode 100644
index 03ffa92f44..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/internal/extractor/extractor.go
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package extractor
-
-import (
- "context"
- "fmt"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/common"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/pcaphandler"
- "github.com/fatih/color"
- "github.com/gopacket/gopacket/layers"
- "github.com/k0kubun/go-ansi"
- "github.com/pkg/errors"
- "github.com/rs/zerolog/log"
- "github.com/schollz/progressbar/v3"
- "io"
- "net"
-)
-
-func Extract(pcapFile, protocolType string) error {
- return ExtractWithOutput(context.TODO(), pcapFile, protocolType, ansi.NewAnsiStdout(), ansi.NewAnsiStderr())
-}
-
-func ExtractWithOutput(ctx context.Context, pcapFile, protocolType string, stdout, stderr io.Writer) error {
- var printPayload = func(packetInformation common.PacketInformation, item []byte) {
- _, _ = fmt.Fprintf(stdout, "%x\n", item)
- }
- switch protocolType {
- case "bacnet":
- // nothing special as this is byte based
- case "c-bus":
- // c-bus is string based so we consume the string and print it
- clientIp := net.ParseIP(config.ExtractConfigInstance.Client)
- serverResponseWriter := color.New(color.FgRed)
- serverResponseIndicatorWriter := color.New(color.FgHiRed)
- clientRequestWriter := color.New(color.FgGreen)
- clientRequestIndicatorWriter := color.New(color.FgHiGreen)
- printPayload = func(packetInformation common.PacketInformation, payload []byte) {
- payloadString := ""
- suffix := ""
- extraInformation := ""
- if config.ExtractConfigInstance.Verbosity > 2 {
- extraInformation = fmt.Sprintf("(No.[%d])", packetInformation.PacketNumber)
- }
- if len(payload) > 0 {
- if properTerminated := payload[len(payload)-1] == 0x0D || payload[len(payload)-1] == 0x0A; properTerminated {
- suffix = "\n"
- }
- quotedPayload := fmt.Sprintf("%+q", payload)
- unquotedPayload := quotedPayload[1 : len(quotedPayload)-1]
- payloadString = unquotedPayload
- }
- if isResponse := packetInformation.DstIp.Equal(clientIp); isResponse {
- if config.ExtractConfigInstance.ShowDirectionalIndicators {
- _, _ = serverResponseIndicatorWriter.Fprintf(stderr, "%s(<--pci)", extraInformation)
- }
- _, _ = serverResponseWriter.Fprintf(stdout, "%s%s", payloadString, suffix)
- } else {
- if config.ExtractConfigInstance.ShowDirectionalIndicators {
- _, _ = clientRequestIndicatorWriter.Fprintf(stderr, "%s(-->pci)", extraInformation)
- }
- _, _ = clientRequestWriter.Fprintf(stdout, "%s%s", payloadString, suffix)
- }
- }
- }
- filterExpression := config.ExtractConfigInstance.Filter
- log.Info().
- Str("pcapFile", pcapFile).
- Str("protocolType", protocolType).
- Str("filterExpression", filterExpression).
- Msg("Analyzing pcap file pcapFile with protocolType protocolType and filter filterExpression now")
-
- handle, numberOfPackage, timestampToIndexMap, err := pcaphandler.GetIndexedPcapHandle(pcapFile, filterExpression)
- if err != nil {
- return errors.Wrap(err, "Error getting handle")
- }
- log.Info().Int("numberOfPackage", numberOfPackage).Msg("Starting to analyze numberOfPackage packages")
- defer handle.Close()
- log.Debug().Interface("handle", handle).Int("numberOfPackage", numberOfPackage).Msg("got handle")
- source := pcaphandler.GetPacketSource(handle)
- bar := progressbar.NewOptions(numberOfPackage, progressbar.OptionSetWriter(ansi.NewAnsiStderr()),
- progressbar.OptionSetVisibility(!config.RootConfigInstance.HideProgressBar),
- progressbar.OptionEnableColorCodes(true),
- progressbar.OptionShowBytes(false),
- progressbar.OptionSetWidth(15),
- progressbar.OptionSetDescription("[cyan][1/3][reset] Analyzing packages..."),
- progressbar.OptionSetTheme(progressbar.Theme{
- Saucer: "[green]=[reset]",
- SaucerHead: "[green]>[reset]",
- SaucerPadding: " ",
- BarStart: "[",
- BarEnd: "]",
- }))
- currentPackageNum := uint(0)
- parseFails := 0
- serializeFails := 0
- compareFails := 0
- for packet := range source.Packets() {
- if errors.Is(ctx.Err(), context.Canceled) {
- log.Info().
- Uint("currentPackageNum", currentPackageNum).
- Msg("Aborted after currentPackageNum packages")
- break
- }
- currentPackageNum++
- if currentPackageNum < config.ExtractConfigInstance.StartPackageNumber {
- log.Debug().
- Uint("currentPackageNum", currentPackageNum).
- Uint("startPackageNumber", config.ExtractConfigInstance.StartPackageNumber).
- Msg("Skipping package number currentPackageNum (till no. startPackageNumber)")
- continue
- }
- if currentPackageNum > config.ExtractConfigInstance.PackageNumberLimit {
- log.Warn().
- Uint("packageNumberLimit", config.ExtractConfigInstance.PackageNumberLimit).
- Msg("Aborting reading packages because we hit the limit of packageNumberLimit")
- break
- }
- if packet == nil {
- log.Debug().Msg("Done reading packages. (nil returned)")
- break
- }
- if err := bar.Add(1); err != nil {
- log.Warn().Err(err).Msg("Error updating progressBar")
- }
- packetTimestamp := packet.Metadata().Timestamp
- realPacketNumber := timestampToIndexMap[packetTimestamp]
- description := fmt.Sprintf("No.[%d] timestamp: %v, %s", realPacketNumber, packetTimestamp, pcapFile)
- packetInformation := common.PacketInformation{
- PacketNumber: realPacketNumber,
- PacketTimestamp: packetTimestamp,
- Description: description,
- }
- if networkLayer, ok := packet.NetworkLayer().(*layers.IPv4); ok {
- packetInformation.SrcIp = networkLayer.SrcIP
- packetInformation.DstIp = networkLayer.DstIP
- }
-
- var payload []byte
- applicationLayer := packet.ApplicationLayer()
- if applicationLayer == nil {
- log.Info().Stringer("packetInformation", packetInformation).Int("realPacketNumber", realPacketNumber).Msg("No.[realPacketNumber] No application layer")
- } else {
- payload = applicationLayer.Payload()
- }
-
- log.Debug().Hex("payload", payload).Msg("Got payload")
- if config.ExtractConfigInstance.Verbosity > 1 {
- printPayload(packetInformation, payload)
- }
- }
- _, _ = fmt.Fprintf(stdout, "\n")
-
- log.Info().
- Uint("currentPackageNum", currentPackageNum).
- Int("numberOfPackage", numberOfPackage).
- Int("parseFails", parseFails).
- Int("serializeFails", serializeFails).
- Int("compareFails", compareFails).
- Msg("Done evaluating currentPackageNum of numberOfPackage packages (parseFails failed to parse, serializeFails failed to serialize and compareFails failed in byte comparison)")
- return nil
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/internal/pcaphandler/pcaphandler.go b/plc4go/tools/plc4xpcapanalyzer/internal/pcaphandler/pcaphandler.go
deleted file mode 100644
index 2cd9896581..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/internal/pcaphandler/pcaphandler.go
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package pcaphandler
-
-import (
- "github.com/gopacket/gopacket"
- "github.com/gopacket/gopacket/pcap"
- "github.com/pkg/errors"
- "time"
-)
-
-// GetPacketSource gets a packet source from a handle
-func GetPacketSource(handle *pcap.Handle) *gopacket.PacketSource {
- return gopacket.NewPacketSource(handle, handle.LinkType())
-}
-
-// GetIndexedPcapHandle returns a *pcap.Handle, the number of packages found and an index which maps timestamp to
-// absolute package number
-func GetIndexedPcapHandle(file, filterExpression string) (handle *pcap.Handle, numberOfPackages int, timestampToIndexMap map[time.Time]int, err error) {
- timestampToIndexMap = make(map[time.Time]int)
- // Count absolute packages and set timestamp map
- temporaryHandle, err := GetPcapHandle(file, "")
- if err != nil {
- return nil, 0, nil, err
- }
- defer temporaryHandle.Close()
- packetSource := GetPacketSource(temporaryHandle)
- packages := 0
- for packet := range packetSource.Packets() {
- if packet == nil {
- break
- }
- packages++
- timestampToIndexMap[packet.Metadata().Timestamp] = packages
- }
- // Just count filtered packages
- temporaryFilteredHandle, err := GetPcapHandle(file, filterExpression)
- if err != nil {
- return nil, 0, nil, err
- }
- defer temporaryFilteredHandle.Close()
- filteredPacketSource := GetPacketSource(temporaryFilteredHandle)
- packages = 0
- for packet := range filteredPacketSource.Packets() {
- if packet == nil {
- break
- }
- packages++
- }
- pcapHandle, err := GetPcapHandle(file, filterExpression)
- if err != nil {
- return nil, 0, nil, err
- }
- return pcapHandle, packages, timestampToIndexMap, nil
-}
-
-// GetPcapHandle returns a *pcap.Handle and panics if an error occurs
-func GetPcapHandle(file, filterExpression string) (*pcap.Handle, error) {
- handle, err := pcap.OpenOffline(file)
- if err != nil {
- return nil, errors.Wrap(err, "error open offline")
- }
- if filterExpression != "" {
- if err := handle.SetBPFFilter(filterExpression); err != nil {
- return nil, errors.Wrap(err, "error setting BPF filter")
- }
- }
- return handle, nil
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/main.go b/plc4go/tools/plc4xpcapanalyzer/main.go
deleted file mode 100644
index cb3fd52ed9..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/main.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package main
-
-import "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/cmd"
-
-func main() {
- cmd.Execute()
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/ui/actions.go b/plc4go/tools/plc4xpcapanalyzer/ui/actions.go
deleted file mode 100644
index 085558c0a7..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/ui/actions.go
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "bytes"
- "fmt"
- "github.com/apache/plc4x/plc4go/internal/ads"
- "github.com/apache/plc4x/plc4go/internal/bacnetip"
- "github.com/apache/plc4x/plc4go/internal/cbus"
- "github.com/apache/plc4x/plc4go/internal/s7"
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- "github.com/apache/plc4x/plc4go/spi"
- "github.com/apache/plc4x/plc4go/spi/transports/pcap"
- "github.com/pkg/errors"
- "github.com/rivo/tview"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
- "os"
- "path"
- "strings"
-)
-
-func InitSubsystem() {
- logLevel := zerolog.InfoLevel
- if configuredLevel := config.LogLevel; configuredLevel != "" {
- if parsedLevel, err := zerolog.ParseLevel(configuredLevel); err != nil {
- panic(err)
- } else {
- logLevel = parsedLevel
- }
- }
- driverManager = plc4go.NewPlcDriverManager()
-
- log.Logger = log.
- //// Enable below if you want to see the filenames
- //With().Caller().Logger().
- Output(zerolog.NewConsoleWriter(
- func(w *zerolog.ConsoleWriter) {
- w.Out = tview.ANSIWriter(consoleOutput)
- },
- func(w *zerolog.ConsoleWriter) {
- w.FormatFieldValue = func(i interface{}) string {
- if aString, ok := i.(string); ok && strings.Contains(aString, "\\n") {
- return fmt.Sprintf("\x1b[%dm%v\x1b[0m", 31, "see below")
- }
- return fmt.Sprintf("%s", i)
- }
- w.FormatExtra = func(m map[string]interface{}, buffer *bytes.Buffer) error {
- for key, i := range m {
- if aString, ok := i.(string); ok && strings.Contains(aString, "\n") {
- buffer.WriteString("\n")
- buffer.WriteString(fmt.Sprintf("\x1b[%dm%v\x1b[0m", 32, "field "+key))
- buffer.WriteString(":\n" + aString)
- }
- }
- return nil
- }
- },
- )).
- Level(logLevel)
-
- // We offset the commands executed with the last commands
- commandsExecuted = len(config.History.Last10Commands)
- outputCommandHistory()
-
- for _, driver := range config.AutoRegisterDrivers {
- log.Info().Str("driver", driver).Msg("Auto register driver")
- if err := validateDriverParam(driver); err != nil {
- log.Err(err).Msg("Invalid configuration")
- continue
- }
- _ = registerDriver(driver)
- }
-}
-
-func OpenFile(pcapFile string) error {
- if !strings.HasPrefix(pcapFile, string(os.PathSeparator)) {
- pcapFile = path.Join(currentDir, pcapFile)
- }
- var name string
- if stat, err := os.Stat(pcapFile); err != nil {
- return err
- } else if stat.IsDir() {
- stat.Name()
- return errors.Errorf("%s is a dir", pcapFile)
- } else {
- name = stat.Name()
- }
- for _, loadedPcapFile := range loadedPcapFiles {
- if loadedPcapFile.path == pcapFile {
- return errors.Errorf("%s already loaded", name)
- }
- }
- addRecentFilesEntry(pcapFile)
- loadedPcapFiles = append(loadedPcapFiles, loadedPcapFile{
- name: name,
- path: pcapFile,
- })
- loadedPcapFilesChanged()
- return nil
-}
-
-func outputCommandHistory() {
- _, _ = fmt.Fprintln(commandOutput, "[#0000ff]Last 10 commands[white]")
- for i, command := range config.History.Last10Commands {
- _, _ = fmt.Fprintf(commandOutput, " [#00ff00]%d[white]: [\"%d\"]%s[\"\"]\n", i, i, tview.Escape(command))
- }
-}
-
-func validateDriverParam(driver string) error {
- for _, protocol := range protocolList {
- if protocol == driver {
- return nil
- }
- }
- return errors.Errorf("protocol %s not found", driver)
-}
-
-func registerDriver(driver string) error {
- switch driver {
- case "ads":
- driverManager.RegisterDriver(ads.NewDriver())
- case "bacnetip":
- driverManager.RegisterDriver(bacnetip.NewDriver())
- case "c-bus":
- driverManager.RegisterDriver(cbus.NewDriver())
- case "s7":
- driverManager.RegisterDriver(s7.NewDriver())
- default:
- return errors.Errorf("Unknown driver %s", driver)
- }
- driverManager.(spi.TransportAware).RegisterTransport(pcap.NewTransport())
- go driverAdded(driver)
- return nil
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/ui/commands.go b/plc4go/tools/plc4xpcapanalyzer/ui/commands.go
deleted file mode 100644
index b6b752d8ff..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/ui/commands.go
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "context"
- "fmt"
- plc4x_config "github.com/apache/plc4x/plc4go/pkg/api/config"
- "github.com/apache/plc4x/plc4go/spi"
- cliConfig "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/analyzer"
- "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/internal/extractor"
- "github.com/pkg/errors"
- "github.com/rivo/tview"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
- "os"
- "path"
- "reflect"
- "runtime/debug"
- "strings"
- "time"
-)
-
-const rootCommandIndicator = "rootCommand"
-
-var rootCommand = Command{
- Name: rootCommandIndicator,
- subCommands: []Command{
- {
- Name: "ls",
- Description: "list directories",
- action: func(_ context.Context, _ Command, dir string) error {
- if dir == "" {
- dir = currentDir
- }
- _, _ = fmt.Fprintf(commandOutput, "dir cotents of %s\n", dir)
- readDir, err := os.ReadDir(dir)
- if err != nil {
- return err
- }
- for _, dirEntry := range readDir {
- isDir := dirEntry.IsDir()
- name := dirEntry.Name()
- name = strings.TrimPrefix(name, dir)
- if isDir {
- name = fmt.Sprintf("[#0000ff]%s[white]", name)
- } else if strings.HasSuffix(name, ".pcap") || strings.HasSuffix(name, ".pcapng") {
- name = fmt.Sprintf("[#00ff00]%s[white]", name)
- }
- _, _ = fmt.Fprintf(commandOutput, "%s\n", name)
- }
- return nil
- },
- // TODO: add parameter suggestions
- },
- {
- Name: "cd",
- Description: "changes directory",
- action: func(_ context.Context, _ Command, newDir string) error {
- var proposedCurrentDir string
- if newDir == "" {
- var err error
- proposedCurrentDir, err = os.UserHomeDir()
- if err != nil {
- return err
- }
- } else if strings.HasPrefix(newDir, "."+string(os.PathSeparator)) {
- proposedCurrentDir = currentDir + strings.TrimPrefix(newDir, ".")
- } else if strings.HasPrefix(newDir, ""+string(os.PathSeparator)) {
- proposedCurrentDir = newDir
- } else {
- proposedCurrentDir = currentDir + string(os.PathSeparator) + newDir
- }
- stat, err := os.Stat(proposedCurrentDir)
- if err != nil {
- return err
- }
- if !stat.IsDir() {
- return errors.Errorf("%s is not a dir", newDir)
- }
- currentDir = proposedCurrentDir
- _, _ = fmt.Fprintf(commandOutput, "current directory: %s\n", currentDir)
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- if strings.HasPrefix(currentText, string(os.PathSeparator)) {
- dirEntries, err := os.ReadDir(currentText)
- if err != nil {
- plc4xpcapanalyzerLog.Warn().Err(err).Msg("Error suggesting directories")
- return
- }
- for _, dirEntry := range dirEntries {
- entry := path.Join(currentText, dirEntry.Name())
- entries = append(entries, entry)
- }
- } else {
- dirEntries, err := os.ReadDir(currentDir)
- if err != nil {
- plc4xpcapanalyzerLog.Warn().Err(err).Msg("Error suggesting directories")
- return
- }
- for _, dirEntry := range dirEntries {
- entry := path.Join(".", dirEntry.Name())
- entries = append(entries, entry)
- }
- }
- return
- },
- },
- {
- Name: "pwd",
- Description: "shows current directory",
- action: func(_ context.Context, _ Command, _ string) error {
- _, _ = fmt.Fprintf(commandOutput, "current directory: %s\n", currentDir)
- return nil
- },
- },
- {
- Name: "open",
- Description: "open file",
- action: func(_ context.Context, _ Command, pcapFile string) error {
- return OpenFile(pcapFile)
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- entries = append(entries, config.History.Last10Files...)
- readDir, err := os.ReadDir(currentDir)
- if err != nil {
- return
- }
- for _, dirEntry := range readDir {
- name := dirEntry.Name()
- name = strings.TrimPrefix(name, currentDir)
- if strings.HasSuffix(dirEntry.Name(), ".cap") || strings.HasSuffix(dirEntry.Name(), ".pcap") || strings.HasSuffix(name, ".pcapng") {
- entries = append(entries, name)
- }
- }
- return
- },
- },
- {
- Name: "analyze",
- Description: "Analyzes a pcap file using a driver",
- action: func(ctx context.Context, _ Command, protocolTypeAndPcapFile string) error {
- split := strings.Split(protocolTypeAndPcapFile, " ")
- if len(split) != 2 {
- return errors.Errorf("expect protocol and pcapfile")
- }
- protocolType := split[0]
- pcapFile := strings.TrimPrefix(protocolTypeAndPcapFile, protocolType+" ")
- cliConfig.PcapConfigInstance.Client = config.HostIp
- cliConfig.RootConfigInstance.HideProgressBar = true
- // disabled as we get this output anyway with the message call back
- //cliConfig.RootConfigInstance.Verbosity = 4
- return analyzer.AnalyzeWithOutputAndCallback(ctx, pcapFile, protocolType, tview.ANSIWriter(messageOutput), tview.ANSIWriter(messageOutput), func(parsed spi.Message) {
- spiNumberOfMessagesReceived++
- spiMessageReceived(spiNumberOfMessagesReceived, time.Now(), parsed)
- })
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, file := range loadedPcapFiles {
- for _, protocol := range protocolList {
- entries = append(entries, protocol+" "+file.path)
- }
- }
- return
- },
- },
- {
- Name: "extract",
- Description: "Extract a pcap file using a driver",
- action: func(ctx context.Context, _ Command, protocolTypeAndPcapFile string) error {
- split := strings.Split(protocolTypeAndPcapFile, " ")
- if len(split) != 2 {
- return errors.Errorf("expect protocol and pcapfile")
- }
- protocolType := split[0]
- pcapFile := strings.TrimPrefix(protocolTypeAndPcapFile, protocolType+" ")
- cliConfig.PcapConfigInstance.Client = config.HostIp
- cliConfig.RootConfigInstance.HideProgressBar = true
- cliConfig.RootConfigInstance.Verbosity = 4
- return extractor.ExtractWithOutput(ctx, pcapFile, protocolType, tview.ANSIWriter(messageOutput), tview.ANSIWriter(messageOutput))
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, file := range loadedPcapFiles {
- for _, protocol := range protocolList {
- entries = append(entries, protocol+" "+file.path)
- }
- }
- return
- },
- },
- {
- Name: "host",
- Description: "The host which is assumed to be the sender (important for protocols that are directional)",
- subCommands: []Command{
- {
- Name: "set",
- action: func(_ context.Context, _ Command, host string) error {
- config.HostIp = host
- return nil
- },
- },
- {
- Name: "get",
- action: func(_ context.Context, _ Command, host string) error {
- _, _ = fmt.Fprintf(commandOutput, "current set host %s", config.HostIp)
- return nil
- },
- },
- },
- },
- {
- Name: "register",
- Description: "register a driver in the subsystem",
- action: func(_ context.Context, _ Command, driver string) error {
- return registerDriver(driver)
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, protocol := range protocolList {
- if strings.HasPrefix(protocol, currentText) {
- entries = append(entries, protocol)
- }
- }
- return
- },
- },
- {
- Name: "quit",
- Description: "Quits the application",
- },
- {
- Name: "log",
- Description: "Log related operations",
- subCommands: []Command{
- {
- Name: "get",
- Description: "Get a log level",
- action: func(_ context.Context, _ Command, _ string) error {
- _, _ = fmt.Fprintf(commandOutput, "Current log level %s", log.Logger.GetLevel())
- return nil
- },
- },
- {
- Name: "set",
- Description: "Sets a log level",
- action: func(_ context.Context, _ Command, level string) error {
- parseLevel, err := zerolog.ParseLevel(level)
- if err != nil {
- return errors.Wrapf(err, "Error setting log level")
- }
- setLevel(parseLevel)
- log.Logger = log.Logger.Level(parseLevel)
- return nil
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- levels := []string{
- zerolog.LevelTraceValue,
- zerolog.LevelDebugValue,
- zerolog.LevelInfoValue,
- zerolog.LevelWarnValue,
- zerolog.LevelErrorValue,
- zerolog.LevelFatalValue,
- zerolog.LevelPanicValue,
- }
- for _, level := range levels {
- entries = append(entries, level)
- }
- return
- },
- },
- },
- },
- {
- Name: "conf",
- Description: "Various settings for plc4xpcapanalyzer",
- subCommands: []Command{
- {
- Name: "list",
- Description: "list config values with their current settings",
- action: func(_ context.Context, _ Command, _ string) error {
- allCliConfigsValue := reflect.ValueOf(allCliConfigsInstances)
- for i := 0; i < allCliConfigsValue.NumField(); i++ {
- allConfigField := allCliConfigsValue.Field(i)
- allConfigFieldType := allCliConfigsValue.Type().Field(i)
- _, _ = fmt.Fprintf(commandOutput, "%s:\n", allConfigFieldType.Name)
- configInstanceReflectValue := reflect.ValueOf(allConfigField.Interface())
- if configInstanceReflectValue.Kind() == reflect.Ptr {
- configInstanceReflectValue = configInstanceReflectValue.Elem()
- }
- for j := 0; j < configInstanceReflectValue.NumField(); j++ {
- configField := configInstanceReflectValue.Field(j)
- configFieldType := configInstanceReflectValue.Type().Field(j)
- if configFieldType.Tag.Get("json") == "-" {
- // Ignore those
- continue
- }
- _, _ = fmt.Fprintf(commandOutput, " %s: %s\t= %v\n", configFieldType.Name, configFieldType.Type, configField.Interface())
- }
- }
- return nil
- },
- },
- {
- Name: "set",
- Description: "sets a config value",
- subCommands: func() []Command {
- var configCommand []Command
- allCliConfigsValue := reflect.ValueOf(allCliConfigsInstances)
- for i := 0; i < allCliConfigsValue.NumField(); i++ {
- allConfigField := allCliConfigsValue.Field(i)
- allConfigFieldType := allCliConfigsValue.Type().Field(i)
- configCommand = append(configCommand, Command{
- Name: allConfigFieldType.Name,
- Description: fmt.Sprintf("Setting for %s", allConfigFieldType.Name),
- subCommands: func() []Command {
- var configElementCommands []Command
- configInstanceReflectValue := reflect.ValueOf(allConfigField.Interface())
- if configInstanceReflectValue.Kind() == reflect.Ptr {
- configInstanceReflectValue = configInstanceReflectValue.Elem()
- }
- for i := 0; i < configInstanceReflectValue.NumField(); i++ {
- field := configInstanceReflectValue.Field(i)
- fieldOfType := configInstanceReflectValue.Type().Field(i)
- if fieldOfType.Tag.Get("json") == "-" {
- // Ignore those
- continue
- }
- configElementCommands = append(configElementCommands, Command{
- Name: fieldOfType.Name,
- Description: fmt.Sprintf("Sets value for %s", fieldOfType.Name),
- action: func(_ context.Context, _ Command, argument string) error {
- field.SetString(argument)
- return nil
- },
- })
- }
- return configElementCommands
- }(),
- })
- }
- return configCommand
- }(),
- },
- {
- Name: "plc4xpcapanalyzer-debug",
- Description: "Prints out debug information of the pcap analyzer itself",
- subCommands: []Command{
- {
- Name: "on",
- Description: "debug on",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4xpcapanalyzerLog = zerolog.New(zerolog.ConsoleWriter{Out: tview.ANSIWriter(consoleOutput)})
- return nil
- },
- },
- {
- Name: "off",
- Description: "debug off",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4xpcapanalyzerLog = zerolog.Nop()
- return nil
- },
- },
- },
- },
- {
- Name: "auto-register",
- Description: "autoregister driver at startup",
- subCommands: []Command{
- {
- Name: "list",
- action: func(_ context.Context, currentCommand Command, argument string) error {
- _, _ = fmt.Fprintf(commandOutput, "Auto-register enabled drivers:\n %s\n", strings.Join(config.AutoRegisterDrivers, "\n "))
- return nil
- },
- },
- {
- Name: "enable",
- action: func(_ context.Context, _ Command, argument string) error {
- return enableAutoRegister(argument)
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, protocol := range protocolList {
- if strings.HasPrefix(protocol, currentText) {
- entries = append(entries, protocol)
- }
- }
- return
- },
- },
- {
- Name: "disable",
- action: func(_ context.Context, _ Command, argument string) error {
- return disableAutoRegister(argument)
- },
- parameterSuggestions: func(currentText string) (entries []string) {
- for _, protocol := range protocolList {
- if strings.HasPrefix(protocol, currentText) {
- entries = append(entries, protocol)
- }
- }
- return
- },
- },
- },
- },
- },
- },
- {
- Name: "plc4x-conf",
- Description: "plc4x related settings",
- subCommands: []Command{
- {
- Name: "TraceTransactionManagerWorkers",
- Description: "print information about transaction manager workers",
- subCommands: []Command{
- {
- Name: "on",
- Description: "trace on",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4x_config.TraceTransactionManagerWorkers = true
- return nil
- },
- },
- {
- Name: "off",
- Description: "trace off",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4x_config.TraceTransactionManagerWorkers = false
- return nil
- },
- },
- },
- },
- {
- Name: "TraceTransactionManagerTransactions",
- Description: "print information about transaction manager transactions",
- subCommands: []Command{
- {
- Name: "on",
- Description: "trace on",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4x_config.TraceTransactionManagerTransactions = true
- return nil
- },
- },
- {
- Name: "off",
- Description: "trace off",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4x_config.TraceTransactionManagerTransactions = false
- return nil
- },
- },
- },
- },
- {
- Name: "TraceDefaultMessageCodecWorker",
- Description: "print information about message codec workers",
- subCommands: []Command{
- {
- Name: "on",
- Description: "trace on",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4x_config.TraceDefaultMessageCodecWorker = true
- return nil
- },
- },
- {
- Name: "off",
- Description: "trace off",
- action: func(_ context.Context, _ Command, _ string) error {
- plc4x_config.TraceDefaultMessageCodecWorker = false
- return nil
- },
- },
- },
- },
- },
- },
- {
- Name: "history",
- Description: "outputs the last commands",
- action: func(_ context.Context, _ Command, _ string) error {
- outputCommandHistory()
- return nil
- },
- },
- {
- Name: "clear",
- Description: "clear all outputs",
- action: func(_ context.Context, _ Command, _ string) error {
- messageOutputClear()
- consoleOutputClear()
- commandOutputClear()
- return nil
- },
- subCommands: []Command{
- {
- Name: "message",
- Description: "clears message output",
- action: func(_ context.Context, _ Command, _ string) error {
- messageOutputClear()
- return nil
- },
- },
- {
- Name: "console",
- Description: "clears console output",
- action: func(_ context.Context, _ Command, _ string) error {
- consoleOutputClear()
- return nil
- },
- },
- {
- Name: "command",
- Description: "clears command output",
- action: func(_ context.Context, _ Command, _ string) error {
- commandOutputClear()
- return nil
- },
- },
- },
- },
- {
- Name: "abort",
- Description: "abort currently running jobs",
- action: func(_ context.Context, _ Command, _ string) error {
- for _, cancelFunc := range cancelFunctions {
- cancelFunc()
- }
- return nil
- },
- },
- },
-}
-
-func init() {
- // Because of the cycle we need to define the help command here as it needs access to the to command
- rootCommand.subCommands = append(rootCommand.subCommands, Command{
- Name: "help",
- Description: "prints out this help",
- action: func(_ context.Context, _ Command, _ string) error {
- _, _ = fmt.Fprintf(commandOutput, "[#0000ff]Available commands[white]\n")
- rootCommand.visit(0, func(currentIndent int, command Command) {
- indentString := strings.Repeat(" ", currentIndent)
- description := command.Description
- if description == "" {
- description = command.Name + "s"
- }
- _, _ = fmt.Fprintf(commandOutput, "%s [#00ff00]%s[white]: %s\n", indentString, command.Name, description)
- })
- return nil
- },
- })
-}
-
-var NotDirectlyExecutable = errors.New("Not directly executable")
-
-type Command struct {
- Name string
- Description string
- action func(ctx context.Context, currentCommand Command, argument string) error
- subCommands []Command
- parameterSuggestions func(currentText string) (entries []string)
-}
-
-func (c Command) Completions(currentCommandText string) (entries []string) {
- if c.Name == rootCommandIndicator && len(currentCommandText) == 0 {
- // We don't return anything here to not pollute the command text by default
- return
- }
- if c.acceptsCurrentText(currentCommandText) {
- currentCommandPrefix := c.currentCommandPrefix()
- doesCommandTextTargetSubCommand := c.doesCommandTextTargetSubCommand(currentCommandPrefix)
- if c.hasDirectExecution() && !doesCommandTextTargetSubCommand {
- if c.parameterSuggestions != nil {
- preparedForParameters := c.prepareForParameters(currentCommandText)
- for _, parameterSuggestion := range c.parameterSuggestions(preparedForParameters) {
- entries = append(entries, currentCommandPrefix+parameterSuggestion)
- }
- } else if currentCommandText == "" {
- entries = append(entries, c.Name)
- }
- }
- if doesCommandTextTargetSubCommand {
- remainder := c.prepareForSubCommand(currentCommandText)
- for _, command := range c.subCommands {
- for _, subCommandCompletions := range command.Completions(remainder) {
- entries = append(entries, currentCommandPrefix+subCommandCompletions)
- }
- }
- }
- } else if strings.HasPrefix(c.Name, currentCommandText) {
- // Suggest ourselves if we start with the current letter
- entries = append(entries, c.Name)
- }
- return
-}
-
-func (c Command) acceptsCurrentText(currentCommandText string) bool {
- if c.Name == rootCommandIndicator {
- return true
- }
- hasThePrefix := strings.HasPrefix(currentCommandText, c.Name)
- hasNoMatchingAlternative := !strings.HasPrefix(currentCommandText, c.Name+"-")
- accepts := hasThePrefix && hasNoMatchingAlternative
- plc4xpcapanalyzerLog.Debug().
- Stringer("c", c).
- Bool("accepts", accepts).
- Msg("c accepts accepts")
- return accepts
-}
-
-func (c Command) doesCommandTextTargetSubCommand(currentCommandText string) bool {
- if c.Name == rootCommandIndicator {
- return true
- }
- if len(c.subCommands) == 0 {
- return false
- }
- return strings.HasPrefix(currentCommandText, c.currentCommandPrefix())
-}
-
-func (c Command) prepareForParameters(currentCommandText string) string {
- if currentCommandText == c.Name {
- return ""
- }
- return strings.TrimPrefix(currentCommandText, c.currentCommandPrefix())
-}
-func (c Command) prepareForSubCommand(currentCommandText string) string {
- return strings.TrimPrefix(currentCommandText, c.currentCommandPrefix())
-}
-
-func (c Command) currentCommandPrefix() string {
- if c.Name == rootCommandIndicator {
- return ""
- }
- return c.Name + " "
-}
-
-func (c Command) hasDirectExecution() bool {
- return c.action != nil
-}
-
-func Execute(ctx context.Context, commandText string) error {
- err := rootCommand.Execute(ctx, commandText)
- if err == nil {
- addCommandHistoryEntry(commandText)
- }
- return err
-}
-
-func (c Command) Execute(ctx context.Context, commandText string) (err error) {
- defer func() {
- if recoveredErr := recover(); recoveredErr != nil {
- if log.Debug().Enabled() {
- log.Error().
- Str("stack", string(debug.Stack())).
- Interface("err", err).
- Msg("panic-ed")
- }
- err = errors.Errorf("panic occurred: %v.", recoveredErr)
- }
- }()
- plc4xpcapanalyzerLog.Debug().
- Stringer("c", c).Str("commandText", commandText).
- Msg("c executes commandText")
- if !c.acceptsCurrentText(commandText) {
- return errors.Errorf("%s doesn't understand %s", c.Name, commandText)
- }
- if c.doesCommandTextTargetSubCommand(commandText) {
- prepareForSubCommandForSubCommand := c.prepareForSubCommand(commandText)
- for _, command := range c.subCommands {
- if command.acceptsCurrentText(prepareForSubCommandForSubCommand) {
- plc4xpcapanalyzerLog.Debug().
- Stringer("c", c).
- Str("commandText", commandText).
- Msg("c delegates to sub command")
- return command.Execute(ctx, prepareForSubCommandForSubCommand)
- }
- }
- return errors.Errorf("%s not accepted by any subcommands of %s", commandText, c.Name)
- } else {
- if c.action == nil {
- return NotDirectlyExecutable
- }
- plc4xpcapanalyzerLog.Debug().
- Stringer("c", c).
- Str("commandText", commandText).
- Msg("c executes commandText directly")
- preparedForParameters := c.prepareForParameters(commandText)
- return c.action(ctx, c, preparedForParameters)
- }
-}
-
-func (c Command) visit(i int, f func(currentIndent int, command Command)) {
- f(i, c)
- for _, subCommand := range c.subCommands {
- subCommand.visit(i+1, f)
- }
-}
-
-func (c Command) String() string {
- return c.Name
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/ui/common.go b/plc4go/tools/plc4xpcapanalyzer/ui/common.go
deleted file mode 100644
index 58e170b2a8..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/ui/common.go
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "context"
- "io"
- "os"
- "strings"
- "sync"
- "time"
-
- plc4go "github.com/apache/plc4x/plc4go/pkg/api"
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
- "github.com/apache/plc4x/plc4go/spi"
-
- "github.com/rs/zerolog"
-)
-
-const protocols = "ads,bacnetip,c-bus,s7"
-
-var protocolList = strings.Split(protocols, ",")
-
-var plc4xpcapanalyzerLog = zerolog.Nop()
-
-var driverManager plc4go.PlcDriverManager
-var driverAdded func(string)
-
-type loadedPcapFile struct {
- name string
- path string
-}
-
-var loadedPcapFiles []loadedPcapFile
-var loadedPcapFilesChanged func()
-
-var messageReceived func(messageNumber int, receiveTime time.Time, message apiModel.PlcMessage)
-var numberOfMessagesReceived int
-var spiMessageReceived func(messageNumber int, receiveTime time.Time, message spi.Message)
-var spiNumberOfMessagesReceived int
-var messageOutput io.Writer
-var messageOutputClear func()
-
-var consoleOutput io.Writer
-var consoleOutputClear func()
-
-var commandsExecuted int
-var commandOutput io.Writer
-var commandOutputClear func()
-
-var currentDirChanged func()
-var currentDir = func() string {
- dir, _ := os.Getwd()
- return dir
-}()
-
-var rootContext = context.Background()
-var cancelFunctions = make(map[uint32]context.CancelFunc)
-
-var shutdownMutex sync.Mutex
-var hasShutdown bool
-
-func Shutdown() {
- shutdownMutex.Lock()
- defer shutdownMutex.Unlock()
- if hasShutdown {
- return
- }
- hasShutdown = true
- saveConfig()
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/ui/config.go b/plc4go/tools/plc4xpcapanalyzer/ui/config.go
deleted file mode 100644
index dc96f61db0..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/ui/config.go
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- cliConfig "github.com/apache/plc4x/plc4go/tools/plc4xpcapanalyzer/config"
- "github.com/pkg/errors"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
- "gopkg.in/yaml.v3"
- "os"
- "path"
- "time"
-)
-
-var plc4xpcapanalyzerConfigDir string
-var configFile string
-var config = Config{
- MaxConsoleLines: 500,
- MaxOutputLines: 500,
- CliConfigs: allCliConfigsInstances,
-}
-
-type Config struct {
- HostIp string `yaml:"host_ip"`
- History struct {
- Last10Files []string `yaml:"last_hosts"`
- Last10Commands []string `yaml:"last_commands"`
- }
- AutoRegisterDrivers []string `yaml:"auto_register_driver"`
- LastUpdated time.Time `yaml:"last_updated"`
- LogLevel string `yaml:"log_level"`
- MaxConsoleLines int `yaml:"max_console_lines"`
- MaxOutputLines int `yaml:"max_output_lines"`
- CliConfigs allCliConfigs `yaml:"cli_configs"`
-}
-
-type allCliConfigs struct {
- RootConfig *cliConfig.RootConfig
- AnalyzeConfig *cliConfig.AnalyzeConfig
- ExtractConfig *cliConfig.ExtractConfig
- BacnetConfig *cliConfig.BacnetConfig
- CBusConfig *cliConfig.CBusConfig
- PcapConfig *cliConfig.PcapConfig
-}
-
-var allCliConfigsInstances = allCliConfigs{
- &cliConfig.RootConfigInstance,
- &cliConfig.AnalyzeConfigInstance,
- &cliConfig.ExtractConfigInstance,
- &cliConfig.BacnetConfigInstance,
- &cliConfig.CBusConfigInstance,
- &cliConfig.PcapConfigInstance,
-}
-
-func init() {
- userConfigDir, err := os.UserConfigDir()
- if err != nil {
- panic(err)
- }
- plc4xpcapanalyzerConfigDir = path.Join(userConfigDir, "plc4xpcapanalyzer")
- if _, err := os.Stat(plc4xpcapanalyzerConfigDir); os.IsNotExist(err) {
- err := os.Mkdir(plc4xpcapanalyzerConfigDir, os.ModeDir|os.ModePerm)
- if err != nil {
- panic(err)
- }
- }
- configFile = path.Join(plc4xpcapanalyzerConfigDir, "config.yml")
-}
-
-func LoadConfig() {
- f, err := os.Open(configFile)
- if err != nil {
- log.Info().Err(err).Msg("No config file found")
- return
- }
- defer func(f *os.File) {
- err := f.Close()
- if err != nil {
- log.Error().Err(err).Msg("Error closing config file")
- }
- }(f)
-
- decoder := yaml.NewDecoder(f)
- if err = decoder.Decode(&config); err != nil {
- log.Warn().Err(err).Msg("Can't decode config file")
- return
- }
-}
-
-func saveConfig() {
- config.LastUpdated = time.Now()
- f, err := os.OpenFile(configFile, os.O_RDWR|os.O_CREATE, 0755)
- if err != nil {
- log.Warn().Err(err).Msg("Can't save config file")
- return
- }
- encoder := yaml.NewEncoder(f)
- defer func(encoder *yaml.Encoder) {
- err := encoder.Close()
- if err != nil {
- log.Error().Err(err).Msg("Error closing config file")
- }
- }(encoder)
- if err := encoder.Encode(config); err != nil {
- log.Warn().Err(err).Msg("Can't encode config file")
- panic(err)
- }
-}
-
-func addRecentFilesEntry(pcapFile string) {
- existingIndex := -1
- for i, lastPcapFile := range config.History.Last10Files {
- if lastPcapFile == pcapFile {
- existingIndex = i
- break
- }
- }
- if existingIndex >= 0 {
- config.History.Last10Files = append(config.History.Last10Files[:existingIndex], config.History.Last10Files[existingIndex+1:]...)
- }
- if len(config.History.Last10Files) >= 10 {
- config.History.Last10Files = config.History.Last10Files[1:]
- }
- config.History.Last10Files = append(config.History.Last10Files, pcapFile)
-}
-
-func addCommandHistoryEntry(command string) {
- switch command {
- case "clear":
- return
- case "history":
- return
- }
- existingIndex := -1
- for i, lastCommand := range config.History.Last10Commands {
- if lastCommand == command {
- existingIndex = i
- break
- }
- }
- if existingIndex >= 0 {
- config.History.Last10Commands = append(config.History.Last10Commands[:existingIndex], config.History.Last10Commands[existingIndex+1:]...)
- }
- if len(config.History.Last10Commands) >= 10 {
- config.History.Last10Commands = config.History.Last10Commands[1:]
- }
- config.History.Last10Commands = append(config.History.Last10Commands, command)
-}
-
-func setLevel(level zerolog.Level) {
- config.LogLevel = level.String()
-}
-
-func enableAutoRegister(driver string) error {
- if err := validateDriverParam(driver); err != nil {
- return err
- }
- for _, autoRegisterDriver := range config.AutoRegisterDrivers {
- if autoRegisterDriver == driver {
- return errors.Errorf("%s already registered for auto register", driver)
- }
- }
- config.AutoRegisterDrivers = append(config.AutoRegisterDrivers, driver)
- log.Info().Str("driver", driver).Msg("Auto register enabled")
- return nil
-}
-
-func disableAutoRegister(driver string) error {
- if err := validateDriverParam(driver); err != nil {
- return err
- }
- index := -1
- for i, autoRegisterDriver := range config.AutoRegisterDrivers {
- if autoRegisterDriver == driver {
- index = i
- break
- }
- }
- if index < 0 {
- return errors.Errorf("%s not registered for auto register", driver)
- }
- config.AutoRegisterDrivers = append(config.AutoRegisterDrivers[:index], config.AutoRegisterDrivers[index+1:]...)
- log.Info().Str("driver", driver).Msg("Auto register disabled")
- return nil
-}
diff --git a/plc4go/tools/plc4xpcapanalyzer/ui/ui.go b/plc4go/tools/plc4xpcapanalyzer/ui/ui.go
deleted file mode 100644
index e5f8843cbb..0000000000
--- a/plc4go/tools/plc4xpcapanalyzer/ui/ui.go
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package ui
-
-import (
- "context"
- "fmt"
- "math/rand"
- "regexp"
- "strconv"
- "time"
-
- apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
- "github.com/apache/plc4x/plc4go/spi"
-
- "github.com/gdamore/tcell/v2"
- "github.com/pkg/errors"
- "github.com/rivo/tview"
-)
-
-func SetupApplication() *tview.Application {
- application := tview.NewApplication()
-
- newPrimitive := func(text string) tview.Primitive {
- return tview.NewTextView().
- SetTextAlign(tview.AlignCenter).
- SetText(text)
- }
- fileArea := buildFileArea(newPrimitive, application)
- outputArea := buildOutputArea(newPrimitive, application)
- commandArea := buildCommandArea(newPrimitive, application)
-
- grid := tview.NewGrid().
- SetRows(1, 0, 1).
- SetColumns(30, 0, 30).
- SetBorders(true).
- AddItem(newPrimitive("PLC4X PCAP Analyzer"), 0, 0, 1, 3, 0, 0, false).
- AddItem(newPrimitive("https://github.com/apache/plc4x"), 2, 0, 1, 3, 0, 0, false)
-
- // Layout for screens narrower than 100 cells (fileArea and side bar are hidden).
- grid.AddItem(fileArea, 0, 0, 0, 0, 0, 0, false).
- AddItem(outputArea, 1, 0, 1, 3, 0, 0, false).
- AddItem(commandArea, 0, 0, 0, 0, 0, 0, true)
-
- // Layout for screens wider than 100 cells.
- grid.AddItem(fileArea, 1, 0, 1, 1, 0, 100, false).
- AddItem(outputArea, 1, 1, 1, 1, 0, 100, false).
- AddItem(commandArea, 1, 2, 1, 1, 0, 100, false)
-
- application.SetRoot(grid, true).EnableMouse(true)
-
- return application
-}
-
-func buildFileArea(newPrimitive func(text string) tview.Primitive, application *tview.Application) tview.Primitive {
- connectionAreaHeader := newPrimitive("Files")
- connectionArea := tview.NewGrid().
- SetRows(3, 0, 10).
- SetColumns(0).
- AddItem(connectionAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- fileList := tview.NewList()
- loadedPcapFilesChanged = func() {
- application.QueueUpdateDraw(func() {
- fileList.Clear()
- for _, pcapFile := range loadedPcapFiles {
- fileList.AddItem(pcapFile.name, pcapFile.path, 0x0, func() {
- //TODO: disconnect popup
- _ = pcapFile
- })
- }
- })
- }
- connectionArea.AddItem(fileList, 1, 0, 1, 1, 0, 0, false)
- {
- registeredDriverAreaHeader := newPrimitive("Registered drivers")
- registeredDriverArea := tview.NewGrid().
- SetRows(3, 0).
- SetColumns(0).
- AddItem(registeredDriverAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- driverList := tview.NewList()
- driverAdded = func(driver string) {
- application.QueueUpdateDraw(func() {
- driverList.AddItem(driver, "", 0x0, func() {
- //TODO: disconnect popup
- })
- })
- }
- registeredDriverArea.AddItem(driverList, 1, 0, 1, 1, 0, 0, false)
- }
- connectionArea.AddItem(registeredDriverArea, 2, 0, 1, 1, 0, 0, false)
- }
-
- }
- return connectionArea
-}
-
-func buildCommandArea(newPrimitive func(text string) tview.Primitive, application *tview.Application) tview.Primitive {
- commandAreaHeader := newPrimitive("Commands")
- commandArea := tview.NewGrid().
- SetRows(3, 0, 3).
- SetColumns(0).
- AddItem(commandAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- enteredCommandsView := tview.NewTextView().
- SetDynamicColors(true).
- SetRegions(true).
- SetWordWrap(true).
- SetChangedFunc(func() {
- application.Draw()
- })
- commandOutput = enteredCommandsView
- commandOutputClear = func() {
- enteredCommandsView.SetText("")
- }
-
- commandArea.AddItem(enteredCommandsView, 1, 0, 1, 1, 0, 0, false)
-
- commandInputField := tview.NewInputField().
- SetLabel("$").
- SetFieldWidth(30)
- application.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
- switch event.Key() {
- case tcell.KeyCtrlC:
- commandInputField.SetText("")
- application.SetFocus(commandInputField)
- return nil
- case tcell.KeyCtrlD:
- // TODO: maybe add a modal here
- application.Stop()
- return nil
- }
- return event
- })
- commandInputField.
- SetDoneFunc(func(key tcell.Key) {
- commandText := commandInputField.GetText()
- if commandText == "quit" {
- // TODO: maybe add a modal here
- application.Stop()
- return
- }
- commandsExecuted++
- go func() {
- commandHistoryShortcut, _ := regexp.Compile("^[0-9]$")
- if commandHistoryShortcut.MatchString(commandText) {
- atoi, _ := strconv.Atoi(commandHistoryShortcut.FindString(commandText))
- if atoi < len(config.History.Last10Commands) {
- commandText = config.History.Last10Commands[atoi]
- } else {
- _, _ = fmt.Fprintf(enteredCommandsView, "[#ff0000]%s %s[white]\n", time.Now().Format("04:05"), errors.Errorf("No such elements %d in command history", atoi))
- return
- }
- }
- _, _ = fmt.Fprintf(enteredCommandsView, "%s [\"%d\"]%s[\"\"]\n", time.Now().Format("04:05"), commandsExecuted, commandText)
- ctx, cancelFunc := context.WithCancel(rootContext)
- randomId := rand.Uint32()
- cancelFunctions[randomId] = cancelFunc
- defer delete(cancelFunctions, randomId)
-
- if err := Execute(ctx, commandText); err != nil {
- _, _ = fmt.Fprintf(enteredCommandsView, "[#ff0000]%s %s[white]\n", time.Now().Format("04:05"), err)
- return
- }
- application.QueueUpdateDraw(func() {
- commandInputField.SetText("")
- })
- }()
- })
- commandInputField.SetAutocompleteFunc(rootCommand.Completions)
-
- enteredCommandsView.SetDoneFunc(func(key tcell.Key) {
- currentSelection := enteredCommandsView.GetHighlights()
- if key == tcell.KeyEnter {
- if len(currentSelection) > 0 {
- enteredCommandsView.Highlight()
- } else {
- enteredCommandsView.Highlight("0").ScrollToHighlight()
- }
- if len(currentSelection) == 1 {
- commandInputField.SetText(enteredCommandsView.GetRegionText(currentSelection[0]))
- application.SetFocus(commandInputField)
- }
- } else if len(currentSelection) > 0 {
- index, _ := strconv.Atoi(currentSelection[0])
- if key == tcell.KeyTab {
- index = (index + 1) % commandsExecuted
- } else if key == tcell.KeyBacktab {
- index = (index - 1 + commandsExecuted) % commandsExecuted
- } else {
- return
- }
- enteredCommandsView.Highlight(strconv.Itoa(index)).ScrollToHighlight()
- }
- })
-
- commandArea.AddItem(commandInputField, 2, 0, 1, 1, 0, 0, true)
- }
- return commandArea
-}
-
-func buildOutputArea(newPrimitive func(text string) tview.Primitive, application *tview.Application) *tview.Grid {
- outputAreaHeader := newPrimitive("Output")
- outputArea := tview.NewGrid().
- SetRows(3, 0, 10).
- SetColumns(0, 30).
- AddItem(outputAreaHeader, 0, 0, 1, 1, 0, 0, false)
- {
- var jumpToMessageItem func(messageNumber int) bool
- {
- outputView := tview.NewTextView().
- SetDynamicColors(true).
- SetRegions(true).
- SetWordWrap(false).
- SetWrap(false).
- SetChangedFunc(func() {
- application.Draw()
- })
- jumpToMessageItem = func(messageNumber int) bool {
- regionId := strconv.Itoa(messageNumber)
- if outputView.GetRegionText(regionId) == "" {
- return false
- }
- outputView.Highlight(regionId).ScrollToHighlight()
- return true
- }
- messageOutput = outputView
- messageOutputClear = func() {
- outputView.SetText("")
- }
-
- outputView.SetDoneFunc(func(key tcell.Key) {
- currentSelection := outputView.GetHighlights()
- if key == tcell.KeyEnter {
- if len(currentSelection) > 0 {
- outputView.Highlight()
- } else {
- outputView.Highlight("0").ScrollToHighlight()
- }
- } else if len(currentSelection) > 0 {
- index, _ := strconv.Atoi(currentSelection[0])
- if key == tcell.KeyTab {
- index = (index + 1) % numberOfMessagesReceived
- } else if key == tcell.KeyBacktab {
- index = (index - 1 + numberOfMessagesReceived) % numberOfMessagesReceived
- } else {
- return
- }
- outputView.Highlight(strconv.Itoa(index)).ScrollToHighlight()
- }
- })
- outputView.SetBorder(false)
- outputArea.AddItem(outputView, 1, 0, 1, 1, 0, 0, false)
- }
-
- {
- consoleView := tview.NewTextView().
- SetDynamicColors(true).
- SetMaxLines(config.MaxConsoleLines).
- SetChangedFunc(func() {
- application.Draw()
- })
- consoleOutput = consoleView
- consoleOutputClear = func() {
- consoleView.SetText("")
- }
-
- consoleView.SetBorder(false)
- outputArea.AddItem(consoleView, 2, 0, 1, 1, 0, 0, false)
- }
-
- {
- receivedMessagesList := tview.NewList()
- messageReceived = func(messageNumber int, receiveTime time.Time, message apiModel.PlcMessage) {
- application.QueueUpdateDraw(func() {
- receivedMessagesList.AddItem(fmt.Sprintf("No %d @%s (api)", messageNumber, receiveTime.Format("15:04:05.999999")), "", 0x0, func() {
- if ok := jumpToMessageItem(messageNumber); !ok {
- plc4xpcapanalyzerLog.Debug().Msg("Adding new message to console output")
- _, _ = fmt.Fprintf(messageOutput, "Message nr: %d\n[\"%d\"]%s[\"\"]\n", messageNumber, messageNumber, message)
- jumpToMessageItem(messageNumber)
- }
- })
- })
- }
- spiMessageReceived = func(messageNumber int, receiveTime time.Time, message spi.Message) {
- application.QueueUpdateDraw(func() {
- receivedMessagesList.AddItem(fmt.Sprintf("No %d @%s (spi)", messageNumber, receiveTime.Format("15:04:05.999999")), "", 0x0, func() {
- if ok := jumpToMessageItem(messageNumber); !ok {
- plc4xpcapanalyzerLog.Debug().Msg("Adding new spi message to console output")
- _, _ = fmt.Fprintf(messageOutput, "Message nr: %d\n[\"%d\"]%s[\"\"]\n", messageNumber, messageNumber, message)
- jumpToMessageItem(messageNumber)
- }
- })
- })
- }
- outputArea.AddItem(receivedMessagesList, 0, 1, 3, 1, 0, 0, false)
- }
- }
- return outputArea
-}
diff --git a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
index a5833333f7..f2abe8ef9d 100644
--- a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
+++ b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
@@ -1682,6 +1682,16 @@ public enum BACnetVendorId {
VERGE_SENSE((int) 1466, (int) 1466, (String) "VergeSense"),
SYSTEMAIR_MFG_INC((int) 1467, (int) 1467, (String) "Systemair Mfg. Inc."),
SEELEY_INTERNATIONAL((int) 1468, (int) 1468, (String) "Seeley International"),
+ CRANE_BUILDING_SERVICES_UTILITIES(
+ (int) 1469, (int) 1469, (String) "Crane Building Services & Utilities"),
+ BRADY_CORPORATION((int) 1470, (int) 1470, (String) "Brady Corporation"),
+ QINGDAO_HISENSE_HITACHI_AIR_CONDITIONING_SYSTEMS_CO_LTD(
+ (int) 1471,
+ (int) 1471,
+ (String) "Qingdao Hisense Hitachi Air-Conditioning Systems Co., Ltd."),
+ GOLDEN_QUALITY_CO_LTD((int) 1472, (int) 1472, (String) "Golden Quality Co. Ltd."),
+ ELVACOAB((int) 1473, (int) 1473, (String) "Elvaco AB"),
+ STRONG_TECHNOLOGYLLC((int) 1474, (int) 1474, (String) "Strong Technology, LLC"),
UNKNOWN_VENDOR((int) 0xFFFF, (int) 0xFFFF, (String) "Unknown");
private static final Map<Integer, BACnetVendorId> map;
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverIT.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPDriverIT.java
similarity index 91%
rename from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverIT.java
rename to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPDriverIT.java
index 68ca7ee0b2..dd18cc6859 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverIT.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPDriverIT.java
@@ -7,7 +7,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.plc4x.java.eip.readwrite;
+package org.apache.plc4x.java.eip.base;
import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerBigEndianTest.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPParserSerializerBigEndianTest.java
similarity index 91%
rename from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerBigEndianTest.java
rename to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPParserSerializerBigEndianTest.java
index 2190ea8eb0..c56bc754a9 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerBigEndianTest.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPParserSerializerBigEndianTest.java
@@ -7,7 +7,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.plc4x.java.eip.readwrite;
+package org.apache.plc4x.java.eip.base;
import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerLittleEndianTest.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPParserSerializerLittleEndianTest.java
similarity index 91%
rename from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerLittleEndianTest.java
rename to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPParserSerializerLittleEndianTest.java
index 40a242de01..3b82f649c8 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPParserSerializerLittleEndianTest.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/EIPParserSerializerLittleEndianTest.java
@@ -7,7 +7,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.plc4x.java.eip.readwrite;
+package org.apache.plc4x.java.eip.base;
import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/ManualEipIoTest.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/ManualEipTest.java
similarity index 51%
copy from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/ManualEipIoTest.java
copy to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/ManualEipTest.java
index bd9e995aee..6656a1d792 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/ManualEipIoTest.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/ManualEipTest.java
@@ -7,7 +7,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -16,22 +16,27 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.plc4x.java.eip.readwrite;
-import org.apache.plc4x.java.DefaultPlcDriverManager;
+package org.apache.plc4x.java.eip.base;
+
import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.util.concurrent.TimeUnit;
-public class ManualEipIoTest {
+public class ManualEipTest {
- public static void main(String[] args) throws Exception {
- final PlcConnection connection = new DefaultPlcDriverManager().getConnection("logix://localhost");
- final PlcReadRequest readRequest = connection.readRequestBuilder().addTagAddress("MyTag", "MyTag").build();
- final PlcReadResponse plcReadResponse = readRequest.execute().get();
- connection.close();
- assertEquals(plcReadResponse.getInteger("MyTag"), 0);
+ public static void main(String[] args) {
+ try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection("eip:tcp://192.168.23.10:44818")) {
+ PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
+ builder.addTagAddress("param", "%out01");
+ var readRequest = builder.build();
+ var readResponse = readRequest.execute().get(5000, TimeUnit.MILLISECONDS);
+ System.out.println(readResponse.getResponseCode("param"));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
}
+
}
diff --git a/plc4j/tools/ui/frontend/project/src/utils/Counter.ts b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/tag/EipTagTest.java
similarity index 78%
rename from plc4j/tools/ui/frontend/project/src/utils/Counter.ts
rename to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/tag/EipTagTest.java
index fb4e405d2c..525f075be6 100644
--- a/plc4j/tools/ui/frontend/project/src/utils/Counter.ts
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/base/tag/EipTagTest.java
@@ -17,12 +17,16 @@
* under the License.
*/
-export class Counter {
+package org.apache.plc4x.java.eip.base.tag;
- private _value:number = 0;
+import org.junit.jupiter.api.Test;
- public getAndIncrement():number {
- return this._value++
+public class EipTagTest {
+
+ @Test
+ public void testTagParse() {
+ EipTag eipTag = EipTag.of("%A0:2");
+ System.out.println(eipTag);
}
}
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/CompactLogixSimpleReadTest.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/logix/CompactLogixSimpleReadTest.java
similarity index 91%
rename from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/CompactLogixSimpleReadTest.java
rename to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/logix/CompactLogixSimpleReadTest.java
index b5505fe179..f0725b6ea8 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/CompactLogixSimpleReadTest.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/logix/CompactLogixSimpleReadTest.java
@@ -7,7 +7,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.plc4x.java.eip.readwrite;
+package org.apache.plc4x.java.eip.logix;
import org.apache.plc4x.test.parserserializer.ParserSerializerTestsuiteRunner;
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/ManualEipIoTest.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/logix/ManualEipIoTest.java
similarity index 94%
rename from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/ManualEipIoTest.java
rename to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/logix/ManualEipIoTest.java
index bd9e995aee..997c663c90 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/ManualEipIoTest.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/logix/ManualEipIoTest.java
@@ -7,7 +7,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * https://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.plc4x.java.eip.readwrite;
+package org.apache.plc4x.java.eip.logix;
import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java
index e095950861..03316cb7d5 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java
+++ b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java
@@ -774,9 +774,10 @@ public enum KnxManufacturer {
M_HANGZHOU_BROADLINK_TECHNOLOGY_CO__LTD_(
(int) 669, (int) 727, (String) "Hangzhou BroadLink Technology Co.,Ltd."),
M_MARLEY_DEUTSCHLAND_GMBH((int) 670, (int) 728, (String) "Marley Deutschland GmbH"),
- M_ABB___RESERVED((int) 671, (int) 43954, (String) "ABB - reserved"),
+ M_CREATROL((int) 671, (int) 729, (String) "Creatrol"),
+ M_ABB___RESERVED((int) 672, (int) 43954, (String) "ABB - reserved"),
M_BUSCH_JAEGER_ELEKTRO___RESERVED(
- (int) 672, (int) 43959, (String) "Busch-Jaeger Elektro - reserved");
+ (int) 673, (int) 43959, (String) "Busch-Jaeger Elektro - reserved");
private static final Map<Integer, KnxManufacturer> map;
static {
diff --git a/plc4j/examples/hello-ads-telemetry/pom.xml b/plc4j/examples/hello-ads-telemetry/pom.xml
deleted file mode 100644
index 661eff0181..0000000000
--- a/plc4j/examples/hello-ads-telemetry/pom.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.plc4x.examples</groupId>
- <artifactId>plc4j-examples</artifactId>
- <version>0.13.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>plc4j-examples-hello-ads-telemetry</artifactId>
- <name>PLC4J: Examples: Hello-ADS telemetry</name>
- <description>Hello world application using PLC4X to read ADS device telemetry.</description>
-
- <properties>
- <project.build.outputTimestamp>2024-02-16T14:53:02Z</project.build.outputTimestamp>
- <app.main.class>org.apache.plc4x.java.examples.helloads.telemetry.HelloAdsTelemetry</app.main.class>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.plc4x</groupId>
- <artifactId>plc4j-api</artifactId>
- <version>0.13.0-SNAPSHOT</version>
- </dependency>
-
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>log4j-over-slf4j</artifactId>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <configuration>
- <usedDependencies combine.children="append">
- <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
- </usedDependencies>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
\ No newline at end of file
diff --git a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/DeviceManagerConstants.java b/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/DeviceManagerConstants.java
deleted file mode 100644
index e463b2efcb..0000000000
--- a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/DeviceManagerConstants.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.examples.helloads.telemetry;
-
-// Extracted from https://infosys.beckhoff.com/index.php?content=../content/1031/devicemanager/262982923.html
-
-public enum DeviceManagerConstants {
- NIC(0x00000002),
- Time(0x00000003),
- UserManagement(0x00000004),
- RAS(0x00000005),
- FTP(0x00000006),
- SMB(0x00000007),
- TwinCat(0x00000008),
- Software(0x0000000A),
- CPU(0x0000000B),
- Memory(0x0000000C),
- FirewallWinCE(0x0000000E),
- FileSystemObject(0x00000010),
- DisplayDevice(0x00000013),
- EWF(0x00000014),
- FBWF(0x00000015),
- OS(0x00000018),
- RAID(0x00000019),
- Fan(0x0000001B),
- Mainboard(0x0000001C),
- DiskManagement(0x0000001D),
- UPS(0x0000001E),
- PhysicalDrive(0x0000001F),
- MassStorageDrive(0x00000020),
- UnifiedWriteFilter(0x00000021),
- IO(0x00000022),
- Misc(0x00000100);
-
- final int typeNumber;
- DeviceManagerConstants(int typeNumber) {
- this.typeNumber = typeNumber;
- }
-}
diff --git a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/EtherCatDevice.java b/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/EtherCatDevice.java
deleted file mode 100644
index 094a0ff24c..0000000000
--- a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/EtherCatDevice.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.examples.helloads.telemetry;
-
-public class EtherCatDevice {
-
- private final int etherCatAddress;
- private final String name;
- private final int vendorId;
- private final int productCode;
- private final int revisionNumber;
-
- public EtherCatDevice(int etherCatAddress, String name, int vendorId, int productCode, int revisionNumber) {
- this.etherCatAddress = etherCatAddress;
- this.name = name;
- this.vendorId = vendorId;
- this.productCode = productCode;
- this.revisionNumber = revisionNumber;
- }
-
- public int getEtherCatAddress() {
- return etherCatAddress;
- }
-
- public String getName() {
- return name;
- }
-
- public int getVendorId() {
- return vendorId;
- }
-
- public int getProductCode() {
- return productCode;
- }
-
- public int getRevisionNumber() {
- return revisionNumber;
- }
-}
diff --git a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/EtherCatMasterConstants.java b/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/EtherCatMasterConstants.java
deleted file mode 100644
index 174070bfca..0000000000
--- a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/EtherCatMasterConstants.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.examples.helloads.telemetry;
-
-// Extracted from https://infosys.beckhoff.com/index.php?content=../content/1031/devicemanager/262982923.html
-
-import org.apache.plc4x.java.api.types.PlcValueType;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum EtherCatMasterConstants {
- DeviceType(0x10000000, PlcValueType.UDINT),
- ManufacturerDeviceName(0x10080000, PlcValueType.STRING),
- HardwareVersion(0x10090000, PlcValueType.UINT),
- SoftwareVersion(0x100A0000, PlcValueType.STRING),
- IdentityObjectNum(0x10180000, PlcValueType.USINT),
- IdentityObjectVendorId(0x10180001, PlcValueType.UDINT),
- IdentityObjectProductCode(0x10180002, PlcValueType.UDINT),
- IdentityObjectRevisionNumber(0x10180003, PlcValueType.UDINT),
- IdentityObjectSerialNumber(0x10180004, PlcValueType.UDINT),
- ConfigurationDataNum(0x80000000, PlcValueType.USINT), // 0x8xxx0000 xxx = device index (starting with 0)
- ConfigurationDataAddress(0x80000001, PlcValueType.UINT),
- ConfigurationDataType(0x80000002, PlcValueType.STRING), // Not sure ...
- ConfigurationDataName(0x80000003, PlcValueType.STRING),
- ConfigurationDataDeviceType(0x80000004, PlcValueType.UDINT),
- ConfigurationDataVendorId(0x80000005, PlcValueType.UDINT),
- ConfigurationDataProductCode(0x80000006, PlcValueType.UDINT),
- ConfigurationDataRevisionNumber(0x80000007, PlcValueType.UDINT),
- ConfigurationDataSerialNumber(0x80000008, PlcValueType.UDINT),
- ConfigurationDataMailboxOutSize(0x80000021, PlcValueType.UINT),
- ConfigurationDataMailboxInSize(0x80000022, PlcValueType.UINT),
- ConfigurationDataLinkStatus(0x80000023, PlcValueType.USINT),
- ConfigurationDataLinkPreset(0x80000024, PlcValueType.USINT),
- ConfigurationDataFlags(0x80000025, PlcValueType.UINT),
- StateMachineNum(0xA0000000, PlcValueType.USINT), // 0xAxxx0000 xxx = device index (starting with 0)
- StateMachineAlStatus(0xA0000001, PlcValueType.UINT),
- StateMachineAlControl(0xA0000002, PlcValueType.UINT),
- StateMachineLastAlStatusCode(0xA0000003, PlcValueType.UINT),
- StateMachineLinkConnectionStatus(0xA0000004, PlcValueType.USINT),
- StateMachineLinkControl(0xA0000005, PlcValueType.USINT),
- StateMachineFixedAddressPort0(0xA0000006, PlcValueType.UINT),
- StateMachineFixedAddressPort1(0xA0000007, PlcValueType.UINT),
- StateMachineFixedAddressPort2(0xA0000008, PlcValueType.UINT),
- StateMachineFixedAddressPort3(0xA0000009, PlcValueType.UINT),
- StateMachineCrcErrorCountPort0(0xA000000A, PlcValueType.UDINT),
- StateMachineCrcErrorCountPort1(0xA000000B, PlcValueType.UDINT),
- StateMachineCrcErrorCountPort2(0xA000000C, PlcValueType.UDINT),
- StateMachineCrcErrorCountPort3(0xA000000D, PlcValueType.UDINT),
- StateMachineCyclicWcErrorCount(0xA000000E, PlcValueType.UDINT),
- StateMachineSlaveNotPresentCount(0xA000000F, PlcValueType.UDINT),
- StateMachineAbnormalStateChangeCount(0xA0000010, PlcValueType.UDINT),
- //StateMachineDisableAutomaticLinkControl(0xA0000011, PlcValueType.BOOL),
- //ScanSlavesNum(0xF002000, PlcValueType.),
- //ScanSlavesScanCommand(0xF002001, PlcValueType.),
- ScanSlavesScanStatus(0xF002002, PlcValueType.USINT),
- //ScanSlavesScanReply(0xF002003, PlcValueType.),
- ConfiguredSlavesNum(0xF0200000, PlcValueType.USINT), // Get the EtherCAT address by looping through the modules
- // FrameStatisticsNum(0xF1200000, PlcValueType.);
- FrameStatisticsCyclicLostFramesCount(0xF1200001, PlcValueType.UDINT),
- FrameStatisticsAcyclicLostFramesCount(0xF1200002, PlcValueType.UDINT);
- //DiagnosticNum(0xF2000000, PlcValueType.),
- //DiagnosticResetDiagnosticCounters(0xF2000001, PlcValueType.);
-
- private static final Map<Integer, EtherCatMasterConstants> map;
- static {
- map = new HashMap<>();
- for (EtherCatMasterConstants value : EtherCatMasterConstants.values()) {
- map.put(value.offset, value);
- }
- }
-
- final int offset;
- final PlcValueType plcValueType;
- EtherCatMasterConstants(int offset, PlcValueType plcValueType) {
- this.offset = offset;
- this.plcValueType = plcValueType;
- }
-
- public static EtherCatMasterConstants enumForValue(int offset) {
- return map.get(offset);
- }
-
-}
diff --git a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsEtherCatTelemetry.java b/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsEtherCatTelemetry.java
deleted file mode 100644
index 38d8e8a1e3..0000000000
--- a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsEtherCatTelemetry.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.examples.helloads.telemetry;
-
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.PlcDriverManager;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.api.types.PlcValueType;
-import org.apache.plc4x.java.api.value.PlcValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.Map;
-
-// Extracted from https://infosys.beckhoff.com/index.php?content=../content/1031/devicemanager/262982923.html
-
-public class HelloAdsEtherCatTelemetry {
-
- private static final Logger logger = LoggerFactory.getLogger(HelloAdsTelemetry.class);
-
- private static final int AoEGroupIndex = 0x0000F302;
-
- protected void outputEtherCatData(String remoteIp, String localAmsNetId, String remoteAmdNetId) {
- Map<Integer, EtherCatDevice> devices = new HashMap<>();
- // The AmsNetId of the PLC usually is {ip}.1.1 and that of the EtherCAT master is {ip}.3.1
- // The port number equals the EtherCAT address. For the EtherCAT master, this port is 0xFFFF = 65535
- try (PlcConnection connection = PlcDriverManager.getDefault().getConnectionManager().getConnection(String.format("ads:tcp://%s?targetAmsNetId=%s&targetAmsPort=65535&sourceAmsNetId=%s&sourceAmsPort=65534&load-symbol-and-data-type-tables=false", remoteIp, remoteAmdNetId, localAmsNetId))) {
- String manufacturerDeviceName = connection.readRequestBuilder().addTagAddress("manufacturerDeviceName", getAddress(EtherCatMasterConstants.ManufacturerDeviceName)).build().execute().get().getString("manufacturerDeviceName");
- int hardwareVersion = connection.readRequestBuilder().addTagAddress("hardwareVersion", getAddress(EtherCatMasterConstants.HardwareVersion)).build().execute().get().getInteger("hardwareVersion");
- String softwareVersion = connection.readRequestBuilder().addTagAddress("softwareVersion", getAddress(EtherCatMasterConstants.SoftwareVersion)).build().execute().get().getString("softwareVersion");
- logger.info("Found Device: {} Hardware Version {}, Software Version {}", manufacturerDeviceName, hardwareVersion, softwareVersion);
-
- logger.info("Identity Object:");
- outputEtherCatSection(connection, EtherCatMasterConstants.IdentityObjectNum.offset, EtherCatMasterConstants.IdentityObjectNum.offset);
-
- // Load the number of EtherCAT slaves:
- int numSlaves = connection.readRequestBuilder().addTagAddress("numberOfSlaves", "0x0000F302/0xF0200000:USINT").build().execute().get().getInteger("numberOfSlaves");
-
- // Load the number of slaves and their etherCatAddresses
- // NOTE: We need to do this without using multi-item-requests as it seems that this part of the system doesn't support this.
- for(int i = 0; i < numSlaves; i++) {
- logger.info("Slave {}", i);
- int etherCatAddressOffset = EtherCatMasterConstants.ConfiguredSlavesNum.offset | (i + 1);
- int configDataOffset = EtherCatMasterConstants.ConfigurationDataNum.offset | (i << 16);
- int stateMachineOffset = EtherCatMasterConstants.StateMachineNum.offset | (i << 16);
-
- String etherCatAddressAddress = String.format("0x%08X/0x%08X:%s", AoEGroupIndex, etherCatAddressOffset, PlcValueType.UINT.name());
- int etherCatAddress = connection.readRequestBuilder().addTagAddress("etherCatAddress", etherCatAddressAddress).build().execute().get().getInteger("etherCatAddress");
- logger.info(" - EtherCat Address: {}", etherCatAddress);
-
- logger.info(" - Configuration Data:");
- EtherCatDevice device = outputEtherCatSection(connection, configDataOffset, EtherCatMasterConstants.ConfigurationDataNum.offset);
- //logger.info(" - State Machine Data");
- //outputEtherCatSection(connection, stateMachineOffset, EtherCatConstant.StateMachineNum.offset);
- devices.put(i, device);
-
- //String manufacturerDeviceName = connection.readRequestBuilder().addTagAddress("lalala", getAddress(EtherCatConstant.ManufacturerDeviceName)).build().execute().get().getString("manufacturerDeviceName");
-
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- logger.info("Loading EtherCAT device information:");
- for (Map.Entry<Integer, EtherCatDevice> device : devices.entrySet()) {
- int deviceIndex = device.getKey();
- EtherCatDevice etherCatDevice = device.getValue();
- logger.info(" - Connecting with device {} on EtherCAT address {}", deviceIndex, 1001);
- try (PlcConnection etherCatConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(String.format("ads:tcp://%s?targetAmsNetId=%s&targetAmsPort=%d&sourceAmsNetId=%s&sourceAmsPort=65534&load-symbol-and-data-type-tables=false", remoteIp, remoteAmdNetId, etherCatDevice.getEtherCatAddress(), localAmsNetId))) {
- String etherCatAddressAddress = String.format("0x%08X/0x%08X:%s", AoEGroupIndex, 0x60000001, PlcValueType.BOOL.name());
- PlcReadRequest build = etherCatConnection.readRequestBuilder()
- .addTagAddress("Channel 1", etherCatAddressAddress)
- .build();
- PlcReadResponse plcReadResponse = build.execute().get();
- System.out.println(plcReadResponse);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- protected EtherCatDevice outputEtherCatSection(PlcConnection connection, int baseOffset, int baseTypeOffset) throws Exception {
- String sectionNumAddress = String.format("0x%08X/0x%08X:%s", AoEGroupIndex, baseOffset, PlcValueType.USINT.name());
-
- int etherCatAddress = 0;
- String deviceName = null;
- int vendorId = 0;
- int productCode = 0;
- int revisionNumber = 0;
-
- int identityObjectNum = connection.readRequestBuilder().addTagAddress("num", sectionNumAddress).build().execute().get().getInteger("num");
- for (int i = 1; i < identityObjectNum; i++) {
- int offset = baseOffset | i;
- int typeOffset = baseTypeOffset | i;
- EtherCatMasterConstants etherCatConstantAddress = EtherCatMasterConstants.enumForValue(typeOffset);
- PlcValueType etherCatConstantType = (etherCatConstantAddress != null) ? etherCatConstantAddress.plcValueType : PlcValueType.USINT;
- String address = String.format("0x%08X/0x%08X:%s", AoEGroupIndex, offset, etherCatConstantType.name());
- if(etherCatConstantType == PlcValueType.STRING) {
- address += "(255)";
- }
- try {
- PlcReadResponse readResponse = connection.readRequestBuilder().addTagAddress("value", address).build().execute().get();
- if (readResponse.getResponseCode("value") == PlcResponseCode.OK) {
- PlcValue value = readResponse.getPlcValue("value");
- if (etherCatConstantAddress != null) {
- switch (etherCatConstantAddress) {
- case ConfigurationDataAddress:
- etherCatAddress = value.getInteger();
- break;
- case ConfigurationDataName:
- deviceName = value.getString();
- break;
- case ConfigurationDataVendorId:
- vendorId = value.getInteger();
- break;
- case ConfigurationDataProductCode:
- productCode = value.getInteger();
- break;
- case ConfigurationDataRevisionNumber:
- revisionNumber = value.getInteger();
- break;
- }
- logger.info(" - {}: {}", etherCatConstantAddress.name(), value.toString());
- } else {
- logger.info(" - Unknown: {}", value.toString());
- }
- }
- } catch (Exception e) {
- // Ignore this ...
- }
- }
- return new EtherCatDevice(etherCatAddress, deviceName, vendorId, productCode, revisionNumber);
- }
-
-
- protected String getAddress(EtherCatMasterConstants variable) {
- String dataTypeName = variable.plcValueType.name();
- if (variable.plcValueType == PlcValueType.STRING) {
- dataTypeName += "(255)";
- }
- return String.format("0x%08X/0x%08X:%s", AoEGroupIndex, variable.offset, dataTypeName);
- }
-
- public static void main(String[] args) {
- if(args.length != 3) {
- logger.error("Usage: HelloAdsTelemetry {remote ip-address} {local-ams-net-id} {remote-ams-net-id}");
- System.exit(1);
- }
-
- String remoteIp = args[0];
- String localAmsNetId = args[1];
- String remoteAmsNetId = args[2];
- new HelloAdsEtherCatTelemetry().outputEtherCatData(remoteIp, localAmsNetId, remoteAmsNetId);
- }
-
-}
\ No newline at end of file
diff --git a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsTelemetry.java b/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsTelemetry.java
deleted file mode 100644
index da11b0524a..0000000000
--- a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsTelemetry.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.examples.helloads.telemetry;
-
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.PlcDriverManager;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class HelloAdsTelemetry {
-
- private static final Logger logger = LoggerFactory.getLogger(HelloAdsTelemetry.class);
- public static void main(String[] args) {
- if(args.length != 2) {
- logger.error("Usage: HelloAdsTelemetry {ip-address of PLC} {local ip-address}");
- System.exit(1);
- }
-
- String remoteIp = args[0];
- String localIp = args[1];
- try (PlcConnection connection = PlcDriverManager.getDefault().getConnectionManager().getConnection(String.format("ads:tcp://%s?targetAmsNetId=%s.1.1&targetAmsPort=10000&sourceAmsNetId=%s.1.1&sourceAmsPort=65534&load-symbol-and-data-type-tables=false", remoteIp, remoteIp, localIp))) {
- // Load the number of modules:
- int numModules = connection.readRequestBuilder().addTagAddress("numberOfModules", "0x0000F302/0xF0200000:UINT").build().execute().get().getInteger("numberOfModules");
-
- // Load the mdp type and index for each module
- // NOTE: We need to do this without using multi-item-requests as it seems that this part of the system doesn't support this.
- Map<Integer, Integer> moduleTypeIdMap = new HashMap<>();
- for(int i = 1; i < numModules; i++) {
- String name = "module-" + i;
- String address = String.format("0x0000F302/0xF020%04X:UDINT", i);
- PlcReadResponse plcReadResponse = connection.readRequestBuilder().addTagAddress(name, address).build().execute().get();
- if (plcReadResponse.getResponseCode(name) == PlcResponseCode.OK) {
- int value = plcReadResponse.getInteger(name);
- int mdpType = ((value & 0xFFFF0000) >> 16);
- int mdpId = value & 0x0000FFFF;
- logger.info("Module {} has mdp type {} and mdp id {}", i, mdpType, mdpId);
- moduleTypeIdMap.put(mdpType, mdpId);
- }
- }
-
- // Read the ADS Version information.
- if(moduleTypeIdMap.containsKey(DeviceManagerConstants.TwinCat.typeNumber)) {
- Integer mdpId = moduleTypeIdMap.get(DeviceManagerConstants.TwinCat.typeNumber);
- int addrAdsTypeMain = (mdpId << 20) | 0x80010001;
- int addrAdsTypeMinor = (mdpId << 20) | 0x80010002;
- int addrAdsTypeBuild = (mdpId << 20) | 0x80010003;
- int twinCatMainVersion = connection.readRequestBuilder().addTagAddress("value", String.format("0x0000F302/0x%8X:UINT", addrAdsTypeMain)).build().execute().get().getInteger("value");
- int twinCatMinorVersion = connection.readRequestBuilder().addTagAddress("value", String.format("0x0000F302/0x%8X:UINT", addrAdsTypeMinor)).build().execute().get().getInteger("value");
- int twinCatBuildVersion = connection.readRequestBuilder().addTagAddress("value", String.format("0x0000F302/0x%8X:UINT", addrAdsTypeBuild)).build().execute().get().getInteger("value");
- logger.info("TwinCat Version: {}.{}.{}", twinCatMainVersion, twinCatMinorVersion, twinCatBuildVersion);
- }
- // Read the CPU Frequency and Utilization.
- if(moduleTypeIdMap.containsKey(DeviceManagerConstants.CPU.typeNumber)) {
- Integer mdpId = moduleTypeIdMap.get(DeviceManagerConstants.CPU.typeNumber);
- int addrCpuFrequency = (mdpId << 20) | 0x80010001;
- int addrCpuUsage = (mdpId << 20) | 0x80010002;
- int cpuFrequency = connection.readRequestBuilder().addTagAddress("value", String.format("0x0000F302/0x%8X:UDINT", addrCpuFrequency)).build().execute().get().getInteger("value");
- int cpuUsage = connection.readRequestBuilder().addTagAddress("value", String.format("0x0000F302/0x%8X:UINT", addrCpuUsage)).build().execute().get().getInteger("value");
- logger.info("CPU: Frequency: {}MHz Usage: {}%", cpuFrequency, cpuUsage);
- }
- // Read the Memory usage.
- if(moduleTypeIdMap.containsKey(DeviceManagerConstants.Memory.typeNumber)) {
- Integer mdpId = moduleTypeIdMap.get(DeviceManagerConstants.Memory.typeNumber);
- int addrMemoryAllocated = (mdpId << 20) | 0x80010001;
- int addrMemoryAvailable = (mdpId << 20) | 0x80010002;
- int memoryAllocated = connection.readRequestBuilder().addTagAddress("value", String.format("0x0000F302/0x%8X:UDINT", addrMemoryAllocated)).build().execute().get().getInteger("value");
- int memoryAvailable = connection.readRequestBuilder().addTagAddress("value", String.format("0x0000F302/0x%8X:UDINT", addrMemoryAvailable)).build().execute().get().getInteger("value");
- logger.info("Memory: Allocated: {}MB, Available: {}MB, Usage {}%", memoryAllocated / (1024 * 1024), memoryAvailable / (1024 * 1024), ((float) 100 / memoryAllocated) * memoryAvailable);
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
-}
diff --git a/plc4j/examples/hello-ads-telemetry/src/main/resources/logback.xml b/plc4j/examples/hello-ads-telemetry/src/main/resources/logback.xml
deleted file mode 100644
index 16b83b4882..0000000000
--- a/plc4j/examples/hello-ads-telemetry/src/main/resources/logback.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-<configuration xmlns="http://ch.qos.logback/xml/ns/logback"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd">
-
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
- </encoder>
- </appender>
-
- <root level="warn">
- <appender-ref ref="STDOUT" />
- </root>
-
-</configuration>
\ No newline at end of file
diff --git a/plc4j/examples/hello-cloud-azure/pom.xml b/plc4j/examples/hello-cloud-azure/pom.xml
deleted file mode 100644
index cba8fed0b2..0000000000
--- a/plc4j/examples/hello-cloud-azure/pom.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache.plc4x.examples</groupId>
- <artifactId>plc4j-examples</artifactId>
- <version>0.13.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>plc4j-examples-hello-cloud-azure</artifactId>
- <name>PLC4J: Examples: Cloud: Azure IoT Hub</name>
- <description>
- Implementation of a PLC4X application gathering information from
- a PLC and making that available in an Azure IoT Hub.
- </description>
-
- <properties>
- <project.build.outputTimestamp>2024-02-16T14:53:02Z</project.build.outputTimestamp>
- </properties>
-
- <dependencies>
... 26037 lines suppressed ...