import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
+import java.net.URL;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
+import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
-import org.simantics.fmil.core.ExecEnvironment.ARCHType;
import org.simantics.fmil.core.ExecEnvironment.OSType;
import org.simantics.utils.FileUtils;
import org.slf4j.Logger;
*/
private static int OK = 0;
private static int ERROR = 1;
- private static String UNSATISFIED_LINK = "Method not found. DLL might not be loaded properly.";
- public static final String TEMP_FMU_DIRECTORY_NAME = "fmil";
- public static String TEMP_FMU_COMMON_DIRECTORY;
+ private static String UNSATISFIED_LINK = "Method not found. DLL might not be loaded properly.";
+ public static final String TEMP_FMU_DIRECTORY_NAME = "fmil";
+ public static String TEMP_FMU_COMMON_DIRECTORY;
public static String LOCK_FILE_NAME = "fmil.lock";
public static Object syncObject = new Object();
* Static: load native libraries required for the FMU simulation to work.
*/
static {
-
+
File[] libraries = new File[2];
- Bundle bundle = null;
-
ExecEnvironment env = ExecEnvironment.calculate();
- if (env.os == OSType.WINDOWS) {
- if (env.arch == ARCHType.X86) {
- bundle = Platform.getBundle("org.simantics.fmil.win32");
- } else if (env.arch == ARCHType.X86_64) {
- bundle = Platform.getBundle("org.simantics.fmil.win64");
- }
- }
-
- if (bundle != null) {
- try{
- String root = FileLocator.getBundleFile(bundle).getAbsolutePath();
-// if (env.arch == ARCHType.X86_64) {
-// File newFIle = new File(root, "libraries/libexpat.dll");
-// System.load(newFIle.getAbsolutePath());
-// }
-// libraries[0] = new File(root, "libraries/zlibwapi.dll");
-// libraries[1] = new File(root, "libraries/miniunz.dll");
- libraries[0] = new File(root, "libraries/fmilib_shared.dll");
- libraries[1] = new File(root, "libraries/FMUSimulator.dll");
- }
- catch (Exception e) {
- e.printStackTrace();
+
+ try {
+ URL sharedFMILIBUrl = null;
+ URL simulatorFMIUrl = null;
+ Bundle b = Platform.getBundle("org.simantics.fmil.core");
+
+ if (env.os == OSType.WINDOWS) {
+ sharedFMILIBUrl = FileLocator.find(b, new Path("libraries/fmilib_shared.dll"), null);
+ simulatorFMIUrl = FileLocator.find(b, new Path("libraries/FMUSimulator.dll"), null);
+ } else if(env.os == OSType.LINUX) {
+ sharedFMILIBUrl = FileLocator.find(b, new Path("libraries/libfmilib_shared.so"), null);
+ simulatorFMIUrl = FileLocator.find(b, new Path("libraries/libFMUSimulator.so"), null);
}
+
+ libraries[0] = new File(FileLocator.toFileURL(sharedFMILIBUrl).getPath());
+ libraries[1] = new File(FileLocator.toFileURL(simulatorFMIUrl).getPath());
+ } catch (Exception e) {
+ LOGGER.error("Failed to resolve native FMU simulation library for execution environment {}.{}", env.os, env.arch, e);
}
for(File library : libraries) {
}
public boolean subscribe(String name) throws FMILException {
- // Safety check
- int vr = variableMap.get(name);
- if(vr == 0) return false;
- if(!subscriptionSet.add(name)) return false;
- subscribedNames.add(name);
- System.err.println("subscribed : " + name + " => " + subscribedNames.size());
- subscription.add(vr);
- subscribe(new int[] { vr });
- return true;
+ synchronized(syncObject) {
+ // Safety check
+ int vr = variableMap.get(name);
+ if(vr == 0) return false;
+ if(!subscriptionSet.add(name)) return false;
+ subscribedNames.add(name);
+ subscription.add(vr);
+ subscribe(new int[] { vr });
+ return true;
+ }
}
public FMIL() {
fmuN = 0;
}
- File tempDir = new File(fmuDir);
- if(tempDir.isDirectory()) {
+ java.nio.file.Path tempDir = Paths.get(fmuDir);
+ if(Files.exists(tempDir) && Files.isDirectory(tempDir)) {
try {
- FileUtils.deleteAll(tempDir);
+ FileUtils.emptyDirectory(tempDir);
} catch (IOException e) {
- throw new FMILException("Could not create temp folder for fmu");
+ throw new FMILException("Could not delete existing files from temp folder for fmu " + path, e);
}
- tempDir.mkdir();
} else {
- tempDir.mkdir();
+ try {
+ Files.createDirectory(tempDir);
+ } catch (IOException e) {
+ throw new FMILException("Could not create temp folder for fmu " + path, e);
+ }
}
-
try {
- String tmpPath = tempDir.getAbsolutePath();
- if(!tmpPath.endsWith("\\"))
- tmpPath = tmpPath + "\\";
+ String tmpPath = tempDir.toString();
+ if(!tmpPath.endsWith("\\") && !tmpPath.endsWith("/"))
+ tmpPath = tmpPath + "/";
id = loadFMUFile_(path, tmpPath);
getAllVariables();
} catch (UnsatisfiedLinkError err) {
throw new FMILException(UNSATISFIED_LINK, err);
} catch (Exception e) {
+ LOGGER.error(e.getMessage());
throw new FMILException(e.getMessage());
}
}
synchronized(syncObject) {
try {
-
+
double[] results = new double[subscription.size()];
- return getSubscribedResults_(getModelIDNew(), results);
-
+ Arrays.fill(results, Double.NaN);
+
+ return getSubscribedResults_(getModelIDNew(), results);
} catch (UnsatisfiedLinkError err) {
throw new FMILException(UNSATISFIED_LINK);
} catch (Exception e) {
synchronized(syncObject) {
try {
- // TODO: printtaa id ja name, jotta saadaan virheessä kiinni
+ // TODO: printtaa id ja name, jotta saadaan virheessä kiinni
double result = getRealValue_(getModelIDNew(), variableMap.get(name));
System.err.println("getRealValue " + name + " = " + result);
return result;