14 /* Logger function used by the C-API */
15 void importlogger(jm_callbacks* c, jm_string module, jm_log_level_enu_t log_level, jm_string message)
17 printf("module = %s, log level = %d: %s\n", module, log_level, message);
20 /* Logger function used by the FMU internally */
21 void fmilogger(fmi1_component_t c, fmi1_string_t instanceName, fmi1_status_t status, fmi1_string_t category, fmi1_string_t message, ...)
26 va_start(argp, message);
27 len = vsnprintf(msg, BUFFER, message, argp);
28 printf("fmiStatus = %d; %s (%s): %s\n", status, instanceName, category, msg);
30 printf("Warning: Message was truncated.\n");
34 int FMI_CS_LOAD(const char *zipFilePath, const char *unzipFolder, void **fmuPointer, int *fmuVersion, const char **error) {
36 fmi1_callback_functions_t callBackFunctions;
37 fmi2_callback_functions_t callBackFunctions2;
38 fmi_import_context_t* context;
39 fmi_version_enu_t version;
40 jm_status_enu_t status;
43 jm_callbacks* callbacks;
45 callbacks = (jm_callbacks *)calloc(1, sizeof(jm_callbacks));
47 callbacks->malloc = malloc;
48 callbacks->calloc = calloc;
49 callbacks->realloc = realloc;
50 callbacks->free = free;
51 callbacks->logger = importlogger;
53 callbacks->log_level = jm_log_level_debug;
55 callbacks->log_level = jm_log_level_warning;
57 callbacks->context = 0;
59 context = fmi_import_allocate_context(callbacks);
61 version = fmi_import_get_fmi_version(context, zipFilePath, unzipFolder);
63 if (version == fmi_version_1_enu ) {
64 fmu = fmi1_import_parse_xml(context, unzipFolder);
65 if (fmi1_import_get_fmu_kind(fmu) != fmi1_fmu_kind_enu_cs_standalone && fmi1_import_get_fmu_kind(fmu) != fmi1_fmu_kind_enu_cs_tool) {
66 *error = "Provided FMU is version 1 but wrong type me (Model Exchange) when it should be cs (Co-Simulation)";
67 return 2; /* wrong type, should be co-simulation */
70 callBackFunctions.logger = fmilogger;
71 callBackFunctions.allocateMemory = calloc;
72 callBackFunctions.freeMemory = free;
74 status = fmi1_import_create_dllfmu(fmu, callBackFunctions, 0);
75 if (status == jm_status_error) {
76 *error = fmi1_import_get_last_error(fmu);
82 } else if (version == fmi_version_2_0_enu) {
83 fmu2 = fmi2_import_parse_xml(context, unzipFolder, 0);
85 if (fmi2_import_get_fmu_kind(fmu2) != fmi1_fmu_kind_enu_cs_standalone && fmi2_import_get_fmu_kind(fmu2) != fmi1_fmu_kind_enu_cs_tool) {
86 *error = "Provided FMU is version 2.0 but wrong type me (Model Exchange) when it should be cs (Co-Simulation)";
87 return 2; /* wrong type, should be co-simulation */
90 callBackFunctions2.logger = fmi2_log_forwarding;
91 callBackFunctions2.allocateMemory = calloc;
92 callBackFunctions2.freeMemory = free;
93 callBackFunctions2.componentEnvironment = fmu2;
95 status = fmi2_import_create_dllfmu(fmu2, fmi2_fmu_kind_cs, &callBackFunctions2);
96 if (status == jm_status_error) {
97 *error = fmi2_import_get_last_error(fmu2);
104 *error = "Couldn't find version of FMU - possibly incorrect file!";
108 fmi_import_free_context(context);
110 return 0; /* success */
113 int FMI1_CS_UNLOAD(void *fmu_, const char **error) {
114 fmi1_import_t *fmu = (fmi1_import_t *)fmu_;
115 fmi1_import_destroy_dllfmu(fmu);
116 fmi1_import_free(fmu);
120 int FMI2_CS_UNLOAD(void *fmu_, const char **error) {
121 fmi2_import_t *fmu = (fmi2_import_t *)fmu_;
122 fmi2_import_destroy_dllfmu(fmu);
123 fmi2_import_free(fmu);
129 printf("No type definition\n");
133 quan = fmi1_import_get_type_quantity(vt);
135 printf("Type %s\n description: %s\n", fmi1_import_get_type_name(vt), fmi1_import_get_type_description(vt));
137 printf("Base type: %s\n", fmi1_base_type_to_string(fmi1_import_get_base_type(vt)));
140 printf("Quantity: %s\n", quan);
142 switch(fmi1_import_get_base_type(vt)) {
143 case fmi1_base_type_real: {
144 fmi1_import_real_typedef_t* rt = fmi1_import_get_type_as_real(vt);
145 fmi1_real_t min = fmi1_import_get_real_type_min(rt);
146 fmi1_real_t max = fmi1_import_get_real_type_max(rt);
147 fmi1_real_t nom = fmi1_import_get_real_type_nominal(rt);
148 fmi1_import_unit_t* u = fmi1_import_get_real_type_unit(rt);
149 fmi1_import_display_unit_t* du = fmi1_import_get_type_display_unit(rt);
151 printf("Min %g, max %g, nominal %g\n", min, max, nom);
154 printf("Unit: %s\n", fmi1_import_get_unit_name(u));
157 printf("Display unit: %s, gain: %g, offset: %g, is relative: %s",
158 fmi1_import_get_display_unit_name(du),
159 fmi1_import_get_display_unit_gain(du),
160 fmi1_import_get_display_unit_offset(du),
161 fmi1_import_get_real_type_is_relative_quantity(rt)?"yes":"no"
167 case fmi1_base_type_int:{
168 fmi1_import_integer_typedef_t* it = fmi1_import_get_type_as_int(vt);
169 int min = fmi1_import_get_integer_type_min(it);
170 int max = fmi1_import_get_integer_type_max(it);
171 printf("Min %d, max %d\n", min, max);
174 case fmi1_base_type_bool:{
177 case fmi1_base_type_str:{
180 case fmi1_base_type_enum:{
181 fmi1_import_enumeration_typedef_t* et = fmi1_import_get_type_as_enum(vt);
182 int min = fmi1_import_get_enum_type_min(et);
183 int max = fmi1_import_get_enum_type_max(et);
184 printf("Min %d, max %d\n", min, max);
188 ni = fmi1_import_get_enum_type_size(et);
191 printf("There are %u items \n",(unsigned)ni);
192 for(i = 0; i < ni; i++) {
193 printf("[%u] %s (%s) \n", (unsigned)i+1, fmi1_import_get_enum_type_item_name(et, i), fmi1_import_get_enum_type_item_description(et, i));
199 printf("Error in fmiGetBaseType()\n");
204 FMIL_Variable *FMI1_CS_GET_VARIABLES(void *fmu, int *count, const char **error) {
207 FMIL_Variable *result;
208 fmi1_import_variable_list_t* vl = fmi1_import_get_variable_list((fmi1_import_t *)fmu);
209 fmi1_import_variable_typedef_t* type;
211 count[0] = (int)fmi1_import_get_variable_list_size(vl);
213 result = (FMIL_Variable *)malloc(count[0]*sizeof(FMIL_Variable));
215 for(i = 0; i < count[0]; i++) {
217 fmi1_import_variable_t* var = fmi1_import_get_variable(vl, i);
220 printf("Something wrong with variable %d \n",i);
225 result[i].name = fmi1_import_get_variable_name(var);
226 result[i].description = fmi1_import_get_variable_description(var);
228 switch (fmi1_import_get_variability(var)) {
229 case fmi1_variability_enu_constant:
230 result[i].variability = 0;
232 case fmi1_variability_enu_parameter:
233 result[i].variability = 1;
235 case fmi1_variability_enu_discrete:
236 result[i].variability = 2;
238 case fmi1_variability_enu_continuous:
239 result[i].variability = 3;
241 case fmi1_variability_enu_unknown:
242 result[i].variability = 4;
246 switch (fmi1_import_get_causality(var)) {
247 case fmi1_causality_enu_input:
248 result[i].causality = 0;
250 case fmi1_causality_enu_output:
251 result[i].causality = 1;
253 case fmi1_causality_enu_internal:
254 result[i].causality = 2;
256 case fmi1_causality_enu_none:
257 result[i].causality = 3;
259 case fmi1_causality_enu_unknown:
260 result[i].causality = 4;
264 switch (fmi1_import_get_variable_base_type(var)) {
265 case fmi1_base_type_real:
268 case fmi1_base_type_int:
271 case fmi1_base_type_bool:
274 case fmi1_base_type_str:
277 case fmi1_base_type_enum:
282 result[i].vr = fmi1_import_get_variable_vr(var);
284 type = fmi1_import_get_variable_declared_type(var);
286 result[i].declaredType = fmi1_import_get_type_name(type);
288 result[i].declaredType = 0;
295 fmi1_import_free_variable_list(vl);
301 FMIL_Variable *FMI2_CS_GET_VARIABLES(void *fmu, int *count, const char **error) {
304 FMIL_Variable *result;
305 fmi2_import_variable_list_t* vl = fmi2_import_get_variable_list((fmi2_import_t *)fmu, 0);
306 fmi2_import_variable_typedef_t* type;
308 count[0] = (int)fmi2_import_get_variable_list_size(vl);
310 result = (FMIL_Variable *)malloc(count[0]*sizeof(FMIL_Variable));
312 for(i = 0; i < count[0]; i++) {
314 fmi2_import_variable_t* var = fmi2_import_get_variable(vl, i);
317 printf("Something wrong with variable %d \n",i);
322 result[i].name = fmi2_import_get_variable_name(var);
323 result[i].description = fmi2_import_get_variable_description(var);
325 switch (fmi2_import_get_variability(var)) {
326 case fmi2_variability_enu_constant:
327 result[i].variability = 0;
329 case fmi2_variability_enu_fixed:
330 case fmi2_variability_enu_tunable:
331 result[i].variability = 1;
333 case fmi2_variability_enu_discrete:
334 result[i].variability = 2;
336 case fmi2_variability_enu_continuous:
337 result[i].variability = 3;
339 case fmi2_variability_enu_unknown:
340 result[i].variability = 4;
344 switch (fmi2_import_get_causality(var)) {
345 case fmi2_causality_enu_input:
346 result[i].causality = 0;
348 case fmi2_causality_enu_output:
349 result[i].causality = 1;
351 case fmi2_causality_enu_local:
352 result[i].causality = 2;
354 case fmi2_causality_enu_independent:
355 result[i].causality = 3;
357 case fmi2_causality_enu_unknown:
358 result[i].causality = 4;
362 switch (fmi2_import_get_variable_base_type(var)) {
363 case fmi2_base_type_real:
366 case fmi2_base_type_int:
369 case fmi2_base_type_bool:
372 case fmi2_base_type_str:
375 case fmi2_base_type_enum:
380 result[i].vr = fmi2_import_get_variable_vr(var);
382 type = fmi2_import_get_variable_declared_type(var);
384 result[i].declaredType = fmi2_import_get_type_name(type);
386 result[i].declaredType = 0;
393 fmi2_import_free_variable_list(vl);
399 FMIL_DeclaredType *FMI1_CS_GET_DECLARED_TYPES(void *fmu, int *count, const char **error) {
401 FMIL_DeclaredType *result;
402 fmi1_import_type_definitions_t* td = fmi1_import_get_type_definitions((fmi1_import_t *)fmu);
403 fmi1_import_variable_typedef_t* type;
404 unsigned i, ntd = (unsigned)fmi1_import_get_type_definition_number(td);
408 result = (FMIL_DeclaredType *)malloc(count[0]*sizeof(FMIL_DeclaredType));
410 for(i = 0; i < ntd; i++) {
411 type = fmi1_import_get_typedef(td, i);
412 result[i].name = fmi1_import_get_type_name(type);
413 result[i].description = fmi1_import_get_type_description(type);
414 result[i].quantity = fmi1_import_get_type_quantity(type);
417 switch(fmi1_import_get_base_type(type)) {
418 case fmi1_base_type_real: {
419 fmi1_import_real_typedef_t* rt = fmi1_import_get_type_as_real(type);
420 fmi1_import_unit_t* u = fmi1_import_get_real_type_unit(rt);
421 if(u) result[i].unit = fmi1_import_get_unit_name(u);
431 FMIL_DeclaredType *FMI2_CS_GET_DECLARED_TYPES(void *fmu, int *count, const char **error) {
433 FMIL_DeclaredType *result;
434 fmi2_import_type_definitions_t* td = fmi2_import_get_type_definitions((fmi2_import_t *)fmu);
435 fmi2_import_variable_typedef_t* type;
436 unsigned i, ntd = (unsigned)fmi2_import_get_type_definition_number(td);
440 result = (FMIL_DeclaredType *)malloc(count[0]*sizeof(FMIL_DeclaredType));
442 for(i = 0; i < ntd; i++) {
443 type = fmi2_import_get_typedef(td, i);
444 result[i].name = fmi2_import_get_type_name(type);
445 result[i].description = fmi2_import_get_type_description(type);
446 result[i].quantity = fmi2_import_get_type_quantity(type);
449 switch(fmi2_import_get_base_type(type)) {
450 case fmi2_base_type_real: {
451 fmi2_import_real_typedef_t* rt = fmi2_import_get_type_as_real(type);
452 fmi2_import_unit_t* u = fmi2_import_get_real_type_unit(rt);
453 if(u) result[i].unit = fmi2_import_get_unit_name(u);
463 int FMI1_CS_INSTANTIATE(void *fmu, const char *instanceName, const char **error) {
465 fmi1_string_t fmuLocation;
466 fmi1_string_t mimeType;
468 fmi1_boolean_t visible;
469 fmi1_boolean_t interactive;
470 fmi1_boolean_t loggingOn;
472 jm_status_enu_t jmstatus;
477 visible = fmi1_false;
478 interactive = fmi1_false;
479 loggingOn = fmi1_true;
481 jmstatus = fmi1_import_instantiate_slave((fmi1_import_t*)fmu, instanceName, NULL, NULL, timeout, fmi1_false, fmi1_false);
482 if (jmstatus == jm_status_error) {
483 *error = fmi1_import_get_last_error((fmi1_import_t*)fmu);
489 int FMI2_CS_INSTANTIATE(void *fmu, const char *instanceName, const char **error) {
491 fmi2_string_t fmuLocation;
492 fmi2_string_t mimeType;
494 fmi2_boolean_t visible;
495 jm_status_enu_t jmstatus;
500 visible = fmi2_false;
501 // With NULL value for resourceLocation, its value is taken from the `fmu` argument
502 jmstatus = fmi2_import_instantiate((fmi2_import_t*)fmu, instanceName, fmi2_cosimulation, NULL, visible);
503 if (jmstatus == jm_status_error) {
504 *error = fmi2_import_get_last_error((fmi2_import_t*)fmu);
510 int FMI1_CS_INITIALIZE(void *fmu, const char **error) {
512 fmi1_status_t status;
515 fmi1_boolean_t StopTimeDefined;
519 StopTimeDefined = fmi1_false;
521 status = fmi1_import_initialize_slave((fmi1_import_t *)fmu, tStart, StopTimeDefined, tStop);
522 if (status == fmi1_status_error || status == fmi1_status_fatal) {
523 printf("fmi1_capi_initialize_slave: Failed\n");
526 printf("fmi1_capi_initialize_slave: Success\n");
532 int FMI2_CS_INITIALIZE(void *fmu, const char **error) {
536 fmi2_boolean_t StopTimeDefined;
537 fmi2_real_t relativeTol = 1e-4;
539 fmi2_status_t fmistatus;
543 StopTimeDefined = fmi1_false;
545 fmistatus = fmi2_import_setup_experiment((fmi2_import_t*)fmu, fmi2_true, relativeTol, tStart, StopTimeDefined, tStop);
546 if(fmistatus != fmi2_status_ok) {
547 *error = ("fmi2_import_setup_experiment failed\n");
551 fmistatus = fmi2_import_enter_initialization_mode((fmi2_import_t*)fmu);
552 if(fmistatus != fmi2_status_ok) {
553 *error = ("fmi2_import_enter_initialization_mode failed\n");
557 fmistatus = fmi2_import_exit_initialization_mode((fmi2_import_t*)fmu);
558 if(fmistatus != fmi2_status_ok) {
559 *error = ("fmi2_import_exit_initialization_mode failed\n");
566 int FMI1_CS_STEP(void *fmu, double masterTime, double stepSize, const char **error) {
568 fmi1_status_t status;
570 status = fmi1_import_do_step((fmi1_import_t *)fmu, (fmi1_real_t)masterTime, (fmi1_real_t)stepSize, fmi1_true);
571 if (status == fmi1_status_error || status == fmi1_status_fatal) {
572 *error = "Error happened during stepping!";
578 int FMI2_CS_STEP(void *fmu, double masterTime, double stepSize, const char **error) {
580 fmi2_status_t status;
582 status = fmi2_import_do_step((fmi2_import_t *)fmu, (fmi2_real_t)masterTime, (fmi2_real_t)stepSize, fmi2_true);
583 if (status == fmi2_status_error || status == fmi2_status_fatal) {
584 *error = "Error happened during stepping!";
592 int FMI1_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) {
594 fmi1_status_t status;
595 fmi1_real_t valueTmp = value;
597 fmi1_value_reference_t vr = valueId;
598 status = fmi1_import_set_real((fmi1_import_t *)fmu, &vr, 1, &valueTmp);
599 if (status == fmi1_status_error || status == fmi1_status_fatal) {
600 *error = "Error happened during setting real value!";
606 int FMI1_CS_SET_INTEGER(void *fmu, int valueId, int value, const char **error) {
608 fmi1_status_t status;
609 fmi1_integer_t valueTmp = value;
611 fmi1_value_reference_t vr = valueId;
612 status = fmi1_import_set_integer((fmi1_import_t *)fmu, &vr, 1, &valueTmp);
613 if (status == fmi1_status_error || status == fmi1_status_fatal) {
614 *error = "Error happened during setting integer value!";
620 int FMI1_CS_SET_BOOLEAN(void *fmu, int valueId, int value, const char **error) {
622 fmi1_status_t status;
623 fmi1_boolean_t valueTmp = value != 0;
625 fmi1_value_reference_t vr = valueId;
626 status = fmi1_import_set_boolean((fmi1_import_t *)fmu, &vr, 1, &valueTmp);
627 if (status == fmi1_status_error || status == fmi1_status_fatal) {
628 *error = "Error happened during setting boolean value!";
634 int FMI1_CS_SET_STRING(void *fmu, int valueId, const char *value, const char **error) {
636 fmi1_status_t status;
637 fmi1_string_t valueTmp = value;
639 fmi1_value_reference_t vr = valueId;
640 status = fmi1_import_set_string((fmi1_import_t *)fmu, &vr, 1, &valueTmp);
641 if (status == fmi1_status_error || status == fmi1_status_fatal) {
642 *error = "Error happened during setting string value!";
650 int FMI2_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) {
652 fmi2_status_t status;
653 fmi2_real_t valueTmp = value;
655 fmi2_value_reference_t vr = valueId;
656 status = fmi2_import_set_real((fmi2_import_t *)fmu, &vr, 1, &valueTmp);
657 if (status == fmi2_status_error || status == fmi2_status_fatal) {
658 *error = "Error happened during setting real value!";
664 int FMI2_CS_SET_INTEGER(void *fmu, int valueId, int value, const char **error) {
666 fmi2_status_t status;
667 fmi2_integer_t valueTmp = value;
669 fmi2_value_reference_t vr = valueId;
670 status = fmi2_import_set_integer((fmi2_import_t *)fmu, &vr, 1, &valueTmp);
671 if (status == fmi2_status_error || status == fmi2_status_fatal) {
672 *error = "Error happened during setting integer value!";
678 int FMI2_CS_SET_BOOLEAN(void *fmu, int valueId, int value, const char **error) {
680 fmi2_status_t status;
681 fmi2_boolean_t valueTmp = value != 0;
683 fmi2_value_reference_t vr = valueId;
684 status = fmi2_import_set_boolean((fmi2_import_t *)fmu, &vr, 1, &valueTmp);
685 if (status == fmi2_status_error || status == fmi2_status_fatal) {
686 *error = "Error happened during setting boolean value!";
692 int FMI2_CS_SET_STRING(void *fmu, int valueId, const char *value, const char **error) {
694 fmi2_status_t status;
695 fmi2_string_t valueTmp = value;
697 fmi2_value_reference_t vr = valueId;
698 status = fmi2_import_set_string((fmi2_import_t *)fmu, &vr, 1, &valueTmp);
699 if (status == fmi2_status_error || status == fmi2_status_fatal) {
700 *error = "Error happened during setting string value!";
708 double FMI1_CS_GET_REAL(void *fmu, int valueReference, const char **error) {
710 fmi1_value_reference_t vr = valueReference;
713 fmi1_status_t status;
715 status = fmi1_import_get_real((fmi1_import_t *)fmu, &vr, 1, &value);
716 if (status == fmi1_status_error || status == fmi1_status_fatal) {
717 *error = "Error happened during getting real value!";
722 int FMI1_CS_GET_INTEGER(void *fmu, int valueReference, const char **error) {
724 fmi1_value_reference_t vr = valueReference;
725 fmi1_integer_t value;
727 fmi1_status_t status;
729 status = fmi1_import_get_integer((fmi1_import_t *)fmu, &vr, 1, &value);
730 if (status == fmi1_status_error || status == fmi1_status_fatal) {
731 *error = "Error happened during getting integer value!";
736 int FMI1_CS_GET_BOOLEAN(void *fmu, int valueReference, const char **error) {
738 fmi1_value_reference_t vr = valueReference;
739 fmi1_boolean_t value;
741 fmi1_status_t status;
743 status = fmi1_import_get_boolean((fmi1_import_t *)fmu, &vr, 1, &value);
744 if (status == fmi1_status_error || status == fmi1_status_fatal) {
745 *error = "Error happened during getting boolean value!";
750 const char *FMI1_CS_GET_STRING(void *fmu, int valueReference, const char **error) {
752 fmi1_value_reference_t vr = valueReference;
755 fmi1_status_t status;
757 status = fmi1_import_get_string((fmi1_import_t *)fmu, &vr, 1, &value);
758 if (status == fmi1_status_error || status == fmi1_status_fatal) {
759 *error = "Error happened during getting string value!";
766 double FMI2_CS_GET_REAL(void *fmu, int valueReference, const char **error) {
768 fmi2_value_reference_t vr = valueReference;
771 fmi2_status_t status;
773 status = fmi2_import_get_real((fmi2_import_t *)fmu, &vr, 1, &value);
774 if (status == fmi2_status_error || status == fmi2_status_fatal) {
775 *error = "Error happened during getting real value!";
780 int FMI2_CS_GET_INTEGER(void *fmu, int valueReference, const char **error) {
782 fmi2_value_reference_t vr = valueReference;
783 fmi2_integer_t value;
785 fmi2_status_t status;
787 status = fmi2_import_get_integer((fmi2_import_t *)fmu, &vr, 1, &value);
788 if (status == fmi2_status_error || status == fmi2_status_fatal) {
789 *error = "Error happened during getting integer value!";
794 int FMI2_CS_GET_BOOLEAN(void *fmu, int valueReference, const char **error) {
796 fmi2_value_reference_t vr = valueReference;
797 fmi2_boolean_t value;
799 fmi2_status_t status;
801 status = fmi2_import_get_boolean((fmi2_import_t *)fmu, &vr, 1, &value);
802 if (status == fmi2_status_error || status == fmi2_status_fatal) {
803 *error = "Error happened during getting boolean value!";
808 const char *FMI2_CS_GET_STRING(void *fmu, int valueReference, const char **error) {
810 fmi2_value_reference_t vr = valueReference;
813 fmi2_status_t status;
815 status = fmi2_import_get_string((fmi2_import_t *)fmu, &vr, 1, &value);
816 if (status == fmi2_status_error || status == fmi2_status_fatal) {
817 *error = "Error happened during getting string value!";
822 // FMI1 array getters
824 int FMI1_CS_GET_REALS(void *fmu, int *valueReferences, double *result, int count, const char **error) {
826 fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
827 fmi1_status_t status;
829 status = fmi1_import_get_real((fmi1_import_t *)fmu, vrs, count, result);
830 if (status == fmi1_status_error || status == fmi1_status_fatal) {
831 *error = "Error happened during getting real values!";
836 int FMI1_CS_GET_INTEGERS(void *fmu, int *valueReferences, int *result, int count, const char **error) {
838 fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
839 fmi1_status_t status;
841 status = fmi1_import_get_integer((fmi1_import_t *)fmu, vrs, count, result);
842 if (status == fmi1_status_error || status == fmi1_status_fatal) {
843 *error = "Error happened during getting integer values!";
848 int FMI1_CS_GET_BOOLEANS(void *fmu, int *valueReferences, char *result, int count, const char **error) {
850 fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
851 fmi1_status_t status;
853 status = fmi1_import_get_boolean((fmi1_import_t *)fmu, vrs, count, result);
854 if (status == fmi1_status_error || status == fmi1_status_fatal) {
855 *error = "Error happened during getting boolean values!";
860 int FMI1_CS_GET_STRINGS(void *fmu, int *valueReferences, const char **result, int count, const char **error) {
862 fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
863 fmi1_status_t status;
865 status = fmi1_import_get_string((fmi1_import_t *)fmu, vrs, count, result);
866 if (status == fmi1_status_error || status == fmi1_status_fatal) {
867 *error = "Error happened during getting string values!";
872 // FMI2 array getters
874 int FMI2_CS_GET_REALS(void *fmu, int *valueReferences, double *result, int count, const char **error) {
876 fmi2_value_reference_t *vrs = (fmi2_value_reference_t*) valueReferences;
877 fmi2_status_t status;
879 status = fmi2_import_get_real((fmi2_import_t *)fmu, vrs, count, result);
880 if (status == fmi2_status_error || status == fmi2_status_fatal) {
881 *error = "Error happened during getting real values!";
887 int FMI2_CS_GET_INTEGERS(void *fmu, int *valueReferences, int *result, int count, const char **error) {
889 fmi2_value_reference_t *vrs = (fmi2_value_reference_t*)valueReferences;
890 fmi2_status_t status;
892 status = fmi2_import_get_integer((fmi2_import_t *)fmu, vrs, count, result);
893 if (status == fmi2_status_error || status == fmi2_status_fatal) {
894 *error = "Error happened during getting integer values!";
900 int FMI2_CS_GET_BOOLEANS(void *fmu, int *valueReferences, int *result, int count, const char **error) {
902 fmi2_value_reference_t *vrs = (fmi2_value_reference_t*)valueReferences;
903 fmi2_status_t status;
905 status = fmi2_import_get_boolean((fmi2_import_t *)fmu, vrs, count, result);
906 if (status == fmi2_status_error || status == fmi2_status_fatal) {
907 *error = "Error happened during getting boolean values!";
913 int FMI2_CS_GET_STRINGS(void *fmu, int *valueReferences, const char **result, int count, const char **error) {
915 fmi2_value_reference_t *vrs = (fmi2_value_reference_t*) valueReferences;
916 fmi2_status_t status;
918 status = fmi2_import_get_string((fmi2_import_t *)fmu, vrs, count, result);
919 if (status == fmi2_status_error || status == fmi2_status_fatal) {
920 *error = "Error happened during getting string values!";