#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
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) {
int FMI1_CS_UNLOAD(void *fmu_, const char **error) {
fmi1_import_t *fmu = (fmi1_import_t *)fmu_;
+ fmi1_import_terminate(fmu);
fmi1_import_destroy_dllfmu(fmu);
fmi1_import_free(fmu);
return 0;
int FMI2_CS_UNLOAD(void *fmu_, const char **error) {
fmi2_import_t *fmu = (fmi2_import_t *)fmu_;
+ fmi2_import_terminate(fmu);
fmi2_import_destroy_dllfmu(fmu);
fmi2_import_free(fmu);
return 0;
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));
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));
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);
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;
}
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;
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;
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;
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;
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;