From ca97f2548fa8fa37a245d43edf136dee7f6aafdd Mon Sep 17 00:00:00 2001 From: Mikael Bourhis Date: Wed, 29 Jul 2020 16:04:03 +0200 Subject: [PATCH] Python wrapper: add handler class for the reception of ReportControlBlock events --- pyiec61850/iec61850.i | 3 ++ pyiec61850/reportControlBlockHandler.hpp | 66 ++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 pyiec61850/reportControlBlockHandler.hpp diff --git a/pyiec61850/iec61850.i b/pyiec61850/iec61850.i index 23c5e746..0a5d45d0 100644 --- a/pyiec61850/iec61850.i +++ b/pyiec61850/iec61850.i @@ -91,8 +91,11 @@ void GooseSubscriber_setDstMac(GooseSubscriber subscriber, uint8_t dst_mac_5); /* Event Handler section */ +%feature("director") RCBHandler; %{ #include "eventHandler.hpp" +#include "reportControlBlockHandler.hpp" EventSubscriber* EventSubscriber::m_last_created_event_subscriber = nullptr; %} %include "eventHandler.hpp" +%include "reportControlBlockHandler.hpp" diff --git a/pyiec61850/reportControlBlockHandler.hpp b/pyiec61850/reportControlBlockHandler.hpp new file mode 100644 index 00000000..ad798c1d --- /dev/null +++ b/pyiec61850/reportControlBlockHandler.hpp @@ -0,0 +1,66 @@ +#ifndef PYIEC61850_RCBHANDLER_HPP +#define PYIEC61850_RCBHANDLER_HPP + +#include "eventHandler.hpp" + + +class RCBHandler: public EventHandler { + public: + virtual ~RCBHandler() {} + + virtual void setReceivedData(void *i_data_p) + { + // copy the received data + ClientReport *l_my_data_p = static_cast(i_data_p); + _client_report = *l_my_data_p; + } + + ClientReport _client_report; +}; + + + +class RCBSubscriber: public EventSubscriber { + public: + + virtual void subscribe() { + // install the libiec61850 callback: + // the 'function pointer' is the 'static' method of this class + IedConnection_installReportHandler(m_ied_connection, + m_rcb_reference.c_str(), + m_rcb_rpt_id.c_str(), + RCBSubscriber::triggerRCBHandler, + NULL); + } + + // Static method: it is the 'callback' for libiec61850 in C + static void triggerRCBHandler(void *parameter, ClientReport report) + { + PyThreadStateLock PyThreadLock; + + // TODO: search the appropriate 'EventSubscriber' object + if (m_last_created_event_subscriber) { + EventHandler *l_event_handler_p = m_last_created_event_subscriber->getEventHandler(); + if (l_event_handler_p) { + l_event_handler_p->setReceivedData(&report); + l_event_handler_p->trigger(); + } + else { + printf("The EventHandler is undefined\n"); + } + } + } + + // Setters + void setIedConnection(const IedConnection &i_ied_connection) {m_ied_connection = i_ied_connection;} + void setRcbReference(const char *i_rcb_reference) {m_rcb_reference = i_rcb_reference;} + void setRcbRptId(const char *i_rcb_rpt_id) {m_rcb_rpt_id = i_rcb_rpt_id;} + + protected: + // Parameters + IedConnection m_ied_connection; + std::string m_rcb_reference; + std::string m_rcb_rpt_id; +}; + +#endif