X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.fmil.core%2Fnative%2FFMUSimulator%2Fsrc%2Ffmi_util.c;h=e91a6c4f70c133dbe2797b3a6b49cc5ba1961a76;hb=f6f05cb36bc0b849af8090efac1d549779e2076f;hp=32bf32f80cf39008d6d9f178288203bffd184cdf;hpb=4bed8078f3f6d15b8539d7357b8815f8bfeec2c4;p=simantics%2Ffmil.git diff --git a/org.simantics.fmil.core/native/FMUSimulator/src/fmi_util.c b/org.simantics.fmil.core/native/FMUSimulator/src/fmi_util.c index 32bf32f..e91a6c4 100644 --- a/org.simantics.fmil.core/native/FMUSimulator/src/fmi_util.c +++ b/org.simantics.fmil.core/native/FMUSimulator/src/fmi_util.c @@ -7,67 +7,7 @@ #include -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - const char *name; - const char *description; - const char *declaredType; - long vr; - /* 0 = real - // 1 = integer - // 2 = boolean - // 3 = string - // 4 = enumeration */ - int type; - /* 0 = constant - // 1 = parameter - // 2 = discrete - // 3 = continuous - // 4 = unknown */ - int variability; - /* 0 = input - // 1 = output - // 2 = internal - // 3 = none - // 4 = unknown */ - int causality; -} FMIL_Variable; - -typedef struct { - const char *name; - const char *description; - const char *quantity; - const char *unit; -} FMIL_DeclaredType; - -int FMI_CS_LOAD(const char *zipFilePath, const char *unzipFolder, void **fmuPointer, int *fmuVersion, const char **error); - -int FMI1_CS_UNLOAD(void* fmu, const char **error); -FMIL_Variable *FMI1_CS_GET_VARIABLES(void* fmu, int *count, const char **error); -FMIL_DeclaredType *FMI1_CS_GET_DECLARED_TYPES(void* fmu, int *count, const char **error); -int FMI1_CS_INSTANTIATE(void* fmu, const char *instanceName, const char **error); -int FMI1_CS_INITIALIZE(void* fmu, const char **error); -int FMI1_CS_STEP(void* fmu, double masterTime, double stepSize, const char **error); -int FMI1_CS_SET_REAL(void* fmu, int vr, double value, const char **error); -double FMI1_CS_GET_REAL(void* fmu, int vr, const char **error); -int FMI1_CS_GET_REALS(void* fmu, int *vrs, double *values, int count, const char **error); - -int FMI2_CS_UNLOAD(void* fmu, const char **error); -FMIL_Variable *FMI2_CS_GET_VARIABLES(void* fmu, int *count, const char **error); -FMIL_DeclaredType *FMI2_CS_GET_DECLARED_TYPES(void* fmu, int *count, const char **error); -int FMI2_CS_INSTANTIATE(void* fmu, const char *instanceName, const char **error); -int FMI2_CS_INITIALIZE(void* fmu, const char **error); -int FMI2_CS_STEP(void* fmu, double masterTime, double stepSize, const char **error); -int FMI2_CS_SET_REAL(void* fmu, int vr, double value, const char **error); -double FMI2_CS_GET_REAL(void* fmu, int vr, const char **error); -int FMI2_CS_GET_REALS(void* fmu, int *vrs, double *values, int count, const char **error); - -#ifdef __cplusplus -} -#endif +#include #define BUFFER 4096 @@ -84,11 +24,11 @@ void fmilogger(fmi1_component_t c, fmi1_string_t instanceName, fmi1_status_t sta int len; va_list argp; va_start(argp, message); - /*len=jm_vsnprintf(msg, BUFFER, message, argp); + len = vsnprintf(msg, BUFFER, message, argp); printf("fmiStatus = %d; %s (%s): %s\n", status, instanceName, category, msg); if(len > BUFFER) { - printf("Warning: message was trancated"); - }*/ + printf("Warning: Message was truncated.\n"); + } } int FMI_CS_LOAD(const char *zipFilePath, const char *unzipFolder, void **fmuPointer, int *fmuVersion, const char **error) { @@ -268,7 +208,7 @@ FMIL_Variable *FMI1_CS_GET_VARIABLES(void *fmu, int *count, const char **error) fmi1_import_variable_list_t* vl = fmi1_import_get_variable_list((fmi1_import_t *)fmu); fmi1_import_variable_typedef_t* type; - count[0] = fmi1_import_get_variable_list_size(vl); + count[0] = (int)fmi1_import_get_variable_list_size(vl); result = (FMIL_Variable *)malloc(count[0]*sizeof(FMIL_Variable)); @@ -365,7 +305,7 @@ FMIL_Variable *FMI2_CS_GET_VARIABLES(void *fmu, int *count, const char **error) fmi2_import_variable_list_t* vl = fmi2_import_get_variable_list((fmi2_import_t *)fmu, 0); fmi2_import_variable_typedef_t* type; - count[0] = fmi2_import_get_variable_list_size(vl); + count[0] = (int)fmi2_import_get_variable_list_size(vl); result = (FMIL_Variable *)malloc(count[0]*sizeof(FMIL_Variable)); @@ -552,14 +492,13 @@ int FMI2_CS_INSTANTIATE(void *fmu, const char *instanceName, const char **error) fmi2_string_t mimeType; fmi2_real_t timeout; fmi2_boolean_t visible; - fmi2_boolean_t interactive; - fmi2_boolean_t loggingOn; jm_status_enu_t jmstatus; fmuLocation = ""; mimeType = ""; timeout = 0; visible = fmi2_false; + // With NULL value for resourceLocation, its value is taken from the `fmu` argument jmstatus = fmi2_import_instantiate((fmi2_import_t*)fmu, instanceName, fmi2_cosimulation, NULL, visible); if (jmstatus == jm_status_error) { *error = fmi2_import_get_last_error((fmi2_import_t*)fmu); @@ -632,6 +571,8 @@ int FMI1_CS_STEP(void *fmu, double masterTime, double stepSize, const char **err if (status == fmi1_status_error || status == fmi1_status_fatal) { *error = "Error happened during stepping!"; return 1; + } else if (status == fmi1_status_pending) { + return 2; } return 0; } @@ -644,16 +585,21 @@ int FMI2_CS_STEP(void *fmu, double masterTime, double stepSize, const char **err if (status == fmi2_status_error || status == fmi2_status_fatal) { *error = "Error happened during stepping!"; return 1; + } else if (status == fmi2_status_pending) { + return 2; } return 0; } +// FMI1 setters + int FMI1_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) { fmi1_status_t status; + fmi1_real_t valueTmp = value; fmi1_value_reference_t vr = valueId; - status = fmi1_import_set_real((fmi1_import_t *)fmu, &vr, 1, &value); + status = fmi1_import_set_real((fmi1_import_t *)fmu, &vr, 1, &valueTmp); if (status == fmi1_status_error || status == fmi1_status_fatal) { *error = "Error happened during setting real value!"; return 1; @@ -661,12 +607,57 @@ int FMI1_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) { return 0; } +int FMI1_CS_SET_INTEGER(void *fmu, int valueId, int value, const char **error) { + + fmi1_status_t status; + fmi1_integer_t valueTmp = value; + + fmi1_value_reference_t vr = valueId; + status = fmi1_import_set_integer((fmi1_import_t *)fmu, &vr, 1, &valueTmp); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during setting integer value!"; + return 1; + } + return 0; +} + +int FMI1_CS_SET_BOOLEAN(void *fmu, int valueId, int value, const char **error) { + + fmi1_status_t status; + fmi1_boolean_t valueTmp = value != 0; + + fmi1_value_reference_t vr = valueId; + status = fmi1_import_set_boolean((fmi1_import_t *)fmu, &vr, 1, &valueTmp); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during setting boolean value!"; + return 1; + } + return 0; +} + +int FMI1_CS_SET_STRING(void *fmu, int valueId, const char *value, const char **error) { + + fmi1_status_t status; + fmi1_string_t valueTmp = value; + + fmi1_value_reference_t vr = valueId; + status = fmi1_import_set_string((fmi1_import_t *)fmu, &vr, 1, &valueTmp); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during setting string value!"; + return 1; + } + return 0; +} + +// FMI2 setters + int FMI2_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) { fmi2_status_t status; + fmi2_real_t valueTmp = value; fmi2_value_reference_t vr = valueId; - status = fmi2_import_set_real((fmi2_import_t *)fmu, &vr, 1, &value); + status = fmi2_import_set_real((fmi2_import_t *)fmu, &vr, 1, &valueTmp); if (status == fmi2_status_error || status == fmi2_status_fatal) { *error = "Error happened during setting real value!"; return 1; @@ -674,6 +665,50 @@ int FMI2_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) { return 0; } +int FMI2_CS_SET_INTEGER(void *fmu, int valueId, int value, const char **error) { + + fmi2_status_t status; + fmi2_integer_t valueTmp = value; + + fmi2_value_reference_t vr = valueId; + status = fmi2_import_set_integer((fmi2_import_t *)fmu, &vr, 1, &valueTmp); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during setting integer value!"; + return 1; + } + return 0; +} + +int FMI2_CS_SET_BOOLEAN(void *fmu, int valueId, int value, const char **error) { + + fmi2_status_t status; + fmi2_boolean_t valueTmp = value != 0; + + fmi2_value_reference_t vr = valueId; + status = fmi2_import_set_boolean((fmi2_import_t *)fmu, &vr, 1, &valueTmp); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during setting boolean value!"; + return 1; + } + return 0; +} + +int FMI2_CS_SET_STRING(void *fmu, int valueId, const char *value, const char **error) { + + fmi2_status_t status; + fmi2_string_t valueTmp = value; + + fmi2_value_reference_t vr = valueId; + status = fmi2_import_set_string((fmi2_import_t *)fmu, &vr, 1, &valueTmp); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during setting string value!"; + return 1; + } + return 0; +} + +// FMI1 getters + double FMI1_CS_GET_REAL(void *fmu, int valueReference, const char **error) { fmi1_value_reference_t vr = valueReference; @@ -688,6 +723,50 @@ double FMI1_CS_GET_REAL(void *fmu, int valueReference, const char **error) { return value; } +int FMI1_CS_GET_INTEGER(void *fmu, int valueReference, const char **error) { + + fmi1_value_reference_t vr = valueReference; + fmi1_integer_t value; + + fmi1_status_t status; + + status = fmi1_import_get_integer((fmi1_import_t *)fmu, &vr, 1, &value); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during getting integer value!"; + } + return value; +} + +int FMI1_CS_GET_BOOLEAN(void *fmu, int valueReference, const char **error) { + + fmi1_value_reference_t vr = valueReference; + fmi1_boolean_t value; + + fmi1_status_t status; + + status = fmi1_import_get_boolean((fmi1_import_t *)fmu, &vr, 1, &value); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during getting boolean value!"; + } + return value; +} + +const char *FMI1_CS_GET_STRING(void *fmu, int valueReference, const char **error) { + + fmi1_value_reference_t vr = valueReference; + fmi1_string_t value; + + fmi1_status_t status; + + status = fmi1_import_get_string((fmi1_import_t *)fmu, &vr, 1, &value); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during getting string value!"; + } + return value; +} + +// FMI2 getters + double FMI2_CS_GET_REAL(void *fmu, int valueReference, const char **error) { fmi2_value_reference_t vr = valueReference; @@ -697,35 +776,152 @@ double FMI2_CS_GET_REAL(void *fmu, int valueReference, const char **error) { status = fmi2_import_get_real((fmi2_import_t *)fmu, &vr, 1, &value); if (status == fmi2_status_error || status == fmi2_status_fatal) { - *error = "Error happened during setting real value!"; + *error = "Error happened during getting real value!"; } return value; } -int FMI1_CS_GET_REALS(void *fmu, int *valueReferences, double *result, int count, const char **error) { +int FMI2_CS_GET_INTEGER(void *fmu, int valueReference, const char **error) { - fmi1_value_reference_t *vrs = (fmi1_value_reference_t*) valueReferences; - fmi1_real_t value; + fmi2_value_reference_t vr = valueReference; + fmi2_integer_t value; + + fmi2_status_t status; + + status = fmi2_import_get_integer((fmi2_import_t *)fmu, &vr, 1, &value); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during getting integer value!"; + } + return value; +} + +int FMI2_CS_GET_BOOLEAN(void *fmu, int valueReference, const char **error) { + + fmi2_value_reference_t vr = valueReference; + fmi2_boolean_t value; + + fmi2_status_t status; + status = fmi2_import_get_boolean((fmi2_import_t *)fmu, &vr, 1, &value); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during getting boolean value!"; + } + return value; +} + +const char *FMI2_CS_GET_STRING(void *fmu, int valueReference, const char **error) { + + fmi2_value_reference_t vr = valueReference; + fmi2_string_t value; + + fmi2_status_t status; + + status = fmi2_import_get_string((fmi2_import_t *)fmu, &vr, 1, &value); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during getting string value!"; + } + return value; +} + +// FMI1 array getters + +int FMI1_CS_GET_REALS(void *fmu, int *valueReferences, double *result, int count, const char **error) { + + fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences; fmi1_status_t status; status = fmi1_import_get_real((fmi1_import_t *)fmu, vrs, count, result); if (status == fmi1_status_error || status == fmi1_status_fatal) { - *error = "Error happened during getting reals value!"; + *error = "Error happened during getting real values!"; + } + return 0; +} + +int FMI1_CS_GET_INTEGERS(void *fmu, int *valueReferences, int *result, int count, const char **error) { + + fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences; + fmi1_status_t status; + + status = fmi1_import_get_integer((fmi1_import_t *)fmu, vrs, count, result); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during getting integer values!"; } return 0; } +int FMI1_CS_GET_BOOLEANS(void *fmu, int *valueReferences, char *result, int count, const char **error) { + + fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences; + fmi1_status_t status; + + status = fmi1_import_get_boolean((fmi1_import_t *)fmu, vrs, count, result); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during getting boolean values!"; + } + return 0; +} + +int FMI1_CS_GET_STRINGS(void *fmu, int *valueReferences, const char **result, int count, const char **error) { + + fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences; + fmi1_status_t status; + + status = fmi1_import_get_string((fmi1_import_t *)fmu, vrs, count, result); + if (status == fmi1_status_error || status == fmi1_status_fatal) { + *error = "Error happened during getting string values!"; + } + return 0; +} + +// FMI2 array getters + int FMI2_CS_GET_REALS(void *fmu, int *valueReferences, double *result, int count, const char **error) { fmi2_value_reference_t *vrs = (fmi2_value_reference_t*) valueReferences; - fmi2_real_t value; - fmi2_status_t status; status = fmi2_import_get_real((fmi2_import_t *)fmu, vrs, count, result); if (status == fmi2_status_error || status == fmi2_status_fatal) { - *error = "Error happened during getting reals value!"; + *error = "Error happened during getting real values!"; + } + return 0; + +} + +int FMI2_CS_GET_INTEGERS(void *fmu, int *valueReferences, int *result, int count, const char **error) { + + fmi2_value_reference_t *vrs = (fmi2_value_reference_t*)valueReferences; + fmi2_status_t status; + + status = fmi2_import_get_integer((fmi2_import_t *)fmu, vrs, count, result); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during getting integer values!"; + } + return 0; + +} + +int FMI2_CS_GET_BOOLEANS(void *fmu, int *valueReferences, int *result, int count, const char **error) { + + fmi2_value_reference_t *vrs = (fmi2_value_reference_t*)valueReferences; + fmi2_status_t status; + + status = fmi2_import_get_boolean((fmi2_import_t *)fmu, vrs, count, result); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during getting boolean values!"; + } + return 0; + +} + +int FMI2_CS_GET_STRINGS(void *fmu, int *valueReferences, const char **result, int count, const char **error) { + + fmi2_value_reference_t *vrs = (fmi2_value_reference_t*) valueReferences; + fmi2_status_t status; + + status = fmi2_import_get_string((fmi2_import_t *)fmu, vrs, count, result); + if (status == fmi2_status_error || status == fmi2_status_fatal) { + *error = "Error happened during getting string values!"; } return 0;