Compare commits
55 Commits
72e2789d50
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 668a477289 | |||
| 8f85e3fccd | |||
| f7c74304f5 | |||
| d566e4bc4f | |||
| 49ac4353b3 | |||
| 3539fb7d65 | |||
| e4d2bfa00e | |||
| 0728ae3ca2 | |||
| 957d642f5d | |||
| 3d02641479 | |||
| d0fe8123e9 | |||
| 9e69714ae1 | |||
| 9effe8a7a9 | |||
|
|
1fcd905b07 | ||
|
|
ee0a82aa32 | ||
|
|
d1a6dd9f98 | ||
|
|
e47e1252fb | ||
|
|
ef94f87d8a | ||
| 5f2093a572 | |||
| 2dfd149990 | |||
|
|
4e3381edc4 | ||
|
|
1d617a0559 | ||
| bc6821a33e | |||
|
|
d2e7d1155d | ||
|
|
52360dde5f | ||
|
|
02a213f17b | ||
| 2cf206b306 | |||
| 257eb50640 | |||
| ca3fa0ed08 | |||
| fb5d143cd1 | |||
|
|
67af6fe4c0 | ||
|
|
93b1079747 | ||
|
|
b6a3076993 | ||
| 7f83808d2b | |||
| 189e9e530d | |||
|
|
7cdefa6f1d | ||
|
|
e72d25a213 | ||
|
|
6f3080293f | ||
|
|
fc5bc8ada8 | ||
| 532979807b | |||
| 4535fe0aec | |||
| 71ecbe0c3e | |||
|
|
2da4c3621e | ||
|
|
fbb68b4da7 | ||
|
|
58194d8979 | ||
| 093c32058c | |||
| 80d468a79a | |||
| b248c59e32 | |||
| 64f5b619b7 | |||
| 00f9852fa8 | |||
| 30ef123832 | |||
| 29884c03ed | |||
| a60fe56510 | |||
| f80662a453 | |||
| 30660b9afb |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -2,6 +2,9 @@ target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
logs/
|
||||
out/
|
||||
hs_err*.log
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
|
||||
90
.idea/artifacts/ErhaCam_jar.xml
generated
90
.idea/artifacts/ErhaCam_jar.xml
generated
@@ -3,63 +3,51 @@
|
||||
<output-path>$PROJECT_DIR$/out/artifacts/ErhaCam_jar</output-path>
|
||||
<root id="archive" name="ErhaCam.jar">
|
||||
<element id="module-output" name="ErhaCam" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-fxml/21/javafx-fxml-21-win.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/xerial/sqlite-jdbc/3.46.0.0/sqlite-jdbc-3.46.0.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/11.2.1/controlsfx-11.2.1.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-base/21/javafx-base-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/javacv-platform/1.5.10/javacv-platform-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/javacv/1.5.10/javacv-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/javacpp/1.5.10/javacpp-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/openblas/0.3.26-1.5.10/openblas-0.3.26-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/opencv/4.9.0-1.5.10/opencv-4.9.0-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/ffmpeg/6.1.1-1.5.10/ffmpeg-6.1.1-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/flycapture/2.13.3.31-1.5.9/flycapture-2.13.3.31-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libdc1394/2.2.6-1.5.9/libdc1394-2.2.6-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libfreenect/0.5.7-1.5.9/libfreenect-0.5.7-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libfreenect2/0.2.0-1.5.9/libfreenect2-0.2.0-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/librealsense/1.12.4-1.5.9/librealsense-1.12.4-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/librealsense2/2.53.1-1.5.9/librealsense2-2.53.1-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/videoinput/0.200-1.5.9/videoinput-0.200-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/artoolkitplus/2.3.1-1.5.9/artoolkitplus-2.3.1-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/leptonica/1.84.1-1.5.10/leptonica-1.84.1-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/tesseract/5.3.4-1.5.10/tesseract-5.3.4-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/javacpp-platform/1.5.10/javacpp-platform-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/javacpp/1.5.10/javacpp-1.5.10-windows-x86_64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/openblas-platform/0.3.26-1.5.10/openblas-platform-0.3.26-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/opencv-platform/4.9.0-1.5.10/opencv-platform-4.9.0-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/opencv/4.9.0-1.5.10/opencv-4.9.0-1.5.10-windows-x86_64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/ffmpeg-platform/6.1.1-1.5.10/ffmpeg-platform-6.1.1-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/flycapture-platform/2.13.3.31-1.5.9/flycapture-platform-2.13.3.31-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libdc1394-platform/2.2.6-1.5.9/libdc1394-platform-2.2.6-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libfreenect-platform/0.5.7-1.5.9/libfreenect-platform-0.5.7-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libfreenect2-platform/0.2.0-1.5.9/libfreenect2-platform-0.2.0-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/librealsense-platform/1.12.4-1.5.9/librealsense-platform-1.12.4-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/librealsense2-platform/2.53.1-1.5.9/librealsense2-platform-2.53.1-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/videoinput-platform/0.200-1.5.9/videoinput-platform-0.200-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/videoinput/0.200-1.5.9/videoinput-0.200-1.5.9-windows-x86_64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/artoolkitplus-platform/2.3.1-1.5.9/artoolkitplus-platform-2.3.1-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/leptonica-platform/1.84.1-1.5.10/leptonica-platform-1.84.1-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/tesseract-platform/5.3.4-1.5.10/tesseract-platform-5.3.4-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/commons-net/commons-net/3.11.1/commons-net-3.11.1.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/zxing/javase/3.5.3/javase-3.5.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/zxing/core/3.5.3/core-3.5.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/beust/jcommander/1.82/jcommander-1.82.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/github/jai-imageio/jai-imageio-core/1.4.0/jai-imageio-core-1.4.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/tinylog/tinylog-impl/2.7.0/tinylog-impl-2.7.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/tinylog/tinylog-api/2.7.0/tinylog-api-2.7.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-controls/21/javafx-controls-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-fxml/21/javafx-fxml-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-graphics/21/javafx-graphics-21-win.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.27.0/error_prone_annotations-2.27.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-graphics/21/javafx-graphics-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-base/21/javafx-base-21-win.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/net/java/dev/jna/jna/5.15.0/jna-5.15.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-jcl/1.7.36/slf4j-jcl-1.7.36.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/artoolkitplus/2.3.1-1.5.9/artoolkitplus-2.3.1-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/librealsense/1.12.4-1.5.9/librealsense-1.12.4-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-jcl/1.7.36/slf4j-jcl-1.7.36.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-graphics/21/javafx-graphics-21-win.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/openblas/0.3.26-1.5.10/openblas-0.3.26-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.27.0/error_prone_annotations-2.27.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/beust/jcommander/1.82/jcommander-1.82.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/ffmpeg/6.1.1-1.5.10/ffmpeg-6.1.1-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/videoinput/0.200-1.5.9/videoinput-0.200-1.5.9-windows-x86_64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-fxml/21/javafx-fxml-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libdc1394/2.2.6-1.5.9/libdc1394-2.2.6-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/tinylog/tinylog-api/2.7.0/tinylog-api-2.7.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libfreenect/0.5.7-1.5.9/libfreenect-0.5.7-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-controls/21/javafx-controls-21-win.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/opencv/4.9.0-1.5.10/opencv-4.9.0-1.5.10-windows-x86_64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/zxing/core/3.5.3/core-3.5.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-controls/21/javafx-controls-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/leptonica/1.84.1-1.5.10/leptonica-1.84.1-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/commons-net/commons-net/3.11.1/commons-net-3.11.1.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/librealsense2/2.53.1-1.5.9/librealsense2-2.53.1-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/net/java/dev/jna/jna/5.15.0/jna-5.15.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/tinylog/tinylog-impl/2.7.0/tinylog-impl-2.7.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/de/jensd/fontawesomefx/8.9/fontawesomefx-8.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/flycapture/2.13.3.31-1.5.9/flycapture-2.13.3.31-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/javacv/1.5.10/javacv-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/opencv/4.9.0-1.5.10/opencv-4.9.0-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-base/21/javafx-base-21-win.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/controlsfx/controlsfx/11.2.1/controlsfx-11.2.1.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/videoinput/0.200-1.5.9/videoinput-0.200-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/github/jai-imageio/jai-imageio-core/1.4.0/jai-imageio-core-1.4.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/zxing/javase/3.5.3/javase-3.5.3.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-graphics/21/javafx-graphics-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-base/21/javafx-base-21.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/javacpp/1.5.10/javacpp-1.5.10.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/ffmpeg/6.1.1-1.5.10/ffmpeg-6.1.1-1.5.10-windows-x86_64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/openblas/0.3.26-1.5.10/openblas-0.3.26-1.5.10-windows-x86_64.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/bytedeco/libfreenect2/0.2.0-1.5.9/libfreenect2-0.2.0-1.5.9.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/openjfx/javafx-fxml/21/javafx-fxml-21-win.jar" path-in-jar="/" />
|
||||
</root>
|
||||
</artifact>
|
||||
</component>
|
||||
5
.idea/inspectionProfiles/Project_Default.xml
generated
5
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,6 +1,10 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="AutoCloseableResource" enabled="false" level="WARNING" enabled_by_default="false">
|
||||
<option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,java.lang.foreign.Arena,ofAuto,java.lang.foreign.Arena,global,java.util.concurrent.Executors,newFixedThreadPool" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="ClassEscapesItsScope" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="CommentedOutCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<option name="minLines" value="3" />
|
||||
</inspection_tool>
|
||||
@@ -12,5 +16,6 @@
|
||||
<option name="processComments" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="UnusedReturnValue" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
</profile>
|
||||
</component>
|
||||
BIN
IU photoboth-01.jpg
Normal file
BIN
IU photoboth-01.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
BIN
IU photoboth-02.jpg
Normal file
BIN
IU photoboth-02.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 253 KiB |
BIN
banners/IU photoboth-01.jpg
Normal file
BIN
banners/IU photoboth-01.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
BIN
banners/IU photoboth-01_old.jpg
Normal file
BIN
banners/IU photoboth-01_old.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 452 KiB |
BIN
banners/IU photoboth-02.jpg
Normal file
BIN
banners/IU photoboth-02.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 253 KiB |
BIN
camera-shutter-click-01.wav
Normal file
BIN
camera-shutter-click-01.wav
Normal file
Binary file not shown.
@@ -1,22 +1,50 @@
|
||||
#Thu Dec 19 11:49:05 WIB 2024
|
||||
#Wed Aug 27 11:07:31 WIB 2025
|
||||
AudioPhase1=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase1.mp3
|
||||
AudioPhase2=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase2.mp3
|
||||
AudioPhase3=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase3.mp3
|
||||
AudioPhase4=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase4.mp3
|
||||
AudioPhase5=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase5.mp3
|
||||
CameraCenter=OBSBOT Meet 2 StreamCamera
|
||||
CameraConfigCenter={"Brightness"\:0.0,"Contrast"\:32.0,"Saturation"\:64.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:157.0,"Sharpness"\:3.0,"Gamma"\:100.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft45={"Brightness"\:37.58730158730158,"Contrast"\:32.0,"Saturation"\:64.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:157.0,"Sharpness"\:3.0,"Gamma"\:100.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft90={"Brightness"\:0.0,"Contrast"\:32.0,"Saturation"\:64.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:157.0,"Sharpness"\:3.0,"Gamma"\:100.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight45={"Brightness"\:0.0,"Contrast"\:32.0,"Saturation"\:64.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:157.0,"Sharpness"\:3.0,"Gamma"\:100.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight90={"Brightness"\:0.0,"Contrast"\:32.0,"Saturation"\:64.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:157.0,"Sharpness"\:3.0,"Gamma"\:100.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraLeft45=OBSBOT Meet 2 StreamCamera
|
||||
Cam1BottomCrop=20.0
|
||||
Cam1LeftCrop=8.0
|
||||
Cam1RightCrop=8.0
|
||||
Cam1TopCrop=10.0
|
||||
Cam2BottomCrop=20.0
|
||||
Cam2LeftCrop=8.0
|
||||
Cam2RightCrop=8.0
|
||||
Cam2TopCrop=10.0
|
||||
Cam3BottomCrop=20.0
|
||||
Cam3LeftCrop=8.0
|
||||
Cam3RightCrop=8.0
|
||||
Cam3TopCrop=10.0
|
||||
Cam4BottomCrop=20.0
|
||||
Cam4LeftCrop=8.0
|
||||
Cam4RightCrop=8.0
|
||||
Cam4TopCrop=10.0
|
||||
Cam5BottomCrop=20.0
|
||||
Cam5LeftCrop=8.0
|
||||
Cam5RightCrop=8.0
|
||||
Cam5TopCrop=10.0
|
||||
CameraCenter=
|
||||
CameraConfigCenter={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft45={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft90={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight45={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight90={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraLeft45=
|
||||
CameraLeft90=OBSBOT Meet 2 StreamCamera
|
||||
CameraRight45=OBSBOT Meet 2 StreamCamera
|
||||
CameraRight90=OBSBOT Meet 2 StreamCamera
|
||||
CameraRight45=
|
||||
CameraRight90=
|
||||
FTPHost=192.168.10.2
|
||||
FTPPass=password
|
||||
FTPPath=/
|
||||
FTPPort=21
|
||||
FTPUser=user
|
||||
PhotoDirectory=C\:\\Users\\rdkar\\OneDrive\\Desktop\\photoresult
|
||||
FlipCamera=false
|
||||
MirrorCamera=false
|
||||
PhotoDirectory=D\:\\Capture
|
||||
Production=false
|
||||
SharpnessThreshold=850.0
|
||||
cascadeMaxSize=360
|
||||
cascadeMinNeighbors=3
|
||||
cascadeMinSize=250
|
||||
cascadeScaleFactor=1.05
|
||||
|
||||
BIN
countdown321.wav
Normal file
BIN
countdown321.wav
Normal file
Binary file not shown.
BIN
data_barcode_tidak_ditemukan.wav
Normal file
BIN
data_barcode_tidak_ditemukan.wav
Normal file
Binary file not shown.
BIN
database.db
BIN
database.db
Binary file not shown.
12213
haarcascade_eye.xml
Normal file
12213
haarcascade_eye.xml
Normal file
File diff suppressed because it is too large
Load Diff
29690
haarcascade_profileface.xml
Normal file
29690
haarcascade_profileface.xml
Normal file
File diff suppressed because it is too large
Load Diff
12213
haarcascades/haarcascade_eye.xml
Normal file
12213
haarcascades/haarcascade_eye.xml
Normal file
File diff suppressed because it is too large
Load Diff
33314
haarcascades/haarcascade_frontalface_default.xml
Normal file
33314
haarcascades/haarcascade_frontalface_default.xml
Normal file
File diff suppressed because it is too large
Load Diff
29690
haarcascades/haarcascade_profileface.xml
Normal file
29690
haarcascades/haarcascade_profileface.xml
Normal file
File diff suppressed because it is too large
Load Diff
1361
hs_err_pid42244.log
1361
hs_err_pid42244.log
File diff suppressed because one or more lines are too long
BIN
hubungistafkami.wav
Normal file
BIN
hubungistafkami.wav
Normal file
Binary file not shown.
BIN
kesalahan_server.wav
Normal file
BIN
kesalahan_server.wav
Normal file
Binary file not shown.
BIN
libs/win32-x86-64/SecureDongleJ.dll
Normal file
BIN
libs/win32-x86-64/SecureDongleJ.dll
Normal file
Binary file not shown.
BIN
libs/win32-x86/SecureDongleJ.dll
Normal file
BIN
libs/win32-x86/SecureDongleJ.dll
Normal file
Binary file not shown.
@@ -47,3 +47,448 @@
|
||||
2024-10-21 15:28:21 INFO: GetAll success, result count: 36
|
||||
2024-10-21 15:28:25 INFO: Not loading empty fxml file
|
||||
2024-10-21 15:28:25 INFO: Application closed
|
||||
2025-03-24 16:03:28 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\rdkar\OneDrive\Documents\IntelliJ Project\ErhaCam
|
||||
2025-03-24 16:03:28 INFO: Config.ConfigFile.Load() Load config file at C:\Users\rdkar\OneDrive\Documents\IntelliJ Project\ErhaCam\config.properties
|
||||
2025-03-24 16:03:28 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-24 16:03:29 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-24 16:03:30 INFO: Config.SomeCodes.LoadFaceDetector() FaceDetector loaded
|
||||
2025-03-24 16:03:30 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-24 16:03:31 INFO: Database.Sqlite.CreateDatabase() Database created successfully
|
||||
2025-03-24 16:03:31 INFO: Database.Sqlite.GetAll() GetAll success, result count: 55
|
||||
2025-03-24 16:04:08 INFO: id.co.gtc.erhacam.MainView.loadContent() Not loading empty fxml file
|
||||
2025-03-24 16:04:08 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 14:43:56 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 14:43:56 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 14:43:56 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 14:43:56 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 14:43:56 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 14:43:56 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 14:43:56 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 14:43:56 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\FullQuality, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:43:56 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\FullQualityCrop, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:43:56 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\Compressed, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:43:56 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\CompressedCrop, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:43:56 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\thumbs, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:44:00 ERROR: id.co.gtc.erhacam.MainApplication.start() Secure Dongle not found
|
||||
2025-03-21 14:44:52 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 14:44:52 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 14:44:52 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 14:44:52 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 14:44:52 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 14:44:52 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 14:44:52 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 14:44:52 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\FullQuality, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:44:52 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\FullQualityCrop, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:44:52 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\Compressed, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:44:52 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\CompressedCrop, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:44:52 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\rdkar\OneDrive\Desktop\Erha Capture\thumbs, Msg : C:\Users\rdkar
|
||||
2025-03-21 14:44:52 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 14:44:52 INFO: Config.SomeCodes.ExtractResource() Resource File extracted: /countdown321.wav
|
||||
2025-03-21 14:44:53 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 14:44:53 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 14:44:53 INFO: Config.SomeCodes.ExtractResource() Resource File extracted: /haarcascade_frontalface_alt.xml
|
||||
2025-03-21 14:44:53 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 14:44:58 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 14:44:58 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 14:44:58 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 14:44:58 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 14:44:58 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 14:44:58 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 14:44:58 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 14:45:06 INFO: id.co.gtc.erhacam.SettingView.initialize() Found 1 Cameras
|
||||
2025-03-21 14:45:06 INFO: id.co.gtc.erhacam.SettingView.lambda$initialize$0() adding camera : OBSBOT Meet 2 StreamCamera to camera list
|
||||
2025-03-21 14:45:13 INFO: Config.ConfigFile.SetCameraLeft90() Camera Left 90 Degree changed from ACER QHD User Facing to OBSBOT Meet 2 StreamCamera
|
||||
2025-03-21 14:45:24 INFO: Config.ConfigFile.SetPhotoDirectory() Photo Directory changed from C:\Users\rdkar\OneDrive\Desktop\Erha Capture to C:\Users\Erha\Desktop\ErhaCapture
|
||||
2025-03-21 14:45:24 INFO: Config.ConfigFile.Save() Config Saved
|
||||
2025-03-21 14:45:29 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 14:45:29 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 14:45:29 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 14:45:29 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 14:45:32 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 14:45:53 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-21 14:45:53 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 14:50:19 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 14:50:19 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 14:50:19 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 14:50:19 INFO: Config.SomeCodes.MakeDirectory() Directory created: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 14:50:19 INFO: Config.SomeCodes.MakeDirectory() Directory created: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 14:50:19 INFO: Config.SomeCodes.MakeDirectory() Directory created: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 14:50:19 INFO: Config.SomeCodes.MakeDirectory() Directory created: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 14:50:19 INFO: Config.SomeCodes.MakeDirectory() Directory created: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 14:50:19 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 14:50:19 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 14:50:20 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 14:50:20 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 14:50:20 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 14:50:20 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 14:50:20 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 14:50:25 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:18:02 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:18:02 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:18:02 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:18:02 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:18:02 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:18:02 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:18:02 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:18:02 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:18:02 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:18:02 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:18:02 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:18:02 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:18:02 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:18:03 INFO: Config.SomeCodes.ExtractResource() Resource File extracted: /kesalahan_server.wav
|
||||
2025-03-21 15:18:03 INFO: Config.SomeCodes.ExtractResource() Resource File extracted: /data_barcode_tidak_ditemukan.wav
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:18:03 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:18:03 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:18:03 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:18:09 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:18:11 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:18:23 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-21 15:18:23 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 15:19:32 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:19:32 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:19:32 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:19:32 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:19:32 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:19:32 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:19:32 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:19:32 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:19:32 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:19:32 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:19:32 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:19:32 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:19:32 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:19:32 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:19:33 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:19:33 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:19:33 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:19:38 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:19:43 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:19:50 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-21 15:19:50 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 15:23:01 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:23:01 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:23:01 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:23:01 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:23:01 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:23:01 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:23:01 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:23:01 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:23:01 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:23:01 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:23:02 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:23:02 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:23:02 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:23:02 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:23:02 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:23:07 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:23:08 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:23:08 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:23:08 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:23:08 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:24:41 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:24:41 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:24:41 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:24:41 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:24:41 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:24:41 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:24:41 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:24:41 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:24:41 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:24:41 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:24:41 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:24:41 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:24:41 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:24:42 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:24:42 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:24:42 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:24:48 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:24:49 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:28:22 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:28:22 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:28:22 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:28:22 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:28:22 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:28:22 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:28:22 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:28:22 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:28:22 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:28:22 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:28:23 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:28:23 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:28:23 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:28:23 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:28:23 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:28:28 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:28:33 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:28:41 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-21 15:28:41 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 15:39:18 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:39:18 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:39:18 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:39:18 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:39:18 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:39:18 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:39:18 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:39:18 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:39:18 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:39:18 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:39:19 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:39:19 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:39:19 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:39:19 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:39:19 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:39:24 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:39:26 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:39:36 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:39:36 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:39:42 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-21 15:39:42 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 15:43:57 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:43:57 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:43:57 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:43:57 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:43:57 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:43:57 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:43:57 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:43:57 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:43:57 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:43:57 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:43:58 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:43:58 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:43:58 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:43:58 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:43:58 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:44:03 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:44:07 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:44:21 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-21 15:44:21 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 15:57:31 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:57:31 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:57:31 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:57:31 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:57:31 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:57:31 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:57:31 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:57:31 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:57:31 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:57:31 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:57:31 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:57:37 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:57:45 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 15:57:59 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-21 15:57:59 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
2025-03-21 15:58:54 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 15:58:54 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 15:58:54 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 15:58:54 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 15:58:54 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 15:58:54 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 15:58:54 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 15:58:54 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 15:58:54 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 15:58:54 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 15:58:54 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 15:58:54 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 15:58:55 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 15:58:55 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 15:58:55 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 15:59:01 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 15:59:03 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 16:07:12 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\Erha\IdeaProjects\ErhaCam
|
||||
2025-03-21 16:07:12 INFO: Config.ConfigFile.Load() Load config file at C:\Users\Erha\IdeaProjects\ErhaCam\config.properties
|
||||
2025-03-21 16:07:12 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-21 16:07:12 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-21 16:07:12 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-21 16:07:12 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-21 16:07:12 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-21 16:07:12 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQuality
|
||||
2025-03-21 16:07:12 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop
|
||||
2025-03-21 16:07:12 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\Compressed
|
||||
2025-03-21 16:07:12 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop
|
||||
2025-03-21 16:07:12 INFO: Config.SomeCodes.MakeDirectory() Directory exists: C:\Users\Erha\Desktop\ErhaCapture\thumbs
|
||||
2025-03-21 16:07:12 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-21 16:07:12 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-21 16:07:12 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-21 16:07:12 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\Erha\IdeaProjects\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-21 16:07:13 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$15() Left90 Index: 0
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-21 16:07:13 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-21 16:07:18 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Camera Started with resolution 2160x3840@0
|
||||
2025-03-21 16:07:51 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 16:08:12 ERROR: id.co.gtc.erhacam.CaptureView.call() Record associated with barcode
|
||||
2025-03-21 16:08:33 INFO: id.co.gtc.erhacam.CaptureView.onPlaybackStarted() Audio Positikan Muka Started
|
||||
2025-03-21 16:08:40 INFO: id.co.gtc.erhacam.CaptureView.onPlaybackFinished() Audio Positikan Muka Finished
|
||||
2025-03-24 16:05:16 INFO: Config.ConfigFile.<init>() Current working directory in Java : C:\Users\rdkar\OneDrive\Documents\IntelliJ Project\ErhaCam
|
||||
2025-03-24 16:05:16 INFO: Config.ConfigFile.Load() Load config file at C:\Users\rdkar\OneDrive\Documents\IntelliJ Project\ErhaCam\config.properties
|
||||
2025-03-24 16:05:16 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() FaceMaxSize created with value : 500
|
||||
2025-03-24 16:05:16 INFO: id.co.gtc.erhacam.Detectors.setFaceMaxSize() EyeMaxSize created with value : 83
|
||||
2025-03-24 16:05:16 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() FaceMinSize created with value : 250
|
||||
2025-03-24 16:05:16 INFO: id.co.gtc.erhacam.Detectors.setFaceMinSize() EyeMinSize created with value : 41
|
||||
2025-03-24 16:05:16 INFO: Config.ConfigFile.Load() Config Loaded
|
||||
2025-03-24 16:05:16 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\Erha\Desktop\ErhaCapture\FullQuality, Msg : C:\Users\Erha
|
||||
2025-03-24 16:05:16 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\Erha\Desktop\ErhaCapture\FullQualityCrop, Msg : C:\Users\Erha
|
||||
2025-03-24 16:05:16 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\Erha\Desktop\ErhaCapture\Compressed, Msg : C:\Users\Erha
|
||||
2025-03-24 16:05:16 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\Erha\Desktop\ErhaCapture\CompressedCrop, Msg : C:\Users\Erha
|
||||
2025-03-24 16:05:16 INFO: Config.SomeCodes.MakeDirectory() Error creating directory: C:\Users\Erha\Desktop\ErhaCapture\thumbs, Msg : C:\Users\Erha
|
||||
2025-03-24 16:05:17 INFO: id.co.gtc.erhacam.MainApplication.start() Secure Dongle UserID valid
|
||||
2025-03-24 16:05:18 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-24 16:05:19 INFO: Config.SomeCodes.LoadQRReader() QRReader loaded
|
||||
2025-03-24 16:05:19 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() Face Detector file : C:\Users\rdkar\OneDrive\Documents\IntelliJ Project\ErhaCam\haarcascade_frontalface_alt.xml
|
||||
2025-03-24 16:05:19 INFO: id.co.gtc.erhacam.Detectors.LoadFrontalFaceDetector() FaceDetector loaded
|
||||
2025-03-24 16:05:19 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() Eye Detector file : C:\Users\rdkar\OneDrive\Documents\IntelliJ Project\ErhaCam\haarcascade_eye.xml
|
||||
2025-03-24 16:05:19 INFO: id.co.gtc.erhacam.Detectors.LoadEyeDetector() EyeDetector loaded
|
||||
2025-03-24 16:05:19 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() Profile Face Detector file : C:\Users\rdkar\OneDrive\Documents\IntelliJ Project\ErhaCam\haarcascade_profileface.xml
|
||||
2025-03-24 16:05:19 INFO: id.co.gtc.erhacam.Detectors.LoadProfileFaceDetector() ProfileFaceDetector loaded
|
||||
2025-03-24 16:05:20 INFO: id.co.gtc.erhacam.MainApplication.start() Application started
|
||||
2025-03-24 16:05:20 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$13() Left90 Index: 1
|
||||
2025-03-24 16:05:20 INFO: SecureDongle.SecureDongle.lambda$StartMonitor$0() Start Monitoring UserID=14022025
|
||||
2025-03-24 16:05:20 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-24 16:05:20 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-24 16:05:24 INFO: id.co.gtc.erhacam.SettingView.initialize() Found 3 Cameras
|
||||
2025-03-24 16:05:24 INFO: id.co.gtc.erhacam.SettingView.lambda$initialize$2() adding camera : ACER QHD User Facing to camera list
|
||||
2025-03-24 16:05:24 INFO: id.co.gtc.erhacam.SettingView.lambda$initialize$2() adding camera : OBSBOT Meet 2 StreamCamera to camera list
|
||||
2025-03-24 16:05:24 INFO: id.co.gtc.erhacam.SettingView.lambda$initialize$2() adding camera : OBSBOT Virtual Camera to camera list
|
||||
2025-03-24 16:05:31 INFO: Database.Sqlite.CreateDatabase() Database created successfully
|
||||
2025-03-24 16:05:31 INFO: Database.Sqlite.GetAll() GetAll success, result count: 90
|
||||
2025-03-24 16:05:32 INFO: id.co.gtc.erhacam.CaptureView.initialize() Audio Player : Inited
|
||||
2025-03-24 16:05:32 INFO: id.co.gtc.erhacam.CaptureView.lambda$initialize$13() Left90 Index: 1
|
||||
2025-03-24 16:05:32 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : QR Reader loaded
|
||||
2025-03-24 16:05:32 INFO: id.co.gtc.erhacam.CaptureView.onLog() [01] : Face detector loaded
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\IdeaProjects\ErhaCam\thumbs\240980 2025-3-24_12-38-45 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_13-50-34 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_14-41-17 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_14-49-11 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_14-50-41 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_15-12-36 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_15-26-18 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_15-36-34 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:05:33 ERROR: id.co.gtc.erhacam.PhotoRow.loadImage() Error loading image: C:\Users\Erha\Desktop\ErhaCapture\thumbs\240980 2025-3-24_15-37-53 01.png, Msg : OpenCV(4.9.0) D:\a\javacpp-presets\javacpp-presets\opencv\cppbuild\windows-x86_64\opencv-4.9.0\modules\imgproc\src\resize.cpp:4152: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
|
||||
|
||||
2025-03-24 16:07:13 ERROR: id.co.gtc.erhacam.MainView.loadContent() loadContent Not loading empty fxml file
|
||||
2025-03-24 16:07:13 INFO: id.co.gtc.erhacam.MainApplication.lambda$start$0() Application closed
|
||||
|
||||
Binary file not shown.
@@ -1,22 +1,26 @@
|
||||
#Wed Oct 23 10:37:24 WIB 2024
|
||||
AudioPhase1=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\out\\artifacts\\ErhaCam_jar\\audio\\phase1.mp3
|
||||
AudioPhase2=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\out\\artifacts\\ErhaCam_jar\\audio\\phase2.mp3
|
||||
AudioPhase3=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\out\\artifacts\\ErhaCam_jar\\audio\\phase3.mp3
|
||||
AudioPhase4=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\out\\artifacts\\ErhaCam_jar\\audio\\phase4.mp3
|
||||
AudioPhase5=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\out\\artifacts\\ErhaCam_jar\\audio\\phase5.mp3
|
||||
CameraCenter=
|
||||
CameraConfigCenter={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft45={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft90={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight45={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight90={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:0.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraLeft45=
|
||||
CameraLeft90=
|
||||
CameraRight45=
|
||||
CameraRight90=
|
||||
#Mon Feb 03 15:09:08 ICT 2025
|
||||
AudioPhase1=\\\\RDKARTONO_SFG14\\ErhaCam_jar\\audio\\phase1.mp3
|
||||
AudioPhase2=\\\\RDKARTONO_SFG14\\ErhaCam_jar\\audio\\phase2.mp3
|
||||
AudioPhase3=\\\\RDKARTONO_SFG14\\ErhaCam_jar\\audio\\phase3.mp3
|
||||
AudioPhase4=\\\\RDKARTONO_SFG14\\ErhaCam_jar\\audio\\phase4.mp3
|
||||
AudioPhase5=\\\\RDKARTONO_SFG14\\ErhaCam_jar\\audio\\phase5.mp3
|
||||
CameraCenter=OBSBOT Meet 2 StreamCamera
|
||||
CameraConfigCenter={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft45={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigLeft90={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight45={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraConfigRight90={"Brightness"\:0.0,"Contrast"\:0.0,"Saturation"\:0.0,"Hue"\:0.0,"Gain"\:1.0,"Exposure"\:1.0,"Sharpness"\:0.0,"Gamma"\:0.0,"AutoExposure"\:true,"AutoFocus"\:true,"AutoWhiteBalance"\:true}
|
||||
CameraLeft45=OBSBOT Meet 2 StreamCamera
|
||||
CameraLeft90=OBSBOT Meet 2 StreamCamera
|
||||
CameraRight45=OBSBOT Meet 2 StreamCamera
|
||||
CameraRight90=OBSBOT Meet 2 StreamCamera
|
||||
FTPHost=192.168.10.2
|
||||
FTPPass=password
|
||||
FTPPath=/
|
||||
FTPPort=21
|
||||
FTPUser=user
|
||||
PhotoDirectory=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\out\\artifacts\\ErhaCam_jar
|
||||
PhotoDirectory=\\\\RDKARTONO_SFG14\\ErhaCam_jar
|
||||
cascadeMaxSize=400
|
||||
cascadeMinNeighbors=3
|
||||
cascadeMinSize=200
|
||||
cascadeScaleFactor=1.1
|
||||
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
BIN
pengambilan_berhasil.wav
Normal file
BIN
pengambilan_berhasil.wav
Normal file
Binary file not shown.
BIN
pengambilan_berhasil_tunggu_lobby.wav
Normal file
BIN
pengambilan_berhasil_tunggu_lobby.wav
Normal file
Binary file not shown.
BIN
pengambilan_gagal.wav
Normal file
BIN
pengambilan_gagal.wav
Normal file
Binary file not shown.
105
pom.xml
105
pom.xml
@@ -36,16 +36,115 @@
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>javacv-platform</artifactId>-->
|
||||
<!-- <version>1.5.10</version>-->
|
||||
<!-- <exclusions>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>leptonica-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>artoolkitplus-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>libdc1394-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>libfreenect-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>libfreenect2-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>flycapture-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>librealsense-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>librealsense2-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>tesseract-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <!– platform dibuangin semua, kemudian tambah sendiri linux-arm64, windows-x86_64, linux-x86_64 –>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>flandmark-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>openblas-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>ffmpeg-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>videoinput-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>javacpp-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
<!-- <exclusion>-->
|
||||
<!-- <groupId>org.bytedeco</groupId>-->
|
||||
<!-- <artifactId>opencv-platform</artifactId>-->
|
||||
<!-- </exclusion>-->
|
||||
|
||||
<!-- </exclusions>-->
|
||||
<!-- </dependency>-->
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>javacv-platform</artifactId>
|
||||
<artifactId>javacv</artifactId>
|
||||
<version>1.5.10</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>videoinput</artifactId>
|
||||
<version>0.200-1.5.9</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>javacpp-platform</artifactId>
|
||||
<version>1.5.10</version>
|
||||
<artifactId>ffmpeg</artifactId>
|
||||
<version>6.1.1-1.5.10</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>opencv</artifactId>
|
||||
<version>4.9.0-1.5.10</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>javacpp</artifactId>
|
||||
<version>1.5.10</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bytedeco</groupId>
|
||||
<artifactId>openblas</artifactId>
|
||||
<version>0.3.26-1.5.10</version>
|
||||
<classifier>windows-x86_64</classifier>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-net</groupId>
|
||||
<artifactId>commons-net</artifactId>
|
||||
|
||||
BIN
posisikan_wajah.wav
Normal file
BIN
posisikan_wajah.wav
Normal file
Binary file not shown.
BIN
scan_barcode.wav
Normal file
BIN
scan_barcode.wav
Normal file
Binary file not shown.
@@ -3,10 +3,37 @@ package BASS;
|
||||
import lombok.Getter;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static Config.SomeCodes.Wait;
|
||||
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class AudioPlayer {
|
||||
private final Bass bass = Bass.Instance;
|
||||
private @Getter boolean inited = false;
|
||||
private @Getter String currentFile = "";
|
||||
private int currentFileHandle = 0;
|
||||
|
||||
public void WaitUntilFinished(){
|
||||
while(currentFileHandle!=0){
|
||||
Wait(10);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isPlaying(){
|
||||
return currentFileHandle!=0;
|
||||
}
|
||||
|
||||
public void StopCurrentPlayback(){
|
||||
if (currentFileHandle!=0){
|
||||
if (bass.BASS_ChannelStop(currentFileHandle)){
|
||||
Logger.info("AudioPlayer StopCurrentPlayback success");
|
||||
} else Logger.error("AudioPlayer StopCurrentPlayback failed, error code: "+bass.BASS_ErrorGetCode());
|
||||
}
|
||||
currentFileHandle = 0;
|
||||
currentFile = "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize AudioPlayer
|
||||
@@ -18,6 +45,7 @@ public class AudioPlayer {
|
||||
if (deviceid>-1){
|
||||
int initflags = Bass.BASS_DEVICE_16BITS | Bass.BASS_DEVICE_STEREO | Bass.BASS_DEVICE_FREQ | Bass.BASS_DEVICE_REINIT;
|
||||
if (bass.BASS_Init(deviceid,samplingrate,initflags)){
|
||||
currentFileHandle = 0;
|
||||
inited = true;
|
||||
} else Logger.error("AudioPlayer initialization failed, BASS_Init failed, error code: " + bass.BASS_ErrorGetCode());
|
||||
} else Logger.error("AudioPlayer initialization failed, deviceid is not correct");
|
||||
@@ -34,6 +62,8 @@ public class AudioPlayer {
|
||||
} else Logger.error("AudioPlayer Free failed, error code: "+bass.BASS_ErrorGetCode());
|
||||
inited = false;
|
||||
}
|
||||
currentFile = "";
|
||||
currentFileHandle = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,14 +102,15 @@ public class AudioPlayer {
|
||||
* Play Audio File
|
||||
* @param filename File to be played
|
||||
* @param playbackstatus PlaybackStatus callback
|
||||
* @return true if success, false if failed
|
||||
*/
|
||||
public boolean PlayFile(final String filename, final PlaybackStatus playbackstatus){
|
||||
if (inited){
|
||||
public void PlayFile(final String filename, final PlaybackStatus playbackstatus){
|
||||
if (inited && filename!=null && !filename.isBlank()){
|
||||
int filehandle = bass.BASS_StreamCreateFile(false, filename, 0, 0, 0);
|
||||
if (filehandle!=0){
|
||||
if (bass.BASS_ChannelStart(filehandle)){
|
||||
new Thread(()->{
|
||||
currentFile = filename;
|
||||
currentFileHandle = filehandle;
|
||||
Thread pl = new Thread(() -> {
|
||||
if (playbackstatus!=null) playbackstatus.onPlaybackStarted(filename);
|
||||
boolean iscontinue = true;
|
||||
while(iscontinue){
|
||||
@@ -92,21 +123,30 @@ public class AudioPlayer {
|
||||
iscontinue = false;
|
||||
break;
|
||||
default : {
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException e) {
|
||||
iscontinue = false;
|
||||
}
|
||||
Wait(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (playbackstatus!=null) playbackstatus.onPlaybackFinished(filename);
|
||||
}).start();
|
||||
return true;
|
||||
} else Logger.error("AudioPlayer PlayFile failed, BASS_ChannelStart failed, error code: "+bass.BASS_ErrorGetCode());
|
||||
} else Logger.error("AudioPlayer PlayFile failed, BASS_StreamCreateFile failed, error code: "+bass.BASS_ErrorGetCode());
|
||||
} else Logger.info("AudioPlayer PlayFile failed, AudioPlayer is not initialized");
|
||||
return false;
|
||||
currentFile = "";
|
||||
currentFileHandle = 0;
|
||||
});
|
||||
pl.setName("PlaybackStatus Monitor Thread");
|
||||
pl.setDaemon(true);
|
||||
pl.start();
|
||||
|
||||
} else {
|
||||
Logger.error("AudioPlayer PlayFile failed, BASS_ChannelStart failed, error code: "+bass.BASS_ErrorGetCode());
|
||||
if (playbackstatus!=null) playbackstatus.onPlaybackFailure(filename);
|
||||
}
|
||||
} else {
|
||||
Logger.error("AudioPlayer PlayFile failed, BASS_StreamCreateFile failed, error code: "+bass.BASS_ErrorGetCode());
|
||||
if (playbackstatus!=null) playbackstatus.onPlaybackFailure(filename);
|
||||
}
|
||||
} else {
|
||||
Logger.info("AudioPlayer PlayFile failed, AudioPlayer is not initialized");
|
||||
if (playbackstatus!=null) playbackstatus.onPlaybackFailure(filename);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,12 @@ package Camera;
|
||||
|
||||
public interface LiveCamEvent {
|
||||
void onDetectedQRCode(String qrCode);
|
||||
void onFaceDetector(boolean hasface, int width, int height);
|
||||
void onFrontalFaceDetector(boolean hasface, int width, int height);
|
||||
void onProfileFaceDetector(boolean hasface, int width, int height);
|
||||
void onEyeDetector(boolean hasEye);
|
||||
void onLog(String log);
|
||||
void onBlink(int counter);
|
||||
void onDoubleBlink(int counter);
|
||||
void onStartCapturing();
|
||||
void onIntervalUpdate();
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ public enum ObsbotMeet2 {
|
||||
Mode4(0.2, 640, 360, "16:9"),
|
||||
Mode5(0.3, 640, 480, "4:3"),
|
||||
ModeBest(8.3, 3840, 2160, "16:9"),
|
||||
ModeLive(0.3, 640, 480, "4:3");
|
||||
ModeLive(0.3, 640, 360, "16:9");
|
||||
|
||||
private final double Megapixel;
|
||||
private final int width;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package Config;
|
||||
|
||||
import id.co.gtc.erhacam.MainApplication;
|
||||
import lombok.Getter;
|
||||
import lombok.val;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.io.File;
|
||||
@@ -40,6 +40,42 @@ public class ConfigFile {
|
||||
|
||||
private String PhotoDirectory;
|
||||
|
||||
private @Getter double cascadeScaleFactor;
|
||||
private @Getter int cascadeMinNeighbors;
|
||||
private @Getter int cascadeMinSize;
|
||||
private @Getter int cascadeMaxSize;
|
||||
|
||||
private @Getter boolean MirrorCamera = false;
|
||||
private @Getter boolean FlipCamera = false;
|
||||
private @Getter boolean isProduction = true;
|
||||
|
||||
private @Getter double SharpnessThreshold;
|
||||
|
||||
private @Getter final double topcropmax = 30.0;
|
||||
private @Getter final double bottomcropmax = 30.0;
|
||||
private @Getter final double leftcropmax = 30.0;
|
||||
private @Getter final double rightcropmax = 30.0;
|
||||
private @Getter double Cam1TopCrop = 10.0;
|
||||
private @Getter double Cam1BottomCrop = 20.0;
|
||||
private @Getter double Cam1LeftCrop = 8.0;
|
||||
private @Getter double Cam1RightCrop = 8.0;
|
||||
private @Getter double Cam2TopCrop = 10.0;
|
||||
private @Getter double Cam2BottomCrop = 20.0;
|
||||
private @Getter double Cam2LeftCrop = 8.0;
|
||||
private @Getter double Cam2RightCrop = 8.0;
|
||||
private @Getter double Cam3TopCrop = 10.0;
|
||||
private @Getter double Cam3BottomCrop = 20.0;
|
||||
private @Getter double Cam3LeftCrop = 8.0;
|
||||
private @Getter double Cam3RightCrop = 8.0;
|
||||
private @Getter double Cam4TopCrop = 10.0;
|
||||
private @Getter double Cam4BottomCrop = 20.0;
|
||||
private @Getter double Cam4LeftCrop = 8.0;
|
||||
private @Getter double Cam4RightCrop = 8.0;
|
||||
private @Getter double Cam5TopCrop = 10.0;
|
||||
private @Getter double Cam5BottomCrop = 20.0;
|
||||
private @Getter double Cam5LeftCrop = 10.0;
|
||||
private @Getter double Cam5RightCrop = 10.0;
|
||||
|
||||
private boolean needsave = false;
|
||||
|
||||
public ConfigFile(){
|
||||
@@ -48,6 +84,244 @@ public class ConfigFile {
|
||||
Load();
|
||||
}
|
||||
|
||||
public void setAPI(boolean isProduction){
|
||||
if (this.isProduction != isProduction){
|
||||
this.isProduction = isProduction;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setCam1TopCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam1TopCrop && v <= topcropmax && v >= 0.0){
|
||||
Cam1TopCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setCam1BottomCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam1BottomCrop && v <= bottomcropmax && v >= 0.0){
|
||||
Cam1BottomCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam1LeftCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam1LeftCrop && v <= leftcropmax && v >= 0.0){
|
||||
Cam1LeftCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam1RightCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam1RightCrop && v <= rightcropmax && v >= 0.0){
|
||||
Cam1RightCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam2TopCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam2TopCrop && v <= topcropmax && v >= 0.0){
|
||||
Cam2TopCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam2BottomCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam2BottomCrop && v <= bottomcropmax && v >= 0.0){
|
||||
Cam2BottomCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam2LeftCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam2LeftCrop && v <= leftcropmax && v >= 0.0){
|
||||
Cam2LeftCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam2RightCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam2RightCrop && v <= rightcropmax && v >= 0.0){
|
||||
Cam2RightCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam3TopCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam3TopCrop && v <= topcropmax && v >= 0.0){
|
||||
Cam3TopCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam3BottomCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam3BottomCrop && v <= bottomcropmax && v >= 0.0){
|
||||
Cam3BottomCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam3LeftCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam3LeftCrop && v <= leftcropmax && v >= 0.0){
|
||||
Cam3LeftCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam3RightCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam3RightCrop && v <= rightcropmax && v >= 0.0){
|
||||
Cam3RightCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam4TopCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam4TopCrop && v <= topcropmax && v >= 0.0){
|
||||
Cam4TopCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam4BottomCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam4BottomCrop && v <= bottomcropmax && v >= 0.0){
|
||||
Cam4BottomCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam4LeftCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam4LeftCrop && v <= leftcropmax && v >= 0.0){
|
||||
Cam4LeftCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam4RightCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam4RightCrop && v <= rightcropmax && v >= 0.0){
|
||||
Cam4RightCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam5TopCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam5TopCrop && v <= topcropmax && v >= 0.0){
|
||||
Cam5TopCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam5BottomCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam5BottomCrop && v <= bottomcropmax && v >= 0.0){
|
||||
Cam5BottomCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam5LeftCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam5LeftCrop && v <= leftcropmax && v >= 0.0){
|
||||
Cam5LeftCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void setCam5RightCrop(String value){
|
||||
if (ValidDouble(value)){
|
||||
double v = toDouble(value);
|
||||
if (v != Cam5RightCrop && v <= rightcropmax && v >= 0.0){
|
||||
Cam5RightCrop = v;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setMirrorCamera(boolean value){
|
||||
if (MirrorCamera != value){
|
||||
MirrorCamera = value;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setFlipCamera(boolean value){
|
||||
if (FlipCamera != value){
|
||||
FlipCamera = value;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setSharpnessThreshold(double value){
|
||||
if (SharpnessThreshold != value){
|
||||
SharpnessThreshold = value;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setCascadeScaleFactor(double value){
|
||||
if (cascadeScaleFactor != value){
|
||||
cascadeScaleFactor = value;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setCascadeMinNeighbors(int value){
|
||||
if (cascadeMinNeighbors != value){
|
||||
cascadeMinNeighbors = value;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setCascadeMinSize(int value){
|
||||
if (cascadeMinSize != value){
|
||||
cascadeMinSize = value;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void setCascadeMaxSize(int value){
|
||||
if (cascadeMaxSize != value){
|
||||
cascadeMaxSize = value;
|
||||
needsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetPhotoDirectory(String path){
|
||||
if (ValidString(path)){
|
||||
if (!path.equals(PhotoDirectory)){
|
||||
@@ -521,6 +795,11 @@ public class ConfigFile {
|
||||
if (prop.getProperty("FTPPass") == null) allcorrect = false;
|
||||
if (prop.getProperty("FTPPath") == null) allcorrect = false;
|
||||
if (prop.getProperty("PhotoDirectory") == null) allcorrect = false;
|
||||
if (prop.getProperty("MirrorCamera") == null) allcorrect = false;
|
||||
if (prop.getProperty("FlipCamera") == null) allcorrect = false;
|
||||
if (prop.getProperty("SharpnessThreshold") == null) allcorrect = false;
|
||||
if (prop.getProperty("Production") == null) allcorrect = false;
|
||||
|
||||
|
||||
if (prop.getProperty(CameraConfigEnum.CameraConfigLeft90.toString()) == null) allcorrect = false;
|
||||
if (prop.getProperty(CameraConfigEnum.CameraConfigLeft45.toString()) == null) allcorrect = false;
|
||||
@@ -528,6 +807,33 @@ public class ConfigFile {
|
||||
if (prop.getProperty(CameraConfigEnum.CameraConfigRight45.toString()) == null) allcorrect = false;
|
||||
if (prop.getProperty(CameraConfigEnum.CameraConfigRight90.toString()) == null) allcorrect = false;
|
||||
|
||||
if (prop.getProperty("cascadeScaleFactor") == null) allcorrect = false;
|
||||
if (prop.getProperty("cascadeMinNeighbors") == null) allcorrect = false;
|
||||
if (prop.getProperty("cascadeMinSize") == null) allcorrect = false;
|
||||
if (prop.getProperty("cascadeMaxSize") == null) allcorrect = false;
|
||||
|
||||
if (prop.getProperty("Cam1TopCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam1BottomCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam1LeftCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam1RightCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam2TopCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam2BottomCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam2LeftCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam2RightCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam3TopCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam3BottomCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam3LeftCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam3RightCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam4TopCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam4BottomCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam4LeftCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam4RightCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam5TopCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam5BottomCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam5LeftCrop") == null) allcorrect = false;
|
||||
if (prop.getProperty("Cam5RightCrop") == null) allcorrect = false;
|
||||
|
||||
|
||||
if (allcorrect){
|
||||
AudioPhase1 = prop.getProperty("AudioPhase1");
|
||||
AudioPhase2 = prop.getProperty("AudioPhase2");
|
||||
@@ -554,7 +860,57 @@ public class ConfigFile {
|
||||
ConfigRight45 = gson.fromJson(prop.getProperty(CameraConfigEnum.CameraConfigRight45.toString()), CameraConfig.class);
|
||||
ConfigRight90 = gson.fromJson(prop.getProperty(CameraConfigEnum.CameraConfigRight90.toString()), CameraConfig.class);
|
||||
|
||||
cascadeScaleFactor = cascadetoDouble(prop.getProperty("cascadeScaleFactor"));
|
||||
cascadeMinNeighbors = toInt(prop.getProperty("cascadeMinNeighbors"));
|
||||
cascadeMinSize = toInt(prop.getProperty("cascadeMinSize"));
|
||||
cascadeMaxSize = toInt(prop.getProperty("cascadeMaxSize"));
|
||||
|
||||
if (MainApplication.detectorsList!=null){
|
||||
MainApplication.detectorsList.forEach((i, d) -> {
|
||||
if (d != null) {
|
||||
System.out.println("Setting face detection parameters for detector: " + i);
|
||||
d.setFaceMaxSize(cascadeMaxSize);
|
||||
d.setFaceMinSize(cascadeMinSize);
|
||||
d.setScaleFactor(cascadeScaleFactor);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Detectors.setFaceMaxSize(cascadeMaxSize);
|
||||
// Detectors.setFaceMinSize(cascadeMinSize);
|
||||
// Detectors.setScaleFactor(cascadeScaleFactor);
|
||||
|
||||
MirrorCamera = toBoolean(prop.getProperty("MirrorCamera"));
|
||||
FlipCamera = toBoolean(prop.getProperty("FlipCamera"));
|
||||
isProduction = toBoolean(prop.getProperty("Production"));
|
||||
|
||||
SharpnessThreshold = toDouble(prop.getProperty("SharpnessThreshold"));
|
||||
|
||||
Cam1TopCrop = toDouble(prop.getProperty("Cam1TopCrop"));
|
||||
Cam1BottomCrop = toDouble(prop.getProperty("Cam1BottomCrop"));
|
||||
Cam1LeftCrop = toDouble(prop.getProperty("Cam1LeftCrop"));
|
||||
Cam1RightCrop = toDouble(prop.getProperty("Cam1RightCrop"));
|
||||
Cam2TopCrop = toDouble(prop.getProperty("Cam2TopCrop"));
|
||||
Cam2BottomCrop = toDouble(prop.getProperty("Cam2BottomCrop"));
|
||||
Cam2LeftCrop = toDouble(prop.getProperty("Cam2LeftCrop"));
|
||||
Cam2RightCrop = toDouble(prop.getProperty("Cam2RightCrop"));
|
||||
Cam3TopCrop = toDouble(prop.getProperty("Cam3TopCrop"));
|
||||
Cam3BottomCrop = toDouble(prop.getProperty("Cam3BottomCrop"));
|
||||
Cam3LeftCrop = toDouble(prop.getProperty("Cam3LeftCrop"));
|
||||
Cam3RightCrop = toDouble(prop.getProperty("Cam3RightCrop"));
|
||||
Cam4TopCrop = toDouble(prop.getProperty("Cam4TopCrop"));
|
||||
Cam4BottomCrop = toDouble(prop.getProperty("Cam4BottomCrop"));
|
||||
Cam4LeftCrop = toDouble(prop.getProperty("Cam4LeftCrop"));
|
||||
Cam4RightCrop = toDouble(prop.getProperty("Cam4RightCrop"));
|
||||
Cam5TopCrop = toDouble(prop.getProperty("Cam5TopCrop"));
|
||||
Cam5BottomCrop = toDouble(prop.getProperty("Cam5BottomCrop"));
|
||||
Cam5LeftCrop = toDouble(prop.getProperty("Cam5LeftCrop"));
|
||||
Cam5RightCrop = toDouble(prop.getProperty("Cam5RightCrop"));
|
||||
|
||||
|
||||
Logger.info("Config Loaded");
|
||||
MakeDirectories();
|
||||
return;
|
||||
} else {
|
||||
Logger.info("Config File Not Correct, Creating Default");
|
||||
@@ -568,6 +924,22 @@ public class ConfigFile {
|
||||
CreateDefault();
|
||||
}
|
||||
|
||||
private double cascadetoDouble(String cascadeScaleFactor) {
|
||||
try{
|
||||
return Double.parseDouble(cascadeScaleFactor);
|
||||
} catch (Exception e){
|
||||
return 1.1;
|
||||
}
|
||||
}
|
||||
|
||||
private double toDouble(String value) {
|
||||
try{
|
||||
return Double.parseDouble(value);
|
||||
} catch (Exception e){
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateDefault(){
|
||||
AudioPhase1 = Path.of(currentDirectory, "audio", "phase1.mp3").toString();
|
||||
AudioPhase2 = Path.of(currentDirectory, "audio", "phase2.mp3").toString();
|
||||
@@ -584,15 +956,60 @@ public class ConfigFile {
|
||||
FTPUser = "user";
|
||||
FTPPass = "password";
|
||||
FTPPath = "/";
|
||||
PhotoDirectory = currentDirectory;
|
||||
PhotoDirectory = "D:\\Capture";
|
||||
SetDefaultCameraConfig(ConfigLeft90);
|
||||
SetDefaultCameraConfig(ConfigLeft45);
|
||||
SetDefaultCameraConfig(ConfigCenter);
|
||||
SetDefaultCameraConfig(ConfigRight45);
|
||||
SetDefaultCameraConfig(ConfigRight90);
|
||||
cascadeScaleFactor = 1.05;
|
||||
cascadeMinNeighbors = 3;
|
||||
cascadeMinSize = 250;
|
||||
cascadeMaxSize = 360;
|
||||
if (MainApplication.detectorsList!= null) MainApplication.detectorsList.forEach((i, d) -> {
|
||||
if (d != null) {
|
||||
d.setFaceMaxSize(cascadeMaxSize);
|
||||
d.setFaceMinSize(cascadeMinSize);
|
||||
d.setScaleFactor(cascadeScaleFactor);
|
||||
}
|
||||
});
|
||||
// Detectors.setFaceMaxSize(cascadeMaxSize);
|
||||
// Detectors.setFaceMinSize(cascadeMinSize);
|
||||
// Detectors.setScaleFactor(cascadeScaleFactor);
|
||||
MirrorCamera = false;
|
||||
FlipCamera = false;
|
||||
isProduction = true;
|
||||
SharpnessThreshold = 850.0;
|
||||
|
||||
Cam1TopCrop = 10.0;
|
||||
Cam1BottomCrop = 20.0;
|
||||
Cam1LeftCrop = 8.0;
|
||||
Cam1RightCrop = 8.0;
|
||||
|
||||
Cam2TopCrop = 10.0;
|
||||
Cam2BottomCrop = 20.0;
|
||||
Cam2LeftCrop = 8.0;
|
||||
Cam2RightCrop = 8.0;
|
||||
|
||||
Cam3TopCrop = 10.0;
|
||||
Cam3BottomCrop = 20.0;
|
||||
Cam3LeftCrop = 8.0;
|
||||
Cam3RightCrop = 8.0;
|
||||
|
||||
Cam4TopCrop = 10.0;
|
||||
Cam4BottomCrop = 20.0;
|
||||
Cam4LeftCrop = 8.0;
|
||||
Cam4RightCrop = 8.0;
|
||||
|
||||
Cam5TopCrop = 10.0;
|
||||
Cam5BottomCrop = 20.0;
|
||||
Cam5LeftCrop = 8.0;
|
||||
Cam5RightCrop = 8.0;
|
||||
|
||||
Logger.info("Default Config Created");
|
||||
needsave = true;
|
||||
Save();
|
||||
MakeDirectories();
|
||||
}
|
||||
|
||||
private void SetDefaultCameraConfig(CameraConfig cc){
|
||||
@@ -640,6 +1057,38 @@ public class ConfigFile {
|
||||
prop.setProperty(CameraConfigEnum.CameraConfigRight45.toString(), gson.toJson(ConfigRight45));
|
||||
prop.setProperty(CameraConfigEnum.CameraConfigRight90.toString(), gson.toJson(ConfigRight90));
|
||||
|
||||
prop.setProperty("cascadeScaleFactor", String.valueOf(cascadeScaleFactor));
|
||||
prop.setProperty("cascadeMinNeighbors", String.valueOf(cascadeMinNeighbors));
|
||||
prop.setProperty("cascadeMinSize", String.valueOf(cascadeMinSize));
|
||||
prop.setProperty("cascadeMaxSize", String.valueOf(cascadeMaxSize));
|
||||
|
||||
prop.setProperty("MirrorCamera", String.valueOf(MirrorCamera));
|
||||
prop.setProperty("FlipCamera", String.valueOf(FlipCamera));
|
||||
prop.setProperty("Production", String.valueOf(isProduction));
|
||||
prop.setProperty("SharpnessThreshold", String.valueOf(SharpnessThreshold));
|
||||
|
||||
prop.setProperty("Cam1TopCrop", String.valueOf(Cam1TopCrop));
|
||||
prop.setProperty("Cam1BottomCrop", String.valueOf(Cam1BottomCrop));
|
||||
prop.setProperty("Cam1LeftCrop", String.valueOf(Cam1LeftCrop));
|
||||
prop.setProperty("Cam1RightCrop", String.valueOf(Cam1RightCrop));
|
||||
prop.setProperty("Cam2TopCrop", String.valueOf(Cam2TopCrop));
|
||||
prop.setProperty("Cam2BottomCrop", String.valueOf(Cam2BottomCrop));
|
||||
prop.setProperty("Cam2LeftCrop", String.valueOf(Cam2LeftCrop));
|
||||
prop.setProperty("Cam2RightCrop", String.valueOf(Cam2RightCrop));
|
||||
prop.setProperty("Cam3TopCrop", String.valueOf(Cam3TopCrop));
|
||||
prop.setProperty("Cam3BottomCrop", String.valueOf(Cam3BottomCrop));
|
||||
prop.setProperty("Cam3LeftCrop", String.valueOf(Cam3LeftCrop));
|
||||
prop.setProperty("Cam3RightCrop", String.valueOf(Cam3RightCrop));
|
||||
prop.setProperty("Cam4TopCrop", String.valueOf(Cam4TopCrop));
|
||||
prop.setProperty("Cam4BottomCrop", String.valueOf(Cam4BottomCrop));
|
||||
prop.setProperty("Cam4LeftCrop", String.valueOf(Cam4LeftCrop));
|
||||
prop.setProperty("Cam4RightCrop", String.valueOf(Cam4RightCrop));
|
||||
prop.setProperty("Cam5TopCrop", String.valueOf(Cam5TopCrop));
|
||||
prop.setProperty("Cam5BottomCrop", String.valueOf(Cam5BottomCrop));
|
||||
prop.setProperty("Cam5LeftCrop", String.valueOf(Cam5LeftCrop));
|
||||
prop.setProperty("Cam5RightCrop", String.valueOf(Cam5RightCrop));
|
||||
|
||||
|
||||
try{
|
||||
prop.store(new FileOutputStream(Path.of(currentDirectory, "config.properties").toString()), null);
|
||||
Logger.info("Config Saved");
|
||||
@@ -647,4 +1096,23 @@ public class ConfigFile {
|
||||
Logger.error("Error Save Config: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private @Getter String FullQualityDirectory;
|
||||
private @Getter String FullQualityCropDirectory;
|
||||
private @Getter String CompressedDirectory;
|
||||
private @Getter String CompressedCropDirectory;
|
||||
private @Getter String ThumbsDirectory;
|
||||
|
||||
private void MakeDirectories(){
|
||||
FullQualityDirectory = Path.of(PhotoDirectory,"FullQuality").toString();
|
||||
FullQualityCropDirectory = Path.of(PhotoDirectory,"FullQualityCrop").toString();
|
||||
CompressedDirectory = Path.of(PhotoDirectory,"Compressed").toString();
|
||||
CompressedCropDirectory = Path.of(PhotoDirectory,"CompressedCrop").toString();
|
||||
ThumbsDirectory = Path.of(PhotoDirectory,"thumbs").toString();
|
||||
MakeDirectory(FullQualityDirectory);
|
||||
MakeDirectory(FullQualityCropDirectory);
|
||||
MakeDirectory(CompressedDirectory);
|
||||
MakeDirectory(CompressedCropDirectory);
|
||||
MakeDirectory(ThumbsDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,30 +3,50 @@ package Config;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import javafx.application.Platform;
|
||||
import javafx.embed.swing.SwingFXUtils;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.TextArea;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.image.Image;
|
||||
import lombok.val;
|
||||
import javafx.scene.image.PixelFormat;
|
||||
import javafx.scene.image.WritableImage;
|
||||
import javafx.stage.Stage;
|
||||
import lombok.NonNull;
|
||||
import org.bytedeco.javacv.Frame;
|
||||
import org.bytedeco.javacv.Java2DFrameConverter;
|
||||
import org.bytedeco.javacv.OpenCVFrameConverter;
|
||||
import org.bytedeco.opencv.global.opencv_core;
|
||||
import org.bytedeco.opencv.global.opencv_imgcodecs;
|
||||
import org.bytedeco.opencv.global.opencv_imgproc;
|
||||
import org.bytedeco.opencv.opencv_core.Mat;
|
||||
import org.bytedeco.opencv.opencv_core.Rect;
|
||||
import org.bytedeco.opencv.opencv_core.Size;
|
||||
import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
|
||||
import org.bytedeco.opencv.opencv_core.UMat;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.DataBufferByte;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.nio.file.attribute.FileTime;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static org.bytedeco.opencv.global.opencv_core.CV_64F;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class SomeCodes {
|
||||
@@ -37,6 +57,10 @@ public class SomeCodes {
|
||||
public static final Gson gson = new Gson();
|
||||
public static final ConfigFile config = new ConfigFile();
|
||||
|
||||
public static String GetDateTimeString(){
|
||||
return LocalDateTime.now().format(dtf);
|
||||
}
|
||||
|
||||
public static Path GetLogsPath(){
|
||||
return Path.of(currentDirectory, "logs");
|
||||
}
|
||||
@@ -88,12 +112,21 @@ public class SomeCodes {
|
||||
Mat resized = new Mat();
|
||||
opencv_imgproc.resize(mat, resized, new org.bytedeco.opencv.opencv_core.Size(width, height));
|
||||
BufferedImage img = converter.convert(matconverter.convert(resized));
|
||||
resized.release();
|
||||
return SwingFXUtils.toFXImage(img, null);
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
public static String RectToString(Rect rect){
|
||||
if (rect!=null){
|
||||
return "X:"+rect.x()+",Y:"+rect.y()+",W:"+rect.width()+",H:"+rect.height();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Find thumbfile in thumbs directory
|
||||
* @param sourcejpg source jpg file
|
||||
@@ -101,12 +134,7 @@ public class SomeCodes {
|
||||
*/
|
||||
public static String FindThumbfile(String sourcejpg){
|
||||
File sourcefile = new File(sourcejpg);
|
||||
Path thumbpath = Path.of(sourcefile.getParent(), "thumbs");
|
||||
try{
|
||||
if (!Files.exists(thumbpath)) Files.createDirectories(thumbpath);
|
||||
} catch (Exception e){
|
||||
Logger.error("Error creating thumbs directory: "+thumbpath+", Msg : "+e.getMessage());
|
||||
}
|
||||
Path thumbpath = Path.of(config.getThumbsDirectory());
|
||||
Path thumbfile = thumbpath.resolve(sourcefile.getName());
|
||||
if (Files.exists(thumbfile)){
|
||||
return thumbfile.toString();
|
||||
@@ -114,6 +142,27 @@ public class SomeCodes {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void Wait(int millis){
|
||||
try{
|
||||
Thread.sleep(millis);
|
||||
} catch (Exception e){
|
||||
Logger.error("Error waiting: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static void WaitAsync(long millis, String threadname, Consumer<Void> success){
|
||||
Thread thread = new Thread(()->{
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (Exception ignored){ }
|
||||
if (success != null) success.accept(null);
|
||||
});
|
||||
thread.setName(threadname);
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Make thumbfile from source jpg file
|
||||
* @param sourcejpg source jpg file
|
||||
@@ -124,23 +173,23 @@ public class SomeCodes {
|
||||
try{
|
||||
File ff = new File(sourcejpg);
|
||||
if (ff.exists()){
|
||||
Path thumbpath = Path.of(ff.getParent(), "thumbs");
|
||||
if (!Files.exists(thumbpath)) Files.createDirectories(thumbpath);
|
||||
String thumbfile = thumbpath.resolve(ff.getName()).toString();
|
||||
String thumbfile = Path.of(config.getPhotoDirectory(),"thumbs", ff.getName()).toString();
|
||||
File thumb = new File(thumbfile);
|
||||
if (thumb.exists()) return thumbfile;
|
||||
if (thumb.exists()) {
|
||||
return thumbfile;
|
||||
}
|
||||
|
||||
Mat source = opencv_imgcodecs.imread(sourcejpg);
|
||||
if (source!=null && !source.empty()){
|
||||
Mat resized = new Mat();
|
||||
opencv_imgproc.resize(source, resized, thumbsize);
|
||||
opencv_imgcodecs.imwrite(thumbfile, resized);
|
||||
Logger.info("Thumbfile created: "+thumbfile);
|
||||
resized.release();
|
||||
return thumbfile;
|
||||
} else Logger.info("MakeThumbfile failed, Source File not valid image : "+sourcejpg);
|
||||
} else Logger.info("MakeThumbfile failed, Source File not found: "+sourcejpg);
|
||||
}
|
||||
}
|
||||
} catch (Exception e){
|
||||
Logger.error("Error making thumbfile: "+sourcejpg+", Msg : "+e.getMessage());
|
||||
System.out.println("Error making thumbfile: "+sourcejpg+", Msg : "+e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -153,6 +202,79 @@ public class SomeCodes {
|
||||
return x.format(dtf);
|
||||
}
|
||||
|
||||
public static LocalDateTime StringToLocalDateTime(String x){
|
||||
if (ValidString(x)){
|
||||
try{
|
||||
return LocalDateTime.parse(x, dtf);
|
||||
} catch (Exception e){
|
||||
Logger.error("Error parsing date: "+x+", Msg : "+e.getMessage());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static LocalDateTime GetCreationTime(Path p){
|
||||
try{
|
||||
BasicFileAttributes attr = Files.readAttributes(p, BasicFileAttributes.class);
|
||||
FileTime ft = attr.creationTime();
|
||||
return LocalDateTime.ofInstant(ft.toInstant(), java.time.ZoneId.systemDefault());
|
||||
} catch (Exception e){
|
||||
Logger.error("Error getting creation time: "+p+", Msg : "+e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static @NonNull Path[] GetFilesInDirectory(String path) {
|
||||
if (ValidDirectory(path)) {
|
||||
try{
|
||||
return Files.list(Path.of(path))
|
||||
.filter(Files::isRegularFile)
|
||||
.toArray(Path[]::new);
|
||||
} catch (Exception ignored){}
|
||||
}
|
||||
return new Path[0];
|
||||
}
|
||||
|
||||
|
||||
public static boolean Delete(String... path){
|
||||
if (path!=null && path.length>0){
|
||||
Boolean[] result = new Boolean[path.length];
|
||||
for(int i=0; i<path.length; i++){
|
||||
try{
|
||||
result[i] = Files.deleteIfExists(Path.of(path[i]));
|
||||
if (result[i]) Logger.info("Delete: "+path[i]);
|
||||
} catch (Exception e){
|
||||
result[i] = false;
|
||||
Logger.error("Error deleting file: "+path[i]+", Msg : "+e.getMessage());
|
||||
}
|
||||
}
|
||||
return Arrays.stream(result).allMatch(x->x);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean Delete(Path... path){
|
||||
if (path!=null && path.length>0){
|
||||
Boolean[] result = new Boolean[path.length];
|
||||
for(int i=0; i<path.length; i++){
|
||||
try{
|
||||
result[i] = Files.deleteIfExists(path[i]);
|
||||
if (result[i]) Logger.info("Delete: "+path[i]);
|
||||
} catch (Exception e){
|
||||
result[i] = false;
|
||||
Logger.error("Error deleting file: "+path[i]+", Msg : "+e.getMessage());
|
||||
}
|
||||
}
|
||||
return Arrays.stream(result).allMatch(x->x);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract resource file to current directory
|
||||
* @param filename resource file name
|
||||
* @return extracted file path if success, or null if failed
|
||||
*/
|
||||
public static String ExtractResource(String filename){
|
||||
try{
|
||||
File destination = new File(currentDirectory, filename);
|
||||
@@ -171,6 +293,11 @@ public class SomeCodes {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if path is valid directory
|
||||
* @param path directory path
|
||||
* @return true if valid directory, false if not valid directory
|
||||
*/
|
||||
public static boolean ValidDirectory(String path){
|
||||
if (ValidString(path)){
|
||||
File ff = new File(path);
|
||||
@@ -179,10 +306,20 @@ public class SomeCodes {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if port number is valid
|
||||
* @param port port number
|
||||
* @return true if valid port number, false if not valid port number
|
||||
*/
|
||||
public static boolean ValidPortNumber(int port){
|
||||
return port>0 && port<65536;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert string to integer
|
||||
* @param x string
|
||||
* @return integer value if success, or 0 if failed
|
||||
*/
|
||||
public static int toInt(String x){
|
||||
try {
|
||||
return Integer.parseInt(x);
|
||||
@@ -191,6 +328,15 @@ public class SomeCodes {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean toBoolean(String x){
|
||||
return x!=null && x.equalsIgnoreCase("true");
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if string is valid IPV4 address
|
||||
* @param ipaddress IPV4 address
|
||||
* @return true if valid IPV4 address, false if not valid IPV4 address
|
||||
*/
|
||||
public static boolean ValidIPV4(String ipaddress){
|
||||
if (ValidString(ipaddress)){
|
||||
try{
|
||||
@@ -206,6 +352,11 @@ public class SomeCodes {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if string is valid IPV6 address
|
||||
* @param ipaddress IPV6 address
|
||||
* @return true if valid IPV6 address, false if not valid IPV6 address
|
||||
*/
|
||||
public static boolean ValidIPV6(String ipaddress){
|
||||
if (ValidString(ipaddress)){
|
||||
try{
|
||||
@@ -221,6 +372,11 @@ public class SomeCodes {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get file name from file path
|
||||
* @param filepath file path
|
||||
* @return file name if success, or empty string if failed
|
||||
*/
|
||||
public static String GetFileName(String filepath){
|
||||
if (ValidString(filepath)){
|
||||
File ff = new File(filepath);
|
||||
@@ -231,6 +387,11 @@ public class SomeCodes {
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if string is valid file
|
||||
* @param filename file name
|
||||
* @return true if valid file, false if not valid file
|
||||
*/
|
||||
public static boolean ValidFile(String filename){
|
||||
if (ValidString(filename)){
|
||||
File ff = new File(filename);
|
||||
@@ -239,13 +400,124 @@ public class SomeCodes {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean ValidString(String x){
|
||||
if (x!=null){
|
||||
return !x.isEmpty();
|
||||
/**
|
||||
* Read file as byte array
|
||||
* @param filename file name
|
||||
* @return byte array if success, or null if failed
|
||||
*/
|
||||
public static byte[] ReadFile(String filename){
|
||||
if (ValidFile(filename)){
|
||||
try{
|
||||
return Files.readAllBytes(Path.of(filename));
|
||||
} catch (Exception e){
|
||||
Logger.error("Error reading file: "+filename+", Msg : "+e.getMessage());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Resize Rect
|
||||
* @param original original Rect
|
||||
* @param scaleX scale factor
|
||||
* @param scaleY scale factor
|
||||
* @param Xoffset X offset, positive value to increase width, negative value to decrease width
|
||||
* @param Yoffset Y offset, positive value to increase height, negative value to decrease height
|
||||
* @return resized Rect if success, or null if failed
|
||||
*/
|
||||
public static Rect ResizeRect(Rect original, double scaleX, double scaleY, int Xoffset, int Yoffset){
|
||||
if (original!=null){
|
||||
int newX = (int)(original.x()*scaleX);
|
||||
newX -= Xoffset;
|
||||
if (newX<0) newX = 0;
|
||||
int newY = (int)(original.y()*scaleY);
|
||||
newY -= Yoffset;
|
||||
if (newY<0) newY = 0;
|
||||
int newWidth = (int)(original.width()*scaleX);
|
||||
newWidth += Xoffset*2;
|
||||
int newHeight = (int)(original.height()*scaleX);
|
||||
newHeight += Yoffset*2;
|
||||
return new Rect(newX, newY, newWidth, newHeight);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static UMat CropUMat(UMat source, Rect ROI){
|
||||
if (source!=null && !source.empty() && ValidROI(ROI)){
|
||||
int x = ROI.x();
|
||||
int y = ROI.y();
|
||||
int width = ROI.width();
|
||||
int height = ROI.height();
|
||||
|
||||
if (x>=0 && y>=0 && width>0 && height>0){
|
||||
if (x+width>source.cols()) width = source.cols()-x;
|
||||
if (y+height>source.rows()) height = source.rows()-y;
|
||||
if (width>0 && height>0){
|
||||
Rect crop = new Rect(x, y, width, height);
|
||||
return new UMat(source, crop);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean Save(UMat source, String filename, int[] param){
|
||||
if (source!=null && !source.empty() && ValidString(filename)){
|
||||
try{
|
||||
return opencv_imgcodecs.imwrite(filename, source, param);
|
||||
} catch (Exception e){
|
||||
Logger.error("Error saving file: "+filename+", Msg : "+e.getMessage());
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Concatenate byte arrays
|
||||
* @param args byte arrays
|
||||
* @return concatenated byte array if success, or null if failed
|
||||
*/
|
||||
public static byte[] Concat(byte[]... args){
|
||||
if (args!=null && args.length>0){
|
||||
int total = 0;
|
||||
for(byte[] x : args){
|
||||
if (x!=null && x.length>0){
|
||||
total += x.length;
|
||||
}
|
||||
}
|
||||
if (total>0){
|
||||
byte[] result = new byte[total];
|
||||
int offset = 0;
|
||||
for(byte[] x : args){
|
||||
if (x!=null && x.length>0){
|
||||
System.arraycopy(x, 0, result, offset, x.length);
|
||||
offset += x.length;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if string is valid
|
||||
* @param x string
|
||||
* @return true if valid, false if not valid
|
||||
*/
|
||||
public static boolean ValidString(String x){
|
||||
if (x!=null){
|
||||
return !x.isBlank();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Open picture in default viewer
|
||||
* @param filename picture file name
|
||||
*/
|
||||
public static void OpenPictureInDefaultViewer(String filename){
|
||||
try{
|
||||
File ff = new File(filename);
|
||||
@@ -275,20 +547,16 @@ public class SomeCodes {
|
||||
}
|
||||
|
||||
}
|
||||
public static CascadeClassifier faceDetector;
|
||||
public static void LoadFaceDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_frontalface_alt.xml");
|
||||
if (filename!=null) {
|
||||
if (faceDetector==null) {
|
||||
faceDetector = new CascadeClassifier(filename);
|
||||
Logger.info("FaceDetector loaded");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make array from string arguments
|
||||
* @param args string arguments
|
||||
* @return array of strings if success, or empty array if failed
|
||||
*/
|
||||
public static String[] MakeArray(String... args){
|
||||
if (args!=null && args.length>0){
|
||||
List<String> ll = new ArrayList<String>();
|
||||
List<String> ll = new ArrayList<>();
|
||||
for(String x : args){
|
||||
if (ValidString(x)) ll.add(x);
|
||||
}
|
||||
@@ -297,8 +565,346 @@ public class SomeCodes {
|
||||
return new String[0];
|
||||
}
|
||||
|
||||
public static boolean ValidBarCode(String value){
|
||||
if (value!=null && value.length()==10){
|
||||
boolean valid = true;
|
||||
for(int i=0; i<value.length(); i++){
|
||||
if (!Character.isDigit(value.charAt(i))){
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return valid;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Valid PatientID found
|
||||
* Patient ID is 10 digits number
|
||||
* @param patientid Patient ID
|
||||
* @return true if valid, false if not valid
|
||||
*/
|
||||
public static boolean ValidMedicalRecordId(String patientid){
|
||||
if (patientid!=null && !patientid.isBlank()){
|
||||
boolean valid = true;
|
||||
for(int i=0; i<patientid.length(); i++){
|
||||
if (!Character.isDigit(patientid.charAt(i))){
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return valid;
|
||||
} else return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Region of Interest is a valid Rect
|
||||
* @param ROI Region of Interest
|
||||
* @return true if valid, false if not valid
|
||||
*/
|
||||
public static boolean ValidROI(Rect ROI){
|
||||
if (ROI!=null){
|
||||
if (ROI.x()>=0){
|
||||
if (ROI.y()>=0){
|
||||
if (ROI.width()>0){
|
||||
return ROI.height() > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void Print(String... x){
|
||||
if (x != null){
|
||||
for(String xx : x){
|
||||
System.out.println(xx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Region of Interest is inside UMat
|
||||
* @param ROI Region of Interest
|
||||
* @param mat UMat
|
||||
* @return true if inside, false if not inside
|
||||
*/
|
||||
public static boolean ROIInsideUMat(Rect ROI, UMat mat){
|
||||
if (ValidROI(ROI)){
|
||||
if (mat!=null){
|
||||
return ROI.x()>=0 && ROI.y()>=0 &&
|
||||
ROI.x()+ROI.width()<=mat.cols() &&
|
||||
ROI.y()+ROI.height()<=mat.rows();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Region of Interest 1 is same with Region of Interest 2
|
||||
* @param ROI1 Region of Interest 1
|
||||
* @param ROI2 Region of Interest 2
|
||||
* @return true if same, false if different
|
||||
*/
|
||||
public static boolean IsSameROI(Rect ROI1, Rect ROI2){
|
||||
if (ValidROI(ROI1) && ValidROI(ROI2)){
|
||||
return ROI1.x()==ROI2.x() && ROI1.y()==ROI2.y() &&
|
||||
ROI1.width()==ROI2.width() && ROI1.height()==ROI2.height();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Rect 1 is inside Rect 2
|
||||
* @param smaller Rect 1
|
||||
* @param bigger Rect 2
|
||||
* @return true if inside, false if not inside
|
||||
*/
|
||||
public static boolean IsInsideRect(Rect smaller, Rect bigger){
|
||||
if (smaller!=null && bigger!=null){
|
||||
return smaller.x()>=bigger.x() && smaller.y()>=bigger.y() &&
|
||||
smaller.x()+smaller.width()<=bigger.x()+bigger.width() &&
|
||||
smaller.y()+smaller.height()<=bigger.y()+bigger.height();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make directory if not exists
|
||||
* @param path directory path
|
||||
*/
|
||||
public static void MakeDirectory(String path){
|
||||
if (ValidString(path)){
|
||||
File ff = new File(path);
|
||||
if (!ff.isDirectory()){
|
||||
try{
|
||||
Files.createDirectories(ff.toPath());
|
||||
Logger.info("Directory created: "+path);
|
||||
} catch (Exception e){
|
||||
Logger.info("Error creating directory: "+path+", Msg : "+e.getMessage());
|
||||
}
|
||||
} else Logger.info("Directory exists: "+path);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static short ToShort(String x){
|
||||
try{
|
||||
return Short.parseShort(x);
|
||||
} catch (Exception e){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public static void LabelSetText(Label lbl, String text, String style){
|
||||
if (lbl!=null){
|
||||
if (text!=null){
|
||||
if (text.equals(lbl.getText())) return;
|
||||
if (Platform.isFxApplicationThread()){
|
||||
lbl.setText(text);
|
||||
if (style!=null && !style.isBlank()){
|
||||
lbl.setStyle(style);
|
||||
}
|
||||
} else{
|
||||
Platform.runLater(()-> {
|
||||
lbl.setText(text);
|
||||
if (style!=null && !style.isBlank()){
|
||||
lbl.setStyle(style);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void TextAreaSetText(TextArea ta, String text){
|
||||
if (ta!=null){
|
||||
if (text!=null){
|
||||
if (text.equals(ta.getText())) return;
|
||||
if (Platform.isFxApplicationThread()){
|
||||
ta.setText(text);
|
||||
} else{
|
||||
Platform.runLater(()-> ta.setText(text));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void TextFieldSetText(TextField tf, String text){
|
||||
if (tf!=null){
|
||||
if (text!=null){
|
||||
if (text.equals(tf.getText())) return;
|
||||
if (Platform.isFxApplicationThread()){
|
||||
tf.setText(text);
|
||||
} else{
|
||||
Platform.runLater(()-> tf.setText(text));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public static void LabelVisible(Label label, boolean visible){
|
||||
if (label!=null){
|
||||
if (visible){
|
||||
if (Platform.isFxApplicationThread()){
|
||||
label.setVisible(true);
|
||||
} else{
|
||||
Platform.runLater(()-> label.setVisible(true));
|
||||
}
|
||||
} else {
|
||||
if (Platform.isFxApplicationThread()){
|
||||
label.setVisible(false);
|
||||
} else{
|
||||
Platform.runLater(()-> label.setVisible(false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ShowAlert(Alert.AlertType type, String title, String header, String content){
|
||||
Alert alert = new Alert(type);
|
||||
alert.setTitle(title);
|
||||
alert.setHeaderText(header);
|
||||
alert.setContentText(content);
|
||||
alert.showAndWait();
|
||||
}
|
||||
|
||||
public static double CalculateSharpness(String filename){
|
||||
if (ValidFile(filename)){
|
||||
try(Mat mat = opencv_imgcodecs.imread(filename)){
|
||||
return CalculateSharpness(mat);
|
||||
} catch (Exception e){
|
||||
Logger.error("Error calculating sharpness: "+filename+", Msg : "+e.getMessage());
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static double FindLowestValue(double... values){
|
||||
if (values!=null && values.length>0){
|
||||
double lowest = values[0];
|
||||
for(double x : values){
|
||||
if (x>=0){
|
||||
if (x<lowest){
|
||||
lowest = x;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return lowest;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static boolean ValidDouble(String x){
|
||||
try{
|
||||
double xx = Double.parseDouble(x);
|
||||
return true;
|
||||
} catch (Exception ignored){
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate sharpness of image
|
||||
* @param mat image in UMat format, expected in gray scale
|
||||
* @return sharpness value
|
||||
*/
|
||||
public static double CalculateSharpness(Mat mat){
|
||||
|
||||
if (mat!=null && !mat.empty()){
|
||||
if (mat.channels()!=1){
|
||||
Mat grey = new Mat();
|
||||
opencv_imgproc.cvtColor(mat, grey, opencv_imgproc.COLOR_BGR2GRAY);
|
||||
mat = grey;
|
||||
}
|
||||
|
||||
opencv_imgproc.equalizeHist(mat, mat);
|
||||
|
||||
Mat laplacian = new Mat();
|
||||
|
||||
opencv_imgproc.Laplacian(mat, laplacian, CV_64F);
|
||||
|
||||
Mat mean = new Mat(1,1, CV_64F);
|
||||
Mat stddev = new Mat(1,1, CV_64F);
|
||||
|
||||
opencv_core.meanStdDev(laplacian, mean, stddev);
|
||||
|
||||
Mat _std = new Mat();
|
||||
stddev.copyTo(_std);
|
||||
|
||||
double value = _std.createIndexer().getDouble(0,0);
|
||||
_std.release();
|
||||
laplacian.release();
|
||||
return Math.pow(value,2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static boolean IsBlurred(Mat mat, double threshold){
|
||||
return CalculateSharpness(mat)<threshold;
|
||||
}
|
||||
|
||||
public static Image MatToImage(Mat mat){
|
||||
Frame frame = matconverter.convert(mat);
|
||||
BufferedImage bufferedImage = matToBufferedImage(mat);
|
||||
return SwingFXUtils.toFXImage(bufferedImage, null);
|
||||
}
|
||||
|
||||
|
||||
public static WritableImage matToWritableImage(Mat mat){
|
||||
int cols = mat.cols();
|
||||
int rows = mat.rows();
|
||||
WritableImage writableImage = new WritableImage(cols, rows);
|
||||
ByteBuffer buffer = mat.createBuffer();
|
||||
PixelFormat<ByteBuffer> pixelFormat = PixelFormat.getByteRgbInstance();
|
||||
writableImage.getPixelWriter().setPixels(0, 0, cols, rows, pixelFormat, buffer, cols * 3);
|
||||
return writableImage;
|
||||
}
|
||||
|
||||
public static BufferedImage matToBufferedImage(Mat mat){
|
||||
int type = BufferedImage.TYPE_BYTE_GRAY;
|
||||
if (mat.channels() > 1) {
|
||||
type = BufferedImage.TYPE_3BYTE_BGR;
|
||||
}
|
||||
BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), type);
|
||||
byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
|
||||
|
||||
mat.data().get(data);
|
||||
return image;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close Stage if not null
|
||||
* and wait until closed
|
||||
* @param obj Stage object to close
|
||||
*/
|
||||
public static void closeStage(Stage obj) throws InterruptedException {
|
||||
if (obj != null) {
|
||||
if (Platform.isFxApplicationThread()) {
|
||||
// Already on FX thread, just close directly
|
||||
obj.close();
|
||||
} else {
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
Platform.runLater(() -> {
|
||||
try {
|
||||
obj.close();
|
||||
} finally {
|
||||
latch.countDown();
|
||||
}
|
||||
});
|
||||
// Wait for runLater task to finish
|
||||
latch.await();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
125
src/main/java/Database/PhotoCleaner.java
Normal file
125
src/main/java/Database/PhotoCleaner.java
Normal file
@@ -0,0 +1,125 @@
|
||||
package Database;
|
||||
|
||||
import Config.SomeCodes;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* PhotoCleaner class
|
||||
* Responsible for deleting photos older than a certain number of days
|
||||
*/
|
||||
public class PhotoCleaner {
|
||||
private final int days;
|
||||
private final boolean[] started;
|
||||
|
||||
/**
|
||||
* PhotoCleaner constructor
|
||||
* @param days how many days old photos to delete
|
||||
*/
|
||||
public PhotoCleaner(int days){
|
||||
this.days = days;
|
||||
this.started = new boolean[]{false};
|
||||
}
|
||||
|
||||
/**
|
||||
* Start PhotoCleaner Thread
|
||||
*/
|
||||
@SuppressWarnings("BusyWait")
|
||||
public void Start(){
|
||||
Thread thread = new Thread(() -> {
|
||||
started[0] = true;
|
||||
while (started[0]) {
|
||||
try {
|
||||
System.out.println("Rechecking Database for older photos...");
|
||||
// Delete photos older than the specified number of days
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
// delete from database
|
||||
Thread sqldelete = new Thread(()->{
|
||||
Sqlite sql = new Sqlite();
|
||||
PhotoReviewClass[] prcs = sql.GetAll();
|
||||
for (PhotoReviewClass prc : prcs) {
|
||||
if (!started[0]) break;
|
||||
if (prc != null && prc.getDateTime() != null) {
|
||||
LocalDateTime ldt = SomeCodes.StringToLocalDateTime(prc.getDateTime());
|
||||
if (ldt!=null){
|
||||
if (ldt.isBefore(now.minusDays(days))) {
|
||||
SomeCodes.Delete(prc.fullres());
|
||||
SomeCodes.Delete(prc.cropped());
|
||||
SomeCodes.Delete(prc.compressed());
|
||||
SomeCodes.Delete(prc.compressedcrop());
|
||||
SomeCodes.Delete(prc.thumbnails());
|
||||
sql.Delete(prc);
|
||||
Logger.info("Deleted PhotoReviewClass: " + prc.getDateTime() + " " + prc.getPrefix());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
RunThread(sqldelete, "DeleteFromDatabase");
|
||||
|
||||
// delete from disk
|
||||
Thread deletefullres = new Thread(new DiskDeleter(SomeCodes.config.getFullQualityDirectory()));
|
||||
RunThread(deletefullres, "DeleteFullRes");
|
||||
Thread deletefullrescrop = new Thread(new DiskDeleter(SomeCodes.config.getFullQualityCropDirectory()));
|
||||
RunThread(deletefullrescrop, "DeleteFullResCrop");
|
||||
Thread deletecompressed = new Thread(new DiskDeleter(SomeCodes.config.getCompressedDirectory()));
|
||||
RunThread(deletecompressed, "DeleteCompressed");
|
||||
Thread deletecompressedcrop = new Thread(new DiskDeleter(SomeCodes.config.getCompressedCropDirectory()));
|
||||
RunThread(deletecompressedcrop, "DeleteCompressedCrop");
|
||||
Thread deletethumbnails = new Thread(new DiskDeleter(SomeCodes.config.getThumbsDirectory()));
|
||||
RunThread(deletethumbnails, "DeleteThumbnails");
|
||||
|
||||
|
||||
// Sleep for 1 hour
|
||||
Thread.sleep(60 * 60 * 1000);
|
||||
} catch (Exception e) {
|
||||
Logger.error("Error in PhotoCleaner Thread: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
System.out.println("PhotoCleaner stopped");
|
||||
});
|
||||
thread.setName("PhotoCleaner Thread");
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
private void RunThread(Thread thread, String name){
|
||||
thread.setName(name);
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
class DiskDeleter implements Runnable{
|
||||
private final String path;
|
||||
private final LocalDateTime now ;
|
||||
public DiskDeleter(String path){
|
||||
this.path = path;
|
||||
this.now = LocalDateTime.now();
|
||||
}
|
||||
public void run(){
|
||||
Path[] ppp = SomeCodes.GetFilesInDirectory(path);
|
||||
if (ppp != null){
|
||||
for(Path p : ppp){
|
||||
if (!started[0]) break;
|
||||
LocalDateTime ldt = SomeCodes.GetCreationTime(p);
|
||||
if (ldt != null) {
|
||||
if (ldt.isBefore(now.minusDays(days))) {
|
||||
SomeCodes.Delete(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop PhotoCleaner Thread
|
||||
*/
|
||||
public void Stop(){
|
||||
started[0] = false;
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,8 @@ package Database;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static Config.SomeCodes.MakeArray;
|
||||
|
||||
@Data
|
||||
@@ -10,10 +12,25 @@ public class PhotoReviewClass {
|
||||
private String DateTime;
|
||||
private String Prefix;
|
||||
private String FileLeft90;
|
||||
private String CompressedLeft90;
|
||||
private String CroppedLeft90;
|
||||
private String CompressedCropLeft90;
|
||||
private String FileLeft45;
|
||||
private String CompressedLeft45;
|
||||
private String CroppedLeft45;
|
||||
private String CompressedCropLeft45;
|
||||
private String FileCenter;
|
||||
private String CompressedCenter;
|
||||
private String CroppedCenter;
|
||||
private String CompressedCropCenter;
|
||||
private String FileRight45;
|
||||
private String CompressedRight45;
|
||||
private String CroppedRight45;
|
||||
private String CompressedCropRight45;
|
||||
private String FileRight90;
|
||||
private String CompressedRight90;
|
||||
private String CroppedRight90;
|
||||
private String CompressedCropRight90;
|
||||
private String ThumbLeft90;
|
||||
private String ThumbLeft45;
|
||||
private String ThumbCenter;
|
||||
@@ -52,16 +69,49 @@ public class PhotoReviewClass {
|
||||
this.ThumbRight90 = ThumbRight90;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return "id: "+id+"\r\nDateTime: "+DateTime+"\r\nPrefix: "+Prefix+"\r\nFileLeft90: "+FileLeft90+"\r\nFileLeft45: "+FileLeft45+"\r\nFileCenter: "+FileCenter+"\r\nFileRight45: "+FileRight45+"\r\nFileRight90: "+FileRight90+"\r\nThumbLeft90: "+ThumbLeft90+"\r\nThumbLeft45: "+ThumbLeft45+"\r\nThumbCenter: "+ThumbCenter+"\r\nThumbRight45: "+ThumbRight45+"\r\nThumbRight90: "+ThumbRight90;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all files that are not null
|
||||
* Get all Full Resolution files that are not null
|
||||
* @return array of files
|
||||
*/
|
||||
public String[] files(){
|
||||
public String[] fullres(){
|
||||
return MakeArray(FileLeft90, FileLeft45, FileCenter, FileRight45, FileRight90);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all Thumbnail files that are not null
|
||||
* @return array of files
|
||||
*/
|
||||
public String[] thumbnails(){
|
||||
return MakeArray(ThumbLeft90, ThumbLeft45, ThumbCenter, ThumbRight45, ThumbRight90);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all Compressed files that are not null
|
||||
* @return array of files
|
||||
*/
|
||||
public String[] compressed(){
|
||||
return MakeArray(CompressedLeft90, CompressedLeft45, CompressedCenter, CompressedRight45, CompressedRight90);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all Cropped full resolution files that are not null
|
||||
* @return array of files
|
||||
*/
|
||||
public String[] cropped(){
|
||||
return MakeArray(CroppedLeft90, CroppedLeft45, CroppedCenter, CroppedRight45, CroppedRight90);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all Cropped compressed files that are not null
|
||||
* @return array of files
|
||||
*/
|
||||
public String[] compressedcrop(){
|
||||
return MakeArray(CompressedCropLeft90, CompressedCropLeft45, CompressedCropCenter, CompressedCropRight45, CompressedCropRight90);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ package Database;
|
||||
import static Config.SomeCodes.LocalDateTimeToString;
|
||||
import static Config.SomeCodes.ValidString;
|
||||
|
||||
import lombok.val;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.sql.*;
|
||||
@@ -45,7 +44,28 @@ public class Sqlite {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete PhotoReviewClass object from database
|
||||
* @param pr PhotoReviewClass objects
|
||||
*/
|
||||
public void Delete(PhotoReviewClass... pr){
|
||||
if (pr!=null && pr.length>0){
|
||||
try{
|
||||
Connection conn = GetConnection();
|
||||
if (conn != null){
|
||||
for (PhotoReviewClass photo : pr) {
|
||||
PreparedStatement stmt = conn.prepareStatement("DELETE FROM photos WHERE id = ?");
|
||||
stmt.setInt(1, photo.getId());
|
||||
stmt.execute();
|
||||
}
|
||||
conn.close();
|
||||
Logger.info("Data deleted successfully");
|
||||
} else Logger.info("Delete failed, connection is null");
|
||||
} catch (Exception e){
|
||||
Logger.error("Error deleting data: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all PhotoReviewClass object from database
|
||||
@@ -107,7 +127,6 @@ public class Sqlite {
|
||||
try{
|
||||
Connection conn = GetConnection();
|
||||
if (conn != null){
|
||||
|
||||
PreparedStatement stmt = conn.prepareStatement("INSERT INTO photos (DateTime, Prefix, FileLeft90, FileLeft45, FileCenter, FileRight45, FileRight90, ThumbLeft90, ThumbLeft45, ThumbCenter, ThumbRight45, ThumbRight90 ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
stmt.setString(1, LocalDateTimeToString(LocalDateTime.now()));
|
||||
stmt.setString(2, ValidString(prefix)?prefix:"");
|
||||
|
||||
10
src/main/java/ErhaAPI/BarcodeHttpResult.java
Normal file
10
src/main/java/ErhaAPI/BarcodeHttpResult.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package ErhaAPI;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class BarcodeHttpResult {
|
||||
private int statusCode;
|
||||
private String body;
|
||||
private BarcodeResult result;
|
||||
}
|
||||
29
src/main/java/ErhaAPI/BarcodeResult.java
Normal file
29
src/main/java/ErhaAPI/BarcodeResult.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package ErhaAPI;
|
||||
|
||||
|
||||
public class BarcodeResult {
|
||||
public int currentPage;
|
||||
public int limit;
|
||||
public int totalPages;
|
||||
public int totalRecords;
|
||||
public String message;
|
||||
public boolean error;
|
||||
public String errorId;
|
||||
public String errorMessage;
|
||||
public String errorCode;
|
||||
public PatientRecord[] data;
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("currentPage : ").append(currentPage).append(", limit : ").append(limit).append(", totalPages : ").append(totalPages).append(", totalRecords : ").append(totalRecords).append(", message : ").append(message).append(", error : ").append(error);
|
||||
if (data != null){
|
||||
sb.append(", data : [");
|
||||
for (PatientRecord pr : data){
|
||||
sb.append(pr.toString()).append(", ");
|
||||
}
|
||||
sb.append("]");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
236
src/main/java/ErhaAPI/ErhaAPI.java
Normal file
236
src/main/java/ErhaAPI/ErhaAPI.java
Normal file
@@ -0,0 +1,236 @@
|
||||
package ErhaAPI;
|
||||
|
||||
import Config.SomeCodes;
|
||||
import com.google.gson.Gson;
|
||||
import lombok.Getter;
|
||||
import lombok.NonNull;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.ConnectException;
|
||||
import java.net.URI;
|
||||
import java.net.UnknownHostException;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.net.http.HttpTimeoutException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Base64;
|
||||
import java.util.UUID;
|
||||
|
||||
import static Config.SomeCodes.*;
|
||||
|
||||
|
||||
public class ErhaAPI {
|
||||
private @Getter String API_USERNAME = "erha-pb-001";
|
||||
private @Getter String API_PASSWORD = "bM0tH!s";
|
||||
|
||||
|
||||
|
||||
private String auth;
|
||||
private String API_URL="";
|
||||
|
||||
private final Gson gson = new Gson();
|
||||
|
||||
/**
|
||||
* Create Erha API object
|
||||
* @param isProduction if true will use Production URL, if false will use Staging URL
|
||||
*/
|
||||
public ErhaAPI(boolean isProduction){
|
||||
setProduction(isProduction);
|
||||
}
|
||||
|
||||
public void setProduction(boolean isProduction){
|
||||
final String API_URL_PROD = "https://connect-api.aryanoble.co.id/api";
|
||||
final String API_URL_STAGING = "https://connect-api-staging.aryanoble.web.id/api";
|
||||
if (isProduction){
|
||||
if (!API_URL.equals(API_URL_PROD)){
|
||||
API_URL = API_URL_PROD;
|
||||
update_auth();
|
||||
}
|
||||
} else {
|
||||
if (!API_URL.equals(API_URL_STAGING)){
|
||||
API_URL = API_URL_STAGING;
|
||||
update_auth();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set API Username
|
||||
* @param API_USERNAME API Username
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public void setAPI_USERNAME(String API_USERNAME){
|
||||
if (ValidString(API_USERNAME)){
|
||||
if (!API_USERNAME.equals(this.API_USERNAME)){
|
||||
this.API_USERNAME = API_USERNAME;
|
||||
update_auth();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set API Password
|
||||
* @param API_PASSWORD API Password
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public void setAPI_PASSWORD(String API_PASSWORD){
|
||||
if (ValidString(API_PASSWORD)){
|
||||
if (!API_PASSWORD.equals(this.API_PASSWORD)){
|
||||
this.API_PASSWORD = API_PASSWORD;
|
||||
update_auth();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate Barcode data
|
||||
* @param Barcode Barcode to verify
|
||||
* @return BarcodeHttpResult object
|
||||
*/
|
||||
public @NonNull BarcodeHttpResult Validate_Barcode(String Barcode, boolean printdebug){
|
||||
BarcodeHttpResult bhr = new BarcodeHttpResult();
|
||||
if (ValidBarCode(Barcode)){
|
||||
System.out.println("Checking Barcode : " + Barcode +" on "+(config.isProduction()?"Production":"Staging")+" API " );
|
||||
try (HttpClient client = HttpClient.newHttpClient()) {
|
||||
int medical_record_detail_id = toInt(Barcode);
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(java.net.URI.create(API_URL+"/photobooth/photobooth/" + medical_record_detail_id))
|
||||
.header("Authorization", "Basic " + auth)
|
||||
.GET()
|
||||
.build();
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
|
||||
bhr.setStatusCode(response.statusCode());
|
||||
bhr.setBody(response.body());
|
||||
|
||||
if (response.statusCode()==200){
|
||||
String body = response.body();
|
||||
if (printdebug){
|
||||
System.out.println("Validate_Barcode status code : " + response.statusCode());
|
||||
System.out.println("Validate_Barcode HTTP body : ");
|
||||
System.out.println(body);
|
||||
}
|
||||
BarcodeResult brr = gson.fromJson(body, BarcodeResult.class);
|
||||
bhr.setResult(brr);
|
||||
} else {
|
||||
Logger.error("Validate_Barcode failed, status code : " , response.statusCode());
|
||||
}
|
||||
|
||||
} catch (UnknownHostException e) {
|
||||
// no internet or no DNS
|
||||
Logger.error("Validate_Barcode UnknownHostException, Msg : " , e.getMessage());
|
||||
bhr.setStatusCode(0);
|
||||
bhr.setBody("No internet connection or DNS error");
|
||||
} catch (ConnectException e) {
|
||||
// connection refused
|
||||
Logger.error("Validate_Barcode ConnectException , Msg : " , e.getMessage());
|
||||
bhr.setStatusCode(-1);
|
||||
bhr.setBody("Connection refused");
|
||||
} catch( HttpTimeoutException e){
|
||||
// timeout
|
||||
Logger.error("Validate_Barcode HttpTimeoutException, Msg : " , e.getMessage());
|
||||
bhr.setStatusCode(408);
|
||||
bhr.setBody("Http Request timeout");
|
||||
} catch (IOException | InterruptedException e) {
|
||||
// generic network error
|
||||
Logger.error("Validate_Barcode IOException/InterruptedException, Msg : " , e.getMessage());
|
||||
bhr.setStatusCode(-2);
|
||||
bhr.setBody("Network error: " + e.getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
return bhr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Upload File
|
||||
* @param patientID Patient ID
|
||||
* @param filename File to upload
|
||||
* @return UploadHttpResult object
|
||||
*/
|
||||
public @NonNull UploadHttpResult Upload_File(String patientID, String filename, boolean printdebug) {
|
||||
UploadHttpResult uhr = new UploadHttpResult();
|
||||
if (ValidMedicalRecordId(patientID)){
|
||||
int medical_record_detail_id = toInt(patientID);
|
||||
if (ValidFile(filename)){
|
||||
File ff = new File(filename);
|
||||
try (HttpClient client = HttpClient.newHttpClient()){
|
||||
byte[] fileBytes = Files.readAllBytes(new java.io.File(filename).toPath());
|
||||
String fn = ff.getName();
|
||||
// Unique boundary for multipart data
|
||||
String boundary = "----JavaHttpClientBoundary" + UUID.randomUUID();
|
||||
String CRLF = "\r\n";
|
||||
|
||||
// Form Data (Text Field)
|
||||
String formData1 = "--" + boundary + CRLF +
|
||||
"Content-Disposition: form-data; name=\"medical_record_detail_id\"" + CRLF + CRLF +
|
||||
medical_record_detail_id + CRLF;
|
||||
|
||||
// Form Data (File)
|
||||
String formData2 = "--" + boundary + CRLF +
|
||||
"Content-Disposition: form-data; name=\"file\"; filename=\"" + fn + "\"" + CRLF +
|
||||
"Content-Type: image/jpeg" + CRLF + CRLF; // Change Content-Type accordingly
|
||||
|
||||
// End Boundary
|
||||
String endBoundary = CRLF + "--" + boundary + "--" + CRLF;
|
||||
|
||||
// Combine all parts into a single byte array
|
||||
byte[] multipartData = SomeCodes.Concat(
|
||||
formData1.getBytes(),
|
||||
formData2.getBytes(),
|
||||
fileBytes,
|
||||
endBoundary.getBytes()
|
||||
);
|
||||
|
||||
System.out.println("Uploading file : " + filename + " to " + (config.isProduction()?"Production":"Staging")+" API ");
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI(API_URL + "/photobooth/photobooth"))
|
||||
.header("Authorization", "Basic " + auth)
|
||||
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
|
||||
.POST(HttpRequest.BodyPublishers.ofByteArray(multipartData))
|
||||
.build();
|
||||
|
||||
// Send request
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
uhr.setStatusCode(response.statusCode());
|
||||
uhr.setBody(response.body());
|
||||
if (printdebug){
|
||||
System.out.println("Upload_File status code : " + response.statusCode());
|
||||
System.out.println("Upload_File HTTP body : ");
|
||||
System.out.println(response.body());
|
||||
}
|
||||
|
||||
|
||||
if (response.statusCode()==200){
|
||||
UploadResult ur = gson.fromJson(response.body(), UploadResult.class);
|
||||
uhr.setResult(ur);
|
||||
|
||||
} else {
|
||||
Logger.error("Upload_File file ",filename," failed, status code : " , response.statusCode());
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception e){
|
||||
Logger.error("Upload_File file ",filename," failed, Exception, Msg : " , e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
return uhr;
|
||||
}
|
||||
|
||||
|
||||
private void update_auth(){
|
||||
auth = Base64.getEncoder().encodeToString((API_USERNAME + ":" + API_PASSWORD).getBytes());
|
||||
}
|
||||
|
||||
}
|
||||
23
src/main/java/ErhaAPI/PatientRecord.java
Normal file
23
src/main/java/ErhaAPI/PatientRecord.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package ErhaAPI;
|
||||
|
||||
public class PatientRecord {
|
||||
public String medical_record_detail_id;
|
||||
public String medical_staff_id;
|
||||
public String medical_staff_name;
|
||||
public String branch_id;
|
||||
public String branch_code;
|
||||
public String branch_name;
|
||||
public String registration_id;
|
||||
public String registration_date;
|
||||
public String patient_id;
|
||||
public String mrnl;
|
||||
public String name;
|
||||
public String phone;
|
||||
public String birthdate;
|
||||
public String service;
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return "medical_record_detail_id : " + medical_record_detail_id + ", medical_staff_id : " + medical_staff_id + ", medical_staff_name : " + medical_staff_name + ", branch_id : " + branch_id + ", branch_code : " + branch_code + ", branch_name : " + branch_name + ", registration_id : " + registration_id + ", registration_date : " + registration_date + ", patient_id : " + patient_id + ", mrnl : " + mrnl + ", name : " + name + ", phone : " + phone + ", birthdate : " + birthdate + ", service : " + service;
|
||||
}
|
||||
}
|
||||
48
src/main/java/ErhaAPI/PhotoResult.java
Normal file
48
src/main/java/ErhaAPI/PhotoResult.java
Normal file
@@ -0,0 +1,48 @@
|
||||
package ErhaAPI;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bytedeco.opencv.opencv_core.Rect;
|
||||
|
||||
@Getter @Setter
|
||||
public class PhotoResult {
|
||||
private final String cameraname;
|
||||
private String fullres;
|
||||
private String compressedfile;
|
||||
private String fullcrop;
|
||||
private String compressedcrop;
|
||||
private String thumbnail;
|
||||
private Rect BestROI;
|
||||
private Rect ReducedROI;
|
||||
private double sharpscore;
|
||||
public PhotoResult(String cameraname){
|
||||
this.cameraname = cameraname;
|
||||
this.fullres = "";
|
||||
this.compressedfile = "";
|
||||
this.fullcrop = "";
|
||||
this.compressedcrop = "";
|
||||
this.thumbnail = "";
|
||||
this.BestROI = null;
|
||||
this.ReducedROI = null;
|
||||
}
|
||||
public PhotoResult(String cameraname,String fullres, String compressedfile, String fullcrop, String compressedcrop, String thumbnail){
|
||||
this.cameraname = cameraname;
|
||||
this.fullres = fullres;
|
||||
this.compressedfile = compressedfile;
|
||||
this.fullcrop = fullcrop;
|
||||
this.compressedcrop = compressedcrop;
|
||||
this.thumbnail = thumbnail;
|
||||
this.BestROI = null;
|
||||
this.ReducedROI = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return "Camera Name: " + cameraname + "\n" +
|
||||
"Full Resolution: " + fullres + "\n" +
|
||||
"Compressed File: " + compressedfile + "\n" +
|
||||
"Full Crop: " + fullcrop + "\n" +
|
||||
"Compressed Crop: " + compressedcrop + "\n" +
|
||||
"Thumbnail: " + thumbnail + "\n";
|
||||
}
|
||||
}
|
||||
10
src/main/java/ErhaAPI/UploadHttpResult.java
Normal file
10
src/main/java/ErhaAPI/UploadHttpResult.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package ErhaAPI;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UploadHttpResult {
|
||||
int statusCode;
|
||||
String body;
|
||||
UploadResult result;
|
||||
}
|
||||
18
src/main/java/ErhaAPI/UploadResult.java
Normal file
18
src/main/java/ErhaAPI/UploadResult.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package ErhaAPI;
|
||||
|
||||
public class UploadResult {
|
||||
public int currentPage;
|
||||
public int limit;
|
||||
public int totalPages;
|
||||
public int totalRecords;
|
||||
public boolean error;
|
||||
public String errorId;
|
||||
public String errorMessage;
|
||||
public String errorCode;
|
||||
public String message;
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return "message : " + message + ", error : " + error + ", errorId : " + errorId + ", errorMessage : " + errorMessage + ", errorCode : " + errorCode ;
|
||||
}
|
||||
}
|
||||
107
src/main/java/SecureDongle/LibSecureDongle.java
Normal file
107
src/main/java/SecureDongle/LibSecureDongle.java
Normal file
@@ -0,0 +1,107 @@
|
||||
package SecureDongle;
|
||||
|
||||
import com.sun.jna.Library;
|
||||
import com.sun.jna.Native;
|
||||
|
||||
public interface LibSecureDongle extends Library {
|
||||
LibSecureDongle Instance = (LibSecureDongle) Native.load("SecureDongleJ", LibSecureDongle.class);
|
||||
short SD_FIND=1;
|
||||
short SD_FIND_NEXT=2;
|
||||
short SD_OPEN=3;
|
||||
short SD_CLOSE=4;
|
||||
short SD_READ=5;
|
||||
short SD_WRITE=6;
|
||||
short SD_RANDOM=7;
|
||||
short SD_SEED=8;
|
||||
short SD_WRITE_USERID=9;
|
||||
short SD_READ_USERID=10;
|
||||
short SD_SET_MODULE=11;
|
||||
short SD_CHECK_MODULE=12;
|
||||
short SD_WRITE_ARITHMETIC=13;
|
||||
short SD_CALCULATE1=14;
|
||||
short SD_CALCULATE2=15;
|
||||
short SD_CALCULATE3=16;
|
||||
short SD_DECREASE=17;
|
||||
|
||||
short SD_SET_RSAKEY_N=29;
|
||||
short SD_SET_RSAKEY_D=30;
|
||||
|
||||
short SD_SET_DES_KEY=41;
|
||||
short SD_DES_ENC=42;
|
||||
short SD_DES_DEC=43;
|
||||
short SD_RSA_ENC=44;
|
||||
short SD_RSA_DEC=45;
|
||||
|
||||
short SD_READ_EX=46;
|
||||
short SD_WRITE_EX=47;
|
||||
|
||||
short SD_SET_COUNTER_EX=160;
|
||||
short SD_GET_COUNTER_EX=161;
|
||||
short SD_SET_TIMER_EX=162;
|
||||
short SD_GET_TIMER_EX=163;
|
||||
short SD_ADJUST_TIMER_EX=164;
|
||||
short SD_UPDATE_GEN_HEADER_EX=165;
|
||||
short SD_UPDATE_GEN_EX=166;
|
||||
short SD_UPDATE_CHECK_EX=167;
|
||||
short SD_UPDATE_EX=168;
|
||||
short SD_SET_UPDATE_KEY=169;
|
||||
short SD_ADD_UPDATE_HEADER=170;
|
||||
short SD_ADD_UPDATE_CONTENT=171;
|
||||
short SD_GET_TIME_DWORD=172;
|
||||
|
||||
short SD_VERSION=100;
|
||||
|
||||
short DES_SINGLE_MODE=0;
|
||||
short DES_TRIPLE_MODE=1;
|
||||
short RSA_PRIVATE_KEY=0;
|
||||
short RSA_PUBLIC_KEY=1;
|
||||
short RSA_SECUREDONGLE_PADDING=0;
|
||||
short RSA_USER_PADDING=1;
|
||||
|
||||
//error code
|
||||
short ERR_SUCCESS=0;
|
||||
short ERR_NO_ROCKEY=3;
|
||||
short ERR_INVALID_PASSWORD=4;
|
||||
short ERR_INVALID_PASSWORD_OR_ID=5;
|
||||
short ERR_SETID=6;
|
||||
short ERR_INVALID_ADDR_OR_SIZE=7;
|
||||
short ERR_UNKNOWN_COMMAND=8;
|
||||
short ERR_NOTBELEVEL3=9;
|
||||
short ERR_READ=10;
|
||||
short ERR_WRITE=11;
|
||||
short ERR_RANDOM=12;
|
||||
short ERR_SEED=13;
|
||||
short ERR_CALCULATE=14;
|
||||
short ERR_NO_OPEN=15;
|
||||
short ERR_OPEN_OVERFLOW=16;
|
||||
short ERR_NOMORE=17;
|
||||
short ERR_NEED_FIND=18;
|
||||
short ERR_DECREASE=19;
|
||||
short ERR_AR_BADCOMMAND=20;
|
||||
short ERR_AR_UNKNOWN_OPCODE=21;
|
||||
short ERR_AR_WRONGBEGIN=22;
|
||||
short ERR_AR_WRONG_END=23;
|
||||
short ERR_AR_VALUEOVERFLOW=24;
|
||||
|
||||
short ERR_TOOMUCHTHREAD=25;
|
||||
short ERR_INVALID_SD=30;
|
||||
short ERR_INVALID_PARAMETER=31;
|
||||
short ERR_INVALID_TIMEVALUE=32;
|
||||
|
||||
short ERR_SET_DES_KEY=40;
|
||||
short ERR_DES_ENCRYPT=41;
|
||||
short ERR_DES_DECRYPT=42;
|
||||
short ERR_SET_RSAKEY_N=43;
|
||||
short ERR_SET_RSAKEY_D=44;
|
||||
short ERR_RSA_ENCRYPT=45;
|
||||
short ERR_RSA_DECRYPT=46;
|
||||
short ERR_INVALID_LENGTH=47;
|
||||
|
||||
short ERR_UNKNOWN=-1;
|
||||
short ERR_RECEIVE_NULL=256;
|
||||
short ERR_INVALID_BUFFER=257;
|
||||
short ERR_UNKNOWN_SYSTEM=258;
|
||||
short ERR_UNINIT_TIME_UNIT=259;
|
||||
|
||||
short SecureDongle(short command, short[] handle, int[] lp1, int[] lp2, short[] p1, short[] p2, short[] p3, short[] p4, byte[] buffer);
|
||||
}
|
||||
270
src/main/java/SecureDongle/SecureDongle.java
Normal file
270
src/main/java/SecureDongle/SecureDongle.java
Normal file
@@ -0,0 +1,270 @@
|
||||
package SecureDongle;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.tinylog.Logger;
|
||||
import static Config.SomeCodes.ToShort;
|
||||
import static Config.SomeCodes.Wait;
|
||||
|
||||
public class SecureDongle {
|
||||
|
||||
private final int[] lp1 = new int[1];
|
||||
private final int[] lp2 = new int[1];
|
||||
// for Open/Close Handle
|
||||
private final short[] handle = new short[1];
|
||||
// P1
|
||||
private final short[] p1 = new short[1];
|
||||
// P2
|
||||
private final short[] p2 = new short[1];
|
||||
// P3
|
||||
private final short[] p3 = new short[1];
|
||||
// P4
|
||||
private final short[] p4 = new short[1];
|
||||
|
||||
private final byte[] buffer = new byte[1024];
|
||||
|
||||
LibSecureDongle SD;
|
||||
|
||||
private @Getter boolean Opened = false;
|
||||
private @Getter short Handle;
|
||||
private @Getter int HardwareID = 0;
|
||||
private @Getter int UserID = 0;
|
||||
|
||||
private @Setter SecureDongleEvent event;
|
||||
|
||||
/**
|
||||
* Create SecureDongle with P1, P2, P3, P4
|
||||
* @param P1 Password 1
|
||||
* @param P2 Password 2
|
||||
* @param P3 Password 3
|
||||
* @param P4 Password 4
|
||||
*/
|
||||
public SecureDongle(Short P1, Short P2, Short P3, Short P4){
|
||||
this.p1[0] = P1;
|
||||
this.p2[0] = P2;
|
||||
this.p3[0] = P3;
|
||||
this.p4[0] = P4;
|
||||
SD = LibSecureDongle.Instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create SecureDongle with P1, P2, P3, P4
|
||||
* @param P1 Password 1
|
||||
* @param P2 Password 2
|
||||
* @param P3 Password 3
|
||||
* @param P4 Password 4
|
||||
*/
|
||||
public SecureDongle(String P1, String P2, String P3, String P4){
|
||||
this.p1[0] = ToShort(P1);
|
||||
this.p2[0] = ToShort(P2);
|
||||
this.p3[0] = ToShort(P3);
|
||||
this.p4[0] = ToShort(P4);
|
||||
SD = LibSecureDongle.Instance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Find SecureDongle
|
||||
* This must be executed first time
|
||||
* @return true if found
|
||||
*/
|
||||
public boolean Find(){
|
||||
HardwareID = 0;
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_FIND, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
HardwareID = lp1[0];
|
||||
return true;
|
||||
} else {
|
||||
if (event!=null) event.onDongleError("Find", result);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Open SecureDongle
|
||||
* @return true if success
|
||||
*/
|
||||
public boolean Open(){
|
||||
Handle=0;
|
||||
if (HardwareID!=0){
|
||||
lp1[0] = HardwareID;
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_OPEN, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
Handle = handle[0];
|
||||
Opened = true;
|
||||
return true;
|
||||
} else if (event!=null) event.onDongleError("Open", result);
|
||||
} //else System.out.println("HardwareID not found, Find SecureDongle first");
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close SecureDongle
|
||||
* @return true if success
|
||||
*/
|
||||
@SuppressWarnings("UnusedReturnValue")
|
||||
public boolean Close(){
|
||||
handle[0] = Handle;
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_CLOSE, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
return true;
|
||||
} else if (event!=null) event.onDongleError("Close", result);
|
||||
Opened = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write to User Data Zone (UDZ)
|
||||
* @param StartAddress start address of UDZ, zero based
|
||||
* @param length length of data to write, max 1000 bytes
|
||||
* @param data data to write
|
||||
* @return true if success
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public boolean Write(short StartAddress, short length, byte[] data){
|
||||
if (Opened){
|
||||
handle[0] = Handle;
|
||||
p1[0] = StartAddress>=0 ? StartAddress : 0;
|
||||
if (length<1) length=1;
|
||||
if (length>1000) length=1000;
|
||||
p2[0] = length;
|
||||
System.arraycopy(data, 0, buffer, 0, length);
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_WRITE, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
return true;
|
||||
} else if (event!=null) event.onDongleError("Write", result);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Read from User Data Zone (UDZ)
|
||||
* @param StartAddress Start Address, zero based
|
||||
* @param Length Length of data to read, max 1000 bytes
|
||||
* @return byte array of data, length=0 if failed
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public byte[] Read(short StartAddress, short Length){
|
||||
if (Opened){
|
||||
handle[0] = Handle;
|
||||
p1[0] = StartAddress>=0 ? StartAddress : 0;
|
||||
if (Length<1) Length=1;
|
||||
if (Length>1000) Length=1000;
|
||||
p2[0] = Length;
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_READ, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
byte[] data = new byte[Length];
|
||||
System.arraycopy(buffer, 0, data, 0, Length);
|
||||
return data;
|
||||
} else if (event!=null) event.onDongleError("Read", result);
|
||||
}
|
||||
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate Random Number
|
||||
* @return short array of random number
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public short[] GenerateRandomNumber(){
|
||||
short[] random = new short[4];
|
||||
if (Opened){
|
||||
handle[0] = Handle;
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_RANDOM, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
random[0] = p1[0];
|
||||
random[1] = p2[0];
|
||||
random[2] = p3[0];
|
||||
random[3] = p4[0];
|
||||
return random;
|
||||
} else if (event!=null) event.onDongleError("GenerateRandomNumber", result);
|
||||
}
|
||||
|
||||
return random;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write UserID to SecureDongle
|
||||
* @param UserID UserID to write
|
||||
* @return true if success
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public boolean WriteUserID(int UserID){
|
||||
if (Opened){
|
||||
handle[0] = Handle;
|
||||
lp1[0] = UserID;
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_WRITE_USERID, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
this.UserID = UserID;
|
||||
return true;
|
||||
} else if (event!=null) event.onDongleError("WriteUserID", result);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read UserID from SecureDongle
|
||||
* @return UserID, 0 if failed
|
||||
*/
|
||||
public int ReadUserID(){
|
||||
if (Opened){
|
||||
handle[0] = Handle;
|
||||
short result = SD.SecureDongle(LibSecureDongle.SD_READ_USERID, handle, lp1, lp2, p1, p2, p3, p4, buffer);
|
||||
if (result== LibSecureDongle.ERR_SUCCESS){
|
||||
this.UserID = lp1[0];
|
||||
return UserID;
|
||||
} else if (event!=null) event.onDongleError("ReadUserID", result);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
boolean ismonitoring = false;
|
||||
|
||||
/**
|
||||
* Stop Monitoring SecureDongle
|
||||
*/
|
||||
public void StopMonitor(){
|
||||
ismonitoring = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start Monitoring SecureDongle
|
||||
* if dongle missing, will raise event onDongleMissing
|
||||
*/
|
||||
public void StartMonitor(){
|
||||
Thread tx = new Thread(()->{
|
||||
if (HardwareID==0) Find();
|
||||
Open();
|
||||
int firstUserID = ReadUserID();
|
||||
Close();
|
||||
if (firstUserID!=0){
|
||||
ismonitoring = true;
|
||||
Logger.info("Start Monitoring UserID="+Integer.toHexString(firstUserID));
|
||||
while (ismonitoring){
|
||||
Wait(5000);
|
||||
Open();
|
||||
int newUserID = ReadUserID();
|
||||
Close();
|
||||
if (newUserID!=firstUserID){
|
||||
if (event!=null) event.onDongleMissing();
|
||||
}
|
||||
|
||||
}
|
||||
System.out.println("Stop Monitoring");
|
||||
} else System.out.println("Canceled Monitoring, UserID not found");
|
||||
|
||||
});
|
||||
tx.setName("SecureDongle Monitor Thread");
|
||||
tx.setDaemon(true);
|
||||
tx.start();
|
||||
}
|
||||
|
||||
}
|
||||
6
src/main/java/SecureDongle/SecureDongleEvent.java
Normal file
6
src/main/java/SecureDongle/SecureDongleEvent.java
Normal file
@@ -0,0 +1,6 @@
|
||||
package SecureDongle;
|
||||
|
||||
public interface SecureDongleEvent {
|
||||
void onDongleMissing();
|
||||
void onDongleError(String function,int errorCode);
|
||||
}
|
||||
386
src/main/java/id/co/gtc/erhacam/AutoCloseAlert.java
Normal file
386
src/main/java/id/co/gtc/erhacam/AutoCloseAlert.java
Normal file
@@ -0,0 +1,386 @@
|
||||
package id.co.gtc.erhacam;
|
||||
|
||||
import javafx.animation.KeyFrame;
|
||||
import javafx.animation.PauseTransition;
|
||||
import javafx.animation.Timeline;
|
||||
import javafx.application.Platform;
|
||||
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.geometry.Pos;
|
||||
import javafx.scene.Node;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.*;
|
||||
import javafx.scene.paint.Color;
|
||||
import javafx.scene.shape.Circle;
|
||||
import javafx.stage.*;
|
||||
import javafx.util.Duration;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static Config.SomeCodes.*;
|
||||
|
||||
public class AutoCloseAlert {
|
||||
|
||||
private static Stage currentAlertStage;
|
||||
public static String shownTitle = "";
|
||||
public static String shownContent = "";
|
||||
public static String shownHeader = "";
|
||||
public static Image shownBanner = null;
|
||||
public static Image banner_01;
|
||||
public static Image banner_02;
|
||||
private static Circle Cam1;
|
||||
private static Circle Cam2;
|
||||
private static Circle Cam3;
|
||||
private static Circle Cam4;
|
||||
private static Circle Cam5;
|
||||
|
||||
public static void init(){
|
||||
String f_01 = ExtractResource("/IU photoboth-01.jpg");
|
||||
//System.out.println("Banner 01 extracted as file: "+f_01);
|
||||
String f_02 = ExtractResource("/IU photoboth-02.jpg");
|
||||
//System.out.println("Banner 02 extracted as file: "+f_02);
|
||||
banner_01 = LoadImage(f_01);
|
||||
if (banner_01!=null) System.out.println("Banner 01 loaded"); else System.out.println("Banner 01 not loaded");
|
||||
banner_02 = LoadImage(f_02);
|
||||
if (banner_02!=null) System.out.println("Banner 02 loaded"); else System.out.println("Banner 02 not loaded");
|
||||
Cam1 = new Circle(10, Color.RED);
|
||||
Cam2 = new Circle(10, Color.RED);
|
||||
Cam3 = new Circle(10, Color.RED);
|
||||
Cam4 = new Circle(10, Color.RED);
|
||||
Cam5 = new Circle(10, Color.RED);
|
||||
}
|
||||
|
||||
public static void ChangeCamStatus(int id, boolean active){
|
||||
Circle x = switch (id){
|
||||
case 1 -> Cam1;
|
||||
case 2 -> Cam2;
|
||||
case 3 -> Cam3;
|
||||
case 4 -> Cam4;
|
||||
case 5 -> Cam5;
|
||||
default -> null;
|
||||
};
|
||||
if (x!=null){
|
||||
if (active){
|
||||
x.setFill(Color.GREEN);
|
||||
} else {
|
||||
x.setFill(Color.RED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Close the current alert if it is shown
|
||||
*/
|
||||
public static void close(){
|
||||
if (currentAlertStage!=null){
|
||||
try {
|
||||
closeStage(currentAlertStage);
|
||||
} catch (InterruptedException e) {
|
||||
Logger.error("Error closing alert stage: " + e.getMessage());
|
||||
}
|
||||
currentAlertStage = null;
|
||||
}
|
||||
|
||||
|
||||
clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Show an alert with a title, header, content, and automatically close after a few seconds
|
||||
* If called several times, the previous alert will be closed before showing a new one
|
||||
* @param title the title of the alert
|
||||
* @param header the header of the alert
|
||||
* @param content the content of the alert
|
||||
* @param seconds the number of seconds before the alert is closed, or put 0 to keep it open
|
||||
* @param onClose What to do after auto close
|
||||
*/
|
||||
public static void show(String title, String header, String content, int seconds, Consumer<String> onClose) {
|
||||
if (Platform.isFxApplicationThread()){
|
||||
Stage alertStage = _showtext(title, header, content);
|
||||
closeAlertStage(seconds, onClose, alertStage);
|
||||
} else {
|
||||
Platform.runLater(()->{
|
||||
Stage alertStage = _showtext(title, header, content);
|
||||
closeAlertStage(seconds, onClose, alertStage);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a banner image
|
||||
* @param b1 Image to show
|
||||
* @param seconds the number of seconds before the alert is closed, or put 0 to keep it open
|
||||
* @param onClose What to do after auto close
|
||||
*/
|
||||
public static void showbanner(Image b1, int seconds, Consumer<String> onClose){
|
||||
if (Platform.isFxApplicationThread()){
|
||||
Stage alertStage = _showbanner(b1);
|
||||
closeAlertStage(seconds, onClose, alertStage);
|
||||
} else {
|
||||
Platform.runLater(()->{
|
||||
Stage alertStage = _showbanner(b1);
|
||||
closeAlertStage(seconds, onClose, alertStage);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void showpictures(String[] pictures, int seconds, Consumer<String> onClose){
|
||||
List<Image> images = new ArrayList<>();
|
||||
|
||||
if (pictures != null){
|
||||
for(String pp : pictures){
|
||||
Image ii = LoadImage(pp);
|
||||
if (ii!=null) images.add(ii);
|
||||
}
|
||||
}
|
||||
|
||||
if (!images.isEmpty()){
|
||||
Image[] source = images.toArray(new Image[0]);
|
||||
if (Platform.isFxApplicationThread()){
|
||||
_showpictures(source, seconds, onClose);
|
||||
} else {
|
||||
Platform.runLater(()-> _showpictures(source,seconds, onClose));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static void _showpictures(Image[] pictures, int seconds, Consumer<String> onClose){
|
||||
close();
|
||||
|
||||
Stage alertStage = new Stage();
|
||||
alertStage.initModality(Modality.APPLICATION_MODAL);
|
||||
alertStage.initStyle(StageStyle.UTILITY);
|
||||
alertStage.setAlwaysOnTop(true);
|
||||
alertStage.setResizable(false);
|
||||
int width = (int) Screen.getPrimary().getBounds().getWidth();
|
||||
int height = (int) Screen.getPrimary().getBounds().getHeight();
|
||||
|
||||
HBox hbox = new HBox();
|
||||
hbox.setAlignment(Pos.CENTER);
|
||||
int fitwidth = width / pictures.length;
|
||||
for(Image i : pictures){
|
||||
ImageView iv = new ImageView(i);
|
||||
iv.setPreserveRatio(true);
|
||||
iv.setFitHeight(height);
|
||||
iv.setFitWidth(fitwidth);
|
||||
hbox.getChildren().add(iv);
|
||||
}
|
||||
|
||||
BorderPane borderPane = new BorderPane();
|
||||
borderPane.setCenter(hbox);
|
||||
|
||||
alertStage.setScene(new Scene(borderPane, width, height));
|
||||
alertStage.centerOnScreen();
|
||||
|
||||
Timeline timeline = new Timeline();
|
||||
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(0), event -> alertStage.show()));
|
||||
|
||||
timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(seconds* (pictures.length)), event -> {
|
||||
try {
|
||||
closeStage(alertStage);
|
||||
} catch (InterruptedException e) {
|
||||
Logger.error("Error closing alert stage: " + e.getMessage());
|
||||
}
|
||||
//alertStage.close();
|
||||
if (currentAlertStage == alertStage) {
|
||||
currentAlertStage = null;
|
||||
}
|
||||
if (onClose!=null) onClose.accept(shownTitle);
|
||||
clear();
|
||||
}));
|
||||
timeline.play();
|
||||
|
||||
currentAlertStage = alertStage;
|
||||
shownTitle = "";
|
||||
shownContent = "";
|
||||
shownHeader = "";
|
||||
shownBanner = null;
|
||||
|
||||
}
|
||||
|
||||
private static Stage _showbanner(Image image){
|
||||
close();
|
||||
|
||||
Stage alertStage = new Stage();
|
||||
alertStage.initModality(Modality.APPLICATION_MODAL);
|
||||
alertStage.initStyle(StageStyle.UTILITY);
|
||||
alertStage.setAlwaysOnTop(true);
|
||||
alertStage.setResizable(false);
|
||||
int width = (int) Screen.getPrimary().getBounds().getWidth();
|
||||
int height = (int) Screen.getPrimary().getBounds().getHeight();
|
||||
|
||||
BorderPane borderPane = new BorderPane();
|
||||
|
||||
StackPane stackPane = new StackPane();
|
||||
|
||||
if (image!=null){
|
||||
ImageView imageView = new ImageView(image);
|
||||
imageView.setPreserveRatio(true);
|
||||
imageView.setFitWidth(width);
|
||||
imageView.setSmooth(true);
|
||||
stackPane.getChildren().add(imageView);
|
||||
}
|
||||
HBox CamStatus = new HBox(30, Cam1, Cam2, Cam3, Cam4, Cam5);
|
||||
CamStatus.setMinHeight(60);
|
||||
CamStatus.setAlignment(Pos.CENTER);
|
||||
|
||||
VBox vBox = new VBox(CamStatus);
|
||||
vBox.setAlignment(Pos.BOTTOM_CENTER);
|
||||
|
||||
stackPane.getChildren().add(vBox);
|
||||
|
||||
borderPane.setCenter(stackPane);
|
||||
|
||||
alertStage.setScene(new Scene(borderPane, width, height));
|
||||
alertStage.centerOnScreen();
|
||||
alertStage.show();
|
||||
|
||||
currentAlertStage = alertStage;
|
||||
shownBanner = image;
|
||||
CamStatus.prefWidthProperty().bind(currentAlertStage.widthProperty());
|
||||
|
||||
|
||||
|
||||
shownTitle = "";
|
||||
shownContent = "";
|
||||
shownHeader = "";
|
||||
|
||||
return alertStage;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create an alert with a title, header, and content
|
||||
* @param title the title
|
||||
* @param header the header
|
||||
* @param content the content
|
||||
* @return the alert stage
|
||||
*/
|
||||
private static Stage _showtext(String title, String header, String content){
|
||||
// close previous alert before showing a new one
|
||||
close();
|
||||
|
||||
Stage alertStage = new Stage();
|
||||
alertStage.initModality(Modality.APPLICATION_MODAL);
|
||||
alertStage.initStyle(StageStyle.UTILITY);
|
||||
alertStage.setAlwaysOnTop(true);
|
||||
alertStage.setResizable(false);
|
||||
|
||||
double screenwidth = Screen.getPrimary().getBounds().getWidth();
|
||||
double screenheight = Screen.getPrimary().getBounds().getHeight();
|
||||
|
||||
double height = screenheight/4.0;
|
||||
double width = height * 21.0/9.0;
|
||||
|
||||
VBox root = new VBox(10);
|
||||
root.setPadding(new Insets(12));
|
||||
root.setPrefSize(width, height);
|
||||
root.setAlignment(Pos.CENTER);
|
||||
|
||||
if (ValidString(header)){
|
||||
Label headerLabel = new Label(header);
|
||||
headerLabel.setStyle("-fx-font-weight: bold; -fx-font-size: 28px;");
|
||||
headerLabel.setWrapText(true);
|
||||
headerLabel.setMinHeight(height*0.25);
|
||||
headerLabel.setMaxWidth(Double.MAX_VALUE);
|
||||
headerLabel.prefWidthProperty().bind(root.widthProperty());
|
||||
root.getChildren().add(headerLabel);
|
||||
}
|
||||
if (ValidString(content)){
|
||||
Label contentLabel = new Label(content);
|
||||
contentLabel.setWrapText(true);
|
||||
contentLabel.setStyle("-fx-font-size: 24px;");
|
||||
contentLabel.setMinHeight(height*0.75);
|
||||
contentLabel.setMaxWidth(Double.MAX_VALUE);
|
||||
contentLabel.prefWidthProperty().bind(root.widthProperty());
|
||||
|
||||
VBox.setVgrow(contentLabel, Priority.ALWAYS);
|
||||
contentLabel.setAlignment(Pos.TOP_CENTER);
|
||||
root.getChildren().add(contentLabel);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Scene scene = new Scene(root);
|
||||
alertStage.setScene(scene);
|
||||
|
||||
alertStage.setTitle(title);
|
||||
|
||||
double x = screenwidth/2 - width/2;
|
||||
double y = screenheight - height - 10;
|
||||
alertStage.setX(x);
|
||||
alertStage.setY(y);
|
||||
|
||||
alertStage.show();
|
||||
currentAlertStage = alertStage;
|
||||
shownHeader = ValidString(header) ? header : "";
|
||||
shownContent = ValidString(content) ? content : "";
|
||||
shownTitle = ValidString(title) ? title : "";
|
||||
shownBanner = null;
|
||||
|
||||
return alertStage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the alert after a few seconds
|
||||
* @param seconds the number of seconds before the alert is closed, if 0, the alert will not be closed
|
||||
* @param onClose What to do after auto close
|
||||
* @param alertStage the alert stage to be closed
|
||||
*/
|
||||
private static void closeAlertStage(int seconds, Consumer<String> onClose, Stage alertStage) {
|
||||
|
||||
if (seconds>0){
|
||||
PauseTransition delay = new PauseTransition(Duration.seconds(seconds));
|
||||
delay.setOnFinished(e -> {
|
||||
try {
|
||||
closeStage(alertStage);
|
||||
} catch (InterruptedException err) {
|
||||
Logger.error("Error closing alert stage: " + err.getMessage());
|
||||
}
|
||||
//alertStage.close();
|
||||
if (currentAlertStage == alertStage) {
|
||||
currentAlertStage = null;
|
||||
}
|
||||
if (onClose!=null) onClose.accept(shownTitle);
|
||||
clear();
|
||||
} );
|
||||
delay.play();
|
||||
}
|
||||
}
|
||||
|
||||
private static Image LoadImage(String filename){
|
||||
if (ValidFile(filename)){
|
||||
try{
|
||||
return new Image(Paths.get(filename).toUri().toString());
|
||||
} catch (Exception e){
|
||||
Logger.error("Error loading image: " + filename+", Message: "+e.getMessage());
|
||||
}
|
||||
} else Logger.error("LoadImage: Invalid file: " + filename);
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void clear(){
|
||||
shownTitle = "";
|
||||
shownContent = "";
|
||||
shownHeader = "";
|
||||
shownBanner= null;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
84
src/main/java/id/co/gtc/erhacam/DetectorResult.java
Normal file
84
src/main/java/id/co/gtc/erhacam/DetectorResult.java
Normal file
@@ -0,0 +1,84 @@
|
||||
package id.co.gtc.erhacam;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bytedeco.opencv.opencv_core.Rect;
|
||||
import org.bytedeco.opencv.opencv_core.Scalar;
|
||||
import org.bytedeco.opencv.opencv_core.UMat;
|
||||
import org.opencv.imgproc.Imgproc;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.bytedeco.opencv.global.opencv_imgproc.rectangle;
|
||||
|
||||
@Getter
|
||||
public class DetectorResult {
|
||||
private @Setter Rect Face;
|
||||
private List<Rect> Eyes;
|
||||
private final int linethickness = 3;
|
||||
private final int linetype = Imgproc.LINE_8;
|
||||
private final int lineshift = 0;
|
||||
|
||||
public void AddEye(Rect eye){
|
||||
if (Eyes == null) Eyes = new java.util.ArrayList<>();
|
||||
Eyes.add(eye);
|
||||
}
|
||||
|
||||
// trouble di sini
|
||||
public void FaceRectangle(UMat mat){
|
||||
if (mat == null || mat.empty()) return;
|
||||
if (Face == null || Face.width() <= 0 || Face.height() <= 0) return;
|
||||
if (Face.x() < 0 || Face.y() < 0) return; // ignore negative coordinates
|
||||
if (Face.x() + Face.width() > mat.cols() || Face.y() + Face.height() > mat.rows()) return; // ignore out of bounds
|
||||
if (haveFace()){
|
||||
|
||||
try{
|
||||
rectangle(mat, Face, Scalar.GREEN, linethickness, linetype, lineshift);
|
||||
|
||||
} catch (Exception ignored){}
|
||||
}
|
||||
}
|
||||
|
||||
// trouble di sini
|
||||
public void EyesRectangle(UMat mat){
|
||||
if (mat == null || mat.empty()) return;
|
||||
|
||||
if (haveEyes()){
|
||||
|
||||
for(Rect eye : Eyes){
|
||||
if (eye == null || eye.width() <= 0 || eye.height() <= 0) continue;
|
||||
if (eye.x() < 0 || eye.y() < 0) continue; // ignore negative coordinates
|
||||
if (eye.x() + eye.width() > mat.cols() || eye.y() + eye.height() > mat.rows()) continue; // ignore out of bounds
|
||||
|
||||
try{
|
||||
rectangle(mat, eye, Scalar.BLUE);
|
||||
|
||||
} catch (Exception ignored){}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean haveFace(){
|
||||
return Face != null && Face.width() > 0 && Face.height() > 0;
|
||||
}
|
||||
|
||||
public int getFaceWidth(){
|
||||
if (!haveFace()) return 0;
|
||||
return Face.width();
|
||||
}
|
||||
|
||||
public int getFaceHeight(){
|
||||
if (!haveFace()) return 0;
|
||||
return Face.height();
|
||||
}
|
||||
|
||||
public boolean haveEyes(){
|
||||
return Eyes != null && !Eyes.isEmpty();
|
||||
}
|
||||
|
||||
public int getEyesCount(){
|
||||
if (!haveEyes()) return 0;
|
||||
return Eyes.size();
|
||||
}
|
||||
|
||||
}
|
||||
205
src/main/java/id/co/gtc/erhacam/Detectors.java
Normal file
205
src/main/java/id/co/gtc/erhacam/Detectors.java
Normal file
@@ -0,0 +1,205 @@
|
||||
package id.co.gtc.erhacam;
|
||||
|
||||
import Config.SomeCodes;
|
||||
import lombok.NonNull;
|
||||
import org.bytedeco.opencv.opencv_core.*;
|
||||
import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class Detectors {
|
||||
public CascadeClassifier frontalfaceDetector;
|
||||
private CascadeClassifier eyeDetector;
|
||||
private CascadeClassifier profilefaceDetector;
|
||||
|
||||
private double scaleFactor = 1.05; // revisi 09/05/2025, dari nilai 1.05
|
||||
private final int minNeighbors = 3; // revisi 09/05/2025, dari nilai 3
|
||||
private final int flags = 0;
|
||||
private Size FaceminSize;
|
||||
private Size FacemaxSize;
|
||||
|
||||
public Detectors(){
|
||||
LoadFrontalFaceDetector();
|
||||
LoadEyeDetector();
|
||||
|
||||
LoadProfileFaceDetector();
|
||||
}
|
||||
|
||||
private void LoadFrontalFaceDetector(){
|
||||
// revisi 09/05/2025, dari filename = SomeCodes.ExtractResource("/haarcascade_frontalface_default.xml");
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_frontalface_alt.xml");
|
||||
if (filename!=null) {
|
||||
try{
|
||||
frontalfaceDetector = new CascadeClassifier(filename);
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading FaceDetector : " + e.getMessage());
|
||||
}
|
||||
} else Logger.error("Unable to extract face detector file");
|
||||
}
|
||||
|
||||
private void LoadProfileFaceDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_profileface.xml");
|
||||
if (filename!=null) {
|
||||
try{
|
||||
profilefaceDetector = new CascadeClassifier(filename);
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading ProfileFaceDetector : " + e.getMessage());
|
||||
}
|
||||
} else Logger.error("Unable to extract profile face detector file");
|
||||
}
|
||||
|
||||
private void LoadEyeDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_eye.xml");
|
||||
if (filename!=null) {
|
||||
try{
|
||||
|
||||
eyeDetector = new CascadeClassifier(filename);
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading EyeDetector : " + e.getMessage());
|
||||
}
|
||||
} else Logger.error("Unable to extract eye detector file");
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect if there is a frontal face, containing 2 eyes
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return List of Rect if face detected, otherwise empty list
|
||||
*/
|
||||
public @NonNull List<DetectorResult> HaveFrontalFace(Mat graymat){
|
||||
List<DetectorResult> result = new ArrayList<>();
|
||||
//System.out.println("Detecting frontal from "+ graymat.size().width() + "x" + graymat.size().height());
|
||||
RectVector faces = DetectFrontalFace(graymat);
|
||||
if (faces!=null && faces.size()>0){
|
||||
//System.out.println("faces size = " + faces.size());
|
||||
for(Rect face : faces.get()){
|
||||
RectVector eyes = DetectEye(graymat, face.width());
|
||||
DetectorResult dr = new DetectorResult();
|
||||
dr.setFace(face);
|
||||
//System.out.println("eyes size = " + eyes.size());
|
||||
if (eyes.size()>=2){
|
||||
for(Rect eye : eyes.get()){
|
||||
if (SomeCodes.IsInsideRect(eye, face)) {
|
||||
dr.AddEye(eye);
|
||||
}
|
||||
}
|
||||
}
|
||||
result.add(dr);
|
||||
}
|
||||
} //else System.out.println("faces size = 0");
|
||||
return result;
|
||||
}
|
||||
|
||||
public @NonNull List<DetectorResult> HaveLeft45Face(Mat graymat){
|
||||
List<DetectorResult> result = new ArrayList<>();
|
||||
RectVector faces = DetectProfileFace(graymat);
|
||||
if (faces!=null && faces.size()>0){
|
||||
|
||||
for(Rect face : faces.get()){
|
||||
RectVector eyes = DetectEye(graymat, face.width());
|
||||
DetectorResult dr = new DetectorResult();
|
||||
dr.setFace(face);
|
||||
if (eyes.size()>0){
|
||||
for(Rect eye : eyes.get()){
|
||||
if (SomeCodes.IsInsideRect(eye, face)) dr.AddEye(eye);
|
||||
}
|
||||
}
|
||||
result.add(dr);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public void setScaleFactor(double value){
|
||||
if (scaleFactor!=value) scaleFactor = value;
|
||||
}
|
||||
|
||||
public void setFaceMinSize(int value){
|
||||
if (FaceminSize!=null){
|
||||
if (FaceminSize.width()!=value || FaceminSize.height()!=value) {
|
||||
FaceminSize = new Size(value, value);
|
||||
Logger.info("FaceMinSize changed to : " + FaceminSize.width());
|
||||
}
|
||||
} else {
|
||||
FaceminSize = new Size(value, value);
|
||||
Logger.info("FaceMinSize created with value : " + FaceminSize.width());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setFaceMaxSize(int value){
|
||||
if (FacemaxSize!=null){
|
||||
if (FacemaxSize.width()!=value || FacemaxSize.height()!=value) {
|
||||
FacemaxSize = new Size(value, value);
|
||||
Logger.info("FaceMaxSize changed to : " + FacemaxSize.width());
|
||||
}
|
||||
} else {
|
||||
FacemaxSize = new Size(value, value);
|
||||
Logger.info("FaceMaxSize created with value : " + FacemaxSize.width());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public RectVector DetectProfileFace(Mat graymat){
|
||||
return Detect(graymat, profilefaceDetector, scaleFactor, minNeighbors, flags, FaceminSize, FacemaxSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect Face from Mat
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return RectVector if face detected, otherwise null
|
||||
*/
|
||||
public RectVector DetectFrontalFace(Mat graymat){
|
||||
return Detect(graymat, frontalfaceDetector, scaleFactor, minNeighbors, flags, FaceminSize, FacemaxSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect Eye from Mat
|
||||
* If Eye detected, it will return RectVector with size is number of eyes detected
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return RectVector if eye detected, otherwise null
|
||||
*/
|
||||
public RectVector DetectEye(Mat graymat, int facewidth){
|
||||
//return Detect(graymat, eyeDetector);
|
||||
int minwidth = (int)(facewidth*0.2);
|
||||
int maxwidth = (int)(facewidth*0.4);
|
||||
Size minsize = new Size(minwidth, minwidth);
|
||||
Size maxsize = new Size(maxwidth, maxwidth);
|
||||
//System.out.println("Detecting Eye with minsize = " + minsize.width() + "x" + minsize.height() + ", maxsize = " + maxsize.width() + "x" + maxsize.height());
|
||||
return Detect(graymat, eyeDetector, scaleFactor, minNeighbors, flags, minsize, maxsize);
|
||||
}
|
||||
|
||||
@SuppressWarnings("SameParameterValue")
|
||||
private RectVector Detect(Mat graymat, CascadeClassifier detector, double scaleFactor, int minNeighbors, int flags, Size minSize, Size maxSize){
|
||||
if (detector!=null && !detector.empty()){
|
||||
if (graymat!=null && graymat.channels()==1 && !graymat.empty()){
|
||||
if (minSize!=null && maxSize!=null){
|
||||
if (minSize.width()< maxSize.width() && minSize.height() < maxSize.height()){
|
||||
if (graymat.cols()> minSize.width() && graymat.rows() > minSize.height()) {
|
||||
try {
|
||||
RectVector detected = new RectVector();
|
||||
// try defaulting minSize and maxSize
|
||||
detector.detectMultiScale(graymat, detected, scaleFactor, minNeighbors, flags, minSize, new Size());
|
||||
|
||||
return detected;
|
||||
} catch (Exception e) {
|
||||
System.out.println("Detectors Detect Error, Message : " + e.getMessage());
|
||||
}
|
||||
} else System.out.println("graymat is smaller than minSize");
|
||||
|
||||
} else System.out.println("minSize is larger than maxSize");
|
||||
} else System.out.println("minSize or maxSize is null");
|
||||
} else System.out.println("graymat is null, not 1 channel, or empty");
|
||||
|
||||
} else System.out.println("detector empty");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -1,45 +1,125 @@
|
||||
package id.co.gtc.erhacam;
|
||||
|
||||
import Config.SomeCodes;
|
||||
import Database.PhotoCleaner;
|
||||
import SecureDongle.SecureDongle;
|
||||
import SecureDongle.SecureDongleEvent;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.geometry.Rectangle2D;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.stage.Screen;
|
||||
import javafx.stage.Stage;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static Config.SomeCodes.ShowAlert;
|
||||
import static Config.SomeCodes.config;
|
||||
|
||||
|
||||
public class MainApplication extends Application {
|
||||
|
||||
final String version = "27082025-PRODUCTION-1.0.7";
|
||||
PhotoCleaner photoCleaner;
|
||||
public static Map<Integer, Detectors> detectorsList = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void start(Stage stage) throws IOException {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml"));
|
||||
Screen screen = Screen.getPrimary();
|
||||
Rectangle2D screenbound = screen.getVisualBounds();
|
||||
Scene scene = new Scene(fxmlLoader.load(), screenbound.getWidth(), screenbound.getHeight());
|
||||
stage.setTitle("MultiCam Capture App for ERHA");
|
||||
stage.setScene(scene);
|
||||
stage.setResizable(true);
|
||||
stage.setMaximized(true);
|
||||
stage.setOnCloseRequest(e->{
|
||||
config.Save();
|
||||
MainView mainView = fxmlLoader.getController();
|
||||
mainView.Unload();
|
||||
Logger.info("Application closed");
|
||||
});
|
||||
SomeCodes.LoadQRReader();
|
||||
SomeCodes.LoadFaceDetector();
|
||||
stage.show();
|
||||
Logger.info("Application started");
|
||||
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||
if (photoCleaner!=null) photoCleaner.Stop();
|
||||
System.out.println("ShutdownHook Checking running threads...");
|
||||
// Map<Thread, StackTraceElement[]> allThreads = Thread.getAllStackTraces();
|
||||
// for(Thread thread : allThreads.keySet()){
|
||||
// System.out.println("Thread: " + thread.getName()+", State: " + thread.getState()+", Daemon: " + thread.isDaemon());
|
||||
// thread.interrupt();
|
||||
// }
|
||||
}));
|
||||
|
||||
|
||||
SecureDongle sd = new SecureDongle((short)0x4B30, (short)0xA66C, (short)0x3109, (short)0x37B1);
|
||||
if (sd.Find()){
|
||||
if (sd.Open()){
|
||||
String UserID = Integer.toHexString(sd.ReadUserID()) ;
|
||||
sd.Close();
|
||||
|
||||
if (UserID.equals("14022025")){
|
||||
Logger.info("Secure Dongle UserID valid");
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml"));
|
||||
Screen screen = Screen.getPrimary();
|
||||
Rectangle2D screenbound = screen.getBounds();
|
||||
Scene scene = new Scene(fxmlLoader.load(), screenbound.getWidth(), screenbound.getHeight());
|
||||
stage.setTitle("MultiCam Capture App for ERHA "+version);
|
||||
stage.setScene(scene);
|
||||
stage.setResizable(true);
|
||||
stage.setMaximized(true);
|
||||
stage.setOnCloseRequest(e->{
|
||||
sd.StopMonitor();
|
||||
config.Save();
|
||||
MainView mainView = fxmlLoader.getController();
|
||||
mainView.Unload();
|
||||
Logger.info("Application closed");
|
||||
});
|
||||
SomeCodes.LoadQRReader();
|
||||
// buang, pindah ke Cameradetail
|
||||
//Detectors.LoadAllDetectors();
|
||||
|
||||
stage.show();
|
||||
|
||||
AutoCloseAlert.init();
|
||||
|
||||
Logger.info("Application started");
|
||||
System.out.println("Application version : " + version+" started");
|
||||
System.out.println("Using "+(config.isProduction()?"Production":"Staging")+" API URL ");
|
||||
sd.setEvent(new SecureDongleEvent() {
|
||||
@Override
|
||||
public void onDongleMissing() {
|
||||
Logger.error("Secure Dongle Missing");
|
||||
Platform.runLater(()->{
|
||||
ShowAlert(Alert.AlertType.ERROR, "Secure Dongle Missing", "Secure Dongle Missing", "Secure Dongle Missing");
|
||||
Platform.exit();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDongleError(String function, int errorCode) {
|
||||
|
||||
}
|
||||
});
|
||||
sd.StartMonitor();
|
||||
|
||||
photoCleaner = new PhotoCleaner(90);
|
||||
photoCleaner.Start();
|
||||
|
||||
} else {
|
||||
ShowAlert(Alert.AlertType.ERROR, "Secure Dongle UserID not valid", "Secure Dongle UserID not valid", "Secure Dongle UserID not valid");
|
||||
Logger.error("Secure Dongle UserID not valid");
|
||||
Platform.exit();
|
||||
}
|
||||
|
||||
} else {
|
||||
ShowAlert(Alert.AlertType.ERROR, "Secure Dongle cannot be opened", "Secure Dongle cannot be opened", "Secure Dongle cannot be opened");
|
||||
Logger.error("Secure Dongle cannot be opened");
|
||||
Platform.exit();
|
||||
}
|
||||
} else {
|
||||
ShowAlert(Alert.AlertType.ERROR, "Secure Dongle not found", "Secure Dongle not found", "Secure Dongle not found");
|
||||
Logger.error("Secure Dongle not found");
|
||||
Platform.exit();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SomeCodes.ExtractResource("/tinylog.properties");
|
||||
launch();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -59,7 +59,7 @@ public class MainView {
|
||||
|
||||
@FXML
|
||||
private void initialize(){
|
||||
ReviewClick(null);
|
||||
CaptureClick(null);
|
||||
}
|
||||
|
||||
public void Unload(){
|
||||
@@ -92,8 +92,8 @@ public class MainView {
|
||||
currentcontroller = loader.getController();
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.error("Unable to load " + fxmlfile + ", exception : " + e.getMessage());
|
||||
Logger.error("Unable to load " ,fxmlfile, ", exception : ", e.getMessage());
|
||||
}
|
||||
} else Logger.info("Not loading empty fxml file");
|
||||
} else Logger.error("loadContent Not loading empty fxml file");
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ import org.tinylog.Logger;
|
||||
import java.io.File;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static Config.SomeCodes.config;
|
||||
import static Config.SomeCodes.*;
|
||||
|
||||
public class PhotoRow {
|
||||
@FXML
|
||||
@@ -28,13 +28,11 @@ public class PhotoRow {
|
||||
private final String borderstyle = "-fx-border-color: black; -fx-border-width: 1px;";
|
||||
|
||||
public void setDatetime(String datetime){
|
||||
this.datetime.setText(datetime);
|
||||
this.datetime.setStyle(borderstyle);
|
||||
LabelSetText(this.datetime, datetime, borderstyle);
|
||||
}
|
||||
|
||||
public void setPrefix(String prefix){
|
||||
this.prefix.setText(prefix);
|
||||
this.prefix.setStyle(borderstyle);
|
||||
LabelSetText(this.prefix,prefix,borderstyle);
|
||||
}
|
||||
|
||||
public void setPhotos(int width, int height, String... thumbnails){
|
||||
@@ -48,17 +46,12 @@ public class PhotoRow {
|
||||
imgview.setOnMouseClicked(e->{
|
||||
if (e.getClickCount()>=2){
|
||||
File ff = new File(photopath);
|
||||
String hires = Path.of(config.getPhotoDirectory(), ff.getName()).toString();
|
||||
String hires = Path.of(config.getFullQualityDirectory(), ff.getName()).toString();
|
||||
File hiresfile = new File(hires);
|
||||
if (hiresfile.isFile()){
|
||||
System.out.println("Opening file: "+hires);
|
||||
SomeCodes.OpenPictureInDefaultViewer(hires);
|
||||
} else {
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("Error");
|
||||
alert.setHeaderText("File not found");
|
||||
alert.setContentText("File not found: "+hires);
|
||||
alert.showAndWait();
|
||||
}
|
||||
} else ShowAlert(Alert.AlertType.ERROR, "Error", "File not found", "File not found: "+hires);
|
||||
e.consume();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -3,30 +3,15 @@ package id.co.gtc.erhacam;
|
||||
import FTP.FTPCheck;
|
||||
import javafx.application.Platform;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.ComboBox;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.stage.DirectoryChooser;
|
||||
import javafx.stage.FileChooser;
|
||||
import lombok.val;
|
||||
import org.bytedeco.javacv.VideoInputFrameGrabber;
|
||||
import org.tinylog.Logger;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import static Config.SomeCodes.config;
|
||||
import static Config.SomeCodes.*;
|
||||
|
||||
public class SettingView {
|
||||
@FXML
|
||||
private TextField AudioPhase1;
|
||||
@FXML
|
||||
private TextField AudioPhase2;
|
||||
@FXML
|
||||
private TextField AudioPhase3;
|
||||
@FXML
|
||||
private TextField AudioPhase4;
|
||||
@FXML
|
||||
private TextField AudioPhase5;
|
||||
|
||||
@FXML
|
||||
private ComboBox<String> CameraLeft90;
|
||||
@FXML
|
||||
@@ -49,10 +34,262 @@ public class SettingView {
|
||||
@FXML
|
||||
private TextField FTPPath;
|
||||
|
||||
@FXML
|
||||
private TextField Sharpness;
|
||||
|
||||
@FXML
|
||||
private TextField PhotoDirectoryPath;
|
||||
|
||||
@FXML
|
||||
private CheckBox MirrorCamera;
|
||||
|
||||
@FXML
|
||||
private CheckBox FlipCamera;
|
||||
|
||||
@FXML
|
||||
private TextField Cam1TopCrop;
|
||||
@FXML
|
||||
private TextField Cam1BottomCrop;
|
||||
@FXML
|
||||
private TextField Cam1LeftCrop;
|
||||
@FXML
|
||||
private TextField Cam1RightCrop;
|
||||
|
||||
@FXML
|
||||
private TextField Cam2TopCrop;
|
||||
@FXML
|
||||
private TextField Cam2BottomCrop;
|
||||
@FXML
|
||||
private TextField Cam2LeftCrop;
|
||||
@FXML
|
||||
private TextField Cam2RightCrop;
|
||||
|
||||
@FXML
|
||||
private TextField Cam3TopCrop;
|
||||
@FXML
|
||||
private TextField Cam3BottomCrop;
|
||||
@FXML
|
||||
private TextField Cam3LeftCrop;
|
||||
@FXML
|
||||
private TextField Cam3RightCrop;
|
||||
|
||||
@FXML
|
||||
private TextField Cam4TopCrop;
|
||||
@FXML
|
||||
private TextField Cam4BottomCrop;
|
||||
@FXML
|
||||
private TextField Cam4LeftCrop;
|
||||
@FXML
|
||||
private TextField Cam4RightCrop;
|
||||
|
||||
@FXML
|
||||
private TextField Cam5TopCrop;
|
||||
@FXML
|
||||
private TextField Cam5BottomCrop;
|
||||
@FXML
|
||||
private TextField Cam5LeftCrop;
|
||||
@FXML
|
||||
private TextField Cam5RightCrop;
|
||||
|
||||
@FXML
|
||||
private RadioButton apiStaging;
|
||||
@FXML
|
||||
private RadioButton apiProduction;
|
||||
|
||||
@FXML
|
||||
public void changeAPIClick(){
|
||||
if (apiStaging.isSelected()){
|
||||
config.setAPI(false);
|
||||
config.Save();
|
||||
ShowAlert(Alert.AlertType.INFORMATION, "API Change", "API Change", "API Staging is selected, API will use Staging URL");
|
||||
} else if (apiProduction.isSelected()){
|
||||
config.setAPI(true);
|
||||
config.Save();
|
||||
ShowAlert(Alert.AlertType.INFORMATION, "API Change", "API Change", "API Production is selected, API will use Production URL");
|
||||
} else {
|
||||
ShowAlert(Alert.AlertType.ERROR, "API Change Error", "API Change Error", "Please select API Staging or API Production");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ApplyCropClick(){
|
||||
// Apply crop settings for each camera
|
||||
boolean[] all_correct = {true};
|
||||
|
||||
CheckTextField(Cam1TopCrop,all_correct);
|
||||
CheckTextField(Cam1BottomCrop,all_correct);
|
||||
CheckTextField(Cam1LeftCrop,all_correct);
|
||||
CheckTextField(Cam1RightCrop,all_correct);
|
||||
CheckTextField(Cam2TopCrop,all_correct);
|
||||
CheckTextField(Cam2BottomCrop,all_correct);
|
||||
CheckTextField(Cam2LeftCrop,all_correct);
|
||||
CheckTextField(Cam2RightCrop,all_correct);
|
||||
CheckTextField(Cam3TopCrop,all_correct);
|
||||
CheckTextField(Cam3BottomCrop,all_correct);
|
||||
CheckTextField(Cam3LeftCrop,all_correct);
|
||||
CheckTextField(Cam3RightCrop,all_correct);
|
||||
CheckTextField(Cam4TopCrop,all_correct);
|
||||
CheckTextField(Cam4BottomCrop,all_correct);
|
||||
CheckTextField(Cam4LeftCrop,all_correct);
|
||||
CheckTextField(Cam4RightCrop,all_correct);
|
||||
CheckTextField(Cam5TopCrop,all_correct);
|
||||
CheckTextField(Cam5BottomCrop,all_correct);
|
||||
CheckTextField(Cam5LeftCrop,all_correct);
|
||||
CheckTextField(Cam5RightCrop,all_correct);
|
||||
|
||||
if (all_correct[0]){
|
||||
config.setCam1TopCrop(Cam1TopCrop.getText());
|
||||
config.setCam1BottomCrop(Cam1BottomCrop.getText());
|
||||
config.setCam1LeftCrop(Cam1LeftCrop.getText());
|
||||
config.setCam1RightCrop(Cam1RightCrop.getText());
|
||||
config.setCam2TopCrop(Cam2TopCrop.getText());
|
||||
config.setCam2BottomCrop(Cam2BottomCrop.getText());
|
||||
config.setCam2LeftCrop(Cam2LeftCrop.getText());
|
||||
config.setCam2RightCrop(Cam2RightCrop.getText());
|
||||
config.setCam3TopCrop(Cam3TopCrop.getText());
|
||||
config.setCam3BottomCrop(Cam3BottomCrop.getText());
|
||||
config.setCam3LeftCrop(Cam3LeftCrop.getText());
|
||||
config.setCam3RightCrop(Cam3RightCrop.getText());
|
||||
config.setCam4TopCrop(Cam4TopCrop.getText());
|
||||
config.setCam4BottomCrop(Cam4BottomCrop.getText());
|
||||
config.setCam4LeftCrop(Cam4LeftCrop.getText());
|
||||
config.setCam4RightCrop(Cam4RightCrop.getText());
|
||||
config.setCam5TopCrop(Cam5TopCrop.getText());
|
||||
config.setCam5BottomCrop(Cam5BottomCrop.getText());
|
||||
config.setCam5LeftCrop(Cam5LeftCrop.getText());
|
||||
config.setCam5RightCrop(Cam5RightCrop.getText());
|
||||
|
||||
config.Save();
|
||||
} else {
|
||||
ShowAlert(Alert.AlertType.ERROR, "Crop Setting Error", "Crop Setting Error", "Please check your crop settings, some values are invalid");
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckTextField(TextField tf, boolean[] value){
|
||||
if (ValidCropValue(tf)){
|
||||
tf.setStyle("");
|
||||
} else {
|
||||
tf.setStyle("-fx-border-color: red;");
|
||||
value[0] = false;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean ValidCropValue(TextField tf){
|
||||
if (tf != null){
|
||||
double value;
|
||||
String name = tf.getId();
|
||||
try {
|
||||
value = Double.parseDouble(tf.getText());
|
||||
if (value >= 0.0){
|
||||
if (name.contains("Top")){
|
||||
return value <= config.getTopcropmax();
|
||||
} else if (name.contains("Bottom")){
|
||||
return value <= config.getBottomcropmax();
|
||||
} else if (name.contains("Left")){
|
||||
return value <= config.getLeftcropmax();
|
||||
} else if (name.contains("Right")){
|
||||
return value <= config.getRightcropmax();
|
||||
}
|
||||
}
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
final FileChooser jfc = new FileChooser();
|
||||
|
||||
String[] cameranames = null;
|
||||
|
||||
@FXML
|
||||
private TextField cascadeMinSize;
|
||||
|
||||
@FXML
|
||||
private TextField cascadeScaleFactor;
|
||||
|
||||
@FXML
|
||||
private TextField cascadeMaxSize;
|
||||
|
||||
@FXML
|
||||
private void ChangePhotoDirectoryPath(){
|
||||
DirectoryChooser dc = new DirectoryChooser();
|
||||
dc.setTitle("Select Directory");
|
||||
String path = dc.showDialog(null).getAbsolutePath();
|
||||
|
||||
config.SetPhotoDirectory(path);
|
||||
config.Save();
|
||||
TextFieldSetText(PhotoDirectoryPath,path);
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void SharpnessApply(){
|
||||
String str = Sharpness.getText();
|
||||
if (ValidDouble(str)){
|
||||
config.setSharpnessThreshold(Double.parseDouble(str));
|
||||
config.Save();
|
||||
} else {
|
||||
ShowAlert(Alert.AlertType.ERROR, "Sharpness Setting Error", "Sharpness Setting Error", "Sharpness Setting must be a number");
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void CascadeSettingApply(){
|
||||
|
||||
String minsize = cascadeMinSize.getText();
|
||||
String scalefactor = cascadeScaleFactor.getText();
|
||||
String maxsize = cascadeMaxSize.getText();
|
||||
|
||||
if (ValidString(minsize)){
|
||||
if (ValidString(maxsize)){
|
||||
if (ValidString(scalefactor)){
|
||||
try{
|
||||
int min = Integer.parseInt(minsize);
|
||||
double scale = Double.parseDouble(scalefactor);
|
||||
int max = Integer.parseInt(maxsize);
|
||||
if (scale> 1.0){
|
||||
if (min>0){
|
||||
if (max>min){
|
||||
config.setCascadeMaxSize(max);
|
||||
config.setCascadeMinSize(min);
|
||||
config.setCascadeScaleFactor(scale);
|
||||
config.Save();
|
||||
|
||||
if (MainApplication.detectorsList!=null){
|
||||
MainApplication.detectorsList.forEach((i,d)-> {
|
||||
d.setFaceMaxSize(max);
|
||||
d.setFaceMinSize(min);
|
||||
d.setScaleFactor(scale);
|
||||
});
|
||||
|
||||
} else {
|
||||
Logger.error("MainApplication.detectorsList is null, unable to set cascade settings");
|
||||
}
|
||||
|
||||
// Detectors.setFaceMaxSize(max);
|
||||
// Detectors.setFaceMinSize(min);
|
||||
// Detectors.setScaleFactor(scale);
|
||||
ShowAlert(Alert.AlertType.INFORMATION, "Cascade Setting", "Cascade Setting Saved", "Cascade Setting Saved Successfully");
|
||||
|
||||
} else show_cascade_alert("Max Size must be greater than Min Size");
|
||||
} else show_cascade_alert("Min Size must be greater than 0");
|
||||
} else show_cascade_alert("Scale Factor must be greater than 1.0");
|
||||
} catch (NumberFormatException e){
|
||||
show_cascade_alert("Min Size, Scale Factor, and Max Size must be a number");
|
||||
}
|
||||
} else show_cascade_alert("Scale Factor must not empty");
|
||||
} else show_cascade_alert("Max Size must not empty");
|
||||
} else show_cascade_alert("Min Size must not empty");
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void show_cascade_alert(String content){
|
||||
ShowAlert(Alert.AlertType.ERROR, "Cascade Setting Error", "Cascade Setting Error", content);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void initialize(){
|
||||
FileChooser.ExtensionFilter filter = new FileChooser.ExtensionFilter("Audio File", "wav","mp3");
|
||||
@@ -66,15 +303,18 @@ public class SettingView {
|
||||
Logger.error("Unable to detect Cameras, Msg : "+e.getMessage());
|
||||
}
|
||||
|
||||
MirrorCamera.selectedProperty().addListener(((observable, oldValue, newValue) -> {
|
||||
config.setMirrorCamera(newValue);
|
||||
config.Save();
|
||||
}));
|
||||
|
||||
FlipCamera.selectedProperty().addListener((observable, oldValue, newValue) -> {
|
||||
config.setFlipCamera(newValue);
|
||||
config.Save();
|
||||
});
|
||||
|
||||
|
||||
Platform.runLater(()->{
|
||||
AudioPhase1.setText(config.getAudioPhase1());
|
||||
AudioPhase2.setText(config.getAudioPhase2());
|
||||
AudioPhase3.setText(config.getAudioPhase3());
|
||||
AudioPhase4.setText(config.getAudioPhase4());
|
||||
AudioPhase5.setText(config.getAudioPhase5());
|
||||
|
||||
CameraLeft90.getItems().clear();
|
||||
CameraLeft45.getItems().clear();
|
||||
@@ -103,11 +343,46 @@ public class SettingView {
|
||||
CameraRight45.setValue(config.getCameraRight45());
|
||||
CameraRight90.setValue(config.getCameraRight90());
|
||||
|
||||
FTPHost.setText(config.getFTPHost());
|
||||
FTPPort.setText(config.getFTPPort());
|
||||
FTPUser.setText(config.getFTPUser());
|
||||
FTPPass.setText(config.getFTPPass());
|
||||
FTPPath.setText(config.getFTPPath());
|
||||
TextFieldSetText(FTPHost,config.getFTPHost());
|
||||
TextFieldSetText(FTPPort,config.getFTPPort());
|
||||
TextFieldSetText(FTPUser,config.getFTPUser());
|
||||
TextFieldSetText(FTPPass,config.getFTPPass());
|
||||
TextFieldSetText(FTPPath,config.getFTPPath());
|
||||
|
||||
TextFieldSetText(PhotoDirectoryPath,config.getPhotoDirectory());
|
||||
|
||||
TextFieldSetText(cascadeScaleFactor,String.valueOf(config.getCascadeScaleFactor()));
|
||||
TextFieldSetText(cascadeMinSize,String.valueOf(config.getCascadeMinSize()));
|
||||
TextFieldSetText(cascadeMaxSize,String.valueOf(config.getCascadeMaxSize()));
|
||||
|
||||
|
||||
MirrorCamera.setSelected(config.isMirrorCamera());
|
||||
FlipCamera.setSelected(config.isFlipCamera());
|
||||
apiStaging.setSelected(!config.isProduction());
|
||||
apiProduction.setSelected(config.isProduction());
|
||||
|
||||
TextFieldSetText(Sharpness,String.valueOf(config.getSharpnessThreshold()));
|
||||
TextFieldSetText(Cam1TopCrop,String.valueOf(config.getCam1TopCrop()));
|
||||
TextFieldSetText(Cam1BottomCrop,String.valueOf(config.getCam1BottomCrop()));
|
||||
TextFieldSetText(Cam1LeftCrop,String.valueOf(config.getCam1LeftCrop()));
|
||||
TextFieldSetText(Cam1RightCrop,String.valueOf(config.getCam1RightCrop()));
|
||||
TextFieldSetText(Cam2TopCrop,String.valueOf(config.getCam2TopCrop()));
|
||||
TextFieldSetText(Cam2BottomCrop,String.valueOf(config.getCam2BottomCrop()));
|
||||
TextFieldSetText(Cam2LeftCrop,String.valueOf(config.getCam2LeftCrop()));
|
||||
TextFieldSetText(Cam2RightCrop,String.valueOf(config.getCam2RightCrop()));
|
||||
TextFieldSetText(Cam3TopCrop,String.valueOf(config.getCam3TopCrop()));
|
||||
TextFieldSetText(Cam3BottomCrop,String.valueOf(config.getCam3BottomCrop()));
|
||||
TextFieldSetText(Cam3LeftCrop,String.valueOf(config.getCam3LeftCrop()));
|
||||
TextFieldSetText(Cam3RightCrop,String.valueOf(config.getCam3RightCrop()));
|
||||
TextFieldSetText(Cam4TopCrop,String.valueOf(config.getCam4TopCrop()));
|
||||
TextFieldSetText(Cam4BottomCrop,String.valueOf(config.getCam4BottomCrop()));
|
||||
TextFieldSetText(Cam4LeftCrop,String.valueOf(config.getCam4LeftCrop()));
|
||||
TextFieldSetText(Cam4RightCrop,String.valueOf(config.getCam4RightCrop()));
|
||||
TextFieldSetText(Cam5TopCrop,String.valueOf(config.getCam5TopCrop()));
|
||||
TextFieldSetText(Cam5BottomCrop,String.valueOf(config.getCam5BottomCrop()));
|
||||
TextFieldSetText(Cam5LeftCrop,String.valueOf(config.getCam5LeftCrop()));
|
||||
TextFieldSetText(Cam5RightCrop,String.valueOf(config.getCam5RightCrop()));
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@@ -115,52 +390,6 @@ public class SettingView {
|
||||
config.Save();
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void BrowseAudioPhase1(){
|
||||
File file = jfc.showOpenDialog(null);
|
||||
if (file!=null){
|
||||
config.SetAudioPhase1(file.getAbsolutePath());
|
||||
AudioPhase1.setText(config.getAudioPhase1());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void BrowseAudioPhase2(){
|
||||
File file = jfc.showOpenDialog(null);
|
||||
if (file!=null){
|
||||
config.SetAudioPhase2(file.getAbsolutePath());
|
||||
AudioPhase2.setText(config.getAudioPhase2());
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void BrowseAudioPhase3(){
|
||||
File file = jfc.showOpenDialog(null);
|
||||
if (file!=null){
|
||||
config.SetAudioPhase3(file.getAbsolutePath());
|
||||
AudioPhase3.setText(config.getAudioPhase3());
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void BrowseAudioPhase4(){
|
||||
File file = jfc.showOpenDialog(null);
|
||||
if (file!=null){
|
||||
config.SetAudioPhase4(file.getAbsolutePath());
|
||||
AudioPhase4.setText(config.getAudioPhase4());
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void BrowseAudioPhase5(){
|
||||
File file = jfc.showOpenDialog(null);
|
||||
if (file!=null){
|
||||
config.SetAudioPhase5(file.getAbsolutePath());
|
||||
AudioPhase5.setText(config.getAudioPhase5());
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
private void ApplyCameraLeft90(){
|
||||
config.SetCameraLeft90(CameraLeft90.getValue());
|
||||
@@ -198,18 +427,8 @@ public class SettingView {
|
||||
config.SetFTPPass(FTPPass.getText());
|
||||
config.SetFTPPath(FTPPath.getText());
|
||||
|
||||
val alert = new Alert(Alert.AlertType.INFORMATION);
|
||||
alert.setTitle("FTP Configuration");
|
||||
alert.setHeaderText("FTP Configuration Saved");
|
||||
alert.setContentText("FTP Configuration Saved Successfully");
|
||||
alert.showAndWait();
|
||||
} else {
|
||||
val alert = new Alert(Alert.AlertType.ERROR);
|
||||
alert.setTitle("FTP Error");
|
||||
alert.setHeaderText("FTP Configuration Error");
|
||||
alert.setContentText("FTP Configuration is incorrect, please check your FTP Configuration");
|
||||
alert.showAndWait();
|
||||
}
|
||||
ShowAlert(Alert.AlertType.INFORMATION, "FTP Configuration", "FTP Configuration Saved", "FTP Configuration Saved Successfully");
|
||||
} else ShowAlert(Alert.AlertType.ERROR, "FTP Error", "FTP Configuration Error", "FTP Configuration is incorrect, please check your FTP Configuration");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.ProgressBar;
|
||||
|
||||
import static Config.SomeCodes.LabelSetText;
|
||||
import static Config.SomeCodes.ValidString;
|
||||
|
||||
public class UploadProgress {
|
||||
@@ -31,9 +32,7 @@ public class UploadProgress {
|
||||
* @param filename the filename to be displayed
|
||||
*/
|
||||
public void SetFile(String filename){
|
||||
if (ValidString(filename)){
|
||||
labelfile.setText(filename);
|
||||
}
|
||||
LabelSetText(this.labelfile, filename,null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -41,9 +40,7 @@ public class UploadProgress {
|
||||
* @param status the status to be displayed
|
||||
*/
|
||||
public void SetStatus(String status){
|
||||
if (ValidString(status)){
|
||||
labelstatus.setText(status);
|
||||
}
|
||||
LabelSetText(this.labelstatus, status,null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -15,11 +15,15 @@ module id.co.gtc.erhacam {
|
||||
requires org.tinylog.api;
|
||||
requires java.sql;
|
||||
requires javafx.graphics;
|
||||
requires java.net.http;
|
||||
requires org.tinylog.impl;
|
||||
|
||||
|
||||
opens id.co.gtc.erhacam to javafx.fxml;
|
||||
opens BASS to com.sun.jna;
|
||||
opens Config to com.google.gson;
|
||||
opens Database to javafx.base;
|
||||
opens ErhaAPI to com.google.gson;
|
||||
exports id.co.gtc.erhacam;
|
||||
|
||||
}
|
||||
@@ -196,11 +196,7 @@ public class Cameradetail_Arducam {
|
||||
* @param title Title of the Camera
|
||||
*/
|
||||
public void setCameraTitle(String title){
|
||||
if (ValidString(title)){
|
||||
if (cameratitle!=null){
|
||||
cameratitle.setText(title);
|
||||
}
|
||||
}
|
||||
LabelSetText(this.cameratitle, title, null);
|
||||
}
|
||||
|
||||
public void setSaturation(double value){
|
||||
@@ -258,11 +254,7 @@ public class Cameradetail_Arducam {
|
||||
* @param status Status of the Camera
|
||||
*/
|
||||
public void setCameraStatus(String status){
|
||||
if (ValidString(status)){
|
||||
if (camerastatus!=null){
|
||||
camerastatus.setText(status);
|
||||
}
|
||||
}
|
||||
LabelSetText(this.camerastatus, status,null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -518,13 +510,12 @@ public class Cameradetail_Arducam {
|
||||
* @param prefix filename prefix
|
||||
* @return filename path of the saved photo, or null if failed
|
||||
*/
|
||||
@SuppressWarnings("BusyWait")
|
||||
public String TakePhoto(String directory, String prefix){
|
||||
if (!ValidDirectory(directory)) directory = currentDirectory;
|
||||
if (mGrabber!=null){
|
||||
try{
|
||||
long nanos = System.nanoTime();
|
||||
while(IsGrabbingLiveView.get()) Thread.sleep(10);
|
||||
while(IsGrabbingLiveView.get()) Wait(10);
|
||||
long delta = System.nanoTime() - nanos;
|
||||
double ms = delta / 1000000.0;
|
||||
if (event!=null) event.onLog("Waited IsGrabbingLiveView for "+ms+" miliseconds");
|
||||
@@ -541,10 +532,10 @@ public class Cameradetail_Arducam {
|
||||
|
||||
|
||||
setAutoWB(true);
|
||||
Thread.sleep(1000);
|
||||
Wait(1000);
|
||||
|
||||
setAutoExposure(true);
|
||||
Thread.sleep(1000);
|
||||
Wait(1000);
|
||||
|
||||
long delta3 = System.nanoTime() - nanos;
|
||||
double ms3 = delta3 / 1000000.0;
|
||||
@@ -638,7 +629,7 @@ public class Cameradetail_Arducam {
|
||||
Capturing.set(false);
|
||||
if (mGrabber!=null){
|
||||
try{
|
||||
mGrabber.stop();
|
||||
mGrabber.close();
|
||||
Platform.runLater(()->setCameraStatus("Camera Stopped"));
|
||||
} catch (Exception e){
|
||||
if (event!=null) event.onLog("StopLiveView failed, Unable to Stop Camera, Error: " + e.getMessage());
|
||||
@@ -672,14 +663,13 @@ public class Cameradetail_Arducam {
|
||||
AutoWhiteBalance.setSelected(true);
|
||||
|
||||
val task = new Task<Image>() {
|
||||
@SuppressWarnings("BusyWait")
|
||||
@Override
|
||||
protected Image call() {
|
||||
while (Capturing.get()) {
|
||||
try {
|
||||
// selama proses pengambilan foto, jangan ambil frame
|
||||
while(TakingPhoto.get() && Capturing.get()){
|
||||
Thread.sleep(10);
|
||||
Wait(10);
|
||||
}
|
||||
|
||||
if (!Capturing.get()) return null;
|
||||
@@ -705,12 +695,12 @@ public class Cameradetail_Arducam {
|
||||
if (use_face){
|
||||
RectVector face = DetectFace(graymat);
|
||||
if (face!=null && face.size()>0){
|
||||
if (event!=null) event.onFaceDetector(true,photoWidth, photoHeight);
|
||||
if (event!=null) event.onFrontalFaceDetector(true,photoWidth, photoHeight);
|
||||
for(int i=0; i<face.size(); i++){
|
||||
val rect = face.get(i);
|
||||
rectangle(umat, rect, Scalar.GREEN);
|
||||
}
|
||||
} else if (event!=null) event.onFaceDetector(false, photoWidth, photoHeight);
|
||||
} else if (event!=null) event.onFrontalFaceDetector(false, photoWidth, photoHeight);
|
||||
|
||||
}
|
||||
|
||||
@@ -736,7 +726,10 @@ public class Cameradetail_Arducam {
|
||||
});
|
||||
|
||||
// start task
|
||||
new Thread(task).start();
|
||||
Thread taskThread = new Thread(task);
|
||||
taskThread.setDaemon(true);
|
||||
taskThread.start();
|
||||
|
||||
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
@@ -782,11 +775,11 @@ public class Cameradetail_Arducam {
|
||||
* @return true if face detected, otherwise false
|
||||
*/
|
||||
private RectVector DetectFace(UMat graymat){
|
||||
if (faceDetector!=null){
|
||||
val face = new RectVector();
|
||||
faceDetector.detectMultiScale(graymat, face);
|
||||
return face;
|
||||
}
|
||||
// if (frontalfaceDetector!=null){
|
||||
// val face = new RectVector();
|
||||
// frontalfaceDetector.detectMultiScale(graymat, face);
|
||||
// return face;
|
||||
// }
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<?import javafx.scene.image.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<AnchorPane prefHeight="280.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.14-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.Cameradetail">
|
||||
<AnchorPane prefHeight="720.0" prefWidth="360.0" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.Cameradetail">
|
||||
<children>
|
||||
<GridPane layoutX="5.0" layoutY="5.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
@@ -20,8 +20,12 @@
|
||||
<children>
|
||||
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="10.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
|
||||
@@ -37,6 +41,28 @@
|
||||
<Label fx:id="camerastatus" alignment="CENTER" style="-fx-border-color: black;" text="Camera Status" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" style="-fx-border-color: black;" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Label fx:id="face_indicator" alignment="CENTER" layoutY="8.0" prefHeight="30.0" prefWidth="35.0" text="Face" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
|
||||
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" style="-fx-border-color: black;" GridPane.columnIndex="3">
|
||||
<children>
|
||||
<Label fx:id="eye_indicator" alignment="CENTER" layoutY="8.0" prefHeight="30.0" prefWidth="35.0" text="Eye" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="5">
|
||||
<children>
|
||||
<Label fx:id="sharpness_indicator" alignment="CENTER" layoutX="7.0" layoutY="8.0" prefHeight="30.0" prefWidth="35.0" style="-fx-border-color: black;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4">
|
||||
<children>
|
||||
<Label fx:id="BlinkCounterLabel" alignment="CENTER" layoutY="8.0" prefHeight="30.0" prefWidth="35.0" style="-fx-border-color: black;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
@@ -46,15 +72,31 @@
|
||||
<GridPane layoutX="-28.0" layoutY="-29.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
|
||||
<ColumnConstraints fillWidth="false" minWidth="10.0" percentWidth="20.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="10.0" prefHeight="10.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane GridPane.columnIndex="1">
|
||||
<AnchorPane fx:id="streamanchor">
|
||||
<children>
|
||||
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0" prefWidth="140.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<StackPane layoutY="5.0" prefHeight="669.6" prefWidth="350.4" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<ImageView fx:id="camerastream" fitWidth="340.0" pickOnBounds="true" preserveRatio="true" smooth="false" StackPane.alignment="CENTER">
|
||||
<viewport>
|
||||
<Rectangle2D height="640.0" width="360.0" />
|
||||
</viewport>
|
||||
</ImageView>
|
||||
</children>
|
||||
</StackPane>
|
||||
</children>
|
||||
<GridPane.margin>
|
||||
<Insets />
|
||||
</GridPane.margin>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" scaleZ="0.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0" prefWidth="140.0" scaleZ="0.0" visible="false" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<Label text="Brightness" />
|
||||
<Slider fx:id="brightnessSlider" min="-100.0">
|
||||
@@ -101,19 +143,6 @@
|
||||
</VBox>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane fx:id="streamanchor">
|
||||
<children>
|
||||
<StackPane prefHeight="240.0" prefWidth="351.2" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<ImageView fx:id="camerastream" fitHeight="240.0" pickOnBounds="true">
|
||||
<image>
|
||||
<Image url="@gtcbackground.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</children>
|
||||
</StackPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
|
||||
127
src/main/resources/id/co/gtc/erhacam/cameradetail_landscape.fxml
Normal file
127
src/main/resources/id/co/gtc/erhacam/cameradetail_landscape.fxml
Normal file
@@ -0,0 +1,127 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.*?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.image.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<AnchorPane prefHeight="280.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.14-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.Cameradetail">
|
||||
<children>
|
||||
<GridPane layoutX="5.0" layoutY="5.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane minHeight="30.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="20.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane>
|
||||
<children>
|
||||
<Label fx:id="cameratitle" alignment="CENTER" style="-fx-border-color: black;" text="Camera Title" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="1">
|
||||
<children>
|
||||
<Label fx:id="camerastatus" alignment="CENTER" style="-fx-border-color: black;" text="Camera Status" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<GridPane layoutX="-28.0" layoutY="-29.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
|
||||
<ColumnConstraints fillWidth="false" minWidth="10.0" percentWidth="20.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane GridPane.columnIndex="1">
|
||||
<children>
|
||||
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0" prefWidth="140.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<Label text="Brightness" />
|
||||
<Slider fx:id="brightnessSlider" min="-100.0">
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</Slider>
|
||||
<Label text="Contrast" />
|
||||
<Slider fx:id="contrastSlider" layoutX="10.0" layoutY="28.0" min="-100.0">
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</Slider>
|
||||
<Label layoutX="10.0" layoutY="42.0" text="Saturation" />
|
||||
<Slider fx:id="saturationSlider" layoutX="10.0" layoutY="60.0" min="-100.0">
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</Slider>
|
||||
<Label layoutX="10.0" layoutY="74.0" text="Hue" />
|
||||
<Slider fx:id="hueSlider" layoutX="10.0" layoutY="92.0" min="-100.0" prefHeight="14.0" prefWidth="63.0">
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</Slider>
|
||||
<Label layoutX="10.0" layoutY="106.0" text="Gain" />
|
||||
<Slider fx:id="gainSlider" layoutX="10.0" layoutY="124.0" min="-100.0">
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</Slider>
|
||||
<Label layoutX="10.0" layoutY="138.0" text="Exposure" />
|
||||
<Slider fx:id="exposureSlider" layoutX="10.0" layoutY="156.0" min="-100.0">
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</Slider>
|
||||
<Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#resetClick" text="Reset">
|
||||
<VBox.margin>
|
||||
<Insets left="5.0" right="5.0" top="5.0" />
|
||||
</VBox.margin>
|
||||
</Button>
|
||||
</children>
|
||||
</VBox>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane fx:id="streamanchor">
|
||||
<children>
|
||||
<StackPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<ImageView fx:id="camerastream" fitWidth="240.0" pickOnBounds="true">
|
||||
<image>
|
||||
<Image url="@gtcbackground.png" />
|
||||
</image>
|
||||
</ImageView>
|
||||
</children>
|
||||
</StackPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</padding>
|
||||
</AnchorPane>
|
||||
@@ -3,108 +3,119 @@
|
||||
<?import javafx.geometry.*?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import javafx.scene.text.*?>
|
||||
|
||||
<AnchorPane fx:id="CaptureViewAnchor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="768.0" prefWidth="1024.0" xmlns="http://javafx.com/javafx/11.0.14-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.CaptureView">
|
||||
<AnchorPane fx:id="CaptureViewAnchor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="768.0" prefWidth="1024.0" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.CaptureView">
|
||||
<children>
|
||||
<GridPane layoutX="99.0" layoutY="147.0" style="-fx-grid-lines-visible: true;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<GridPane layoutX="147.0" layoutY="239.0" AnchorPane.bottomAnchor="200.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane fx:id="cam1" prefHeight="200.0" prefWidth="200.0" />
|
||||
<AnchorPane fx:id="cam2" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" />
|
||||
<AnchorPane fx:id="cam3" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" />
|
||||
<AnchorPane fx:id="cam4" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3" />
|
||||
<AnchorPane fx:id="cam5" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4" />
|
||||
</children>
|
||||
</GridPane>
|
||||
<GridPane layoutX="99.0" layoutY="147.0" style="-fx-grid-lines-visible: true;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="10.0" prefHeight="175.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane fx:id="cam1" prefHeight="200.0" prefWidth="200.0" />
|
||||
<AnchorPane fx:id="cam3" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1" />
|
||||
<AnchorPane fx:id="cam5" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2" />
|
||||
<AnchorPane fx:id="cam2" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" />
|
||||
<AnchorPane fx:id="cam4" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
|
||||
<AnchorPane fx:id="controlpane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<VBox layoutX="108.0" layoutY="14.0" prefHeight="256.0" prefWidth="512.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<GridPane>
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="30.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label layoutX="28.0" layoutY="8.0" prefHeight="30.0" prefWidth="154.0" text="Save Directory" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label layoutX="31.0" layoutY="6.0" prefHeight="30.0" prefWidth="154.0" text="Patient ID" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextArea fx:id="directorypath" editable="false" layoutX="14.0" layoutY="-86.0" prefHeight="114.0" prefWidth="358.0" promptText="Directory to save Photos" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<TextArea fx:id="prefixfile" layoutX="-21.0" layoutY="-85.0" prefHeight="115.0" prefWidth="358.0" promptText="Some identification for easy find" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="5.0" top="5.0" />
|
||||
</VBox.margin>
|
||||
</GridPane>
|
||||
<GridPane>
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Button layoutX="42.0" layoutY="14.0" mnemonicParsing="false" onAction="#ChangeDirectory" prefHeight="70.0" prefWidth="171.0" text="Change Directory" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<Button layoutX="72.0" layoutY="35.0" mnemonicParsing="false" onAction="#AutoFocus" prefHeight="70.0" prefWidth="171.0" text="Auto Focus" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Button fx:id="btnTakePhoto" layoutX="59.0" layoutY="23.0" mnemonicParsing="false" onAction="#TakePhotos" prefHeight="70.0" prefWidth="170.0" text="Take Photos" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets top="5.0" />
|
||||
</VBox.margin>
|
||||
</GridPane>
|
||||
<ScrollPane prefHeight="200.0" prefWidth="200.0">
|
||||
<content>
|
||||
<AnchorPane fx:id="progressanchor" />
|
||||
</content>
|
||||
<VBox.margin>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</VBox.margin>
|
||||
</ScrollPane>
|
||||
</children>
|
||||
</VBox>
|
||||
</children>
|
||||
<AnchorPane fx:id="controlpane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<padding>
|
||||
<Insets top="5.0" />
|
||||
</padding></AnchorPane>
|
||||
</padding>
|
||||
<children>
|
||||
<Button fx:id="TakePhotoButton" disable="true" mnemonicParsing="false" onAction="#TakePhotos" prefHeight="175.0" prefWidth="512.0" text="Take Photo" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
|
||||
<font>
|
||||
<Font size="48.0" />
|
||||
</font>
|
||||
</Button>
|
||||
</children></AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<GridPane layoutX="68.0" layoutY="14.0" prefHeight="175.2" prefWidth="512.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="30.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label layoutX="31.0" layoutY="6.0" prefHeight="30.0" prefWidth="154.0" text="Nomor Barcode" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label layoutX="63.0" layoutY="6.0" prefHeight="30.4" prefWidth="154.4" text="Medical Record ID" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Label layoutX="63.0" layoutY="5.0" prefHeight="30.4" prefWidth="154.4" text="Patient Name" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextArea fx:id="barcodeData" editable="false" layoutX="-21.0" layoutY="-85.0" prefHeight="115.0" prefWidth="358.0" promptText="barcode read result" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0">
|
||||
<font>
|
||||
<Font size="18.0" />
|
||||
</font>
|
||||
</TextArea>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<TextArea fx:id="medicalRecordID" editable="false" layoutX="14.0" layoutY="-84.0" prefHeight="116.0" prefWidth="358.4" promptText="medical record ID" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0">
|
||||
<font>
|
||||
<Font size="18.0" />
|
||||
</font>
|
||||
</TextArea>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<TextArea fx:id="PatientName" editable="false" layoutX="-21.0" layoutY="-84.0" prefHeight="116.0" prefWidth="358.4" promptText="patient name" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0">
|
||||
<font>
|
||||
<Font size="18.0" />
|
||||
</font>
|
||||
</TextArea>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children></AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
|
||||
111
src/main/resources/id/co/gtc/erhacam/capture-view_landscape.fxml
Normal file
111
src/main/resources/id/co/gtc/erhacam/capture-view_landscape.fxml
Normal file
@@ -0,0 +1,111 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.*?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<AnchorPane fx:id="CaptureViewAnchor" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="768.0" prefWidth="1024.0" xmlns="http://javafx.com/javafx/11.0.14-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.CaptureView">
|
||||
<children>
|
||||
<GridPane layoutX="99.0" layoutY="147.0" style="-fx-grid-lines-visible: true;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane fx:id="cam1" prefHeight="200.0" prefWidth="200.0" />
|
||||
<AnchorPane fx:id="cam3" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1" />
|
||||
<AnchorPane fx:id="cam5" prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2" />
|
||||
<AnchorPane fx:id="cam2" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" />
|
||||
<AnchorPane fx:id="cam4" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
|
||||
<AnchorPane fx:id="controlpane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<VBox layoutX="108.0" layoutY="14.0" prefHeight="256.0" prefWidth="512.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<GridPane>
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="30.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label layoutX="28.0" layoutY="8.0" prefHeight="30.0" prefWidth="154.0" text="Save Directory" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label layoutX="31.0" layoutY="6.0" prefHeight="30.0" prefWidth="154.0" text="Patient ID" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextArea fx:id="directorypath" editable="false" layoutX="14.0" layoutY="-86.0" prefHeight="114.0" prefWidth="358.0" promptText="Directory to save Photos" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<TextArea fx:id="prefixfile" layoutX="-21.0" layoutY="-85.0" prefHeight="115.0" prefWidth="358.0" promptText="Some identification for easy find" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="5.0" top="5.0" />
|
||||
</VBox.margin>
|
||||
</GridPane>
|
||||
<GridPane>
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Button layoutX="42.0" layoutY="14.0" mnemonicParsing="false" onAction="#ChangeDirectory" prefHeight="70.0" prefWidth="171.0" text="Change Directory" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<Button fx:id="btnAutoFocus" layoutX="72.0" layoutY="35.0" mnemonicParsing="false" onAction="#AutoFocus" prefHeight="70.0" prefWidth="171.0" text="Auto Focus" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Button fx:id="btnTakePhoto" layoutX="59.0" layoutY="23.0" mnemonicParsing="false" onAction="#TakePhotos" prefHeight="70.0" prefWidth="170.0" text="Take Photos" wrapText="true" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets top="5.0" />
|
||||
</VBox.margin>
|
||||
</GridPane>
|
||||
<ScrollPane prefHeight="200.0" prefWidth="200.0">
|
||||
<content>
|
||||
<AnchorPane fx:id="progressanchor" />
|
||||
</content>
|
||||
<VBox.margin>
|
||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||
</VBox.margin>
|
||||
</ScrollPane>
|
||||
</children>
|
||||
</VBox>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets top="5.0" />
|
||||
</padding></AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
@@ -19,16 +19,19 @@
|
||||
<RowConstraints minHeight="36.0" prefHeight="36.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Button fx:id="ReviewButton" layoutX="99.0" layoutY="2.0" mnemonicParsing="false" onAction="#ReviewClick" text="Review" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<Button fx:id="CaptureButton" layoutX="103.0" layoutY="6.0" mnemonicParsing="false" onAction="#CaptureClick" text="Capture" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
<children>
|
||||
<Button fx:id="CaptureButton" layoutX="103.0" layoutY="6.0" mnemonicParsing="false" onAction="#CaptureClick" text="Capture" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Button fx:id="SettingButton" layoutX="64.0" layoutY="2.0" mnemonicParsing="false" onAction="#SettingClick" text="Setting" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="0.0" />
|
||||
|
||||
@@ -1,16 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ComboBox?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.TextField?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
<?import javafx.scene.layout.ColumnConstraints?>
|
||||
<?import javafx.scene.layout.GridPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<AnchorPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefWidth="1024.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.SettingView">
|
||||
<AnchorPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefWidth="1024.0" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="id.co.gtc.erhacam.SettingView">
|
||||
<children>
|
||||
<GridPane layoutX="70.0" layoutY="78.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
@@ -18,220 +11,508 @@
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="200.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="200.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="300.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="200.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="40.0" prefHeight="40.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="44.0" layoutY="7.0" text="Audio Setting" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="195.0" layoutY="7.0" text="Camera Setting" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="4">
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="239.0" layoutY="8.0" text="FTP Setting" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<GridPane layoutX="149.0" layoutY="-29.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="15.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="15.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<GridPane fx:id="camerassetting" prefHeight="300.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints percentWidth="40.0" />
|
||||
<ColumnConstraints percentWidth="40.0" />
|
||||
<ColumnConstraints percentWidth="20.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane>
|
||||
<children>
|
||||
<GridPane fx:id="cameraselection" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints percentWidth="25" />
|
||||
<ColumnConstraints percentWidth="50" />
|
||||
<ColumnConstraints percentWidth="25" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label layoutX="30.0" layoutY="12.0" prefHeight="40.8" prefWidth="87.2" text="Cam 1" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Label layoutX="44.0" layoutY="12.0" prefHeight="40.8" prefWidth="87.2" text="Cam 2" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<Label layoutX="30.0" layoutY="6.0" prefHeight="40.8" prefWidth="87.2" text="Cam 3" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<Label layoutX="24.0" layoutY="6.0" prefHeight="40.0" prefWidth="87.2" text="Cam 4" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="5">
|
||||
<children>
|
||||
<Label layoutX="36.0" layoutY="11.0" prefHeight="40.0" prefWidth="87.2" text="Cam 5" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraLeft90" layoutX="54.0" layoutY="8.0" prefHeight="40.8" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraLeft45" layoutX="26.0" layoutY="14.0" prefHeight="40.8" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraCenter" layoutX="88.0" layoutY="8.0" prefHeight="40.8" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraRight45" layoutX="54.0" layoutY="8.0" prefHeight="40.0" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="5">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraRight90" layoutX="75.0" layoutY="1.0" prefHeight="40.0" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Button layoutY="8.0" mnemonicParsing="false" onAction="#ApplyCameraLeft90" prefHeight="40.8" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Button layoutX="22.0" layoutY="2.0" mnemonicParsing="false" onAction="#ApplyCameraLeft45" prefHeight="40.8" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<Button layoutX="18.0" layoutY="2.0" mnemonicParsing="false" onAction="#ApplyCameraFront" prefHeight="40.8" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<Button layoutX="22.0" layoutY="8.0" mnemonicParsing="false" onAction="#ApplyCameraRight45" prefHeight="40.0" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="5">
|
||||
<children>
|
||||
<Button layoutX="22.0" layoutY="8.0" mnemonicParsing="false" onAction="#ApplyCameraRight90" prefHeight="40.0" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="6">
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label layoutX="62.0" layoutY="8.0" text="Phase 1 File" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label layoutX="49.0" layoutY="8.0" prefHeight="30.4" prefWidth="180.0" text="Phase 2 File" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Label layoutX="62.0" layoutY="5.0" prefHeight="30.4" prefWidth="180.0" text="Phase 3 File" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<Label layoutX="22.0" layoutY="6.0" prefHeight="30.4" prefWidth="180.0" text="Phase 4 File" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<Label layoutX="34.0" layoutY="6.0" prefHeight="30.4" prefWidth="180.0" text="Phase 5 File" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="AudioPhase1" layoutX="14.0" layoutY="4.0" prefHeight="30.4" prefWidth="329.6" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="AudioPhase2" layoutX="-32.0" layoutY="1.0" prefHeight="30.4" prefWidth="329.6" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<TextField fx:id="AudioPhase3" layoutY="2.0" prefHeight="30.4" prefWidth="329.6" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<TextField fx:id="AudioPhase4" layoutX="51.0" layoutY="2.0" prefHeight="30.4" prefWidth="329.6" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<TextField fx:id="AudioPhase5" layoutX="14.0" layoutY="2.0" prefHeight="30.4" prefWidth="329.6" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Button layoutX="14.0" layoutY="3.0" mnemonicParsing="false" onAction="#BrowseAudioPhase1" prefHeight="30.4" prefWidth="90.4" text="Browse" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Button layoutX="19.0" layoutY="4.0" mnemonicParsing="false" onAction="#BrowseAudioPhase2" prefHeight="30.4" prefWidth="90.4" text="Browse" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Button layoutX="19.0" layoutY="4.0" mnemonicParsing="false" onAction="#BrowseAudioPhase3" prefHeight="30.4" prefWidth="90.4" text="Browse" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<Button layoutX="14.0" layoutY="14.0" mnemonicParsing="false" onAction="#BrowseAudioPhase4" prefHeight="40.0" prefWidth="90.4" text="Browse" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<Button layoutY="4.0" mnemonicParsing="false" onAction="#BrowseAudioPhase5" prefHeight="30.4" prefWidth="90.4" text="Browse" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<Label layoutX="60.0" prefHeight="40.0" prefWidth="175.0" text="Mirror" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</GridPane>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="6">
|
||||
<children>
|
||||
<CheckBox fx:id="MirrorCamera" layoutX="30.0" layoutY="6.0" mnemonicParsing="false" prefHeight="40.0" prefWidth="175.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="7">
|
||||
<children>
|
||||
<Label prefHeight="40.0" prefWidth="175.0" text="Flip" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="7">
|
||||
<children>
|
||||
<CheckBox fx:id="FlipCamera" mnemonicParsing="false" prefHeight="40.0" prefWidth="175.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label layoutX="32.0" layoutY="19.0" prefHeight="37.0" prefWidth="92.0" text="Sharpness" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="Sharpness" layoutX="35.0" layoutY="2.0" prefHeight="37.0" prefWidth="368.0" promptText="if Sharpness below this number, photos considered as blurred" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Button mnemonicParsing="false" onAction="#SharpnessApply" prefHeight="37.0" prefWidth="92.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.rowIndex="8">
|
||||
<children>
|
||||
<Label text="API Type" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="1" GridPane.rowIndex="8">
|
||||
<children>
|
||||
<RadioButton fx:id="apiStaging" layoutX="14.0" layoutY="8.0" mnemonicParsing="false" text="Staging" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.topAnchor="2.0">
|
||||
<toggleGroup>
|
||||
<ToggleGroup fx:id="apiselect" />
|
||||
</toggleGroup></RadioButton>
|
||||
<RadioButton fx:id="apiProduction" layoutX="103.0" layoutY="11.0" mnemonicParsing="false" text="Production" toggleGroup="$apiselect" AnchorPane.bottomAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="2" GridPane.rowIndex="8">
|
||||
<children>
|
||||
<Button mnemonicParsing="false" onAction="#changeAPIClick" prefHeight="33.6" prefWidth="102.4" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane maxWidth="400.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints prefWidth="300" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Button mnemonicParsing="false" onAction="#CascadeSettingApply" prefHeight="40.0" prefWidth="410.4" text="Apply" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane>
|
||||
<children>
|
||||
<Label alignment="CENTER" prefHeight="30.4" prefWidth="410.4" text="Detection Parameters" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.rowIndex="1">
|
||||
<children>
|
||||
<GridPane prefHeight="200.0" prefWidth="300.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints percentWidth="70.0" />
|
||||
<ColumnConstraints percentWidth="30.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="40.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="40.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="40.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane>
|
||||
<children>
|
||||
<Label prefHeight="40.0" text="Scale Factor" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label prefHeight="40.0" text="Minimum Size" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Label prefHeight="40.0" text="Maximum Size" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="cascadeScaleFactor" alignment="CENTER" prefHeight="40.0" prefWidth="175.0" text="1.2" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="cascadeMinSize" alignment="CENTER" prefHeight="40.0" prefWidth="175.0" text="200" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="1" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<TextField fx:id="cascadeMaxSize" alignment="CENTER" prefHeight="40.0" prefWidth="175.2" text="400" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="1">
|
||||
<children>
|
||||
<GridPane fx:id="cropsetting" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="-Infinity" minHeight="-Infinity" prefHeight="50.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<GridPane layoutX="-21.0" layoutY="-31.0" prefHeight="30.4" prefWidth="399.2" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="36.0" layoutY="6.0" prefHeight="30.4" prefWidth="100.0" text="Top" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<Label alignment="CENTER" text="Bottom" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="7.0" layoutY="8.0" text="Left" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children></AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="36.0" layoutY="8.0" text="Right" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children></AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<GridPane prefHeight="50.4" prefWidth="399.2" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<TextField fx:id="Cam1TopCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="Cam1BottomCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<TextField fx:id="Cam1LeftCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
|
||||
<children>
|
||||
<TextField fx:id="Cam1RightCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<GridPane layoutX="-27.0" layoutY="-31.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<TextField fx:id="Cam2TopCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="Cam2BottomCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<TextField fx:id="Cam2LeftCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
|
||||
<children>
|
||||
<TextField fx:id="Cam2RightCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children></AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<TextField fx:id="Cam3TopCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="Cam3BottomCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<TextField fx:id="Cam3LeftCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
|
||||
<children>
|
||||
<TextField fx:id="Cam3RightCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children></AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<TextField fx:id="Cam4TopCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="Cam4BottomCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<TextField fx:id="Cam4LeftCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
|
||||
<children>
|
||||
<TextField fx:id="Cam4RightCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children></AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="5">
|
||||
<children>
|
||||
<GridPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<TextField fx:id="Cam5TopCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="Cam5BottomCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<TextField fx:id="Cam5LeftCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3">
|
||||
<children>
|
||||
<TextField fx:id="Cam5RightCrop" alignment="CENTER" promptText="crop percent" text="10" AnchorPane.bottomAnchor="3.0" AnchorPane.leftAnchor="3.0" AnchorPane.rightAnchor="3.0" AnchorPane.topAnchor="3.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children></AnchorPane>
|
||||
<AnchorPane GridPane.rowIndex="6">
|
||||
<children>
|
||||
<Button fx:id="btnApplyCrop" mnemonicParsing="false" onAction="#ApplyCropClick" prefHeight="40.0" prefWidth="399.2" text="Apply Crop" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="5.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<GridPane layoutX="166.0" layoutY="-29.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="15.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="15.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label layoutX="30.0" layoutY="12.0" prefHeight="40.8" prefWidth="87.2" text="Left 90" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Label layoutX="44.0" layoutY="12.0" prefHeight="40.8" prefWidth="87.2" text="Left 45" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Label layoutX="30.0" layoutY="6.0" prefHeight="40.8" prefWidth="87.2" text="Center" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<Label layoutX="24.0" layoutY="6.0" prefHeight="40.0" prefWidth="87.2" text="Right 45" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<Label layoutX="36.0" layoutY="11.0" prefHeight="40.0" prefWidth="87.2" text="Right 90" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraLeft90" layoutX="54.0" layoutY="8.0" prefHeight="40.8" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraLeft45" layoutX="26.0" layoutY="14.0" prefHeight="40.8" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraCenter" layoutX="88.0" layoutY="8.0" prefHeight="40.8" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraRight45" layoutX="54.0" layoutY="8.0" prefHeight="40.0" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<ComboBox fx:id="CameraRight90" layoutX="75.0" layoutY="1.0" prefHeight="40.0" prefWidth="408.0" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Button layoutY="8.0" mnemonicParsing="false" onAction="#ApplyCameraLeft90" prefHeight="40.8" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="1">
|
||||
<children>
|
||||
<Button layoutX="22.0" layoutY="2.0" mnemonicParsing="false" onAction="#ApplyCameraLeft45" prefHeight="40.8" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="2">
|
||||
<children>
|
||||
<Button layoutX="18.0" layoutY="2.0" mnemonicParsing="false" onAction="#ApplyCameraFront" prefHeight="40.8" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="3">
|
||||
<children>
|
||||
<Button layoutX="22.0" layoutY="8.0" mnemonicParsing="false" onAction="#ApplyCameraRight45" prefHeight="40.0" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<Button layoutX="22.0" layoutY="8.0" mnemonicParsing="false" onAction="#ApplyCameraRight90" prefHeight="40.0" prefWidth="88.0" text="Apply" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="5">
|
||||
<children>
|
||||
<HBox prefHeight="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<GridPane HBox.hgrow="ALWAYS">
|
||||
@@ -308,6 +589,42 @@
|
||||
</HBox>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="4">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="287.0" prefHeight="30.4" prefWidth="1024.0" text="Directory Setting" textAlignment="CENTER" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="5">
|
||||
<children>
|
||||
<GridPane layoutX="75.0" layoutY="-31.0" prefHeight="40.0" prefWidth="1024.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="15.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" percentWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<AnchorPane>
|
||||
<children>
|
||||
<Label text="Photo Save" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="0.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="1">
|
||||
<children>
|
||||
<TextField fx:id="PhotoDirectoryPath" editable="false" prefHeight="40.0" prefWidth="870.4" promptText="directory to save photo" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
<AnchorPane GridPane.columnIndex="2">
|
||||
<children>
|
||||
<Button mnemonicParsing="false" onAction="#ChangePhotoDirectoryPath" prefHeight="40.0" prefWidth="102.4" text="Browse" AnchorPane.bottomAnchor="2.0" AnchorPane.leftAnchor="2.0" AnchorPane.rightAnchor="2.0" AnchorPane.topAnchor="2.0" />
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
|
||||
BIN
tahan_posisi.wav
Normal file
BIN
tahan_posisi.wav
Normal file
Binary file not shown.
@@ -1,4 +1,5 @@
|
||||
writer = rolling file
|
||||
#writer = rolling file
|
||||
writer = console
|
||||
writer.file = logs/{date:yyyy-MM-dd}.log
|
||||
writer.format = {date:yyyy-MM-dd HH:mm:ss} {level}: {class}.{method}() {message}
|
||||
//writer.format = {date:yyyy-MM-dd HH:mm:ss} {level}: {message}
|
||||
|
||||
BIN
upload_berhasil.wav
Normal file
BIN
upload_berhasil.wav
Normal file
Binary file not shown.
BIN
upload_gagal.wav
Normal file
BIN
upload_gagal.wav
Normal file
Binary file not shown.
BIN
voices/camera-shutter-click-01.wav
Normal file
BIN
voices/camera-shutter-click-01.wav
Normal file
Binary file not shown.
BIN
voices/countdown321.wav
Normal file
BIN
voices/countdown321.wav
Normal file
Binary file not shown.
BIN
voices/data_barcode_tidak_ditemukan.wav
Normal file
BIN
voices/data_barcode_tidak_ditemukan.wav
Normal file
Binary file not shown.
BIN
voices/dua.wav
BIN
voices/dua.wav
Binary file not shown.
BIN
voices/empat.wav
BIN
voices/empat.wav
Binary file not shown.
BIN
voices/hubungistafkami.wav
Normal file
BIN
voices/hubungistafkami.wav
Normal file
Binary file not shown.
BIN
voices/kesalahan_server.wav
Normal file
BIN
voices/kesalahan_server.wav
Normal file
Binary file not shown.
BIN
voices/pengambilan_berhasil.wav
Normal file
BIN
voices/pengambilan_berhasil.wav
Normal file
Binary file not shown.
BIN
voices/pengambilan_berhasil_tunggu_lobby.wav
Normal file
BIN
voices/pengambilan_berhasil_tunggu_lobby.wav
Normal file
Binary file not shown.
BIN
voices/pengambilan_gagal.wav
Normal file
BIN
voices/pengambilan_gagal.wav
Normal file
Binary file not shown.
BIN
voices/posisikan_wajah.wav
Normal file
BIN
voices/posisikan_wajah.wav
Normal file
Binary file not shown.
BIN
voices/satu.wav
BIN
voices/satu.wav
Binary file not shown.
BIN
voices/scan_barcode.wav
Normal file
BIN
voices/scan_barcode.wav
Normal file
Binary file not shown.
BIN
voices/tahan_posisi.wav
Normal file
BIN
voices/tahan_posisi.wav
Normal file
Binary file not shown.
BIN
voices/tiga.wav
BIN
voices/tiga.wav
Binary file not shown.
BIN
voices/upload_berhasil.wav
Normal file
BIN
voices/upload_berhasil.wav
Normal file
Binary file not shown.
BIN
voices/upload_gagal.wav
Normal file
BIN
voices/upload_gagal.wav
Normal file
Binary file not shown.
Reference in New Issue
Block a user