diff --git a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs index 55a87e3c..7aa303ba 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs @@ -1993,7 +1993,15 @@ namespace IEC61850 /// /// Purge buffer procedure executed /// - PURGEBUF = 7 + PURGEBUF = 7, + /// + /// Report buffer overflow + /// + OVERFLOW = 8, + /// + /// A new report was created and inserted into the buffer + /// + REPORT_CREATED = 9 } public delegate void RCBEventHandler(object parameter, ReportControlBlock rcb, ClientConnection con, RCBEventType eventType, string parameterName, MmsDataAccessError serviceError); diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index 5a3dd29d..48c79533 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -1547,7 +1547,9 @@ typedef enum { RCB_EVENT_ENABLE, /* << RCB enabled */ RCB_EVENT_DISABLE, /* << RCB disabled */ RCB_EVENT_GI, /* << GI report triggered */ - RCB_EVENT_PURGEBUF /* << Purge buffer procedure executed */ + RCB_EVENT_PURGEBUF, /* << Purge buffer procedure executed */ + RCB_EVENT_OVERFLOW, /* << Report buffer overflow */ + RCB_EVENT_REPORT_CREATED /* << a new report was created and inserted into the buffer */ } IedServer_RCBEventType; /** diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 537a1fad..91f1c004 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -166,7 +166,6 @@ ReportControl_unlockNotify(ReportControl* self) #endif } - static void purgeBuf(ReportControl* rc) { @@ -183,7 +182,6 @@ purgeBuf(ReportControl* rc) reportBuffer->reportsCount = 0; } - static void deleteDataSetValuesShadowBuffer(ReportControl* self) { @@ -3072,6 +3070,18 @@ exit_function: Semaphore_post(buffer->lock); #endif + if (reportControl->server) { + MmsMapping* mmsMapping = reportControl->server->mmsMapping; + + if (mmsMapping->rcbEventHandler) { + if (overflow) { + mmsMapping->rcbEventHandler(mmsMapping->rcbEventHandlerParameter, reportControl->rcb, NULL, RCB_EVENT_OVERFLOW, NULL, DATA_ACCESS_ERROR_SUCCESS); + } + + mmsMapping->rcbEventHandler(mmsMapping->rcbEventHandlerParameter, reportControl->rcb, NULL, RCB_EVENT_REPORT_CREATED, NULL, DATA_ACCESS_ERROR_SUCCESS); + } + } + return; } /* enqueuReport() */