]> gerrit.simantics Code Review - simantics/fmil.git/blobdiff - org.simantics.fmil.core/native/FMUSimulator/src/fmi_util.c
Merge "Added getters and setters for all FMI data types."
[simantics/fmil.git] / org.simantics.fmil.core / native / FMUSimulator / src / fmi_util.c
index 32bf32f80cf39008d6d9f178288203bffd184cdf..5341d952018f8a3583d75c44b8bde706f2560b99 100644 (file)
@@ -7,67 +7,7 @@
 
 #include <fmilib.h>
 
-#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 <fmi1_cs.h>
 
 #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);
@@ -648,12 +587,15 @@ int FMI2_CS_STEP(void *fmu, double masterTime, double stepSize, const char **err
        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 +603,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 +661,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 +719,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 +772,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;