Merge pull request #183 from kiraly533/v1.4

TimeActivatedControl before wait check and fixes for file-upload issues.
pull/202/head
Michael Zillgith 6 years ago committed by GitHub
commit 6738215c8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1194,6 +1194,16 @@ ControlAction_getClientConnection(ControlAction self);
LIB61850_API DataObject* LIB61850_API DataObject*
ControlAction_getControlObject(ControlAction self); ControlAction_getControlObject(ControlAction self);
/**
* \brief Gets the time of the control, if it's a timeActivatedControl, returns 0, if it's not.
*
* \param self the control action instance
*
* \return the controllable data object instance
*/
LIB61850_API uint64_t
ControlAction_getControlTime(ControlAction self);
/** /**
* \brief Control model callback to perform the static tests (optional). * \brief Control model callback to perform the static tests (optional).
* *

@ -1581,16 +1581,32 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari
controlObject->interlockCheck = interlockCheck; controlObject->interlockCheck = interlockCheck;
controlObject->mmsConnection = connection; controlObject->mmsConnection = connection;
initiateControlTask(controlObject); CheckHandlerResult checkResult = CONTROL_ACCEPTED;
if (controlObject->checkHandler != NULL) { /* perform operative tests */
setState(controlObject, STATE_WAIT_FOR_ACTIVATION_TIME); checkResult = controlObject->checkHandler((ControlAction) controlObject,
controlObject->checkHandlerParameter, ctlVal, testCondition, interlockCheck);
if (DEBUG_IED_SERVER) }
printf("Oper: activate time activated control\n");
indication = DATA_ACCESS_ERROR_SUCCESS; if(checkResult == CONTROL_ACCEPTED){
initiateControlTask(controlObject);
setState(controlObject, STATE_WAIT_FOR_ACTIVATION_TIME);
if (DEBUG_IED_SERVER)
printf("Oper: activate time activated control\n");
indication = DATA_ACCESS_ERROR_SUCCESS;
}
else{
indication = (MmsDataAccessError) checkResult;
}
} }
} }
else{
controlObject->operateTime = 0;
}
MmsValue_update(controlObject->oper, value); MmsValue_update(controlObject->oper, value);
@ -1681,7 +1697,6 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari
if (controlObject->timeActivatedOperate) { if (controlObject->timeActivatedOperate) {
controlObject->timeActivatedOperate = false; controlObject->timeActivatedOperate = false;
abortControlOperation(controlObject); abortControlOperation(controlObject);
indication = DATA_ACCESS_ERROR_SUCCESS;
goto free_and_return; goto free_and_return;
} }
} }
@ -1762,5 +1777,13 @@ ControlAction_getControlObject(ControlAction self)
return controlObject->dataObject; return controlObject->dataObject;
} }
uint64_t
ControlAction_getControlTime(ControlAction self)
{
ControlObject* controlObject = (ControlObject*) self;
return controlObject->operateTime;
}
#endif /* (CONFIG_IEC61850_CONTROL_SERVICE == 1) */ #endif /* (CONFIG_IEC61850_CONTROL_SERVICE == 1) */

