]> gerrit.simantics Code Review - simantics/fmil.git/blobdiff - org.simantics.fmil.core/native/FMILibrary/Test/FMI1/fmi_import_xml_test.c
Add FMILibrary-2.0.3 to org.simantics.fmil.core\native.
[simantics/fmil.git] / org.simantics.fmil.core / native / FMILibrary / Test / FMI1 / fmi_import_xml_test.c
diff --git a/org.simantics.fmil.core/native/FMILibrary/Test/FMI1/fmi_import_xml_test.c b/org.simantics.fmil.core/native/FMILibrary/Test/FMI1/fmi_import_xml_test.c
new file mode 100644 (file)
index 0000000..4d1a028
--- /dev/null
@@ -0,0 +1,421 @@
+/*\r
+    Copyright (C) 2012 Modelon AB\r
+\r
+    This program is free software: you can redistribute it and/or modify\r
+    it under the terms of the BSD style license.\r
+\r
+    This program is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+    FMILIB_License.txt file for more details.\r
+\r
+    You should have received a copy of the FMILIB_License.txt file\r
+    along with this program. If not, contact Modelon AB <http://www.modelon.com>.\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <stdarg.h>\r
+#include <assert.h>\r
+#include <time.h>\r
+\r
+#include "config_test.h"\r
+\r
+#include <FMI/fmi_import_context.h>\r
+\r
+#include <FMI1/fmi1_import.h>\r
+\r
+\r
+void mylogger(jm_callbacks* c, jm_string module, jm_log_level_enu_t log_level, jm_string message)\r
+{\r
+        printf("module = %s, log level = %d: %s\n", module, log_level, message);\r
+}\r
+\r
+void do_exit(int code)\r
+{\r
+       printf("Press 'Enter' to exit\n");\r
+/*     getchar(); */\r
+       exit(code);\r
+}\r
+\r
+void print_int(int i,void* data) {\r
+    printf("%d\n", i);\r
+}\r
+\r
+void print_dbl(double d,void* data) {\r
+    printf("%g\n", d);\r
+}\r
+\r
+void printTypeInfo(fmi1_import_variable_typedef_t* vt) {\r
+    const char* quan;\r
+\r
+    if(!vt) {\r
+        printf("No type definition\n");\r
+        return;\r
+    }\r
+\r
+    quan = fmi1_import_get_type_quantity(vt);\r
+\r
+    printf("Type %s\n description: %s\n",  fmi1_import_get_type_name(vt), fmi1_import_get_type_description(vt));\r
+\r
+    printf("Base type: %s\n", fmi1_base_type_to_string(fmi1_import_get_base_type(vt)));\r
+\r
+    if(quan) {\r
+        printf("Quantity: %s\n", quan);\r
+    }\r
+    switch(fmi1_import_get_base_type(vt)) {\r
+    case fmi1_base_type_real: {\r
+        fmi1_import_real_typedef_t* rt = fmi1_import_get_type_as_real(vt);\r
+        fmi1_real_t min = fmi1_import_get_real_type_min(rt);\r
+        fmi1_real_t max = fmi1_import_get_real_type_max(rt);\r
+        fmi1_real_t nom = fmi1_import_get_real_type_nominal(rt);\r
+        fmi1_import_unit_t* u = fmi1_import_get_real_type_unit(rt);\r
+        fmi1_import_display_unit_t* du = fmi1_import_get_type_display_unit(rt);\r
+\r
+        printf("Min %g, max %g, nominal %g\n", min, max, nom);\r
+\r
+        if(u) {\r
+            printf("Unit: %s\n", fmi1_import_get_unit_name(u));\r
+        }\r
+        if(du) {\r
+            printf("Display unit: %s, gain: %g, offset: %g, is relative: %s",\r
+                   fmi1_import_get_display_unit_name(du),\r
+                   fmi1_import_get_display_unit_gain(du),\r
+                   fmi1_import_get_display_unit_offset(du),\r
+                   fmi1_import_get_real_type_is_relative_quantity(rt)?"yes":"no"\r
+                   );\r
+        }\r
+\r
+        break;\r
+    }\r
+    case fmi1_base_type_int:{\r
+        fmi1_import_integer_typedef_t* it = fmi1_import_get_type_as_int(vt);\r
+        int min = fmi1_import_get_integer_type_min(it);\r
+        int max = fmi1_import_get_integer_type_max(it);\r
+        printf("Min %d, max %d\n", min, max);\r
+        break;\r
+    }\r
+    case fmi1_base_type_bool:{\r
+        break;\r
+    }\r
+    case fmi1_base_type_str:{\r
+        break;\r
+    }\r
+    case fmi1_base_type_enum:{\r
+        fmi1_import_enumeration_typedef_t* et = fmi1_import_get_type_as_enum(vt);\r
+        int min = fmi1_import_get_enum_type_min(et);\r
+        int max = fmi1_import_get_enum_type_max(et);\r
+        printf("Min %d, max %d\n", min, max);\r
+        {\r
+            size_t ni;\r
+                       unsigned i;\r
+            ni = fmi1_import_get_enum_type_size(et);\r
+                       i = (unsigned)(ni);\r
+                       assert( i == ni);\r
+            printf("There are %u items \n",(unsigned)ni);\r
+            for(i = 0; i < ni; i++) {\r
+                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));\r
+            }\r
+        }\r
+        break;\r
+    }\r
+    default:\r
+        printf("Error in fmiGetBaseType()\n");\r
+    }\r
+\r
+}\r
+\r
+void testVariableSearch(fmi1_import_t* fmu,\r
+       fmi1_import_variable_t* v) {\r
+\r
+               const char * a_name = fmi1_import_get_variable_name(v);\r
+               fmi1_import_variable_t* found = fmi1_import_get_variable_by_name(fmu, a_name);\r
+               if(found != v) {\r
+                       printf("Searching by name %s found var %s\n", a_name, found?fmi1_import_get_variable_name(found):"nothing");\r
+                       do_exit(1);\r
+               }\r
+               else {\r
+                       printf("Searching by name worked fine\n");\r
+               }\r
+               found = fmi1_import_get_variable_by_vr(fmu, fmi1_import_get_variable_base_type(v),fmi1_import_get_variable_vr(v));\r
+               if(!found) {\r
+                       printf("Searching by vr failed for variable '%s'\n", a_name);\r
+                       do_exit(1);\r
+               }\r
+               else if(fmi1_import_get_variable_base_type(v) != fmi1_import_get_variable_base_type(found)) {                   \r
+                       printf("Searching %s found var %s", a_name, fmi1_import_get_variable_name(found));\r
+                       do_exit(1);\r
+               }\r
+               else if(fmi1_import_get_variable_vr(v) != fmi1_import_get_variable_vr(found)) {                 \r
+                       printf("Searching %s found var %s", a_name, fmi1_import_get_variable_name(found));\r
+                       do_exit(1);\r
+               }\r
+               else {\r
+                       printf("Searching by vr worked fine\n");\r
+               }\r
+}\r
+\r
+void printVariableInfo(fmi1_import_t* fmu,\r
+                       fmi1_import_variable_t* v) {\r
+    fmi1_base_type_enu_t bt;\r
+    printf("Variable name: %s\n", fmi1_import_get_variable_name(v));\r
+    printf("Description: %s\n", fmi1_import_get_variable_description(v));\r
+    printf("VR: %d\n", fmi1_import_get_variable_vr(v));\r
+    printf("Variability: %s\n", fmi1_variability_to_string(fmi1_import_get_variability(v)));\r
+    printf("Causality: %s\n", fmi1_causality_to_string(fmi1_import_get_causality(v)));\r
+\r
+    bt = fmi1_import_get_variable_base_type(v);\r
+    printf("Base type: %s\n", fmi1_base_type_to_string(bt));\r
+\r
+    printTypeInfo(fmi1_import_get_variable_declared_type(v));\r
+    if(bt == fmi1_base_type_real) {\r
+        fmi1_import_real_variable_t *rv = fmi1_import_get_variable_as_real(v);\r
+        fmi1_import_unit_t * u = fmi1_import_get_real_variable_unit(rv);\r
+        fmi1_import_display_unit_t * du = fmi1_import_get_real_variable_display_unit(rv);\r
+        printf("Unit: %s, display unit: %s\n", u ? fmi1_import_get_unit_name(u):0, du?fmi1_import_get_display_unit_name(du):0);\r
+    }\r
+\r
+    if(fmi1_import_get_variable_has_start(v)) {\r
+        printf("There is a start value, fixed attribute is '%s'\n", (fmi1_import_get_variable_is_fixed(v))?"true":"false");\r
+\r
+        switch(fmi1_import_get_variable_base_type(v)) {\r
+        case fmi1_base_type_real: {\r
+            fmi1_import_real_variable_t *rv = fmi1_import_get_variable_as_real(v);\r
+            printf("start =%g\n", fmi1_import_get_real_variable_start(rv));\r
+            break;\r
+        }\r
+        case fmi1_base_type_int:{\r
+            printf("start =%d\n", fmi1_import_get_integer_variable_start(fmi1_import_get_variable_as_integer(v)));\r
+            break;\r
+        }\r
+        case fmi1_base_type_bool:{\r
+            printf("start = %d\n", fmi1_import_get_boolean_variable_start(fmi1_import_get_variable_as_boolean(v)));\r
+            break;\r
+        }\r
+        case fmi1_base_type_str:{\r
+            printf("start = '%s'\n", fmi1_import_get_string_variable_start(fmi1_import_get_variable_as_string(v)));\r
+            break;\r
+        }\r
+        case fmi1_base_type_enum:{\r
+            printf("start = %d\n", fmi1_import_get_enum_variable_start(fmi1_import_get_variable_as_enum(v)));\r
+            break;\r
+        }\r
+        default:\r
+            printf("Error in fmiGetBaseType()\n");\r
+        }\r
+    }\r
+    if(fmi1_import_get_variable_alias_kind(v) != fmi1_variable_is_not_alias) {\r
+        printf("The variable is aliased to %s\n",\r
+               fmi1_import_get_variable_name( fmi1_import_get_variable_alias_base(fmu, v)));\r
+    }\r
+    else {\r
+        printf("The variable is not an alias\n");\r
+    }\r
+    {\r
+        fmi1_import_variable_list_t* vl = fmi1_import_get_variable_aliases(fmu, v);\r
+        size_t n = fmi1_import_get_variable_list_size(vl);\r
+               unsigned i = (unsigned)n;\r
+               assert( n == i);\r
+        if(n>1) {\r
+            printf("Listing aliases: \n");\r
+            for(i = 0;i<n;i++)\r
+                printf("\t%s\n",fmi1_import_get_variable_name(fmi1_import_get_variable(vl, i)));\r
+        }\r
+        fmi1_import_free_variable_list(vl);\r
+    }\r
+       {\r
+               fmi1_import_variable_list_t* vl = fmi1_import_get_direct_dependency( fmu, v);\r
+        size_t n = 0;\r
+               unsigned i;\r
+               if(vl) \r
+                       n = fmi1_import_get_variable_list_size(vl);\r
+               i = (unsigned)n;\r
+               assert( n == i);                \r
+        if(vl) {\r
+            printf("Listing direct dependencies: \n");\r
+            for(i = 0;i<n;i++)\r
+                printf("\t%s\n",fmi1_import_get_variable_name(fmi1_import_get_variable(vl, i)));\r
+        }\r
+        fmi1_import_free_variable_list(vl);\r
+       }\r
+}\r
+\r
+void printCapabilitiesInfo(fmi1_import_capabilities_t* capabilities) {\r
+    printf("canHandleVariableCommunicationStepSize = %u\n", fmi1_import_get_canHandleVariableCommunicationStepSize(capabilities ));\r
+    printf("canHandleEvents = %u\n", fmi1_import_get_canHandleEvents(capabilities ));\r
+    printf("canRejectSteps = %u\n", fmi1_import_get_canRejectSteps(capabilities ));\r
+    printf("canInterpolateInputs = %u\n", fmi1_import_get_canInterpolateInputs(capabilities ));\r
+    printf("maxOutputDerivativeOrder = %u\n", fmi1_import_get_maxOutputDerivativeOrder(capabilities ));\r
+    printf("canRunAsynchronuously = %u\n", fmi1_import_get_canRunAsynchronuously(capabilities ));\r
+    printf("canSignalEvents = %u\n", fmi1_import_get_canSignalEvents(capabilities ));\r
+    printf("canBeInstantiatedOnlyOncePerProcess = %u\n", fmi1_import_get_canBeInstantiatedOnlyOncePerProcess(capabilities ));\r
+    printf("canNotUseMemoryManagementFunctions = %u\n", fmi1_import_get_canNotUseMemoryManagementFunctions(capabilities ));\r
+}\r
+\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+    clock_t start, stop;\r
+    double t = 0.0;\r
+       const char* tmpPath;\r
+       jm_callbacks callbacks;\r
+       fmi_import_context_t* context;\r
+\r
+       fmi1_import_t* fmu;\r
+\r
+       if(argc < 2) {\r
+               printf("Usage: %s <path to a dir with modelDescription.xml>\n", argv[0]);\r
+               do_exit(1);\r
+       }\r
+\r
+       tmpPath = argv[1];\r
+\r
+       callbacks.malloc = malloc;\r
+    callbacks.calloc = calloc;\r
+    callbacks.realloc = realloc;\r
+    callbacks.free = free;\r
+    callbacks.logger = mylogger;\r
+    callbacks.context = 0;\r
+       callbacks.log_level = jm_log_level_debug;\r
+\r
+#ifdef FMILIB_GENERATE_BUILD_STAMP\r
+       printf("Library build stamp:\n%s\n", fmilib_get_build_stamp());\r
+#endif\r
+\r
+       context = fmi_import_allocate_context(&callbacks);\r
+\r
+       start = clock();\r
+       fmu = fmi1_import_parse_xml(context, tmpPath);\r
+\r
+       if(!fmu) {\r
+               printf("Error parsing XML, exiting\n");\r
+        fmi_import_free_context(context);       \r
+               do_exit(1);\r
+       }\r
+\r
+           /* Stop timer */\r
+    stop = clock();\r
+    t = (double) (stop-start)/CLOCKS_PER_SEC;\r
+\r
+    printf("Parsing took %g seconds\n", t);\r
+    printf("Model name: %s\n", fmi1_import_get_model_name(fmu));\r
+    printf("Model identifier: %s\n", fmi1_import_get_model_identifier(fmu));\r
+    printf("Model GUID: %s\n", fmi1_import_get_GUID(fmu));\r
+    printf("FMU kind: %s\n", fmi1_fmu_kind_to_string(fmi1_import_get_fmu_kind(fmu)));\r
+    printf("Description: %s\n", fmi1_import_get_description(fmu));\r
+    printf("Author: %s\n", fmi1_import_get_author(fmu));\r
+    printf("FMI Version: %s\n", fmi1_import_get_model_standard_version(fmu));\r
+    printf("Generation tool: %s\n", fmi1_import_get_generation_tool(fmu));\r
+    printf("Generation date and time: %s\n", fmi1_import_get_generation_date_and_time(fmu));\r
+    printf("Version: %s\n", fmi1_import_get_model_version(fmu));\r
+    printf("Naming : %s\n", fmi1_naming_convention_to_string(fmi1_import_get_naming_convention(fmu)));\r
+\r
+    if(fmi1_import_get_fmu_kind(fmu) != fmi1_fmu_kind_enu_me)\r
+        printCapabilitiesInfo(fmi1_import_get_capabilities(fmu));\r
+\r
+    printf("NumberOfContinuousStates = %d\n", fmi1_import_get_number_of_continuous_states(fmu));\r
+    printf("NumberOfEventIndicators = %d\n", fmi1_import_get_number_of_event_indicators(fmu));\r
+\r
+    printf("Default experiment start = %g, end = %g, tolerance = %g\n",\r
+           fmi1_import_get_default_experiment_start(fmu),\r
+           fmi1_import_get_default_experiment_stop(fmu),\r
+           fmi1_import_get_default_experiment_tolerance(fmu));\r
+    {\r
+        fmi1_import_vendor_list_t* vl = fmi1_import_get_vendor_list(fmu);\r
+        size_t nv = fmi1_import_get_number_of_vendors(vl);\r
+               unsigned i;\r
+               i = (unsigned)nv;\r
+               assert( nv == i);               \r
+        printf("There are %u tool annotation records \n", (unsigned)nv);\r
+        for( i = 0; i < nv; i++) {\r
+            fmi1_import_vendor_t* vendor = fmi1_import_get_vendor(vl, i);\r
+            if(!vendor) {\r
+                printf("Error getting vendor for index %u\n", (unsigned)i);\r
+                break;\r
+            }\r
+            printf("Vendor name [%d] %s", i, fmi1_import_get_vendor_name(vendor));\r
+            {\r
+                unsigned j, na = fmi1_import_get_number_of_vendor_annotations(vendor);\r
+\r
+                for(j = 0; j< na; j++) {\r
+                    fmi1_import_annotation_t* a = fmi1_import_get_vendor_annotation(vendor, j);\r
+                    if(!a) {\r
+                        printf("Error getting vendor for index %d (%s)\n", j, fmi1_import_get_last_error(fmu));\r
+                        break;\r
+                    }\r
+\r
+                    printf("Annotation: %s = %s", fmi1_import_get_annotation_name(a), fmi1_import_get_annotation_value(a));\r
+                }\r
+            }\r
+        }\r
+    }\r
+    {\r
+        fmi1_import_unit_definitions_t* ud = fmi1_import_get_unit_definitions(fmu);\r
+        if(ud) {\r
+            unsigned  i, nu = fmi1_import_get_unit_definitions_number(ud);\r
+            printf("There are %d different units used \n", nu);\r
+\r
+            for(i = 0; i < nu; i++) {\r
+                fmi1_import_unit_t* u = fmi1_import_get_unit(ud, i);\r
+                if(!u) {\r
+                    printf("Error getting unit for index %d (%s)\n", i, fmi1_import_get_last_error(fmu));\r
+                    break;\r
+                }\r
+                printf("Unit [%d] is %s, it has %d display units\n", i, fmi1_import_get_unit_name(u), fmi1_import_get_unit_display_unit_number(u));\r
+            }\r
+        }\r
+        else\r
+            printf("Error getting unit definitions (%s)\n", fmi1_import_get_last_error(fmu));\r
+    }\r
+    {\r
+        fmi1_import_type_definitions_t* td = fmi1_import_get_type_definitions(fmu);\r
+        if(td) {\r
+            {\r
+                unsigned i, ntd = (unsigned)fmi1_import_get_type_definition_number(td);\r
+                printf("There are %d defs\n", ntd);\r
+                for(i = 0; i < ntd; i++) {\r
+                    fmi1_import_variable_typedef_t* vt = fmi1_import_get_typedef(td, i);\r
+                    if(!vt) {\r
+                        printf("Error getting vartype for index %d (%s)\n", i, fmi1_import_get_last_error(fmu));\r
+                        break;\r
+                    }\r
+                    printTypeInfo(vt);\r
+                }\r
+            }\r
+        }\r
+        else\r
+            printf("Error getting type definitions (%s)\n", fmi1_import_get_last_error(fmu));\r
+    }\r
+    {\r
+        size_t nv;\r
+               unsigned i;\r
+        fmi1_import_variable_list_t* vl = fmi1_import_get_variable_list(fmu);\r
+\r
+        assert(vl);\r
+        nv = fmi1_import_get_variable_list_size(vl);\r
+               i = (unsigned)nv;\r
+               assert(i == nv);\r
+               printf("There are %u variables in total \n",(unsigned)nv);\r
+        for(i = 0; i < nv; i++) {\r
+            fmi1_import_variable_t* var = fmi1_import_get_variable(vl, i);\r
+            if(!var) {\r
+                               printf("Something wrong with variable %d \n",i);\r
+                               do_exit(1);\r
+                       }\r
+            else {\r
+                printVariableInfo(fmu, var);\r
+                               testVariableSearch(fmu, var);\r
+                       }\r
+        }\r
+        fmi1_import_free_variable_list(vl);\r
+    }\r
+\r
+       fmi1_import_free(fmu);\r
+       fmi_import_free_context(context);\r
+       \r
+       printf("Everything seems to be OK since you got this far=)!\n");\r
+\r
+       do_exit(0);\r
+}\r
+\r
+\r