static void createDataSetsFromLogicalNode(MmsDevice* mmsDevice, LogicalNode* logicalNode, MmsDomain* domain) { if (logicalNode->dataSets != NULL) { int dataSetCount = ArrayList_listSize((void**) (logicalNode->dataSets)); int i; for (i = 0; i < dataSetCount; i++) { char* dataSetName = createString(3, logicalNode->name, "$", logicalNode->dataSets[i]->name); MmsNamedVariableList varList = MmsNamedVariableList_create(dataSetName, false); int fcdaCount = ArrayList_listSize((void**) (logicalNode->dataSets[i]->fcda)); int j; MmsNamedVariableListEntry variableListEntry; for (j = 0; j < fcdaCount; j++) { char* variableName = MmsMapping_createMmsVariableNameFromObjectReference( logicalNode->dataSets[i]->fcda[j]->objectReference, logicalNode->dataSets[i]->fcda[j]->fc); char* domainName = MmsMapping_getMmsDomainFromObjectReference( logicalNode->dataSets[i]->fcda[j]->objectReference); MmsDomain* variableDomain; if (domainName != NULL) variableDomain = MmsDevice_getDomain(mmsDevice, domainName); else variableDomain = domain; variableListEntry = MmsNamedVariableListEntry_create(variableDomain, variableName); MmsNamedVariableList_addVariable(varList, variableListEntry); free(domainName); free(variableName); } MmsDomain_addNamedVariableList(domain, varList); free(dataSetName); } } }
static MmsNamedVariableList createNamedVariableList(MmsDevice* device, DefineNamedVariableListRequest_t* request, char* variableListName) { MmsNamedVariableList namedVariableList = MmsNamedVariableList_create(variableListName, true); int variableCount = request->listOfVariable.list.count; int i; for (i = 0; i < variableCount; i++) { VariableSpecification_t* varSpec = &request->listOfVariable.list.array[i]->variableSpecification; if (varSpec->present == VariableSpecification_PR_name) { char* variableName = createStringFromBuffer( varSpec->choice.name.choice.domainspecific.itemId.buf, varSpec->choice.name.choice.domainspecific.itemId.size); char* domainId = createStringFromBuffer( varSpec->choice.name.choice.domainspecific.domainId.buf, varSpec->choice.name.choice.domainspecific.domainId.size); MmsDomain* domain = MmsDevice_getDomain(device, domainId); MmsNamedVariableListEntry variable = MmsNamedVariableListEntry_create(domain, variableName); MmsNamedVariableList_addVariable(namedVariableList, variable); free(domainId); free(variableName); } else { MmsNamedVariableList_destroy(namedVariableList); namedVariableList = NULL; break; } } return namedVariableList; }
static MmsNamedVariableList createNamedVariableList(MmsDomain* domain, MmsDevice* device, DefineNamedVariableListRequest_t* request, char* variableListName, MmsError* mmsError) { MmsNamedVariableList namedVariableList = NULL; int variableCount = request->listOfVariable.list.count; if (variableCount > CONFIG_MMS_MAX_NUMBER_OF_DATA_SET_MEMBERS) { *mmsError = MMS_ERROR_DEFINITION_OTHER; goto exit_function; } namedVariableList = MmsNamedVariableList_create(domain, variableListName, true); int i; for (i = 0; i < variableCount; i++) { VariableSpecification_t* varSpec = &request->listOfVariable.list.array[i]->variableSpecification; long arrayIndex = -1; char componentNameBuf[65]; char* componentName = NULL; /* Handle alternate access specification - for array element definition */ if (request->listOfVariable.list.array[i]->alternateAccess != NULL) { if (request->listOfVariable.list.array[i]->alternateAccess->list.count != 1) { MmsNamedVariableList_destroy(namedVariableList); namedVariableList = NULL; break; } else { struct AlternateAccess__Member* alternateAccess = request->listOfVariable.list.array[i]->alternateAccess->list.array[0]; if ((alternateAccess->present == AlternateAccess__Member_PR_unnamed) &&(alternateAccess->choice.unnamed->present == AlternateAccessSelection_PR_selectAlternateAccess) && (alternateAccess->choice.unnamed->choice.selectAlternateAccess.accessSelection.present == AlternateAccessSelection__selectAlternateAccess__accessSelection_PR_index)) { asn_INTEGER2long(&(alternateAccess->choice.unnamed->choice.selectAlternateAccess.accessSelection.choice.index), &arrayIndex); Identifier_t componentIdentifier = alternateAccess->choice.unnamed-> choice.selectAlternateAccess.alternateAccess->list.array[0]-> choice.unnamed->choice.selectAccess.choice.component; componentName = StringUtils_createStringFromBufferInBuffer(componentNameBuf, componentIdentifier.buf, componentIdentifier.size); } else { MmsNamedVariableList_destroy(namedVariableList); namedVariableList = NULL; *mmsError = MMS_ERROR_DEFINITION_INVALID_ADDRESS; break; } } } if (varSpec->present == VariableSpecification_PR_name) { char variableName[65]; char domainId[65]; StringUtils_createStringFromBufferInBuffer(variableName, varSpec->choice.name.choice.domainspecific.itemId.buf, varSpec->choice.name.choice.domainspecific.itemId.size); StringUtils_createStringFromBufferInBuffer(domainId, varSpec->choice.name.choice.domainspecific.domainId.buf, varSpec->choice.name.choice.domainspecific.domainId.size); MmsDomain* elementDomain = MmsDevice_getDomain(device, domainId); MmsAccessSpecifier accessSpecifier; accessSpecifier.domain = elementDomain; accessSpecifier.variableName = variableName; accessSpecifier.arrayIndex = arrayIndex; accessSpecifier.componentName = componentName; // check if element exists if (checkIfVariableExists(device, &accessSpecifier) == true) { MmsNamedVariableListEntry variable = MmsNamedVariableListEntry_create(accessSpecifier); MmsNamedVariableList_addVariable(namedVariableList, variable); } else { MmsNamedVariableList_destroy(namedVariableList); namedVariableList = NULL; i = variableCount; // exit loop after freeing loop variables *mmsError = MMS_ERROR_DEFINITION_OBJECT_UNDEFINED; } } else { MmsNamedVariableList_destroy(namedVariableList); namedVariableList = NULL; *mmsError = MMS_ERROR_DEFINITION_INVALID_ADDRESS; break; } } exit_function: return namedVariableList; }