Example #1
0
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;
}