diff --git a/pyiec61850/eventHandler.hpp b/pyiec61850/eventHandler.hpp new file mode 100644 index 00000000..1ef20f7b --- /dev/null +++ b/pyiec61850/eventHandler.hpp @@ -0,0 +1,82 @@ +#ifndef PYIEC61850_EVENTHANDLER_HPP +#define PYIEC61850_EVENTHANDLER_HPP + + +#include "iec61850_client.h" +#include +#include + + +class PyThreadStateLock +{ +public: + PyThreadStateLock(void) + { + state = PyGILState_Ensure( ); + } + + ~PyThreadStateLock(void) + { + PyGILState_Release( state ); + } + +private: + PyGILState_STATE state; +}; + + + +class EventHandler { + public: + virtual ~EventHandler() {} + virtual void setReceivedData(void *i_data_p) = 0; + virtual void trigger() = 0; +}; + + +class EventSubscriber { + public: + // TODO: use a map to store and find the instantiated EventSubscriber + static EventSubscriber* m_last_created_event_subscriber; + + EventSubscriber(): _event_handler_p(nullptr) + { + m_last_created_event_subscriber = this; + + // add python thread support + Py_Initialize(); + PyEval_InitThreads(); + } + + virtual ~EventSubscriber() + { + deleteEventHandler(); + m_last_created_event_subscriber = nullptr; + } + + virtual void subscribe() = 0; + + void deleteEventHandler() + { + if (_event_handler_p) { + delete _event_handler_p; + } + _event_handler_p = nullptr; + } + + void setEventHandler(EventHandler *i_event_handler_p) + { + deleteEventHandler(); + _event_handler_p = i_event_handler_p; + } + + EventHandler *getEventHandler() + { + return _event_handler_p; + } + + private: + EventHandler *_event_handler_p; +}; + +#endif diff --git a/pyiec61850/iec61850.i b/pyiec61850/iec61850.i index 9869c69f..23c5e746 100644 --- a/pyiec61850/iec61850.i +++ b/pyiec61850/iec61850.i @@ -1,5 +1,5 @@ /* File : iec61850.i */ -%module iec61850 +%module(directors="1") iec61850 %ignore ControlObjectClient_setTestMode(ControlObjectClient self); %ignore CDA_OperBoolean(ModelNode* parent, bool isTImeActivated); %ignore LogicalNode_hasBufferedReports(LogicalNode* node); @@ -90,3 +90,9 @@ void GooseSubscriber_setDstMac(GooseSubscriber subscriber, uint8_t dst_mac_4, uint8_t dst_mac_5); +/* Event Handler section */ +%{ +#include "eventHandler.hpp" +EventSubscriber* EventSubscriber::m_last_created_event_subscriber = nullptr; +%} +%include "eventHandler.hpp"