- added data-reference support for buffered reports (server side)

pull/6/head
Michael Zillgith 11 years ago
parent f53b254097
commit a6652dc643

@ -362,11 +362,9 @@ sendReport(ReportControl* self, bool isIntegrity, bool isGI)
/* add data set value elements */
DataSetEntry* dataSetEntry = self->dataSet->fcdas;
int i = 0;
for (i = 0; i < self->dataSet->elementCount; i++) {
assert(dataSetEntry->value != NULL);
@ -1809,8 +1807,6 @@ sendNextReportEntry(ReportControl* self)
MmsValue* entryIdValue = MmsValue_getElement(self->rcbValues, 11);
MmsValue_setOctetString(entryIdValue, (uint8_t*) report->entryId, 8);
//LinkedList reportElements = LinkedList_create();
MemAllocLinkedList reportElements = MemAllocLinkedList_create(&ma);
assert(reportElements != NULL);
@ -1850,9 +1846,6 @@ sendNextReportEntry(ReportControl* self)
uint8_t* valuesInReportBuffer = currentReportBufferPos;
/* delete option fields for unsupported options */
MmsValue_setBitStringBit(optFlds, 5, false); /* data-reference */
MmsValue_setBitStringBit(optFlds, 9, false); /* segmentation */
MmsValue* sqNum = ReportControl_getRCBValue(self, "SqNum");
@ -1914,6 +1907,85 @@ sendNextReportEntry(ReportControl* self)
if (MemAllocLinkedList_add(reportElements, inclusionField) == NULL)
goto return_out_of_memory;
/* add data references if selected */
if (MmsValue_getBitStringBit(optFlds, 5)) { /* data-reference */
DataSetEntry* dataSetEntry = self->dataSet->fcdas;
LogicalDevice* ld = (LogicalDevice*) self->parentLN->parent;
IedModel* iedModel = (IedModel*) ld->parent;
char* iedName = iedModel->name;
int iedNameLength = strlen(iedName);
int i = 0;
for (i = 0; i < self->dataSet->elementCount; i++) {
assert(dataSetEntry->value != NULL);
bool addReferenceForEntry = false;
if (report->flags > 0)
addReferenceForEntry = true;
else
if (MmsValue_getBitStringBit(inclusionField, i))
addReferenceForEntry = true;
if (addReferenceForEntry) {
int ldNameLength = strlen(dataSetEntry->logicalDeviceName);
int variableNameLength = strlen(dataSetEntry->variableName);
int refLen = iedNameLength
+ ldNameLength
+ variableNameLength + 1;
char* dataReference = (char*) MemoryAllocator_allocate(&ma, refLen);
if (dataReference == NULL) goto return_out_of_memory;
int currentPos = 0;
int j;
for (j = 0; j < iedNameLength; j++) {
dataReference[currentPos++] = iedName[j];
}
for (j = 0; j < ldNameLength; j++) {
dataReference[currentPos] = dataSetEntry->logicalDeviceName[j];
currentPos++;
}
dataReference[currentPos++] = '/';
for (j = 0; j < variableNameLength; j++) {
dataReference[currentPos++] = dataSetEntry->variableName[j];
}
dataReference[currentPos] = 0;
MmsValue* dataRef = (MmsValue*) MemoryAllocator_allocate(&ma, sizeof(MmsValue));
if (dataRef == NULL) goto return_out_of_memory;
dataRef->deleteValue = 0;
dataRef->type = MMS_VISIBLE_STRING;
dataRef->value.visibleString.buf = dataReference;
dataRef->value.visibleString.size = refLen;
if (MemAllocLinkedList_add(reportElements, dataRef) == NULL)
goto return_out_of_memory;
}
dataSetEntry = dataSetEntry->sibling;
}
}
/* add data set value elements */
int i = 0;
for (i = 0; i < self->dataSet->elementCount; i++) {
@ -2017,7 +2089,6 @@ sendNextReportEntry(ReportControl* self)
self->sqNum++;
MmsValue_setUint16(sqNum, self->sqNum);
//LinkedList_destroyStatic(reportElements);
assert(self->reportBuffer->nextToTransmit != self->reportBuffer->nextToTransmit->next);
self->reportBuffer->nextToTransmit = self->reportBuffer->nextToTransmit->next;

Loading…
Cancel
Save