]> gerrit.simantics Code Review - simantics/fmil.git/blob - org.simantics.fmil.core/native/FMUSimulator/src/fmi_util.c
Added getters and setters for all FMI data types.
[simantics/fmil.git] / org.simantics.fmil.core / native / FMUSimulator / src / fmi_util.c
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <stdarg.h>
5 #include <string.h>
6 #include <errno.h>
7
8 #include <fmilib.h>
9
10 #include <fmi1_cs.h>
11
12 #define BUFFER 4096
13
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)
16 {
17         printf("module = %s, log level = %d: %s\n", module, log_level, message);
18 }
19
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, ...)
22 {
23         char msg[BUFFER];
24     int len;
25         va_list argp;
26         va_start(argp, message);
27         len = vsnprintf(msg, BUFFER, message, argp);
28         printf("fmiStatus = %d;  %s (%s): %s\n", status, instanceName, category, msg);
29     if(len > BUFFER) {
30         printf("Warning: Message was truncated.\n");
31     }
32 }
33
34 int FMI_CS_LOAD(const char *zipFilePath, const char *unzipFolder, void **fmuPointer, int *fmuVersion, const char **error) {
35
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;
41         fmi1_import_t *fmu;
42         fmi2_import_t *fmu2;
43         jm_callbacks* callbacks;
44
45         callbacks = (jm_callbacks *)calloc(1, sizeof(jm_callbacks));
46
47         callbacks->malloc = malloc;
48     callbacks->calloc = calloc;
49     callbacks->realloc = realloc;
50     callbacks->free = free;
51     callbacks->logger = importlogger;
52 #ifdef _DEBUG
53     callbacks->log_level = jm_log_level_debug;
54 #else
55         callbacks->log_level = jm_log_level_warning;
56 #endif
57     callbacks->context = 0;
58
59         context = fmi_import_allocate_context(callbacks);
60
61         version = fmi_import_get_fmi_version(context, zipFilePath, unzipFolder);
62
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 */
68                 }
69
70                 callBackFunctions.logger = fmilogger;
71                 callBackFunctions.allocateMemory = calloc;
72                 callBackFunctions.freeMemory = free;
73
74                 status = fmi1_import_create_dllfmu(fmu, callBackFunctions, 0);
75                 if (status == jm_status_error) {
76                         *error = fmi1_import_get_last_error(fmu);
77                         return 3;
78                 }
79
80                 *fmuPointer = fmu;
81                 *fmuVersion = 1;
82         } else if (version == fmi_version_2_0_enu) {
83                 fmu2 = fmi2_import_parse_xml(context, unzipFolder, 0);
84
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 */
88                 }
89
90                 callBackFunctions2.logger = fmi2_log_forwarding;
91                 callBackFunctions2.allocateMemory = calloc;
92                 callBackFunctions2.freeMemory = free;
93                 callBackFunctions2.componentEnvironment = fmu2;
94
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);
98                         return 3;
99                 }
100
101                 *fmuPointer = fmu2;
102                 *fmuVersion = 2;
103         } else {
104             *error = "Couldn't find version of FMU - possibly incorrect file!";
105             return 1;
106         }
107
108         fmi_import_free_context(context);
109
110         return 0; /* success */
111 }
112
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);
117         return 0;
118 }
119
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);
124         return 0;
125 }
126
127 /*
128  if(!vt) {
129         printf("No type definition\n");
130         return;
131     }
132
133     quan = fmi1_import_get_type_quantity(vt);
134
135     printf("Type %s\n description: %s\n",  fmi1_import_get_type_name(vt), fmi1_import_get_type_description(vt));
136
137     printf("Base type: %s\n", fmi1_base_type_to_string(fmi1_import_get_base_type(vt)));
138
139     if(quan) {
140         printf("Quantity: %s\n", quan);
141     }
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);
150
151         printf("Min %g, max %g, nominal %g\n", min, max, nom);
152
153         if(u) {
154             printf("Unit: %s\n", fmi1_import_get_unit_name(u));
155         }
156         if(du) {
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"
162                    );
163         }
164
165         break;
166     }
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);
172         break;
173     }
174     case fmi1_base_type_bool:{
175         break;
176     }
177     case fmi1_base_type_str:{
178         break;
179     }
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);
185         {
186             size_t ni;
187                         unsigned i;
188             ni = fmi1_import_get_enum_type_size(et);
189                         i = (unsigned)(ni);
190                         assert( i == ni);
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));
194             }
195         }
196         break;
197     }
198     default:
199         printf("Error in fmiGetBaseType()\n");
200     }
201 */
202
203
204 FMIL_Variable *FMI1_CS_GET_VARIABLES(void *fmu, int *count, const char **error) {
205
206     int i;
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;
210
211     count[0] = (int)fmi1_import_get_variable_list_size(vl);
212
213         result = (FMIL_Variable *)malloc(count[0]*sizeof(FMIL_Variable));
214
215     for(i = 0; i < count[0]; i++) {
216
217         fmi1_import_variable_t* var = fmi1_import_get_variable(vl, i);
218         if(!var) {
219
220                         printf("Something wrong with variable %d \n",i);
221                         return 0;
222
223                 } else {
224
225                         result[i].name = fmi1_import_get_variable_name(var);
226                         result[i].description = fmi1_import_get_variable_description(var);
227
228                         switch  (fmi1_import_get_variability(var)) {
229                         case fmi1_variability_enu_constant:
230                                 result[i].variability = 0;
231                                 break;
232                         case fmi1_variability_enu_parameter:
233                                 result[i].variability = 1;
234                                 break;
235                         case fmi1_variability_enu_discrete:
236                                 result[i].variability = 2;
237                                 break;
238                         case fmi1_variability_enu_continuous:
239                                 result[i].variability = 3;
240                                 break;
241                         case fmi1_variability_enu_unknown:
242                                 result[i].variability = 4;
243                                 break;
244                         }
245
246                         switch  (fmi1_import_get_causality(var)) {
247                         case fmi1_causality_enu_input:
248                                 result[i].causality = 0;
249                                 break;
250                         case fmi1_causality_enu_output:
251                                 result[i].causality = 1;
252                                 break;
253                         case fmi1_causality_enu_internal:
254                                 result[i].causality = 2;
255                                 break;
256                         case fmi1_causality_enu_none:
257                                 result[i].causality = 3;
258                                 break;
259                         case fmi1_causality_enu_unknown:
260                                 result[i].causality = 4;
261                                 break;
262                         }
263
264                         switch  (fmi1_import_get_variable_base_type(var)) {
265                         case fmi1_base_type_real:
266                                 result[i].type = 0;
267                                 break;
268                         case fmi1_base_type_int:
269                                 result[i].type = 1;
270                                 break;
271                         case fmi1_base_type_bool:
272                                 result[i].type = 2;
273                                 break;
274                         case fmi1_base_type_str:
275                                 result[i].type = 3;
276                                 break;
277                         case fmi1_base_type_enum:
278                                 result[i].type = 4;
279                                 break;
280                         }
281
282                         result[i].vr = fmi1_import_get_variable_vr(var);
283
284                         type = fmi1_import_get_variable_declared_type(var);
285                         if(type) {
286                                 result[i].declaredType = fmi1_import_get_type_name(type);
287                         } else {
288                                 result[i].declaredType = 0;
289                         }
290
291                 }
292
293     }
294
295     fmi1_import_free_variable_list(vl);
296
297         return result;
298
299 }
300
301 FMIL_Variable *FMI2_CS_GET_VARIABLES(void *fmu, int *count, const char **error) {
302
303     int i;
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;
307
308     count[0] = (int)fmi2_import_get_variable_list_size(vl);
309
310         result = (FMIL_Variable *)malloc(count[0]*sizeof(FMIL_Variable));
311
312     for(i = 0; i < count[0]; i++) {
313
314         fmi2_import_variable_t* var = fmi2_import_get_variable(vl, i);
315         if(!var) {
316
317                         printf("Something wrong with variable %d \n",i);
318                         return 0;
319
320                 } else {
321
322                         result[i].name = fmi2_import_get_variable_name(var);
323                         result[i].description = fmi2_import_get_variable_description(var);
324
325                         switch  (fmi2_import_get_variability(var)) {
326                         case fmi2_variability_enu_constant:
327                                 result[i].variability = 0;
328                                 break;
329                         case fmi2_variability_enu_fixed:
330                         case fmi2_variability_enu_tunable:
331                                 result[i].variability = 1;
332                                 break;
333                         case fmi2_variability_enu_discrete:
334                                 result[i].variability = 2;
335                                 break;
336                         case fmi2_variability_enu_continuous:
337                                 result[i].variability = 3;
338                                 break;
339                         case fmi2_variability_enu_unknown:
340                                 result[i].variability = 4;
341                                 break;
342                         }
343
344                         switch  (fmi2_import_get_causality(var)) {
345                         case fmi2_causality_enu_input:
346                                 result[i].causality = 0;
347                                 break;
348                         case fmi2_causality_enu_output:
349                                 result[i].causality = 1;
350                                 break;
351                         case fmi2_causality_enu_local:
352                                 result[i].causality = 2;
353                                 break;
354                         case fmi2_causality_enu_independent:
355                                 result[i].causality = 3;
356                                 break;
357                         case fmi2_causality_enu_unknown:
358                                 result[i].causality = 4;
359                                 break;
360                         }
361
362                         switch  (fmi2_import_get_variable_base_type(var)) {
363                         case fmi2_base_type_real:
364                                 result[i].type = 0;
365                                 break;
366                         case fmi2_base_type_int:
367                                 result[i].type = 1;
368                                 break;
369                         case fmi2_base_type_bool:
370                                 result[i].type = 2;
371                                 break;
372                         case fmi2_base_type_str:
373                                 result[i].type = 3;
374                                 break;
375                         case fmi2_base_type_enum:
376                                 result[i].type = 4;
377                                 break;
378                         }
379
380                         result[i].vr = fmi2_import_get_variable_vr(var);
381
382                         type = fmi2_import_get_variable_declared_type(var);
383                         if(type) {
384                                 result[i].declaredType = fmi2_import_get_type_name(type);
385                         } else {
386                                 result[i].declaredType = 0;
387                         }
388
389                 }
390
391     }
392
393     fmi2_import_free_variable_list(vl);
394
395         return result;
396
397 }
398
399 FMIL_DeclaredType *FMI1_CS_GET_DECLARED_TYPES(void *fmu, int *count, const char **error) {
400
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);
405
406     count[0] = ntd;
407
408         result = (FMIL_DeclaredType *)malloc(count[0]*sizeof(FMIL_DeclaredType));
409
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);
415       result[i].unit = 0;
416
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);
422                    }
423           }
424
425     }
426
427         return result;
428
429 }
430
431 FMIL_DeclaredType *FMI2_CS_GET_DECLARED_TYPES(void *fmu, int *count, const char **error) {
432
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);
437
438     count[0] = ntd;
439
440         result = (FMIL_DeclaredType *)malloc(count[0]*sizeof(FMIL_DeclaredType));
441
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);
447       result[i].unit = 0;
448
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);
454                    }
455           }
456
457     }
458
459         return result;
460
461 }
462
463 int FMI1_CS_INSTANTIATE(void *fmu, const char *instanceName, const char **error) {
464
465         fmi1_string_t fmuLocation;
466         fmi1_string_t mimeType;
467         fmi1_real_t timeout;
468         fmi1_boolean_t visible;
469         fmi1_boolean_t interactive;
470         fmi1_boolean_t loggingOn;
471
472         jm_status_enu_t jmstatus;
473
474         fmuLocation = "";
475         mimeType = "";
476         timeout = 0;
477         visible = fmi1_false;
478         interactive = fmi1_false;
479         loggingOn = fmi1_true;
480
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);
484                 return 1;
485         }
486         return 0;
487 }
488
489 int FMI2_CS_INSTANTIATE(void *fmu, const char *instanceName, const char **error) {
490
491         fmi2_string_t fmuLocation;
492         fmi2_string_t mimeType;
493         fmi2_real_t timeout;
494         fmi2_boolean_t visible;
495         jm_status_enu_t jmstatus;
496
497         fmuLocation = "";
498         mimeType = "";
499         timeout = 0;
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);
505                 return 1;
506         }
507         return 0;
508 }
509
510 int FMI1_CS_INITIALIZE(void *fmu, const char **error) {
511
512         fmi1_status_t status;
513         fmi1_real_t tStart;
514         fmi1_real_t tStop;
515         fmi1_boolean_t StopTimeDefined;
516
517         tStart = 0;
518         tStop = 10;
519         StopTimeDefined = fmi1_false;
520
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");
524                 return 0;
525         } else {
526                 printf("fmi1_capi_initialize_slave:              Success\n");
527         }
528         return 0;
529
530 }
531
532 int FMI2_CS_INITIALIZE(void *fmu, const char **error) {
533
534         fmi2_real_t tStart;
535         fmi2_real_t tStop;
536         fmi2_boolean_t StopTimeDefined;
537         fmi2_real_t relativeTol = 1e-4;
538
539         fmi2_status_t fmistatus;
540
541         tStart = 0;
542         tStop = 10;
543         StopTimeDefined = fmi1_false;
544
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");
548                 return 1;
549     }
550
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");
554                 return 1;
555     }
556
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");
560                 return 1;
561     }
562
563         return 0;
564 }
565
566 int FMI1_CS_STEP(void *fmu, double masterTime, double stepSize, const char **error) {
567
568     fmi1_status_t status;
569
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!";
573                 return 1;
574         }
575         return 0;
576 }
577
578 int FMI2_CS_STEP(void *fmu, double masterTime, double stepSize, const char **error) {
579
580     fmi2_status_t status;
581
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!";
585                 return 1;
586         }
587         return 0;
588 }
589
590 // FMI1 setters
591
592 int FMI1_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) {
593
594         fmi1_status_t status;
595         fmi1_real_t valueTmp = value;
596
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!";
601                 return 1;
602         }
603         return 0;
604 }
605
606 int FMI1_CS_SET_INTEGER(void *fmu, int valueId, int value, const char **error) {
607
608         fmi1_status_t status;
609         fmi1_integer_t valueTmp = value;
610
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!";
615                 return 1;
616         }
617         return 0;
618 }
619
620 int FMI1_CS_SET_BOOLEAN(void *fmu, int valueId, int value, const char **error) {
621
622         fmi1_status_t status;
623         fmi1_boolean_t valueTmp = value != 0;
624
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!";
629                 return 1;
630         }
631         return 0;
632 }
633
634 int FMI1_CS_SET_STRING(void *fmu, int valueId, const char *value, const char **error) {
635
636         fmi1_status_t status;
637         fmi1_string_t valueTmp = value;
638
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!";
643                 return 1;
644         }
645         return 0;
646 }
647
648 // FMI2 setters
649
650 int FMI2_CS_SET_REAL(void *fmu, int valueId, double value, const char **error) {
651
652         fmi2_status_t status;
653         fmi2_real_t valueTmp = value;
654
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!";
659                 return 1;
660         }
661         return 0;
662 }
663
664 int FMI2_CS_SET_INTEGER(void *fmu, int valueId, int value, const char **error) {
665
666         fmi2_status_t status;
667         fmi2_integer_t valueTmp = value;
668
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!";
673                 return 1;
674         }
675         return 0;
676 }
677
678 int FMI2_CS_SET_BOOLEAN(void *fmu, int valueId, int value, const char **error) {
679
680         fmi2_status_t status;
681         fmi2_boolean_t valueTmp = value != 0;
682
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!";
687                 return 1;
688         }
689         return 0;
690 }
691
692 int FMI2_CS_SET_STRING(void *fmu, int valueId, const char *value, const char **error) {
693
694         fmi2_status_t status;
695         fmi2_string_t valueTmp = value;
696
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!";
701                 return 1;
702         }
703         return 0;
704 }
705
706 // FMI1 getters
707
708 double FMI1_CS_GET_REAL(void *fmu, int valueReference, const char **error) {
709
710         fmi1_value_reference_t vr = valueReference;
711         fmi1_real_t value;
712
713         fmi1_status_t status;
714
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!";
718         }
719         return value;
720 }
721
722 int FMI1_CS_GET_INTEGER(void *fmu, int valueReference, const char **error) {
723
724         fmi1_value_reference_t vr = valueReference;
725         fmi1_integer_t value;
726
727         fmi1_status_t status;
728
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!";
732         }
733         return value;
734 }
735
736 int FMI1_CS_GET_BOOLEAN(void *fmu, int valueReference, const char **error) {
737
738         fmi1_value_reference_t vr = valueReference;
739         fmi1_boolean_t value;
740
741         fmi1_status_t status;
742
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!";
746         }
747         return value;
748 }
749
750 const char *FMI1_CS_GET_STRING(void *fmu, int valueReference, const char **error) {
751
752         fmi1_value_reference_t vr = valueReference;
753         fmi1_string_t value;
754
755         fmi1_status_t status;
756
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!";
760         }
761         return value;
762 }
763
764 // FMI2 getters
765
766 double FMI2_CS_GET_REAL(void *fmu, int valueReference, const char **error) {
767
768         fmi2_value_reference_t vr = valueReference;
769         fmi2_real_t value;
770
771         fmi2_status_t status;
772
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!";
776         }
777         return value;
778 }
779
780 int FMI2_CS_GET_INTEGER(void *fmu, int valueReference, const char **error) {
781
782         fmi2_value_reference_t vr = valueReference;
783         fmi2_integer_t value;
784
785         fmi2_status_t status;
786
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!";
790         }
791         return value;
792 }
793
794 int FMI2_CS_GET_BOOLEAN(void *fmu, int valueReference, const char **error) {
795
796         fmi2_value_reference_t vr = valueReference;
797         fmi2_boolean_t value;
798
799         fmi2_status_t status;
800
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!";
804         }
805         return value;
806 }
807
808 const char *FMI2_CS_GET_STRING(void *fmu, int valueReference, const char **error) {
809
810         fmi2_value_reference_t vr = valueReference;
811         fmi2_string_t value;
812
813         fmi2_status_t status;
814
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!";
818         }
819         return value;
820 }
821
822 // FMI1 array getters
823
824 int FMI1_CS_GET_REALS(void *fmu, int *valueReferences, double *result, int count, const char **error) {
825
826         fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
827         fmi1_status_t status;
828
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!";
832         }
833         return 0;
834 }
835
836 int FMI1_CS_GET_INTEGERS(void *fmu, int *valueReferences, int *result, int count, const char **error) {
837
838         fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
839         fmi1_status_t status;
840
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!";
844         }
845         return 0;
846 }
847
848 int FMI1_CS_GET_BOOLEANS(void *fmu, int *valueReferences, char *result, int count, const char **error) {
849
850         fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
851         fmi1_status_t status;
852
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!";
856         }
857         return 0;
858 }
859
860 int FMI1_CS_GET_STRINGS(void *fmu, int *valueReferences, const char **result, int count, const char **error) {
861
862         fmi1_value_reference_t *vrs = (fmi1_value_reference_t*)valueReferences;
863         fmi1_status_t status;
864
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!";
868         }
869         return 0;
870 }
871
872 // FMI2 array getters
873
874 int FMI2_CS_GET_REALS(void *fmu, int *valueReferences, double *result, int count, const char **error) {
875
876         fmi2_value_reference_t *vrs = (fmi2_value_reference_t*) valueReferences;
877         fmi2_status_t status;
878
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!";
882         }
883         return 0;
884
885 }
886
887 int FMI2_CS_GET_INTEGERS(void *fmu, int *valueReferences, int *result, int count, const char **error) {
888
889         fmi2_value_reference_t *vrs = (fmi2_value_reference_t*)valueReferences;
890         fmi2_status_t status;
891
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!";
895         }
896         return 0;
897
898 }
899
900 int FMI2_CS_GET_BOOLEANS(void *fmu, int *valueReferences, int *result, int count, const char **error) {
901
902         fmi2_value_reference_t *vrs = (fmi2_value_reference_t*)valueReferences;
903         fmi2_status_t status;
904
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!";
908         }
909         return 0;
910
911 }
912
913 int FMI2_CS_GET_STRINGS(void *fmu, int *valueReferences, const char **result, int count, const char **error) {
914
915         fmi2_value_reference_t *vrs = (fmi2_value_reference_t*) valueReferences;
916         fmi2_status_t status;
917
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!";
921         }
922         return 0;
923
924 }