From 30f98e54cb833177db5e9404ed34506b89d76e32 Mon Sep 17 00:00:00 2001 From: Mikael Bourhis Date: Thu, 30 Jul 2020 14:39:26 +0200 Subject: [PATCH] Python wrapper: add handler class for the reception of GOOSE events --- pyiec61850/gooseHandler.hpp | 63 +++++++++++++++++++++++++++++++++++++ pyiec61850/iec61850.i | 3 ++ 2 files changed, 66 insertions(+) create mode 100644 pyiec61850/gooseHandler.hpp diff --git a/pyiec61850/gooseHandler.hpp b/pyiec61850/gooseHandler.hpp new file mode 100644 index 00000000..a01d3a6a --- /dev/null +++ b/pyiec61850/gooseHandler.hpp @@ -0,0 +1,63 @@ +#ifndef PYIEC61850_GOOSEHANDLER_HPP +#define PYIEC61850_GOOSEHANDLER_HPP + +#include "eventHandler.hpp" + + +class GooseHandler: public EventHandler { + public: + virtual ~GooseHandler() {} + + virtual void setReceivedData(void *i_data_p) + { + // copy the received data + GooseSubscriber *l_my_data_p = static_cast(i_data_p); + _libiec61850_goose_subscriber = *l_my_data_p; + } + + GooseSubscriber _libiec61850_goose_subscriber; +}; + + + +class GooseSubscriberForPython: public EventSubscriber { + public: + + virtual void subscribe() { + // install the libiec61850 callback: + // the 'function pointer' is the 'static' method of this class + GooseSubscriber_setListener(m_libiec61850_goose_subscriber, + GooseSubscriberForPython::triggerGooseHandler, + NULL); + } + + // Static method: it is the 'callback' for libiec61850 in C + static void triggerGooseHandler(GooseSubscriber subscriber, void *parameter) + { + 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(&subscriber); + l_event_handler_p->trigger(); + } + else { + printf("The EventHandler is undefined\n"); + } + } + } + + // Setters + void setLibiec61850GooseSubscriber(const GooseSubscriber &i_libiec61850_goose_subscriber) + { + m_libiec61850_goose_subscriber = i_libiec61850_goose_subscriber; + } + + protected: + // Parameters + GooseSubscriber m_libiec61850_goose_subscriber; +}; + +#endif diff --git a/pyiec61850/iec61850.i b/pyiec61850/iec61850.i index 0a5d45d0..ffbf2f8b 100644 --- a/pyiec61850/iec61850.i +++ b/pyiec61850/iec61850.i @@ -92,10 +92,13 @@ void GooseSubscriber_setDstMac(GooseSubscriber subscriber, /* Event Handler section */ %feature("director") RCBHandler; +%feature("director") GooseHandler; %{ #include "eventHandler.hpp" #include "reportControlBlockHandler.hpp" +#include "gooseHandler.hpp" EventSubscriber* EventSubscriber::m_last_created_event_subscriber = nullptr; %} %include "eventHandler.hpp" %include "reportControlBlockHandler.hpp" +%include "gooseHandler.hpp"