From 98bef74e5b5deddf5181ee6f5f0e52ccbd439d22 Mon Sep 17 00:00:00 2001 From: 2-Vladislav Date: Wed, 27 Jan 2021 16:01:57 +0200 Subject: [PATCH] IEDServer: add IedServer_setGoosePublishingSimulation to control of Simulation flag in GOOSE messages from IEDServer (#299) --- src/iec61850/inc/iec61850_server.h | 3 +++ src/iec61850/inc_private/mms_goose.h | 5 +++++ src/iec61850/inc_private/mms_mapping.h | 5 +++++ src/iec61850/server/impl/ied_server.c | 8 ++++++++ src/iec61850/server/mms_mapping/mms_goose.c | 17 +++++++++++++++++ src/iec61850/server/mms_mapping/mms_mapping.c | 13 +++++++++++++ 6 files changed, 51 insertions(+) diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index e78ec931..4b9565ba 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -508,6 +508,9 @@ IedServer_getMmsServer(IedServer self); LIB61850_API void IedServer_enableGoosePublishing(IedServer self); +LIB61850_API void +IedServer_setGoosePublishingSimulation(IedServer self, bool test); + /** * \brief Disable all GOOSE control blocks. * diff --git a/src/iec61850/inc_private/mms_goose.h b/src/iec61850/inc_private/mms_goose.h index 326e35dc..cd5c4a0e 100644 --- a/src/iec61850/inc_private/mms_goose.h +++ b/src/iec61850/inc_private/mms_goose.h @@ -77,6 +77,11 @@ MmsGooseControlBlock_publishNewState(MmsGooseControlBlock self); LIB61850_INTERNAL void MmsGooseControlBlock_enable(MmsGooseControlBlock self); + +LIB61850_INTERNAL void +MmsGooseControlBlock_setSimulation(MmsGooseControlBlock self, bool test); + + LIB61850_INTERNAL void MmsGooseControlBlock_disable(MmsGooseControlBlock self); diff --git a/src/iec61850/inc_private/mms_mapping.h b/src/iec61850/inc_private/mms_mapping.h index 4590eb34..dd4bbf51 100644 --- a/src/iec61850/inc_private/mms_mapping.h +++ b/src/iec61850/inc_private/mms_mapping.h @@ -103,6 +103,11 @@ MmsMapping_triggerGooseObservers(MmsMapping* self, MmsValue* value); LIB61850_INTERNAL void MmsMapping_enableGoosePublishing(MmsMapping* self); + +LIB61850_INTERNAL void +MmsMapping_setGoosePublishingSimulation(MmsMapping* self, bool test); + + LIB61850_INTERNAL void MmsMapping_disableGoosePublishing(MmsMapping* self); diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index b64c37f1..7f1021fd 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -1384,6 +1384,14 @@ IedServer_enableGoosePublishing(IedServer self) #endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ } +void +IedServer_setGoosePublishingSimulation(IedServer self, bool test) +{ +#if (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) + MmsMapping_setGoosePublishingSimulation(self->mmsMapping, test); +#endif /* (CONFIG_INCLUDE_GOOSE_SUPPORT == 1) */ +} + void IedServer_disableGoosePublishing(IedServer self) { diff --git a/src/iec61850/server/mms_mapping/mms_goose.c b/src/iec61850/server/mms_mapping/mms_goose.c index 4df50074..d6232f3a 100644 --- a/src/iec61850/server/mms_mapping/mms_goose.c +++ b/src/iec61850/server/mms_mapping/mms_goose.c @@ -191,6 +191,23 @@ MmsGooseControlBlock_isEnabled(MmsGooseControlBlock self) return self->goEna; } +void +MmsGooseControlBlock_setSimulation(MmsGooseControlBlock self, bool test) +{ +#if (CONFIG_MMS_THREADLESS_STACK != 1) + Semaphore_wait(self->publisherMutex); +#endif + + if(self->publisher){ + GoosePublisher_setSimulation(self->publisher, test); + } + +#if (CONFIG_MMS_THREADLESS_STACK != 1) + Semaphore_post(self->publisherMutex); +#endif + +} + void MmsGooseControlBlock_enable(MmsGooseControlBlock self) { diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 3ac76574..22cf828a 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -2936,6 +2936,19 @@ MmsMapping_enableGoosePublishing(MmsMapping* self) } +void +MmsMapping_setGoosePublishingSimulation(MmsMapping* self, bool test) +{ + LinkedList element = self->gseControls; + + while ((element = LinkedList_getNext(element)) != NULL) { + MmsGooseControlBlock gcb = (MmsGooseControlBlock) element->data; + + MmsGooseControlBlock_setSimulation(gcb, test); + } + +} + void MmsMapping_useGooseVlanTag(MmsMapping* self, LogicalNode* ln, const char* gcbName, bool useVlanTag) {