diff --git a/src/iec61850/inc/iec61850_dynamic_model.h b/src/iec61850/inc/iec61850_dynamic_model.h index 2a6eec4d..71cc901d 100644 --- a/src/iec61850/inc/iec61850_dynamic_model.h +++ b/src/iec61850/inc/iec61850_dynamic_model.h @@ -243,21 +243,48 @@ ReportControlBlock_isBuffered(ReportControlBlock* self); LIB61850_API LogicalNode* ReportControlBlock_getParent(ReportControlBlock* self); -LIB61850_API int -ReportControlBlock_getRptEna(ReportControlBlock* self); - LIB61850_API char* ReportControlBlock_getRptID(ReportControlBlock* self); +LIB61850_API int +ReportControlBlock_getRptEna(ReportControlBlock* self); + LIB61850_API char* ReportControlBlock_getDataSet(ReportControlBlock* self); -LIB61850_API int +LIB61850_API uint32_t +ReportControlBlock_getConfRev(ReportControlBlock* self); + +LIB61850_API uint32_t +ReportControlBlock_getOptFlds(ReportControlBlock* self); + +LIB61850_API uint32_t +ReportControlBlock_getBufTm(ReportControlBlock* self); + +LIB61850_API uint16_t +ReportControlBlock_getSqNum(ReportControlBlock* self); + +LIB61850_API uint32_t ReportControlBlock_getTrgOps(ReportControlBlock* self); LIB61850_API uint32_t ReportControlBlock_getIntgPd(ReportControlBlock* self); +LIB61850_API bool +ReportControlBlock_getGI(ReportControlBlock* self); + +LIB61850_API bool +ReportControlBlock_getPurgeBuf(ReportControlBlock* self); + +LIB61850_API MmsValue* +ReportControlBlock_getEntryId(ReportControlBlock* self); + +LIB61850_API uint64_t +ReportControlBlock_getTimeofEntry(ReportControlBlock* self); + +LIB61850_API int16_t +ReportControlBlock_getResvTms(ReportControlBlock* self); + LIB61850_API MmsValue* ReportControlBlock_getOwner(ReportControlBlock* self); diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 33a8b209..09d17d57 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -3693,7 +3693,75 @@ ReportControlBlock_getDataSet(ReportControlBlock* self) } } -int +uint32_t +ReportControlBlock_getConfRev(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* confRevValue = ReportControl_getRCBValue(rc, "ConfRev"); + + uint32_t confRev = MmsValue_toUint32(confRevValue); + + return confRev; + } + else { + return self->confRef; + } +} + +uint32_t +ReportControlBlock_getOptFlds(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* optFldsValue = ReportControl_getRCBValue(rc, "OptFlds"); + + uint32_t optFlds = MmsValue_getBitStringAsInteger(optFldsValue) / 2; + + return optFlds; + } + else { + return self->options; + } +} + +uint32_t +ReportControlBlock_getBufTm(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* bufTmValue = ReportControl_getRCBValue(rc, "BufTm"); + + uint32_t bufTm = MmsValue_toUint32(bufTmValue); + + return bufTm; + } + else { + return self->bufferTime; + } +} + +uint16_t +ReportControlBlock_getSqNum(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* sqNumValue = ReportControl_getRCBValue(rc, "SqNum"); + + uint16_t sqNum = (uint16_t)MmsValue_toUint32(sqNumValue); + + return sqNum; + } + else { + return 0; + } +} + +uint32_t ReportControlBlock_getTrgOps(ReportControlBlock* self) { if (self->trgOps & 64) { @@ -3719,6 +3787,91 @@ ReportControlBlock_getIntgPd(ReportControlBlock* self) } } +bool +ReportControlBlock_getGI(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* giValue = ReportControl_getRCBValue(rc, "GI"); + + bool gi = MmsValue_getBoolean(giValue); + + return gi; + } + else { + return false; + } +} + +bool +ReportControlBlock_getPurgeBuf(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* purgeBufValue = ReportControl_getRCBValue(rc, "PurgeBuf"); + + bool purgeBuf = MmsValue_getBoolean(purgeBufValue); + + return purgeBuf; + } + else { + return false; + } +} + +MmsValue* +ReportControlBlock_getEntryId(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* entryIdValue = ReportControl_getRCBValue(rc, "EntryID"); + + MmsValue* entryId = MmsValue_clone(entryIdValue); + + return entryId; + } + else { + return NULL; + } +} + +uint64_t +ReportControlBlock_getTimeofEntry(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* timeofEntryValue = ReportControl_getRCBValue(rc, "TimeofEntry"); + + uint64_t timeofEntry = MmsValue_getBinaryTimeAsUtcMs(timeofEntryValue); + + return timeofEntry; + } + else { + return 0; + } +} + +int16_t +ReportControlBlock_getResvTms(ReportControlBlock* self) +{ + if (self->trgOps & 64) { + ReportControl* rc = (ReportControl*)(self->sibling); + + MmsValue* resvTmsValue = ReportControl_getRCBValue(rc, "ResvTms"); + + int16_t resvTms = (int16_t)MmsValue_toInt32(resvTmsValue); + + return resvTms; + } + else { + return 0; + } +} + MmsValue* ReportControlBlock_getOwner(ReportControlBlock* self) {