void ControlObject_sendCommandTerminationPositive(ControlObject* self) { char itemId[68]; /* 64 characters + space for FC + separator + string terminator */ StringUtils_createStringInBuffer(itemId, 4, self->lnName, "$CO$", self->name, "$Oper"); if (DEBUG_IED_SERVER) printf("IED_SERVER: send CommandTermination+: %s\n", itemId); char* domainId = MmsDomain_getName(self->mmsDomain); MmsVariableAccessSpecification varSpec; varSpec.itemId = itemId; varSpec.domainId = domainId; LinkedList varSpecList = LinkedList_create(); LinkedList values = LinkedList_create(); if ((varSpecList != NULL) && (values != NULL)) { LinkedList_add(varSpecList, &varSpec); LinkedList_add(values, self->oper); MmsServerConnection_sendInformationReportListOfVariables(self->mmsConnection, varSpecList, values, false); LinkedList_destroyStatic(varSpecList); LinkedList_destroyStatic(values); } }
static char* createDataSetReferencForDefaultDataSet(ReportControlBlock* rcb, ReportControl* reportControl) { char* dataSetReference; char* domainName = MmsDomain_getName(reportControl->domain); char* lnName = rcb->parent->name; dataSetReference = createString(5, domainName, "/", lnName, "$", rcb->dataSetName); return dataSetReference; }
static void createGetNamedVariableListAttributesResponse(int invokeId, ByteBuffer* response, MmsNamedVariableList variableList, char* domainName) { char* variableDomainName; asn_enc_rval_t rval; int i; int variableCount; LinkedList variable; LinkedList variables; GetNamedVariableListAttributesResponse_t* varListResponse; MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId); BOOLEAN_t moreFollows = 0; mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present = ConfirmedServiceResponse_PR_getNamedVariableListAttributes; varListResponse = &(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse. choice.getNamedVariableListAttributes); varListResponse->mmsDeletable = MmsNamedVariableList_isDeletable(variableList); variables = MmsNamedVariableList_getVariableList(variableList); variableCount = LinkedList_size(variables); varListResponse->listOfVariable.list.count = variableCount; varListResponse->listOfVariable.list.size = variableCount; varListResponse->listOfVariable.list.array = calloc(variableCount, sizeof(void*)); variable = LinkedList_getNext(variables); for (i = 0; i < variableCount; i++) { MmsNamedVariableListEntry variableEntry = (MmsNamedVariableListEntry) variable->data; varListResponse->listOfVariable.list.array[i] = calloc(1, sizeof(struct GetNamedVariableListAttributesResponse__listOfVariable__Member)); varListResponse->listOfVariable.list.array[i]->variableSpecification.present = VariableSpecification_PR_name; varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.present = ObjectName_PR_domainspecific; variableDomainName = MmsDomain_getName(variableEntry->domain); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.buf = copyString(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.size = strlen(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.buf = copyString(variableEntry->variableName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.size = strlen(variableEntry->variableName); variable = LinkedList_getNext(variable); } rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response); if (DEBUG) xer_fprint(stdout, &asn_DEF_MmsPdu, mmsPdu); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); }
static void createGetNamedVariableListAttributesResponse(int invokeId, ByteBuffer* response, MmsNamedVariableList variableList) { MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId); mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present = ConfirmedServiceResponse_PR_getNamedVariableListAttributes; GetNamedVariableListAttributesResponse_t* varListResponse = &(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse. choice.getNamedVariableListAttributes); varListResponse->mmsDeletable = MmsNamedVariableList_isDeletable(variableList); LinkedList variables = MmsNamedVariableList_getVariableList(variableList); int variableCount = LinkedList_size(variables); varListResponse->listOfVariable.list.count = variableCount; varListResponse->listOfVariable.list.size = variableCount; varListResponse->listOfVariable.list.array = (struct GetNamedVariableListAttributesResponse__listOfVariable__Member**) GLOBAL_CALLOC(variableCount, sizeof(void*)); LinkedList variable = LinkedList_getNext(variables); int i; for (i = 0; i < variableCount; i++) { MmsNamedVariableListEntry variableEntry = (MmsNamedVariableListEntry) variable->data; varListResponse->listOfVariable.list.array[i] = (struct GetNamedVariableListAttributesResponse__listOfVariable__Member*) GLOBAL_CALLOC(1, sizeof(struct GetNamedVariableListAttributesResponse__listOfVariable__Member)); varListResponse->listOfVariable.list.array[i]->variableSpecification.present = VariableSpecification_PR_name; varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.present = ObjectName_PR_domainspecific; char* variableDomainName = MmsDomain_getName(variableEntry->domain); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.buf = (uint8_t*) copyString(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.size = strlen(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.buf = (uint8_t*) copyString(variableEntry->variableName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.size = strlen(variableEntry->variableName); variable = LinkedList_getNext(variable); } der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); }
void ControlObject_sendCommandTerminationNegative(ControlObject* self) { /* create LastApplError */ MmsValue lastApplErrorMemory; MmsValue* lastApplError = &lastApplErrorMemory; lastApplError->type = MMS_STRUCTURE; lastApplError->value.structure.size = 5; MmsValue* componentContainer[5]; lastApplError->value.structure.components = componentContainer; char ctlObj[130]; StringUtils_createStringInBuffer(ctlObj, 2, self->ctlObjectName, "$Oper"); MmsValue ctlObjValueMemory; MmsValue* ctlObjValue = &ctlObjValueMemory; ctlObjValue->type = MMS_VISIBLE_STRING; ctlObjValue->value.visibleString.buf = ctlObj; ctlObjValue->value.visibleString.size = sizeof(ctlObj); MmsValue_setElement(lastApplError, 0, ctlObjValue); MmsValue_setInt32(self->error, CONTROL_ERROR_UNKOWN); MmsValue_setInt32(self->addCause, ADD_CAUSE_UNKNOWN); MmsValue_setElement(lastApplError, 1, self->error); MmsValue_setElement(lastApplError, 2, self->origin); MmsValue_setElement(lastApplError, 3, self->ctlNum); MmsValue_setElement(lastApplError, 4, self->addCause); MmsVariableAccessSpecification lastApplErrorVarSpec; lastApplErrorVarSpec.itemId = "LastApplError"; lastApplErrorVarSpec.domainId = NULL; /* create oper variable */ char itemId[130]; StringUtils_createStringInBuffer(itemId, 4, self->lnName, "$CO$", self->name, "$Oper"); char* domainId = MmsDomain_getName(self->mmsDomain); MmsVariableAccessSpecification operVarSpec; operVarSpec.itemId = itemId; operVarSpec.domainId = domainId; /* create response */ if (DEBUG_IED_SERVER) printf("IED_SERVER: send CommandTermination-: %s\n", itemId); LinkedList varSpecList = LinkedList_create(); LinkedList values = LinkedList_create(); LinkedList_add(varSpecList, &lastApplErrorVarSpec); LinkedList_add(varSpecList, &operVarSpec); LinkedList_add(values, lastApplError); LinkedList_add(values, self->oper); MmsServerConnection_sendInformationReportListOfVariables(self->mmsConnection, varSpecList, values, false); LinkedList_destroyStatic(varSpecList); LinkedList_destroyStatic(values); } /* ControlObject_sendCommandTerminationNegative() */
static void initialize(ControlObject* self) { if (!(self->initialized)) { MmsServer mmsServer = IedServer_getMmsServer(self->iedServer); self->emptyString = MmsValue_newVisibleString(NULL); char* ctlModelName = createString(4, self->lnName, "$CF$", self->name, "$ctlModel"); if (DEBUG_IED_SERVER) printf("initialize control for %s\n", ctlModelName); MmsValue* ctlModel = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlModelName); if (ctlModel == NULL) { if (DEBUG_IED_SERVER) printf("No control model found for variable %s\n", ctlModelName); } GLOBAL_FREEMEM(ctlModelName); char* sboClassName = createString(4, self->lnName, "$CF$", self->name, "$sboClass"); self->sboClass = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, sboClassName); GLOBAL_FREEMEM(sboClassName); self->ctlObjectName = (char*) GLOBAL_MALLOC(130); StringUtils_createStringInBuffer(self->ctlObjectName, 5, MmsDomain_getName(self->mmsDomain), "/", self->lnName, "$CO$", self->name); self->error = MmsValue_newIntegerFromInt32(0); self->addCause = MmsValue_newIntegerFromInt32(0); if (ctlModel != NULL) { uint32_t ctlModelVal = MmsValue_toInt32(ctlModel); self->ctlModel = ctlModelVal; if (DEBUG_IED_SERVER) printf(" ctlModel: %i\n", ctlModelVal); if ((ctlModelVal == 2) || (ctlModelVal == 4)) { /* SBO */ char* sboTimeoutName = createString(4, self->lnName, "$CF$", self->name, "$sboTimeout"); char* controlObjectReference = createString(6, self->mmsDomain->domainName, "/", self->lnName, "$", self->name, "$SBO"); self->sbo = MmsValue_newVisibleString(controlObjectReference); self->sboTimeout = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, sboTimeoutName); updateSboTimeoutValue(self); setState(self, STATE_UNSELECTED); if (DEBUG_IED_SERVER) printf("timeout for %s is %i\n", sboTimeoutName, self->selectTimeout); GLOBAL_FREEMEM(controlObjectReference); GLOBAL_FREEMEM(sboTimeoutName); } else { self->sbo = MmsValue_newVisibleString(NULL); setState(self, STATE_READY); } } self->initialized = true; } }