- some code format updates

- added clang-formatter configuration
pull/535/head
Michael Zillgith 10 months ago
parent 243c988526
commit b131193694

@ -0,0 +1,192 @@
---
Language: Cpp
# BasedOnStyle: Microsoft
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveMacros: None
AlignConsecutiveAssignments: None
AlignConsecutiveBitFields: None
AlignConsecutiveDeclarations: None
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: All
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
AttributeMacros:
- __capability
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Always
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: false
AfterExternBlock: true
BeforeCatch: true
BeforeElse: true
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Custom
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:'
QualifierAlignment: Leave
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
PackConstructorInitializers: BinPack
BasedOnStyle: ''
ConstructorInitializerAllOnOneLineOrOnePerLine: false
AllowAllConstructorInitializersOnNextLine: true
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: '.*'
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseLabels: false
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentExternBlock: NoIndent
IndentRequires: false
IndentWidth: 4
IndentWrappedFunctionNames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: Signature
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 1000
PenaltyIndentedWhitespace: 0
PointerAlignment: Left
PPIndentWidth: -1
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: false
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
BeforeNonEmptyParentheses: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
BitFieldColonSpacing: Both
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseCRLF: false
UseTab: Never
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
...

@ -1952,8 +1952,8 @@ createDataSets(MmsDevice* mmsDevice, IedModel* iedModel)
{ {
LogicalDevice* ld = IedModel_getDeviceByInst(iedModel, dataset->logicalDeviceName); LogicalDevice* ld = IedModel_getDeviceByInst(iedModel, dataset->logicalDeviceName);
if (ld) { if (ld)
{
if (ld->ldName) { if (ld->ldName) {
StringUtils_copyStringMax(domainName, 65, ld->ldName); StringUtils_copyStringMax(domainName, 65, ld->ldName);
} }
@ -1963,8 +1963,8 @@ createDataSets(MmsDevice* mmsDevice, IedModel* iedModel)
MmsDomain* dataSetDomain = MmsDevice_getDomain(mmsDevice, domainName); MmsDomain* dataSetDomain = MmsDevice_getDomain(mmsDevice, domainName);
if (dataSetDomain == NULL) { if (dataSetDomain == NULL)
{
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: MMS domain for dataset does not exist!\n"); printf("IED_SERVER: MMS domain for dataset does not exist!\n");
@ -1978,8 +1978,8 @@ createDataSets(MmsDevice* mmsDevice, IedModel* iedModel)
DataSetEntry* dataSetEntry = dataset->fcdas; DataSetEntry* dataSetEntry = dataset->fcdas;
while (dataSetEntry != NULL) { while (dataSetEntry != NULL)
{
MmsAccessSpecifier accessSpecifier; MmsAccessSpecifier accessSpecifier;
if (ld->ldName) { if (ld->ldName) {
@ -2004,7 +2004,8 @@ createDataSets(MmsDevice* mmsDevice, IedModel* iedModel)
MmsDomain_addNamedVariableList(dataSetDomain, varList); MmsDomain_addNamedVariableList(dataSetDomain, varList);
} }
else { else
{
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: LD for dataset does not exist!\n"); printf("IED_SERVER: LD for dataset does not exist!\n");
} }

@ -2679,8 +2679,10 @@ exit_function_only_tracking:
static void static void
Reporting_disableReportControlInstance(MmsMapping* self, ReportControl* rc) Reporting_disableReportControlInstance(MmsMapping* self, ReportControl* rc)
{ {
if (rc->enabled) { if (rc->enabled)
if (self->rcbEventHandler) { {
if (self->rcbEventHandler)
{
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, rc->clientConnection); ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, rc->clientConnection);
self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_DISABLE, NULL, DATA_ACCESS_ERROR_SUCCESS); self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_DISABLE, NULL, DATA_ACCESS_ERROR_SUCCESS);
@ -2701,19 +2703,22 @@ Reporting_disableReportControlInstance(MmsMapping* self, ReportControl* rc)
Semaphore_post(rc->rcbValuesLock); Semaphore_post(rc->rcbValuesLock);
#endif #endif
if (rc->reserved) { if (rc->reserved)
{
rc->reserved = false; rc->reserved = false;
if (self->rcbEventHandler) { if (self->rcbEventHandler)
{
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, rc->clientConnection); ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle(self->iedServer, rc->clientConnection);
self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_UNRESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS); self->rcbEventHandler(self->rcbEventHandlerParameter, rc->rcb, clientConnection, RCB_EVENT_UNRESERVED, NULL, DATA_ACCESS_ERROR_SUCCESS);
} }
} }
if (rc->buffered == false) { if (rc->buffered == false)
{
if (rc->resvTms != -1) { if (rc->resvTms != -1)
{
#if (CONFIG_MMS_THREADLESS_STACK != 1) #if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait(rc->rcbValuesLock); Semaphore_wait(rc->rcbValuesLock);
#endif #endif
@ -2732,7 +2737,8 @@ Reporting_disableReportControlInstance(MmsMapping* self, ReportControl* rc)
/* delete buffer content */ /* delete buffer content */
purgeBuf(rc); purgeBuf(rc);
} }
else { else
{
if (rc->resvTms == 0) if (rc->resvTms == 0)
updateOwner(rc, NULL); updateOwner(rc, NULL);
else if (rc->resvTms > 0) { else if (rc->resvTms > 0) {
@ -2751,7 +2757,8 @@ Reporting_deactivateAllReports(MmsMapping* self)
{ {
LinkedList rcElem = LinkedList_getNext(self->reportControls); LinkedList rcElem = LinkedList_getNext(self->reportControls);
while (rcElem) { while (rcElem)
{
ReportControl* rc = (ReportControl*)LinkedList_getData(rcElem); ReportControl* rc = (ReportControl*)LinkedList_getData(rcElem);
Reporting_disableReportControlInstance(self, rc); Reporting_disableReportControlInstance(self, rc);
@ -2765,7 +2772,8 @@ Reporting_deactivateReportsForConnection(MmsMapping* self, MmsServerConnection c
{ {
LinkedList rcElem = LinkedList_getNext(self->reportControls); LinkedList rcElem = LinkedList_getNext(self->reportControls);
while (rcElem) { while (rcElem)
{
ReportControl* rc = (ReportControl*)LinkedList_getData(rcElem); ReportControl* rc = (ReportControl*)LinkedList_getData(rcElem);
if (rc->clientConnection == connection) { if (rc->clientConnection == connection) {
@ -2835,13 +2843,16 @@ removeAllGIReportsFromReportBuffer(ReportBuffer* reportBuffer)
ReportBufferEntry* currentReport = reportBuffer->oldestReport; ReportBufferEntry* currentReport = reportBuffer->oldestReport;
ReportBufferEntry* lastReport = NULL; ReportBufferEntry* lastReport = NULL;
while (currentReport != NULL) { while (currentReport != NULL)
if (currentReport->flags & 2) { {
if (currentReport->flags & 2)
if (currentReport == reportBuffer->oldestReport) { {
if (currentReport == reportBuffer->oldestReport)
{
reportBuffer->oldestReport = currentReport->next; reportBuffer->oldestReport = currentReport->next;
} }
else { else
{
if (lastReport != NULL) if (lastReport != NULL)
lastReport->next = currentReport->next; lastReport->next = currentReport->next;
else else
@ -2849,9 +2860,9 @@ removeAllGIReportsFromReportBuffer(ReportBuffer* reportBuffer)
} }
#if (DEBUG_IED_SERVER == 1) #if (DEBUG_IED_SERVER == 1)
printf("IED_SERVER: REMOVE old GI report with ID "); printf("IED_SERVER: REMOVE old GI report with ID ");
printReportId(currentReport); printReportId(currentReport);
printf("\n"); printf("\n");
#endif #endif
reportBuffer->reportsCount--; reportBuffer->reportsCount--;
@ -2859,7 +2870,8 @@ removeAllGIReportsFromReportBuffer(ReportBuffer* reportBuffer)
if (reportBuffer->nextToTransmit == currentReport) if (reportBuffer->nextToTransmit == currentReport)
reportBuffer->nextToTransmit = currentReport->next; reportBuffer->nextToTransmit = currentReport->next;
if (reportBuffer->lastEnqueuedReport == currentReport) { if (reportBuffer->lastEnqueuedReport == currentReport)
{
if (lastReport != NULL) if (lastReport != NULL)
reportBuffer->lastEnqueuedReport = lastReport; reportBuffer->lastEnqueuedReport = lastReport;
else else
@ -2924,7 +2936,8 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_
int encodedSize; int encodedSize;
if (dataSetEntry->value) { if (dataSetEntry->value)
{
encodedSize = MmsValue_encodeMmsData(dataSetEntry->value, NULL, 0, false); encodedSize = MmsValue_encodeMmsData(dataSetEntry->value, NULL, 0, false);
} }
else else
@ -2972,14 +2985,16 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: enqueueReport: bufferEntrySize: %i\n", bufferEntrySize); printf("IED_SERVER: enqueueReport: bufferEntrySize: %i\n", bufferEntrySize);
if (bufferEntrySize > buffer->memoryBlockSize) { if (bufferEntrySize > buffer->memoryBlockSize)
{
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: enqueueReport: report buffer too small for report entry! Skip event!\n"); printf("IED_SERVER: enqueueReport: report buffer too small for report entry! Skip event!\n");
goto exit_function; goto exit_function;
} }
if (isBuffered) { if (isBuffered)
{
/* remove old buffered GI reports */ /* remove old buffered GI reports */
if (isGI) removeAllGIReportsFromReportBuffer(buffer); if (isGI) removeAllGIReportsFromReportBuffer(buffer);
} }
@ -3002,7 +3017,8 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_
assert(buffer->lastEnqueuedReport != NULL); assert(buffer->lastEnqueuedReport != NULL);
assert(buffer->oldestReport != NULL); assert(buffer->oldestReport != NULL);
if (DEBUG_IED_SERVER) { if (DEBUG_IED_SERVER)
{
printf("IED_SERVER: buffer->lastEnqueuedReport: %p\n", buffer->lastEnqueuedReport); printf("IED_SERVER: buffer->lastEnqueuedReport: %p\n", buffer->lastEnqueuedReport);
printf("IED_SERVER: buffer->oldestReport: %p\n", buffer->oldestReport); printf("IED_SERVER: buffer->oldestReport: %p\n", buffer->oldestReport);
printf("IED_SERVER: buffer->nextToTransmit: %p\n", buffer->nextToTransmit); printf("IED_SERVER: buffer->nextToTransmit: %p\n", buffer->nextToTransmit);
@ -3383,7 +3399,8 @@ sendNextReportEntrySegment(ReportControl* self)
MmsValue* confRev = ReportControl_getRCBValue(self, "ConfRev"); MmsValue* confRev = ReportControl_getRCBValue(self, "ConfRev");
if (isBuffered) { if (isBuffered)
{
MmsValue* entryIdValue = MmsValue_getElement(self->rcbValues, 11); MmsValue* entryIdValue = MmsValue_getElement(self->rcbValues, 11);
MmsValue_setOctetString(entryIdValue, (uint8_t*) report->entryId, 8); MmsValue_setOctetString(entryIdValue, (uint8_t*) report->entryId, 8);
} }
@ -3399,7 +3416,8 @@ sendNextReportEntrySegment(ReportControl* self)
const char* rptIdStr = MmsValue_toString(rptIdFromRcb); const char* rptIdStr = MmsValue_toString(rptIdFromRcb);
if (rptIdStr[0] == 0) { if (rptIdStr[0] == 0)
{
/* use default rptId when RptID is empty in RCB */ /* use default rptId when RptID is empty in RCB */
updateWithDefaultRptId(self, &rptId); updateWithDefaultRptId(self, &rptId);
} }
@ -3409,7 +3427,8 @@ sendNextReportEntrySegment(ReportControl* self)
MmsValue* optFlds = ReportControl_getRCBValue(self, "OptFlds"); MmsValue* optFlds = ReportControl_getRCBValue(self, "OptFlds");
if (isBuffered == false) { if (isBuffered == false)
{
/* delete option fields for unrelated options (not present in unbuffered report) */ /* delete option fields for unrelated options (not present in unbuffered report) */
MmsValue_setBitStringBit(optFlds, 6, false); /* bufOvfl */ MmsValue_setBitStringBit(optFlds, 6, false); /* bufOvfl */
MmsValue_setBitStringBit(optFlds, 7, false); /* entryID */ MmsValue_setBitStringBit(optFlds, 7, false); /* entryID */
@ -3424,8 +3443,8 @@ sendNextReportEntrySegment(ReportControl* self)
MmsValue* inclusionField = NULL; MmsValue* inclusionField = NULL;
if (report->flags == 0) { if (report->flags == 0)
{
inclusionField = &_inclusionField; inclusionField = &_inclusionField;
_inclusionField.type = MMS_BIT_STRING; _inclusionField.type = MMS_BIT_STRING;
@ -3457,7 +3476,8 @@ sendNextReportEntrySegment(ReportControl* self)
MmsValue _timeOfEntry; MmsValue _timeOfEntry;
MmsValue* timeOfEntry = NULL; MmsValue* timeOfEntry = NULL;
if (MmsValue_getBitStringBit(optFlds, 2)) { /* report time stamp */ if (MmsValue_getBitStringBit(optFlds, 2)) /* report time stamp */
{
hasReportTimestamp = true; hasReportTimestamp = true;
_timeOfEntry.type = MMS_BINARY_TIME; _timeOfEntry.type = MMS_BINARY_TIME;
_timeOfEntry.value.binaryTime.size = 6; _timeOfEntry.value.binaryTime.size = 6;
@ -3470,7 +3490,8 @@ sendNextReportEntrySegment(ReportControl* self)
MmsValue* datSet = ReportControl_getRCBValue(self, "DatSet"); MmsValue* datSet = ReportControl_getRCBValue(self, "DatSet");
if (MmsValue_getBitStringBit(optFlds, 4)) {/* data set reference */ if (MmsValue_getBitStringBit(optFlds, 4)) /* data set reference */
{
hasDataSetReference = true; hasDataSetReference = true;
accessResultSize += MmsValue_encodeMmsData(datSet, NULL, 0, false); accessResultSize += MmsValue_encodeMmsData(datSet, NULL, 0, false);
} }
@ -3478,8 +3499,10 @@ sendNextReportEntrySegment(ReportControl* self)
MmsValue _bufOvfl; MmsValue _bufOvfl;
MmsValue* bufOvfl = NULL; MmsValue* bufOvfl = NULL;
if (isBuffered) { if (isBuffered)
if (MmsValue_getBitStringBit(optFlds, 6)) { /* bufOvfl */ {
if (MmsValue_getBitStringBit(optFlds, 6)) /* bufOvfl */
{
hasBufOvfl = true; hasBufOvfl = true;
bufOvfl = &_bufOvfl; bufOvfl = &_bufOvfl;
@ -3494,8 +3517,10 @@ sendNextReportEntrySegment(ReportControl* self)
MmsValue _entryId; MmsValue _entryId;
MmsValue* entryId = NULL; MmsValue* entryId = NULL;
if (isBuffered) { if (isBuffered)
if (MmsValue_getBitStringBit(optFlds, 7)) { /* entryID */ {
if (MmsValue_getBitStringBit(optFlds, 7)) /* entryID */
{
hasEntryId = true; hasEntryId = true;
entryId = &_entryId; entryId = &_entryId;
@ -3508,7 +3533,8 @@ sendNextReportEntrySegment(ReportControl* self)
} }
} }
if (MmsValue_getBitStringBit(optFlds, 8)) { if (MmsValue_getBitStringBit(optFlds, 8))
{
hasConfRev = true; hasConfRev = true;
accessResultSize += MmsValue_encodeMmsData(confRev, NULL, 0, false); accessResultSize += MmsValue_encodeMmsData(confRev, NULL, 0, false);
} }
@ -3544,16 +3570,16 @@ sendNextReportEntrySegment(ReportControl* self)
int numberOfAddedElements = 0; int numberOfAddedElements = 0;
for (i = 0; i < self->dataSet->elementCount; i++) { for (i = 0; i < self->dataSet->elementCount; i++)
{
if ((report->flags > 0) || MmsValue_getBitStringBit(inclusionField, i)) { if ((report->flags > 0) || MmsValue_getBitStringBit(inclusionField, i))
{
if (i >= startElementIndex) { if (i >= startElementIndex)
{
int elementSize = 0; int elementSize = 0;
if (withDataReference) { if (withDataReference)
{
DataSetEntry* dataSetEntry = getDataSetEntryWithIndex(self->dataSet->fcdas, i); DataSetEntry* dataSetEntry = getDataSetEntryWithIndex(self->dataSet->fcdas, i);
char dataReference[130]; char dataReference[130];
@ -3593,7 +3619,8 @@ sendNextReportEntrySegment(ReportControl* self)
int lenSize = BerDecoder_decodeLength(currentReportBufferPos + 1, &length, 0, report->entryLength); int lenSize = BerDecoder_decodeLength(currentReportBufferPos + 1, &length, 0, report->entryLength);
if (lenSize < 0) { if (lenSize < 0)
{
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: internal error in report buffer\n"); printf("IED_SERVER: internal error in report buffer\n");
@ -3606,13 +3633,12 @@ sendNextReportEntrySegment(ReportControl* self)
currentReportBufferPos += dataElementSize; currentReportBufferPos += dataElementSize;
} }
if (withReasonCode) { if (withReasonCode) {
elementSize += 4; /* reason code size is always 4 byte */ elementSize += 4; /* reason code size is always 4 byte */
} }
if ((estimatedSegmentSize + elementSize) > maxMmsPduSize) { if ((estimatedSegmentSize + elementSize) > maxMmsPduSize)
{
segmented = true; segmented = true;
moreFollows = true; moreFollows = true;
_moreFollows.value.boolean = true; _moreFollows.value.boolean = true;
@ -3630,13 +3656,15 @@ sendNextReportEntrySegment(ReportControl* self)
accessResultSize += elementSize; accessResultSize += elementSize;
estimatedSegmentSize += elementSize; estimatedSegmentSize += elementSize;
} }
else { else
{
/* move element pointer in report buffer to skip elements that were already sent in former segments */ /* move element pointer in report buffer to skip elements that were already sent in former segments */
int length; int length;
int lenSize = BerDecoder_decodeLength(currentReportBufferPos + 1, &length, 0, report->entryLength); int lenSize = BerDecoder_decodeLength(currentReportBufferPos + 1, &length, 0, report->entryLength);
if (lenSize < 0) { if (lenSize < 0)
{
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: internal error in report buffer\n"); printf("IED_SERVER: internal error in report buffer\n");
@ -3656,7 +3684,8 @@ sendNextReportEntrySegment(ReportControl* self)
/* now calculate the exact information report segment size */ /* now calculate the exact information report segment size */
if (segmented) { if (segmented)
{
int segmentedSize = MmsValue_encodeMmsData(&_moreFollows, NULL, 0, false) + MmsValue_encodeMmsData(subSeqNum, NULL, 0, false); int segmentedSize = MmsValue_encodeMmsData(&_moreFollows, NULL, 0, false) + MmsValue_encodeMmsData(subSeqNum, NULL, 0, false);
accessResultSize += segmentedSize; accessResultSize += segmentedSize;
} }
@ -3667,7 +3696,8 @@ sendNextReportEntrySegment(ReportControl* self)
uint32_t informationReportSize = 1 + informationReportContentSize + BerEncoder_determineLengthSize(informationReportContentSize); uint32_t informationReportSize = 1 + informationReportContentSize + BerEncoder_determineLengthSize(informationReportContentSize);
uint32_t completeMessageSize = 1 + informationReportSize + BerEncoder_determineLengthSize(informationReportSize); uint32_t completeMessageSize = 1 + informationReportSize + BerEncoder_determineLengthSize(informationReportSize);
if (((int) completeMessageSize > maxMmsPduSize) || (numberOfAddedElements == 0)) { if (((int) completeMessageSize > maxMmsPduSize) || (numberOfAddedElements == 0))
{
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: MMS PDU size too small to encode report data (max PDU size = %i) -> skip message!\n", maxMmsPduSize); printf("IED_SERVER: MMS PDU size too small to encode report data (max PDU size = %i) -> skip message!\n", maxMmsPduSize);
@ -3730,10 +3760,12 @@ sendNextReportEntrySegment(ReportControl* self)
bufPos = MmsValue_encodeMmsData(self->inclusionField, buffer, bufPos, true); bufPos = MmsValue_encodeMmsData(self->inclusionField, buffer, bufPos, true);
/* encode data references if selected */ /* encode data references if selected */
if (MmsValue_getBitStringBit(optFlds, 5)) { /* data-reference */ if (MmsValue_getBitStringBit(optFlds, 5)) /* data-reference */
{
DataSetEntry* dataSetEntry = getDataSetEntryWithIndex(self->dataSet->fcdas, startElementIndex); DataSetEntry* dataSetEntry = getDataSetEntryWithIndex(self->dataSet->fcdas, startElementIndex);
for (i = startElementIndex; i < maxIndex; i++) { for (i = startElementIndex; i < maxIndex; i++)
{
bool addReferenceForEntry = false; bool addReferenceForEntry = false;
if (report->flags > 0) if (report->flags > 0)
@ -3741,8 +3773,8 @@ sendNextReportEntrySegment(ReportControl* self)
else if (MmsValue_getBitStringBit(self->inclusionField, i)) else if (MmsValue_getBitStringBit(self->inclusionField, i))
addReferenceForEntry = true; addReferenceForEntry = true;
if (addReferenceForEntry) { if (addReferenceForEntry)
{
char dataReference[130]; char dataReference[130];
int currentPos = 0; int currentPos = 0;
@ -3753,7 +3785,8 @@ sendNextReportEntrySegment(ReportControl* self)
} }
int ldNameLength = (int) strlen(dataSetEntry->logicalDeviceName); int ldNameLength = (int) strlen(dataSetEntry->logicalDeviceName);
for (j = 0; j < ldNameLength; j++) { for (j = 0; j < ldNameLength; j++)
{
dataReference[currentPos] = dataSetEntry->logicalDeviceName[j]; dataReference[currentPos] = dataSetEntry->logicalDeviceName[j];
currentPos++; currentPos++;
} }

@ -1,7 +1,7 @@
/* /*
* model.c * model.c
* *
* Copyright 2013-2022 Michael Zillgith * Copyright 2013-2024 Michael Zillgith
* *
* This file is part of libIEC61850. * This file is part of libIEC61850.
* *
@ -23,21 +23,23 @@
#include "iec61850_model.h" #include "iec61850_model.h"
#include "stack_config.h"
#include "libiec61850_platform_includes.h" #include "libiec61850_platform_includes.h"
#include "stack_config.h"
static void static void
setAttributeValuesToNull(ModelNode* node) setAttributeValuesToNull(ModelNode* node)
{ {
if (node->modelType == DataAttributeModelType) { if (node->modelType == DataAttributeModelType)
DataAttribute* da = (DataAttribute*) node; {
DataAttribute* da = (DataAttribute*)node;
da->mmsValue = NULL; da->mmsValue = NULL;
} }
ModelNode* child = node->firstChild; ModelNode* child = node->firstChild;
while (child != NULL) { while (child != NULL)
{
setAttributeValuesToNull(child); setAttributeValuesToNull(child);
child = child->sibling; child = child->sibling;
} }
@ -46,7 +48,7 @@ setAttributeValuesToNull(ModelNode* node)
void void
IedModel_setIedName(IedModel* self, const char* name) IedModel_setIedName(IedModel* self, const char* name)
{ {
self->name = (char*) name; self->name = (char*)name;
} }
void void
@ -54,95 +56,105 @@ IedModel_setAttributeValuesToNull(IedModel* iedModel)
{ {
LogicalDevice* ld = iedModel->firstChild; LogicalDevice* ld = iedModel->firstChild;
while (ld != NULL) { while (ld != NULL)
{
LogicalNode* ln = (LogicalNode*) ld->firstChild; LogicalNode* ln = (LogicalNode*)ld->firstChild;
while (ln != NULL) { while (ln != NULL)
{
ModelNode* node = ln->firstChild; ModelNode* node = ln->firstChild;
while (node != NULL) { while (node != NULL)
{
setAttributeValuesToNull(node); setAttributeValuesToNull(node);
node = node->sibling; node = node->sibling;
} }
ln = (LogicalNode*) ln->sibling; ln = (LogicalNode*)ln->sibling;
} }
ld = (LogicalDevice*) ld->sibling; ld = (LogicalDevice*)ld->sibling;
} }
} }
int int
IedModel_getLogicalDeviceCount(IedModel* self) IedModel_getLogicalDeviceCount(IedModel* self)
{ {
if (self->firstChild == NULL) if (self->firstChild == NULL)
return 0; return 0;
LogicalDevice* logicalDevice = self->firstChild; LogicalDevice* logicalDevice = self->firstChild;
int ldCount = 1; int ldCount = 1;
while (logicalDevice->sibling != NULL) { while (logicalDevice->sibling != NULL)
logicalDevice = (LogicalDevice*) logicalDevice->sibling; {
ldCount++; logicalDevice = (LogicalDevice*)logicalDevice->sibling;
} ldCount++;
}
return ldCount; return ldCount;
} }
DataSet* DataSet*
IedModel_lookupDataSet(IedModel* self, const char* dataSetReference /* e.g. ied1Inverter/LLN0$dataset1 */) IedModel_lookupDataSet(IedModel* self, const char* dataSetReference /* e.g. ied1Inverter/LLN0$dataset1 */)
{ {
DataSet* dataSet = self->dataSets; DataSet* dataSet = self->dataSets;
const char* separator = strchr(dataSetReference, '/'); const char* separator = strchr(dataSetReference, '/');
if (separator == NULL) if (separator == NULL)
return NULL; return NULL;
int ldNameLen = separator - dataSetReference;
char domainName[65]; int ldNameLen = separator - dataSetReference;
int modelNameLen = strlen(self->name); char domainName[65];
if (modelNameLen > 64) int modelNameLen = strlen(self->name);
return NULL;
memcpy(domainName, self->name, modelNameLen); if (modelNameLen > 64)
return NULL;
while (dataSet != NULL) { memcpy(domainName, self->name, modelNameLen);
LogicalDevice* ld = IedModel_getDeviceByInst(self, dataSet->logicalDeviceName); while (dataSet != NULL)
{
LogicalDevice* ld = IedModel_getDeviceByInst(self, dataSet->logicalDeviceName);
if (ld) { if (ld)
if (ld->ldName == NULL) { {
if (ld->ldName == NULL)
{
/* LD name = IEDName + ldInst */ /* LD name = IEDName + ldInst */
domainName[modelNameLen] = 0; domainName[modelNameLen] = 0;
StringUtils_appendString(domainName, 65, dataSet->logicalDeviceName); StringUtils_appendString(domainName, 65, dataSet->logicalDeviceName);
if (strncmp(domainName, dataSetReference, ldNameLen) == 0) { if (strncmp(domainName, dataSetReference, ldNameLen) == 0)
if (strcmp(dataSet->name, separator + 1) == 0) { {
return dataSet; if (strcmp(dataSet->name, separator + 1) == 0)
} {
}
}
else {
/* functional naming */
if (strncmp(ld->ldName, dataSetReference, ldNameLen) == 0) {
if (strcmp(dataSet->name, separator + 1) == 0) {
return dataSet; return dataSet;
} }
} }
} }
else
} {
/* functional naming */
if (strncmp(ld->ldName, dataSetReference, ldNameLen) == 0)
{
if (strcmp(dataSet->name, separator + 1) == 0)
{
return dataSet;
}
}
}
}
dataSet = dataSet->sibling; dataSet = dataSet->sibling;
} }
return NULL; return NULL;
} }
LogicalDevice* LogicalDevice*
@ -150,14 +162,16 @@ IedModel_getDevice(IedModel* self, const char* deviceName)
{ {
LogicalDevice* device = self->firstChild; LogicalDevice* device = self->firstChild;
while (device) { while (device)
{
if (device->ldName) { if (device->ldName)
{
/* functional naming */ /* functional naming */
if (strcmp(device->ldName, deviceName) == 0) if (strcmp(device->ldName, deviceName) == 0)
return device; return device;
} }
else { else
{
/* LD name = IEDName + ldInst */ /* LD name = IEDName + ldInst */
char domainName[65]; char domainName[65];
@ -167,7 +181,7 @@ IedModel_getDevice(IedModel* self, const char* deviceName)
return device; return device;
} }
device = (LogicalDevice*) device->sibling; device = (LogicalDevice*)device->sibling;
} }
return NULL; return NULL;
@ -180,10 +194,10 @@ IedModel_getDeviceByInst(IedModel* self, const char* ldInst)
while (device) while (device)
{ {
if (strcmp(device->name, ldInst) == 0) if (strcmp(device->name, ldInst) == 0)
return device; return device;
device = (LogicalDevice*) device->sibling; device = (LogicalDevice*)device->sibling;
} }
return NULL; return NULL;
@ -196,14 +210,14 @@ IedModel_getDeviceByIndex(IedModel* self, int index)
int currentIndex = 0; int currentIndex = 0;
while (logicalDevice) { while (logicalDevice)
{
if (currentIndex == index) if (currentIndex == index)
return logicalDevice; return logicalDevice;
currentIndex++; currentIndex++;
logicalDevice = (LogicalDevice*) logicalDevice->sibling; logicalDevice = (LogicalDevice*)logicalDevice->sibling;
} }
return NULL; return NULL;
@ -214,9 +228,11 @@ ModelNode_getDataAttributeByMmsValue(ModelNode* self, MmsValue* value)
{ {
ModelNode* node = self->firstChild; ModelNode* node = self->firstChild;
while (node != NULL) { while (node != NULL)
if (node->modelType == DataAttributeModelType) { {
DataAttribute* da = (DataAttribute*) node; if (node->modelType == DataAttributeModelType)
{
DataAttribute* da = (DataAttribute*)node;
if (da->mmsValue == value) if (da->mmsValue == value)
return da; return da;
@ -238,16 +254,14 @@ IedModel_lookupDataAttributeByMmsValue(IedModel* model, MmsValue* value)
{ {
LogicalDevice* ld = model->firstChild; LogicalDevice* ld = model->firstChild;
while (ld != NULL) { while (ld != NULL)
{
DataAttribute* da = DataAttribute* da = ModelNode_getDataAttributeByMmsValue((ModelNode*)ld, value);
ModelNode_getDataAttributeByMmsValue((ModelNode*) ld, value);
if (da != NULL) if (da != NULL)
return da; return da;
ld = (LogicalDevice*)ld->sibling;
ld = (LogicalDevice*) ld->sibling;
} }
return NULL; return NULL;
@ -260,9 +274,11 @@ getChildWithShortAddress(ModelNode* node, uint32_t sAddr)
child = node->firstChild; child = node->firstChild;
while (child != NULL) { while (child != NULL)
if (child->modelType == DataAttributeModelType) { {
DataAttribute* da = (DataAttribute*) child; if (child->modelType == DataAttributeModelType)
{
DataAttribute* da = (DataAttribute*)child;
if (da->sAddr == sAddr) if (da->sAddr == sAddr)
return child; return child;
@ -284,17 +300,18 @@ IedModel_getModelNodeByShortAddress(IedModel* model, uint32_t sAddr)
{ {
ModelNode* node = NULL; ModelNode* node = NULL;
LogicalDevice* ld = (LogicalDevice*) model->firstChild; LogicalDevice* ld = (LogicalDevice*)model->firstChild;
while (ld != NULL) {
LogicalNode* ln = (LogicalNode*) ld->firstChild; while (ld != NULL)
{
while (ln != NULL) { LogicalNode* ln = (LogicalNode*)ld->firstChild;
while (ln != NULL)
{
ModelNode* doNode = ln->firstChild; ModelNode* doNode = ln->firstChild;
while (doNode != NULL) { while (doNode != NULL)
{
ModelNode* matchingNode = getChildWithShortAddress(doNode, sAddr); ModelNode* matchingNode = getChildWithShortAddress(doNode, sAddr);
if (matchingNode != NULL) if (matchingNode != NULL)
@ -303,10 +320,10 @@ IedModel_getModelNodeByShortAddress(IedModel* model, uint32_t sAddr)
doNode = doNode->sibling; doNode = doNode->sibling;
} }
ln = (LogicalNode*) ln->sibling; ln = (LogicalNode*)ln->sibling;
} }
ld = (LogicalDevice*) ld->sibling; ld = (LogicalDevice*)ld->sibling;
} }
return node; return node;
@ -328,12 +345,13 @@ IedModel_getModelNodeByObjectReference(IedModel* model, const char* objectRefere
LogicalDevice* ld = IedModel_getDevice(model, objRef); LogicalDevice* ld = IedModel_getDevice(model, objRef);
if (ld == NULL) return NULL; if (ld == NULL)
return NULL;
if ((separator == NULL) || (*(separator + 1) == 0)) if ((separator == NULL) || (*(separator + 1) == 0))
return (ModelNode*) ld; return (ModelNode*)ld;
return ModelNode_getChild((ModelNode*) ld, separator + 1); return ModelNode_getChild((ModelNode*)ld, separator + 1);
} }
#if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1) #if (CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT == 1)
@ -345,13 +363,14 @@ IedModel_getSVControlBlock(IedModel* self, LogicalNode* parentLN, const char* sv
SVControlBlock* svCb = self->svCBs; SVControlBlock* svCb = self->svCBs;
while (svCb != NULL) { while (svCb != NULL)
if ((svCb->parent == parentLN) && (strcmp(svCb->name, svcbName) == 0)) { {
if ((svCb->parent == parentLN) && (strcmp(svCb->name, svcbName) == 0))
{
retVal = svCb; retVal = svCb;
break; break;
} }
svCb = svCb->sibling; svCb = svCb->sibling;
} }
@ -379,8 +398,10 @@ IedModel_getModelNodeByShortObjectReference(IedModel* model, const char* objectR
LogicalDevice* ld = IedModel_getDeviceByInst(model, ldInst); LogicalDevice* ld = IedModel_getDeviceByInst(model, ldInst);
if (ld == NULL) { if (ld == NULL)
if (DEBUG_IED_SERVER) { {
if (DEBUG_IED_SERVER)
{
printf("IED_SERVER: LD (%s) not found\n", ldInst); printf("IED_SERVER: LD (%s) not found\n", ldInst);
} }
@ -388,150 +409,159 @@ IedModel_getModelNodeByShortObjectReference(IedModel* model, const char* objectR
} }
if ((separator == NULL) || (*(separator + 1) == 0)) if ((separator == NULL) || (*(separator + 1) == 0))
return (ModelNode*) ld; return (ModelNode*)ld;
return ModelNode_getChild((ModelNode*) ld, separator + 1); return ModelNode_getChild((ModelNode*)ld, separator + 1);
} }
bool bool
DataObject_hasFCData(DataObject* dataObject, FunctionalConstraint fc) DataObject_hasFCData(DataObject* dataObject, FunctionalConstraint fc)
{ {
ModelNode* modelNode = dataObject->firstChild; ModelNode* modelNode = dataObject->firstChild;
while (modelNode != NULL) { while (modelNode != NULL)
{
if (modelNode->modelType == DataAttributeModelType) { if (modelNode->modelType == DataAttributeModelType)
DataAttribute* dataAttribute = (DataAttribute*) modelNode; {
DataAttribute* dataAttribute = (DataAttribute*)modelNode;
if (dataAttribute->fc == fc)
return true;
}
else if (modelNode->modelType == DataObjectModelType) {
if (DataObject_hasFCData((DataObject*) modelNode, fc)) if (dataAttribute->fc == fc)
return true; return true;
} }
else if (modelNode->modelType == DataObjectModelType)
{
if (DataObject_hasFCData((DataObject*)modelNode, fc))
return true;
}
modelNode = modelNode->sibling; modelNode = modelNode->sibling;
} }
return false; return false;
} }
bool bool
LogicalNode_hasFCData(LogicalNode* node, FunctionalConstraint fc) LogicalNode_hasFCData(LogicalNode* node, FunctionalConstraint fc)
{ {
DataObject* dataObject = (DataObject*) node->firstChild; DataObject* dataObject = (DataObject*)node->firstChild;
while (dataObject != NULL) { while (dataObject != NULL)
if (DataObject_hasFCData(dataObject, fc)) {
return true; if (DataObject_hasFCData(dataObject, fc))
return true;
dataObject = (DataObject*) dataObject->sibling; dataObject = (DataObject*)dataObject->sibling;
} }
return false; return false;
} }
DataSet* DataSet*
LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName) LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName)
{ {
assert(self->modelType == LogicalNodeModelType); assert(self->modelType == LogicalNodeModelType);
assert(dataSetName != NULL); assert(dataSetName != NULL);
char dsName[66]; char dsName[66];
LogicalDevice* ld = (LogicalDevice*) self->parent; LogicalDevice* ld = (LogicalDevice*)self->parent;
if (strlen(dataSetName) > 32) { if (strlen(dataSetName) > 32)
{
if (DEBUG_IED_SERVER) { if (DEBUG_IED_SERVER)
printf("IED_SERVER: LogicalNode_getDataSet - data set name %s too long!\n", dataSetName); {
} printf("IED_SERVER: LogicalNode_getDataSet - data set name %s too long!\n", dataSetName);
}
goto exit_error;
}
StringUtils_createStringInBuffer(dsName, 66, 3, self->name, "$", dataSetName); goto exit_error;
}
IedModel* iedModel = (IedModel*) ld->parent; StringUtils_createStringInBuffer(dsName, 66, 3, self->name, "$", dataSetName);
DataSet* ds = iedModel->dataSets; IedModel* iedModel = (IedModel*)ld->parent;
while (ds != NULL) { DataSet* ds = iedModel->dataSets;
if (strcmp(ds->logicalDeviceName, ld->name) == 0) {
if (strcmp(ds->name, dsName) == 0) {
return ds;
}
}
ds = ds->sibling; while (ds != NULL)
} {
if (strcmp(ds->logicalDeviceName, ld->name) == 0)
{
if (strcmp(ds->name, dsName) == 0)
{
return ds;
}
}
ds = ds->sibling;
}
exit_error: exit_error:
return NULL; return NULL;
} }
int int
LogicalDevice_getLogicalNodeCount(LogicalDevice* logicalDevice) LogicalDevice_getLogicalNodeCount(LogicalDevice* logicalDevice)
{ {
int lnCount = 0; int lnCount = 0;
LogicalNode* logicalNode = (LogicalNode*) logicalDevice->firstChild; LogicalNode* logicalNode = (LogicalNode*)logicalDevice->firstChild;
while (logicalNode != NULL) { while (logicalNode != NULL)
logicalNode = (LogicalNode*) logicalNode->sibling; {
lnCount++; logicalNode = (LogicalNode*)logicalNode->sibling;
} lnCount++;
}
return lnCount; return lnCount;
} }
ModelNode* ModelNode*
LogicalDevice_getChildByMmsVariableName(LogicalDevice* logicalDevice, const char* mmsVariableName) LogicalDevice_getChildByMmsVariableName(LogicalDevice* logicalDevice, const char* mmsVariableName)
{ {
const char* separator = strchr(mmsVariableName,'$'); const char* separator = strchr(mmsVariableName, '$');
if (separator == NULL) if (separator == NULL)
return NULL; return NULL;
if (strlen(separator) > 4) { if (strlen(separator) > 4)
char fcString[3]; {
char nameRef[65]; char fcString[3];
char nameRef[65];
fcString[0] = separator[1]; fcString[0] = separator[1];
fcString[1] = separator[2]; fcString[1] = separator[2];
fcString[2] = 0; fcString[2] = 0;
const char* strpos = mmsVariableName; const char* strpos = mmsVariableName;
int targetPos = 0; int targetPos = 0;
while (strpos < separator) { while (strpos < separator)
nameRef[targetPos++] = strpos[0]; {
strpos++; nameRef[targetPos++] = strpos[0];
} strpos++;
}
nameRef[targetPos++] = '.'; nameRef[targetPos++] = '.';
strpos = separator + 4; strpos = separator + 4;
while (strpos[0] != 0) { while (strpos[0] != 0)
nameRef[targetPos++] = strpos[0]; {
strpos++; nameRef[targetPos++] = strpos[0];
} strpos++;
}
nameRef[targetPos++] = 0; nameRef[targetPos++] = 0;
StringUtils_replace(nameRef, '$', '.'); StringUtils_replace(nameRef, '$', '.');
FunctionalConstraint fc = FunctionalConstraint_fromString(fcString); FunctionalConstraint fc = FunctionalConstraint_fromString(fcString);
return ModelNode_getChildWithFc((ModelNode*) logicalDevice, nameRef, fc); return ModelNode_getChildWithFc((ModelNode*)logicalDevice, nameRef, fc);
} }
return NULL; return NULL;
} }
static int static int
@ -566,11 +596,11 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
} }
else else
{ {
LogicalNode* lNode = (LogicalNode*) node; LogicalNode* lNode = (LogicalNode*)node;
LogicalDevice* lDevice = (LogicalDevice*) lNode->parent; LogicalDevice* lDevice = (LogicalDevice*)lNode->parent;
IedModel* iedModel = (IedModel*) lDevice->parent; IedModel* iedModel = (IedModel*)lDevice->parent;
bufPos = 0; bufPos = 0;
@ -581,10 +611,12 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
} }
else else
{ {
if (lDevice->ldName) { if (lDevice->ldName)
{
StringUtils_copyStringMax(objectReference, bufSize, lDevice->ldName); StringUtils_copyStringMax(objectReference, bufSize, lDevice->ldName);
} }
else { else
{
StringUtils_concatString(objectReference, bufSize, iedModel->name, lDevice->name); StringUtils_concatString(objectReference, bufSize, iedModel->name, lDevice->name);
} }
} }
@ -605,13 +637,15 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
if (bufPos + nameLength < bufSize) if (bufPos + nameLength < bufSize)
{ {
int i; int i;
for (i = 0; i < nameLength; i++) { for (i = 0; i < nameLength; i++)
{
objectReference[bufPos++] = node->name[i]; objectReference[bufPos++] = node->name[i];
} }
return bufPos; return bufPos;
} }
else { else
{
return -1; return -1;
} }
} }
@ -630,7 +664,8 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
objectReference[bufPos++] = '('; objectReference[bufPos++] = '(';
for (i = 0; i < arrayIndexStrLength; i++) { for (i = 0; i < arrayIndexStrLength; i++)
{
objectReference[bufPos++] = arrayIndexStr[i]; objectReference[bufPos++] = arrayIndexStr[i];
} }
objectReference[bufPos++] = ')'; objectReference[bufPos++] = ')';
@ -655,7 +690,7 @@ ModelNode_getObjectReferenceEx(ModelNode* node, char* objectReference, bool with
if (objectReference == NULL) if (objectReference == NULL)
{ {
objectReference = (char*) GLOBAL_MALLOC(130); objectReference = (char*)GLOBAL_MALLOC(130);
allocated = true; allocated = true;
} }
@ -681,17 +716,19 @@ ModelNode_getObjectReferenceEx(ModelNode* node, char* objectReference, bool with
} }
int int
ModelNode_getChildCount(ModelNode* modelNode) { ModelNode_getChildCount(ModelNode* modelNode)
int childCount = 0; {
int childCount = 0;
ModelNode* child = modelNode->firstChild; ModelNode* child = modelNode->firstChild;
while (child != NULL) { while (child != NULL)
childCount++; {
child = child->sibling; childCount++;
} child = child->sibling;
}
return childCount; return childCount;
} }
ModelNode* ModelNode*
@ -713,7 +750,7 @@ ModelNode_getChild(ModelNode* self, const char* name)
if (arraySeparator2) if (arraySeparator2)
{ {
int idx = (int) strtol(arraySeparator + 1, NULL, 10); int idx = (int)strtol(arraySeparator + 1, NULL, 10);
ModelNode* arrayNode = NULL; ModelNode* arrayNode = NULL;
@ -740,7 +777,8 @@ ModelNode_getChild(ModelNode* self, const char* name)
ModelNode* childNode = ModelNode_getChild(self, nameCopy); ModelNode* childNode = ModelNode_getChild(self, nameCopy);
if (childNode) { if (childNode)
{
arrayNode = ModelNode_getChildWithIdx(childNode, idx); arrayNode = ModelNode_getChildWithIdx(childNode, idx);
} }
else else
@ -764,11 +802,11 @@ ModelNode_getChild(ModelNode* self, const char* name)
else else
return NULL; return NULL;
} }
else { else
{
/* invalid name */ /* invalid name */
return NULL; return NULL;
} }
} }
int nameElementLength = 0; int nameElementLength = 0;
@ -784,7 +822,8 @@ ModelNode_getChild(ModelNode* self, const char* name)
while (nextNode) while (nextNode)
{ {
if (nextNode->name == NULL) { if (nextNode->name == NULL)
{
break; /* is an array element */ break; /* is an array element */
} }
@ -802,7 +841,8 @@ ModelNode_getChild(ModelNode* self, const char* name)
nextNode = nextNode->sibling; nextNode = nextNode->sibling;
} }
if ((separator != NULL) && (matchingNode != NULL)) { if ((separator != NULL) && (matchingNode != NULL))
{
return ModelNode_getChild(matchingNode, separator + 1); return ModelNode_getChild(matchingNode, separator + 1);
} }
else else
@ -840,68 +880,71 @@ ModelNode_getChildWithIdx(ModelNode* self, int idx)
ModelNode* ModelNode*
ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc) ModelNode_getChildWithFc(ModelNode* self, const char* name, FunctionalConstraint fc)
{ {
/* check for separator */ /* check for separator */
const char* separator = strchr(name, '.'); const char* separator = strchr(name, '.');
int nameElementLength = 0; int nameElementLength = 0;
if (separator != NULL) if (separator != NULL)
nameElementLength = (separator - name); nameElementLength = (separator - name);
else else
nameElementLength = strlen(name); nameElementLength = strlen(name);
ModelNode* nextNode = self->firstChild; ModelNode* nextNode = self->firstChild;
ModelNode* matchingNode = NULL; ModelNode* matchingNode = NULL;
while (nextNode != NULL) while (nextNode != NULL)
{ {
int nodeNameLen = strlen(nextNode->name); int nodeNameLen = strlen(nextNode->name);
if (nodeNameLen == nameElementLength) if (nodeNameLen == nameElementLength)
{ {
if (memcmp(nextNode->name, name, nodeNameLen) == 0) if (memcmp(nextNode->name, name, nodeNameLen) == 0)
{ {
if (separator == NULL) if (separator == NULL)
{ {
if (nextNode->modelType == DataAttributeModelType) if (nextNode->modelType == DataAttributeModelType)
{ {
DataAttribute* da = (DataAttribute*) nextNode; DataAttribute* da = (DataAttribute*)nextNode;
if (da->fc == fc) { if (da->fc == fc)
matchingNode = nextNode; {
break; matchingNode = nextNode;
} break;
} }
} }
else }
{ else
if (nextNode->modelType == DataAttributeModelType) {
{ if (nextNode->modelType == DataAttributeModelType)
DataAttribute* da = (DataAttribute*) nextNode; {
DataAttribute* da = (DataAttribute*)nextNode;
if (da->fc == fc) if (da->fc == fc)
{ {
matchingNode = nextNode; matchingNode = nextNode;
break; break;
} }
} }
else { else
matchingNode = nextNode; {
break; matchingNode = nextNode;
} break;
} }
} }
} }
}
nextNode = nextNode->sibling; nextNode = nextNode->sibling;
} }
if ((separator != NULL) && (matchingNode != NULL)) { if ((separator != NULL) && (matchingNode != NULL))
return ModelNode_getChildWithFc(matchingNode, separator + 1, fc); {
} return ModelNode_getChildWithFc(matchingNode, separator + 1, fc);
else }
return matchingNode; else
return matchingNode;
} }
ModelNodeType ModelNodeType
@ -932,7 +975,8 @@ ModelNode_getChildren(ModelNode* self)
ModelNode* childNode = self->firstChild; ModelNode* childNode = self->firstChild;
while (childNode) { while (childNode)
{
LinkedList_add(childNodes, childNode); LinkedList_add(childNodes, childNode);
childNode = childNode->sibling; childNode = childNode->sibling;
@ -944,20 +988,21 @@ ModelNode_getChildren(ModelNode* self)
LogicalNode* LogicalNode*
LogicalDevice_getLogicalNode(LogicalDevice* self, const char* nodeName) LogicalDevice_getLogicalNode(LogicalDevice* self, const char* nodeName)
{ {
return (LogicalNode*) ModelNode_getChild((ModelNode*) self, nodeName); return (LogicalNode*)ModelNode_getChild((ModelNode*)self, nodeName);
} }
SettingGroupControlBlock* SettingGroupControlBlock*
LogicalDevice_getSettingGroupControlBlock(LogicalDevice* self) LogicalDevice_getSettingGroupControlBlock(LogicalDevice* self)
{ {
IedModel* model = (IedModel*) self->parent; IedModel* model = (IedModel*)self->parent;
if (model == NULL) if (model == NULL)
return NULL; return NULL;
LogicalNode* ln = LogicalDevice_getLogicalNode(self, "LLN0"); LogicalNode* ln = LogicalDevice_getLogicalNode(self, "LLN0");
if (ln == NULL) { if (ln == NULL)
{
if (DEBUG_IED_SERVER) if (DEBUG_IED_SERVER)
printf("IED_SERVER: logical node LLN0 not found!\n"); printf("IED_SERVER: logical node LLN0 not found!\n");
@ -966,7 +1011,8 @@ LogicalDevice_getSettingGroupControlBlock(LogicalDevice* self)
SettingGroupControlBlock* sgcb = model->sgcbs; SettingGroupControlBlock* sgcb = model->sgcbs;
while (sgcb != NULL) { while (sgcb != NULL)
{
if (sgcb->parent == ln) if (sgcb->parent == ln)
return sgcb; return sgcb;

Loading…
Cancel
Save