You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
3.2 KiB
C++
93 lines
3.2 KiB
C++
#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<GooseSubscriber*>(i_data_p);
|
|
_libiec61850_goose_subscriber = *l_my_data_p;
|
|
}
|
|
|
|
GooseSubscriber _libiec61850_goose_subscriber;
|
|
};
|
|
|
|
|
|
|
|
class GooseSubscriberForPython: public EventSubscriber {
|
|
public:
|
|
GooseSubscriberForPython(): EventSubscriber()
|
|
{
|
|
m_libiec61850_goose_subscriber = nullptr;
|
|
}
|
|
|
|
virtual ~GooseSubscriberForPython() {}
|
|
|
|
virtual bool subscribe()
|
|
{
|
|
// preconditions
|
|
if (nullptr == m_libiec61850_goose_subscriber) {
|
|
fprintf(stderr, "GooseSubscriberForPython::subscribe() failed: 'GOOSE subscriber' is null\n");
|
|
return false;
|
|
}
|
|
|
|
// install the libiec61850 callback:
|
|
// the 'function pointer' is the 'static' method of this class
|
|
GooseSubscriber_setListener(m_libiec61850_goose_subscriber,
|
|
GooseSubscriberForPython::triggerGooseHandler,
|
|
NULL);
|
|
|
|
std::string l_go_cb_ref = GooseSubscriber_getGoCbRef(m_libiec61850_goose_subscriber);
|
|
|
|
return (EventSubscriber::registerNewSubscriber(this, l_go_cb_ref));
|
|
}
|
|
|
|
// Static method: it is the 'callback' for libiec61850 in C
|
|
static void triggerGooseHandler(GooseSubscriber subscriber, void *parameter)
|
|
{
|
|
PyThreadStateLock PyThreadLock;
|
|
|
|
// Preconditions
|
|
if (nullptr == subscriber) {
|
|
fprintf(stderr, "GooseSubscriberForPython::triggerGooseHandler() failed: input object is null\n");
|
|
return;
|
|
}
|
|
|
|
// Search the appropriate 'EventSubscriber' object
|
|
std::string l_subscriber_id = GooseSubscriber_getGoCbRef(subscriber);
|
|
EventSubscriber *l_registered_subscriber = EventSubscriber::findSubscriber(l_subscriber_id);
|
|
|
|
if (l_registered_subscriber) {
|
|
EventHandler *l_event_handler_p = l_registered_subscriber->getEventHandler();
|
|
if (l_event_handler_p) {
|
|
l_event_handler_p->setReceivedData(&subscriber);
|
|
l_event_handler_p->trigger();
|
|
}
|
|
else {
|
|
fprintf(stderr, "GooseSubscriberForPython::triggerGooseHandler() failed: EventHandler is undefined\n");
|
|
}
|
|
}
|
|
else {
|
|
fprintf(stderr, "GooseSubscriberForPython::triggerGooseHandler() failed: subscriber is not registered\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
|