diff --git a/.gitignore b/.gitignore index 549e00a..1d6e8b5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ build/ ### VS Code ### .vscode/ +/src/main/java/com/iflytop/digester/camera/x64/Debug/ +/src/main/java/com/iflytop/digester/camera/DiComBaslerCamera$GrabResult.class +/src/main/java/com/iflytop/digester/camera/DiComBaslerCamera.class diff --git a/app.db b/app.db index 42a74f4..5254919 100644 Binary files a/app.db and b/app.db differ diff --git a/src/main/java/com/iflytop/digester/DigesterApplicationRunner.java b/src/main/java/com/iflytop/digester/DigesterApplicationRunner.java index d7b0b6d..b2e4efc 100644 --- a/src/main/java/com/iflytop/digester/DigesterApplicationRunner.java +++ b/src/main/java/com/iflytop/digester/DigesterApplicationRunner.java @@ -1,6 +1,7 @@ package com.iflytop.digester; import com.iflytop.digester.deviceinstance.Device; import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; @@ -10,9 +11,18 @@ import org.springframework.stereotype.Component; public class DigesterApplicationRunner implements ApplicationRunner { @Resource private Device device; + @Value("${app.opencv-library-path}") + private String opencvLibraryPath; + @Value("${app.pylon-library-path}") + private String pylonLibraryPath; + @Value("${app.pylon-wrapper-path}") + private String pylonWrapperPath; @Override public void run(ApplicationArguments args) throws Exception { + System.load(this.opencvLibraryPath); + System.load(this.pylonLibraryPath); + System.load(this.pylonWrapperPath); this.device.liquidAddition.setup(); } } diff --git a/src/main/java/com/iflytop/digester/StartResetTaskThread.java b/src/main/java/com/iflytop/digester/StartResetTaskThread.java index a64fb35..d0ad3ec 100644 --- a/src/main/java/com/iflytop/digester/StartResetTaskThread.java +++ b/src/main/java/com/iflytop/digester/StartResetTaskThread.java @@ -23,13 +23,13 @@ public class StartResetTaskThread extends Thread { var device = Device.getInstance(); device.setStatus("preparing"); this.setProgressMessage("设备初始化..."); - - UfCmdSnippetExecutor.execute("StartResetInitDevices"); - this.setupHeatingSlotCover(); - this.setupPeristalticPump(); - if ( this.isErrorTubeRackRequired ) { - this.setupErrorTubeRack(); - } +// +// UfCmdSnippetExecutor.execute("StartResetInitDevices"); +// this.setupHeatingSlotCover(); +// this.setupPeristalticPump(); +// if ( this.isErrorTubeRackRequired ) { +// this.setupErrorTubeRack(); +// } this.setProgressMessage("设备初始化 : 相机"); device.camera.enable(); diff --git a/src/main/java/com/iflytop/digester/camera/.vs/ProjectSettings.json b/src/main/java/com/iflytop/digester/camera/.vs/ProjectSettings.json new file mode 100644 index 0000000..c6370fb --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": "\u65E0\u914D\u7F6E" +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/digester/camera/.vs/VSWorkspaceState.json b/src/main/java/com/iflytop/digester/camera/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..6b61141 --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/003a4049-43a8-4685-b725-0ef981a63d09.vsidx b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/003a4049-43a8-4685-b725-0ef981a63d09.vsidx new file mode 100644 index 0000000..19e6464 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/003a4049-43a8-4685-b725-0ef981a63d09.vsidx differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/06d79a3a-d78d-4a3e-bc83-a1d7e7c40658.vsidx b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/06d79a3a-d78d-4a3e-bc83-a1d7e7c40658.vsidx new file mode 100644 index 0000000..69227b0 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/06d79a3a-d78d-4a3e-bc83-a1d7e7c40658.vsidx differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/0c5d8c00-190b-4149-adea-d196cfb732c1.vsidx b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/0c5d8c00-190b-4149-adea-d196cfb732c1.vsidx new file mode 100644 index 0000000..2c73cc0 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/0c5d8c00-190b-4149-adea-d196cfb732c1.vsidx differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/1da9abc1-3b74-4d08-9644-e46adbdc5f76.vsidx b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/1da9abc1-3b74-4d08-9644-e46adbdc5f76.vsidx new file mode 100644 index 0000000..bfaa108 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/1da9abc1-3b74-4d08-9644-e46adbdc5f76.vsidx differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/e337247d-2ede-4c8b-8f3c-9dbe3ec766a2.vsidx b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/e337247d-2ede-4c8b-8f3c-9dbe3ec766a2.vsidx new file mode 100644 index 0000000..24e1b10 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/FileContentIndex/e337247d-2ede-4c8b-8f3c-9dbe3ec766a2.vsidx differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/.suo b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/.suo new file mode 100644 index 0000000..d03924f Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/.suo differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/.wsuo b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/.wsuo new file mode 100644 index 0000000..2d87ed7 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/.wsuo differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/Browse.VC.db b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/Browse.VC.db new file mode 100644 index 0000000..a7cd360 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/Browse.VC.db differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/Solution.VC.db b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/Solution.VC.db new file mode 100644 index 0000000..58efbfe Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/Solution.VC.db differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/1c2e8b4ea4fc1ccf/DICOMBASLERCAMERA.ipch b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/1c2e8b4ea4fc1ccf/DICOMBASLERCAMERA.ipch new file mode 100644 index 0000000..1a71b6d Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/1c2e8b4ea4fc1ccf/DICOMBASLERCAMERA.ipch differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/9d6442ba4cb0f3c/DICOMBASLERCAMERA.ipch b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/9d6442ba4cb0f3c/DICOMBASLERCAMERA.ipch new file mode 100644 index 0000000..a7411c6 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/9d6442ba4cb0f3c/DICOMBASLERCAMERA.ipch differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/a8dcffdc33001a67/DICOMBASLERCAMERA.ipch b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/a8dcffdc33001a67/DICOMBASLERCAMERA.ipch new file mode 100644 index 0000000..f931479 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/a8dcffdc33001a67/DICOMBASLERCAMERA.ipch differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/c9f5a327283e5cbb/DICOMBASLERCAMERA.ipch b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/c9f5a327283e5cbb/DICOMBASLERCAMERA.ipch new file mode 100644 index 0000000..27eac36 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/c9f5a327283e5cbb/DICOMBASLERCAMERA.ipch differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/f2cc47adfa9ba2d3/LOGGER.ipch b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/f2cc47adfa9ba2d3/LOGGER.ipch new file mode 100644 index 0000000..2a6241c Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/baslerCamera/v17/ipch/AutoPCH/f2cc47adfa9ba2d3/LOGGER.ipch differ diff --git a/src/main/java/com/iflytop/digester/camera/.vs/slnx.sqlite b/src/main/java/com/iflytop/digester/camera/.vs/slnx.sqlite new file mode 100644 index 0000000..3b8ba28 Binary files /dev/null and b/src/main/java/com/iflytop/digester/camera/.vs/slnx.sqlite differ diff --git a/src/main/java/com/iflytop/digester/camera/DiComBaslerCamera.cpp b/src/main/java/com/iflytop/digester/camera/DiComBaslerCamera.cpp new file mode 100644 index 0000000..2ef7b04 --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/DiComBaslerCamera.cpp @@ -0,0 +1,340 @@ +#include +#include +#include +#include +#include "com_iflytop_digester_camera_DiComBaslerCamera.h" + +#define CAMERA(methodName) Java_com_iflytop_digester_camera_DiComBaslerCamera_##methodName + +/** + * throw exception to java + */ +void throwException(JNIEnv * env, const char* message) { + jclass exceptionClass = env->FindClass("java/lang/Exception"); + if (exceptionClass != nullptr) { + env->ThrowNew(exceptionClass, message); + } +} + +/** + * throw exception to java by error code + */ +void throwExceptionByErrorCode(JNIEnv* env, GENAPIC_RESULT ret) { + char msg[128]; + sprintf_s(msg, "error : %ld", ret); + throwException(env, msg); +} + +/** + * initialize + */ +JNIEXPORT void JNICALL CAMERA(initialize) (JNIEnv* env, jobject) { + PylonInitialize(); +} + +/** + * enumerateDevices + */ +JNIEXPORT jint JNICALL CAMERA(enumerateDevices) (JNIEnv* env, jobject) { + size_t numDevices = 0; + GENAPIC_RESULT ret = PylonEnumerateDevices(&numDevices); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return -1; + } + return (jint)numDevices; +} + +/** + * terminate + */ +JNIEXPORT void JNICALL CAMERA(terminate)(JNIEnv*, jobject) { + PylonTerminate(); +} + +/** + * createDeviceByIndex + */ +JNIEXPORT jlong JNICALL CAMERA(createDeviceByIndex) (JNIEnv * env, jobject, jint index) { + /* Get a handle for the first device found. */ + PYLON_DEVICE_HANDLE * hDev = (PYLON_DEVICE_HANDLE*)malloc(sizeof(PYLON_DEVICE_HANDLE)); + GENAPIC_RESULT ret = PylonCreateDeviceByIndex(0, hDev); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return -1; + } + return reinterpret_cast(hDev); +} + +/** + * createDeviceByIndex + */ +JNIEXPORT void JNICALL CAMERA(deviceOpen) (JNIEnv* env, jobject, jlong hDevAddr, jint accessMode) { + PYLON_DEVICE_HANDLE * hDev = reinterpret_cast(hDevAddr); + GENAPIC_RESULT ret = PylonDeviceOpen(*hDev, accessMode); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return ; + } +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceFeatureIsReadable + * Signature: (JLjava/lang/String;)I + */ +JNIEXPORT jboolean JNICALL CAMERA(deviceFeatureIsReadable) (JNIEnv* env, jobject , jlong hDevAddr, jstring name) { + PYLON_DEVICE_HANDLE * hDev = reinterpret_cast(hDevAddr); + const char* fName = env->GetStringUTFChars(name, NULL); + if (NULL == fName) { + throwException(env, "get string value from jstring failed."); + return JNI_FALSE; + } + + bool isReadable = PylonDeviceFeatureIsReadable(*hDev, fName); + env->ReleaseStringUTFChars(name, fName); + return isReadable ? JNI_TRUE : JNI_FALSE; +} + + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceFeatureToString + * Signature: (JLjava/lang/String;I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL CAMERA(deviceFeatureToString) (JNIEnv* env, jobject, jlong hDevAddr, jstring name, jint size) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + const char* fName = env->GetStringUTFChars(name, NULL); + if (NULL == fName) { + throwException(env, "get string value from jstring failed."); + return nullptr; + } + + char * buf = (char *)malloc(size); + size_t bufSize = size; + + GENAPIC_RESULT ret = PylonDeviceFeatureToString(*hDev, fName, buf, &bufSize); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return nullptr; + } + env->ReleaseStringUTFChars(name, fName); + jstring value = env->NewStringUTF(buf); + free(buf); + return value; +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceFeatureIsAvailable + * Signature: (JLjava/lang/String;)I + */ +JNIEXPORT jboolean JNICALL CAMERA(deviceFeatureIsAvailable) (JNIEnv* env, jobject, jlong hDevAddr, jstring name) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + const char* fName = env->GetStringUTFChars(name, NULL); + if (NULL == fName) { + throwException(env, "get string value from jstring failed."); + return JNI_FALSE; + } + + bool isAvail = PylonDeviceFeatureIsAvailable(*hDev, "EnumEntry_PixelFormat_Mono8"); + env->ReleaseStringUTFChars(name, fName); + return isAvail; +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceFeatureFromString + * Signature: (JLjava/lang/String;Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL CAMERA(deviceFeatureFromString)(JNIEnv* env, jobject, jlong hDevAddr, jstring name, jstring value ) { + PYLON_DEVICE_HANDLE * hDev = reinterpret_cast(hDevAddr); + const char* fName = env->GetStringUTFChars(name, NULL); + if (NULL == fName) { + throwException(env, "get string value from jstring failed."); + return; + } + const char* fValue = env->GetStringUTFChars(value, NULL); + if (NULL == fValue) { + throwException(env, "get string value from jstring failed."); + return; + } + + GENAPIC_RESULT ret = PylonDeviceFeatureFromString(*hDev, fName, fValue); + env->ReleaseStringUTFChars(name, fName); + env->ReleaseStringUTFChars(value, fValue); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return; + } +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceFeatureIsWritable + * Signature: (JLjava/lang/String;)I + */ +JNIEXPORT jboolean JNICALL CAMERA(deviceFeatureIsWritable) (JNIEnv* env, jobject, jlong hDevAddr, jstring name) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + const char* fName = env->GetStringUTFChars(name, NULL); + if (NULL == fName) { + throwException(env, "get string value from jstring failed."); + return JNI_FALSE; + } + + bool isAvail = PylonDeviceFeatureIsWritable(*hDev, fName); + env->ReleaseStringUTFChars(name, fName); + return isAvail ? JNI_TRUE : JNI_FALSE; +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceSetIntegerFeature + * Signature: (JLjava/lang/String;I)V + */ +JNIEXPORT void JNICALL CAMERA(deviceSetIntegerFeature) (JNIEnv* env, jobject, jlong hDevAddr, jstring name, jint value) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + const char* fName = env->GetStringUTFChars(name, NULL); + if (NULL == fName) { + throwException(env, "get string value from jstring failed."); + return; + } + + GENAPIC_RESULT ret = PylonDeviceSetIntegerFeature(*hDev, fName, value); + env->ReleaseStringUTFChars(name, fName); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return; + } +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceGetIntegerFeatureInt32 + * Signature: (JLjava/lang/String;)I + */ +JNIEXPORT jint JNICALL CAMERA(deviceGetIntegerFeatureInt32) (JNIEnv* env, jobject , jlong hDevAddr, jstring name) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + const char* fName = env->GetStringUTFChars(name, NULL); + if (NULL == fName) { + throwException(env, "get string value from jstring failed."); + return -1; + } + int32_t value; + + GENAPIC_RESULT ret = PylonDeviceGetIntegerFeatureInt32(*hDev, fName, &value); + env->ReleaseStringUTFChars(name, fName); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return -1; + } + return value; +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceGrabSingleFrame + * Signature: (JI)[B + */ +JNIEXPORT jobject JNICALL CAMERA(deviceGrabSingleFrame)(JNIEnv* env, jobject, jlong hDevAddr, jint channel) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + + int32_t payloadSize = 0; + GENAPIC_RESULT ret = PylonDeviceGetIntegerFeatureInt32(*hDev, "PayloadSize", &payloadSize); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return nullptr; + } + + jclass javaGrabResultClass = env->FindClass("com/my/graphiteDigesterBg/diframe/component/baslerCamera/DiComBaslerCamera$GrabResult"); + if (javaGrabResultClass == NULL) { + throwException(env, "unable to find java grab result class"); + return NULL; + } + + jmethodID javaGrabResultConstructor = env->GetMethodID(javaGrabResultClass, "", "()V"); + if (javaGrabResultConstructor == NULL) { + throwException(env, "unable to find java grab result class constructor method"); + return NULL; + } + + jobject javaGrabResult = env->NewObject(javaGrabResultClass, javaGrabResultConstructor); + if (javaGrabResult == NULL) { + throwException(env, "failed to create java grab result object"); + return NULL; + } + + unsigned char* imgBuf; + imgBuf = (unsigned char*)malloc(payloadSize); + if (NULL == imgBuf ) { + throwException(env, "failed to alloc memory for grabbing"); + return NULL; + } + + PylonGrabResult_t grabResult; + _Bool bufferReady; + ret = PylonDeviceGrabSingleFrame(*hDev, channel, imgBuf, payloadSize, &grabResult, &bufferReady, 500); + if (GENAPI_E_OK == ret && !bufferReady) { + free(imgBuf); + throwException(env, "failed to grab frame : timeout"); + return NULL; + } + if (GENAPI_E_OK != ret) { + free(imgBuf); + throwExceptionByErrorCode(env, ret); + return NULL; + } + if (grabResult.Status == Failed) { + free(imgBuf); + throwException(env, "failed to grab grame"); + return NULL; + } + + jfieldID sizeXFieldID = env->GetFieldID(javaGrabResultClass, "sizeX", "I"); + if (sizeXFieldID != NULL) { + env->SetIntField(javaGrabResult, sizeXFieldID, grabResult.SizeX); + } + + jfieldID sizeYFieldId = env->GetFieldID(javaGrabResultClass, "sizeY", "I"); + if (sizeYFieldId != NULL) { + env->SetIntField(javaGrabResult, sizeYFieldId, grabResult.SizeY); + } + + jfieldID imageBufferFieldId = env->GetFieldID(javaGrabResultClass, "imageBuffer", "[B"); + if (NULL != imageBufferFieldId) { + jbyteArray jImageBuffer = env->NewByteArray(payloadSize); + env->SetByteArrayRegion(jImageBuffer, 0, payloadSize, reinterpret_cast(imgBuf)); + env->SetObjectField(javaGrabResult, imageBufferFieldId, jImageBuffer); + } + + free(imgBuf); + return javaGrabResult; +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: deviceClose + * Signature: (J)V + */ +JNIEXPORT void JNICALL CAMERA(deviceClose)(JNIEnv* env, jobject, jlong hDevAddr) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + GENAPIC_RESULT ret = PylonDeviceClose(*hDev); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return; + } +} + +/* + * Class: com_my_graphiteDigesterBg_diframe_component_baslerCamera_DiComBaslerCamera + * Method: destroyDevice + * Signature: (J)V + */ +JNIEXPORT void JNICALL CAMERA(destroyDevice)(JNIEnv* env, jobject, jlong hDevAddr) { + PYLON_DEVICE_HANDLE* hDev = reinterpret_cast(hDevAddr); + GENAPIC_RESULT ret = PylonDeviceClose(*hDev); + if (GENAPI_E_OK != ret) { + throwExceptionByErrorCode(env, ret); + return; + } +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/digester/camera/baslerCamera.sln b/src/main/java/com/iflytop/digester/camera/baslerCamera.sln new file mode 100644 index 0000000..f0c8844 --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/baslerCamera.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34330.188 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "baslerCamera", "baslerCamera.vcxproj", "{579EA782-ABF5-40DA-97B5-12E77CDBE26D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Debug|x64.ActiveCfg = Debug|x64 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Debug|x64.Build.0 = Debug|x64 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Debug|x86.ActiveCfg = Debug|Win32 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Debug|x86.Build.0 = Debug|Win32 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Release|x64.ActiveCfg = Release|x64 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Release|x64.Build.0 = Release|x64 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Release|x86.ActiveCfg = Release|Win32 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6EC7ECB7-DEAA-46D7-BDA3-506DF51E4859} + EndGlobalSection +EndGlobal diff --git a/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj b/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj new file mode 100644 index 0000000..9338c87 --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj @@ -0,0 +1,133 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + {579EA782-ABF5-40DA-97B5-12E77CDBE26D} + Win32Proj + + + + DynamicLibrary + true + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + true + v143 + + + DynamicLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + true + + + true + D:\ProgramFiles\Pylon5\Development\include;D:\ProgramFiles\JDK\18\include\win32;D:\ProgramFiles\JDK\18\include;$(ExternalIncludePath) + + + true + + + true + + + + WIN32;_DEBUG;_WINDOWS;_USRDLL;BASLERCAMERA_EXPORTS;%(PreprocessorDefinitions) + Level3 + + + true + Windows + + + + + _DEBUG;_WINDOWS;_USRDLL;BASLERCAMERA_EXPORTS;%(PreprocessorDefinitions) + Level3 + + + true + Windows + PylonC.lib;%(AdditionalDependencies) + D:\ProgramFiles\Pylon5\Development\lib\x64;%(AdditionalLibraryDirectories) + + + + + WIN32;NDEBUG;_WINDOWS;_USRDLL;BASLERCAMERA_EXPORTS;%(PreprocessorDefinitions) + Level3 + + + true + Windows + true + true + + + + + NDEBUG;_WINDOWS;_USRDLL;BASLERCAMERA_EXPORTS;%(PreprocessorDefinitions) + Level3 + + + true + Windows + true + true + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj.filters b/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj.filters new file mode 100644 index 0000000..92befa8 --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj.user b/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/baslerCamera.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/main/java/com/iflytop/digester/camera/build.sh b/src/main/java/com/iflytop/digester/camera/build.sh new file mode 100644 index 0000000..dabd7d9 --- /dev/null +++ b/src/main/java/com/iflytop/digester/camera/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash +g++ -Wl,--gc-sections -std=c++11 -shared -fPIC -lstdc++ \ + -o libalgo.so \ + DiComBaslerCamera.cpp \ + -I/app-java/jdk-18.0.2.1/include \ + -I/app-java/jdk-18.0.2.1/include/linux \ No newline at end of file diff --git a/src/main/java/com/iflytop/digester/deviceinstance/Camera.java b/src/main/java/com/iflytop/digester/deviceinstance/Camera.java index fb68da7..1db1d19 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/Camera.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/Camera.java @@ -8,9 +8,9 @@ public class Camera { // camera private static DiComBaslerCamera pylon = null; // index - protected Integer index; + protected Integer index = 0; // channel - protected Integer channel; + protected Integer channel = 0; // camera handle private long cam = -1; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4447f9d --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,39 @@ +server : + port : 80 + +spring: + datasource: + url: jdbc:sqlite:D:/Sige5193/digester/app.db + username: 1 + password: 1 + driver-class-name: org.sqlite.JDBC + +device: + snippet-execute-log-enable : false + connections: + - name : zcancmder + key : zcancmder + enable : true + type : ZcancmderWebsocket + uri: ws://192.168.8.10:19005 + - name : modbus + key : modbus + enable : false + type : ModbusRTUOverTCP + host: 127.0.0.1 + port: 502 + +mqtt-broker: + uri: tcp://broker.emqx.io:1883 + username: admin + password: public + clientId: digester + my-topic : "stw-a80" + transbot-topic : "transbot" + +app : + errorSlotIndex : 4 + liquidPeristalticPumpPipeSetupEnable : true + opencv-library-path: D:/ProgramFiles/OpenCV/opencv/build/java/x64/opencv_java490.dll + pylon-library-path: D:/ProgramFiles/Pylon5/Runtime/x64/PylonC_v5_2.dll + pylon-wrapper-path: D:/Sige5193/digester/src/main/java/com/iflytop/digester/camera/x64/Debug/baslerCamera.dll diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml new file mode 100644 index 0000000..80fcfcc --- /dev/null +++ b/src/main/resources/application-test.yml @@ -0,0 +1,39 @@ +server : + port : 80 + +spring: + datasource: + url: jdbc:sqlite:D:/Sige5193/digester/app.db + username: 1 + password: 1 + driver-class-name: org.sqlite.JDBC + +device: + snippet-execute-log-enable : false + connections: + - name : zcancmder + key : zcancmder + enable : true + type : ZcancmderWebsocket + uri: ws://192.168.8.10:19005 + - name : modbus + key : modbus + enable : false + type : ModbusRTUOverTCP + host: 127.0.0.1 + port: 502 + +mqtt-broker: + uri: tcp://broker.emqx.io:1883 + username: admin + password: public + clientId: digester + my-topic : "stw-a80" + transbot-topic : "transbot" + +app : + errorSlotIndex : 4 + liquidPeristalticPumpPipeSetupEnable : true + opencv-library-path: /userdata/rootfs_overlay/usr/lib/jni/libopencv_java420.so + pylon-library-path: /opt/pylon/lib/libpylonc.so.7.2 + pylon-wrapper-path: /app/basler-camera-java-wrapper/libpylonc-wrapper.so \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d9dfb2b..caf4dfc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,36 +1,3 @@ -server : - port : 80 - spring: - datasource: - url: jdbc:sqlite:D:/Sige5193/digester/app.db - username: 1 - password: 1 - driver-class-name: org.sqlite.JDBC - -device: - snippet-execute-log-enable : false - connections: - - name : zcancmder - key : zcancmder - enable : true - type : ZcancmderWebsocket - uri: ws://192.168.8.10:19005 - - name : modbus - key : modbus - enable : false - type : ModbusRTUOverTCP - host: 127.0.0.1 - port: 502 - -mqtt-broker: - uri: tcp://broker.emqx.io:1883 - username: admin - password: public - clientId: digester - my-topic : "stw-a80" - transbot-topic : "transbot" - -app : - errorSlotIndex : 4 - liquidPeristalticPumpPipeSetupEnable : true \ No newline at end of file + profiles: + active: dev \ No newline at end of file