X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.fmil.core%2Fnative%2FFMUSimulator%2Fsrc%2Ffmu_control.cpp;fp=org.simantics.fmil.core%2Fnative%2FFMUSimulator%2Fsrc%2Ffmu_control.cpp;h=dba9da20edab7b03defb68584249a0e823fbdca3;hb=03fa301b5bc7d636da1ff9f331af83504db484a4;hp=13272f1ac3657965abde7a1cb7c3d58e4c2eb433;hpb=4bed8078f3f6d15b8539d7357b8815f8bfeec2c4;p=simantics%2Ffmil.git diff --git a/org.simantics.fmil.core/native/FMUSimulator/src/fmu_control.cpp b/org.simantics.fmil.core/native/FMUSimulator/src/fmu_control.cpp index 13272f1..dba9da2 100644 --- a/org.simantics.fmil.core/native/FMUSimulator/src/fmu_control.cpp +++ b/org.simantics.fmil.core/native/FMUSimulator/src/fmu_control.cpp @@ -233,7 +233,7 @@ JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_loadFMUFile_1 env->ReleaseStringUTFChars(path, fmuPath); env->ReleaseStringUTFChars(tempDir, fmuTempDir); - return fmus.size() - 1; + return (jint)fmus.size() - 1; } @@ -296,109 +296,75 @@ string getTypeString(ScalarVariable* sv) { JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_setRealValue_1 (JNIEnv *env, jobject obj, jint id, jint vr, jdouble value) { - const char *error = ""; - FMI1 fmi = fmus[id]; - if (fmi.version == 1) { + const char *error = ""; + FMI1 &fmi = fmus[id]; + if (fmi.version == 1) { FMI1_CS_SET_REAL(fmi.fmu, vr, value, &error); - } else if (fmi.version == 2) { - FMI2_CS_SET_REAL(fmi.fmu, vr, value, &error); - } - if (!isEmpty(error)) { - string message = "Could not set real value "; - return throwFMILException(env, message += error); - } - return 0; + } + else if (fmi.version == 2) { + FMI2_CS_SET_REAL(fmi.fmu, vr, value, &error); + } + if (!isEmpty(error)) { + string message = "Could not set real value: "; + return throwFMILException(env, message += error); + } + return 0; } JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_setIntegerValue_1 - (JNIEnv *env, jobject obj, jstring id, jstring parameter, jint value) { - /* - const char *fmuId = env->GetStringUTFChars(id, 0); - if(exists(fmuId)) { - FMUControlStruct& fmuStruct = fmus[fmuId]; - const char *name = env->GetStringUTFChars(parameter, 0); - string nameString = name; - string modelId = fmuId; - if(!referenceExists(fmuStruct, name)) { - string errorMessage = "setIntegerValue: Model (id " + modelId + ") does not contain variable: " + nameString; - env->ReleaseStringUTFChars(parameter, name); - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, errorMessage); - } else { - // Check variable type - ScalarVariable* sv = fmuStruct.vars[fmuStruct.indexes[name]]; - switch (sv->typeSpec->type){ - case elm_Integer: - break; // ok - default: { - string errorMessage = "setIntegerValue: " + nameString + " is not of type Integer. (type: + " + getTypeString(sv) + ")"; - env->ReleaseStringUTFChars(parameter, name); - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, errorMessage); - } - } - - // Change value - fmiValueReference vr = getReference(fmuStruct, name); - const int intValue = (int) value; - fmuStruct.fmu.setInteger(fmuStruct.c, &vr, 1, &intValue); - env->ReleaseStringUTFChars(parameter, name); - env->ReleaseStringUTFChars(id, fmuId); - return 1; - } - } else { - string message = fmuId; - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, "setIntegerValue: Model id " + message + " not found"); + (JNIEnv *env, jobject obj, jint id, jint vr, jint value) { + + const char *error = ""; + FMI1 fmi = fmus[id]; + if (fmi.version == 1) { + FMI1_CS_SET_INTEGER(fmi.fmu, vr, value, &error); } - */ - return 1; + else if (fmi.version == 2) { + FMI2_CS_SET_INTEGER(fmi.fmu, vr, value, &error); + } + if (!isEmpty(error)) { + string message = "Could not set integer value: "; + return throwFMILException(env, message += error); + } + return 0; } JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_setBooleanValue_1 - (JNIEnv *env, jobject obj, jstring id, jstring parameter, jboolean value) { - /* - const char *fmuId = env->GetStringUTFChars(id, 0); - if(exists(fmuId)) { - FMUControlStruct& fmuStruct = fmus[fmuId]; - const char *name = env->GetStringUTFChars(parameter, 0); - string nameString = name; - string modelId = fmuId; - if(!referenceExists(fmuStruct, name)) { - string errorMessage = "setBooleanValue: Model (id " + modelId + ") does not contain variable: " + nameString; - env->ReleaseStringUTFChars(parameter, name); - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, errorMessage); - } else { - // Check variable type - ScalarVariable* sv = fmuStruct.vars[fmuStruct.indexes[name]]; - switch (sv->typeSpec->type){ - case elm_Boolean: - break; // ok - default: { - string errorMessage = "setBooleanValue: " + nameString + " is not of type Boolean. (type: + " + getTypeString(sv) + ")"; - env->ReleaseStringUTFChars(parameter, name); - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, errorMessage); - } - } + (JNIEnv *env, jobject obj, jint id, jint vr, jboolean value) { - // Change value - fmiValueReference vr = getReference(fmuStruct, name); - fmiBoolean result = 1; - if(value == 0) - result = 0; - fmuStruct.fmu.setBoolean(fmuStruct.c, &vr, 1, &result); - env->ReleaseStringUTFChars(parameter, name); - env->ReleaseStringUTFChars(id, fmuId); - return 1; - } - } else { - string message = fmuId; - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, "setBooleanValue: Model id " + message + " not found"); - }*/ - return 1; + const char *error = ""; + FMI1 fmi = fmus[id]; + if (fmi.version == 1) { + FMI1_CS_SET_BOOLEAN(fmi.fmu, vr, value != 0, &error); + } + else if (fmi.version == 2) { + FMI2_CS_SET_BOOLEAN(fmi.fmu, vr, value != 0, &error); + } + if (!isEmpty(error)) { + string message = "Could not set boolean value: "; + return throwFMILException(env, message += error); + } + return 0; +} + +JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_setStringValue_1 +(JNIEnv *env, jobject obj, jint id, jint vr, jstring value) { + + const char *error = ""; + const char *valueChars = env->GetStringUTFChars(value, 0); + FMI1 fmi = fmus[id]; + if (fmi.version == 1) { + FMI1_CS_SET_INTEGER(fmi.fmu, vr, value != 0, &error); + } + else if (fmi.version == 2) { + FMI2_CS_SET_INTEGER(fmi.fmu, vr, value != 0, &error); + } + env->ReleaseStringUTFChars(value, valueChars); + if (!isEmpty(error)) { + string message = "Could not set string value: "; + return throwFMILException(env, message += error); + } + return 0; } JNIEXPORT jboolean JNICALL Java_org_simantics_fmil_core_FMIL_isInitialized_1 @@ -525,7 +491,7 @@ JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_setTime_1 JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllVariables_1 (JNIEnv *env, jobject obj, jint id) { - jobjectArray ret= (jobjectArray)env->NewObjectArray(fmus[id].variables.size(), + jobjectArray ret= (jobjectArray)env->NewObjectArray((jsize)fmus[id].variables.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); @@ -540,7 +506,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllVariables JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllVariableDescriptions_1 (JNIEnv *env, jobject obj, jint id) { - jobjectArray ret= (jobjectArray)env->NewObjectArray(fmus[id].descriptions.size(), + jobjectArray ret= (jobjectArray)env->NewObjectArray((jsize)fmus[id].descriptions.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); @@ -555,7 +521,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllVariableD JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllVariableDeclaredTypes_1 (JNIEnv *env, jobject obj, jint id) { - jobjectArray ret= (jobjectArray)env->NewObjectArray(fmus[id].declaredTypes.size(), + jobjectArray ret= (jobjectArray)env->NewObjectArray((jsize)fmus[id].declaredTypes.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); @@ -648,7 +614,7 @@ JNIEXPORT jintArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllVariableCaus JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllDeclaredTypes_1 (JNIEnv *env, jobject obj, jint id) { - jobjectArray ret= (jobjectArray)env->NewObjectArray(fmus[id].declaredTypeNames.size(), + jobjectArray ret= (jobjectArray)env->NewObjectArray((jsize)fmus[id].declaredTypeNames.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); @@ -663,7 +629,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllDeclaredT JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllDeclaredTypeDescriptions_1 (JNIEnv *env, jobject obj, jint id) { - jobjectArray ret= (jobjectArray)env->NewObjectArray(fmus[id].typeDescriptions.size(), + jobjectArray ret= (jobjectArray)env->NewObjectArray((jsize)fmus[id].typeDescriptions.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); @@ -678,7 +644,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllDeclaredT JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllDeclaredTypeQuantities_1 (JNIEnv *env, jobject obj, jint id) { - jobjectArray ret= (jobjectArray)env->NewObjectArray(fmus[id].quantities.size(), + jobjectArray ret= (jobjectArray)env->NewObjectArray((jsize)fmus[id].quantities.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); @@ -693,7 +659,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllDeclaredT JNIEXPORT jobjectArray JNICALL Java_org_simantics_fmil_core_FMIL_getAllDeclaredTypeUnits_1 (JNIEnv *env, jobject obj, jint id) { - jobjectArray ret= (jobjectArray)env->NewObjectArray(fmus[id].units.size(), + jobjectArray ret= (jobjectArray)env->NewObjectArray((jsize)fmus[id].units.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); @@ -882,105 +848,73 @@ JNIEXPORT jdouble JNICALL Java_org_simantics_fmil_core_FMIL_getRealValue_1 } if (!isEmpty(error)) { string message = "Could not get real value: "; - return throwFMILException(env, message += error); + throwFMILException(env, message += error); + return 0.0; } return value; } JNIEXPORT jint JNICALL Java_org_simantics_fmil_core_FMIL_getIntegerValue_1 - (JNIEnv *env, jobject obj, jstring id, jstring variable) { - /* - const char *fmuId = env->GetStringUTFChars(id, 0); - if(exists(fmuId)) { - FMUControlStruct fmuStruct = fmus[fmuId]; - env->ReleaseStringUTFChars(id, fmuId); - const char *name = env->GetStringUTFChars(variable, 0); - - if(referenceExists(fmuStruct, name)) { - fmiValueReference vr = getReference(fmuStruct, name); - int result; - fmuStruct.fmu.getInteger(fmuStruct.c, &vr, 1, &result); - env->ReleaseStringUTFChars(variable, name); - return result; - - } else { - string nameString = name; - string message = "Variable " + nameString + " not found"; - env->ReleaseStringUTFChars(variable, name); - return throwException(env, message); - } + (JNIEnv *env, jobject obj, jint id, jint vr) { - } else { - string message = fmuId; - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, "unloadFMU: Model id " + message + " not found"); - } - */ - return 1; + int value; + const char *error = ""; + FMI1 fmi = fmus[id]; + if (fmi.version == 1) { + value = FMI1_CS_GET_INTEGER(fmi.fmu, vr, &error); + } + else if (fmi.version == 2) { + value = FMI2_CS_GET_INTEGER(fmi.fmu, vr, &error); + } + if (!isEmpty(error)) { + string message = "Could not get integer value: "; + throwFMILException(env, message += error); + return 0; + } + return value; } JNIEXPORT jboolean JNICALL Java_org_simantics_fmil_core_FMIL_getBooleanValue_1 - (JNIEnv *env, jobject obj, jstring id, jstring variable) { - /* - const char *fmuId = env->GetStringUTFChars(id, 0); - if(exists(fmuId)) { - FMUControlStruct fmuStruct = fmus[fmuId]; - env->ReleaseStringUTFChars(id, fmuId); - const char *name = env->GetStringUTFChars(variable, 0); - - if(referenceExists(fmuStruct, name)) { - fmiValueReference vr = getReference(fmuStruct, name); - fmiBoolean result; - fmuStruct.fmu.getBoolean(fmuStruct.c, &vr, 1, &result); - env->ReleaseStringUTFChars(variable, name); - return result; - - } else { - string nameString = name; - string message = "Variable " + nameString + " not found"; - env->ReleaseStringUTFChars(variable, name); - return throwException(env, message); - } + (JNIEnv *env, jobject obj, jint id, jint vr) { - } else { - string message = fmuId; - env->ReleaseStringUTFChars(id, fmuId); - return throwException(env, "unloadFMU: Model id " + message + " not found"); - }*/ - return 1; + int value; + const char *error = ""; + + FMI1 fmi = fmus[id]; + if (fmi.version == 1) { + value = FMI1_CS_GET_BOOLEAN(fmi.fmu, vr, &error); + } + else if (fmi.version == 2) { + value = FMI2_CS_GET_BOOLEAN(fmi.fmu, vr, &error); + } + if (!isEmpty(error)) { + string message = "Could not get boolean value: "; + throwFMILException(env, message += error); + return 0; + } + return value != 0; } JNIEXPORT jstring JNICALL Java_org_simantics_fmil_core_FMIL_getStringValue_1 - (JNIEnv *env, jobject obj, jstring id, jstring variable) { - /* - const char *fmuId = env->GetStringUTFChars(id, 0); - if(exists(fmuId)) { - FMUControlStruct fmuStruct = fmus[fmuId]; - env->ReleaseStringUTFChars(id, fmuId); - const char *name = env->GetStringUTFChars(variable, 0); - - if(referenceExists(fmuStruct, name)) { - fmiValueReference vr = getReference(fmuStruct, name); - fmiString result; - fmuStruct.fmu.getString(fmuStruct.c, &vr, 1, &result); - env->ReleaseStringUTFChars(variable, name); - return env->NewStringUTF(result); - - } else { - string nameString = name; - string message = "Variable " + nameString + " not found"; - env->ReleaseStringUTFChars(variable, name); - return 0; //throwException(env, message); - } + (JNIEnv *env, jobject obj, jint id, jint vr) { - } else { - string message = fmuId; - env->ReleaseStringUTFChars(id, fmuId); - return 0; //throwException(env, "unloadFMU: Model id " + message + " not found"); + const char *value; + const char *error = ""; + + FMI1 fmi = fmus[id]; + if (fmi.version == 1) { + value = FMI1_CS_GET_STRING(fmi.fmu, vr, &error); + } + else if (fmi.version == 2) { + value = FMI2_CS_GET_STRING(fmi.fmu, vr, &error); + } + if (!isEmpty(error)) { + string message = "Could not get string value: "; + throwFMILException(env, message += error); + return nullptr; } - */ - return 0; + return env->NewStringUTF(value); }