diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index e1e6226f..35b428ce 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -1194,6 +1194,16 @@ ControlAction_getClientConnection(ControlAction self); LIB61850_API DataObject* 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). * diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index b0097b50..29f12790 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -1581,16 +1581,32 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari controlObject->interlockCheck = interlockCheck; 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); @@ -1681,7 +1697,6 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari if (controlObject->timeActivatedOperate) { controlObject->timeActivatedOperate = false; abortControlOperation(controlObject); - indication = DATA_ACCESS_ERROR_SUCCESS; goto free_and_return; } } @@ -1762,5 +1777,13 @@ ControlAction_getControlObject(ControlAction self) return controlObject->dataObject; } +uint64_t +ControlAction_getControlTime(ControlAction self) +{ + ControlObject* controlObject = (ControlObject*) self; + + return controlObject->operateTime; +} + #endif /* (CONFIG_IEC61850_CONTROL_SERVICE == 1) */ diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index b10ba7ae..0df2c95d 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -210,8 +210,10 @@ mmsClient_handleFileCloseRequest( if (frsm->obtainRequest) frsm->obtainRequest->timeout = Hal_getTimeInMs() + connection->requestTimeout; - FileSystem_closeFile(frsm->fileHandle); - frsm->fileHandle = NULL; + if(frsm->fileHandle){ + FileSystem_closeFile(frsm->fileHandle); + frsm->fileHandle = NULL; + } frsm->frsmId = 0; frsm->obtainRequest = NULL; diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index 6b053747..49e8d4b8 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -426,8 +426,10 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; - FileSystem_closeFile(task->fileHandle); - task->fileHandle = NULL; + if(task->fileHandle){ + FileSystem_closeFile(task->fileHandle); + task->fileHandle = NULL; + } deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); } } @@ -443,6 +445,7 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) mmsClient_createFileReadRequest(task->lastRequestInvokeId, request, task->frmsId); + task->state = MMS_FILE_UPLOAD_STATE_FILE_READ_SENT; IsoConnection_sendMessage(task->connection->isoConnection, request); MmsServer_releaseTransmitBuffer(self); @@ -450,8 +453,6 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) IsoConnection_unlock(task->connection->isoConnection); task->nextTimeout = Hal_getTimeInMs() + 2000; /* timeout 2000 ms */ - - task->state = MMS_FILE_UPLOAD_STATE_FILE_READ_SENT; } break; @@ -465,8 +466,10 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; - FileSystem_closeFile(task->fileHandle); - task->fileHandle = NULL; + if(task->fileHandle){ + FileSystem_closeFile(task->fileHandle); + task->fileHandle = NULL; + } deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); } @@ -482,6 +485,8 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) mmsClient_createFileCloseRequest(task->lastRequestInvokeId, request, task->frmsId); + task->state = MMS_FILE_UPLOAD_STATE_FILE_CLOSE_SENT; + IsoConnection_sendMessage(task->connection->isoConnection, request); MmsServer_releaseTransmitBuffer(self); @@ -490,7 +495,6 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) task->nextTimeout = Hal_getTimeInMs() + 2000; /* timeout 2000 ms */ - task->state = MMS_FILE_UPLOAD_STATE_FILE_CLOSE_SENT; } break; @@ -527,8 +531,10 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) IsoConnection_unlock(task->connection->isoConnection); - FileSystem_closeFile(task->fileHandle); - task->fileHandle = NULL; + if(task->fileHandle){ + FileSystem_closeFile(task->fileHandle); + task->fileHandle = NULL; + } deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); if (DEBUG_MMS_SERVER) @@ -578,6 +584,8 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) createObtainFileResponse(task->obtainFileRequestInvokeId, response); + task->state = MMS_FILE_UPLOAD_STATE_NOT_USED; + IsoConnection_sendMessage(task->connection->isoConnection, response); MmsServer_releaseTransmitBuffer(self); @@ -586,8 +594,6 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) if (self->getFileCompleteHandler) self->getFileCompleteHandler(self->getFileCompleteHandlerParameter, task->connection, task->destinationFilename); - - task->state = MMS_FILE_UPLOAD_STATE_NOT_USED; } break; case MMS_FILE_UPLOAD_STATE_INTERRUPTED: diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 0832574f..01f674a8 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -464,8 +464,13 @@ mmsFileReadHandler(uint32_t invokeId, void* parameter, MmsError mmsError, int32_ if (mmsError == MMS_ERROR_NONE) { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: file %i received %i bytes\n", task->frmsId, bytesReceived); - - FileSystem_writeFile(task->fileHandle, buffer, bytesReceived); + if(task->fileHandle){ + 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 { if (DEBUG_MMS_SERVER) @@ -549,20 +554,25 @@ handleConfirmedResponsePdu( bool moreFollows; - if (mmsMsg_parseFileReadResponse(buffer, startBufPos, maxBufPos, invokeId, fileTask->frmsId, &moreFollows, mmsFileReadHandler, (void*) fileTask)) { - - if (moreFollows) { - fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_READ; + if(fileTask->fileHandle == NULL){ + fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_DESTINATION; + } + 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 { - fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_FILE_CLOSE; - } - } - else { - fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; + fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; - if (DEBUG_MMS_SERVER) - printf("MMS_SERVER: error parsing file-read-response\n"); + if (DEBUG_MMS_SERVER) + printf("MMS_SERVER: error parsing file-read-response\n"); + } } } else { @@ -583,7 +593,9 @@ handleConfirmedResponsePdu( MmsObtainFileTask fileTask = getUploadTaskByInvokeId(self->server, invokeId); if (fileTask != NULL) { - FileSystem_closeFile(fileTask->fileHandle); + if(fileTask->fileHandle){ + FileSystem_closeFile(fileTask->fileHandle); + } fileTask->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_RESPONSE; } else {