From dd1ca5e5d7fae427cae08e16c14e519df4727500 Mon Sep 17 00:00:00 2001 From: villberg Date: Thu, 28 Jan 2016 06:36:15 +0000 Subject: [PATCH] (refs #6290) Import initial FMI Studio codebase More ontology for variables. Type, description, variability, causality git-svn-id: https://www.simantics.org/svn/simantics/fmi/trunk@32331 ac1ea38d-2e2b-0410-8846-a27921b304fc --- .../libraries/FMUSimulator.dll | Bin 88064 -> 89088 bytes .../libraries/fmilib_shared.dll | Bin 274944 -> 274944 bytes .../native/FMUSimulator/FMUSimulator.vcxproj | 2 +- .../native/FMUSimulator/fmi_util.c.txt | 76 +++++++++++++- .../native/FMUSimulator/fmilib_shared.lib | Bin 121026 -> 121026 bytes .../native/FMUSimulator/include/fmi1_cs.h | 19 ++++ .../include/org_simantics_fmil_FMILJNI.h | 12 +++ .../native/FMUSimulator/src/fmu_control.cpp | 94 +++++++++++++++++- .../native/FMUSimulator/src/sim_support.c | 2 +- .../src/org/simantics/fmil/FMIL.java | 88 +++++++++++++++- 10 files changed, 283 insertions(+), 10 deletions(-) diff --git a/org.simantics.fmil.win32/libraries/FMUSimulator.dll b/org.simantics.fmil.win32/libraries/FMUSimulator.dll index 75711f20eb660ab6538f91342015418dcb530aa6..13157f637509a1bcacceccac0704ab10dcc0a4d6 100644 GIT binary patch delta 11160 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 L&yq}feUJYFr~pVh delta 10009 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 R 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 Mu~t>3#>F@MUvBDfG5`Po delta 40752 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�Bv|i=b7I5F`d2 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 true true - $(OutDir)zlibwapi.lib;$(OutDir)miniunz.lib;%(AdditionalDependencies) + fmilib_shared.lib;%(AdditionalDependencies) diff --git a/org.simantics.fmil/native/FMUSimulator/fmi_util.c.txt b/org.simantics.fmil/native/FMUSimulator/fmi_util.c.txt index 54b7a48..caab8ac 100644 --- a/org.simantics.fmil/native/FMUSimulator/fmi_util.c.txt +++ b/org.simantics.fmil/native/FMUSimulator/fmi_util.c.txt @@ -76,7 +76,26 @@ extern "C" { typedef struct { char *name; + char *description; 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; __declspec(dllexport) void* FMI1_CS_LOAD(const char *zipFilePath, const char *unzipFolder); @@ -186,8 +205,63 @@ FMIL_Variable *FMI1_CS_GET_VARIABLES(void *fmu, int *count) { } else { - fmi1_base_type_enu_t bt; result[i].name = fmi1_import_get_variable_name(var); + result[i].description = fmi1_import_get_variable_description(var); + + switch (fmi1_import_get_variability(var)) { + case fmi1_variability_enu_constant: + result[i].variability = 0; + break; + case fmi1_variability_enu_parameter: + result[i].variability = 1; + break; + case fmi1_variability_enu_discrete: + result[i].variability = 2; + break; + case fmi1_variability_enu_continuous: + result[i].variability = 3; + break; + case fmi1_variability_enu_unknown: + result[i].variability = 4; + break; + } + + switch (fmi1_import_get_causality(var)) { + case fmi1_causality_enu_input: + result[i].causality = 0; + break; + case fmi1_causality_enu_output: + result[i].causality = 1; + break; + case fmi1_causality_enu_internal: + result[i].causality = 2; + break; + case fmi1_causality_enu_none: + result[i].causality = 3; + break; + case fmi1_causality_enu_unknown: + result[i].causality = 4; + break; + } + + switch (fmi1_import_get_variable_base_type(var)) { + case fmi1_base_type_real: + result[i].type = 0; + break; + case fmi1_base_type_int: + result[i].type = 1; + break; + case fmi1_base_type_bool: + result[i].type = 2; + break; + case fmi1_base_type_str: + result[i].type = 3; + break; + case fmi1_base_type_enum: + result[i].type = 4; + break; + } + result[i].vr = fmi1_import_get_variable_vr(var); } diff --git a/org.simantics.fmil/native/FMUSimulator/fmilib_shared.lib b/org.simantics.fmil/native/FMUSimulator/fmilib_shared.lib index 872bfc68e87ffec7072b4ec95dfbb3d94fdff3c2..b65aa9bf7535a9573ae8015f30af21f12f1f83ac 100644 GIT binary patch delta 11836 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 cV`2|=lSc variables; // all variables in an initialized model - vector valueReferences; // all value references - vector subscription; // subscribed value references + + vector variables; + vector descriptions; + vector valueReferences; + vector types; + vector variabilities; + vector causalities; + + vector subscription; double currentTime; double timeStep; @@ -128,6 +134,13 @@ JNIEXPORT jint JNICALL Java_org_simantics_fmil_FMIL_loadFMUFile_1 vars = FMI1_CS_GET_VARIABLES(fmi1.fmu, &variableCount); for(int i=0;iNewObjectArray(fmus[id].descriptions.size(), + env->FindClass("java/lang/String"), + env->NewStringUTF("")); + + for(int i=0;iSetObjectArrayElement(ret,i,env->NewStringUTF(fmus[id].descriptions[i].c_str())); + } + + return ret; + +} + JNIEXPORT jintArray JNICALL Java_org_simantics_fmil_FMIL_getAllVariableReferences_1 (JNIEnv *env, jobject obj, jint id, jintArray result) { @@ -425,6 +453,66 @@ JNIEXPORT jintArray JNICALL Java_org_simantics_fmil_FMIL_getAllVariableReference } +JNIEXPORT jintArray JNICALL Java_org_simantics_fmil_FMIL_getAllVariableTypes_1 + (JNIEnv *env, jobject obj, jint id, jintArray result) { + + jboolean isCopy; + jint* resultElements = env -> GetIntArrayElements(result, &isCopy); + jsize n = env -> GetArrayLength(result); + + int i; + for (i = 0; i < n; i++) { + resultElements[i] = fmus[id].types[i]; + } + + if (isCopy == JNI_TRUE) { + env -> ReleaseIntArrayElements(result, resultElements, 0); + } + + return result; + +} + +JNIEXPORT jintArray JNICALL Java_org_simantics_fmil_FMIL_getAllVariableVariabilities_1 + (JNIEnv *env, jobject obj, jint id, jintArray result) { + + jboolean isCopy; + jint* resultElements = env -> GetIntArrayElements(result, &isCopy); + jsize n = env -> GetArrayLength(result); + + int i; + for (i = 0; i < n; i++) { + resultElements[i] = fmus[id].variabilities[i]; + } + + if (isCopy == JNI_TRUE) { + env -> ReleaseIntArrayElements(result, resultElements, 0); + } + + return result; + +} + +JNIEXPORT jintArray JNICALL Java_org_simantics_fmil_FMIL_getAllVariableCausalities_1 + (JNIEnv *env, jobject obj, jint id, jintArray result) { + + jboolean isCopy; + jint* resultElements = env -> GetIntArrayElements(result, &isCopy); + jsize n = env -> GetArrayLength(result); + + int i; + for (i = 0; i < n; i++) { + resultElements[i] = fmus[id].causalities[i]; + } + + if (isCopy == JNI_TRUE) { + env -> ReleaseIntArrayElements(result, resultElements, 0); + } + + return result; + +} + /* JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_FMIL_filterVariables_1 (JNIEnv *env, jobject obj, jstring id, jstring regexp) { diff --git a/org.simantics.fmil/native/FMUSimulator/src/sim_support.c b/org.simantics.fmil/native/FMUSimulator/src/sim_support.c index fba8ac2..5f2cb62 100644 --- a/org.simantics.fmil/native/FMUSimulator/src/sim_support.c +++ b/org.simantics.fmil/native/FMUSimulator/src/sim_support.c @@ -19,7 +19,7 @@ #endif #include "sim_support.h" -#include "fmuExtract.h" +//#include "fmuExtract.h" // fileName is an absolute path, e.g. C:\test\a.fmu // or relative to the current dir, e.g. ..\test\a.fmu diff --git a/org.simantics.fmil/src/org/simantics/fmil/FMIL.java b/org.simantics.fmil/src/org/simantics/fmil/FMIL.java index 70d6028..1302634 100644 --- a/org.simantics.fmil/src/org/simantics/fmil/FMIL.java +++ b/org.simantics.fmil/src/org/simantics/fmil/FMIL.java @@ -106,7 +106,11 @@ public class FMIL { private String dirName; private String[] variableNames; + private String[] variableDescriptions; private int[] variableReferences; + private int[] variableTypes; + private int[] variableCausalities; + private int[] variableVariabilities; private TObjectIntHashMap variableMap = new TObjectIntHashMap(); private Set subscriptionSet = new HashSet(); @@ -583,10 +587,26 @@ public class FMIL { private native String[] getAllVariables_(int id); - /** - * Get all variables in a loaded model - * @return all variables in a loaded model - */ + public String[] getAllVariableDescriptions() throws FMILException { + synchronized(syncObject) { + + try { + + if(variableDescriptions == null) { + variableDescriptions = getAllVariableDescriptions_(getModelIDNew()); + } + return variableDescriptions; + + } catch (UnsatisfiedLinkError err) { + throw new FMILException(UNSATISFIED_LINK); + } catch (Exception e) { + throw new FMILException(e.getMessage()); + } + } + } + + private native String[] getAllVariableDescriptions_(int id); + public int[] getAllVariableReferences() throws FMILException { synchronized(syncObject) { @@ -606,6 +626,66 @@ public class FMIL { } private native int[] getAllVariableReferences_(int id, int[] array); + + public int[] getAllVariableTypes() throws FMILException { + synchronized(syncObject) { + + try { + + if(variableTypes == null) { + variableTypes = getAllVariableTypes_(getModelIDNew(), new int[variableNames.length]); + } + return variableTypes; + + } catch (UnsatisfiedLinkError err) { + throw new FMILException(UNSATISFIED_LINK); + } catch (Exception e) { + throw new FMILException(e.getMessage()); + } + } + } + + private native int[] getAllVariableTypes_(int id, int[] array); + + public int[] getAllVariableCausalities() throws FMILException { + synchronized(syncObject) { + + try { + + if(variableCausalities == null) { + variableCausalities = getAllVariableCausalities_(getModelIDNew(), new int[variableNames.length]); + } + return variableCausalities; + + } catch (UnsatisfiedLinkError err) { + throw new FMILException(UNSATISFIED_LINK); + } catch (Exception e) { + throw new FMILException(e.getMessage()); + } + } + } + + private native int[] getAllVariableCausalities_(int id, int[] array); + + public int[] getAllVariableVariabilities() throws FMILException { + synchronized(syncObject) { + + try { + + if(variableVariabilities == null) { + variableVariabilities = getAllVariableVariabilities_(getModelIDNew(), new int[variableNames.length]); + } + return variableVariabilities; + + } catch (UnsatisfiedLinkError err) { + throw new FMILException(UNSATISFIED_LINK); + } catch (Exception e) { + throw new FMILException(e.getMessage()); + } + } + } + + private native int[] getAllVariableVariabilities_(int id, int[] array); // // /** -- 2.47.1