From da9243cba234b4081564a4a48b00ce4ca8fffaf2 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 23 Jul 2024 13:31:54 +0200 Subject: [PATCH 01/35] List "Arduino_Opta_Blueprint" as dependendy, which in turn requires "Arduino_SerialUpdater" and "Arduino_DebugUtils". --- library.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/library.properties b/library.properties index 0557f15..dd4148e 100644 --- a/library.properties +++ b/library.properties @@ -10,3 +10,4 @@ url=https://github.com/bcmi-labs/Arduino_open62541 ldflags=-lopen62541 includes=Arduino_open62541.h precompiled=true +depends=Arduino_Opta_Blueprint From d507ac18706d9774de55de1df0463daa70baab56 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 23 Jul 2024 13:34:51 +0200 Subject: [PATCH 02/35] Install Arduino_Opta_Blueprint and required dependencies for CI build. --- .github/workflows/compile-examples.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index c52346d..668bfaf 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -25,6 +25,11 @@ jobs: with: fqbn: ${{ matrix.board.fqbn }} platforms: ${{ matrix.board.platforms }} + libraries: | + - source-path: ./ + - name: Arduino_Opta_Blueprint + - name: Arduino_SerialUpdater + - name: Arduino_DebugUtils enable-deltas-report: true github-token: ${{ secrets.GITHUB_TOKEN }} sketches-report-path: ${{ env.SKETCHES_REPORTS_PATH }} From 939f2feb8c0dee16769e1cb3587cd1e77c866cef Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 23 Jul 2024 13:42:15 +0200 Subject: [PATCH 03/35] Scan for and print number of expansion modules detected. --- examples/opcua_server/opcua_server.ino | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 14d1d8c..824b0ff 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -4,6 +4,7 @@ #include "PortentaEthernet.h" #include "Arduino_open62541.h" +#include /* Arduino_Opta_Blueprint */ #include #ifndef ARDUINO_OPEN62541_O1HEAP_DEBUG @@ -239,6 +240,10 @@ void setup() set_time(opcua::cvt_time(__DATE__)); /* Configure Arduino Opta with time at compile time as last time of defense. */ } + /* Initialize Opta Expansion module controller. */ + OptaController.begin(); + OptaController.update(); + /* Initialize heap memory. */ o1heap_ins = o1heapInit(OPC_UA_SERVER_THREAD_HEAP.data(), OPC_UA_SERVER_THREAD_HEAP.size()); if (o1heap_ins == nullptr) { @@ -313,6 +318,10 @@ void setup() arduino_opta_opcua->led_mgr()->add_led_output(opc_ua_server, "User LED", [](bool const value) { pinMode(LEDB, OUTPUT); digitalWrite(LEDB, value); }); } + /* Check availability of expansion modules. */ + uint8_t const opta_expansion_num = OptaController.getExpansionNum(); + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "OptaController %d expansion modules detected.", opta_expansion_num); + #if USE_MODBUS_SENSOR_MD02 { UA_StatusCode rc = UA_STATUSCODE_GOOD; @@ -407,6 +416,9 @@ void setup() void loop() { + /* Always call update as fast as possible */ + OptaController.update(); + digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(500); From 12900374456d457847282495aae69a81fde7b6a6 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 23 Jul 2024 13:46:40 +0200 Subject: [PATCH 04/35] Iterate over all expansion modules and print type and I2C address. --- examples/opcua_server/opcua_server.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 824b0ff..0ce31b3 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -321,6 +321,8 @@ void setup() /* Check availability of expansion modules. */ uint8_t const opta_expansion_num = OptaController.getExpansionNum(); UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "OptaController %d expansion modules detected.", opta_expansion_num); + for(uint8_t i = 0; i < opta_expansion_num; i++) + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Expansion %d: type = %d, I2C address= 0x%02X", i, OptaController.getExpansionType(i), OptaController.getExpansionI2Caddress(i)); #if USE_MODBUS_SENSOR_MD02 { From b7cc798a3697ddfd2522e833f3b6d4ebd70cd9a5 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 23 Jul 2024 14:44:08 +0200 Subject: [PATCH 05/35] Provide conversion of expansion type to string for easier reading. --- examples/opcua_server/opcua_server.ino | 3 +- src/ArduinoOpta.h | 1 + src/ArduinoOptaExpansionType.h | 58 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/ArduinoOptaExpansionType.h diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 0ce31b3..2e2f5d3 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -322,7 +322,8 @@ void setup() uint8_t const opta_expansion_num = OptaController.getExpansionNum(); UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "OptaController %d expansion modules detected.", opta_expansion_num); for(uint8_t i = 0; i < opta_expansion_num; i++) - UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Expansion %d: type = %d, I2C address= 0x%02X", i, OptaController.getExpansionType(i), OptaController.getExpansionI2Caddress(i)); + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Expansion %d: type = %d (\"%16s\"), I2C address= 0x%02X", + i, OptaController.getExpansionType(i), opcua::ArduinoOptaExpansionType::toStr(OptaController.getExpansionType(i)).c_str(), OptaController.getExpansionI2Caddress(i)); #if USE_MODBUS_SENSOR_MD02 { diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index 364cd52..dd462a5 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -23,6 +23,7 @@ #include "DigitalInputManager.h" #include "UserButton.h" #include "ArduinoOptaVariant.h" +#include "ArduinoOptaExpansionType.h" /************************************************************************************** * NAMESPACE diff --git a/src/ArduinoOptaExpansionType.h b/src/ArduinoOptaExpansionType.h new file mode 100644 index 0000000..aa33024 --- /dev/null +++ b/src/ArduinoOptaExpansionType.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include + +#include "OptaBlue.h" + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * CLASS DECLARATION + **************************************************************************************/ + +class ArduinoOptaExpansionType +{ +public: + ArduinoOptaExpansionType() = delete; + ArduinoOptaExpansionType(ArduinoOptaExpansionType const &) = delete; + + static std::string toStr(ExpansionType_t const type) + { + if(type == EXPANSION_NOT_VALID) + return std::string("Invalid"); + else if(type == EXPANSION_OPTA_DIGITAL_MEC) + return std::string("Digital [Mech.]"); + else if(type == EXPANSION_OPTA_DIGITAL_STS) + return std::string("Digital [Solid]"); + else if(type == EXPANSION_DIGITAL_INVALID) + return std::string("Digital [Inva.]"); + else if(type == EXPANSION_OPTA_ANALOG) + return std::string("Analog"); + else + return std::string("Unknown"); + } +}; + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} From cdb5bf4717bbd65df64bcc524af764685f928fcd Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 24 Jul 2024 09:20:46 +0200 Subject: [PATCH 06/35] Automatically register and expose mechanical relays of expansion boards from mechanical digital expansion boards. --- examples/opcua_server/opcua_server.ino | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 2e2f5d3..a886d9a 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -325,6 +325,30 @@ void setup() UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Expansion %d: type = %d (\"%16s\"), I2C address= 0x%02X", i, OptaController.getExpansionType(i), opcua::ArduinoOptaExpansionType::toStr(OptaController.getExpansionType(i)).c_str(), OptaController.getExpansionI2Caddress(i)); + /* Expose Arduino Opta expansion module IO via OPC/UA. */ + for(uint8_t i = 0; i < opta_expansion_num; i++) + { + ExpansionType_t const exp_type = OptaController.getExpansionType(i); + if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) + { + /* Obtain mechanical expansion controller. */ + DigitalMechExpansion mech_exp = OptaController.getExpansion(i); + if (mech_exp) + { + /* Expose mechanical relays via OPC/UA. */ + for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) + { + char mech_relay_name[64] = {0}; + snprintf(mech_relay_name, sizeof(mech_relay_name), "Dig. Exp. (Mech.) %d Relay %d", i, r + 1); + arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); + } + } + else { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "could not obtain expansion controller for expansion %d", i); + } + } + } + #if USE_MODBUS_SENSOR_MD02 { UA_StatusCode rc = UA_STATUSCODE_GOOD; @@ -422,6 +446,19 @@ void loop() /* Always call update as fast as possible */ OptaController.update(); + /* Determine the number of expansion boards available and call update on them. */ + uint8_t const opta_expansion_num = OptaController.getExpansionNum(); + for(uint8_t i = 0; i < opta_expansion_num; i++) + { + ExpansionType_t const exp_type = OptaController.getExpansionType(i); + if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) + { + DigitalMechExpansion mech_exp = OptaController.getExpansion(i); + mech_exp.updateDigitalOutputs(); + } + } + + /* Toggle main LED signalling progress. */ digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); delay(500); From 5d4e58cd63eca974d47a795a82e04c100c9bb40b Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 24 Jul 2024 09:29:24 +0200 Subject: [PATCH 07/35] Expose solid state relays via OPC/UA. --- examples/opcua_server/opcua_server.ino | 33 +++++++++++++------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index a886d9a..d7cda2d 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -331,20 +331,22 @@ void setup() ExpansionType_t const exp_type = OptaController.getExpansionType(i); if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) { - /* Obtain mechanical expansion controller. */ - DigitalMechExpansion mech_exp = OptaController.getExpansion(i); - if (mech_exp) + /* Expose mechanical relays via OPC/UA. */ + for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { - /* Expose mechanical relays via OPC/UA. */ - for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) - { - char mech_relay_name[64] = {0}; - snprintf(mech_relay_name, sizeof(mech_relay_name), "Dig. Exp. (Mech.) %d Relay %d", i, r + 1); - arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); - } + char mech_relay_name[64] = {0}; + snprintf(mech_relay_name, sizeof(mech_relay_name), "Dig. Exp. (Mech.) %d Relay %d", i, r + 1); + arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } - else { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "could not obtain expansion controller for expansion %d", i); + } + else if (exp_type == EXPANSION_OPTA_DIGITAL_STS) + { + /* Expose mechanical relays via OPC/UA. */ + for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) + { + char solid_state_relay_name[64] = {0}; + snprintf(solid_state_relay_name, sizeof(solid_state_relay_name), "Dig. Exp. (Soli.) %d Relay %d", i, r + 1); + arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, solid_state_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } } @@ -452,10 +454,9 @@ void loop() { ExpansionType_t const exp_type = OptaController.getExpansionType(i); if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) - { - DigitalMechExpansion mech_exp = OptaController.getExpansion(i); - mech_exp.updateDigitalOutputs(); - } + reinterpret_cast(OptaController.getExpansionPtr(i))->updateDigitalOutputs(); + else if (exp_type == EXPANSION_OPTA_DIGITAL_STS) + reinterpret_cast(OptaController.getExpansionPtr(i))->updateDigitalOutputs(); } /* Toggle main LED signalling progress. */ From 8210d705b3ad43fe33a4eb1a18b6aaf60cce302e Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 24 Jul 2024 10:25:07 +0200 Subject: [PATCH 08/35] Creating intermediate object layer of digital expansion boards. --- examples/opcua_server/opcua_server.ino | 7 ++- src/ArduinoOpta.cpp | 7 +++ src/ArduinoOpta.h | 6 ++ src/ArduinoOptaDigitalMechExpansion.cpp | 79 +++++++++++++++++++++++++ src/ArduinoOptaDigitalMechExpansion.h | 60 +++++++++++++++++++ 5 files changed, 156 insertions(+), 3 deletions(-) create mode 100644 src/ArduinoOptaDigitalMechExpansion.cpp create mode 100644 src/ArduinoOptaDigitalMechExpansion.h diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index d7cda2d..a84a251 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -331,12 +331,13 @@ void setup() ExpansionType_t const exp_type = OptaController.getExpansionType(i); if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) { + auto const exp_mech_opcua = arduino_opta_opcua->create_digital_mech_expansion(i); /* Expose mechanical relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { - char mech_relay_name[64] = {0}; - snprintf(mech_relay_name, sizeof(mech_relay_name), "Dig. Exp. (Mech.) %d Relay %d", i, r + 1); - arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); + char mech_relay_name[32] = {0}; + snprintf(mech_relay_name, sizeof(mech_relay_name), "Relay %d", r + 1); + exp_mech_opcua->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } else if (exp_type == EXPANSION_OPTA_DIGITAL_STS) diff --git a/src/ArduinoOpta.cpp b/src/ArduinoOpta.cpp index 236ca99..7b5388e 100644 --- a/src/ArduinoOpta.cpp +++ b/src/ArduinoOpta.cpp @@ -180,6 +180,13 @@ LedManager::SharedPtr ArduinoOpta::led_mgr() return _led_mgr; } +ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOpta::create_digital_mech_expansion(uint8_t const exp_num) +{ + auto const exp_mech_opcua = opcua::ArduinoOptaDigitalMechExpansion::create(_server, _node_id, exp_num); + _dig_mech_exp_list.push_back(exp_mech_opcua); + return exp_mech_opcua; +} + /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index dd462a5..dff4aa8 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -24,6 +24,7 @@ #include "UserButton.h" #include "ArduinoOptaVariant.h" #include "ArduinoOptaExpansionType.h" +#include "ArduinoOptaDigitalMechExpansion.h" /************************************************************************************** * NAMESPACE @@ -52,6 +53,9 @@ class ArduinoOpta [[nodiscard]] UA_NodeId node_id() const { return _node_id; } + ArduinoOptaDigitalMechExpansion::SharedPtr create_digital_mech_expansion(uint8_t const exp_num); + + private: UA_Server * _server; UA_NodeId _node_id; @@ -61,6 +65,8 @@ class ArduinoOpta DigitalInputManager::SharedPtr _digital_input_mgr; RelayManager::SharedPtr _relay_mgr; LedManager::SharedPtr _led_mgr; + + std::list _dig_mech_exp_list; }; /************************************************************************************** diff --git a/src/ArduinoOptaDigitalMechExpansion.cpp b/src/ArduinoOptaDigitalMechExpansion.cpp new file mode 100644 index 0000000..f827d0d --- /dev/null +++ b/src/ArduinoOptaDigitalMechExpansion.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "ArduinoOptaDigitalMechExpansion.h" + +#include + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * PUBLIC MEMBER FUNCTIONS + **************************************************************************************/ + +ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOptaDigitalMechExpansion::create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num) +{ + UA_StatusCode rc = UA_STATUSCODE_GOOD; + + char display_name[32] = {0}; + snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Mechanic)", exp_num); + + UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; + oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); + UA_NodeId node_id; + rc = UA_Server_addObjectNode(server, + UA_NODEID_NULL, + parent_node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), + UA_QUALIFIEDNAME(1, "DigExpMech"), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), + oAttr, + NULL, + &node_id); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "ArduinoOptaDigitalMechExpansion::create: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); + return nullptr; + } + + auto const instance_ptr = std::make_shared(server, node_id); + return instance_ptr; +} + +/************************************************************************************** + * PUBLIC MEMBER FUNCTIONS + **************************************************************************************/ + +RelayManager::SharedPtr ArduinoOptaDigitalMechExpansion::relay_mgr() +{ + if (!_relay_mgr) + { + _relay_mgr = opcua::RelayManager::create(_server, _node_id); + if (!_relay_mgr) + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalMechExpansion::relay_mgr: RelayManager::create(...) failed."); + } + + return _relay_mgr; +} + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ diff --git a/src/ArduinoOptaDigitalMechExpansion.h b/src/ArduinoOptaDigitalMechExpansion.h new file mode 100644 index 0000000..042b64b --- /dev/null +++ b/src/ArduinoOptaDigitalMechExpansion.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "open62541.h" + +#include + +#include "RelayManager.h" + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * CLASS DECLARATION + **************************************************************************************/ + +class ArduinoOptaDigitalMechExpansion +{ +public: + typedef std::shared_ptr SharedPtr; + + static SharedPtr create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num); + + ArduinoOptaDigitalMechExpansion(UA_Server * server, UA_NodeId const & node_id) + : _server{server} + , _node_id{node_id} + { } + + + RelayManager::SharedPtr relay_mgr(); + + +private: + UA_Server * _server; + UA_NodeId const _node_id; + + RelayManager::SharedPtr _relay_mgr; +}; + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ From 7e962885b80a15e4b438161b72667f4ed698febb Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 24 Jul 2024 10:33:06 +0200 Subject: [PATCH 09/35] Creating intermediate object layer of digital expansion boards / solid state. --- examples/opcua_server/opcua_server.ino | 11 +-- src/ArduinoOpta.cpp | 9 ++- src/ArduinoOpta.h | 6 +- src/ArduinoOptaDigitalMechExpansion.cpp | 7 +- src/ArduinoOptaDigitalStSolidExpansion.cpp | 82 ++++++++++++++++++++++ src/ArduinoOptaDigitalStSolidExpansion.h | 60 ++++++++++++++++ 6 files changed, 165 insertions(+), 10 deletions(-) create mode 100644 src/ArduinoOptaDigitalStSolidExpansion.cpp create mode 100644 src/ArduinoOptaDigitalStSolidExpansion.h diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index a84a251..968626f 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -331,7 +331,7 @@ void setup() ExpansionType_t const exp_type = OptaController.getExpansionType(i); if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) { - auto const exp_mech_opcua = arduino_opta_opcua->create_digital_mech_expansion(i); + auto const exp_mech_opcua = arduino_opta_opcua->create_digital_mechanical_expansion(i); /* Expose mechanical relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { @@ -342,12 +342,13 @@ void setup() } else if (exp_type == EXPANSION_OPTA_DIGITAL_STS) { - /* Expose mechanical relays via OPC/UA. */ + auto const exp_solid_state_opcua = arduino_opta_opcua->create_digital_solid_state_expansion(i); + /* Expose solit state relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { - char solid_state_relay_name[64] = {0}; - snprintf(solid_state_relay_name, sizeof(solid_state_relay_name), "Dig. Exp. (Soli.) %d Relay %d", i, r + 1); - arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, solid_state_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); + char solid_state_relay_name[32] = {0}; + snprintf(solid_state_relay_name, sizeof(solid_state_relay_name), "Relay %d", r + 1); + exp_solid_state_opcua->relay_mgr()->add_relay_output(opc_ua_server, solid_state_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } } diff --git a/src/ArduinoOpta.cpp b/src/ArduinoOpta.cpp index 7b5388e..67a58df 100644 --- a/src/ArduinoOpta.cpp +++ b/src/ArduinoOpta.cpp @@ -180,13 +180,20 @@ LedManager::SharedPtr ArduinoOpta::led_mgr() return _led_mgr; } -ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOpta::create_digital_mech_expansion(uint8_t const exp_num) +ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOpta::create_digital_mechanical_expansion(uint8_t const exp_num) { auto const exp_mech_opcua = opcua::ArduinoOptaDigitalMechExpansion::create(_server, _node_id, exp_num); _dig_mech_exp_list.push_back(exp_mech_opcua); return exp_mech_opcua; } +ArduinoOptaDigitalStSolidExpansion::SharedPtr ArduinoOpta::create_digital_solid_state_expansion(uint8_t const exp_num) +{ + auto const exp_solid_state_opcua = opcua::ArduinoOptaDigitalStSolidExpansion::create(_server, _node_id, exp_num); + _dig_solid_state_exp_list.push_back(exp_solid_state_opcua); + return exp_solid_state_opcua; +} + /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index dff4aa8..0c8bc77 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -25,6 +25,7 @@ #include "ArduinoOptaVariant.h" #include "ArduinoOptaExpansionType.h" #include "ArduinoOptaDigitalMechExpansion.h" +#include "ArduinoOptaDigitalStSolidExpansion.h" /************************************************************************************** * NAMESPACE @@ -53,8 +54,8 @@ class ArduinoOpta [[nodiscard]] UA_NodeId node_id() const { return _node_id; } - ArduinoOptaDigitalMechExpansion::SharedPtr create_digital_mech_expansion(uint8_t const exp_num); - + ArduinoOptaDigitalMechExpansion::SharedPtr create_digital_mechanical_expansion(uint8_t const exp_num); + ArduinoOptaDigitalStSolidExpansion::SharedPtr create_digital_solid_state_expansion(uint8_t const exp_num); private: UA_Server * _server; @@ -67,6 +68,7 @@ class ArduinoOpta LedManager::SharedPtr _led_mgr; std::list _dig_mech_exp_list; + std::list _dig_solid_state_exp_list; }; /************************************************************************************** diff --git a/src/ArduinoOptaDigitalMechExpansion.cpp b/src/ArduinoOptaDigitalMechExpansion.cpp index f827d0d..662522d 100644 --- a/src/ArduinoOptaDigitalMechExpansion.cpp +++ b/src/ArduinoOptaDigitalMechExpansion.cpp @@ -31,7 +31,10 @@ ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOptaDigitalMechExpansion::crea UA_StatusCode rc = UA_STATUSCODE_GOOD; char display_name[32] = {0}; - snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Mechanic)", exp_num); + snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Mechanical)", exp_num); + + char node_name[32] = {0}; + snprintf(node_name, sizeof(node_name), "DigExpMech_%d", exp_num); UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); @@ -40,7 +43,7 @@ ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOptaDigitalMechExpansion::crea UA_NODEID_NULL, parent_node_id, UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), - UA_QUALIFIEDNAME(1, "DigExpMech"), + UA_QUALIFIEDNAME(1, node_name), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, diff --git a/src/ArduinoOptaDigitalStSolidExpansion.cpp b/src/ArduinoOptaDigitalStSolidExpansion.cpp new file mode 100644 index 0000000..87e3c64 --- /dev/null +++ b/src/ArduinoOptaDigitalStSolidExpansion.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "ArduinoOptaDigitalStSolidExpansion.h" + +#include + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * PUBLIC MEMBER FUNCTIONS + **************************************************************************************/ + +ArduinoOptaDigitalStSolidExpansion::SharedPtr ArduinoOptaDigitalStSolidExpansion::create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num) +{ + UA_StatusCode rc = UA_STATUSCODE_GOOD; + + char display_name[32] = {0}; + snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Solid State)", exp_num); + + char node_name[32] = {0}; + snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); + + UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; + oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); + UA_NodeId node_id; + rc = UA_Server_addObjectNode(server, + UA_NODEID_NULL, + parent_node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), + UA_QUALIFIEDNAME(1, node_name), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), + oAttr, + NULL, + &node_id); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "ArduinoOptaDigitalStSolidExpansion::create: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); + return nullptr; + } + + auto const instance_ptr = std::make_shared(server, node_id); + return instance_ptr; +} + +/************************************************************************************** + * PUBLIC MEMBER FUNCTIONS + **************************************************************************************/ + +RelayManager::SharedPtr ArduinoOptaDigitalStSolidExpansion::relay_mgr() +{ + if (!_relay_mgr) + { + _relay_mgr = opcua::RelayManager::create(_server, _node_id); + if (!_relay_mgr) + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalStSolidExpansion::relay_mgr: RelayManager::create(...) failed."); + } + + return _relay_mgr; +} + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ diff --git a/src/ArduinoOptaDigitalStSolidExpansion.h b/src/ArduinoOptaDigitalStSolidExpansion.h new file mode 100644 index 0000000..71c29ea --- /dev/null +++ b/src/ArduinoOptaDigitalStSolidExpansion.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "open62541.h" + +#include + +#include "RelayManager.h" + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * CLASS DECLARATION + **************************************************************************************/ + +class ArduinoOptaDigitalStSolidExpansion +{ +public: + typedef std::shared_ptr SharedPtr; + + static SharedPtr create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num); + + ArduinoOptaDigitalStSolidExpansion(UA_Server * server, UA_NodeId const & node_id) + : _server{server} + , _node_id{node_id} + { } + + + RelayManager::SharedPtr relay_mgr(); + + +private: + UA_Server * _server; + UA_NodeId const _node_id; + + RelayManager::SharedPtr _relay_mgr; +}; + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ From 9078f8b6e6572024e20d2d201f8cefe9d4194464 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 24 Jul 2024 10:36:05 +0200 Subject: [PATCH 10/35] Fix: array was designed too small for holding the full expansion name. --- src/ArduinoOptaDigitalMechExpansion.cpp | 2 +- src/ArduinoOptaDigitalStSolidExpansion.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ArduinoOptaDigitalMechExpansion.cpp b/src/ArduinoOptaDigitalMechExpansion.cpp index 662522d..05d9ba4 100644 --- a/src/ArduinoOptaDigitalMechExpansion.cpp +++ b/src/ArduinoOptaDigitalMechExpansion.cpp @@ -30,7 +30,7 @@ ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOptaDigitalMechExpansion::crea { UA_StatusCode rc = UA_STATUSCODE_GOOD; - char display_name[32] = {0}; + char display_name[64] = {0}; snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Mechanical)", exp_num); char node_name[32] = {0}; diff --git a/src/ArduinoOptaDigitalStSolidExpansion.cpp b/src/ArduinoOptaDigitalStSolidExpansion.cpp index 87e3c64..246e4b0 100644 --- a/src/ArduinoOptaDigitalStSolidExpansion.cpp +++ b/src/ArduinoOptaDigitalStSolidExpansion.cpp @@ -30,7 +30,7 @@ ArduinoOptaDigitalStSolidExpansion::SharedPtr ArduinoOptaDigitalStSolidExpansion { UA_StatusCode rc = UA_STATUSCODE_GOOD; - char display_name[32] = {0}; + char display_name[64] = {0}; snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Solid State)", exp_num); char node_name[32] = {0}; From 831febc744ffed50dacaacae2175f55fe77a981a Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 12:51:03 +0200 Subject: [PATCH 11/35] Expose general purpose inputs/outputs via OPC/UA. --- examples/opcua_server/opcua_server.ino | 14 ++++++++++++++ src/ArduinoOptaDigitalMechExpansion.cpp | 12 ++++++++++++ src/ArduinoOptaDigitalMechExpansion.h | 3 +++ src/ArduinoOptaDigitalStSolidExpansion.cpp | 12 ++++++++++++ src/ArduinoOptaDigitalStSolidExpansion.h | 3 +++ 5 files changed, 44 insertions(+) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 968626f..a3b9c43 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -332,6 +332,13 @@ void setup() if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) { auto const exp_mech_opcua = arduino_opta_opcua->create_digital_mechanical_expansion(i); + /* Expose digital/analog pins via OPC/UA. */ + for (uint8_t d = 0; d < OPTA_DIGITAL_IN_NUM; d++) + { + char analog_in_name[32] = {0}; + snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input %d", d + 1); + exp_mech_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); + } /* Expose mechanical relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { @@ -343,6 +350,13 @@ void setup() else if (exp_type == EXPANSION_OPTA_DIGITAL_STS) { auto const exp_solid_state_opcua = arduino_opta_opcua->create_digital_solid_state_expansion(i); + /* Expose digital/analog pins via OPC/UA. */ + for (uint8_t d = 0; d < OPTA_DIGITAL_IN_NUM; d++) + { + char analog_in_name[32] = {0}; + snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input %d", d + 1); + exp_solid_state_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); + } /* Expose solit state relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { diff --git a/src/ArduinoOptaDigitalMechExpansion.cpp b/src/ArduinoOptaDigitalMechExpansion.cpp index 05d9ba4..1fa2b47 100644 --- a/src/ArduinoOptaDigitalMechExpansion.cpp +++ b/src/ArduinoOptaDigitalMechExpansion.cpp @@ -63,6 +63,18 @@ ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOptaDigitalMechExpansion::crea * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ +AnalogInputManager::SharedPtr ArduinoOptaDigitalMechExpansion::analog_input_mgr() +{ + if (!_analog_input_mgr) + { + _analog_input_mgr = opcua::AnalogInputManager::create(_server, _node_id); + if (!_analog_input_mgr) + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalMechExpansion::analog_input_mgr: AnalogInputManager::create(...) failed."); + } + + return _analog_input_mgr; +} + RelayManager::SharedPtr ArduinoOptaDigitalMechExpansion::relay_mgr() { if (!_relay_mgr) diff --git a/src/ArduinoOptaDigitalMechExpansion.h b/src/ArduinoOptaDigitalMechExpansion.h index 042b64b..1a22e03 100644 --- a/src/ArduinoOptaDigitalMechExpansion.h +++ b/src/ArduinoOptaDigitalMechExpansion.h @@ -18,6 +18,7 @@ #include #include "RelayManager.h" +#include "AnalogInputManager.h" /************************************************************************************** * NAMESPACE @@ -43,6 +44,7 @@ class ArduinoOptaDigitalMechExpansion { } + AnalogInputManager::SharedPtr analog_input_mgr(); RelayManager::SharedPtr relay_mgr(); @@ -50,6 +52,7 @@ class ArduinoOptaDigitalMechExpansion UA_Server * _server; UA_NodeId const _node_id; + AnalogInputManager::SharedPtr _analog_input_mgr; RelayManager::SharedPtr _relay_mgr; }; diff --git a/src/ArduinoOptaDigitalStSolidExpansion.cpp b/src/ArduinoOptaDigitalStSolidExpansion.cpp index 246e4b0..0e4e93f 100644 --- a/src/ArduinoOptaDigitalStSolidExpansion.cpp +++ b/src/ArduinoOptaDigitalStSolidExpansion.cpp @@ -63,6 +63,18 @@ ArduinoOptaDigitalStSolidExpansion::SharedPtr ArduinoOptaDigitalStSolidExpansion * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ +AnalogInputManager::SharedPtr ArduinoOptaDigitalStSolidExpansion::analog_input_mgr() +{ + if (!_analog_input_mgr) + { + _analog_input_mgr = opcua::AnalogInputManager::create(_server, _node_id); + if (!_analog_input_mgr) + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalStSolidExpansion::analog_input_mgr: AnalogInputManager::create(...) failed."); + } + + return _analog_input_mgr; +} + RelayManager::SharedPtr ArduinoOptaDigitalStSolidExpansion::relay_mgr() { if (!_relay_mgr) diff --git a/src/ArduinoOptaDigitalStSolidExpansion.h b/src/ArduinoOptaDigitalStSolidExpansion.h index 71c29ea..b7c0d72 100644 --- a/src/ArduinoOptaDigitalStSolidExpansion.h +++ b/src/ArduinoOptaDigitalStSolidExpansion.h @@ -18,6 +18,7 @@ #include #include "RelayManager.h" +#include "AnalogInputManager.h" /************************************************************************************** * NAMESPACE @@ -43,6 +44,7 @@ class ArduinoOptaDigitalStSolidExpansion { } + AnalogInputManager::SharedPtr analog_input_mgr(); RelayManager::SharedPtr relay_mgr(); @@ -50,6 +52,7 @@ class ArduinoOptaDigitalStSolidExpansion UA_Server * _server; UA_NodeId const _node_id; + AnalogInputManager::SharedPtr _analog_input_mgr; RelayManager::SharedPtr _relay_mgr; }; From d5f48a1ac7a0ecfc68531fd400f80b9b45dc37b2 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 12:54:18 +0200 Subject: [PATCH 12/35] Group functionality for analog inputs under new subfolder io/analog. --- src/ArduinoOpta.h | 4 +++- src/ArduinoOptaDigitalMechExpansion.h | 2 +- src/ArduinoOptaDigitalStSolidExpansion.h | 2 +- src/{ => io/analog}/AnalogInput.cpp | 0 src/{ => io/analog}/AnalogInput.h | 2 +- src/{ => io/analog}/AnalogInputManager.cpp | 0 src/{ => io/analog}/AnalogInputManager.h | 2 +- 7 files changed, 7 insertions(+), 5 deletions(-) rename src/{ => io/analog}/AnalogInput.cpp (100%) rename src/{ => io/analog}/AnalogInput.h (98%) rename src/{ => io/analog}/AnalogInputManager.cpp (100%) rename src/{ => io/analog}/AnalogInputManager.h (98%) diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index 0c8bc77..a2fd215 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -19,9 +19,11 @@ #include "LedManager.h" #include "RelayManager.h" -#include "AnalogInputManager.h" #include "DigitalInputManager.h" #include "UserButton.h" + +#include "io/analog/AnalogInputManager.h" + #include "ArduinoOptaVariant.h" #include "ArduinoOptaExpansionType.h" #include "ArduinoOptaDigitalMechExpansion.h" diff --git a/src/ArduinoOptaDigitalMechExpansion.h b/src/ArduinoOptaDigitalMechExpansion.h index 1a22e03..43b073d 100644 --- a/src/ArduinoOptaDigitalMechExpansion.h +++ b/src/ArduinoOptaDigitalMechExpansion.h @@ -18,7 +18,7 @@ #include #include "RelayManager.h" -#include "AnalogInputManager.h" +#include "io/analog/AnalogInputManager.h" /************************************************************************************** * NAMESPACE diff --git a/src/ArduinoOptaDigitalStSolidExpansion.h b/src/ArduinoOptaDigitalStSolidExpansion.h index b7c0d72..63a9b2e 100644 --- a/src/ArduinoOptaDigitalStSolidExpansion.h +++ b/src/ArduinoOptaDigitalStSolidExpansion.h @@ -18,7 +18,7 @@ #include #include "RelayManager.h" -#include "AnalogInputManager.h" +#include "io/analog/AnalogInputManager.h" /************************************************************************************** * NAMESPACE diff --git a/src/AnalogInput.cpp b/src/io/analog/AnalogInput.cpp similarity index 100% rename from src/AnalogInput.cpp rename to src/io/analog/AnalogInput.cpp diff --git a/src/AnalogInput.h b/src/io/analog/AnalogInput.h similarity index 98% rename from src/AnalogInput.h rename to src/io/analog/AnalogInput.h index d759888..2585702 100644 --- a/src/AnalogInput.h +++ b/src/io/analog/AnalogInput.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include diff --git a/src/AnalogInputManager.cpp b/src/io/analog/AnalogInputManager.cpp similarity index 100% rename from src/AnalogInputManager.cpp rename to src/io/analog/AnalogInputManager.cpp diff --git a/src/AnalogInputManager.h b/src/io/analog/AnalogInputManager.h similarity index 98% rename from src/AnalogInputManager.h rename to src/io/analog/AnalogInputManager.h index 4d1061f..e063dc3 100644 --- a/src/AnalogInputManager.h +++ b/src/io/analog/AnalogInputManager.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include From 2a34f4464bfa95200815d37a4df642b83e996706 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 12:56:59 +0200 Subject: [PATCH 13/35] Group all relay related functionality under new sub-folder "io/relay". --- src/ArduinoOpta.h | 2 +- src/ArduinoOptaDigitalMechExpansion.h | 2 +- src/ArduinoOptaDigitalStSolidExpansion.h | 2 +- src/{ => io/relay}/Relay.cpp | 0 src/{ => io/relay}/Relay.h | 2 +- src/{ => io/relay}/RelayManager.cpp | 2 -- src/{ => io/relay}/RelayManager.h | 2 +- 7 files changed, 5 insertions(+), 7 deletions(-) rename src/{ => io/relay}/Relay.cpp (100%) rename src/{ => io/relay}/Relay.h (98%) rename src/{ => io/relay}/RelayManager.cpp (99%) rename src/{ => io/relay}/RelayManager.h (98%) diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index a2fd215..53138ed 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -18,10 +18,10 @@ #include #include "LedManager.h" -#include "RelayManager.h" #include "DigitalInputManager.h" #include "UserButton.h" +#include "io/relay/RelayManager.h" #include "io/analog/AnalogInputManager.h" #include "ArduinoOptaVariant.h" diff --git a/src/ArduinoOptaDigitalMechExpansion.h b/src/ArduinoOptaDigitalMechExpansion.h index 43b073d..cc4e83e 100644 --- a/src/ArduinoOptaDigitalMechExpansion.h +++ b/src/ArduinoOptaDigitalMechExpansion.h @@ -17,7 +17,7 @@ #include -#include "RelayManager.h" +#include "io/relay/RelayManager.h" #include "io/analog/AnalogInputManager.h" /************************************************************************************** diff --git a/src/ArduinoOptaDigitalStSolidExpansion.h b/src/ArduinoOptaDigitalStSolidExpansion.h index 63a9b2e..917ade3 100644 --- a/src/ArduinoOptaDigitalStSolidExpansion.h +++ b/src/ArduinoOptaDigitalStSolidExpansion.h @@ -17,7 +17,7 @@ #include -#include "RelayManager.h" +#include "io/relay/RelayManager.h" #include "io/analog/AnalogInputManager.h" /************************************************************************************** diff --git a/src/Relay.cpp b/src/io/relay/Relay.cpp similarity index 100% rename from src/Relay.cpp rename to src/io/relay/Relay.cpp diff --git a/src/Relay.h b/src/io/relay/Relay.h similarity index 98% rename from src/Relay.h rename to src/io/relay/Relay.h index 2e27176..837a870 100644 --- a/src/Relay.h +++ b/src/io/relay/Relay.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include diff --git a/src/RelayManager.cpp b/src/io/relay/RelayManager.cpp similarity index 99% rename from src/RelayManager.cpp rename to src/io/relay/RelayManager.cpp index 1dd070e..a1d1d95 100644 --- a/src/RelayManager.cpp +++ b/src/io/relay/RelayManager.cpp @@ -13,8 +13,6 @@ #include "RelayManager.h" -#include - /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/RelayManager.h b/src/io/relay/RelayManager.h similarity index 98% rename from src/RelayManager.h rename to src/io/relay/RelayManager.h index f8851bd..e54e557 100644 --- a/src/RelayManager.h +++ b/src/io/relay/RelayManager.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include From 6e917f8a983563f04189313d57b4db6173bf9593 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 12:59:52 +0200 Subject: [PATCH 14/35] Group all LED related functionality under sub-folder "io/led". --- src/ArduinoOpta.h | 2 +- src/{ => io/led}/Led.cpp | 0 src/{ => io/led}/Led.h | 2 +- src/{ => io/led}/LedManager.cpp | 2 -- src/{ => io/led}/LedManager.h | 2 +- 5 files changed, 3 insertions(+), 5 deletions(-) rename src/{ => io/led}/Led.cpp (100%) rename src/{ => io/led}/Led.h (98%) rename src/{ => io/led}/LedManager.cpp (99%) rename src/{ => io/led}/LedManager.h (98%) diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index 53138ed..4fa0bce 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -17,10 +17,10 @@ #include -#include "LedManager.h" #include "DigitalInputManager.h" #include "UserButton.h" +#include "io/led/LedManager.h" #include "io/relay/RelayManager.h" #include "io/analog/AnalogInputManager.h" diff --git a/src/Led.cpp b/src/io/led/Led.cpp similarity index 100% rename from src/Led.cpp rename to src/io/led/Led.cpp diff --git a/src/Led.h b/src/io/led/Led.h similarity index 98% rename from src/Led.h rename to src/io/led/Led.h index f0b4185..86c87d8 100644 --- a/src/Led.h +++ b/src/io/led/Led.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include diff --git a/src/LedManager.cpp b/src/io/led/LedManager.cpp similarity index 99% rename from src/LedManager.cpp rename to src/io/led/LedManager.cpp index 75e336f..e9a5009 100644 --- a/src/LedManager.cpp +++ b/src/io/led/LedManager.cpp @@ -13,8 +13,6 @@ #include "LedManager.h" -#include - /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/LedManager.h b/src/io/led/LedManager.h similarity index 98% rename from src/LedManager.h rename to src/io/led/LedManager.h index 50b073b..3be94c3 100644 --- a/src/LedManager.h +++ b/src/io/led/LedManager.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include From 6537421d0a8593ff2310d1d8e94f7ec0ca718052 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:03:55 +0200 Subject: [PATCH 15/35] Group digital input related code under new sub-folder "io/digital". --- src/ArduinoOpta.h | 2 +- src/{ => io/digital}/DigitalInput.cpp | 0 src/{ => io/digital}/DigitalInput.h | 2 +- src/{ => io/digital}/DigitalInputManager.cpp | 0 src/{ => io/digital}/DigitalInputManager.h | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename src/{ => io/digital}/DigitalInput.cpp (100%) rename src/{ => io/digital}/DigitalInput.h (98%) rename src/{ => io/digital}/DigitalInputManager.cpp (100%) rename src/{ => io/digital}/DigitalInputManager.h (98%) diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index 4fa0bce..6bbf6d7 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -17,12 +17,12 @@ #include -#include "DigitalInputManager.h" #include "UserButton.h" #include "io/led/LedManager.h" #include "io/relay/RelayManager.h" #include "io/analog/AnalogInputManager.h" +#include "io/digital/DigitalInputManager.h" #include "ArduinoOptaVariant.h" #include "ArduinoOptaExpansionType.h" diff --git a/src/DigitalInput.cpp b/src/io/digital/DigitalInput.cpp similarity index 100% rename from src/DigitalInput.cpp rename to src/io/digital/DigitalInput.cpp diff --git a/src/DigitalInput.h b/src/io/digital/DigitalInput.h similarity index 98% rename from src/DigitalInput.h rename to src/io/digital/DigitalInput.h index 3d13dde..2b52d14 100644 --- a/src/DigitalInput.h +++ b/src/io/digital/DigitalInput.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include diff --git a/src/DigitalInputManager.cpp b/src/io/digital/DigitalInputManager.cpp similarity index 100% rename from src/DigitalInputManager.cpp rename to src/io/digital/DigitalInputManager.cpp diff --git a/src/DigitalInputManager.h b/src/io/digital/DigitalInputManager.h similarity index 98% rename from src/DigitalInputManager.h rename to src/io/digital/DigitalInputManager.h index 97c4736..a128d08 100644 --- a/src/DigitalInputManager.h +++ b/src/io/digital/DigitalInputManager.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include #include From 35b53f83dbb4b0dc8c78def649a65ed6f146d531 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:08:54 +0200 Subject: [PATCH 16/35] Move button related functionality under "io/button". --- src/ArduinoOpta.h | 3 +-- src/{ => io/button}/UserButton.cpp | 0 src/{ => io/button}/UserButton.h | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) rename src/{ => io/button}/UserButton.cpp (100%) rename src/{ => io/button}/UserButton.h (98%) diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index 6bbf6d7..21306f3 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -17,9 +17,8 @@ #include -#include "UserButton.h" - #include "io/led/LedManager.h" +#include "io/button/UserButton.h" #include "io/relay/RelayManager.h" #include "io/analog/AnalogInputManager.h" #include "io/digital/DigitalInputManager.h" diff --git a/src/UserButton.cpp b/src/io/button/UserButton.cpp similarity index 100% rename from src/UserButton.cpp rename to src/io/button/UserButton.cpp diff --git a/src/UserButton.h b/src/io/button/UserButton.h similarity index 98% rename from src/UserButton.h rename to src/io/button/UserButton.h index 7eedb70..c0173b4 100644 --- a/src/UserButton.h +++ b/src/io/button/UserButton.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../../open62541.h" #include From e4a7bb8a6b7d0d2e51ae76103a044bb135d0b70c Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:11:17 +0200 Subject: [PATCH 17/35] Move time related utility functions under "util\time". --- src/Arduino_open62541.h | 4 ++-- src/{ => util/time}/NTPUtils.cpp | 1 - src/{ => util/time}/NTPUtils.h | 0 src/{ => util/time}/cvt_time.cpp | 0 src/{ => util/time}/cvt_time.h | 0 5 files changed, 2 insertions(+), 3 deletions(-) rename src/{ => util/time}/NTPUtils.cpp (99%) rename src/{ => util/time}/NTPUtils.h (100%) rename src/{ => util/time}/cvt_time.cpp (100%) rename src/{ => util/time}/cvt_time.h (100%) diff --git a/src/Arduino_open62541.h b/src/Arduino_open62541.h index 68fe6a4..447733f 100644 --- a/src/Arduino_open62541.h +++ b/src/Arduino_open62541.h @@ -15,8 +15,8 @@ #include "open62541.h" #include "o1heap/o1heap.h" -#include "NTPUtils.h" -#include "cvt_time.h" +#include "util/time/cvt_time.h" +#include "util/time/NTPUtils.h" #include "ArduinoOpta.h" #include "ArduinoOptaVariant.h" diff --git a/src/NTPUtils.cpp b/src/util/time/NTPUtils.cpp similarity index 99% rename from src/NTPUtils.cpp rename to src/util/time/NTPUtils.cpp index 5aac874..b70a485 100644 --- a/src/NTPUtils.cpp +++ b/src/util/time/NTPUtils.cpp @@ -13,7 +13,6 @@ #include "NTPUtils.h" - /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/NTPUtils.h b/src/util/time/NTPUtils.h similarity index 100% rename from src/NTPUtils.h rename to src/util/time/NTPUtils.h diff --git a/src/cvt_time.cpp b/src/util/time/cvt_time.cpp similarity index 100% rename from src/cvt_time.cpp rename to src/util/time/cvt_time.cpp diff --git a/src/cvt_time.h b/src/util/time/cvt_time.h similarity index 100% rename from src/cvt_time.h rename to src/util/time/cvt_time.h From a150e97e139c7987d6d74f609c4905492d53a9da Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:14:18 +0200 Subject: [PATCH 18/35] Move o1heap into subfolder "util". --- src/Arduino_open62541.h | 2 +- src/arch/posix/eventloop_mbed.cpp | 2 +- src/{ => util}/o1heap/o1heap.c | 0 src/{ => util}/o1heap/o1heap.h | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename src/{ => util}/o1heap/o1heap.c (100%) rename src/{ => util}/o1heap/o1heap.h (100%) diff --git a/src/Arduino_open62541.h b/src/Arduino_open62541.h index 447733f..6e691a5 100644 --- a/src/Arduino_open62541.h +++ b/src/Arduino_open62541.h @@ -14,7 +14,7 @@ **************************************************************************************/ #include "open62541.h" -#include "o1heap/o1heap.h" +#include "util/o1heap/o1heap.h" #include "util/time/cvt_time.h" #include "util/time/NTPUtils.h" diff --git a/src/arch/posix/eventloop_mbed.cpp b/src/arch/posix/eventloop_mbed.cpp index 4e5e57e..ef15dbd 100644 --- a/src/arch/posix/eventloop_mbed.cpp +++ b/src/arch/posix/eventloop_mbed.cpp @@ -85,7 +85,7 @@ UA_EventLoopPOSIX_deregisterFD(UA_EventLoopPOSIX *el, UA_RegisteredFD *rfd) { } rtos::EventFlags _events; -#include "../../o1heap/o1heap.h" +#include "../../util/o1heap/o1heap.h" UA_StatusCode UA_EventLoopPOSIX_pollFDs(UA_EventLoopPOSIX *el, UA_DateTime listenTimeout) { diff --git a/src/o1heap/o1heap.c b/src/util/o1heap/o1heap.c similarity index 100% rename from src/o1heap/o1heap.c rename to src/util/o1heap/o1heap.c diff --git a/src/o1heap/o1heap.h b/src/util/o1heap/o1heap.h similarity index 100% rename from src/o1heap/o1heap.h rename to src/util/o1heap/o1heap.h From 2aa7700c1f1eca49fd2c40b0bc2387d86a14e4fa Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:19:07 +0200 Subject: [PATCH 19/35] Move all open62541 support code into subfolder open62541. --- src/{ => open62541}/arch/common/ua_timer.c | 0 src/{ => open62541}/arch/common/ua_timer.h | 2 +- src/{ => open62541}/arch/eventloop_common.c | 0 src/{ => open62541}/arch/eventloop_common.h | 2 +- src/{ => open62541}/arch/eventloop_posix.cpp | 0 src/{ => open62541}/arch/eventloop_posix.h | 2 +- src/{ => open62541}/arch/eventloop_posix_tcp.cpp | 2 +- src/{ => open62541}/arch/posix/eventloop_mbed.cpp | 2 +- src/{ => open62541}/arch/posix/mbed_tcp.cpp | 0 src/{ => open62541}/arch/posix/mbed_tcp.h | 0 src/{ => open62541}/arch/posix/ua_architecture.h | 2 +- src/{ => open62541}/arch/posix/ua_clock.cpp | 2 +- src/{ => open62541}/deps/mp_printf.h | 0 src/{ => open62541}/deps/open62541_queue.h | 0 src/{ => open62541}/deps/ziptree.h | 0 15 files changed, 7 insertions(+), 7 deletions(-) rename src/{ => open62541}/arch/common/ua_timer.c (100%) rename src/{ => open62541}/arch/common/ua_timer.h (99%) rename src/{ => open62541}/arch/eventloop_common.c (100%) rename src/{ => open62541}/arch/eventloop_common.h (97%) rename src/{ => open62541}/arch/eventloop_posix.cpp (100%) rename src/{ => open62541}/arch/eventloop_posix.h (99%) rename src/{ => open62541}/arch/eventloop_posix_tcp.cpp (99%) rename src/{ => open62541}/arch/posix/eventloop_mbed.cpp (99%) rename src/{ => open62541}/arch/posix/mbed_tcp.cpp (100%) rename src/{ => open62541}/arch/posix/mbed_tcp.h (100%) rename src/{ => open62541}/arch/posix/ua_architecture.h (98%) rename src/{ => open62541}/arch/posix/ua_clock.cpp (97%) rename src/{ => open62541}/deps/mp_printf.h (100%) rename src/{ => open62541}/deps/open62541_queue.h (100%) rename src/{ => open62541}/deps/ziptree.h (100%) diff --git a/src/arch/common/ua_timer.c b/src/open62541/arch/common/ua_timer.c similarity index 100% rename from src/arch/common/ua_timer.c rename to src/open62541/arch/common/ua_timer.c diff --git a/src/arch/common/ua_timer.h b/src/open62541/arch/common/ua_timer.h similarity index 99% rename from src/arch/common/ua_timer.h rename to src/open62541/arch/common/ua_timer.h index 2ef6b49..f8af1d1 100644 --- a/src/arch/common/ua_timer.h +++ b/src/open62541/arch/common/ua_timer.h @@ -9,7 +9,7 @@ #ifndef UA_TIMER_H_ #define UA_TIMER_H_ -#include "../../open62541.h" +#include "../../../open62541.h" #include "../../deps/ziptree.h" diff --git a/src/arch/eventloop_common.c b/src/open62541/arch/eventloop_common.c similarity index 100% rename from src/arch/eventloop_common.c rename to src/open62541/arch/eventloop_common.c diff --git a/src/arch/eventloop_common.h b/src/open62541/arch/eventloop_common.h similarity index 97% rename from src/arch/eventloop_common.h rename to src/open62541/arch/eventloop_common.h index a55d284..a0c161c 100644 --- a/src/arch/eventloop_common.h +++ b/src/open62541/arch/eventloop_common.h @@ -9,7 +9,7 @@ #ifndef UA_EVENTLOOP_COMMON_H_ #define UA_EVENTLOOP_COMMON_H_ -#include "../open62541.h" +#include "../../open62541.h" /* Utility definitions to be used in EventLoop implementations. * Not part of the public API. */ diff --git a/src/arch/eventloop_posix.cpp b/src/open62541/arch/eventloop_posix.cpp similarity index 100% rename from src/arch/eventloop_posix.cpp rename to src/open62541/arch/eventloop_posix.cpp diff --git a/src/arch/eventloop_posix.h b/src/open62541/arch/eventloop_posix.h similarity index 99% rename from src/arch/eventloop_posix.h rename to src/open62541/arch/eventloop_posix.h index bbb8ea7..4021fb0 100644 --- a/src/arch/eventloop_posix.h +++ b/src/open62541/arch/eventloop_posix.h @@ -9,7 +9,7 @@ #ifndef UA_EVENTLOOP_POSIX_H_ #define UA_EVENTLOOP_POSIX_H_ -#include "../open62541.h" +#include "../../open62541.h" #if defined(UA_ARCHITECTURE_POSIX) || defined(UA_ARCHITECTURE_WIN32) diff --git a/src/arch/eventloop_posix_tcp.cpp b/src/open62541/arch/eventloop_posix_tcp.cpp similarity index 99% rename from src/arch/eventloop_posix_tcp.cpp rename to src/open62541/arch/eventloop_posix_tcp.cpp index 2834d1a..46fa576 100644 --- a/src/arch/eventloop_posix_tcp.cpp +++ b/src/open62541/arch/eventloop_posix_tcp.cpp @@ -6,7 +6,7 @@ * Copyright 2021 (c) Fraunhofer IOSB (Author: Jan Hermes) */ -#include "../open62541.h" +#include "../../open62541.h" #include "eventloop_posix.h" #include "eventloop_common.h" diff --git a/src/arch/posix/eventloop_mbed.cpp b/src/open62541/arch/posix/eventloop_mbed.cpp similarity index 99% rename from src/arch/posix/eventloop_mbed.cpp rename to src/open62541/arch/posix/eventloop_mbed.cpp index ef15dbd..b8c01de 100644 --- a/src/arch/posix/eventloop_mbed.cpp +++ b/src/open62541/arch/posix/eventloop_mbed.cpp @@ -85,7 +85,7 @@ UA_EventLoopPOSIX_deregisterFD(UA_EventLoopPOSIX *el, UA_RegisteredFD *rfd) { } rtos::EventFlags _events; -#include "../../util/o1heap/o1heap.h" +#include "../../../util/o1heap/o1heap.h" UA_StatusCode UA_EventLoopPOSIX_pollFDs(UA_EventLoopPOSIX *el, UA_DateTime listenTimeout) { diff --git a/src/arch/posix/mbed_tcp.cpp b/src/open62541/arch/posix/mbed_tcp.cpp similarity index 100% rename from src/arch/posix/mbed_tcp.cpp rename to src/open62541/arch/posix/mbed_tcp.cpp diff --git a/src/arch/posix/mbed_tcp.h b/src/open62541/arch/posix/mbed_tcp.h similarity index 100% rename from src/arch/posix/mbed_tcp.h rename to src/open62541/arch/posix/mbed_tcp.h diff --git a/src/arch/posix/ua_architecture.h b/src/open62541/arch/posix/ua_architecture.h similarity index 98% rename from src/arch/posix/ua_architecture.h rename to src/open62541/arch/posix/ua_architecture.h index adab2f9..f8f15da 100644 --- a/src/arch/posix/ua_architecture.h +++ b/src/open62541/arch/posix/ua_architecture.h @@ -8,7 +8,7 @@ #ifndef PLUGINS_ARCH_POSIX_UA_ARCHITECTURE_H_ #define PLUGINS_ARCH_POSIX_UA_ARCHITECTURE_H_ -#include "../../open62541.h" +#include "../../../open62541.h" #ifdef UA_ARCHITECTURE_POSIX diff --git a/src/arch/posix/ua_clock.cpp b/src/open62541/arch/posix/ua_clock.cpp similarity index 97% rename from src/arch/posix/ua_clock.cpp rename to src/open62541/arch/posix/ua_clock.cpp index 5bdbbfb..1d1bb2c 100644 --- a/src/arch/posix/ua_clock.cpp +++ b/src/open62541/arch/posix/ua_clock.cpp @@ -6,7 +6,7 @@ * Copyright 2017 (c) Thomas Stalder, Blue Time Concept SA */ -#include "../../open62541.h" +#include "../../../open62541.h" #include diff --git a/src/deps/mp_printf.h b/src/open62541/deps/mp_printf.h similarity index 100% rename from src/deps/mp_printf.h rename to src/open62541/deps/mp_printf.h diff --git a/src/deps/open62541_queue.h b/src/open62541/deps/open62541_queue.h similarity index 100% rename from src/deps/open62541_queue.h rename to src/open62541/deps/open62541_queue.h diff --git a/src/deps/ziptree.h b/src/open62541/deps/ziptree.h similarity index 100% rename from src/deps/ziptree.h rename to src/open62541/deps/ziptree.h From 9212c9e0d86931b284e9cf00224fcbb78c422b3c Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:22:07 +0200 Subject: [PATCH 20/35] Move expansion related code under sub-folder "expansion". --- src/ArduinoOpta.h | 6 +++--- src/{ => expansion}/ArduinoOptaDigitalMechExpansion.cpp | 0 src/{ => expansion}/ArduinoOptaDigitalMechExpansion.h | 6 +++--- src/{ => expansion}/ArduinoOptaDigitalStSolidExpansion.cpp | 0 src/{ => expansion}/ArduinoOptaDigitalStSolidExpansion.h | 6 +++--- src/{ => expansion}/ArduinoOptaExpansionType.h | 0 6 files changed, 9 insertions(+), 9 deletions(-) rename src/{ => expansion}/ArduinoOptaDigitalMechExpansion.cpp (100%) rename src/{ => expansion}/ArduinoOptaDigitalMechExpansion.h (94%) rename src/{ => expansion}/ArduinoOptaDigitalStSolidExpansion.cpp (100%) rename src/{ => expansion}/ArduinoOptaDigitalStSolidExpansion.h (94%) rename src/{ => expansion}/ArduinoOptaExpansionType.h (100%) diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index 21306f3..f68b54d 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -24,9 +24,9 @@ #include "io/digital/DigitalInputManager.h" #include "ArduinoOptaVariant.h" -#include "ArduinoOptaExpansionType.h" -#include "ArduinoOptaDigitalMechExpansion.h" -#include "ArduinoOptaDigitalStSolidExpansion.h" +#include "expansion/ArduinoOptaExpansionType.h" +#include "expansion/ArduinoOptaDigitalMechExpansion.h" +#include "expansion/ArduinoOptaDigitalStSolidExpansion.h" /************************************************************************************** * NAMESPACE diff --git a/src/ArduinoOptaDigitalMechExpansion.cpp b/src/expansion/ArduinoOptaDigitalMechExpansion.cpp similarity index 100% rename from src/ArduinoOptaDigitalMechExpansion.cpp rename to src/expansion/ArduinoOptaDigitalMechExpansion.cpp diff --git a/src/ArduinoOptaDigitalMechExpansion.h b/src/expansion/ArduinoOptaDigitalMechExpansion.h similarity index 94% rename from src/ArduinoOptaDigitalMechExpansion.h rename to src/expansion/ArduinoOptaDigitalMechExpansion.h index cc4e83e..b78d06a 100644 --- a/src/ArduinoOptaDigitalMechExpansion.h +++ b/src/expansion/ArduinoOptaDigitalMechExpansion.h @@ -13,12 +13,12 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../open62541.h" #include -#include "io/relay/RelayManager.h" -#include "io/analog/AnalogInputManager.h" +#include "../io/relay/RelayManager.h" +#include "../io/analog/AnalogInputManager.h" /************************************************************************************** * NAMESPACE diff --git a/src/ArduinoOptaDigitalStSolidExpansion.cpp b/src/expansion/ArduinoOptaDigitalStSolidExpansion.cpp similarity index 100% rename from src/ArduinoOptaDigitalStSolidExpansion.cpp rename to src/expansion/ArduinoOptaDigitalStSolidExpansion.cpp diff --git a/src/ArduinoOptaDigitalStSolidExpansion.h b/src/expansion/ArduinoOptaDigitalStSolidExpansion.h similarity index 94% rename from src/ArduinoOptaDigitalStSolidExpansion.h rename to src/expansion/ArduinoOptaDigitalStSolidExpansion.h index 917ade3..2fca4c6 100644 --- a/src/ArduinoOptaDigitalStSolidExpansion.h +++ b/src/expansion/ArduinoOptaDigitalStSolidExpansion.h @@ -13,12 +13,12 @@ * INCLUDE **************************************************************************************/ -#include "open62541.h" +#include "../open62541.h" #include -#include "io/relay/RelayManager.h" -#include "io/analog/AnalogInputManager.h" +#include "../io/relay/RelayManager.h" +#include "../io/analog/AnalogInputManager.h" /************************************************************************************** * NAMESPACE diff --git a/src/ArduinoOptaExpansionType.h b/src/expansion/ArduinoOptaExpansionType.h similarity index 100% rename from src/ArduinoOptaExpansionType.h rename to src/expansion/ArduinoOptaExpansionType.h From be4aaf80c0bdb7ca9daf3c500617099552befd5c Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:42:07 +0200 Subject: [PATCH 21/35] Considerably clean up digital expansion code by moving common code to base class. --- src/ArduinoOpta.cpp | 8 +- src/ArduinoOpta.h | 12 +-- .../ArduinoOptaDigitalStSolidExpansion.cpp | 94 ------------------- ...MechExpansion.cpp => DigitalExpansion.cpp} | 29 +++--- ...italMechExpansion.h => DigitalExpansion.h} | 15 ++- ...olidExpansion.h => DigitalMechExpansion.h} | 39 ++++---- src/expansion/DigitalStSolidExpansion.h | 60 ++++++++++++ 7 files changed, 107 insertions(+), 150 deletions(-) delete mode 100644 src/expansion/ArduinoOptaDigitalStSolidExpansion.cpp rename src/expansion/{ArduinoOptaDigitalMechExpansion.cpp => DigitalExpansion.cpp} (67%) rename src/expansion/{ArduinoOptaDigitalMechExpansion.h => DigitalExpansion.h} (79%) rename src/expansion/{ArduinoOptaDigitalStSolidExpansion.h => DigitalMechExpansion.h} (55%) create mode 100644 src/expansion/DigitalStSolidExpansion.h diff --git a/src/ArduinoOpta.cpp b/src/ArduinoOpta.cpp index 67a58df..7771f99 100644 --- a/src/ArduinoOpta.cpp +++ b/src/ArduinoOpta.cpp @@ -180,16 +180,16 @@ LedManager::SharedPtr ArduinoOpta::led_mgr() return _led_mgr; } -ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOpta::create_digital_mechanical_expansion(uint8_t const exp_num) +DigitalMechExpansion::SharedPtr ArduinoOpta::create_digital_mechanical_expansion(uint8_t const exp_num) { - auto const exp_mech_opcua = opcua::ArduinoOptaDigitalMechExpansion::create(_server, _node_id, exp_num); + auto const exp_mech_opcua = opcua::DigitalMechExpansion::create(_server, _node_id, exp_num); _dig_mech_exp_list.push_back(exp_mech_opcua); return exp_mech_opcua; } -ArduinoOptaDigitalStSolidExpansion::SharedPtr ArduinoOpta::create_digital_solid_state_expansion(uint8_t const exp_num) +DigitalStSolidExpansion::SharedPtr ArduinoOpta::create_digital_solid_state_expansion(uint8_t const exp_num) { - auto const exp_solid_state_opcua = opcua::ArduinoOptaDigitalStSolidExpansion::create(_server, _node_id, exp_num); + auto const exp_solid_state_opcua = opcua::DigitalStSolidExpansion::create(_server, _node_id, exp_num); _dig_solid_state_exp_list.push_back(exp_solid_state_opcua); return exp_solid_state_opcua; } diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index f68b54d..4e4d613 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -24,9 +24,9 @@ #include "io/digital/DigitalInputManager.h" #include "ArduinoOptaVariant.h" +#include "expansion/DigitalMechExpansion.h" +#include "expansion/DigitalStSolidExpansion.h" #include "expansion/ArduinoOptaExpansionType.h" -#include "expansion/ArduinoOptaDigitalMechExpansion.h" -#include "expansion/ArduinoOptaDigitalStSolidExpansion.h" /************************************************************************************** * NAMESPACE @@ -55,8 +55,8 @@ class ArduinoOpta [[nodiscard]] UA_NodeId node_id() const { return _node_id; } - ArduinoOptaDigitalMechExpansion::SharedPtr create_digital_mechanical_expansion(uint8_t const exp_num); - ArduinoOptaDigitalStSolidExpansion::SharedPtr create_digital_solid_state_expansion(uint8_t const exp_num); + DigitalMechExpansion::SharedPtr create_digital_mechanical_expansion(uint8_t const exp_num); + DigitalStSolidExpansion::SharedPtr create_digital_solid_state_expansion(uint8_t const exp_num); private: UA_Server * _server; @@ -68,8 +68,8 @@ class ArduinoOpta RelayManager::SharedPtr _relay_mgr; LedManager::SharedPtr _led_mgr; - std::list _dig_mech_exp_list; - std::list _dig_solid_state_exp_list; + std::list _dig_mech_exp_list; + std::list _dig_solid_state_exp_list; }; /************************************************************************************** diff --git a/src/expansion/ArduinoOptaDigitalStSolidExpansion.cpp b/src/expansion/ArduinoOptaDigitalStSolidExpansion.cpp deleted file mode 100644 index 0e4e93f..0000000 --- a/src/expansion/ArduinoOptaDigitalStSolidExpansion.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2024 Arduino - * - * SPDX-License-Identifier: MPL-2.0 - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -/************************************************************************************** - * INCLUDE - **************************************************************************************/ - -#include "ArduinoOptaDigitalStSolidExpansion.h" - -#include - -/************************************************************************************** - * NAMESPACE - **************************************************************************************/ - -namespace opcua -{ - -/************************************************************************************** - * PUBLIC MEMBER FUNCTIONS - **************************************************************************************/ - -ArduinoOptaDigitalStSolidExpansion::SharedPtr ArduinoOptaDigitalStSolidExpansion::create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num) -{ - UA_StatusCode rc = UA_STATUSCODE_GOOD; - - char display_name[64] = {0}; - snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Solid State)", exp_num); - - char node_name[32] = {0}; - snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); - - UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; - oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); - UA_NodeId node_id; - rc = UA_Server_addObjectNode(server, - UA_NODEID_NULL, - parent_node_id, - UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), - UA_QUALIFIEDNAME(1, node_name), - UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), - oAttr, - NULL, - &node_id); - if (UA_StatusCode_isBad(rc)) - { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "ArduinoOptaDigitalStSolidExpansion::create: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); - return nullptr; - } - - auto const instance_ptr = std::make_shared(server, node_id); - return instance_ptr; -} - -/************************************************************************************** - * PUBLIC MEMBER FUNCTIONS - **************************************************************************************/ - -AnalogInputManager::SharedPtr ArduinoOptaDigitalStSolidExpansion::analog_input_mgr() -{ - if (!_analog_input_mgr) - { - _analog_input_mgr = opcua::AnalogInputManager::create(_server, _node_id); - if (!_analog_input_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalStSolidExpansion::analog_input_mgr: AnalogInputManager::create(...) failed."); - } - - return _analog_input_mgr; -} - -RelayManager::SharedPtr ArduinoOptaDigitalStSolidExpansion::relay_mgr() -{ - if (!_relay_mgr) - { - _relay_mgr = opcua::RelayManager::create(_server, _node_id); - if (!_relay_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalStSolidExpansion::relay_mgr: RelayManager::create(...) failed."); - } - - return _relay_mgr; -} - -/************************************************************************************** - * NAMESPACE - **************************************************************************************/ - -} /* opcua */ diff --git a/src/expansion/ArduinoOptaDigitalMechExpansion.cpp b/src/expansion/DigitalExpansion.cpp similarity index 67% rename from src/expansion/ArduinoOptaDigitalMechExpansion.cpp rename to src/expansion/DigitalExpansion.cpp index 1fa2b47..a7b2991 100644 --- a/src/expansion/ArduinoOptaDigitalMechExpansion.cpp +++ b/src/expansion/DigitalExpansion.cpp @@ -11,7 +11,7 @@ * INCLUDE **************************************************************************************/ -#include "ArduinoOptaDigitalMechExpansion.h" +#include "DigitalExpansion.h" #include @@ -26,16 +26,14 @@ namespace opcua * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ -ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOptaDigitalMechExpansion::create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num) +DigitalExpansion::DigitalExpansion(UA_Server * server, + UA_NodeId const parent_node_id, + char * display_name, + char * node_name) +: _server{server} { UA_StatusCode rc = UA_STATUSCODE_GOOD; - char display_name[64] = {0}; - snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Mechanical)", exp_num); - - char node_name[32] = {0}; - snprintf(node_name, sizeof(node_name), "DigExpMech_%d", exp_num); - UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); UA_NodeId node_id; @@ -48,40 +46,37 @@ ArduinoOptaDigitalMechExpansion::SharedPtr ArduinoOptaDigitalMechExpansion::crea oAttr, NULL, &node_id); + if (UA_StatusCode_isBad(rc)) { UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "ArduinoOptaDigitalMechExpansion::create: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); - return nullptr; + "DigitalExpansion::Ctor: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); } - - auto const instance_ptr = std::make_shared(server, node_id); - return instance_ptr; } /************************************************************************************** * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ -AnalogInputManager::SharedPtr ArduinoOptaDigitalMechExpansion::analog_input_mgr() +AnalogInputManager::SharedPtr DigitalExpansion::analog_input_mgr() { if (!_analog_input_mgr) { _analog_input_mgr = opcua::AnalogInputManager::create(_server, _node_id); if (!_analog_input_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalMechExpansion::analog_input_mgr: AnalogInputManager::create(...) failed."); + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "DigitalExpansion::analog_input_mgr: AnalogInputManager::create(...) failed."); } return _analog_input_mgr; } -RelayManager::SharedPtr ArduinoOptaDigitalMechExpansion::relay_mgr() +RelayManager::SharedPtr DigitalExpansion::relay_mgr() { if (!_relay_mgr) { _relay_mgr = opcua::RelayManager::create(_server, _node_id); if (!_relay_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOptaDigitalMechExpansion::relay_mgr: RelayManager::create(...) failed."); + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "DigitalExpansion::relay_mgr: RelayManager::create(...) failed."); } return _relay_mgr; diff --git a/src/expansion/ArduinoOptaDigitalMechExpansion.h b/src/expansion/DigitalExpansion.h similarity index 79% rename from src/expansion/ArduinoOptaDigitalMechExpansion.h rename to src/expansion/DigitalExpansion.h index b78d06a..983040d 100644 --- a/src/expansion/ArduinoOptaDigitalMechExpansion.h +++ b/src/expansion/DigitalExpansion.h @@ -31,17 +31,16 @@ namespace opcua * CLASS DECLARATION **************************************************************************************/ -class ArduinoOptaDigitalMechExpansion +class DigitalExpansion { public: - typedef std::shared_ptr SharedPtr; + typedef std::shared_ptr SharedPtr; - static SharedPtr create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num); - ArduinoOptaDigitalMechExpansion(UA_Server * server, UA_NodeId const & node_id) - : _server{server} - , _node_id{node_id} - { } + DigitalExpansion(UA_Server * server, + UA_NodeId const parent_node_id, + char * display_name, + char * node_name); AnalogInputManager::SharedPtr analog_input_mgr(); @@ -50,7 +49,7 @@ class ArduinoOptaDigitalMechExpansion private: UA_Server * _server; - UA_NodeId const _node_id; + UA_NodeId _node_id; AnalogInputManager::SharedPtr _analog_input_mgr; RelayManager::SharedPtr _relay_mgr; diff --git a/src/expansion/ArduinoOptaDigitalStSolidExpansion.h b/src/expansion/DigitalMechExpansion.h similarity index 55% rename from src/expansion/ArduinoOptaDigitalStSolidExpansion.h rename to src/expansion/DigitalMechExpansion.h index 2fca4c6..9b3d1f2 100644 --- a/src/expansion/ArduinoOptaDigitalStSolidExpansion.h +++ b/src/expansion/DigitalMechExpansion.h @@ -13,12 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "../open62541.h" - -#include - -#include "../io/relay/RelayManager.h" -#include "../io/analog/AnalogInputManager.h" +#include "DigitalExpansion.h" /************************************************************************************** * NAMESPACE @@ -31,29 +26,31 @@ namespace opcua * CLASS DECLARATION **************************************************************************************/ -class ArduinoOptaDigitalStSolidExpansion +class DigitalMechExpansion : public DigitalExpansion { public: - typedef std::shared_ptr SharedPtr; - - static SharedPtr create(UA_Server * server, UA_NodeId const parent_node_id, uint8_t const exp_num); + typedef std::shared_ptr SharedPtr; - ArduinoOptaDigitalStSolidExpansion(UA_Server * server, UA_NodeId const & node_id) - : _server{server} - , _node_id{node_id} - { } + static SharedPtr create(UA_Server *server, UA_NodeId const parent_node_id, uint8_t const exp_num) + { + char display_name[64] = {0}; + snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Mechanical)", exp_num); - AnalogInputManager::SharedPtr analog_input_mgr(); - RelayManager::SharedPtr relay_mgr(); + char node_name[32] = {0}; + snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); + auto const instance_ptr = std::make_shared(server, parent_node_id, display_name, node_name); + return instance_ptr; + } -private: - UA_Server * _server; - UA_NodeId const _node_id; - AnalogInputManager::SharedPtr _analog_input_mgr; - RelayManager::SharedPtr _relay_mgr; + DigitalMechExpansion(UA_Server * server, + UA_NodeId const parent_node_id, + char * display_name, + char * node_name) + : DigitalExpansion{server, parent_node_id, display_name, node_name} + {} }; /************************************************************************************** diff --git a/src/expansion/DigitalStSolidExpansion.h b/src/expansion/DigitalStSolidExpansion.h new file mode 100644 index 0000000..64b4bfd --- /dev/null +++ b/src/expansion/DigitalStSolidExpansion.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "DigitalExpansion.h" + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * CLASS DECLARATION + **************************************************************************************/ + +class DigitalStSolidExpansion : public DigitalExpansion +{ +public: + typedef std::shared_ptr SharedPtr; + + + static SharedPtr create(UA_Server *server, UA_NodeId const parent_node_id, uint8_t const exp_num) + { + char display_name[64] = {0}; + snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Solid State)", exp_num); + + char node_name[32] = {0}; + snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); + + auto const instance_ptr = std::make_shared(server, parent_node_id, display_name, node_name); + return instance_ptr; + } + + + DigitalStSolidExpansion(UA_Server * server, + UA_NodeId const parent_node_id, + char * display_name, + char * node_name) + : DigitalExpansion{server, parent_node_id, display_name, node_name} + {} +}; + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ From a24fc6d7d47890e5393b0288dde8366a3b545395 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Thu, 25 Jul 2024 13:52:21 +0200 Subject: [PATCH 22/35] Register digital inputs via OPC/UA. --- examples/opcua_server/opcua_server.ino | 10 +++++++++- src/expansion/DigitalExpansion.cpp | 15 +++++++++++++-- src/expansion/DigitalExpansion.h | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index a3b9c43..7d8ca17 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -90,7 +90,7 @@ static size_t const OPC_UA_SERVER_THREAD_STACK_SIZE = 16*1024UL; template struct alignas(uint32_t) OPC_UA_STACK final : public std::array {}; static OPC_UA_STACK OPC_UA_SERVER_THREAD_STACK; -static size_t const OPC_UA_SERVER_THREAD_HEAP_SIZE = 256*1024UL; +static size_t const OPC_UA_SERVER_THREAD_HEAP_SIZE = (256+128)*1024UL; template struct alignas(O1HEAP_ALIGNMENT) OPC_UA_HEAP final : public std::array {}; static OPC_UA_HEAP OPC_UA_SERVER_THREAD_HEAP; @@ -338,6 +338,10 @@ void setup() char analog_in_name[32] = {0}; snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input %d", d + 1); exp_mech_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); + + char digital_in_name[32] = {0}; + snprintf(digital_in_name, sizeof(digital_in_name), "Digital Input %d", d + 1); + exp_mech_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, digital_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); } /* Expose mechanical relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) @@ -356,6 +360,10 @@ void setup() char analog_in_name[32] = {0}; snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input %d", d + 1); exp_solid_state_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); + + char digital_in_name[32] = {0}; + snprintf(digital_in_name, sizeof(digital_in_name), "Digital Input %d", d + 1); + exp_solid_state_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, digital_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); } /* Expose solit state relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) diff --git a/src/expansion/DigitalExpansion.cpp b/src/expansion/DigitalExpansion.cpp index a7b2991..a38e1de 100644 --- a/src/expansion/DigitalExpansion.cpp +++ b/src/expansion/DigitalExpansion.cpp @@ -36,7 +36,6 @@ DigitalExpansion::DigitalExpansion(UA_Server * server, UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); - UA_NodeId node_id; rc = UA_Server_addObjectNode(server, UA_NODEID_NULL, parent_node_id, @@ -45,7 +44,7 @@ DigitalExpansion::DigitalExpansion(UA_Server * server, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, - &node_id); + &_node_id); if (UA_StatusCode_isBad(rc)) { @@ -70,6 +69,18 @@ AnalogInputManager::SharedPtr DigitalExpansion::analog_input_mgr() return _analog_input_mgr; } +DigitalInputManager::SharedPtr DigitalExpansion::digital_input_mgr() +{ + if (!_digital_input_mgr) + { + _digital_input_mgr = opcua::DigitalInputManager::create(_server, _node_id); + if (!_digital_input_mgr) + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "DigitalExpansion::digital_input_mgr: DigitalInputManager::create(...) failed."); + } + + return _digital_input_mgr; +} + RelayManager::SharedPtr DigitalExpansion::relay_mgr() { if (!_relay_mgr) diff --git a/src/expansion/DigitalExpansion.h b/src/expansion/DigitalExpansion.h index 983040d..b0a91d7 100644 --- a/src/expansion/DigitalExpansion.h +++ b/src/expansion/DigitalExpansion.h @@ -19,6 +19,7 @@ #include "../io/relay/RelayManager.h" #include "../io/analog/AnalogInputManager.h" +#include "../io/digital/DigitalInputManager.h" /************************************************************************************** * NAMESPACE @@ -44,6 +45,7 @@ class DigitalExpansion AnalogInputManager::SharedPtr analog_input_mgr(); + DigitalInputManager::SharedPtr digital_input_mgr(); RelayManager::SharedPtr relay_mgr(); @@ -52,6 +54,7 @@ class DigitalExpansion UA_NodeId _node_id; AnalogInputManager::SharedPtr _analog_input_mgr; + DigitalInputManager::SharedPtr _digital_input_mgr; RelayManager::SharedPtr _relay_mgr; }; From 4d004028fe1861a866918a648005a4f01eabf2f8 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 05:32:25 +0200 Subject: [PATCH 23/35] Unify code that's shared between mechamical and solid state expansion board. --- examples/opcua_server/opcua_server.ino | 38 ++++++++------------------ 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 7d8ca17..a544e09 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -329,48 +329,32 @@ void setup() for(uint8_t i = 0; i < opta_expansion_num; i++) { ExpansionType_t const exp_type = OptaController.getExpansionType(i); - if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) + + if (exp_type == EXPANSION_OPTA_DIGITAL_MEC || exp_type == EXPANSION_OPTA_DIGITAL_STS) { - auto const exp_mech_opcua = arduino_opta_opcua->create_digital_mechanical_expansion(i); + opcua::DigitalExpansion::SharedPtr exp_dig = nullptr; + if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) + exp_dig = arduino_opta_opcua->create_digital_mechanical_expansion(i); + else + exp_dig = arduino_opta_opcua->create_digital_solid_state_expansion(i); + /* Expose digital/analog pins via OPC/UA. */ for (uint8_t d = 0; d < OPTA_DIGITAL_IN_NUM; d++) { char analog_in_name[32] = {0}; snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input %d", d + 1); - exp_mech_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); + exp_dig->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); char digital_in_name[32] = {0}; snprintf(digital_in_name, sizeof(digital_in_name), "Digital Input %d", d + 1); - exp_mech_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, digital_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); + exp_dig->digital_input_mgr()->add_digital_input(opc_ua_server, digital_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); } /* Expose mechanical relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { char mech_relay_name[32] = {0}; snprintf(mech_relay_name, sizeof(mech_relay_name), "Relay %d", r + 1); - exp_mech_opcua->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); - } - } - else if (exp_type == EXPANSION_OPTA_DIGITAL_STS) - { - auto const exp_solid_state_opcua = arduino_opta_opcua->create_digital_solid_state_expansion(i); - /* Expose digital/analog pins via OPC/UA. */ - for (uint8_t d = 0; d < OPTA_DIGITAL_IN_NUM; d++) - { - char analog_in_name[32] = {0}; - snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input %d", d + 1); - exp_solid_state_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); - - char digital_in_name[32] = {0}; - snprintf(digital_in_name, sizeof(digital_in_name), "Digital Input %d", d + 1); - exp_solid_state_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, digital_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); - } - /* Expose solit state relays via OPC/UA. */ - for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) - { - char solid_state_relay_name[32] = {0}; - snprintf(solid_state_relay_name, sizeof(solid_state_relay_name), "Relay %d", r + 1); - exp_solid_state_opcua->relay_mgr()->add_relay_output(opc_ua_server, solid_state_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); + exp_dig->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } } From 83557116a3cc93d80afeec56c91a441989813ae8 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 05:37:14 +0200 Subject: [PATCH 24/35] Prefix inputs with "I" where applicable, to match markings on the case of the various Opta IOs. --- examples/opcua_server/opcua_server.ino | 38 +++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index a544e09..4232b34 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -288,24 +288,24 @@ void setup() } /* Add the various digital input pins. */ - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 1", []() { return arduino_opta_analog_read(A0); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 2", []() { return arduino_opta_analog_read(A1); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 3", []() { return arduino_opta_analog_read(A2); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 4", []() { return arduino_opta_analog_read(A3); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 5", []() { return arduino_opta_analog_read(A4); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 6", []() { return arduino_opta_analog_read(A5); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 7", []() { return arduino_opta_analog_read(A6); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input 8", []() { return arduino_opta_analog_read(A7); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I1", []() { return arduino_opta_analog_read(A0); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I2", []() { return arduino_opta_analog_read(A1); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I3", []() { return arduino_opta_analog_read(A2); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I4", []() { return arduino_opta_analog_read(A3); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I5", []() { return arduino_opta_analog_read(A4); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I6", []() { return arduino_opta_analog_read(A5); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I7", []() { return arduino_opta_analog_read(A6); }); + arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I8", []() { return arduino_opta_analog_read(A7); }); /* Add the various digital input pins. */ - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 1", []() { return arduino_opta_digital_read(A0); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 2", []() { return arduino_opta_digital_read(A1); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 3", []() { return arduino_opta_digital_read(A2); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 4", []() { return arduino_opta_digital_read(A3); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 5", []() { return arduino_opta_digital_read(A4); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 6", []() { return arduino_opta_digital_read(A5); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 7", []() { return arduino_opta_digital_read(A6); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input 8", []() { return arduino_opta_digital_read(A7); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I1", []() { return arduino_opta_digital_read(A0); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I2", []() { return arduino_opta_digital_read(A1); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I3", []() { return arduino_opta_digital_read(A2); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I4", []() { return arduino_opta_digital_read(A3); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I5", []() { return arduino_opta_digital_read(A4); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I6", []() { return arduino_opta_digital_read(A5); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I7", []() { return arduino_opta_digital_read(A6); }); + arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I8", []() { return arduino_opta_digital_read(A7); }); /* Add the various relay outputs. */ arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 1", [](bool const value) { pinMode(RELAY1, OUTPUT); digitalWrite(RELAY1, value); pinMode(LED_D0, OUTPUT); digitalWrite(LED_D0, value); }); @@ -342,18 +342,18 @@ void setup() for (uint8_t d = 0; d < OPTA_DIGITAL_IN_NUM; d++) { char analog_in_name[32] = {0}; - snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input %d", d + 1); + snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input I%d", d + 1); exp_dig->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); char digital_in_name[32] = {0}; - snprintf(digital_in_name, sizeof(digital_in_name), "Digital Input %d", d + 1); + snprintf(digital_in_name, sizeof(digital_in_name), "Digital Input I%d", d + 1); exp_dig->digital_input_mgr()->add_digital_input(opc_ua_server, digital_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); } /* Expose mechanical relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { char mech_relay_name[32] = {0}; - snprintf(mech_relay_name, sizeof(mech_relay_name), "Relay %d", r + 1); + snprintf(mech_relay_name, sizeof(mech_relay_name), "Relay I%d", r + 1); exp_dig->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } From e7a8c6383e8c3c2e4d22adb117628138a60dd29b Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 05:51:49 +0200 Subject: [PATCH 25/35] Move Arduino Opta Expansion boards up to the same hierarchical level as the Arduino Opta itself. --- examples/opcua_server/opcua_server.ino | 16 ++++- src/ArduinoOpta.cpp | 14 ---- src/ArduinoOpta.h | 8 --- src/Arduino_open62541.h | 1 + src/ExpansionManager.cpp | 53 +++++++++++++++ src/ExpansionManager.h | 66 +++++++++++++++++++ ...inoOptaExpansionType.h => ExpansionType.h} | 6 +- 7 files changed, 136 insertions(+), 28 deletions(-) create mode 100644 src/ExpansionManager.cpp create mode 100644 src/ExpansionManager.h rename src/expansion/{ArduinoOptaExpansionType.h => ExpansionType.h} (92%) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 4232b34..95519f8 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -99,6 +99,7 @@ O1HeapInstance * o1heap_ins = nullptr; rtos::Thread opc_ua_server_thread(osPriorityNormal, OPC_UA_SERVER_THREAD_STACK.size(), OPC_UA_SERVER_THREAD_STACK.data()); opcua::ArduinoOpta::SharedPtr arduino_opta_opcua; +opcua::ExpansionManager::SharedPtr arduino_opta_expansion_manager_opcua; #if USE_MODBUS_SENSOR_MD02 UA_NodeId modbus_md02_temperature_node_id; #endif @@ -323,7 +324,16 @@ void setup() UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "OptaController %d expansion modules detected.", opta_expansion_num); for(uint8_t i = 0; i < opta_expansion_num; i++) UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Expansion %d: type = %d (\"%16s\"), I2C address= 0x%02X", - i, OptaController.getExpansionType(i), opcua::ArduinoOptaExpansionType::toStr(OptaController.getExpansionType(i)).c_str(), OptaController.getExpansionI2Caddress(i)); + i, OptaController.getExpansionType(i), opcua::ExpansionType::toStr(OptaController.getExpansionType(i)).c_str(), OptaController.getExpansionI2Caddress(i)); + + /* Create Arduino Opta Expansion Manager (if necessary). */ + if (opta_expansion_num) { + arduino_opta_expansion_manager_opcua = opcua::ExpansionManager::create(opc_ua_server); + if (!arduino_opta_expansion_manager_opcua) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "opcua::ExpansionManager::create(...) failed"); + return; + } + } /* Expose Arduino Opta expansion module IO via OPC/UA. */ for(uint8_t i = 0; i < opta_expansion_num; i++) @@ -334,9 +344,9 @@ void setup() { opcua::DigitalExpansion::SharedPtr exp_dig = nullptr; if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) - exp_dig = arduino_opta_opcua->create_digital_mechanical_expansion(i); + exp_dig = arduino_opta_expansion_manager_opcua->create_digital_mechanical_expansion(i); else - exp_dig = arduino_opta_opcua->create_digital_solid_state_expansion(i); + exp_dig = arduino_opta_expansion_manager_opcua->create_digital_solid_state_expansion(i); /* Expose digital/analog pins via OPC/UA. */ for (uint8_t d = 0; d < OPTA_DIGITAL_IN_NUM; d++) diff --git a/src/ArduinoOpta.cpp b/src/ArduinoOpta.cpp index 7771f99..236ca99 100644 --- a/src/ArduinoOpta.cpp +++ b/src/ArduinoOpta.cpp @@ -180,20 +180,6 @@ LedManager::SharedPtr ArduinoOpta::led_mgr() return _led_mgr; } -DigitalMechExpansion::SharedPtr ArduinoOpta::create_digital_mechanical_expansion(uint8_t const exp_num) -{ - auto const exp_mech_opcua = opcua::DigitalMechExpansion::create(_server, _node_id, exp_num); - _dig_mech_exp_list.push_back(exp_mech_opcua); - return exp_mech_opcua; -} - -DigitalStSolidExpansion::SharedPtr ArduinoOpta::create_digital_solid_state_expansion(uint8_t const exp_num) -{ - auto const exp_solid_state_opcua = opcua::DigitalStSolidExpansion::create(_server, _node_id, exp_num); - _dig_solid_state_exp_list.push_back(exp_solid_state_opcua); - return exp_solid_state_opcua; -} - /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/ArduinoOpta.h b/src/ArduinoOpta.h index 4e4d613..230abf5 100644 --- a/src/ArduinoOpta.h +++ b/src/ArduinoOpta.h @@ -24,9 +24,6 @@ #include "io/digital/DigitalInputManager.h" #include "ArduinoOptaVariant.h" -#include "expansion/DigitalMechExpansion.h" -#include "expansion/DigitalStSolidExpansion.h" -#include "expansion/ArduinoOptaExpansionType.h" /************************************************************************************** * NAMESPACE @@ -55,8 +52,6 @@ class ArduinoOpta [[nodiscard]] UA_NodeId node_id() const { return _node_id; } - DigitalMechExpansion::SharedPtr create_digital_mechanical_expansion(uint8_t const exp_num); - DigitalStSolidExpansion::SharedPtr create_digital_solid_state_expansion(uint8_t const exp_num); private: UA_Server * _server; @@ -67,9 +62,6 @@ class ArduinoOpta DigitalInputManager::SharedPtr _digital_input_mgr; RelayManager::SharedPtr _relay_mgr; LedManager::SharedPtr _led_mgr; - - std::list _dig_mech_exp_list; - std::list _dig_solid_state_exp_list; }; /************************************************************************************** diff --git a/src/Arduino_open62541.h b/src/Arduino_open62541.h index 6e691a5..842b96f 100644 --- a/src/Arduino_open62541.h +++ b/src/Arduino_open62541.h @@ -20,6 +20,7 @@ #include "ArduinoOpta.h" #include "ArduinoOptaVariant.h" +#include "ExpansionManager.h" /************************************************************************************** * DEFINES diff --git a/src/ExpansionManager.cpp b/src/ExpansionManager.cpp new file mode 100644 index 0000000..104275f --- /dev/null +++ b/src/ExpansionManager.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "ExpansionManager.h" + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * PUBLIC MEMBER FUNCTIONS + **************************************************************************************/ + +DigitalMechExpansion::SharedPtr ExpansionManager::create_digital_mechanical_expansion(uint8_t const exp_num) +{ + auto const exp_mech_opcua = opcua::DigitalMechExpansion::create( + _server, + UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), + exp_num); + + _dig_mech_exp_list.push_back(exp_mech_opcua); + return exp_mech_opcua; +} + +DigitalStSolidExpansion::SharedPtr ExpansionManager::create_digital_solid_state_expansion(uint8_t const exp_num) +{ + auto const exp_solid_state_opcua = opcua::DigitalStSolidExpansion::create( + _server, + UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), + exp_num); + + _dig_solid_state_exp_list.push_back(exp_solid_state_opcua); + return exp_solid_state_opcua; +} + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ diff --git a/src/ExpansionManager.h b/src/ExpansionManager.h new file mode 100644 index 0000000..b7f7df4 --- /dev/null +++ b/src/ExpansionManager.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "open62541.h" + +#include + +#include "expansion/DigitalMechExpansion.h" +#include "expansion/DigitalStSolidExpansion.h" +#include "expansion/ExpansionType.h" + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * CLASS DECLARATION + **************************************************************************************/ + +class ExpansionManager +{ +public: + typedef std::shared_ptr SharedPtr; + + + static SharedPtr create(UA_Server * server) { + return std::make_shared(server); + } + + + ExpansionManager(UA_Server * server) + : _server{server} + { } + + + DigitalMechExpansion::SharedPtr create_digital_mechanical_expansion(uint8_t const exp_num); + DigitalStSolidExpansion::SharedPtr create_digital_solid_state_expansion(uint8_t const exp_num); + + +private: + UA_Server * _server; + + std::list _dig_mech_exp_list; + std::list _dig_solid_state_exp_list; +}; + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ diff --git a/src/expansion/ArduinoOptaExpansionType.h b/src/expansion/ExpansionType.h similarity index 92% rename from src/expansion/ArduinoOptaExpansionType.h rename to src/expansion/ExpansionType.h index aa33024..2bf5910 100644 --- a/src/expansion/ArduinoOptaExpansionType.h +++ b/src/expansion/ExpansionType.h @@ -28,11 +28,11 @@ namespace opcua * CLASS DECLARATION **************************************************************************************/ -class ArduinoOptaExpansionType +class ExpansionType { public: - ArduinoOptaExpansionType() = delete; - ArduinoOptaExpansionType(ArduinoOptaExpansionType const &) = delete; + ExpansionType() = delete; + ExpansionType(ExpansionType const &) = delete; static std::string toStr(ExpansionType_t const type) { From 46935e6736044cd4fb3d5077d308ff1d890ec2ec Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 05:53:54 +0200 Subject: [PATCH 26/35] Move stringify related code ("toStr") into subfolder of "util". --- src/Arduino_open62541.h | 2 ++ src/ExpansionManager.h | 1 - src/{expansion => util/toStr}/ExpansionType.h | 0 3 files changed, 2 insertions(+), 1 deletion(-) rename src/{expansion => util/toStr}/ExpansionType.h (100%) diff --git a/src/Arduino_open62541.h b/src/Arduino_open62541.h index 842b96f..c91c99d 100644 --- a/src/Arduino_open62541.h +++ b/src/Arduino_open62541.h @@ -14,9 +14,11 @@ **************************************************************************************/ #include "open62541.h" + #include "util/o1heap/o1heap.h" #include "util/time/cvt_time.h" #include "util/time/NTPUtils.h" +#include "util/toStr/ExpansionType.h" #include "ArduinoOpta.h" #include "ArduinoOptaVariant.h" diff --git a/src/ExpansionManager.h b/src/ExpansionManager.h index b7f7df4..2d76553 100644 --- a/src/ExpansionManager.h +++ b/src/ExpansionManager.h @@ -19,7 +19,6 @@ #include "expansion/DigitalMechExpansion.h" #include "expansion/DigitalStSolidExpansion.h" -#include "expansion/ExpansionType.h" /************************************************************************************** * NAMESPACE diff --git a/src/expansion/ExpansionType.h b/src/util/toStr/ExpansionType.h similarity index 100% rename from src/expansion/ExpansionType.h rename to src/util/toStr/ExpansionType.h From efcaa8b47582101493fe4d3bfaa18f21ebba8a8d Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 05:59:56 +0200 Subject: [PATCH 27/35] Drop the Arduino prefix since it adds no added value (just makes the name longer). --- examples/opcua_server/opcua_server.ino | 76 +++++++++---------- src/Arduino_open62541.h | 6 +- src/{ArduinoOpta.cpp => Opta.cpp} | 38 +++++----- src/{ArduinoOpta.h => Opta.h} | 14 ++-- ...onManager.cpp => OptaExpansionManager.cpp} | 6 +- ...ansionManager.h => OptaExpansionManager.h} | 8 +- ...ArduinoOptaVariant.cpp => OptaVariant.cpp} | 18 ++--- src/{ArduinoOptaVariant.h => OptaVariant.h} | 6 +- 8 files changed, 88 insertions(+), 84 deletions(-) rename src/{ArduinoOpta.cpp => Opta.cpp} (76%) rename src/{ArduinoOpta.h => Opta.h} (88%) rename src/{ExpansionManager.cpp => OptaExpansionManager.cpp} (85%) rename src/{ExpansionManager.h => OptaExpansionManager.h} (90%) rename src/{ArduinoOptaVariant.cpp => OptaVariant.cpp} (75%) rename src/{ArduinoOptaVariant.h => OptaVariant.h} (91%) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 95519f8..67d88a0 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -98,10 +98,10 @@ UA_Server * opc_ua_server = nullptr; O1HeapInstance * o1heap_ins = nullptr; rtos::Thread opc_ua_server_thread(osPriorityNormal, OPC_UA_SERVER_THREAD_STACK.size(), OPC_UA_SERVER_THREAD_STACK.data()); -opcua::ArduinoOpta::SharedPtr arduino_opta_opcua; -opcua::ExpansionManager::SharedPtr arduino_opta_expansion_manager_opcua; +opcua::Opta::SharedPtr opta_opcua; +opcua::OptaExpansionManager::SharedPtr opta_expansion_manager_opcua; #if USE_MODBUS_SENSOR_MD02 -UA_NodeId modbus_md02_temperature_node_id; +UA_NodeId modbus_md02_temperature_node_id;s #endif /************************************************************************************** @@ -267,12 +267,12 @@ void setup() "Arduino Opta IP: %s", Ethernet.localIP().toString().c_str()); /* Determine the Arduino OPC/UA hardware variant. */ - opcua::ArduinoOptaVariant::Type opta_type; - if (!opcua::ArduinoOptaVariant::get_opta_variant(opta_type)) { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "opcua::ArduinoOptaVariant::get_opta_variant(...) failed"); + opcua::OptaVariant::Type opta_type; + if (!opcua::OptaVariant::get_opta_variant(opta_type)) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "opcua::OptaVariant::get_opta_variant(...) failed"); return; } - UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Arduino Opta Variant: %s", opcua::ArduinoOptaVariant::toString(opta_type).c_str()); + UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Arduino Opta Variant: %s", opcua::OptaVariant::toString(opta_type).c_str()); /* Read all analog inputs at least once to have them pre-configured as ADCs. */ std::list const ADC_PIN_LIST = { A0, A1, A2, A3, A4, A5, A6, A7 }; @@ -282,41 +282,41 @@ void setup() analogReadResolution(12); /* Define the Arduino Opta as a OPC/UA object. */ - arduino_opta_opcua = opcua::ArduinoOpta::create(opc_ua_server, opta_type); - if (!arduino_opta_opcua) { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "opcua::ArduinoOpta::create(...) failed"); + opta_opcua = opcua::Opta::create(opc_ua_server, opta_type); + if (!opta_opcua) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "opcua::Opta::create(...) failed"); return; } /* Add the various digital input pins. */ - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I1", []() { return arduino_opta_analog_read(A0); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I2", []() { return arduino_opta_analog_read(A1); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I3", []() { return arduino_opta_analog_read(A2); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I4", []() { return arduino_opta_analog_read(A3); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I5", []() { return arduino_opta_analog_read(A4); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I6", []() { return arduino_opta_analog_read(A5); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I7", []() { return arduino_opta_analog_read(A6); }); - arduino_opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I8", []() { return arduino_opta_analog_read(A7); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I1", []() { return arduino_opta_analog_read(A0); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I2", []() { return arduino_opta_analog_read(A1); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I3", []() { return arduino_opta_analog_read(A2); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I4", []() { return arduino_opta_analog_read(A3); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I5", []() { return arduino_opta_analog_read(A4); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I6", []() { return arduino_opta_analog_read(A5); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I7", []() { return arduino_opta_analog_read(A6); }); + opta_opcua->analog_input_mgr()->add_analog_input(opc_ua_server, "Analog Input I8", []() { return arduino_opta_analog_read(A7); }); /* Add the various digital input pins. */ - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I1", []() { return arduino_opta_digital_read(A0); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I2", []() { return arduino_opta_digital_read(A1); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I3", []() { return arduino_opta_digital_read(A2); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I4", []() { return arduino_opta_digital_read(A3); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I5", []() { return arduino_opta_digital_read(A4); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I6", []() { return arduino_opta_digital_read(A5); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I7", []() { return arduino_opta_digital_read(A6); }); - arduino_opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I8", []() { return arduino_opta_digital_read(A7); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I1", []() { return arduino_opta_digital_read(A0); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I2", []() { return arduino_opta_digital_read(A1); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I3", []() { return arduino_opta_digital_read(A2); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I4", []() { return arduino_opta_digital_read(A3); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I5", []() { return arduino_opta_digital_read(A4); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I6", []() { return arduino_opta_digital_read(A5); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I7", []() { return arduino_opta_digital_read(A6); }); + opta_opcua->digital_input_mgr()->add_digital_input(opc_ua_server, "Digital Input I8", []() { return arduino_opta_digital_read(A7); }); /* Add the various relay outputs. */ - arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 1", [](bool const value) { pinMode(RELAY1, OUTPUT); digitalWrite(RELAY1, value); pinMode(LED_D0, OUTPUT); digitalWrite(LED_D0, value); }); - arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 2", [](bool const value) { pinMode(RELAY2, OUTPUT); digitalWrite(RELAY2, value); pinMode(LED_D1, OUTPUT); digitalWrite(LED_D1, value);}); - arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 3", [](bool const value) { pinMode(RELAY3, OUTPUT); digitalWrite(RELAY3, value); pinMode(LED_D2, OUTPUT); digitalWrite(LED_D2, value);}); - arduino_opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 4", [](bool const value) { pinMode(RELAY4, OUTPUT); digitalWrite(RELAY4, value); pinMode(LED_D3, OUTPUT); digitalWrite(LED_D3, value);}); + opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 1", [](bool const value) { pinMode(RELAY1, OUTPUT); digitalWrite(RELAY1, value); pinMode(LED_D0, OUTPUT); digitalWrite(LED_D0, value); }); + opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 2", [](bool const value) { pinMode(RELAY2, OUTPUT); digitalWrite(RELAY2, value); pinMode(LED_D1, OUTPUT); digitalWrite(LED_D1, value);}); + opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 3", [](bool const value) { pinMode(RELAY3, OUTPUT); digitalWrite(RELAY3, value); pinMode(LED_D2, OUTPUT); digitalWrite(LED_D2, value);}); + opta_opcua->relay_mgr()->add_relay_output(opc_ua_server, "Relay 4", [](bool const value) { pinMode(RELAY4, OUTPUT); digitalWrite(RELAY4, value); pinMode(LED_D3, OUTPUT); digitalWrite(LED_D3, value);}); /* Add the various LED outputs. */ - if (opta_type == opcua::ArduinoOptaVariant::Type::WiFi) { - arduino_opta_opcua->led_mgr()->add_led_output(opc_ua_server, "User LED", [](bool const value) { pinMode(LEDB, OUTPUT); digitalWrite(LEDB, value); }); + if (opta_type == opcua::OptaVariant::Type::WiFi) { + opta_opcua->led_mgr()->add_led_output(opc_ua_server, "User LED", [](bool const value) { pinMode(LEDB, OUTPUT); digitalWrite(LEDB, value); }); } /* Check availability of expansion modules. */ @@ -328,9 +328,9 @@ void setup() /* Create Arduino Opta Expansion Manager (if necessary). */ if (opta_expansion_num) { - arduino_opta_expansion_manager_opcua = opcua::ExpansionManager::create(opc_ua_server); - if (!arduino_opta_expansion_manager_opcua) { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "opcua::ExpansionManager::create(...) failed"); + opta_expansion_manager_opcua = opcua::OptaExpansionManager::create(opc_ua_server); + if (!opta_expansion_manager_opcua) { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "opcua::OptaExpansionManager::create(...) failed"); return; } } @@ -344,9 +344,9 @@ void setup() { opcua::DigitalExpansion::SharedPtr exp_dig = nullptr; if (exp_type == EXPANSION_OPTA_DIGITAL_MEC) - exp_dig = arduino_opta_expansion_manager_opcua->create_digital_mechanical_expansion(i); + exp_dig = opta_expansion_manager_opcua->create_digital_mechanical_expansion(i); else - exp_dig = arduino_opta_expansion_manager_opcua->create_digital_solid_state_expansion(i); + exp_dig = opta_expansion_manager_opcua->create_digital_solid_state_expansion(i); /* Expose digital/analog pins via OPC/UA. */ for (uint8_t d = 0; d < OPTA_DIGITAL_IN_NUM; d++) @@ -377,7 +377,7 @@ void setup() UA_NodeId modbus_md02_node_id; rc = UA_Server_addObjectNode(opc_ua_server, UA_NODEID_NULL, - arduino_opta_opcua->node_id(), + opta_opcua->node_id(), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "ModbusRs485Md02"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), diff --git a/src/Arduino_open62541.h b/src/Arduino_open62541.h index c91c99d..1d2362c 100644 --- a/src/Arduino_open62541.h +++ b/src/Arduino_open62541.h @@ -20,9 +20,9 @@ #include "util/time/NTPUtils.h" #include "util/toStr/ExpansionType.h" -#include "ArduinoOpta.h" -#include "ArduinoOptaVariant.h" -#include "ExpansionManager.h" +#include "Opta.h" +#include "OptaVariant.h" +#include "OptaExpansionManager.h" /************************************************************************************** * DEFINES diff --git a/src/ArduinoOpta.cpp b/src/Opta.cpp similarity index 76% rename from src/ArduinoOpta.cpp rename to src/Opta.cpp index 236ca99..b9d8a82 100644 --- a/src/ArduinoOpta.cpp +++ b/src/Opta.cpp @@ -11,7 +11,7 @@ * INCLUDE **************************************************************************************/ -#include "ArduinoOpta.h" +#include "Opta.h" /************************************************************************************** * NAMESPACE @@ -24,7 +24,7 @@ namespace opcua * CTOR/DTOR **************************************************************************************/ -ArduinoOpta::ArduinoOpta(UA_Server * server, UA_NodeId const & node_id) +Opta::Opta(UA_Server * server, UA_NodeId const & node_id) : _server{server} , _node_id{node_id} , _analog_input_mgr{nullptr} @@ -34,14 +34,14 @@ ArduinoOpta::ArduinoOpta(UA_Server * server, UA_NodeId const & node_id) { _usr_button = opcua::UserButton::create(_server, _node_id); if (!_usr_button) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOpta::Ctor: UserButton::create(...) failed."); + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Opta::Ctor: UserButton::create(...) failed."); } /************************************************************************************** * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ -ArduinoOpta::SharedPtr ArduinoOpta::create(UA_Server * server, ArduinoOptaVariant::Type const opta_type) +Opta::SharedPtr Opta::create(UA_Server * server, OptaVariant::Type const opta_type) { UA_StatusCode rc = UA_STATUSCODE_GOOD; @@ -52,7 +52,7 @@ ArduinoOpta::SharedPtr ArduinoOpta::create(UA_Server * server, ArduinoOptaVarian UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), - UA_QUALIFIEDNAME(1, "ArduinoOpta"), + UA_QUALIFIEDNAME(1, "Opta"), UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, @@ -60,7 +60,7 @@ ArduinoOpta::SharedPtr ArduinoOpta::create(UA_Server * server, ArduinoOptaVarian if (UA_StatusCode_isBad(rc)) { UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "ArduinoOpta::create: UA_Server_addObjectNode(...) failed with %s", + "Opta::create: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); return nullptr; } @@ -81,13 +81,13 @@ ArduinoOpta::SharedPtr ArduinoOpta::create(UA_Server * server, ArduinoOptaVarian if (UA_StatusCode_isBad(rc)) { UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "ArduinoOpta::create: UA_Server_addVariableNode(..., \"ManufacturerName\", ...) failed with %s", + "Opta::create: UA_Server_addVariableNode(..., \"ManufacturerName\", ...) failed with %s", UA_StatusCode_name(rc)); return nullptr; } UA_VariableAttributes modelAttr = UA_VariableAttributes_default; - UA_String modelName = UA_STRING((char *)ArduinoOptaVariant::toString(opta_type).c_str()); + UA_String modelName = UA_STRING((char *)OptaVariant::toString(opta_type).c_str()); UA_Variant_setScalar(&modelAttr.value, &modelName, &UA_TYPES[UA_TYPES_STRING]); modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName"); rc = UA_Server_addVariableNode(server, @@ -102,7 +102,7 @@ ArduinoOpta::SharedPtr ArduinoOpta::create(UA_Server * server, ArduinoOptaVarian if (UA_StatusCode_isBad(rc)) { UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "ArduinoOpta::create: UA_Server_addVariableNode(..., \"ModelName\", ...) failed with %s", + "Opta::create: UA_Server_addVariableNode(..., \"ModelName\", ...) failed with %s", UA_StatusCode_name(rc)); return nullptr; } @@ -123,58 +123,58 @@ ArduinoOpta::SharedPtr ArduinoOpta::create(UA_Server * server, ArduinoOptaVarian if (UA_StatusCode_isBad(rc)) { UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "ArduinoOpta::create: UA_Server_addVariableNode(..., \"Status\", ...) failed with %s", + "Opta::create: UA_Server_addVariableNode(..., \"Status\", ...) failed with %s", UA_StatusCode_name(rc)); return nullptr; } - auto const instance_ptr = std::make_shared(server, node_id); + auto const instance_ptr = std::make_shared(server, node_id); return instance_ptr; } -AnalogInputManager::SharedPtr ArduinoOpta::analog_input_mgr() +AnalogInputManager::SharedPtr Opta::analog_input_mgr() { if (!_analog_input_mgr) { _analog_input_mgr = opcua::AnalogInputManager::create(_server, _node_id); if (!_analog_input_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOpta::analog_input_mgr: AnalogInputManager::create(...) failed."); + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Opta::analog_input_mgr: AnalogInputManager::create(...) failed."); } return _analog_input_mgr; } -DigitalInputManager::SharedPtr ArduinoOpta::digital_input_mgr() +DigitalInputManager::SharedPtr Opta::digital_input_mgr() { if (!_digital_input_mgr) { _digital_input_mgr = opcua::DigitalInputManager::create(_server, _node_id); if (!_digital_input_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOpta::digital_input_mgr: DigitalInputManager::create(...) failed."); + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Opta::digital_input_mgr: DigitalInputManager::create(...) failed."); } return _digital_input_mgr; } -RelayManager::SharedPtr ArduinoOpta::relay_mgr() +RelayManager::SharedPtr Opta::relay_mgr() { if (!_relay_mgr) { _relay_mgr = opcua::RelayManager::create(_server, _node_id); if (!_relay_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOpta::relay_mgr: RelayManager::create(...) failed."); + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Opta::relay_mgr: RelayManager::create(...) failed."); } return _relay_mgr; } -LedManager::SharedPtr ArduinoOpta::led_mgr() +LedManager::SharedPtr Opta::led_mgr() { if (!_led_mgr) { _led_mgr = opcua::LedManager::create(_server, _node_id); if (!_led_mgr) - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "ArduinoOpta::led_mgr: LedManager::create(...) failed."); + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Opta::led_mgr: LedManager::create(...) failed."); } return _led_mgr; diff --git a/src/ArduinoOpta.h b/src/Opta.h similarity index 88% rename from src/ArduinoOpta.h rename to src/Opta.h index 230abf5..d3be5cf 100644 --- a/src/ArduinoOpta.h +++ b/src/Opta.h @@ -23,7 +23,7 @@ #include "io/analog/AnalogInputManager.h" #include "io/digital/DigitalInputManager.h" -#include "ArduinoOptaVariant.h" +#include "OptaVariant.h" /************************************************************************************** * NAMESPACE @@ -36,20 +36,24 @@ namespace opcua * CLASS DECLARATION **************************************************************************************/ -class ArduinoOpta +class Opta { public: - typedef std::shared_ptr SharedPtr; + typedef std::shared_ptr SharedPtr; - static SharedPtr create(UA_Server * server, ArduinoOptaVariant::Type const opta_type); - ArduinoOpta(UA_Server * server, UA_NodeId const & node_id); + static SharedPtr create(UA_Server * server, OptaVariant::Type const opta_type); + + + Opta(UA_Server * server, UA_NodeId const & node_id); + AnalogInputManager::SharedPtr analog_input_mgr(); DigitalInputManager::SharedPtr digital_input_mgr(); RelayManager::SharedPtr relay_mgr(); LedManager::SharedPtr led_mgr(); + [[nodiscard]] UA_NodeId node_id() const { return _node_id; } diff --git a/src/ExpansionManager.cpp b/src/OptaExpansionManager.cpp similarity index 85% rename from src/ExpansionManager.cpp rename to src/OptaExpansionManager.cpp index 104275f..a1a2ff9 100644 --- a/src/ExpansionManager.cpp +++ b/src/OptaExpansionManager.cpp @@ -11,7 +11,7 @@ * INCLUDE **************************************************************************************/ -#include "ExpansionManager.h" +#include "OptaExpansionManager.h" /************************************************************************************** * NAMESPACE @@ -24,7 +24,7 @@ namespace opcua * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ -DigitalMechExpansion::SharedPtr ExpansionManager::create_digital_mechanical_expansion(uint8_t const exp_num) +DigitalMechExpansion::SharedPtr OptaExpansionManager::create_digital_mechanical_expansion(uint8_t const exp_num) { auto const exp_mech_opcua = opcua::DigitalMechExpansion::create( _server, @@ -35,7 +35,7 @@ DigitalMechExpansion::SharedPtr ExpansionManager::create_digital_mechanical_expa return exp_mech_opcua; } -DigitalStSolidExpansion::SharedPtr ExpansionManager::create_digital_solid_state_expansion(uint8_t const exp_num) +DigitalStSolidExpansion::SharedPtr OptaExpansionManager::create_digital_solid_state_expansion(uint8_t const exp_num) { auto const exp_solid_state_opcua = opcua::DigitalStSolidExpansion::create( _server, diff --git a/src/ExpansionManager.h b/src/OptaExpansionManager.h similarity index 90% rename from src/ExpansionManager.h rename to src/OptaExpansionManager.h index 2d76553..69e93cd 100644 --- a/src/ExpansionManager.h +++ b/src/OptaExpansionManager.h @@ -31,18 +31,18 @@ namespace opcua * CLASS DECLARATION **************************************************************************************/ -class ExpansionManager +class OptaExpansionManager { public: - typedef std::shared_ptr SharedPtr; + typedef std::shared_ptr SharedPtr; static SharedPtr create(UA_Server * server) { - return std::make_shared(server); + return std::make_shared(server); } - ExpansionManager(UA_Server * server) + OptaExpansionManager(UA_Server * server) : _server{server} { } diff --git a/src/ArduinoOptaVariant.cpp b/src/OptaVariant.cpp similarity index 75% rename from src/ArduinoOptaVariant.cpp rename to src/OptaVariant.cpp index fb1b503..8d1e7e0 100644 --- a/src/ArduinoOptaVariant.cpp +++ b/src/OptaVariant.cpp @@ -11,7 +11,7 @@ * INCLUDE **************************************************************************************/ -#include "ArduinoOptaVariant.h" +#include "OptaVariant.h" #if __has_include("opta_info.h") # include @@ -32,18 +32,18 @@ namespace opcua * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ -bool ArduinoOptaVariant::get_opta_variant(Type & type) +bool OptaVariant::get_opta_variant(Type & type) { OptaBoardInfo * info = boardInfo(); if (info->_board_functionalities.ethernet && info->_board_functionalities.wifi && info->_board_functionalities.rs485) { - type = ArduinoOptaVariant::Type::WiFi; + type = OptaVariant::Type::WiFi; } else if (info->_board_functionalities.ethernet && info->_board_functionalities.rs485) { - type = ArduinoOptaVariant::Type::RS485; + type = OptaVariant::Type::RS485; } else if (info->_board_functionalities.ethernet) { - type = ArduinoOptaVariant::Type::Lite; + type = OptaVariant::Type::Lite; } else return false; @@ -51,13 +51,13 @@ bool ArduinoOptaVariant::get_opta_variant(Type & type) return true; } -std::string ArduinoOptaVariant::toString(Type const type) +std::string OptaVariant::toString(Type const type) { switch(type) { - case ArduinoOptaVariant::Type::WiFi: return std::string("Arduino Opta WiFi"); break; - case ArduinoOptaVariant::Type::RS485: return std::string("Arduino Opta RS485"); break; - case ArduinoOptaVariant::Type::Lite: return std::string("Arduino Opta Lite"); break; + case OptaVariant::Type::WiFi: return std::string("Arduino Opta WiFi"); break; + case OptaVariant::Type::RS485: return std::string("Arduino Opta RS485"); break; + case OptaVariant::Type::Lite: return std::string("Arduino Opta Lite"); break; default: __builtin_unreachable(); break; } } diff --git a/src/ArduinoOptaVariant.h b/src/OptaVariant.h similarity index 91% rename from src/ArduinoOptaVariant.h rename to src/OptaVariant.h index e5d87c8..3724979 100644 --- a/src/ArduinoOptaVariant.h +++ b/src/OptaVariant.h @@ -26,11 +26,11 @@ namespace opcua * CLASS DECLARATION **************************************************************************************/ -class ArduinoOptaVariant +class OptaVariant { public: - ArduinoOptaVariant() = delete; - ArduinoOptaVariant(ArduinoOptaVariant const &) = delete; + OptaVariant() = delete; + OptaVariant(OptaVariant const &) = delete; enum class Type { Lite, RS485, WiFi }; From 6f438596a26dbdc1339a2b628f4bec7d298021a6 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 06:30:08 +0200 Subject: [PATCH 28/35] Extract glue code into separately compiled file "glue.cpp". --- examples/opcua_server/opcua_server.ino | 51 +---------------- src/open62541/glue.cpp | 76 ++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 49 deletions(-) create mode 100644 src/open62541/glue.cpp diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 67d88a0..d3a2172 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -2,8 +2,8 @@ * INCLUDE **************************************************************************************/ -#include "PortentaEthernet.h" -#include "Arduino_open62541.h" +#include +#include #include /* Arduino_Opta_Blueprint */ #include @@ -35,53 +35,6 @@ static int const MODBUS_DEVICE_TEMPERATURE_REGISTER = 0x0001; static int const MODBUS_DEVICE_HUMIDITY_REGISTER = 0x0002; #endif -/************************************************************************************** - * GLUE CODE - **************************************************************************************/ - -extern "C" -{ - int gethostname(char *str, size_t len) { - String ip = Ethernet.localIP().toString(); - memset(str, 0, len); - memcpy(str, ip.c_str(), ip.length()); - return 0; - } - - UA_StatusCode registerFakeInterrupt(UA_InterruptManager *im, uintptr_t interruptHandle, const UA_KeyValueMap *params, UA_InterruptCallback callback, void *interruptContext) { - return UA_STATUSCODE_GOOD; - } - void deregisterFakeInterrupt(UA_InterruptManager *im, uintptr_t interruptHandle) { - return; - } - UA_StatusCode startFakeInterruptManager(UA_EventSource *es) { - return UA_STATUSCODE_GOOD; - } - void stopFakeInterruptManager(UA_EventSource *es) { - return; - } - UA_StatusCode freeFakeInterruptManager(UA_EventSource *es) { - return UA_STATUSCODE_GOOD; - } - - UA_InterruptManager *UA_InterruptManager_new_POSIX(const UA_String eventSourceName) { - static UA_InterruptManager im; - static UA_String name = UA_String_fromChars("fakeES"); - im.eventSource.eventSourceType = UA_EVENTSOURCETYPE_INTERRUPTMANAGER; - UA_String_copy(&eventSourceName, &name); - im.eventSource.start = startFakeInterruptManager; - im.eventSource.stop = stopFakeInterruptManager; - im.eventSource.free = freeFakeInterruptManager; - im.registerInterrupt = registerFakeInterrupt; - im.deregisterInterrupt = deregisterFakeInterrupt; - return &im; - } - - UA_ConnectionManager *UA_ConnectionManager_new_POSIX_UDP(const UA_String eventSourceName) { - return nullptr; - } -} - /************************************************************************************** * GLOBAL VARIABLES **************************************************************************************/ diff --git a/src/open62541/glue.cpp b/src/open62541/glue.cpp new file mode 100644 index 0000000..6a026df --- /dev/null +++ b/src/open62541/glue.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include +#include "../open62541.h" + +/************************************************************************************** + * GLUE CODE + **************************************************************************************/ + +extern "C" +{ + + int gethostname(char *str, size_t len) + { + String ip = Ethernet.localIP().toString(); + memset(str, 0, len); + memcpy(str, ip.c_str(), ip.length()); + return 0; + } + + UA_StatusCode registerFakeInterrupt(UA_InterruptManager *im, uintptr_t interruptHandle, const UA_KeyValueMap *params, UA_InterruptCallback callback, void *interruptContext) + { + return UA_STATUSCODE_GOOD; + } + + void deregisterFakeInterrupt(UA_InterruptManager *im, uintptr_t interruptHandle) + { + return; + } + + UA_StatusCode startFakeInterruptManager(UA_EventSource *es) + { + return UA_STATUSCODE_GOOD; + } + + void stopFakeInterruptManager(UA_EventSource *es) + { + return; + } + + UA_StatusCode freeFakeInterruptManager(UA_EventSource *es) + { + return UA_STATUSCODE_GOOD; + } + + UA_InterruptManager *UA_InterruptManager_new_POSIX(const UA_String eventSourceName) + { + static UA_InterruptManager im; + static UA_String name = UA_String_fromChars("fakeES"); + im.eventSource.eventSourceType = UA_EVENTSOURCETYPE_INTERRUPTMANAGER; + UA_String_copy(&eventSourceName, &name); + im.eventSource.start = startFakeInterruptManager; + im.eventSource.stop = stopFakeInterruptManager; + im.eventSource.free = freeFakeInterruptManager; + im.registerInterrupt = registerFakeInterrupt; + im.deregisterInterrupt = deregisterFakeInterrupt; + return &im; + } + + UA_ConnectionManager *UA_ConnectionManager_new_POSIX_UDP(const UA_String eventSourceName) + { + return nullptr; + } + +} /* extern "C" */ From e8235f379474c09b541a0b80c96fccc384f0b240 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 06:50:59 +0200 Subject: [PATCH 29/35] Extract o1heap_wrapper glue code into separate module. --- examples/opcua_server/opcua_server.ino | 67 ----------------- src/Arduino_open62541.h | 1 + src/util/o1heap/o1heap_wrapper.cpp | 99 ++++++++++++++++++++++++++ src/util/o1heap/o1heap_wrapper.h | 33 +++++++++ 4 files changed, 133 insertions(+), 67 deletions(-) create mode 100644 src/util/o1heap/o1heap_wrapper.cpp create mode 100644 src/util/o1heap/o1heap_wrapper.h diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index d3a2172..347f702 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -7,10 +7,6 @@ #include /* Arduino_Opta_Blueprint */ #include -#ifndef ARDUINO_OPEN62541_O1HEAP_DEBUG -# define ARDUINO_OPEN62541_O1HEAP_DEBUG (0) /* Change to (1) if you want to see debug messages on Serial concerning o1heap memory calls. */ -#endif - #if MBED_HEAP_STATS_ENABLED && MBED_MEM_TRACING_ENABLED && MBED_STACK_STATS_ENABLED #include "mbed_mem_trace.h" #endif @@ -67,69 +63,6 @@ REDIRECT_STDOUT_TO(Serial) * LOCAL FUNCTIONS **************************************************************************************/ -extern "C" void * o1heap_malloc(size_t size) -{ -#if ARDUINO_OPEN62541_O1HEAP_DEBUG - if (!o1heapDoInvariantsHold(o1heap_ins)) - Serial.println("malloc error"); -#endif - - void * new_ptr = o1heapAllocate(o1heap_ins, size); - -#if ARDUINO_OPEN62541_O1HEAP_DEBUG - char msg[64]; - snprintf(msg, sizeof(msg), "malloc: %d (%X)", size, new_ptr); - Serial.println(msg); -#endif - - return new_ptr; -} - -extern "C" void o1heap_free(void * ptr) -{ -#if ARDUINO_OPEN62541_O1HEAP_DEBUG - if (!o1heapDoInvariantsHold(o1heap_ins)) - Serial.println("free error"); - - char msg[64]; - snprintf(msg, sizeof(msg), "free: (%X)", ptr); - Serial.println(msg); -#endif - o1heapFree(o1heap_ins, ptr); -} - -extern "C" void * o1heap_calloc(size_t nelem, size_t elsize) -{ -#if ARDUINO_OPEN62541_O1HEAP_DEBUG - if (!o1heapDoInvariantsHold(o1heap_ins)) - Serial.println("calloc error"); - - char msg[64]; - snprintf(msg, sizeof(msg), "calloc: nelem = %d, elsize = %d", nelem, elsize); - Serial.println(msg); -#endif - - void * ptr = o1heap_malloc(nelem * elsize); - memset(ptr, 0, nelem * elsize); - return ptr; -} - -extern "C" void * o1heap_realloc(void * old_ptr, size_t size) -{ -#if ARDUINO_OPEN62541_O1HEAP_DEBUG - if (!o1heapDoInvariantsHold(o1heap_ins)) - Serial.println("realloc error"); - - char msg[64]; - snprintf(msg, sizeof(msg), "realloc: old_ptr = %X, size = %d", old_ptr, size); - Serial.println(msg); -#endif - void * new_ptr = o1heap_malloc(size); - memcpy(new_ptr, old_ptr, size); - o1heap_free(old_ptr); - return new_ptr; -} - static float arduino_opta_analog_read(pin_size_t const pin) { static float const VOLTAGE_MAX = 3.3; // Maximum voltage that can be read diff --git a/src/Arduino_open62541.h b/src/Arduino_open62541.h index 1d2362c..9e1aaae 100644 --- a/src/Arduino_open62541.h +++ b/src/Arduino_open62541.h @@ -16,6 +16,7 @@ #include "open62541.h" #include "util/o1heap/o1heap.h" +#include "util/o1heap/o1heap_wrapper.h" #include "util/time/cvt_time.h" #include "util/time/NTPUtils.h" #include "util/toStr/ExpansionType.h" diff --git a/src/util/o1heap/o1heap_wrapper.cpp b/src/util/o1heap/o1heap_wrapper.cpp new file mode 100644 index 0000000..6a1a790 --- /dev/null +++ b/src/util/o1heap/o1heap_wrapper.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "o1heap_wrapper.h" + +#include "o1heap.h" + +#include + +/************************************************************************************** + * DEFINES + **************************************************************************************/ + +#ifndef ARDUINO_OPEN62541_O1HEAP_DEBUG +# define ARDUINO_OPEN62541_O1HEAP_DEBUG (0) /* Change to (1) if you want to see debug messages on Serial concerning o1heap memory calls. */ +#endif + +/************************************************************************************** + * EXTERN DECLARATION + **************************************************************************************/ + +extern O1HeapInstance * o1heap_ins; /* Access o1heap_ins declared in the sketch. */ + +/************************************************************************************** + * FUNCTION DEFINTIION + **************************************************************************************/ + +extern "C" void * o1heap_malloc(size_t size) +{ +#if ARDUINO_OPEN62541_O1HEAP_DEBUG + if (!o1heapDoInvariantsHold(o1heap_ins)) + Serial.println("malloc error"); +#endif + + void * new_ptr = o1heapAllocate(o1heap_ins, size); + +#if ARDUINO_OPEN62541_O1HEAP_DEBUG + char msg[64]; + snprintf(msg, sizeof(msg), "malloc: %d (%X)", size, new_ptr); + Serial.println(msg); +#endif + + return new_ptr; +} + +extern "C" void o1heap_free(void * ptr) +{ +#if ARDUINO_OPEN62541_O1HEAP_DEBUG + if (!o1heapDoInvariantsHold(o1heap_ins)) + Serial.println("free error"); + + char msg[64]; + snprintf(msg, sizeof(msg), "free: (%X)", ptr); + Serial.println(msg); +#endif + o1heapFree(o1heap_ins, ptr); +} + +extern "C" void * o1heap_calloc(size_t nelem, size_t elsize) +{ +#if ARDUINO_OPEN62541_O1HEAP_DEBUG + if (!o1heapDoInvariantsHold(o1heap_ins)) + Serial.println("calloc error"); + + char msg[64]; + snprintf(msg, sizeof(msg), "calloc: nelem = %d, elsize = %d", nelem, elsize); + Serial.println(msg); +#endif + + void * ptr = o1heap_malloc(nelem * elsize); + memset(ptr, 0, nelem * elsize); + return ptr; +} + +extern "C" void * o1heap_realloc(void * old_ptr, size_t size) +{ +#if ARDUINO_OPEN62541_O1HEAP_DEBUG + if (!o1heapDoInvariantsHold(o1heap_ins)) + Serial.println("realloc error"); + + char msg[64]; + snprintf(msg, sizeof(msg), "realloc: old_ptr = %X, size = %d", old_ptr, size); + Serial.println(msg); +#endif + void * new_ptr = o1heap_malloc(size); + memcpy(new_ptr, old_ptr, size); + o1heap_free(old_ptr); + return new_ptr; +} diff --git a/src/util/o1heap/o1heap_wrapper.h b/src/util/o1heap/o1heap_wrapper.h new file mode 100644 index 0000000..0c163da --- /dev/null +++ b/src/util/o1heap/o1heap_wrapper.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include + +/************************************************************************************** + * FUNCTION DECLARATION + **************************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +void * o1heap_malloc(size_t size); +void o1heap_free(void * ptr); +void * o1heap_calloc(size_t nelem, size_t elsize); +void * o1heap_realloc(void * old_ptr, size_t size); + +#ifdef __cplusplus +} +#endif From 9d0e2dc13f162d65e10f3cec891d828e46d2d668 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 07:19:58 +0200 Subject: [PATCH 30/35] Implement model name, manufacturer name and status to be displayed for the expansion boards. --- src/expansion/DigitalExpansion.cpp | 67 ++++++++++++++++++++++++- src/expansion/DigitalExpansion.h | 3 +- src/expansion/DigitalMechExpansion.h | 13 +++-- src/expansion/DigitalStSolidExpansion.h | 9 ++-- 4 files changed, 82 insertions(+), 10 deletions(-) diff --git a/src/expansion/DigitalExpansion.cpp b/src/expansion/DigitalExpansion.cpp index a38e1de..3d12104 100644 --- a/src/expansion/DigitalExpansion.cpp +++ b/src/expansion/DigitalExpansion.cpp @@ -29,7 +29,8 @@ namespace opcua DigitalExpansion::DigitalExpansion(UA_Server * server, UA_NodeId const parent_node_id, char * display_name, - char * node_name) + char * node_name, + char * model_name) : _server{server} { UA_StatusCode rc = UA_STATUSCODE_GOOD; @@ -50,6 +51,70 @@ DigitalExpansion::DigitalExpansion(UA_Server * server, { UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "DigitalExpansion::Ctor: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); + return; + } + + UA_VariableAttributes mnAttr = UA_VariableAttributes_default; + UA_String manufacturerName = UA_STRING("Arduino"); + UA_Variant_setScalar(&mnAttr.value, &manufacturerName, &UA_TYPES[UA_TYPES_STRING]); + mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName"); + rc = UA_Server_addVariableNode(server, + UA_NODEID_NULL, + _node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_QUALIFIEDNAME(1, "ManufacturerName"), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + mnAttr, + NULL, + NULL); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "DigitalExpansion::Ctor: UA_Server_addVariableNode(..., \"ManufacturerName\", ...) failed with %s", + UA_StatusCode_name(rc)); + return; + } + + UA_VariableAttributes modelAttr = UA_VariableAttributes_default; + UA_String modelName = UA_STRING(model_name); + UA_Variant_setScalar(&modelAttr.value, &modelName, &UA_TYPES[UA_TYPES_STRING]); + modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName"); + rc = UA_Server_addVariableNode(server, + UA_NODEID_NULL, + _node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_QUALIFIEDNAME(1, "ModelName"), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + modelAttr, + NULL, + NULL); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "DigitalExpansion::Ctor: UA_Server_addVariableNode(..., \"ModelName\", ...) failed with %s", + UA_StatusCode_name(rc)); + return; + } + + UA_VariableAttributes statusAttr = UA_VariableAttributes_default; + UA_Boolean status = true; + UA_Variant_setScalar(&statusAttr.value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]); + statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status"); + rc = UA_Server_addVariableNode(server, + UA_NODEID_NULL, + _node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_QUALIFIEDNAME(1, "Status"), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + statusAttr, + NULL, + NULL); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "DigitalExpansion::Ctor: UA_Server_addVariableNode(..., \"Status\", ...) failed with %s", + UA_StatusCode_name(rc)); + return; } } diff --git a/src/expansion/DigitalExpansion.h b/src/expansion/DigitalExpansion.h index b0a91d7..88c1848 100644 --- a/src/expansion/DigitalExpansion.h +++ b/src/expansion/DigitalExpansion.h @@ -41,7 +41,8 @@ class DigitalExpansion DigitalExpansion(UA_Server * server, UA_NodeId const parent_node_id, char * display_name, - char * node_name); + char * node_name, + char * model_name); AnalogInputManager::SharedPtr analog_input_mgr(); diff --git a/src/expansion/DigitalMechExpansion.h b/src/expansion/DigitalMechExpansion.h index 9b3d1f2..ba99223 100644 --- a/src/expansion/DigitalMechExpansion.h +++ b/src/expansion/DigitalMechExpansion.h @@ -40,16 +40,19 @@ class DigitalMechExpansion : public DigitalExpansion char node_name[32] = {0}; snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); - auto const instance_ptr = std::make_shared(server, parent_node_id, display_name, node_name); + char model_name[] = {"AFX00005"}; + + auto const instance_ptr = std::make_shared(server, parent_node_id, display_name, node_name, model_name); return instance_ptr; } DigitalMechExpansion(UA_Server * server, - UA_NodeId const parent_node_id, - char * display_name, - char * node_name) - : DigitalExpansion{server, parent_node_id, display_name, node_name} + UA_NodeId const parent_node_id, + char * display_name, + char * node_name, + char * model_name) + : DigitalExpansion{server, parent_node_id, display_name, node_name, model_name} {} }; diff --git a/src/expansion/DigitalStSolidExpansion.h b/src/expansion/DigitalStSolidExpansion.h index 64b4bfd..b6c0cb9 100644 --- a/src/expansion/DigitalStSolidExpansion.h +++ b/src/expansion/DigitalStSolidExpansion.h @@ -40,7 +40,9 @@ class DigitalStSolidExpansion : public DigitalExpansion char node_name[32] = {0}; snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); - auto const instance_ptr = std::make_shared(server, parent_node_id, display_name, node_name); + char model_name[] = {"AFX00006"}; + + auto const instance_ptr = std::make_shared(server, parent_node_id, display_name, node_name, model_name); return instance_ptr; } @@ -48,8 +50,9 @@ class DigitalStSolidExpansion : public DigitalExpansion DigitalStSolidExpansion(UA_Server * server, UA_NodeId const parent_node_id, char * display_name, - char * node_name) - : DigitalExpansion{server, parent_node_id, display_name, node_name} + char * node_name, + char * model_name) + : DigitalExpansion{server, parent_node_id, display_name, node_name, model_name} {} }; From 3b4618490126dab688904bfd9cb18c7ab2842446 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 07:20:50 +0200 Subject: [PATCH 31/35] Fix: regression, relays are not marked with "I". --- examples/opcua_server/opcua_server.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 347f702..8152df5 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -249,7 +249,7 @@ void setup() for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { char mech_relay_name[32] = {0}; - snprintf(mech_relay_name, sizeof(mech_relay_name), "Relay I%d", r + 1); + snprintf(mech_relay_name, sizeof(mech_relay_name), "Relay %d", r + 1); exp_dig->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } From 38abe0d4dbd0f61f4d1819ff2ee6b9ef884b5eec Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 07:36:23 +0200 Subject: [PATCH 32/35] Lay groundwork for exposing analog expansion as well. --- examples/opcua_server/opcua_server.ino | 4 + src/OptaExpansionManager.cpp | 11 +++ src/OptaExpansionManager.h | 4 +- src/expansion/AnalogExpansion.h | 65 +++++++++++++ src/expansion/DigitalExpansion.cpp | 96 ------------------- src/expansion/DigitalExpansion.h | 11 +-- src/expansion/Expansion.cpp | 123 +++++++++++++++++++++++++ src/expansion/Expansion.h | 53 +++++++++++ 8 files changed, 264 insertions(+), 103 deletions(-) create mode 100644 src/expansion/AnalogExpansion.h create mode 100644 src/expansion/Expansion.cpp create mode 100644 src/expansion/Expansion.h diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 8152df5..5c11230 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -253,6 +253,10 @@ void setup() exp_dig->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } + else if (exp_type == EXPANSION_OPTA_ANALOG) + { + auto const exp_analog = opta_expansion_manager_opcua->create_analog_expansion(i); + } } #if USE_MODBUS_SENSOR_MD02 diff --git a/src/OptaExpansionManager.cpp b/src/OptaExpansionManager.cpp index a1a2ff9..95d55cb 100644 --- a/src/OptaExpansionManager.cpp +++ b/src/OptaExpansionManager.cpp @@ -46,6 +46,17 @@ DigitalStSolidExpansion::SharedPtr OptaExpansionManager::create_digital_solid_st return exp_solid_state_opcua; } +AnalogExpansion::SharedPtr OptaExpansionManager::create_analog_expansion(uint8_t const exp_num) +{ + auto const exp_analog_opcua = opcua::AnalogExpansion::create( + _server, + UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), + exp_num); + + _analog_exp_list.push_back(exp_analog_opcua); + return exp_analog_opcua; +} + /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/OptaExpansionManager.h b/src/OptaExpansionManager.h index 69e93cd..c3fef8d 100644 --- a/src/OptaExpansionManager.h +++ b/src/OptaExpansionManager.h @@ -17,6 +17,7 @@ #include +#include "expansion/AnalogExpansion.h" #include "expansion/DigitalMechExpansion.h" #include "expansion/DigitalStSolidExpansion.h" @@ -49,13 +50,14 @@ class OptaExpansionManager DigitalMechExpansion::SharedPtr create_digital_mechanical_expansion(uint8_t const exp_num); DigitalStSolidExpansion::SharedPtr create_digital_solid_state_expansion(uint8_t const exp_num); - + AnalogExpansion::SharedPtr create_analog_expansion(uint8_t const exp_num); private: UA_Server * _server; std::list _dig_mech_exp_list; std::list _dig_solid_state_exp_list; + std::list _analog_exp_list; }; /************************************************************************************** diff --git a/src/expansion/AnalogExpansion.h b/src/expansion/AnalogExpansion.h new file mode 100644 index 0000000..60d7470 --- /dev/null +++ b/src/expansion/AnalogExpansion.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "Expansion.h" + +#include + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * CLASS DECLARATION + **************************************************************************************/ + +class AnalogExpansion : public Expansion +{ +public: + typedef std::shared_ptr SharedPtr; + + + static SharedPtr create(UA_Server *server, UA_NodeId const parent_node_id, uint8_t const exp_num) + { + char display_name[64] = {0}; + snprintf(display_name, sizeof(display_name), "Expansion %d: Analog", exp_num); + + char node_name[32] = {0}; + snprintf(node_name, sizeof(node_name), "AnaExp_%d", exp_num); + + char model_name[] = {"AFX00007"}; + + auto const instance_ptr = std::make_shared(server, parent_node_id, display_name, node_name, model_name); + return instance_ptr; + } + + + AnalogExpansion(UA_Server * server, + UA_NodeId const parent_node_id, + char * display_name, + char * node_name, + char * model_name) + : Expansion(server, parent_node_id, display_name, node_name, model_name) + { } +}; + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ diff --git a/src/expansion/DigitalExpansion.cpp b/src/expansion/DigitalExpansion.cpp index 3d12104..2b72d72 100644 --- a/src/expansion/DigitalExpansion.cpp +++ b/src/expansion/DigitalExpansion.cpp @@ -22,102 +22,6 @@ namespace opcua { -/************************************************************************************** - * PUBLIC MEMBER FUNCTIONS - **************************************************************************************/ - -DigitalExpansion::DigitalExpansion(UA_Server * server, - UA_NodeId const parent_node_id, - char * display_name, - char * node_name, - char * model_name) -: _server{server} -{ - UA_StatusCode rc = UA_STATUSCODE_GOOD; - - UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; - oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); - rc = UA_Server_addObjectNode(server, - UA_NODEID_NULL, - parent_node_id, - UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), - UA_QUALIFIEDNAME(1, node_name), - UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), - oAttr, - NULL, - &_node_id); - - if (UA_StatusCode_isBad(rc)) - { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "DigitalExpansion::Ctor: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); - return; - } - - UA_VariableAttributes mnAttr = UA_VariableAttributes_default; - UA_String manufacturerName = UA_STRING("Arduino"); - UA_Variant_setScalar(&mnAttr.value, &manufacturerName, &UA_TYPES[UA_TYPES_STRING]); - mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName"); - rc = UA_Server_addVariableNode(server, - UA_NODEID_NULL, - _node_id, - UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), - UA_QUALIFIEDNAME(1, "ManufacturerName"), - UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), - mnAttr, - NULL, - NULL); - if (UA_StatusCode_isBad(rc)) - { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "DigitalExpansion::Ctor: UA_Server_addVariableNode(..., \"ManufacturerName\", ...) failed with %s", - UA_StatusCode_name(rc)); - return; - } - - UA_VariableAttributes modelAttr = UA_VariableAttributes_default; - UA_String modelName = UA_STRING(model_name); - UA_Variant_setScalar(&modelAttr.value, &modelName, &UA_TYPES[UA_TYPES_STRING]); - modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName"); - rc = UA_Server_addVariableNode(server, - UA_NODEID_NULL, - _node_id, - UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), - UA_QUALIFIEDNAME(1, "ModelName"), - UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), - modelAttr, - NULL, - NULL); - if (UA_StatusCode_isBad(rc)) - { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "DigitalExpansion::Ctor: UA_Server_addVariableNode(..., \"ModelName\", ...) failed with %s", - UA_StatusCode_name(rc)); - return; - } - - UA_VariableAttributes statusAttr = UA_VariableAttributes_default; - UA_Boolean status = true; - UA_Variant_setScalar(&statusAttr.value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]); - statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status"); - rc = UA_Server_addVariableNode(server, - UA_NODEID_NULL, - _node_id, - UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), - UA_QUALIFIEDNAME(1, "Status"), - UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), - statusAttr, - NULL, - NULL); - if (UA_StatusCode_isBad(rc)) - { - UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, - "DigitalExpansion::Ctor: UA_Server_addVariableNode(..., \"Status\", ...) failed with %s", - UA_StatusCode_name(rc)); - return; - } -} - /************************************************************************************** * PUBLIC MEMBER FUNCTIONS **************************************************************************************/ diff --git a/src/expansion/DigitalExpansion.h b/src/expansion/DigitalExpansion.h index 88c1848..c44f173 100644 --- a/src/expansion/DigitalExpansion.h +++ b/src/expansion/DigitalExpansion.h @@ -13,7 +13,7 @@ * INCLUDE **************************************************************************************/ -#include "../open62541.h" +#include "Expansion.h" #include @@ -32,7 +32,7 @@ namespace opcua * CLASS DECLARATION **************************************************************************************/ -class DigitalExpansion +class DigitalExpansion : public Expansion { public: typedef std::shared_ptr SharedPtr; @@ -42,7 +42,9 @@ class DigitalExpansion UA_NodeId const parent_node_id, char * display_name, char * node_name, - char * model_name); + char * model_name) + : Expansion(server, parent_node_id, display_name, node_name, model_name) + { } AnalogInputManager::SharedPtr analog_input_mgr(); @@ -51,9 +53,6 @@ class DigitalExpansion private: - UA_Server * _server; - UA_NodeId _node_id; - AnalogInputManager::SharedPtr _analog_input_mgr; DigitalInputManager::SharedPtr _digital_input_mgr; RelayManager::SharedPtr _relay_mgr; diff --git a/src/expansion/Expansion.cpp b/src/expansion/Expansion.cpp new file mode 100644 index 0000000..0e4bd36 --- /dev/null +++ b/src/expansion/Expansion.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "Expansion.h" + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * PUBLIC MEMBER FUNCTIONS + **************************************************************************************/ + +Expansion::Expansion(UA_Server * server, + UA_NodeId const parent_node_id, + char * display_name, + char * node_name, + char * model_name) + : _server{server} +{ + UA_StatusCode rc = UA_STATUSCODE_GOOD; + + UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; + oAttr.displayName = UA_LOCALIZEDTEXT("en-US", display_name); + rc = UA_Server_addObjectNode(server, + UA_NODEID_NULL, + parent_node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), + UA_QUALIFIEDNAME(1, node_name), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), + oAttr, + NULL, + &_node_id); + + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Expansion::Ctor: UA_Server_addObjectNode(...) failed with %s", UA_StatusCode_name(rc)); + return; + } + + UA_VariableAttributes mnAttr = UA_VariableAttributes_default; + UA_String manufacturerName = UA_STRING("Arduino"); + UA_Variant_setScalar(&mnAttr.value, &manufacturerName, &UA_TYPES[UA_TYPES_STRING]); + mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName"); + rc = UA_Server_addVariableNode(server, + UA_NODEID_NULL, + _node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_QUALIFIEDNAME(1, "ManufacturerName"), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + mnAttr, + NULL, + NULL); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Expansion::Ctor: UA_Server_addVariableNode(..., \"ManufacturerName\", ...) failed with %s", + UA_StatusCode_name(rc)); + return; + } + + UA_VariableAttributes modelAttr = UA_VariableAttributes_default; + UA_String modelName = UA_STRING(model_name); + UA_Variant_setScalar(&modelAttr.value, &modelName, &UA_TYPES[UA_TYPES_STRING]); + modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName"); + rc = UA_Server_addVariableNode(server, + UA_NODEID_NULL, + _node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_QUALIFIEDNAME(1, "ModelName"), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + modelAttr, + NULL, + NULL); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Expansion::Ctor: UA_Server_addVariableNode(..., \"ModelName\", ...) failed with %s", + UA_StatusCode_name(rc)); + return; + } + + UA_VariableAttributes statusAttr = UA_VariableAttributes_default; + UA_Boolean status = true; + UA_Variant_setScalar(&statusAttr.value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]); + statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status"); + rc = UA_Server_addVariableNode(server, + UA_NODEID_NULL, + _node_id, + UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), + UA_QUALIFIEDNAME(1, "Status"), + UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), + statusAttr, + NULL, + NULL); + if (UA_StatusCode_isBad(rc)) + { + UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, + "Expansion::Ctor: UA_Server_addVariableNode(..., \"Status\", ...) failed with %s", + UA_StatusCode_name(rc)); + return; + } +} + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ diff --git a/src/expansion/Expansion.h b/src/expansion/Expansion.h new file mode 100644 index 0000000..9ead3ca --- /dev/null +++ b/src/expansion/Expansion.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024 Arduino + * + * SPDX-License-Identifier: MPL-2.0 + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +/************************************************************************************** + * INCLUDE + **************************************************************************************/ + +#include "../open62541.h" + +#include + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +namespace opcua +{ + +/************************************************************************************** + * CLASS DECLARATION + **************************************************************************************/ + +class Expansion +{ +public: + typedef std::shared_ptr SharedPtr; + + + Expansion(UA_Server * server, + UA_NodeId const parent_node_id, + char * display_name, + char * node_name, + char * model_name); + + +protected: + UA_Server * _server; + UA_NodeId _node_id; +}; + +/************************************************************************************** + * NAMESPACE + **************************************************************************************/ + +} /* opcua */ From e6ff951726465b10daf64a1bb50f26238c07f396 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Fri, 26 Jul 2024 07:39:06 +0200 Subject: [PATCH 33/35] Write full name incl Arduino Opta for object node name. --- src/expansion/AnalogExpansion.h | 2 +- src/expansion/DigitalMechExpansion.h | 2 +- src/expansion/DigitalStSolidExpansion.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/expansion/AnalogExpansion.h b/src/expansion/AnalogExpansion.h index 60d7470..2cacc67 100644 --- a/src/expansion/AnalogExpansion.h +++ b/src/expansion/AnalogExpansion.h @@ -37,7 +37,7 @@ class AnalogExpansion : public Expansion static SharedPtr create(UA_Server *server, UA_NodeId const parent_node_id, uint8_t const exp_num) { char display_name[64] = {0}; - snprintf(display_name, sizeof(display_name), "Expansion %d: Analog", exp_num); + snprintf(display_name, sizeof(display_name), "Arduino Opta Expansion %d: Analog", exp_num); char node_name[32] = {0}; snprintf(node_name, sizeof(node_name), "AnaExp_%d", exp_num); diff --git a/src/expansion/DigitalMechExpansion.h b/src/expansion/DigitalMechExpansion.h index ba99223..8908487 100644 --- a/src/expansion/DigitalMechExpansion.h +++ b/src/expansion/DigitalMechExpansion.h @@ -35,7 +35,7 @@ class DigitalMechExpansion : public DigitalExpansion static SharedPtr create(UA_Server *server, UA_NodeId const parent_node_id, uint8_t const exp_num) { char display_name[64] = {0}; - snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Mechanical)", exp_num); + snprintf(display_name, sizeof(display_name), "Arduino Opta Expansion %d: Digital (Mechanical)", exp_num); char node_name[32] = {0}; snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); diff --git a/src/expansion/DigitalStSolidExpansion.h b/src/expansion/DigitalStSolidExpansion.h index b6c0cb9..a458fef 100644 --- a/src/expansion/DigitalStSolidExpansion.h +++ b/src/expansion/DigitalStSolidExpansion.h @@ -35,7 +35,7 @@ class DigitalStSolidExpansion : public DigitalExpansion static SharedPtr create(UA_Server *server, UA_NodeId const parent_node_id, uint8_t const exp_num) { char display_name[64] = {0}; - snprintf(display_name, sizeof(display_name), "Expansion %d: Digital (Solid State)", exp_num); + snprintf(display_name, sizeof(display_name), "Arduino Opta Expansion %d: Digital (Solid State)", exp_num); char node_name[32] = {0}; snprintf(node_name, sizeof(node_name), "DigExpSoli_%d", exp_num); From 29edc1da8401fcf4e530fc431daf707e4ec40305 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 30 Jul 2024 10:07:00 +0200 Subject: [PATCH 34/35] Fix: can and should reinterpret cast to base class. --- examples/opcua_server/opcua_server.ino | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/opcua_server/opcua_server.ino b/examples/opcua_server/opcua_server.ino index 5c11230..c79818e 100644 --- a/examples/opcua_server/opcua_server.ino +++ b/examples/opcua_server/opcua_server.ino @@ -239,18 +239,20 @@ void setup() { char analog_in_name[32] = {0}; snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input I%d", d + 1); - exp_dig->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); + exp_dig->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->pinVoltage(d); }); char digital_in_name[32] = {0}; snprintf(digital_in_name, sizeof(digital_in_name), "Digital Input I%d", d + 1); - exp_dig->digital_input_mgr()->add_digital_input(opc_ua_server, digital_in_name, [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); + exp_dig->digital_input_mgr()->add_digital_input(opc_ua_server, + digital_in_name, + [i, d]() { return reinterpret_cast(OptaController.getExpansionPtr(i))->digitalRead(d, true); }); } /* Expose mechanical relays via OPC/UA. */ for (uint8_t r = 0; r < OPTA_DIGITAL_OUT_NUM; r++) { char mech_relay_name[32] = {0}; snprintf(mech_relay_name, sizeof(mech_relay_name), "Relay %d", r + 1); - exp_dig->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); + exp_dig->relay_mgr()->add_relay_output(opc_ua_server, mech_relay_name, [i, r](bool const value) { reinterpret_cast(OptaController.getExpansionPtr(i))->digitalWrite(r, value ? HIGH : LOW); }); } } else if (exp_type == EXPANSION_OPTA_ANALOG) From 238cb0fc66e8a1a4c15aaf3345046b42ec4d0419 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 30 Jul 2024 10:11:34 +0200 Subject: [PATCH 35/35] Opta: display model name as object node name and SKU as ModelName. --- src/Opta.cpp | 4 ++-- src/OptaVariant.cpp | 11 +++++++++++ src/OptaVariant.h | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Opta.cpp b/src/Opta.cpp index b9d8a82..be58299 100644 --- a/src/Opta.cpp +++ b/src/Opta.cpp @@ -46,7 +46,7 @@ Opta::SharedPtr Opta::create(UA_Server * server, OptaVariant::Type const opta_ty UA_StatusCode rc = UA_STATUSCODE_GOOD; UA_ObjectAttributes oAttr = UA_ObjectAttributes_default; - oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Arduino Opta"); + oAttr.displayName = UA_LOCALIZEDTEXT("en-US", (char *)OptaVariant::toString(opta_type).c_str()); UA_NodeId node_id; rc = UA_Server_addObjectNode(server, UA_NODEID_NULL, @@ -87,7 +87,7 @@ Opta::SharedPtr Opta::create(UA_Server * server, OptaVariant::Type const opta_ty } UA_VariableAttributes modelAttr = UA_VariableAttributes_default; - UA_String modelName = UA_STRING((char *)OptaVariant::toString(opta_type).c_str()); + UA_String modelName = UA_STRING((char *)OptaVariant::toSKUString(opta_type).c_str()); UA_Variant_setScalar(&modelAttr.value, &modelName, &UA_TYPES[UA_TYPES_STRING]); modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName"); rc = UA_Server_addVariableNode(server, diff --git a/src/OptaVariant.cpp b/src/OptaVariant.cpp index 8d1e7e0..4c8e751 100644 --- a/src/OptaVariant.cpp +++ b/src/OptaVariant.cpp @@ -62,6 +62,17 @@ std::string OptaVariant::toString(Type const type) } } +std::string OptaVariant::toSKUString(Type const type) +{ + switch(type) + { + case OptaVariant::Type::WiFi: return std::string("AFX00002"); break; + case OptaVariant::Type::RS485: return std::string("AFX00001"); break; + case OptaVariant::Type::Lite: return std::string("AFX00003"); break; + default: __builtin_unreachable(); break; + } +} + /************************************************************************************** * NAMESPACE **************************************************************************************/ diff --git a/src/OptaVariant.h b/src/OptaVariant.h index 3724979..719da3c 100644 --- a/src/OptaVariant.h +++ b/src/OptaVariant.h @@ -37,6 +37,7 @@ class OptaVariant static bool get_opta_variant(Type & type); static std::string toString(Type const type); + static std::string toSKUString(Type const type); }; /**************************************************************************************