diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index dcf1f96d..28faef96 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -588,8 +588,10 @@ IedConnection_setState(IedConnection self, IedConnectionState newState) { Semaphore_wait(self->stateMutex); - if (self->state != newState) - self->connectionStateChangedHandler(self->connectionStateChangedHandlerParameter, self, newState); + if (self->state != newState) { + if (self->connectionStateChangedHandler) + self->connectionStateChangedHandler(self->connectionStateChangedHandlerParameter, self, newState); + } self->state = newState; @@ -784,6 +786,30 @@ IedConnection_destroy(IedConnection self) GLOBAL_FREEMEM(self); } +LinkedList +IedConnection_getLogicalDeviceVariables(IedConnection self, IedClientError* error, const char* ldName) +{ + MmsError err = MMS_ERROR_NONE; + + LinkedList result = MmsConnection_getDomainVariableNames(self->connection, &err, ldName); + + *error = iedConnection_mapMmsErrorToIedError(err); + + return result; +} + +LinkedList +IedConnection_getLogicalDeviceDataSets(IedConnection self, IedClientError* error, const char* ldName) +{ + MmsError err = MMS_ERROR_NONE; + + LinkedList result = MmsConnection_getDomainVariableListNames(self->connection, &err, ldName); + + *error = iedConnection_mapMmsErrorToIedError(err); + + return result; +} + MmsVariableSpecification* IedConnection_getVariableSpecification(IedConnection self, IedClientError* error, const char* objectReference, FunctionalConstraint fc) @@ -974,6 +1000,39 @@ IedConnection_getLogicalDeviceVariablesAsync(IedConnection self, IedClientError* return call->invokeId; } +uint32_t +IedConnection_getLogicalDeviceDataSetsAsync(IedConnection self, IedClientError* error, const char* ldName, const char* continueAfter, LinkedList result, + IedConnection_GetNameListHandler handler, void* parameter) +{ + //TODO implement + IedConnectionOutstandingCall call = iedConnection_allocateOutstandingCall(self); + + if (call == NULL) { + *error = IED_ERROR_OUTSTANDING_CALL_LIMIT_REACHED; + return 0; + } + + call->callback = handler; + call->callbackParameter = parameter; + + MmsError err = MMS_ERROR_NONE; + + call->invokeId = MmsConnection_getDomainVariableListNamesAsync(self->connection, &err, ldName, continueAfter, result, getNameListHandler, self); + + if (err != MMS_ERROR_NONE) { + *error = iedConnection_mapMmsErrorToIedError(err); + + iedConnection_releaseOutstandingCall(self, call); + + return 0; + } + else { + *error = IED_ERROR_OK; + } + + return call->invokeId; +} + static void readObjectHandlerInternal(uint32_t invokeId, void* parameter, MmsError err, MmsValue* value) {