Skip to content

Commit

Permalink
- Raise the ModelicaError when any of the fmi* functions fail.
Browse files Browse the repository at this point in the history
- Fixed the assert tests.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@23684 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adeas31 committed Dec 7, 2014
1 parent 8cac80f commit 5cb1552
Show file tree
Hide file tree
Showing 7 changed files with 249 additions and 92 deletions.
4 changes: 2 additions & 2 deletions Compiler/runtime/FMIImpl.c
Expand Up @@ -789,7 +789,7 @@ int FMIImpl__initializeFMIImport(const char* file_name, const char* working_dire
if (status == jm_status_error) {
fmi1_import_free(fmi);
fmi_import_free_context(context);
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not create the DLL loading mechanism(C-API)."), NULL, 0);
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Loading of FMU dynamic link library failed."), NULL, 0);
return 0;
}
#endif
Expand Down Expand Up @@ -820,7 +820,7 @@ int FMIImpl__initializeFMIImport(const char* file_name, const char* working_dire
if (status == jm_status_error) {
fmi2_import_free(fmi);
fmi_import_free_context(context);
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Could not create the DLL loading mechanism(C-API)."), NULL, 0);
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Loading of FMU dynamic link library failed."), NULL, 0);
return 0;
}
#endif
Expand Down
28 changes: 20 additions & 8 deletions SimulationRuntime/c/fmi/FMI1CoSimulation.c
Expand Up @@ -62,14 +62,13 @@ void* FMI1CoSimulationConstructor_OMC(int fmi_log_level, char* working_directory
strcpy(FMI1CS->FMIWorkingDirectory, working_directory);
FMI1CS->FMIImportInstance = fmi1_import_parse_xml(FMI1CS->FMIImportContext, FMI1CS->FMIWorkingDirectory);
if(!FMI1CS->FMIImportInstance) {
fprintf(stderr, "Error parsing the XML file contained in %s\n", FMI1CS->FMIWorkingDirectory);
ModelicaFormatError("Error parsing the XML file contained in %s\n", FMI1CS->FMIWorkingDirectory);
return 0;
}
/* Load the binary (dll/so) */
jm_status_enu_t status;
status = fmi1_import_create_dllfmu(FMI1CS->FMIImportInstance, FMI1CS->FMICallbackFunctions, 0);
jm_status_enu_t status = fmi1_import_create_dllfmu(FMI1CS->FMIImportInstance, FMI1CS->FMICallbackFunctions, 0);
if (status == jm_status_error) {
fprintf(stderr, "Could not create the DLL loading mechanism(C-API).\n");
ModelicaError("Loading of FMU dynamic link library failed.\n");
return 0;
}
FMI1CS->FMIInstanceName = (char*) malloc(strlen(instanceName)+1);
Expand All @@ -81,13 +80,23 @@ void* FMI1CoSimulationConstructor_OMC(int fmi_log_level, char* working_directory
FMI1CS->FMITimeOut = timeout;
FMI1CS->FMIVisible = visible;
FMI1CS->FMIInteractive = interactive;
fmi1_import_instantiate_slave(FMI1CS->FMIImportInstance, FMI1CS->FMIInstanceName, FMI1CS->FMIFmuLocation, FMI1CS->FMIMimeType, FMI1CS->FMITimeOut, FMI1CS->FMIVisible, FMI1CS->FMIInteractive);
jm_status_enu_t instantiateSlaveStatus = fmi1_import_instantiate_slave(FMI1CS->FMIImportInstance, FMI1CS->FMIInstanceName, FMI1CS->FMIFmuLocation, FMI1CS->FMIMimeType, FMI1CS->FMITimeOut, FMI1CS->FMIVisible, FMI1CS->FMIInteractive);
if (instantiateSlaveStatus == jm_status_error) {
ModelicaError("fmiInstantiateSlave failed.\n");
return 0;
}
FMI1CS->FMIDebugLogging = debugLogging;
fmi1_import_set_debug_logging(FMI1CS->FMIImportInstance, FMI1CS->FMIDebugLogging);
fmi1_status_t debugLoggingStatus = fmi1_import_set_debug_logging(FMI1CS->FMIImportInstance, FMI1CS->FMIDebugLogging);
if (debugLoggingStatus != fmi1_status_ok && debugLoggingStatus != fmi1_status_warning) {
ModelicaMessage("fmiSetDebugLogging failed.\n");
}
FMI1CS->FMITStart = tStart;
FMI1CS->FMIStopTimeDefined = stopTimeDefined;
FMI1CS->FMITStop = tStop;
fmi1_import_initialize_slave(FMI1CS->FMIImportInstance, FMI1CS->FMITStart, FMI1CS->FMIStopTimeDefined, FMI1CS->FMITStop);
fmi1_status_t initializeSlaveStatus = fmi1_import_initialize_slave(FMI1CS->FMIImportInstance, FMI1CS->FMITStart, FMI1CS->FMIStopTimeDefined, FMI1CS->FMITStop);
if (initializeSlaveStatus != fmi1_status_ok && initializeSlaveStatus != fmi1_status_warning) {
ModelicaError("fmiInitializeSlave failed\n");
}
return FMI1CS;
}

Expand All @@ -112,7 +121,10 @@ void FMI1CoSimulationDestructor_OMC(void* in_fmi1cs)
double fmi1DoStep_OMC(void* in_fmi1cs, double currentCommunicationPoint, double communicationStepSize, int newStep)
{
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1cs;
fmi1_import_do_step(FMI1CS->FMIImportInstance, currentCommunicationPoint, communicationStepSize, newStep);
fmi1_status_t status = fmi1_import_do_step(FMI1CS->FMIImportInstance, currentCommunicationPoint, communicationStepSize, newStep);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiDoStep failed\n");
}
return 0.0;
}

Expand Down
83 changes: 66 additions & 17 deletions SimulationRuntime/c/fmi/FMI1Common.c
Expand Up @@ -56,8 +56,9 @@ fmi1_value_reference_t* real_to_fmi1_value_reference(int numberOfValueReferences
{
fmi1_value_reference_t* valuesReferences_int = malloc(sizeof(fmi1_value_reference_t)*numberOfValueReferences);
int i;
for (i = 0 ; i < numberOfValueReferences ; i++)
for (i = 0 ; i < numberOfValueReferences ; i++) {
valuesReferences_int[i] = (int)valuesReferences[i];
}
return valuesReferences_int;
}

Expand All @@ -71,13 +72,19 @@ void fmi1GetReal_OMC(void* in_fmi1, int numberOfValueReferences, double* realVal
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, realValuesReferences);
fmi1_import_get_real(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
fmi1_status_t status = fmi1_import_get_real(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetReal failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, realValuesReferences);
fmi1_import_get_real(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
fmi1_status_t status = fmi1_import_get_real(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetReal failed\n");
}
}
}

Expand All @@ -90,13 +97,19 @@ void fmi1SetReal_OMC(void* in_fmi1, int numberOfValueReferences, double* realVal
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, realValueReferences);
fmi1_import_set_real(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
fmi1_status_t status = fmi1_import_set_real(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetReal failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, realValueReferences);
fmi1_import_set_real(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
fmi1_status_t status = fmi1_import_set_real(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_real_t*)realValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetReal failed\n");
}
}
}

Expand All @@ -110,13 +123,19 @@ void fmi1GetInteger_OMC(void* in_fmi1, int numberOfValueReferences, double* inte
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, integerValuesReferences);
fmi1_import_get_integer(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
fmi1_status_t status = fmi1_import_get_integer(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetInteger failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, integerValuesReferences);
fmi1_import_get_integer(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
fmi1_status_t status = fmi1_import_get_integer(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetInteger failed\n");
}
}
}

Expand All @@ -129,13 +148,19 @@ void fmi1SetInteger_OMC(void* in_fmi1, int numberOfValueReferences, double* inte
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, integerValueReferences);
fmi1_import_set_integer(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
fmi1_status_t status = fmi1_import_set_integer(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetInteger failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, integerValueReferences);
fmi1_import_set_integer(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
fmi1_status_t status = fmi1_import_set_integer(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_integer_t*)integerValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetInteger failed\n");
}
}
}

Expand All @@ -149,13 +174,19 @@ void fmi1GetBoolean_OMC(void* in_fmi1, int numberOfValueReferences, double* bool
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, booleanValuesReferences);
fmi1_import_get_boolean(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
fmi1_status_t status = fmi1_import_get_boolean(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetBoolean failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, booleanValuesReferences);
fmi1_import_get_boolean(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
fmi1_status_t status = fmi1_import_get_boolean(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetBoolean failed\n");
}
}
}

Expand All @@ -168,13 +199,19 @@ void fmi1SetBoolean_OMC(void* in_fmi1, int numberOfValueReferences, double* bool
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, booleanValueReferences);
fmi1_import_set_boolean(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
fmi1_status_t status = fmi1_import_set_boolean(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetBoolean failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, booleanValueReferences);
fmi1_import_set_boolean(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
fmi1_status_t status = fmi1_import_set_boolean(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetBoolean failed\n");
}
}
}

Expand All @@ -188,13 +225,19 @@ void fmi1GetString_OMC(void* in_fmi1, int numberOfValueReferences, double* strin
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, stringValuesReferences);
fmi1_import_get_string(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
fmi1_status_t status = fmi1_import_get_string(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetString failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, stringValuesReferences);
fmi1_import_get_string(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
fmi1_status_t status = fmi1_import_get_string(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiGetString failed\n");
}
}
}

Expand All @@ -207,13 +250,19 @@ void fmi1SetString_OMC(void* in_fmi1, int numberOfValueReferences, double* strin
if (fmiType == 1) {
FMI1ModelExchange* FMI1ME = (FMI1ModelExchange*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, stringValueReferences);
fmi1_import_set_string(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
fmi1_status_t status = fmi1_import_set_string(FMI1ME->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetString failed\n");
}
} else if (fmiType == 2) {
FMI1CoSimulation* FMI1CS = (FMI1CoSimulation*)in_fmi1;
fmi1_value_reference_t* valuesReferences_int = real_to_fmi1_value_reference(numberOfValueReferences, stringValueReferences);
fmi1_import_set_string(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
fmi1_status_t status = fmi1_import_set_string(FMI1CS->FMIImportInstance, valuesReferences_int, numberOfValueReferences, (fmi1_string_t*)stringValues);
free(valuesReferences_int);
if (status != fmi1_status_ok && status != fmi1_status_warning) {
ModelicaError("fmiSetString failed\n");
}
}
}

Expand Down

0 comments on commit 5cb1552

Please sign in to comment.