From fbb68b4da78dd974716b1072c40c2752b34d679c Mon Sep 17 00:00:00 2001 From: rdkartono Date: Mon, 24 Mar 2025 15:42:39 +0700 Subject: [PATCH] commit 24/03/2025 --- camera-shutter-click-01.wav | Bin 0 -> 182658 bytes config.properties | 15 +- database.db | Bin 61440 -> 65536 bytes logs/2024-10-21.log | 379 ++++++ src/main/java/BASS/AudioPlayer.java | 23 +- src/main/java/Camera/LiveCamEvent.java | 3 +- src/main/java/Config/ConfigFile.java | 42 + src/main/java/Config/SomeCodes.java | 30 +- .../java/id/co/gtc/erhacam/Cameradetail.java | 88 +- .../java/id/co/gtc/erhacam/CaptureView.java | 1102 +++++++++-------- .../java/id/co/gtc/erhacam/SettingView.java | 42 + .../id/co/gtc/erhacam/cameradetail.fxml | 26 +- .../id/co/gtc/erhacam/setting-view.fxml | 46 +- voices/camera-shutter-click-01.wav | Bin 0 -> 182658 bytes 14 files changed, 1216 insertions(+), 580 deletions(-) create mode 100644 camera-shutter-click-01.wav create mode 100644 voices/camera-shutter-click-01.wav diff --git a/camera-shutter-click-01.wav b/camera-shutter-click-01.wav new file mode 100644 index 0000000000000000000000000000000000000000..bb562e1db909662f08de66fb8e03c6fb31191ec2 GIT binary patch literal 182658 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 z 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

