Python wrapper: add generic classes for handling events (like ReportControlBlock or GOOSE)

pull/262/head
Mikael Bourhis 5 years ago
parent 7c68e3e3f6
commit 7bac935648

@ -0,0 +1,82 @@
#ifndef PYIEC61850_EVENTHANDLER_HPP
#define PYIEC61850_EVENTHANDLER_HPP
#include "iec61850_client.h"
#include <string>
#include <Python.h>
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

@ -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"

Loading…
Cancel
Save