This commit is contained in:
rdkartono
2025-05-20 10:32:55 +07:00
24 changed files with 60 additions and 82 deletions

View File

@@ -19,6 +19,8 @@ import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.*;
import javafx.util.Duration;
import org.tinylog.Logger;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
@@ -341,12 +343,11 @@ public class AutoCloseAlert {
if (ValidFile(filename)){
try{
Image mm = new Image(Paths.get(filename).toUri().toString());
System.out.println("Load image from "+filename);
return mm;
} catch (Exception e){
System.out.println("Error loading image: " + filename+", Message: "+e.getMessage());
Logger.error("Error loading image: " + filename+", Message: "+e.getMessage());
}
} else System.out.println("LoadImage: Invalid file: "+filename);
} else Logger.error("LoadImage: Invalid file: " + filename);
return null;
}

View File

@@ -919,7 +919,6 @@ public class Cameradetail {
if (theface.getFace()!=null){
LiveMatROI = new Rect(theface.getFace().x(), theface.getFace().y(), theface.getFace().width(), theface.getFace().height());
//System.out.println("Frontal Face Detected from camera "+cameratitle+" "+RectToString(LiveMatROI));
}
if (theface.getEyesCount()>=2){
@@ -930,7 +929,6 @@ public class Cameradetail {
if (event!=null) event.onEyeDetector(true);
LabelVisible(eye_indicator,true);
//System.out.println("Valid Eye Detected from camera "+cameratitle);
// Valid eye condition
if (eye_state.get()!=1){
@@ -939,7 +937,6 @@ public class Cameradetail {
System.out.println("First Eye Detected from camera "+cameratitle.getText());
eye_state.set(1);
} else {
//System.out.println("Transition from close to open eyes");
eye_state.set(1);
blink_counter.incrementAndGet();
@@ -975,7 +972,6 @@ public class Cameradetail {
if (eye_state.get()!=0){
//System.out.println("Transition from open to close eyes");
eye_state.set(0);
}

View File

@@ -4,7 +4,6 @@ import BASS.AudioPlayer;
import BASS.PlaybackStatus;
import Camera.*;
import Config.CameraConfigEnum;
import Config.SomeCodes;
import Database.PhotoReviewClass;
import Database.Sqlite;
import ErhaAPI.ErhaAPI;
@@ -13,6 +12,8 @@ import ErhaAPI.PhotoResult;
import ErhaAPI.PatientRecord;
import ErhaAPI.UploadResult;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Platform;
import javafx.concurrent.Task;
@@ -30,6 +31,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import javafx.scene.control.Alert.AlertType;
import javafx.util.Duration;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.javacv.VideoInputFrameGrabber;
import org.bytedeco.opencv.opencv_core.Rect;
@@ -73,7 +75,7 @@ public class CaptureView {
private String audio_posisikan_muka = "posisikan_wajah.wav";
private String audio_scan_barcode = "scan_barcode.wav";
private String audio_pengambilan_gagal = "pengambilan_gagal.wav";
private String audio_pengambilan_berhasil = "pengambilan_berhasil.wav";
private String audio_pengambilan_berhasil = "pengambilan_berhasil_tunggu_lobby.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";
@@ -206,12 +208,10 @@ public class CaptureView {
}
} 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 (!Objects.equals(AutoCloseAlert.shownBanner, AutoCloseAlert.banner_01)){
if (AutoCloseAlert.banner_01!=null){
System.out.println("Showing banner 01 because prefix invalid");
AutoCloseAlert.showbanner(AutoCloseAlert.banner_01,0,null);
}
}
@@ -225,7 +225,6 @@ public class CaptureView {
}
}
} 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));
}
@@ -307,8 +306,6 @@ public class CaptureView {
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;
@@ -530,7 +527,6 @@ public class CaptureView {
public void onPlaybackFinished(String filename) {
AutoCloseAlert.showpictures(prc.compressed(),3, (s)->{
if (AutoCloseAlert.banner_02!=null) {
System.out.println("Showing banner 02 after photo taken");
AutoCloseAlert.showbanner(AutoCloseAlert.banner_02, 0, null);
UploadFiles(prc, prefix);
@@ -573,7 +569,7 @@ public class CaptureView {
int totalfiles = files.length;
int counter = 0;
for (String ff : files) {
UploadResult ur = erhaAPI.Upload_File(prefix, ff,true);
UploadResult ur = erhaAPI.Upload_File(prefix, ff,false);
if (ur != null) {
if (ur.message.startsWith("Record has been created")) {
counter++;
@@ -591,19 +587,12 @@ public class CaptureView {
uploadtask.messageProperty().addListener((obs, oldval, newval)-> {
System.out.println("UploadTask message: "+newval);
Logger.info(newval);
});
uploadtask.messageProperty().addListener((obs, oldval, newval)-> Logger.info(newval));
uploadtask.setOnSucceeded(e-> {
System.out.println("UploadTask succeeded");
clear();
});
uploadtask.setOnSucceeded(e-> clear());
uploadtask.setOnFailed(e-> {
System.out.println("UploadTask failed");
if (audioPlayer!=null && audioPlayer.isInited()){
if (!Objects.equals(audioPlayer.getCurrentFile(), audio_upload_gagal)){
audioPlayer.StopCurrentPlayback();
@@ -637,15 +626,12 @@ public class CaptureView {
//tambahan 19/03/2025
barcodeData.textProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("barcodeData changed from ["+oldValue+"] to ["+newValue+"]");
if (ValidBarCode(newValue)){
if (Objects.equals(AutoCloseAlert.banner_01, AutoCloseAlert.shownBanner)){
System.out.println("Close banner 01");
AutoCloseAlert.close();
}
} else {
if (AutoCloseAlert.banner_01!=null){
System.out.println("Show banner 01");
AutoCloseAlert.showbanner(AutoCloseAlert.banner_01,0, null);
}
}
@@ -680,7 +666,6 @@ public class CaptureView {
Platform.runLater(()->{
if (!Objects.equals(AutoCloseAlert.shownBanner, AutoCloseAlert.banner_01)){
if (AutoCloseAlert.banner_01!=null){
System.out.println("Showing banner 01 for first time");
AutoCloseAlert.showbanner(AutoCloseAlert.banner_01,0,null);
}
}
@@ -886,6 +871,9 @@ public class CaptureView {
boolean use_qr_detector = true;
LiveCamEvent lce = new LiveCamEvent() {
Timeline audioTimeline;
@Override
public void onDetectedQRCode(String barCode) {
barCode = RemoveSpaces(barCode);
@@ -894,10 +882,39 @@ public class CaptureView {
if (!barCode.equals(prefix)){
final String finalbarCode = barCode;
TextAreaSetText(barcodeData, finalbarCode);
// revisi 19/05/2025
if (runningTask!=null) runningTask.cancel(false);
runningTask = timeoutExecutor.schedule(()->{
// timeout
clear();
}, timeout, TimeUnit.SECONDS);
// Revisi 19/05/2025
// pakai Timeline untuk pengulangan PlayFile audio_posisikan_muka dengan interval 5 detik
// diulang 3x
// terakhir, PlayFile audio_hubungi_staf_kami
audioTimeline = new Timeline();
int file_duration = 7; // audio_posisikan_muka durasi 7 detik
audioTimeline.getKeyFrames().add(new KeyFrame(Duration.seconds(0), k1 ->{
}));
audioTimeline.getKeyFrames().add(new KeyFrame(Duration.seconds(5+file_duration), k2 ->{
}));
audioTimeline.getKeyFrames().add(new KeyFrame(Duration.seconds(10+file_duration), k3 ->{
}));
audioTimeline.getKeyFrames().add(new KeyFrame(Duration.seconds(15+file_duration), k4 ->{
}));
Task<PatientRecord> checkpatientID = new Task<>() {
@Override
protected PatientRecord call() throws Exception {
BarcodeResullt br = erhaAPI.Validate_Barcode(finalbarCode,true);
BarcodeResullt br = erhaAPI.Validate_Barcode(finalbarCode,false);
if (br!=null){
if (br.message.startsWith("Records found")){
if (br.data!=null && br.data.length>0){
@@ -936,12 +953,8 @@ public class CaptureView {
TextAreaSetText(medicalRecordID,""+medrecid);
TextAreaSetText(PatientName, pr.name);
if (audioTimeline!=null) audioTimeline.play();
runningTask = timeoutExecutor.schedule(()->{
// timeout
System.out.println("runningTask timeout after "+timeout+" seconds");
clear();
}, timeout, TimeUnit.SECONDS);
if (audioPlayer!=null && audioPlayer.isInited()){
if (!Objects.equals(audioPlayer.getCurrentFile(),audio_posisikan_muka)) {
@@ -992,7 +1005,6 @@ public class CaptureView {
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", "Pastikan data barcode anda benar", message , 5, s -> clear());
@@ -1019,6 +1031,8 @@ public class CaptureView {
}
//update_status(image);
if (hasface && audioTimeline!=null) audioTimeline.stop();
// instruksi scan barcode ketika welcomeUI masih muncul dan ada muka terdeteksi
if (hasface && Objects.equals(AutoCloseAlert.shownBanner, AutoCloseAlert.banner_01)){
if (audioPlayer!=null && audioPlayer.isInited()){
@@ -1092,7 +1106,6 @@ public class CaptureView {
@Override
public void onDoubleBlink(int counter) {
System.out.println("Double Blink detected at camera "+title+" delay= "+counter);
if (audioPlayer!=null && audioPlayer.isPlaying()) return; // let audio finish playback
if (isTakingPhoto.get()) return; // other camera is taking picture
// revisi 08/04/2025
@@ -1145,7 +1158,6 @@ public class CaptureView {
cam.getChildren().add(child);
cam.widthProperty().addListener(observable ->{
//System.out.println("Width property, cam "+camid+" width="+cam.getWidth()+" height="+cam.getHeight());
if (cam.getWidth()!=0) {
if (cam.getHeight()!=0){
AnchorPane.setTopAnchor(child, 0.0);
@@ -1156,7 +1168,6 @@ public class CaptureView {
}
});
cam.heightProperty().addListener(observable -> {
//System.out.println("Height property, cam "+camid+" width="+cam.getWidth()+" height="+cam.getHeight());
if (cam.getWidth()!=0) {
if (cam.getHeight()!=0){
AnchorPane.setTopAnchor(child, 0.0);

View File

@@ -97,7 +97,6 @@ public class Detectors {
for(Rect eye : eyes.get()){
if (SomeCodes.IsInsideRect(eye, face)) {
dr.AddEye(eye);
System.out.println("face width : " + face.width() + " eye width : " + eye.width());
}
}
}
@@ -145,7 +144,6 @@ public class Detectors {
//Logger.info("FaceMinSize created with value : " + FaceminSize.width());
}
System.out.println("Face Min Size : " + FaceminSize.width());
}
public static void setFaceMaxSize(int value){
@@ -159,7 +157,6 @@ public class Detectors {
//Logger.info("FaceMaxSize created with value : " + FacemaxSize.width());
}
System.out.println("Face Max Size : " + FacemaxSize.width());
}

View File

@@ -31,8 +31,8 @@ public class MainApplication extends Application {
System.out.println("ShutdownHook Checking running threads...");
Map<Thread, StackTraceElement[]> allThreads = Thread.getAllStackTraces();
for(Thread thread : allThreads.keySet()){
System.out.println("Thread: " + thread.getName()+", State: " + thread.getState()+", Daemon: " + thread.isDaemon());
//thread.interrupt();
//System.out.println("Thread: " + thread.getName()+", State: " + thread.getState()+", Daemon: " + thread.isDaemon());
thread.interrupt();
}
if (photoCleaner!=null) photoCleaner.Stop();
}));
@@ -50,7 +50,7 @@ public class MainApplication extends Application {
Screen screen = Screen.getPrimary();
Rectangle2D screenbound = screen.getBounds();
Scene scene = new Scene(fxmlLoader.load(), screenbound.getWidth(), screenbound.getHeight());
stage.setTitle("MultiCam Capture App for ERHA 13052025-001");
stage.setTitle("MultiCam Capture App for ERHA 19052025-001");
stage.setScene(scene);
stage.setResizable(true);
stage.setMaximized(true);

View File

@@ -45,17 +45,8 @@ public class PhotoRow {
imgview.setStyle(borderstyle);
imgview.setOnMouseClicked(e->{
if (e.getClickCount()>=2){
//System.out.println("Photo path: "+photopath);
File ff = new File(photopath);
// System.out.println("Config exists : "+(config!=null));
// System.out.println("Photo directory: "+config.getPhotoDirectory());
// System.out.println("Full quality directory: "+config.getFullQualityDirectory());
// System.out.println("Full Quality Crop directory: "+config.getFullQualityCropDirectory());
// System.out.println("Reduced quality directory: "+config.getCompressedDirectory());
// System.out.println("Reduced quality crop directory: "+config.getCompressedCropDirectory());
//String hires = Path.of(config.getPhotoDirectory(), ff.getName()).toString();
String hires = Path.of(config.getFullQualityDirectory(), ff.getName()).toString();
//System.out.println("Hires: "+hires);
File hiresfile = new File(hires);
if (hiresfile.isFile()){
System.out.println("Opening file: "+hires);

View File

@@ -144,13 +144,11 @@ public class SettingView {
}
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();
});