h1$RZ 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 delta 96 zcmV-m0H6PWfCPZx1CSd9QUCw|50M~00aCGGqz@ho56J)k000jU`w#XH@ek||=MUl! z-4ECg(+|!M$+2;00keuRKMu3WA2tvHQL-=uunYtO?f?v%33vuG0`9SK-U74k;t~zk C5+LsY diff --git a/logs/2024-10-21.log b/logs/2024-10-21.log index 7f1011d..f7706fd 100644 --- a/logs/2024-10-21.log +++ b/logs/2024-10-21.log @@ -47,3 +47,382 @@ 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-21 14:43:56 INFO: Config.ConfigFile.() 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.() 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.() 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.() 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.() 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.() 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.() 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.() 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.() 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.() 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.() 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.() 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.() 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 diff --git a/src/main/java/BASS/AudioPlayer.java b/src/main/java/BASS/AudioPlayer.java index c41dc3a..de6808b 100644 --- a/src/main/java/BASS/AudioPlayer.java +++ b/src/main/java/BASS/AudioPlayer.java @@ -14,9 +14,8 @@ public class AudioPlayer { public void WaitUntilFinished(){ while(currentFileHandle!=0){ try { - Thread.sleep(100); + Thread.sleep(10); } catch (InterruptedException ignored) { - } } } @@ -102,9 +101,8 @@ 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){ + public void PlayFile(final String filename, final PlaybackStatus playbackstatus){ if (inited && filename!=null && !filename.isEmpty()){ int filehandle = bass.BASS_StreamCreateFile(false, filename, 0, 0, 0); if (filehandle!=0){ @@ -136,11 +134,18 @@ public class AudioPlayer { currentFile = ""; currentFileHandle = 0; }).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; + } 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); + } } } diff --git a/src/main/java/Camera/LiveCamEvent.java b/src/main/java/Camera/LiveCamEvent.java index 4a7df2e..c1b1c83 100644 --- a/src/main/java/Camera/LiveCamEvent.java +++ b/src/main/java/Camera/LiveCamEvent.java @@ -4,11 +4,12 @@ public interface LiveCamEvent { void onDetectedQRCode(String qrCode); void onFrontalFaceDetector(boolean hasface, int width, int height); void onProfileFaceDetector(boolean hasface, int width, int height); - void onEyeDetector(boolean hasEye, int width, int height); + void onEyeDetector(boolean hasEye); void onLeftEarDetector(boolean hasLeftEar, int width, int height); void onRightEarDetector(boolean hasRightEar, int width, int height); void onLeftEyeDetector(boolean hasLeftEye, int width, int height); void onRightEyeDetector(boolean hasRightEye, int width, int height); void onLog(String log); void onBlink(int counter); + void onStartCapturing(); } diff --git a/src/main/java/Config/ConfigFile.java b/src/main/java/Config/ConfigFile.java index 043e30b..490e14a 100644 --- a/src/main/java/Config/ConfigFile.java +++ b/src/main/java/Config/ConfigFile.java @@ -45,6 +45,11 @@ public class ConfigFile { private @Getter int cascadeMinSize; private @Getter int cascadeMaxSize; + private @Getter boolean MirrorCamera = false; + private @Getter boolean FlipCamera = false; + + private @Getter double SharpnessThreshold; + private boolean needsave = false; public ConfigFile(){ @@ -53,6 +58,27 @@ public class ConfigFile { Load(); } + 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; @@ -554,6 +580,10 @@ 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(CameraConfigEnum.CameraConfigLeft90.toString()) == null) allcorrect = false; if (prop.getProperty(CameraConfigEnum.CameraConfigLeft45.toString()) == null) allcorrect = false; @@ -601,6 +631,11 @@ public class ConfigFile { Detectors.setFaceMinSize(cascadeMinSize); Detectors.setScaleFactor(cascadeScaleFactor); + MirrorCamera = toBoolean(prop.getProperty("MirrorCamera")); + FlipCamera = toBoolean(prop.getProperty("FlipCamera")); + + SharpnessThreshold = toDouble(prop.getProperty("SharpnessThreshold")); + Logger.info("Config Loaded"); MakeDirectories(); return; @@ -653,6 +688,9 @@ public class ConfigFile { Detectors.setFaceMaxSize(cascadeMaxSize); Detectors.setFaceMinSize(cascadeMinSize); Detectors.setScaleFactor(cascadeScaleFactor); + MirrorCamera = false; + FlipCamera = false; + SharpnessThreshold = 75.0; Logger.info("Default Config Created"); needsave = true; Save(); @@ -709,6 +747,10 @@ public class ConfigFile { 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("SharpnessThreshold", String.valueOf(SharpnessThreshold)); + try{ prop.store(new FileOutputStream(Path.of(currentDirectory, "config.properties").toString()), null); Logger.info("Config Saved"); diff --git a/src/main/java/Config/SomeCodes.java b/src/main/java/Config/SomeCodes.java index 3aa6d09..fd44b14 100644 --- a/src/main/java/Config/SomeCodes.java +++ b/src/main/java/Config/SomeCodes.java @@ -15,6 +15,7 @@ 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_core.UMat; +import org.opencv.core.MatOfDouble; import org.tinylog.Logger; import java.awt.image.BufferedImage; @@ -31,6 +32,7 @@ import java.util.ArrayList; import java.util.List; import static org.bytedeco.opencv.global.opencv_core.CV_64F; +import static org.bytedeco.opencv.global.opencv_core.CV_64FC3; @SuppressWarnings("unused") public class SomeCodes { @@ -229,6 +231,10 @@ 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 @@ -620,30 +626,48 @@ public class SomeCodes { if (values!=null && values.length>0){ double lowest = values[0]; for(double x : values){ - if (x=0){ + if (xsetCameraStatus(ss)); - raise_log(ss); - - + if (event!=null) event.onStartCapturing(); Task task = new Task<>() { @SuppressWarnings("BusyWait") @@ -826,7 +832,11 @@ public class Cameradetail { TimerTask fpsTask = new TimerTask() { @Override public void run() { - LiveFPS = fps.getAndSet(0); + int fpsval = fps.getAndSet(0); + if (fpsval!=LiveFPS){ + LiveFPS = fpsval; + if (event!=null) event.onStartCapturing(); + } } }; @@ -884,15 +894,29 @@ public class Cameradetail { fps.incrementAndGet(); UMat originalmat = new UMat(); - mat.copyTo(originalmat); // copy to BestMat for using OpenCL - // revisi 18/03/2025 - UMat flippedmat = new UMat(); - opencv_core.flip(originalmat, flippedmat, 1); // flip horizontal - opencv_core.rotate(flippedmat, BestMat, opencv_core.ROTATE_90_COUNTERCLOCKWISE); + mat.copyTo(originalmat); // copy to originalmat for using OpenCL + if (config.isMirrorCamera()){ + // revisi 18/03/2025 + UMat flippedmat = new UMat(); + opencv_core.flip(originalmat, flippedmat, 0); // flip vertical + flippedmat.copyTo(originalmat); + } + if (config.isFlipCamera()){ + // revisi 18/03/2025 + UMat flippedmat = new UMat(); + opencv_core.flip(originalmat, flippedmat, 1); // flip horizontal + flippedmat.copyTo(originalmat); + } + + // rotate 90 degree counter clockwise karena kamera potrait + opencv_core.rotate(originalmat, originalmat, opencv_core.ROTATE_90_COUNTERCLOCKWISE); + + + IsGrabbingLiveView.set(false); - if (!BestMat.empty()) { - opencv_imgproc.resize(BestMat, LiveMat, LiveSize); // resize to LiveSize + if (!originalmat.empty()) { + opencv_imgproc.resize(originalmat, LiveMat, LiveSize); // resize to LiveSize UMat graymat = new UMat(); // use OpenCL for grayscale opencv_imgproc.cvtColor(LiveMat,graymat, COLOR_BGR2GRAY); // convert to grayscale if (use_qr){ @@ -950,6 +974,14 @@ public class Cameradetail { no_face_counter = 0; if (event!=null) event.onFrontalFaceDetector(true, _face_width, _face_height); + face_indicator.setVisible(true); + + double sharpness = CalculateSharpness(originalmat); + if (sharpness>=config.getSharpnessThreshold()){ + sharpness_value = sharpness; + originalmat.copyTo(BestMat); + Platform.runLater(()->sharpness_indicator.setText(String.format("%.2f", sharpness_value))); + } if (theface.getFace()!=null){ LiveMatROI = new Rect(theface.getFace().x(), theface.getFace().y(), theface.getFace().width(), theface.getFace().height()); @@ -963,12 +995,18 @@ public class Cameradetail { open_eye_counter++; continue; } - System.out.println("Valid Open Eyes"); + //System.out.println("Valid Open Eyes"); - if (eye_state==0){ + if (eye_state!=1){ // transisi dari tutup mata ke buka mata System.out.println("Transition from close to open eyes"); + eye_state = 1; + if (event!=null) event.onEyeDetector(true); + eye_indicator.setVisible(true); + + + long now = System.currentTimeMillis(); if (waiting_for_second_blink){ long diff = now - last_blink; @@ -984,7 +1022,6 @@ public class Cameradetail { } last_blink = now; } - eye_state = 1; } else { // ada muka, tidak ada mata // transisi dari buka mata ke tutup mata @@ -993,15 +1030,26 @@ public class Cameradetail { close_eye_counter++; continue; } - System.out.println("Valid Closed Eyes"); + //System.out.println("Valid Closed Eyes"); if (eye_state!=0){ System.out.println("Transition from open to close eyes"); + eye_state = 0; + if (event!=null) event.onEyeDetector(false); + eye_indicator.setVisible(false); } - eye_state = 0; } } else if (have_left_45_face ){ no_face_counter = 0; if (event!=null) event.onProfileFaceDetector(true, _face_width, _face_height); + face_indicator.setVisible(true); + + double sharpness = CalculateSharpness(originalmat); + if (sharpness>=config.getSharpnessThreshold()){ + sharpness_value = sharpness; + originalmat.copyTo(BestMat); + Platform.runLater(()->sharpness_indicator.setText(String.format("%.2f", sharpness_value))); + } + } else { // no face detected, but let's not cancel the previous state immediately @@ -1021,6 +1069,8 @@ public class Cameradetail { if (event!=null) { event.onFrontalFaceDetector(false, _face_width, _face_height); event.onProfileFaceDetector(false, _face_width, _face_height); + face_indicator.setVisible(false); + eye_indicator.setVisible(false); } } else no_face_counter++; diff --git a/src/main/java/id/co/gtc/erhacam/CaptureView.java b/src/main/java/id/co/gtc/erhacam/CaptureView.java index ca77caa..f742ea8 100644 --- a/src/main/java/id/co/gtc/erhacam/CaptureView.java +++ b/src/main/java/id/co/gtc/erhacam/CaptureView.java @@ -15,8 +15,6 @@ import ErhaAPI.UploadResult; import javafx.application.Platform; -import javafx.beans.InvalidationListener; -import javafx.beans.Observable; import javafx.concurrent.Task; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -31,7 +29,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Consumer; import javafx.scene.control.Alert.AlertType; import org.bytedeco.javacv.OpenCVFrameGrabber; @@ -77,6 +74,7 @@ public class CaptureView { private String audio_upload_berhasil = "upload_berhasil.wav"; private String audio_upload_gagal = "upload_gagal.wav"; private String audio_countdown = "countdown321.wav"; + private String audio_camera_shutter = "camera-shutter-click-01.wav"; private String audio_tahan_posisi = "tahan_posisi.wav"; private String audio_data_barcode_tidak_ditemukan = "data_barcode_tidak_ditemukan.wav"; private String audio_kesalahan_server = "kesalahan_server.wav"; @@ -94,7 +92,6 @@ public class CaptureView { private final ErhaAPI erhaAPI = new ErhaAPI(false); - private final double sharpness_threshold = 150; @FXML private void ChangeDirectory(){ DirectoryChooser dc = new DirectoryChooser(); @@ -131,17 +128,377 @@ public class CaptureView { @SuppressWarnings("resource") @FXML - private void TakePhotos(){ + private void TakePhotos(String directory, String prefix){ boolean has_face = Arrays.stream(have_face).anyMatch(AtomicBoolean::get); + if (has_face){ AutoCloseAlert.show("Pengambilan Foto", "Tahan Posisi Anda", "Proses ini kurang lebih 3 detik", 5, null); if (audioPlayer!=null && audioPlayer.isInited()){ - if (!audioPlayer.getCurrentFile().equals(audio_countdown)) { + if (!Objects.equals(audioPlayer.getCurrentFile(), audio_tahan_posisi)){ audioPlayer.StopCurrentPlayback(); - Wait(200); - audioPlayer.PlayFile(audio_tahan_posisi, ps); - } else System.out.println("audioPlayer already playing countdown"); + audioPlayer.PlayFile(audio_tahan_posisi, new PlaybackStatus() { + @Override + public void onPlaybackStarted(String filename) { + } + + @Override + public void onPlaybackFinished(String filename) { + Size thumbsize = new Size(160,120); + + PhotoReviewClass prc = new PhotoReviewClass(); + prc.setPrefix(prefix); + + long nanostart = System.nanoTime(); // for performance measurement + + ExecutorService executor = Executors.newFixedThreadPool(5); + + audioPlayer.PlayFile(audio_camera_shutter, null); + + Callable task1 = ()->{ + if (image1!=null) { + image1.RemapROI(0.1,0.3, false); + + double sharpness = CalculateSharpness(image1.getLiveMat()); + System.out.println("Image1 sharpness: "+sharpness); + + PhotoResult p1 = image1.TakePhoto(directory,prefix); + p1.setSharpscore(sharpness); + if (ValidFile(p1.getFullres())){ + if (ValidFile(p1.getCompressedfile())){ + return p1; + } + } + } else System.out.println("Image1 is null"); + return null; + }; + Callable task2 = ()->{ + if (image2!=null) { + image2.RemapROI(0.1,0.3, false); + double sharpness = CalculateSharpness(image2.getLiveMat()); + System.out.println("Image2 sharpness: "+sharpness); + + PhotoResult p2 = image2.TakePhoto(directory,prefix); + p2.setSharpscore(sharpness); + if (ValidFile(p2.getFullres())){ + if (ValidFile(p2.getCompressedfile())){ + return p2; + } + } + } else System.out.println("Image2 is null"); + return null; + }; + + Callable task3 = ()->{ + if (image3!=null) { + image3.RemapROI(0.1,0.3, false); + double sharpness = CalculateSharpness(image3.getLiveMat()); + System.out.println("Image3 sharpness: "+sharpness); + + PhotoResult p3 = image3.TakePhoto(directory,prefix); + p3.setSharpscore(sharpness); + + if (ValidFile(p3.getFullres())){ + if (ValidFile(p3.getCompressedfile())){ + return p3; + } + } + + } else System.out.println("Image3 is null"); + return null; + }; + + Callable task4 = ()->{ + if (image4!=null) { + image4.RemapROI(0.1,0.3, false); + double sharpness = CalculateSharpness(image4.getLiveMat()); + System.out.println("Image4 sharpness: "+sharpness); + + PhotoResult p4 = image4.TakePhoto(directory,prefix); + p4.setSharpscore(sharpness); + + if (ValidFile(p4.getFullres())){ + if (ValidFile(p4.getCompressedfile())){ + return p4; + } + } + + } else System.out.println("Image4 is null"); + return null; + }; + + Callable task5 = ()->{ + if (image5!=null) { + image5.RemapROI(0.1,0.3, false); + double sharpness = CalculateSharpness(image5.getLiveMat()); + System.out.println("Image5 sharpness: "+sharpness); + + PhotoResult p5 = image5.TakePhoto(directory,prefix); + p5.setSharpscore(sharpness); + + if (ValidFile(p5.getFullres())){ + if (ValidFile(p5.getCompressedfile())){ + return p5; + } + } + + } else System.out.println("Image5 is null"); + return null; + }; + + PhotoResult p1 = null; + PhotoResult p2 = null; + PhotoResult p3 = null; + PhotoResult p4 = null; + PhotoResult p5 = null; + try{ + Future f1 = executor.submit(task1); + Future f2 = executor.submit(task2); + Future f3 = executor.submit(task3); + Future f4 = executor.submit(task4); + Future f5 = executor.submit(task5); + + p1 = f1.get(); + p2 = f2.get(); + p3 = f3.get(); + p4 = f4.get(); + p5 = f5.get(); + + } catch (Exception e){ + Logger.error("Error TakePhotos: " + e.getMessage()); + } finally { + executor.shutdown(); + } + + + + String timestamp = SomeCodes.GetDateTimeString(); + System.out.println("Creating timestamp: "+timestamp); + + // check for blurred image + double score1=-1, score2=-1, score3=-1, score4=-1, score5=-1; + if (p1!=null){ + score1 = p1.getSharpscore(); + } + if (p2!=null){ + score2 = p2.getSharpscore(); + } + if (p3!=null){ + score3 = p3.getSharpscore(); + } + if (p4!=null){ + score4 = p4.getSharpscore(); + } + if (p5!=null){ + score5 = p5.getSharpscore(); + } + System.out.println("Sharpness score: "+score1+", "+score2+", "+score3+", "+score4+", "+score5); + double lowest = FindLowestValue(score1,score2,score3,score4,score5); + if (lowestbestroi.area()) + bestroi = p2.getBestROI(); + if (reducedroi==null) + reducedroi = p2.getReducedROI(); + else if (p2.getReducedROI().area()>reducedroi.area()) + reducedroi = p2.getReducedROI(); + } + if (p3!=null && p3.getBestROI()!=null){ + if (bestroi==null) + bestroi = p3.getBestROI(); + else if (p3.getBestROI().area()>bestroi.area()) + bestroi = p3.getBestROI(); + if (reducedroi==null) + reducedroi = p3.getReducedROI(); + else if (p3.getReducedROI().area()>reducedroi.area()) + reducedroi = p3.getReducedROI(); + } + if (p4!=null && p4.getBestROI()!=null){ + if (bestroi==null) + bestroi = p4.getBestROI(); + else if (p4.getBestROI().area()>bestroi.area()) + bestroi = p4.getBestROI(); + if (reducedroi==null) + reducedroi = p4.getReducedROI(); + else if (p4.getReducedROI().area()>reducedroi.area()) + reducedroi = p4.getReducedROI(); + } + if (p5!=null && p5.getBestROI()!=null){ + if (bestroi==null) + bestroi = p5.getBestROI(); + else if (p5.getBestROI().area()>bestroi.area()) + bestroi = p5.getBestROI(); + if (reducedroi==null) + reducedroi = p5.getReducedROI(); + else if (p5.getReducedROI().area()>reducedroi.area()) + reducedroi = p5.getReducedROI(); + } + + if (p1!=null){ + prc.setFileLeft90(ValidFile(p1.getFullres()) ? p1.getFullres() : ""); + prc.setCompressedLeft90(ValidFile(p1.getCompressedfile()) ? p1.getCompressedfile() : ""); + if (ValidFile(p1.getFullcrop())){ + // ada crop + prc.setCroppedLeft90(p1.getFullcrop()); + } else { + String xx = image1.CropBestMat(directory,prefix, bestroi); + if (ValidFile(xx)) prc.setCroppedLeft90(xx); + } + if (ValidFile(p1.getCompressedcrop())){ + prc.setCompressedCropLeft90(p1.getCompressedcrop()); + } else { + String xx =image1.CropReducedMat(directory,prefix, reducedroi); + if (ValidFile(xx)) prc.setCompressedCropLeft90(xx); + } + String thumb1 = MakeThumbfile(p1.getFullres(), thumbsize); + if (ValidFile(thumb1)) prc.setThumbLeft90(thumb1); + } + if (p2!=null){ + prc.setFileLeft45(ValidFile(p2.getFullres()) ? p2.getFullres() : ""); + prc.setCompressedLeft45(ValidFile(p2.getCompressedfile()) ? p2.getCompressedfile() : ""); + if (ValidFile(p2.getFullcrop())){ + // ada crop + prc.setCroppedLeft45(p2.getFullcrop()); + } else { + String xx = image2.CropBestMat(directory,prefix, bestroi); + if (ValidFile(xx)) prc.setCroppedLeft45(xx); + } + if (ValidFile(p2.getCompressedcrop())){ + prc.setCompressedCropLeft45(p2.getCompressedcrop()); + } else { + String xx = image2.CropReducedMat(directory,prefix, reducedroi); + if (ValidFile(xx)) prc.setCompressedCropLeft45(xx); + } + String thumb2 = MakeThumbfile(p2.getFullres(), thumbsize); + if (ValidFile(thumb2)) prc.setThumbLeft45(thumb2); + } + if (p3!=null){ + prc.setFileCenter(ValidFile(p3.getFullres()) ? p3.getFullres() : ""); + prc.setCompressedCenter(ValidFile(p3.getCompressedfile()) ? p3.getCompressedfile() : ""); + if (ValidFile(p3.getFullcrop())){ + // ada crop + prc.setCroppedCenter(p3.getFullcrop()); + } else { + String xx = image3.CropBestMat(directory,prefix, bestroi); + if (ValidFile(xx)) prc.setCroppedCenter(xx); + } + if (ValidFile(p3.getCompressedcrop())){ + prc.setCompressedCropCenter(p3.getCompressedcrop()); + } else { + String xx = image3.CropReducedMat(directory,prefix, reducedroi); + if (ValidFile(xx)) prc.setCompressedCropCenter(xx); + } + String thumb3 = MakeThumbfile(p3.getFullres(), thumbsize); + if (ValidFile(thumb3)) prc.setThumbCenter(thumb3); + } + if (p4!=null){ + prc.setFileRight45(ValidFile(p4.getFullres()) ? p4.getFullres() : ""); + prc.setCompressedRight45(ValidFile(p4.getCompressedfile()) ? p4.getCompressedfile() : ""); + if (ValidFile(p4.getFullcrop())){ + // ada crop + prc.setCroppedRight45(p4.getFullcrop()); + } else { + String xx = image4.CropBestMat(directory,prefix, bestroi); + if (ValidFile(xx)) prc.setCroppedRight45(xx); + } + if (ValidFile(p4.getCompressedcrop())){ + prc.setCompressedCropRight45(p4.getCompressedcrop()); + } else { + String xx = image4.CropReducedMat(directory,prefix, reducedroi); + if (ValidFile(xx)) prc.setCompressedCropRight45(xx); + } + String thumb4 = MakeThumbfile(p4.getFullres(), thumbsize); + if (ValidFile(thumb4)) prc.setThumbRight45(thumb4); + } + if (p5!=null){ + prc.setFileRight90(ValidFile(p5.getFullres()) ? p5.getFullres() : ""); + prc.setCompressedRight90(ValidFile(p5.getCompressedfile()) ? p5.getCompressedfile() : ""); + if (ValidFile(p5.getFullcrop())){ + // ada crop + prc.setCroppedRight90(p5.getFullcrop()); + } else { + String xx = image5.CropBestMat(directory,prefix, bestroi); + if (ValidFile(xx)) prc.setCroppedRight90(xx); + } + if (ValidFile(p5.getCompressedcrop())){ + prc.setCompressedCropRight90(p5.getCompressedcrop()); + } else { + String xx= image5.CropReducedMat(directory,prefix, reducedroi); + if (ValidFile(xx)) prc.setCompressedCropRight90(xx); + } + String thumb5 = MakeThumbfile(p5.getFullres(), thumbsize); + if (ValidFile(thumb5)) prc.setThumbRight90(thumb5); + } + + long duration = (System.nanoTime() - nanostart) / 1000000; // in milliseconds + System.out.println("TakePhotos duration: "+duration+" ms"); + + AutoCloseAlert.show("Photos Taken", "Photos Taken", "Photos Taken", 5, null); + + String[] files = prc.compressed(); + if (files.length>0){ + if (audioPlayer!=null && audioPlayer.isInited()){ + if (!Objects.equals(audioPlayer.getCurrentFile(),audio_pengambilan_berhasil)){ + audioPlayer.StopCurrentPlayback(); + audioPlayer.PlayFile(audio_pengambilan_berhasil, new PlaybackStatus() { + @Override + public void onPlaybackStarted(String filename) { + + } + + @Override + public void onPlaybackFinished(String filename) { + Platform.runLater(AutoCloseAlert::close); + UploadFiles(prc, prefix); + } + + @Override + public void onPlaybackFailure(String filename) { + + } + + }); + } + } + } else { + if (audioPlayer!=null && audioPlayer.isInited()){ + if (!Objects.equals(audioPlayer.getCurrentFile(),audio_pengambilan_gagal)){ + audioPlayer.StopCurrentPlayback(); + audioPlayer.PlayFile(audio_pengambilan_gagal, null); + } + } + } + } + + @Override + public void onPlaybackFailure(String filename) { + + } + }); + + } } @@ -153,431 +510,93 @@ public class CaptureView { // } - - Size thumbsize = new Size(160,120); - String directory = config.getPhotoDirectory(); - String prefix = RemoveSpaces(medicalRecordID.getText()) ; - if (ValidDirectory(directory)){ - if (ValidMedicalRecordId(prefix)){ - - PhotoReviewClass prc = new PhotoReviewClass(); - prc.setPrefix(prefix); - - long nanostart = System.nanoTime(); // for performance measurement - - ExecutorService executor = Executors.newFixedThreadPool(5); - - Callable task1 = ()->{ - if (image1!=null) { - image1.RemapROI(0.1,0.3, false); - - double sharpness = CalculateSharpness(image1.getBestMat()); - if (sharpness task2 = ()->{ - if (image2!=null) { - image2.RemapROI(0.1,0.3, false); - double sharpness = CalculateSharpness(image2.getBestMat()); - if (sharpness task3 = ()->{ - if (image3!=null) { - image3.RemapROI(0.1,0.3, false); - double sharpness = CalculateSharpness(image3.getBestMat()); - if (sharpness task4 = ()->{ - if (image4!=null) { - image4.RemapROI(0.1,0.3, false); - double sharpness = CalculateSharpness(image4.getBestMat()); - if (sharpness task5 = ()->{ - if (image5!=null) { - image5.RemapROI(0.1,0.3, false); - double sharpness = CalculateSharpness(image5.getBestMat()); - if (sharpness f1 = executor.submit(task1); - Future f2 = executor.submit(task2); - Future f3 = executor.submit(task3); - Future f4 = executor.submit(task4); - Future f5 = executor.submit(task5); - - p1 = f1.get(); - p2 = f2.get(); - p3 = f3.get(); - p4 = f4.get(); - p5 = f5.get(); - - } catch (Exception e){ - Logger.error("Error TakePhotos: " + e.getMessage()); - } finally { - executor.shutdown(); - } - - - - String timestamp = SomeCodes.GetDateTimeString(); - System.out.println("Creating timestamp: "+timestamp); - - // check for blurred image - double score1=0, score2=0, score3=0, score4=0, score5=0; - if (p1!=null){ - score1 = p1.getSharpscore(); - } - if (p2!=null){ - score2 = p2.getSharpscore(); - } - if (p3!=null){ - score3 = p3.getSharpscore(); - } - if (p4!=null){ - score4 = p4.getSharpscore(); - } - if (p5!=null){ - score5 = p5.getSharpscore(); - } - System.out.println("Sharpness score: "+score1+", "+score2+", "+score3+", "+score4+", "+score5); - double lowest = FindLowestValue(score1,score2,score3,score4,score5); - if (lowestbestroi.area()) - bestroi = p2.getBestROI(); - if (reducedroi==null) - reducedroi = p2.getReducedROI(); - else if (p2.getReducedROI().area()>reducedroi.area()) - reducedroi = p2.getReducedROI(); - } - if (p3!=null && p3.getBestROI()!=null){ - if (bestroi==null) - bestroi = p3.getBestROI(); - else if (p3.getBestROI().area()>bestroi.area()) - bestroi = p3.getBestROI(); - if (reducedroi==null) - reducedroi = p3.getReducedROI(); - else if (p3.getReducedROI().area()>reducedroi.area()) - reducedroi = p3.getReducedROI(); - } - if (p4!=null && p4.getBestROI()!=null){ - if (bestroi==null) - bestroi = p4.getBestROI(); - else if (p4.getBestROI().area()>bestroi.area()) - bestroi = p4.getBestROI(); - if (reducedroi==null) - reducedroi = p4.getReducedROI(); - else if (p4.getReducedROI().area()>reducedroi.area()) - reducedroi = p4.getReducedROI(); - } - if (p5!=null && p5.getBestROI()!=null){ - if (bestroi==null) - bestroi = p5.getBestROI(); - else if (p5.getBestROI().area()>bestroi.area()) - bestroi = p5.getBestROI(); - if (reducedroi==null) - reducedroi = p5.getReducedROI(); - else if (p5.getReducedROI().area()>reducedroi.area()) - reducedroi = p5.getReducedROI(); - } - - if (p1!=null){ - prc.setFileLeft90(ValidFile(p1.getFullres()) ? p1.getFullres() : ""); - prc.setCompressedLeft90(ValidFile(p1.getCompressedfile()) ? p1.getCompressedfile() : ""); - if (ValidFile(p1.getFullcrop())){ - // ada crop - prc.setCroppedLeft90(p1.getFullcrop()); - } else { - String xx = image1.CropBestMat(directory,prefix, bestroi); - if (ValidFile(xx)) prc.setCroppedLeft90(xx); - } - if (ValidFile(p1.getCompressedcrop())){ - prc.setCompressedCropLeft90(p1.getCompressedcrop()); - } else { - String xx =image1.CropReducedMat(directory,prefix, reducedroi); - if (ValidFile(xx)) prc.setCompressedCropLeft90(xx); - } - String thumb1 = MakeThumbfile(p1.getFullres(), thumbsize); - if (ValidFile(thumb1)) prc.setThumbLeft90(thumb1); - } - if (p2!=null){ - prc.setFileLeft45(ValidFile(p2.getFullres()) ? p2.getFullres() : ""); - prc.setCompressedLeft45(ValidFile(p2.getCompressedfile()) ? p2.getCompressedfile() : ""); - if (ValidFile(p2.getFullcrop())){ - // ada crop - prc.setCroppedLeft45(p2.getFullcrop()); - } else { - String xx = image2.CropBestMat(directory,prefix, bestroi); - if (ValidFile(xx)) prc.setCroppedLeft45(xx); - } - if (ValidFile(p2.getCompressedcrop())){ - prc.setCompressedCropLeft45(p2.getCompressedcrop()); - } else { - String xx = image2.CropReducedMat(directory,prefix, reducedroi); - if (ValidFile(xx)) prc.setCompressedCropLeft45(xx); - } - String thumb2 = MakeThumbfile(p2.getFullres(), thumbsize); - if (ValidFile(thumb2)) prc.setThumbLeft45(thumb2); - } - if (p3!=null){ - prc.setFileCenter(ValidFile(p3.getFullres()) ? p3.getFullres() : ""); - prc.setCompressedCenter(ValidFile(p3.getCompressedfile()) ? p3.getCompressedfile() : ""); - if (ValidFile(p3.getFullcrop())){ - // ada crop - prc.setCroppedCenter(p3.getFullcrop()); - } else { - String xx = image3.CropBestMat(directory,prefix, bestroi); - if (ValidFile(xx)) prc.setCroppedCenter(xx); - } - if (ValidFile(p3.getCompressedcrop())){ - prc.setCompressedCropCenter(p3.getCompressedcrop()); - } else { - String xx = image3.CropReducedMat(directory,prefix, reducedroi); - if (ValidFile(xx)) prc.setCompressedCropCenter(xx); - } - String thumb3 = MakeThumbfile(p3.getFullres(), thumbsize); - if (ValidFile(thumb3)) prc.setThumbCenter(thumb3); - } - if (p4!=null){ - prc.setFileRight45(ValidFile(p4.getFullres()) ? p4.getFullres() : ""); - prc.setCompressedRight45(ValidFile(p4.getCompressedfile()) ? p4.getCompressedfile() : ""); - if (ValidFile(p4.getFullcrop())){ - // ada crop - prc.setCroppedRight45(p4.getFullcrop()); - } else { - String xx = image4.CropBestMat(directory,prefix, bestroi); - if (ValidFile(xx)) prc.setCroppedRight45(xx); - } - if (ValidFile(p4.getCompressedcrop())){ - prc.setCompressedCropRight45(p4.getCompressedcrop()); - } else { - String xx = image4.CropReducedMat(directory,prefix, reducedroi); - if (ValidFile(xx)) prc.setCompressedCropRight45(xx); - } - String thumb4 = MakeThumbfile(p4.getFullres(), thumbsize); - if (ValidFile(thumb4)) prc.setThumbRight45(thumb4); - } - if (p5!=null){ - prc.setFileRight90(ValidFile(p5.getFullres()) ? p5.getFullres() : ""); - prc.setCompressedRight90(ValidFile(p5.getCompressedfile()) ? p5.getCompressedfile() : ""); - if (ValidFile(p5.getFullcrop())){ - // ada crop - prc.setCroppedRight90(p5.getFullcrop()); - } else { - String xx = image5.CropBestMat(directory,prefix, bestroi); - if (ValidFile(xx)) prc.setCroppedRight90(xx); - } - if (ValidFile(p5.getCompressedcrop())){ - prc.setCompressedCropRight90(p5.getCompressedcrop()); - } else { - String xx= image5.CropReducedMat(directory,prefix, reducedroi); - if (ValidFile(xx)) prc.setCompressedCropRight90(xx); - } - String thumb5 = MakeThumbfile(p5.getFullres(), thumbsize); - if (ValidFile(thumb5)) prc.setThumbRight90(thumb5); - } - - long duration = (System.nanoTime() - nanostart) / 1000000; // in milliseconds - System.out.println("TakePhotos duration: "+duration+" ms"); - - AutoCloseAlert.show("Photos Taken", "Photos Taken", "Photos Taken", 5, null); - - if (audioPlayer!=null && audioPlayer.isInited()){ - if (!audioPlayer.getCurrentFile().equals(audio_pengambilan_berhasil)) { - audioPlayer.StopCurrentPlayback(); - Wait(200); - audioPlayer.PlayFile(audio_pengambilan_berhasil, ps); - } else System.out.println("audioPlayer already playing pengambilan berhasil"); - } - - // file untuk di upload - String[] files = prc.compressed(); - - if (files.length>0){ - InsertSQL(prc); - - Task uploadtask = new Task<>() { - @Override - protected Void call() { - int totalfiles = files.length; - int counter = 0; - for (String ff : files) { - UploadResult ur = erhaAPI.Upload_File(prefix, ff,true); - if (ur != null) { - if (ur.message.startsWith("Record has been created")) { - counter++; - updateMessage("Upload success for " + ff); - } else updateMessage("Upload failed for " + ff+", Message : "+ur.message); - } else updateMessage("Upload failed for " + ff+" because UploadResult is null"); - - } - if (counter == totalfiles) { - super.succeeded(); - } else super.failed(); - return null; - } - }; - - - - uploadtask.messageProperty().addListener((obs, oldval, newval)-> { - System.out.println("UploadTask message: "+newval); - Logger.info(newval); - }); - - - uploadtask.setOnSucceeded(e-> { - System.out.println("UploadTask succeeded"); - if (audioPlayer!=null && audioPlayer.isInited()){ - if (!audioPlayer.getCurrentFile().equals(audio_upload_berhasil)) { - audioPlayer.StopCurrentPlayback(); - Wait(200); - audioPlayer.PlayFile(audio_upload_berhasil, ps); - } else System.out.println("audioPlayer already playing upload berhasil"); - } - AutoCloseAlert.show("Upload Success", "Upload Success", "Upload Success", 5, null); - Platform.runLater(()->{ - barcodeData.setText(""); - medicalRecordID.setText(""); - PatientName.setText(""); - isTakingPhoto.set(false); - }); - }); - - uploadtask.setOnFailed(e-> { - System.out.println("UploadTask failed"); - if (audioPlayer!=null && audioPlayer.isInited()){ - if (!audioPlayer.getCurrentFile().equals(audio_upload_gagal)) { - audioPlayer.StopCurrentPlayback(); - Wait(200); - audioPlayer.PlayFile(audio_upload_gagal, ps); - } else System.out.println("audioPlayer already playing upload gagal"); - - } - AutoCloseAlert.show("Upload Failed", "Upload Failed", "Upload Failed", 5, null); - Platform.runLater(()->{ - barcodeData.setText(""); - medicalRecordID.setText(""); - PatientName.setText(""); - isTakingPhoto.set(false); - }); - }); - - new Thread(uploadtask).start(); - - } else ShowAlert(AlertType.ERROR, "Error", "No Photos Taken", "No Photos Taken, please check camera"); - } else ShowAlert(AlertType.ERROR, "Error", "Invalid Prefix", "Please input valid prefix or scan QR Code"); - } else ShowAlert(AlertType.ERROR,"Error","Invalid Directory","Please select valid directory"); - - } else { AutoCloseAlert.show("Error", "No Face Detected", "No Face Detected", 5, null); if (audioPlayer!=null && audioPlayer.isInited()){ - if (!audioPlayer.getCurrentFile().equals(audio_posisikan_muka)) { + if (!Objects.equals(audioPlayer.getCurrentFile(),audio_posisikan_muka)) { audioPlayer.StopCurrentPlayback(); - Wait(200); - audioPlayer.PlayFile(audio_posisikan_muka, ps); - } else System.out.println("audioPlayer already playing posisikan muka"); + audioPlayer.PlayFile(audio_posisikan_muka, null); + } } } + } + + private void UploadFiles(PhotoReviewClass prc, String prefix){ + String[] files = prc.compressed(); + if (files.length>0){ + InsertSQL(prc); + + Task uploadtask = new Task<>() { + @Override + protected Void call() { + int totalfiles = files.length; + int counter = 0; + for (String ff : files) { + UploadResult ur = erhaAPI.Upload_File(prefix, ff,true); + if (ur != null) { + if (ur.message.startsWith("Record has been created")) { + counter++; + updateMessage("Upload success for " + ff); + } else updateMessage("Upload failed for " + ff+", Message : "+ur.message); + } else updateMessage("Upload failed for " + ff+" because UploadResult is null"); + + } + if (counter == totalfiles) { + super.succeeded(); + } else super.failed(); + return null; + } + }; + + uploadtask.messageProperty().addListener((obs, oldval, newval)-> { + System.out.println("UploadTask message: "+newval); + Logger.info(newval); + }); + + + uploadtask.setOnSucceeded(e-> { + System.out.println("UploadTask succeeded"); + if (audioPlayer!=null && audioPlayer.isInited()){ + if (!Objects.equals(audioPlayer.getCurrentFile(), audio_upload_berhasil)){ + audioPlayer.StopCurrentPlayback(); + audioPlayer.PlayFile(audio_upload_berhasil, null); + } + } + AutoCloseAlert.show("Upload Success", "Upload Success", "Upload Success", 5, s -> { + isTakingPhoto.set(false); + Platform.runLater(()->{ + barcodeData.setText(""); + medicalRecordID.setText(""); + PatientName.setText(""); + }); + }); + + }); + + uploadtask.setOnFailed(e-> { + System.out.println("UploadTask failed"); + if (audioPlayer!=null && audioPlayer.isInited()){ + if (!Objects.equals(audioPlayer.getCurrentFile(), audio_upload_gagal)){ + audioPlayer.StopCurrentPlayback(); + audioPlayer.PlayFile(audio_upload_gagal, null); + } + } + AutoCloseAlert.show("Upload Failed", "Upload Failed", "Upload Failed", 5, s -> { + isTakingPhoto.set(false); + Platform.runLater(()->{ + barcodeData.setText(""); + medicalRecordID.setText(""); + PatientName.setText(""); + }); + }); + }); + + new Thread(uploadtask).start(); + + } else ShowAlert(AlertType.ERROR, "Error", "No Photos Taken", "No Photos Taken, please check camera"); } @FXML @@ -589,24 +608,22 @@ public class CaptureView { audio_upload_berhasil = ExtractResource("/upload_berhasil.wav"); audio_upload_gagal = ExtractResource("/upload_gagal.wav"); audio_countdown = ExtractResource("/countdown321.wav"); + audio_camera_shutter = ExtractResource("/camera-shutter-click-01.wav"); audio_tahan_posisi = ExtractResource("/tahan_posisi.wav"); audio_kesalahan_server = ExtractResource("/kesalahan_server.wav"); audio_data_barcode_tidak_ditemukan = ExtractResource("/data_barcode_tidak_ditemukan.wav"); //tambahan 19/03/2025 - barcodeData.textProperty().addListener(new InvalidationListener() { - @Override - public void invalidated(Observable observable) { - String barcode = barcodeData.getText(); - System.out.println("barcodeData invalidated, value: "+barcode); - if (ValidBarCode(barcode)){ - if (AutoCloseAlert.shownTitle.equals("Scan Barcode")){ - AutoCloseAlert.close(); - } - } else { - AutoCloseAlert.show("Scan Barcode", "Silahkan Scan Barcode Anda", "Arahkan kertas barcode ke kamera", 0, null); + barcodeData.textProperty().addListener(observable -> { + String barcode = barcodeData.getText(); + //System.out.println("barcodeData invalidated, value: "+barcode); + if (ValidBarCode(barcode)){ + if (AutoCloseAlert.shownTitle.equals("Scan Barcode")){ + AutoCloseAlert.close(); } + } else { + AutoCloseAlert.show("Scan Barcode", "Silahkan Scan Barcode Anda", "Arahkan kertas barcode ke kamera", 0, null); } }); barcodeData.setText(""); @@ -727,59 +744,59 @@ public class CaptureView { config.Save(); } - final PlaybackStatus ps = new PlaybackStatus(){ - - @Override - public void onPlaybackStarted(String filename) { - if (filename.contains(audio_posisikan_muka)){ - Logger.info("Audio Positikan Muka Started"); - } else if (filename.contains(audio_pengambilan_berhasil)){ - Logger.info("Audio Pengambilan Berhasil Started"); - } else if (filename.contains(audio_pengambilan_gagal)){ - Logger.info("Audio Pengambilan Gagal Started"); - } else if (filename.contains(audio_scan_barcode)){ - Logger.info("Audio Scan Barcode Started"); - } else if (filename.contains(audio_upload_berhasil)){ - Logger.info("Audio Upload Berhasil Started"); - } else if (filename.contains(audio_upload_gagal)){ - Logger.info("Audio Upload Gagal Started"); - } - } - - @Override - public void onPlaybackFinished(String filename) { - if (filename.contains(audio_posisikan_muka)){ - Logger.info("Audio Positikan Muka Finished"); - } else if (filename.contains(audio_scan_barcode)){ - Logger.info("Audio Scan Barcode Finished"); - } else if (filename.contains(audio_upload_berhasil)){ - Logger.info("Audio Upload Berhasil Finished"); - } else if (filename.contains(audio_upload_gagal)){ - Logger.info("Audio Upload Gagal Finished"); - } else if (filename.contains(audio_pengambilan_berhasil)){ - Logger.info("Audio Pengambilan Berhasil Finished"); - } else if (filename.contains(audio_pengambilan_gagal)){ - Logger.info("Audio Pengambilan Gagal Finished"); - } - } - - @Override - public void onPlaybackFailure(String filename) { - if (filename.contains(audio_posisikan_muka)){ - Logger.info("Audio Positikan Muka Failure"); - } else if (filename.contains(audio_upload_gagal)){ - Logger.info("Audio Upload Gagal Failure"); - } else if (filename.contains(audio_upload_berhasil)){ - Logger.info("Audio Upload Berhasil Failure"); - } else if (filename.contains(audio_pengambilan_berhasil)){ - Logger.info("Audio Pengambilan Berhasil Failure"); - } else if (filename.contains(audio_pengambilan_gagal)){ - Logger.info("Audio Pengambilan Gagal Failure"); - } else if (filename.contains(audio_scan_barcode)){ - Logger.info("Audio Scan Barcode Failure"); - } - } - }; +// final PlaybackStatus ps = new PlaybackStatus(){ +// +// @Override +// public void onPlaybackStarted(String filename) { +// if (filename.contains(audio_posisikan_muka)){ +// Logger.info("Audio Positikan Muka Started"); +// } else if (filename.contains(audio_pengambilan_berhasil)){ +// Logger.info("Audio Pengambilan Berhasil Started"); +// } else if (filename.contains(audio_pengambilan_gagal)){ +// Logger.info("Audio Pengambilan Gagal Started"); +// } else if (filename.contains(audio_scan_barcode)){ +// Logger.info("Audio Scan Barcode Started"); +// } else if (filename.contains(audio_upload_berhasil)){ +// Logger.info("Audio Upload Berhasil Started"); +// } else if (filename.contains(audio_upload_gagal)){ +// Logger.info("Audio Upload Gagal Started"); +// } +// } +// +// @Override +// public void onPlaybackFinished(String filename) { +// if (filename.contains(audio_posisikan_muka)){ +// Logger.info("Audio Positikan Muka Finished"); +// } else if (filename.contains(audio_scan_barcode)){ +// Logger.info("Audio Scan Barcode Finished"); +// } else if (filename.contains(audio_upload_berhasil)){ +// Logger.info("Audio Upload Berhasil Finished"); +// } else if (filename.contains(audio_upload_gagal)){ +// Logger.info("Audio Upload Gagal Finished"); +// } else if (filename.contains(audio_pengambilan_berhasil)){ +// Logger.info("Audio Pengambilan Berhasil Finished"); +// } else if (filename.contains(audio_pengambilan_gagal)){ +// Logger.info("Audio Pengambilan Gagal Finished"); +// } +// } +// +// @Override +// public void onPlaybackFailure(String filename) { +// if (filename.contains(audio_posisikan_muka)){ +// Logger.info("Audio Positikan Muka Failure"); +// } else if (filename.contains(audio_upload_gagal)){ +// Logger.info("Audio Upload Gagal Failure"); +// } else if (filename.contains(audio_upload_berhasil)){ +// Logger.info("Audio Upload Berhasil Failure"); +// } else if (filename.contains(audio_pengambilan_berhasil)){ +// Logger.info("Audio Pengambilan Berhasil Failure"); +// } else if (filename.contains(audio_pengambilan_gagal)){ +// Logger.info("Audio Pengambilan Gagal Failure"); +// } else if (filename.contains(audio_scan_barcode)){ +// Logger.info("Audio Scan Barcode Failure"); +// } +// } +// }; private void SetupCameraWithController(Cameradetail image, String cameraname, int devicenumber){ if (image!=null){ @@ -947,32 +964,35 @@ public class CaptureView { }); if (audioPlayer!=null && audioPlayer.isInited()){ - if (!audioPlayer.getCurrentFile().equals(audio_posisikan_muka)) { + if (!Objects.equals(audioPlayer.getCurrentFile(),audio_posisikan_muka)) { audioPlayer.StopCurrentPlayback(); - Wait(200); - audioPlayer.PlayFile(audio_posisikan_muka, ps); - } else System.out.println("audioPlayer already playing posisikan muka"); + audioPlayer.PlayFile(audio_posisikan_muka, null); + } } } }); checkpatientID.setOnFailed(event -> { - audioPlayer.PlayFile(audio_data_barcode_tidak_ditemukan,ps); + if (audioPlayer!=null && audioPlayer.isInited()){ + if (!Objects.equals(audioPlayer.getCurrentFile(), audio_data_barcode_tidak_ditemukan)) { + audioPlayer.StopCurrentPlayback(); + audioPlayer.PlayFile(audio_data_barcode_tidak_ditemukan,null); + } + } Task failed = (Task) event.getSource(); Throwable t = failed.getException(); final String message = t.getMessage(); System.out.println("checkpatientID.setOnFailed message : "+message); - AutoCloseAlert.show("Data Tidak Ditemukan", message, "Pastikan data barcode anda benar", 5, new Consumer() { - @Override - public void accept(String s) { - Platform.runLater(()->{ - medicalRecordID.setText(""); - PatientName.setText(""); - barcodeData.setText(""); - isTakingPhoto.set(false); - }); - } + + + AutoCloseAlert.show("Data Tidak Ditemukan", message, "Pastikan data barcode anda benar", 5, s -> { + isTakingPhoto.set(false); + Platform.runLater(()->{ + medicalRecordID.setText(""); + PatientName.setText(""); + barcodeData.setText(""); + }); }); }); @@ -990,7 +1010,10 @@ public class CaptureView { public void onFrontalFaceDetector(boolean hasface, int width, int height) { if (hasface!= _have_face.get()){ _have_face.set(hasface); - update_status(image); + if (!hasface) { + _have_eye.set(false); + } + //update_status(image); } @@ -1000,15 +1023,18 @@ public class CaptureView { public void onProfileFaceDetector(boolean hasface, int width, int height) { if (hasface!= _have_profile.get()){ _have_profile.set(hasface); - update_status(image); + if (!hasface) { + _have_eye.set(false); + } + //update_status(image); } } @Override - public void onEyeDetector(boolean hasEye, int width, int height) { -// _have_eye.set(hasEye); -// update_status(image); + public void onEyeDetector(boolean hasEye) { + if (_have_face.get() || _have_profile.get()) _have_eye.set(hasEye); + //update_status(image); } @Override @@ -1043,28 +1069,36 @@ public class CaptureView { @Override public void onBlink(int counter) { - if (isTakingPhoto.get()) return; // other camera is taking picture System.out.println("Blink detected at camera "+title+" delay= "+counter); - isTakingPhoto.set(true); - String prefix = medicalRecordID.getText(); - if (!prefix.isEmpty()){ - System.out.println("Prefix valid, taking photo"); - TakePhotos(); - } else { - System.out.println("Prefix invalid, not taking photo"); - isTakingPhoto.set(false); - AutoCloseAlert.show("QR Code Not Available", "", "Please scan QR before continue", 5, null); - if (audioPlayer!=null && audioPlayer.isInited()){ - if (!audioPlayer.getCurrentFile().equals(audio_scan_barcode)) { - audioPlayer.StopCurrentPlayback(); - Wait(200); - audioPlayer.PlayFile(audio_scan_barcode, ps); - } else System.out.println("audioPlayer already playing scan barcode"); + if (isTakingPhoto.get()) return; // other camera is taking picture + String directory = config.getPhotoDirectory(); + String prefix = RemoveSpaces(medicalRecordID.getText()) ; + if (ValidDirectory(directory)){ + if (ValidMedicalRecordId(prefix)){ + isTakingPhoto.set(true); + TakePhotos(directory,prefix); + } else { + System.out.println("Prefix invalid, not taking photo"); + isTakingPhoto.set(false); + AutoCloseAlert.show("QR Code Not Available", "", "Please scan QR before continue", 5, s -> AutoCloseAlert.show("Scan Barcode", "Silahkan Scan Barcode Anda", "Arahkan kertas barcode ke kamera", 0, null)); + if (audioPlayer!=null && audioPlayer.isInited()){ + if (!Objects.equals(audioPlayer.getCurrentFile(), audio_scan_barcode)) { + audioPlayer.StopCurrentPlayback(); + audioPlayer.PlayFile(audio_scan_barcode, null); + } + } } - + } else { + System.out.println("Photo Directory invalid, not taking photo"); + isTakingPhoto.set(false); + AutoCloseAlert.show("Invalid Photo Directory","Photo Directory not set", "Please set photo directory at Setting", 5, s -> AutoCloseAlert.show("Setting", "Setting", "Please set photo directory", 0, null)); } + } + @Override + public void onStartCapturing() { + update_status(image); } private void update_status(Cameradetail image){ @@ -1076,15 +1110,13 @@ public class CaptureView { sb.append(image.getBestHeight()); sb.append("@"); sb.append(image.getLiveFPS()); - if (_have_face.get()) sb.append(", Face"); - if (_have_profile.get()) sb.append(", Profile"); - if (_have_eye.get()) sb.append(", Eye"); - if (_have_left_eye.get()) sb.append(", Left Eye"); - if (_have_right_eye.get()) sb.append(", Right Eye"); - if (_have_left_ear.get()) sb.append(", Left Ear"); - if (_have_right_ear.get()) sb.append(", Right Ear"); - - + //if (_have_face.get()) sb.append(", Face"); + //if (_have_profile.get()) sb.append(", Face"); + //if (_have_eye.get()) sb.append(", Eye"); +// if (_have_left_eye.get()) sb.append(", Left Eye"); +// if (_have_right_eye.get()) sb.append(", Right Eye"); +// if (_have_left_ear.get()) sb.append(", Left Ear"); +// if (_have_right_ear.get()) sb.append(", Right Ear"); image.setCameraStatus(sb.toString()); }); } diff --git a/src/main/java/id/co/gtc/erhacam/SettingView.java b/src/main/java/id/co/gtc/erhacam/SettingView.java index 2ba0419..3558392 100644 --- a/src/main/java/id/co/gtc/erhacam/SettingView.java +++ b/src/main/java/id/co/gtc/erhacam/SettingView.java @@ -2,8 +2,11 @@ package id.co.gtc.erhacam; import FTP.FTPCheck; import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.Alert; +import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; import javafx.stage.DirectoryChooser; @@ -13,6 +16,7 @@ import org.bytedeco.javacv.VideoInputFrameGrabber; import org.tinylog.Logger; import java.io.File; +import java.util.Objects; import static Config.SomeCodes.*; @@ -39,9 +43,18 @@ public class SettingView { @FXML private TextField FTPPath; + @FXML + private TextField Sharpness; + @FXML private TextField PhotoDirectoryPath; + @FXML + private CheckBox MirrorCamera; + + @FXML + private CheckBox FlipCamera; + final FileChooser jfc = new FileChooser(); @@ -68,8 +81,20 @@ public class SettingView { PhotoDirectoryPath.setText(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(); @@ -104,6 +129,7 @@ public class SettingView { } 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){ @@ -123,7 +149,17 @@ public class SettingView { Logger.error("Unable to detect Cameras, Msg : "+e.getMessage()); } + MirrorCamera.selectedProperty().addListener(((observable, oldValue, newValue) -> { + System.out.println("Mirror option changed to : "+newValue); + config.setMirrorCamera(newValue); + config.Save(); + })); + FlipCamera.selectedProperty().addListener((observable, oldValue, newValue) -> { + System.out.println("Flip option changed to : "+newValue); + config.setFlipCamera(newValue); + config.Save(); + }); Platform.runLater(()->{ @@ -166,6 +202,12 @@ public class SettingView { cascadeScaleFactor.setText(String.valueOf(config.getCascadeScaleFactor())); cascadeMinSize.setText(String.valueOf(config.getCascadeMinSize())); cascadeMaxSize.setText(String.valueOf(config.getCascadeMaxSize())); + + MirrorCamera.setSelected(config.isMirrorCamera()); + FlipCamera.setSelected(config.isFlipCamera()); + + Sharpness.setText(String.valueOf(config.getSharpnessThreshold())); + }); } diff --git a/src/main/resources/id/co/gtc/erhacam/cameradetail.fxml b/src/main/resources/id/co/gtc/erhacam/cameradetail.fxml index 668a42b..040a8a7 100644 --- a/src/main/resources/id/co/gtc/erhacam/cameradetail.fxml +++ b/src/main/resources/id/co/gtc/erhacam/cameradetail.fxml @@ -5,7 +5,7 @@ - + @@ -22,6 +22,9 @@ + + + @@ -37,6 +40,23 @@ + + + + + + + + + + + + @@ -68,9 +88,9 @@ - + - +