@ -210,8 +210,10 @@ mmsClient_handleFileCloseRequest(
if (frsm->obtainRequest) if (frsm->obtainRequest)
frsm->obtainRequest->timeout = Hal_getTimeInMs() + connection->requestTimeout; frsm->obtainRequest->timeout = Hal_getTimeInMs() + connection->requestTimeout;
FileSystem_closeFile(frsm->fileHandle); if(frsm->fileHandle){
frsm->fileHandle = NULL; FileSystem_closeFile(frsm->fileHandle);
frsm->fileHandle = NULL;
}
frsm->frsmId = 0; frsm->frsmId = 0;
frsm->obtainRequest = NULL; frsm->obtainRequest = NULL;

@ -426,8 +426,10 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE;
FileSystem_closeFile(task->fileHandle); if(task->fileHandle){
task->fileHandle = NULL; FileSystem_closeFile(task->fileHandle);
task->fileHandle = NULL;
}
deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename);
} }
} }
@ -443,6 +445,7 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
mmsClient_createFileReadRequest(task->lastRequestInvokeId, request, task->frmsId); mmsClient_createFileReadRequest(task->lastRequestInvokeId, request, task->frmsId);
task->state = MMS_FILE_UPLOAD_STATE_FILE_READ_SENT;
IsoConnection_sendMessage(task->connection->isoConnection, request); IsoConnection_sendMessage(task->connection->isoConnection, request);
MmsServer_releaseTransmitBuffer(self); MmsServer_releaseTransmitBuffer(self);
@ -450,8 +453,6 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
IsoConnection_unlock(task->connection->isoConnection); IsoConnection_unlock(task->connection->isoConnection);
task->nextTimeout = Hal_getTimeInMs() + 2000; /* timeout 2000 ms */ task->nextTimeout = Hal_getTimeInMs() + 2000; /* timeout 2000 ms */
task->state = MMS_FILE_UPLOAD_STATE_FILE_READ_SENT;
} }
break; break;
@ -465,8 +466,10 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE;
FileSystem_closeFile(task->fileHandle); if(task->fileHandle){
task->fileHandle = NULL; FileSystem_closeFile(task->fileHandle);
task->fileHandle = NULL;
}
deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename);
} }
@ -482,6 +485,8 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
mmsClient_createFileCloseRequest(task->lastRequestInvokeId, request, task->frmsId); mmsClient_createFileCloseRequest(task->lastRequestInvokeId, request, task->frmsId);
task->state = MMS_FILE_UPLOAD_STATE_FILE_CLOSE_SENT;
IsoConnection_sendMessage(task->connection->isoConnection, request); IsoConnection_sendMessage(task->connection->isoConnection, request);
MmsServer_releaseTransmitBuffer(self); MmsServer_releaseTransmitBuffer(self);
@ -490,7 +495,6 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
task->nextTimeout = Hal_getTimeInMs() + 2000; /* timeout 2000 ms */ task->nextTimeout = Hal_getTimeInMs() + 2000; /* timeout 2000 ms */
task->state = MMS_FILE_UPLOAD_STATE_FILE_CLOSE_SENT;
} }
break; break;
@ -527,8 +531,10 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
IsoConnection_unlock(task->connection->isoConnection); IsoConnection_unlock(task->connection->isoConnection);
FileSystem_closeFile(task->fileHandle); if(task->fileHandle){
task->fileHandle = NULL; FileSystem_closeFile(task->fileHandle);
task->fileHandle = NULL;
}
deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename);
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
@ -578,6 +584,8 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
createObtainFileResponse(task->obtainFileRequestInvokeId, response); createObtainFileResponse(task->obtainFileRequestInvokeId, response);
task->state = MMS_FILE_UPLOAD_STATE_NOT_USED;
IsoConnection_sendMessage(task->connection->isoConnection, response); IsoConnection_sendMessage(task->connection->isoConnection, response);
MmsServer_releaseTransmitBuffer(self); MmsServer_releaseTransmitBuffer(self);
@ -586,8 +594,6 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task)
if (self->getFileCompleteHandler) if (self->getFileCompleteHandler)
self->getFileCompleteHandler(self->getFileCompleteHandlerParameter, task->connection, task->destinationFilename); self->getFileCompleteHandler(self->getFileCompleteHandlerParameter, task->connection, task->destinationFilename);
task->state = MMS_FILE_UPLOAD_STATE_NOT_USED;
} }
break; break;
case MMS_FILE_UPLOAD_STATE_INTERRUPTED: case MMS_FILE_UPLOAD_STATE_INTERRUPTED:

@ -464,8 +464,13 @@ mmsFileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, int32_
if (mmsError == MMS_ERROR_NONE) { if (mmsError == MMS_ERROR_NONE) {
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: file %i received %i bytes\n", task->frmsId, bytesReceived); printf("MMS_SERVER: file %i received %i bytes\n", task->frmsId, bytesReceived);
if(task->fileHandle){
FileSystem_writeFile(task->fileHandle, buffer, bytesReceived); FileSystem_writeFile(task->fileHandle, buffer, bytesReceived);
}
else{
if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: problem reading file %i file already closed\n", task->frmsId);
}
} }
else { else {
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
@ -549,20 +554,25 @@ handleConfirmedResponsePdu(
bool moreFollows; bool moreFollows;
if (mmsMsg_parseFileReadResponse(buffer, startBufPos, maxBufPos, invokeId, fileTask->frmsId, &moreFollows, mmsFileReadHandler, (void*) fileTask)) { if(fileTask->fileHandle == NULL){
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_DESTINATION;
if (moreFollows) { }
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_READ; else{
if (mmsMsg_parseFileReadResponse(buffer, startBufPos, maxBufPos, invokeId, fileTask->frmsId, &moreFollows, mmsFileReadHandler, (void*) fileTask)) {
if (moreFollows) {
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_READ;
}
else {
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_CLOSE;
}
} }
else { else {
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_CLOSE; fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE;
}
}
else {
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE;
if (DEBUG_MMS_SERVER) if (DEBUG_MMS_SERVER)
printf("MMS_SERVER: error parsing file-read-response\n"); printf("MMS_SERVER: error parsing file-read-response\n");
}
} }
} }
else { else {
@ -583,7 +593,9 @@ handleConfirmedResponsePdu(
MmsObtainFileTask fileTask = getUploadTaskByInvokeId(self->server, invokeId); MmsObtainFileTask fileTask = getUploadTaskByInvokeId(self->server, invokeId);
if (fileTask != NULL) { if (fileTask != NULL) {
FileSystem_closeFile(fileTask->fileHandle); if(fileTask->fileHandle){
FileSystem_closeFile(fileTask->fileHandle);
}
fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_RESPONSE; fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_RESPONSE;
} }
else { else {

Loading…
Cancel
Save