@@ -16,7 +16,8 @@ public class BaslerFrameProvider extends CpuImageProcessor {
1616
1717 private Runnable connectedCallback ;
1818
19- // private long lastFrameTimestamp = 0;
19+ private long timeOffsetNs = 0 ;
20+ private boolean timeSyncDone = false ;
2021
2122 public BaslerFrameProvider (GenericBaslerCameraSettables settables , Runnable connectedCallback ) {
2223 this .settables = settables ;
@@ -69,8 +70,6 @@ CapturedFrame getInputMat() {
6970 if (!cameraPropertiesCached && isConnected ()) {
7071 onCameraConnected ();
7172 }
72-
73- // 1. Check if the C++ backend flagged this hardware as disconnected
7473 if (BaslerJNI .isCameraRemoved (settables .ptr )) {
7574 logger .error ("Camera hardware was removed! Forcing pipeline restart." );
7675 throw new RuntimeException ("Basler device physically disconnected." );
@@ -81,20 +80,26 @@ CapturedFrame getInputMat() {
8180 frame .setInfo (
8281 cameraMode .width , cameraMode .height , cameraMode .width * 3 , cameraMode .pixelFormat );
8382
84- var start = MathUtils .wpiNanoTime ();
8583 BaslerJNI .awaitNewFrame (settables .ptr );
86-
84+ long hwTimestampNs = BaslerJNI . getLatestTimestamp ( settables . ptr );
8785 long matPtr = BaslerJNI .takeFrame (settables .ptr );
88-
89- // 2. Defensive check: If the pointer is 0, the grab failed or timed out.
86+
9087 if (matPtr == 0 ) {
91- // Return an empty/dummy frame rather than crashing OpenCV
92- return new CapturedFrame ( new CVMat (), settables .getFrameStaticProperties (), start );
88+ return new CapturedFrame (
89+ new CVMat (), settables .getFrameStaticProperties (), MathUtils . wpiNanoTime () );
9390 }
9491
92+ long currentWpiTimeNs = MathUtils .wpiNanoTime ();
93+ if (!timeSyncDone && hwTimestampNs > 0 ) {
94+ timeOffsetNs = currentWpiTimeNs - hwTimestampNs ;
95+ timeSyncDone = true ;
96+ }
97+
98+ long synchronizedTimestamp = hwTimestampNs + timeOffsetNs ;
99+
95100 Mat mat = new Mat (matPtr );
96101 CVMat ret = new CVMat (mat , frame );
97- return new CapturedFrame (ret , settables .getFrameStaticProperties (), start );
102+ return new CapturedFrame (ret , settables .getFrameStaticProperties (), synchronizedTimestamp );
98103 }
99104
100105 @ Override
0 commit comments