From 47cddb27f9eb130e9cb4ee69236304fa0f110914 Mon Sep 17 00:00:00 2001 From: Rory Yorke Date: Wed, 8 Dec 2021 14:29:57 +0200 Subject: [PATCH 1/6] Make std::string use explicit in src/opendnp3/outstation/MeasurementConfig.h --- src/opendnp3/outstation/MeasurementConfig.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/opendnp3/outstation/MeasurementConfig.h b/src/opendnp3/outstation/MeasurementConfig.h index 04b39707e..2b5e5130b 100644 --- a/src/opendnp3/outstation/MeasurementConfig.h +++ b/src/opendnp3/outstation/MeasurementConfig.h @@ -31,6 +31,7 @@ #ifndef PYDNP3_OPENDNP3_OUTSTATION_MEASUREMENTCONFIG_H #define PYDNP3_OPENDNP3_OUTSTATION_MEASUREMENTCONFIG_H +#include #include #include @@ -41,7 +42,7 @@ namespace py = pybind11; template -void declareStaticConfig(py::module &m, string const &type) +void declareStaticConfig(py::module &m, std::string const &type) { // ----- struct: opendnp3::StaticConfig ----- py::class_, opendnp3::IndexConfig>(m, ("StaticConfig" + type).c_str(), @@ -63,7 +64,7 @@ void declareStaticConfig(py::module &m, string const &type) } template -void declareEventConfig(py::module &m, string const &type) +void declareEventConfig(py::module &m, std::string const &type) { declareStaticConfig(m, type); @@ -91,7 +92,7 @@ void declareEventConfig(py::module &m, string const &type) } template -void declareDeadbandConfig(py::module &m, string const &type) +void declareDeadbandConfig(py::module &m, std::string const &type) { declareEventConfig(m, type); From 07e601f2f35c809f1c86985efd9fd2fb441814c4 Mon Sep 17 00:00:00 2001 From: Rory Yorke Date: Wed, 8 Dec 2021 14:30:51 +0200 Subject: [PATCH 2/6] Add required includes to src/opendnp3/app/parsing/ICollection.h --- src/opendnp3/app/parsing/ICollection.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/opendnp3/app/parsing/ICollection.h b/src/opendnp3/app/parsing/ICollection.h index 0d68ad058..cf5bc01c7 100644 --- a/src/opendnp3/app/parsing/ICollection.h +++ b/src/opendnp3/app/parsing/ICollection.h @@ -34,7 +34,10 @@ #include #include + #include +#include +#include #include #ifdef PYDNP3_OPENDNP3 From 1157a1e1eb00dbc1bda9ac816eb19c6d0ef1dbf4 Mon Sep 17 00:00:00 2001 From: Rory Yorke Date: Wed, 8 Dec 2021 14:31:19 +0200 Subject: [PATCH 3/6] Split src/pydnp3opendnp3.cpp to reduce compiler memory use --- CMakeLists.txt | 18 +++- src/pydnp3opendnp3.cpp | 138 ++----------------------------- src/pydnp3opendnp3_1.cpp | 174 +++++++++++++++++++++++++++++++++++++++ src/pydnp3opendnp3_1.hpp | 8 ++ src/pydnp3opendnp3_2.cpp | 139 +++++++++++++++++++++++++++++++ src/pydnp3opendnp3_2.hpp | 8 ++ src/pydnp3opendnp3_3.cpp | 105 +++++++++++++++++++++++ src/pydnp3opendnp3_3.hpp | 8 ++ src/pydnp3opendnp3_4.cpp | 72 ++++++++++++++++ src/pydnp3opendnp3_4.hpp | 8 ++ 10 files changed, 545 insertions(+), 133 deletions(-) create mode 100644 src/pydnp3opendnp3_1.cpp create mode 100644 src/pydnp3opendnp3_1.hpp create mode 100644 src/pydnp3opendnp3_2.cpp create mode 100644 src/pydnp3opendnp3_2.hpp create mode 100644 src/pydnp3opendnp3_3.cpp create mode 100644 src/pydnp3opendnp3_3.hpp create mode 100644 src/pydnp3opendnp3_4.cpp create mode 100644 src/pydnp3opendnp3_4.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 310d8e97b..827b69286 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,7 @@ endif() message("CMake build is: ${CMAKE_BUILD_TYPE}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") #include(${PROJECT_SOURCE_DIR}/settings.cmake) @@ -44,8 +45,17 @@ include_directories(deps/dnp3/cpp/libs/src) include_directories(deps/dnp3/deps/asio/asio/include) add_definitions(-DASIO_STANDALONE) -pybind11_add_module(pydnp3 MODULE src/pydnp3.cpp src/pydnp3asiodnp3.cpp src/pydnp3asiopal.cpp src/pydnp3opendnp3.cpp src/pydnp3openpal.cpp) +pybind11_add_module(pydnp3 + MODULE + src/pydnp3.cpp + src/pydnp3asiodnp3.cpp + src/pydnp3asiopal.cpp + src/pydnp3opendnp3.cpp + src/pydnp3opendnp3_1.cpp + src/pydnp3opendnp3_2.cpp + src/pydnp3opendnp3_3.cpp + src/pydnp3opendnp3_4.cpp + src/pydnp3openpal.cpp + +) target_link_libraries(pydnp3 PRIVATE asiopal asiodnp3 openpal opendnp3) - - - diff --git a/src/pydnp3opendnp3.cpp b/src/pydnp3opendnp3.cpp index d43249500..68a8ca31f 100644 --- a/src/pydnp3opendnp3.cpp +++ b/src/pydnp3opendnp3.cpp @@ -28,139 +28,19 @@ * }}} */ -#include -#include -#include -#include - #include -#include "opendnp3/AllHeaders.h" +#include "pydnp3opendnp3_1.hpp" +#include "pydnp3opendnp3_2.hpp" +#include "pydnp3opendnp3_3.hpp" +#include "pydnp3opendnp3_4.hpp" namespace py = pybind11; void init_opendnp3(py::module &opendnp3) { - // -------------------- PYDNP3.OPENDNP3 -------------------- - bind_OpendnpLogLevels(opendnp3); - bind_StackStatistics(opendnp3); - bind_AnalogOutputStatusQuality(opendnp3); - bind_AnalogQuality(opendnp3); - bind_AssignClassType(opendnp3); - bind_GroupVariation(opendnp3); - bind_Attributes(opendnp3); - bind_AuthErrorCode(opendnp3); - bind_BinaryOutputStatusQuality(opendnp3); - bind_BinaryQuality(opendnp3); - bind_CertificateType(opendnp3); - bind_ChallengeReason(opendnp3); - bind_ChannelState(opendnp3); - bind_CommandPointState(opendnp3); - bind_CommandStatus(opendnp3); - bind_ConfigAuthMode(opendnp3); - bind_ControlCode(opendnp3); - bind_CounterQuality(opendnp3); - bind_DoubleBit(opendnp3); - bind_DoubleBitBinaryQuality(opendnp3); - bind_EventAnalogOutputStatusVariation(opendnp3); - bind_EventAnalogVariation(opendnp3); - bind_EventBinaryOutputStatusVariation(opendnp3); - bind_EventBinaryVariation(opendnp3); - bind_EventCounterVariation(opendnp3); - bind_EventDoubleBinaryVariation(opendnp3); - bind_EventFrozenCounterVariation(opendnp3); - bind_EventMode(opendnp3); - bind_EventSecurityStatVariation(opendnp3); - bind_FlagsType(opendnp3); - bind_FlowControl(opendnp3); - bind_FrozenCounterQuality(opendnp3); - bind_FunctionCode(opendnp3); - bind_HMACType(opendnp3); - bind_IndexMode(opendnp3); - bind_IntervalUnits(opendnp3); - bind_KeyChangeMethod(opendnp3); - bind_KeyStatus(opendnp3); - bind_KeyWrapAlgorithm(opendnp3); - bind_LinkFunction(opendnp3); - bind_LinkStatus(opendnp3); - bind_MasterTaskType(opendnp3); - bind_OperateType(opendnp3); - bind_Parity(opendnp3); - bind_PointClass(opendnp3); - bind_QualifierCode(opendnp3); - bind_RestartMode(opendnp3); - bind_RestartType(opendnp3); - bind_SecurityStatIndex(opendnp3); - bind_StaticAnalogOutputStatusVariation(opendnp3); - bind_StaticAnalogVariation(opendnp3); - bind_StaticBinaryOutputStatusVariation(opendnp3); - bind_StaticBinaryVariation(opendnp3); - bind_StaticCounterVariation(opendnp3); - bind_StaticDoubleBinaryVariation(opendnp3); - bind_StaticFrozenCounterVariation(opendnp3); - bind_StaticSecurityStatVariation(opendnp3); - bind_StaticTimeAndIntervalVariation(opendnp3); - bind_StaticTypeBitmask(opendnp3); - bind_StopBits(opendnp3); - bind_TaskCompletion(opendnp3); - bind_TimeSyncMode(opendnp3); - bind_TimestampMode(opendnp3); - bind_UserOperation(opendnp3); - bind_UserRole(opendnp3); - bind_ILinkListener(opendnp3); - bind_LinkConfig(opendnp3); - bind_LinkHeaderFields(opendnp3); - bind_LinkStatistics(opendnp3); - bind_GroupVariationID(opendnp3); - bind_ICollection(opendnp3); - bind_DNPTime(opendnp3); - bind_AnalogCommandEvent(opendnp3); - bind_AnalogOutput(opendnp3); - bind_AppConstants(opendnp3); - bind_QualityMasks(opendnp3); - bind_Flags(opendnp3); - bind_BaseMeasurementTypes(opendnp3); - bind_BinaryCommandEvent(opendnp3); - bind_EventType(opendnp3); - bind_ClassField(opendnp3); - bind_ControlRelayOutputBlock(opendnp3); - bind_EventCells(opendnp3); //@todo: DeadbandEventCell - bind_EventTriggers(opendnp3); - bind_IINField(opendnp3); - bind_ITransactable(opendnp3); - bind_Indexed(opendnp3); - bind_MeasurementTypes(opendnp3); - bind_SecurityStat(opendnp3); - bind_MeasurementInfo(opendnp3); - bind_MeasurementConfig(opendnp3); - bind_MeasurementTypeSpecs(opendnp3); - bind_OctetData(opendnp3); - bind_OctetString(opendnp3); - bind_ApplicationIIN(opendnp3); - bind_Cell(opendnp3); - bind_DatabaseSizes(opendnp3); - bind_EventBufferConfig(opendnp3); - bind_ICommandHandler(opendnp3); - bind_IOutstationApplication(opendnp3); - bind_IUpdateHandler(opendnp3); - bind_StaticTypeBitfield(opendnp3); - bind_OutstationParams(opendnp3); - bind_OutstationConfig(opendnp3); - bind_SimpleCommandHandler(opendnp3); - bind_CommandPointResult(opendnp3); - bind_ICommandTaskResult(opendnp3); - bind_CommandCallbackT(opendnp3); - bind_ICommandCollection(opendnp3); - bind_CommandSet(opendnp3); - bind_HeaderInfo(opendnp3); - bind_HeaderTypes(opendnp3); - bind_TaskId(opendnp3); - bind_ITaskCallback(opendnp3); - bind_TaskConfig(opendnp3); - bind_ICommandProcessor(opendnp3); - bind_TaskInfo(opendnp3); - bind_IMasterApplication(opendnp3); - bind_ISOEHandler(opendnp3); - bind_MasterParams(opendnp3); - bind_RestartOperationResult(opendnp3); -} \ No newline at end of file + init_opendnp3_1(opendnp3); + init_opendnp3_2(opendnp3); + init_opendnp3_3(opendnp3); + init_opendnp3_4(opendnp3); +} diff --git a/src/pydnp3opendnp3_1.cpp b/src/pydnp3opendnp3_1.cpp new file mode 100644 index 000000000..b2c299adb --- /dev/null +++ b/src/pydnp3opendnp3_1.cpp @@ -0,0 +1,174 @@ +#include "pydnp3opendnp3_1.hpp" + +#define PYDNP3_OPENDNP3 + +#include "opendnp3/LogLevels.h" +#include "opendnp3/StackStatistics.h" +#include "opendnp3/gen/AnalogOutputStatusQuality.h" +#include "opendnp3/gen/AnalogQuality.h" +#include "opendnp3/gen/AssignClassType.h" +#include "opendnp3/gen/GroupVariation.h" +#include "opendnp3/gen/Attributes.h" +#include "opendnp3/gen/AuthErrorCode.h" +#include "opendnp3/gen/BinaryOutputStatusQuality.h" +#include "opendnp3/gen/BinaryQuality.h" +#include "opendnp3/gen/CertificateType.h" +#include "opendnp3/gen/ChallengeReason.h" +#include "opendnp3/gen/ChannelState.h" +#include "opendnp3/gen/CommandPointState.h" +#include "opendnp3/gen/CommandStatus.h" +#include "opendnp3/gen/ConfigAuthMode.h" +#include "opendnp3/gen/ControlCode.h" +#include "opendnp3/gen/CounterQuality.h" +#include "opendnp3/gen/DoubleBit.h" +#include "opendnp3/gen/DoubleBitBinaryQuality.h" +#include "opendnp3/gen/EventAnalogOutputStatusVariation.h" +#include "opendnp3/gen/EventAnalogVariation.h" +#include "opendnp3/gen/EventBinaryOutputStatusVariation.h" +#include "opendnp3/gen/EventBinaryVariation.h" +#include "opendnp3/gen/EventCounterVariation.h" +#include "opendnp3/gen/EventDoubleBinaryVariation.h" +#include "opendnp3/gen/EventFrozenCounterVariation.h" +#include "opendnp3/gen/EventMode.h" +#include "opendnp3/gen/EventSecurityStatVariation.h" +#include "opendnp3/gen/FlagsType.h" + +namespace py = pybind11; + +void init_opendnp3_1(py::module &opendnp3) +{ + // -------------------- PYDNP3.OPENDNP3 -------------------- + bind_OpendnpLogLevels(opendnp3); + bind_StackStatistics(opendnp3); + bind_AnalogOutputStatusQuality(opendnp3); + bind_AnalogQuality(opendnp3); + bind_AssignClassType(opendnp3); + bind_GroupVariation(opendnp3); + bind_Attributes(opendnp3); + bind_AuthErrorCode(opendnp3); + bind_BinaryOutputStatusQuality(opendnp3); + bind_BinaryQuality(opendnp3); + bind_CertificateType(opendnp3); + bind_ChallengeReason(opendnp3); + bind_ChannelState(opendnp3); + bind_CommandPointState(opendnp3); + bind_CommandStatus(opendnp3); + bind_ConfigAuthMode(opendnp3); + bind_ControlCode(opendnp3); + bind_CounterQuality(opendnp3); + bind_DoubleBit(opendnp3); + bind_DoubleBitBinaryQuality(opendnp3); + bind_EventAnalogOutputStatusVariation(opendnp3); + bind_EventAnalogVariation(opendnp3); + bind_EventBinaryOutputStatusVariation(opendnp3); + bind_EventBinaryVariation(opendnp3); + bind_EventCounterVariation(opendnp3); + bind_EventDoubleBinaryVariation(opendnp3); + bind_EventFrozenCounterVariation(opendnp3); + bind_EventMode(opendnp3); + bind_EventSecurityStatVariation(opendnp3); + bind_FlagsType(opendnp3); +} + +// void init_opendnp3_2(py::module &opendnp3) +// { +// bind_FlowControl(opendnp3); +// bind_FrozenCounterQuality(opendnp3); +// bind_FunctionCode(opendnp3); +// bind_HMACType(opendnp3); +// bind_IndexMode(opendnp3); +// bind_IntervalUnits(opendnp3); +// bind_KeyChangeMethod(opendnp3); +// bind_KeyStatus(opendnp3); +// bind_KeyWrapAlgorithm(opendnp3); +// bind_LinkFunction(opendnp3); +// bind_LinkStatus(opendnp3); +// bind_MasterTaskType(opendnp3); +// bind_OperateType(opendnp3); +// bind_Parity(opendnp3); +// bind_PointClass(opendnp3); +// bind_QualifierCode(opendnp3); +// bind_RestartMode(opendnp3); +// bind_RestartType(opendnp3); +// bind_SecurityStatIndex(opendnp3); +// bind_StaticAnalogOutputStatusVariation(opendnp3); +// bind_StaticAnalogVariation(opendnp3); +// bind_StaticBinaryOutputStatusVariation(opendnp3); +// bind_StaticBinaryVariation(opendnp3); +// bind_StaticCounterVariation(opendnp3); +// bind_StaticDoubleBinaryVariation(opendnp3); +// bind_StaticFrozenCounterVariation(opendnp3); +// bind_StaticSecurityStatVariation(opendnp3); +// bind_StaticTimeAndIntervalVariation(opendnp3); +// bind_StaticTypeBitmask(opendnp3); +// bind_StopBits(opendnp3); +// } + +// void init_opendnp3_3(py::module &opendnp3) +// { +// bind_TaskCompletion(opendnp3); +// bind_TimeSyncMode(opendnp3); +// bind_TimestampMode(opendnp3); +// bind_UserOperation(opendnp3); +// bind_UserRole(opendnp3); +// bind_ILinkListener(opendnp3); +// bind_LinkConfig(opendnp3); +// bind_LinkHeaderFields(opendnp3); +// bind_LinkStatistics(opendnp3); +// bind_GroupVariationID(opendnp3); +// bind_ICollection(opendnp3); +// bind_DNPTime(opendnp3); +// bind_AnalogCommandEvent(opendnp3); +// bind_AnalogOutput(opendnp3); +// bind_AppConstants(opendnp3); +// bind_QualityMasks(opendnp3); +// bind_Flags(opendnp3); +// bind_BaseMeasurementTypes(opendnp3); +// bind_BinaryCommandEvent(opendnp3); +// bind_EventType(opendnp3); +// bind_ClassField(opendnp3); +// bind_ControlRelayOutputBlock(opendnp3); +// bind_EventCells(opendnp3); //@todo: DeadbandEventCell +// bind_EventTriggers(opendnp3); +// bind_IINField(opendnp3); +// bind_ITransactable(opendnp3); +// bind_Indexed(opendnp3); +// bind_MeasurementTypes(opendnp3); +// bind_SecurityStat(opendnp3); +// bind_MeasurementInfo(opendnp3); +// } + +// void init_opendnp3_4(py::module &opendnp3) +// { +// bind_MeasurementConfig(opendnp3); +// bind_MeasurementTypeSpecs(opendnp3); +// bind_OctetData(opendnp3); +// bind_OctetString(opendnp3); +// bind_ApplicationIIN(opendnp3); +// bind_Cell(opendnp3); +// bind_DatabaseSizes(opendnp3); +// bind_EventBufferConfig(opendnp3); +// bind_ICommandHandler(opendnp3); +// bind_IOutstationApplication(opendnp3); +// bind_IUpdateHandler(opendnp3); +// bind_StaticTypeBitfield(opendnp3); +// bind_OutstationParams(opendnp3); +// bind_OutstationConfig(opendnp3); +// bind_SimpleCommandHandler(opendnp3); +// bind_CommandPointResult(opendnp3); +// bind_ICommandTaskResult(opendnp3); +// bind_CommandCallbackT(opendnp3); +// bind_ICommandCollection(opendnp3); +// bind_CommandSet(opendnp3); +// bind_HeaderInfo(opendnp3); +// bind_HeaderTypes(opendnp3); +// bind_TaskId(opendnp3); +// bind_ITaskCallback(opendnp3); +// bind_TaskConfig(opendnp3); +// bind_ICommandProcessor(opendnp3); +// bind_TaskInfo(opendnp3); +// bind_IMasterApplication(opendnp3); +// bind_ISOEHandler(opendnp3); +// bind_MasterParams(opendnp3); +// bind_RestartOperationResult(opendnp3); +// } diff --git a/src/pydnp3opendnp3_1.hpp b/src/pydnp3opendnp3_1.hpp new file mode 100644 index 000000000..2d5da6591 --- /dev/null +++ b/src/pydnp3opendnp3_1.hpp @@ -0,0 +1,8 @@ +#ifndef PYDNP3OPENDNP3_1_HPP +#define PYDNP3OPENDNP3_1_HPP + +#include + +void init_opendnp3_1(pybind11::module &opendnp3); + +#endif /* PYDNP3OPENDNP3_1_HPP */ diff --git a/src/pydnp3opendnp3_2.cpp b/src/pydnp3opendnp3_2.cpp new file mode 100644 index 000000000..d9ad65981 --- /dev/null +++ b/src/pydnp3opendnp3_2.cpp @@ -0,0 +1,139 @@ +#include "pydnp3opendnp3_2.hpp" + +#define PYDNP3_OPENDNP3 + +#include "opendnp3/gen/FlowControl.h" +#include "opendnp3/gen/FrozenCounterQuality.h" +#include "opendnp3/gen/FunctionCode.h" +#include "opendnp3/gen/HMACType.h" +#include "opendnp3/gen/IndexMode.h" +#include "opendnp3/gen/IntervalUnits.h" +#include "opendnp3/gen/KeyChangeMethod.h" +#include "opendnp3/gen/KeyStatus.h" +#include "opendnp3/gen/KeyWrapAlgorithm.h" +#include "opendnp3/gen/LinkFunction.h" +#include "opendnp3/gen/LinkStatus.h" +#include "opendnp3/gen/MasterTaskType.h" +#include "opendnp3/gen/OperateType.h" +#include "opendnp3/gen/Parity.h" +#include "opendnp3/gen/PointClass.h" +#include "opendnp3/gen/QualifierCode.h" +#include "opendnp3/gen/RestartMode.h" +#include "opendnp3/gen/RestartType.h" +#include "opendnp3/gen/SecurityStatIndex.h" +#include "opendnp3/gen/StaticAnalogOutputStatusVariation.h" +#include "opendnp3/gen/StaticAnalogVariation.h" +#include "opendnp3/gen/StaticBinaryOutputStatusVariation.h" +#include "opendnp3/gen/StaticBinaryVariation.h" +#include "opendnp3/gen/StaticCounterVariation.h" +#include "opendnp3/gen/StaticDoubleBinaryVariation.h" +#include "opendnp3/gen/StaticFrozenCounterVariation.h" +#include "opendnp3/gen/StaticSecurityStatVariation.h" +#include "opendnp3/gen/StaticTimeAndIntervalVariation.h" +#include "opendnp3/gen/StaticTypeBitmask.h" +#include "opendnp3/gen/StopBits.h" + +namespace py = pybind11; + +void init_opendnp3_2(py::module &opendnp3) +{ + bind_FlowControl(opendnp3); + bind_FrozenCounterQuality(opendnp3); + bind_FunctionCode(opendnp3); + bind_HMACType(opendnp3); + bind_IndexMode(opendnp3); + bind_IntervalUnits(opendnp3); + bind_KeyChangeMethod(opendnp3); + bind_KeyStatus(opendnp3); + bind_KeyWrapAlgorithm(opendnp3); + bind_LinkFunction(opendnp3); + bind_LinkStatus(opendnp3); + bind_MasterTaskType(opendnp3); + bind_OperateType(opendnp3); + bind_Parity(opendnp3); + bind_PointClass(opendnp3); + bind_QualifierCode(opendnp3); + bind_RestartMode(opendnp3); + bind_RestartType(opendnp3); + bind_SecurityStatIndex(opendnp3); + bind_StaticAnalogOutputStatusVariation(opendnp3); + bind_StaticAnalogVariation(opendnp3); + bind_StaticBinaryOutputStatusVariation(opendnp3); + bind_StaticBinaryVariation(opendnp3); + bind_StaticCounterVariation(opendnp3); + bind_StaticDoubleBinaryVariation(opendnp3); + bind_StaticFrozenCounterVariation(opendnp3); + bind_StaticSecurityStatVariation(opendnp3); + bind_StaticTimeAndIntervalVariation(opendnp3); + bind_StaticTypeBitmask(opendnp3); + bind_StopBits(opendnp3); +} + +// void init_opendnp3_3(py::module &opendnp3) +// { +// bind_TaskCompletion(opendnp3); +// bind_TimeSyncMode(opendnp3); +// bind_TimestampMode(opendnp3); +// bind_UserOperation(opendnp3); +// bind_UserRole(opendnp3); +// bind_ILinkListener(opendnp3); +// bind_LinkConfig(opendnp3); +// bind_LinkHeaderFields(opendnp3); +// bind_LinkStatistics(opendnp3); +// bind_GroupVariationID(opendnp3); +// bind_ICollection(opendnp3); +// bind_DNPTime(opendnp3); +// bind_AnalogCommandEvent(opendnp3); +// bind_AnalogOutput(opendnp3); +// bind_AppConstants(opendnp3); +// bind_QualityMasks(opendnp3); +// bind_Flags(opendnp3); +// bind_BaseMeasurementTypes(opendnp3); +// bind_BinaryCommandEvent(opendnp3); +// bind_EventType(opendnp3); +// bind_ClassField(opendnp3); +// bind_ControlRelayOutputBlock(opendnp3); +// bind_EventCells(opendnp3); //@todo: DeadbandEventCell +// bind_EventTriggers(opendnp3); +// bind_IINField(opendnp3); +// bind_ITransactable(opendnp3); +// bind_Indexed(opendnp3); +// bind_MeasurementTypes(opendnp3); +// bind_SecurityStat(opendnp3); +// bind_MeasurementInfo(opendnp3); +// } + +// void init_opendnp3_4(py::module &opendnp3) +// { +// bind_MeasurementConfig(opendnp3); +// bind_MeasurementTypeSpecs(opendnp3); +// bind_OctetData(opendnp3); +// bind_OctetString(opendnp3); +// bind_ApplicationIIN(opendnp3); +// bind_Cell(opendnp3); +// bind_DatabaseSizes(opendnp3); +// bind_EventBufferConfig(opendnp3); +// bind_ICommandHandler(opendnp3); +// bind_IOutstationApplication(opendnp3); +// bind_IUpdateHandler(opendnp3); +// bind_StaticTypeBitfield(opendnp3); +// bind_OutstationParams(opendnp3); +// bind_OutstationConfig(opendnp3); +// bind_SimpleCommandHandler(opendnp3); +// bind_CommandPointResult(opendnp3); +// bind_ICommandTaskResult(opendnp3); +// bind_CommandCallbackT(opendnp3); +// bind_ICommandCollection(opendnp3); +// bind_CommandSet(opendnp3); +// bind_HeaderInfo(opendnp3); +// bind_HeaderTypes(opendnp3); +// bind_TaskId(opendnp3); +// bind_ITaskCallback(opendnp3); +// bind_TaskConfig(opendnp3); +// bind_ICommandProcessor(opendnp3); +// bind_TaskInfo(opendnp3); +// bind_IMasterApplication(opendnp3); +// bind_ISOEHandler(opendnp3); +// bind_MasterParams(opendnp3); +// bind_RestartOperationResult(opendnp3); +// } diff --git a/src/pydnp3opendnp3_2.hpp b/src/pydnp3opendnp3_2.hpp new file mode 100644 index 000000000..48e6eab83 --- /dev/null +++ b/src/pydnp3opendnp3_2.hpp @@ -0,0 +1,8 @@ +#ifndef PYDNP3OPENDNP3_2_HPP +#define PYDNP3OPENDNP3_2_HPP + +#include + +void init_opendnp3_2(pybind11::module &opendnp3); + +#endif /* PYDNP3OPENDNP3_2_HPP */ diff --git a/src/pydnp3opendnp3_3.cpp b/src/pydnp3opendnp3_3.cpp new file mode 100644 index 000000000..4453d3cc2 --- /dev/null +++ b/src/pydnp3opendnp3_3.cpp @@ -0,0 +1,105 @@ +#include "pydnp3opendnp3_3.hpp" + +#define PYDNP3_OPENDNP3 + +#include "opendnp3/gen/TaskCompletion.h" +#include "opendnp3/gen/TimeSyncMode.h" +#include "opendnp3/gen/TimestampMode.h" +#include "opendnp3/gen/UserOperation.h" +#include "opendnp3/gen/UserRole.h" +#include "opendnp3/link/ILinkListener.h" +#include "opendnp3/link/LinkConfig.h" +#include "opendnp3/link/LinkHeaderFields.h" +#include "opendnp3/link/LinkStatistics.h" +#include "opendnp3/app/GroupVariationID.h" +#include "opendnp3/app/parsing/ICollection.h" +#include "opendnp3/app/DNPTime.h" +#include "opendnp3/app/AnalogCommandEvent.h" +#include "opendnp3/app/AnalogOutput.h" +#include "opendnp3/app/AppConstants.h" +#include "opendnp3/app/QualityMasks.h" +#include "opendnp3/app/Flags.h" +#include "opendnp3/app/BaseMeasurementTypes.h" +#include "opendnp3/app/BinaryCommandEvent.h" +#include "opendnp3/app/EventType.h" +#include "opendnp3/app/ClassField.h" +#include "opendnp3/app/ControlRelayOutputBlock.h" +#include "opendnp3/app/EventCells.h" +#include "opendnp3/app/EventTriggers.h" +#include "opendnp3/app/IINField.h" +#include "opendnp3/app/ITransactable.h" +#include "opendnp3/app/Indexed.h" +#include "opendnp3/app/MeasurementTypes.h" +#include "opendnp3/app/SecurityStat.h" +#include "opendnp3/app/MeasurementInfo.h" + +namespace py = pybind11; + +void init_opendnp3_3(py::module &opendnp3) +{ + bind_TaskCompletion(opendnp3); + bind_TimeSyncMode(opendnp3); + bind_TimestampMode(opendnp3); + bind_UserOperation(opendnp3); + bind_UserRole(opendnp3); + bind_ILinkListener(opendnp3); + bind_LinkConfig(opendnp3); + bind_LinkHeaderFields(opendnp3); + bind_LinkStatistics(opendnp3); + bind_GroupVariationID(opendnp3); + bind_ICollection(opendnp3); + bind_DNPTime(opendnp3); + bind_AnalogCommandEvent(opendnp3); + bind_AnalogOutput(opendnp3); + bind_AppConstants(opendnp3); + bind_QualityMasks(opendnp3); + bind_Flags(opendnp3); + bind_BaseMeasurementTypes(opendnp3); + bind_BinaryCommandEvent(opendnp3); + bind_EventType(opendnp3); + bind_ClassField(opendnp3); + bind_ControlRelayOutputBlock(opendnp3); + bind_EventCells(opendnp3); //@todo: DeadbandEventCell + bind_EventTriggers(opendnp3); + bind_IINField(opendnp3); + bind_ITransactable(opendnp3); + bind_Indexed(opendnp3); + bind_MeasurementTypes(opendnp3); + bind_SecurityStat(opendnp3); + bind_MeasurementInfo(opendnp3); +} + +// void init_opendnp3_4(py::module &opendnp3) +// { +// bind_MeasurementConfig(opendnp3); +// bind_MeasurementTypeSpecs(opendnp3); +// bind_OctetData(opendnp3); +// bind_OctetString(opendnp3); +// bind_ApplicationIIN(opendnp3); +// bind_Cell(opendnp3); +// bind_DatabaseSizes(opendnp3); +// bind_EventBufferConfig(opendnp3); +// bind_ICommandHandler(opendnp3); +// bind_IOutstationApplication(opendnp3); +// bind_IUpdateHandler(opendnp3); +// bind_StaticTypeBitfield(opendnp3); +// bind_OutstationParams(opendnp3); +// bind_OutstationConfig(opendnp3); +// bind_SimpleCommandHandler(opendnp3); +// bind_CommandPointResult(opendnp3); +// bind_ICommandTaskResult(opendnp3); +// bind_CommandCallbackT(opendnp3); +// bind_ICommandCollection(opendnp3); +// bind_CommandSet(opendnp3); +// bind_HeaderInfo(opendnp3); +// bind_HeaderTypes(opendnp3); +// bind_TaskId(opendnp3); +// bind_ITaskCallback(opendnp3); +// bind_TaskConfig(opendnp3); +// bind_ICommandProcessor(opendnp3); +// bind_TaskInfo(opendnp3); +// bind_IMasterApplication(opendnp3); +// bind_ISOEHandler(opendnp3); +// bind_MasterParams(opendnp3); +// bind_RestartOperationResult(opendnp3); +// } diff --git a/src/pydnp3opendnp3_3.hpp b/src/pydnp3opendnp3_3.hpp new file mode 100644 index 000000000..055919747 --- /dev/null +++ b/src/pydnp3opendnp3_3.hpp @@ -0,0 +1,8 @@ +#ifndef PYDNP3OPENDNP3_3_HPP +#define PYDNP3OPENDNP3_3_HPP + +#include + +void init_opendnp3_3(pybind11::module &opendnp3); + +#endif /* PYDNP3OPENDNP3_3_HPP */ diff --git a/src/pydnp3opendnp3_4.cpp b/src/pydnp3opendnp3_4.cpp new file mode 100644 index 000000000..f34ba6c45 --- /dev/null +++ b/src/pydnp3opendnp3_4.cpp @@ -0,0 +1,72 @@ +#include "pydnp3opendnp3_4.hpp" + +#define PYDNP3_OPENDNP3 + +#include "opendnp3/outstation/MeasurementConfig.h" +#include "opendnp3/app/MeasurementTypeSpecs.h" +#include "opendnp3/app/OctetData.h" +#include "opendnp3/app/OctetString.h" +#include "opendnp3/outstation/ApplicationIIN.h" +#include "opendnp3/outstation/Cell.h" +#include "opendnp3/outstation/DatabaseSizes.h" +#include "opendnp3/outstation/EventBufferConfig.h" +#include "opendnp3/outstation/ICommandHandler.h" +#include "opendnp3/outstation/IOutstationApplication.h" +#include "opendnp3/outstation/IUpdateHandler.h" +#include "opendnp3/outstation/StaticTypeBitfield.h" +#include "opendnp3/outstation/OutstationParams.h" +#include "opendnp3/outstation/OutstationConfig.h" +#include "opendnp3/outstation/SimpleCommandHandler.h" +#include "opendnp3/master/CommandPointResult.h" +#include "opendnp3/master/ICommandTaskResult.h" +#include "opendnp3/master/CommandCallbackT.h" +#include "opendnp3/master/ICommandCollection.h" +#include "opendnp3/master/CommandSet.h" +#include "opendnp3/master/HeaderInfo.h" +#include "opendnp3/master/HeaderTypes.h" +#include "opendnp3/master/TaskId.h" +#include "opendnp3/master/ITaskCallback.h" +#include "opendnp3/master/TaskConfig.h" +#include "opendnp3/master/ICommandProcessor.h" +#include "opendnp3/master/TaskInfo.h" +#include "opendnp3/master/IMasterApplication.h" +#include "opendnp3/master/ISOEHandler.h" +#include "opendnp3/master/MasterParams.h" +#include "opendnp3/master/RestartOperationResult.h" + +namespace py = pybind11; + +void init_opendnp3_4(py::module &opendnp3) +{ + bind_MeasurementConfig(opendnp3); + bind_MeasurementTypeSpecs(opendnp3); + bind_OctetData(opendnp3); + bind_OctetString(opendnp3); + bind_ApplicationIIN(opendnp3); + bind_Cell(opendnp3); + bind_DatabaseSizes(opendnp3); + bind_EventBufferConfig(opendnp3); + bind_ICommandHandler(opendnp3); + bind_IOutstationApplication(opendnp3); + bind_IUpdateHandler(opendnp3); + bind_StaticTypeBitfield(opendnp3); + bind_OutstationParams(opendnp3); + bind_OutstationConfig(opendnp3); + bind_SimpleCommandHandler(opendnp3); + bind_CommandPointResult(opendnp3); + bind_ICommandTaskResult(opendnp3); + bind_CommandCallbackT(opendnp3); + bind_ICommandCollection(opendnp3); + bind_CommandSet(opendnp3); + bind_HeaderInfo(opendnp3); + bind_HeaderTypes(opendnp3); + bind_TaskId(opendnp3); + bind_ITaskCallback(opendnp3); + bind_TaskConfig(opendnp3); + bind_ICommandProcessor(opendnp3); + bind_TaskInfo(opendnp3); + bind_IMasterApplication(opendnp3); + bind_ISOEHandler(opendnp3); + bind_MasterParams(opendnp3); + bind_RestartOperationResult(opendnp3); +} diff --git a/src/pydnp3opendnp3_4.hpp b/src/pydnp3opendnp3_4.hpp new file mode 100644 index 000000000..99b959f87 --- /dev/null +++ b/src/pydnp3opendnp3_4.hpp @@ -0,0 +1,8 @@ +#ifndef PYDNP3OPENDNP3_4_HPP +#define PYDNP3OPENDNP3_4_HPP + +#include + +void init_opendnp3_4(pybind11::module &opendnp3); + +#endif /* PYDNP3OPENDNP3_4_HPP */ From 5f2f648aa5f40e64fcae763b1c490fe929584048 Mon Sep 17 00:00:00 2001 From: Rory Yorke Date: Thu, 9 Dec 2021 09:46:42 +0200 Subject: [PATCH 4/6] Build dynamic libs; don't add -fhidden --- CMakeLists.txt | 8 ++------ setup.py | 3 +-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 827b69286..a55c8e709 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,6 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") #include(${PROJECT_SOURCE_DIR}/settings.cmake) - # other options off-by-default that you can enable option(WERROR "Set all warnings to errors" OFF) option(STATICLIBS "Builds static versions of all installed libraries" OFF) @@ -28,11 +27,8 @@ option(PROFILE "Builds the libraries with profiling support (gcc only)" OFF) set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS}) -set(STATICLIBS ON) - -if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") -endif() +# todo: ideally setup this from setup.py invocation +set(STATICLIBS OFF) add_subdirectory(deps/pybind11) add_subdirectory(deps/dnp3) diff --git a/setup.py b/setup.py index 6c22ca946..836af95cc 100644 --- a/setup.py +++ b/setup.py @@ -47,8 +47,7 @@ def build_extension(self, ext): build_args += ['--', '/m'] else: cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg] - cmake_args += ['-DSTATICLIBS=ON'] - build_args += ['--', '-j2'] + build_args += ['--', 'VERBOSE=1'] env = os.environ.copy() env['CXXFLAGS'] = '{} -DVERSION_INFO=\\"{}\\"'.format(env.get('CXXFLAGS', ''), From 48cd2e89284017a72c0e0871bc57ab73fd356f4f Mon Sep 17 00:00:00 2001 From: Rory Yorke Date: Thu, 9 Dec 2021 10:57:03 +0200 Subject: [PATCH 5/6] Added extra pybind11 headers in src/pydnp3opendnp3_?.hpp From a very helpful error message from pybind11. --- src/pydnp3opendnp3_1.hpp | 4 ++++ src/pydnp3opendnp3_2.hpp | 5 +++++ src/pydnp3opendnp3_3.hpp | 5 +++++ src/pydnp3opendnp3_4.hpp | 5 +++++ 4 files changed, 19 insertions(+) diff --git a/src/pydnp3opendnp3_1.hpp b/src/pydnp3opendnp3_1.hpp index 2d5da6591..759111269 100644 --- a/src/pydnp3opendnp3_1.hpp +++ b/src/pydnp3opendnp3_1.hpp @@ -1,6 +1,10 @@ #ifndef PYDNP3OPENDNP3_1_HPP #define PYDNP3OPENDNP3_1_HPP +#include +#include +#include +#include #include void init_opendnp3_1(pybind11::module &opendnp3); diff --git a/src/pydnp3opendnp3_2.hpp b/src/pydnp3opendnp3_2.hpp index 48e6eab83..48864b126 100644 --- a/src/pydnp3opendnp3_2.hpp +++ b/src/pydnp3opendnp3_2.hpp @@ -1,6 +1,11 @@ #ifndef PYDNP3OPENDNP3_2_HPP #define PYDNP3OPENDNP3_2_HPP +#include +#include +#include +#include + #include void init_opendnp3_2(pybind11::module &opendnp3); diff --git a/src/pydnp3opendnp3_3.hpp b/src/pydnp3opendnp3_3.hpp index 055919747..1ee1233a8 100644 --- a/src/pydnp3opendnp3_3.hpp +++ b/src/pydnp3opendnp3_3.hpp @@ -1,6 +1,11 @@ #ifndef PYDNP3OPENDNP3_3_HPP #define PYDNP3OPENDNP3_3_HPP +#include +#include +#include +#include + #include void init_opendnp3_3(pybind11::module &opendnp3); diff --git a/src/pydnp3opendnp3_4.hpp b/src/pydnp3opendnp3_4.hpp index 99b959f87..d5c674ba5 100644 --- a/src/pydnp3opendnp3_4.hpp +++ b/src/pydnp3opendnp3_4.hpp @@ -1,6 +1,11 @@ #ifndef PYDNP3OPENDNP3_4_HPP #define PYDNP3OPENDNP3_4_HPP +#include +#include +#include +#include + #include void init_opendnp3_4(pybind11::module &opendnp3); From bdbcdf8d662b624d730b24be208dbdf328182f6d Mon Sep 17 00:00:00 2001 From: Alkmaar Date: Thu, 9 Dec 2021 15:14:26 +0200 Subject: [PATCH 6/6] Force debug build This lets the link stage succeed on a SmartEdge --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 836af95cc..2870f47cb 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,7 @@ def build_extension(self, ext): cmake_args = ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir, '-DPYTHON_EXECUTABLE=' + sys.executable] - cfg = 'Debug' if self.debug else 'Release' + cfg = 'Debug' build_args = ['--config', cfg] if platform.system() == "Windows":