]> gerrit.simantics Code Review - simantics/fmil.git/commitdiff
Add atomic counter for instanceName and update README, fix loadFMU 64/2164/9
authorMiro Richard Eklund <miro.eklund@semantum.fi>
Wed, 12 Sep 2018 12:50:08 +0000 (15:50 +0300)
committerReino Ruusu <reino.ruusu@semantum.fi>
Thu, 13 Sep 2018 09:35:43 +0000 (12:35 +0300)
Readme has been updated to have a more detailed build instruction on
Windows.

gitlab #6
gitlab #5

Change-Id: I86462b0a15e4adac0f4b8546811f6d2c3c18087a

org.simantics.fmil.core/README.md
org.simantics.fmil.core/native/FMUSimulator/fmi_util.c.txt
org.simantics.fmil.core/native/FMUSimulator/src/fmu_control.cpp
org.simantics.fmil.core/src/org/simantics/fmil/core/FMIL.java

index 46d611bc2dfbc26885112a40718d7a3807b01413..0539e376bfe08783ae6eac636e34543028a54d43 100644 (file)
@@ -1,10 +1,40 @@
 # How to build FMUSimulator and FMILibrary
 
-CMake GUI for generating Visual Studio project files from FMILibrary sources
+## Base FMILibrary
+
+To build the Visual Studio Solution files you need CMake.
+CMake is also used to build the base native FMILibrary.
+
+Note:
+This is not usually needed, you can use the existing build.
 
 Remember to manually delete CMakeCache and CMakeFiles from FMILibrary/build/expatex/-folder 
 
-NOTE:
+Follow the instructions provided by the Linux Dockerfile and linuxbuild.sh.
+In short:
+1) Download the desired FMILibrary source .zip
+2) Unzip in a location of your choosing
+3) Open terminal
+4) Change directory to where you want to build the output
+5) Run cmake from command-line and provide as the first argument the path to where you unzipped sources in step 2
+Optional) To make a debug version, add -DFMILIB_ENABLE_LOG_LEVEL_DEBUG=ON before the path to source
+6) In both debug and normal case, run "make" and "make install test" to verify the installation
+
+If the build succeeded, you should have .dll files which you can now copy to your win32 or win64 org.simantics.fmil.* projects.
+Specifically:
+fmu1_dll_cs.dll, fmu1_dll_me.dll, fmu2_dll_cs.dll, fmu2_dll_me.sll and fmilib_shared.dll
+Copy the corresponding "Debug" build files to the sub-directoryn "Debug" in the projects.
+
+## FMUSimulator
+
+When you have the Visual Studio files:
+Build from command-line our FMUSimulator.dll
+
+1) Open a terminal
+2) Navigate to org.simantics.fmil.core/native/FMUSimulator
+3) Run "msbuild.exe"
+
+## Building on linux
        
 When building the libfmilib_shared.so, we need to replace fmi_util.c file under "<path to FMILibrary>/src/Util/src/FMI/fmi_util.c" with contents of fmi_util.c.txt, located
 under /native/FMUSimulator/fmi_util.c.txt. The Dockerfile already does this so if you build the libfmilib_shared.so with that, then you needn't worry about this.
index 450910cad7820976fc8435cfeec039214e4fa252..31ef175a6f74bb2f0ec524361af206f0914036a4 100644 (file)
@@ -231,6 +231,9 @@ int FMI_CS_LOAD(const char *zipFilePath, const char *unzipFolder, void **fmuPoin
                
                *fmuPointer = fmu2;
                *fmuVersion = 2;
+       } else {
+           *error = "Couldn't find version of FMU - possibly incorrect file!";
+           return 1;
        }
        
        fmi_import_free_context(context);
index 285be84e42627582224722227a789c39fd9436a5..bb8e0762d041dee5d821784ab570b246a716b5d6 100644 (file)
@@ -19,6 +19,7 @@
 #include <vector>
 #include <iostream>
 #include <regex>
+#include <atomic>
 
 #include <org_simantics_fmil_FMILJNI.h>
 
@@ -33,6 +34,12 @@ extern "C" {
 
 using namespace std;
 
+static std::atomic<int> instanceNameID;
+
+int create_id() {
+    return instanceNameID++;
+}
+
 struct FMI1 {
 
        void *fmu;
@@ -472,14 +479,16 @@ JNIEXPORT jdoubleArray JNICALL Java_org_simantics_fmil_core_FMIL_getSubscribedRe
 JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_instantiateSimulation_1
   (JNIEnv *env, jobject obj, jint id) {
 
+         int uniqueId = create_id();
+         std::string instanceName = std::to_string(uniqueId);
          int returnValue;
          const char *error = "";
 
          FMI1 &fmi = fmus[id];
          if (fmi.version == 1) {
-               returnValue = FMI1_CS_INSTANTIATE(fmi.fmu, "", &error);
+                 returnValue = FMI1_CS_INSTANTIATE(fmi.fmu, instanceName, &error);
          } else if (fmi.version == 2) {
-                 returnValue = FMI2_CS_INSTANTIATE(fmi.fmu, "", &error);
+                 returnValue = FMI2_CS_INSTANTIATE(fmi.fmu, instanceName, &error);
          }
          if(returnValue != 0) {
                string message = "No FMU loaded: ";
index f4c7ca4f2fbbf7d044be10c09a2b4f896b31fe0b..1f1e098d7eade1d37c3edd6a2c5dec8c13acff83 100644 (file)
@@ -184,6 +184,11 @@ public class FMIL {
     private boolean fmuLoaded = false;
     public void loadFMUFile(String path) throws FMILException {
 
+        if (!Files.exists(Paths.get(path)))
+            throw new FMILException("File " + path + " does not exist");
+        if (!Files.isRegularFile(Paths.get(path)))
+            throw new FMILException("Path " + path + " is not a file");
+
         synchronized(syncObject) {
 
             if(fmuN % 2 == 0) {
@@ -232,7 +237,7 @@ public class FMIL {
         }
     }
 
-    private native int loadFMUFile_(String path, String toDir);
+    private native int loadFMUFile_(String path, String toDir) throws FMILException;
 
     /**
      * Set a step length for simulation