From 98ec51346c2ab014c1210286b0c2ab7efb881435 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 8 Jan 2015 12:28:06 +0100 Subject: [PATCH] - changed back behaviour of LastApplError --- src/iec61850/client/ied_connection.c | 27 +++------------ src/iec61850/server/mms_mapping/control.c | 41 ++++++++++++++--------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index f80b326d..6dbedc9a 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -198,9 +198,6 @@ ClientDataSet_getDataSetSize(ClientDataSet self) static bool doesControlObjectMatch(char* objRef, char* cntrlObj) { - - printf("objRef: (%s) cntrlObj: (%s)\n", objRef, cntrlObj); - int objRefLen = strlen(objRef); char* separator = strchr(cntrlObj, '$'); @@ -225,31 +222,17 @@ doesControlObjectMatch(char* objRef, char* cntrlObj) if (separator[3] != '$') return false; - printf("Compare strings: (%s) vs (%s)\n", cntrlObjName, separator +4); - -// char* nextSeparator = strchr(separator + 4, '$'); + char* nextSeparator = strchr(separator + 4, '$'); -// if (nextSeparator == NULL) -// return false; + if (nextSeparator == NULL) + return false; int cntrlObjNameLen = strlen(cntrlObjName); - char* secondCntrlObjName = separator + 4; - - if (cntrlObjNameLen != strlen(secondCntrlObjName)) + if (cntrlObjNameLen != nextSeparator - (separator + 4)) return false; -// if (cntrlObjNameLen != nextSeparator - (separator + 4)) -// return false; - - - - // int i; - // for (i = 0; i < cntrlObjNameLen; i++) { - // if (controlObjName ) - // } - - if (memcmp(cntrlObjName, secondCntrlObjName, cntrlObjNameLen) == 0) + if (memcmp(cntrlObjName, separator + 4, cntrlObjNameLen) == 0) return true; return false; diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 3b0c6946..84c43875 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -115,7 +115,7 @@ struct sControlObject }; void -ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection* connection, int error, +ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection* connection, char* ctlVariable, int error, ControlAddCause addCause, MmsValue* ctlNum, MmsValue* origin, bool handlerMode); void @@ -361,7 +361,7 @@ executeStateMachine: if (dynamicCheckResult == CONTROL_RESULT_FAILED) { if (isTimeActivatedControl) { - ControlObject_sendLastApplError(self, self->mmsConnection, + ControlObject_sendLastApplError(self, self->mmsConnection, "Oper", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_BLOCKED_BY_SYNCHROCHECK, self->ctlNum, self->origin, false); } @@ -688,7 +688,7 @@ Control_processControlActions(MmsMapping* self, uint64_t currentTimeInMs) executeControlTask(controlObject); } else { - ControlObject_sendLastApplError(controlObject, controlObject->mmsConnection, + ControlObject_sendLastApplError(controlObject, controlObject->mmsConnection, "Oper", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_BLOCKED_BY_INTERLOCKING, controlObject->ctlNum, controlObject->origin, false); @@ -887,12 +887,16 @@ ControlObject_sendCommandTerminationNegative(ControlObject* self) lastApplError->value.structure.components = componentContainer; + char ctlObj[130]; + + createStringInBuffer(ctlObj, 2, self->ctlObjectName, "$Oper"); + MmsValue ctlObjValueMemory; MmsValue* ctlObjValue = &ctlObjValueMemory; ctlObjValue->type = MMS_VISIBLE_STRING; - ctlObjValue->value.visibleString.buf = self->ctlObjectName; - ctlObjValue->value.visibleString.size = sizeof(self->ctlObjectName); + ctlObjValue->value.visibleString.buf = ctlObj; + ctlObjValue->value.visibleString.size = sizeof(ctlObj); MmsValue_setElement(lastApplError, 0, ctlObjValue); @@ -922,6 +926,7 @@ ControlObject_sendCommandTerminationNegative(ControlObject* self) operVarSpec.itemId = itemId; operVarSpec.domainId = domainId; + /* create response */ if (DEBUG_IED_SERVER) @@ -944,7 +949,7 @@ ControlObject_sendCommandTerminationNegative(ControlObject* self) void -ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection* connection, int error, +ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection* connection, char* ctlVariable, int error, ControlAddCause addCause, MmsValue* ctlNum, MmsValue* origin, bool handlerMode) { MmsValue lastApplErrorMemory; @@ -957,9 +962,13 @@ ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection* connec lastApplError->value.structure.components =componentContainer; + char ctlObj[130]; + + createStringInBuffer(ctlObj, 3, self->ctlObjectName, "$", ctlVariable); + if (DEBUG_IED_SERVER) { printf("IED_SERVER: sendLastApplError:\n"); - printf("IED_SERVER: control object: %s\n", self->ctlObjectName); + printf("IED_SERVER: control object: %s\n", ctlObj); printf("IED_SERVER: ctlNum: %u\n", MmsValue_toUint32(ctlNum)); } @@ -967,8 +976,8 @@ ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection* connec MmsValue* ctlObjValue = &ctlObjValueMemory; ctlObjValue->type = MMS_VISIBLE_STRING; - ctlObjValue->value.visibleString.buf = self->ctlObjectName; - ctlObjValue->value.visibleString.size = sizeof(self->ctlObjectName); + ctlObjValue->value.visibleString.buf = ctlObj; + ctlObjValue->value.visibleString.size = sizeof(ctlObj); MmsValue_setElement(lastApplError, 0, ctlObjValue); @@ -1304,10 +1313,10 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; if (connection != controlObject->mmsConnection) - ControlObject_sendLastApplError(controlObject, connection, 0, + ControlObject_sendLastApplError(controlObject, connection, "SBOw", 0, ADD_CAUSE_LOCKED_BY_OTHER_CLIENT, ctlNum, origin, true); else - ControlObject_sendLastApplError(controlObject, connection, 0, + ControlObject_sendLastApplError(controlObject, connection, "SBOw", 0, ADD_CAUSE_OBJECT_ALREADY_SELECTED, ctlNum, origin, true); if (DEBUG_IED_SERVER) @@ -1344,7 +1353,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari else { indication = getDataAccessErrorFromCheckHandlerResult(checkResult); - ControlObject_sendLastApplError(controlObject, connection, 0, + ControlObject_sendLastApplError(controlObject, connection, "SBOw", 0, ADD_CAUSE_SELECT_FAILED, ctlNum, origin, true); if (DEBUG_IED_SERVER) @@ -1389,7 +1398,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari if (state == STATE_WAIT_FOR_ACTICATION_TIME) { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; - ControlObject_sendLastApplError(controlObject, connection, + ControlObject_sendLastApplError(controlObject, connection, "Oper", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_COMMAND_ALREADY_IN_EXECUTION, ctlNum, origin, true); @@ -1419,7 +1428,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari { indication = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; - ControlObject_sendLastApplError(controlObject, connection, + ControlObject_sendLastApplError(controlObject, connection, "Oper", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_INCONSISTENT_PARAMETERS, ctlNum, origin, true); @@ -1499,7 +1508,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari printf("IED_SERVER: Oper failed - control not selected!\n"); indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; - ControlObject_sendLastApplError(controlObject, connection, + ControlObject_sendLastApplError(controlObject, connection, "Oper", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_OBJECT_NOT_SELECTED, ctlNum, origin, true); @@ -1531,7 +1540,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari } else { indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; - ControlObject_sendLastApplError(controlObject, connection, + ControlObject_sendLastApplError(controlObject, connection, "Cancel", CONTROL_ERROR_NO_ERROR, ADD_CAUSE_LOCKED_BY_OTHER_CLIENT, ctlNum, origin, true); }