From 83e21e207b5f630080de04df1b7f691b0028dc4e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 22 Jan 2022 15:57:46 +0100 Subject: [PATCH] - added additional events for IedServer_RCBEventHandler --- src/iec61850/inc/iec61850_server.h | 7 ++- src/iec61850/server/mms_mapping/reporting.c | 50 ++++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index b2953226..902e4de3 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -1554,7 +1554,12 @@ typedef enum { /** * \brief Callback that is called in case of RCB event * - * \param parameter user provided paramter + * \param parameter user provided parameter + * \param rcb affected report control block + * \param connection client connection that is involved + * \param event event type + * \param parameterName name of the parameter in case of RCB_EVENT_SET_PARAMETER + * \param serviceError service error in case of RCB_EVENT_SET_PARAMETER */ typedef void (*IedServer_RCBEventHandler) (void* parameter, ReportControlBlock* rcb, ClientConnection connection, IedServer_RCBEventType event, const char* parameterName, MmsDataAccessError serviceError); diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 919ae346..45433427 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -1591,6 +1591,12 @@ checkReservationTimeout(MmsMapping* self, ReportControl* rc) copyRCBValuesToTrackingObject(self, rc); updateGenericTrackingObjectValues(self, rc, IEC61850_SERVICE_TYPE_INTERNAL_CHANGE, DATA_ACCESS_ERROR_SUCCESS); #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ + + if (self->rcbEventHandler) { + ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, rc->clientConnection); + + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_UNRESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } } } @@ -1695,6 +1701,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (isIpAddressMatchingWithOwner(rc, MmsServerConnection_getClientAddress(connection))) { rc->reserved = true; rc->clientConnection = connection; + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } else { if (DEBUG_IED_SERVER) @@ -1703,6 +1713,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme #else rc->reserved = true; rc->clientConnection = connection; + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } #endif } @@ -1914,6 +1928,10 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme if (rc->resvTms == -1) dontUpdate = true; + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_UNRESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } } @@ -2178,13 +2196,25 @@ exit_function: rc->resvTms = RESV_TMS_IMPLICIT_VALUE; reserveRcb(rc, connection); + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } else if (rc->resvTms == -1) { reserveRcb(rc, connection); + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } } else { reserveRcb(rc, connection); + + if (self->rcbEventHandler) { + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_RESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } } } @@ -2214,13 +2244,29 @@ exit_function: static void Reporting_disableReportControlInstance(MmsMapping* self, ReportControl* rc) { + if (rc->enabled) { + if (self->rcbEventHandler) { + ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, rc->clientConnection); + + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_DISABLE, NULL, DATA_ACCESS_ERROR_SUCCESS); + } + } + rc->enabled = false; rc->clientConnection = NULL; MmsValue* rptEna = ReportControl_getRCBValue(rc, "RptEna"); MmsValue_setBoolean(rptEna, false); - rc->reserved = false; + if (rc->reserved) { + rc->reserved = false; + + if (self->rcbEventHandler) { + ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, rc->clientConnection); + + self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_UNRESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } + } if (rc->buffered == false) { @@ -2239,7 +2285,7 @@ Reporting_disableReportControlInstance(MmsMapping* self, ReportControl* rc) if (rc->resvTms == 0) updateOwner(rc, NULL); else if (rc->resvTms > 0) { - rc->reservationTimeout = Hal_getTimeInMs() + (rc->resvTms * 1000); + rc->reservationTimeout = Hal_getTimeInMs() + (rc->resvTms * 1000); } }