- GOOSE receiver: add support for operation without Ethernet HAL implementation

pull/179/head
Michael Zillgith 6 years ago
parent 0b181ae22c
commit 2bfd0fd0ef

@ -59,7 +59,7 @@ struct sGooseReceiver
}; };
GooseReceiver GooseReceiver
GooseReceiver_create() GooseReceiver_createEx(uint8_t* buffer)
{ {
GooseReceiver self = (GooseReceiver) GLOBAL_MALLOC(sizeof(struct sGooseReceiver)); GooseReceiver self = (GooseReceiver) GLOBAL_MALLOC(sizeof(struct sGooseReceiver));
@ -67,7 +67,7 @@ GooseReceiver_create()
self->running = false; self->running = false;
self->stop = false; self->stop = false;
self->interfaceId = NULL; self->interfaceId = NULL;
self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH); self->buffer = buffer;
self->ethSocket = NULL; self->ethSocket = NULL;
self->subscriberList = LinkedList_create(); self->subscriberList = LinkedList_create();
#if (CONFIG_MMS_THREADLESS_STACK == 0) #if (CONFIG_MMS_THREADLESS_STACK == 0)
@ -78,6 +78,18 @@ GooseReceiver_create()
return self; return self;
} }
GooseReceiver
GooseReceiver_create()
{
GooseReceiver self = GooseReceiver_createEx(NULL);
if (self) {
self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH);
}
return self;
}
void void
GooseReceiver_addSubscriber(GooseReceiver self, GooseSubscriber subscriber) GooseReceiver_addSubscriber(GooseReceiver self, GooseSubscriber subscriber)
{ {
@ -692,11 +704,10 @@ exit_with_fault:
} }
static void static void
parseGooseMessage(GooseReceiver self, int numbytes) parseGooseMessage(GooseReceiver self, uint8_t* buffer, int numbytes)
{ {
int bufPos; int bufPos;
bool subscriberFound = false; bool subscriberFound = false;
uint8_t* buffer = self->buffer;
if (numbytes < 22) if (numbytes < 22)
return; return;
@ -884,9 +895,15 @@ GooseReceiver_tick(GooseReceiver self)
int packetSize = Ethernet_receivePacket(self->ethSocket, self->buffer, ETH_BUFFER_LENGTH); int packetSize = Ethernet_receivePacket(self->ethSocket, self->buffer, ETH_BUFFER_LENGTH);
if (packetSize > 0) { if (packetSize > 0) {
parseGooseMessage(self, packetSize); parseGooseMessage(self, self->buffer, packetSize);
return true; return true;
} }
else else
return false; return false;
} }
void
GooseReceiver_handleMessage(GooseReceiver self, uint8_t* buffer, int size)
{
parseGooseMessage(self, buffer, size);
}

@ -1,7 +1,7 @@
/* /*
* goose_receiver.h * goose_receiver.h
* *
* Copyright 2014-2018 Michael Zillgith * Copyright 2014-2019 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -51,6 +51,19 @@ typedef struct sGooseReceiver* GooseReceiver;
LIB61850_API GooseReceiver LIB61850_API GooseReceiver
GooseReceiver_create(void); GooseReceiver_create(void);
/**
* \brief Create a new receiver instance using the provided buffer instead of allocating an own buffer
*
* A GooseReceiver instance is used to handle all GOOSE messages received on a specific
* network interface.
*
* \param buffer buffer to store Ethernet messages or NULL when using \ref GooseReceiver_handleMessage
*
* \return the new GooseReceiver instance
*/
LIB61850_API GooseReceiver
GooseReceiver_createEx(uint8_t* buffer);
/** /**
* \brief sets the interface for the GOOSE receiver * \brief sets the interface for the GOOSE receiver
* *
@ -134,7 +147,7 @@ GooseReceiver_stopThreadless(GooseReceiver self);
/** /**
* \brief Parse GOOSE messages if they are available * \brief Parse GOOSE messages if they are available
* *
* Call after reception of ethernet frame and periodically to to house keeping tasks * Call after reception of an Ethernet frame or periodically
* *
* \param self the receiver object * \param self the receiver object
* *
@ -143,6 +156,19 @@ GooseReceiver_stopThreadless(GooseReceiver self);
LIB61850_API bool LIB61850_API bool
GooseReceiver_tick(GooseReceiver self); GooseReceiver_tick(GooseReceiver self);
/**
* \brief Parse a GOOSE message
*
* Call after reception of an Ethernet frame (can be used as an alternative to \ref GooseReceiver_tick
* to avoid implementing the Ethernet HAL)
*
* \param self the receiver object
* \param buffer a buffer containing the complete Ethernet message
* \param size size of the Ethernet message
*/
LIB61850_API void
GooseReceiver_handleMessage(GooseReceiver self, uint8_t* buffer, int size);
/**@}*/ /**@}*/
#ifdef __cplusplus #ifdef __cplusplus

@ -123,7 +123,10 @@ MmsVariableSpecification_getStructureElements(MmsVariableSpecification* self);
* \brief returns the number of elements if the type is a complex type (structure, array) or the * \brief returns the number of elements if the type is a complex type (structure, array) or the
* bit size of integers, unsigned integers, floats, bit strings, visible and MMS strings and octet strings. * bit size of integers, unsigned integers, floats, bit strings, visible and MMS strings and octet strings.
* *
*
*
* \param self the MmsVariableSpecification object * \param self the MmsVariableSpecification object
*
* \return the number of elements or -1 if not applicable * \return the number of elements or -1 if not applicable
*/ */
LIB61850_API int LIB61850_API int

Loading…
Cancel
Save