Skip to content

Commit

Permalink
learned multithreading
Browse files Browse the repository at this point in the history
  • Loading branch information
penguinencounter committed Sep 16, 2024
1 parent 7dc5b4f commit 21de3e1
Showing 1 changed file with 22 additions and 6 deletions.
28 changes: 22 additions & 6 deletions TeamCode/src/main/java/org/firstinspires/ftc/teamcode/Capture.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.firstinspires.ftc.teamcode;

import static org.firstinspires.ftc.vision.VisionPortal.CameraState.STREAMING;
import static org.opencv.imgproc.Imgproc.COLOR_RGB2BGR;

import android.graphics.Canvas;
import android.os.Environment;
Expand All @@ -16,6 +17,7 @@
import org.firstinspires.ftc.vision.VisionProcessor;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.io.File;
import java.util.concurrent.TimeUnit;
Expand All @@ -26,17 +28,30 @@ public class Capture extends LinearOpMode {

static class CaptureProcessor implements VisionProcessor {
public Mat latest;
public final Object latestLock = new Object();
public long frameNo = 0;

public Mat getLatest() {
synchronized (latestLock) {
return latest.clone();
}
}

@Override
public void init(int width, int height, CameraCalibration calibration) {
}

@Override
public Object processFrame(Mat frame, long captureTimeNanos) {
if (frameNo < 3) {
Log.i("CaptureProcessor", String.format("ok, im running on %s/%d", Thread.currentThread().getName(), Thread.currentThread().getId()));
}
frameNo++;
if (latest != null) latest.release();
latest = frame.clone();
synchronized (latestLock) {
if (latest != null) latest.release();
latest = frame.clone();
Imgproc.cvtColor(latest, latest, COLOR_RGB2BGR);
}
return null;
}

Expand Down Expand Up @@ -71,20 +86,21 @@ public void runOpMode() throws InterruptedException {

boolean isAPressed = false;
boolean configured = false;
Log.i("Main", String.format("ok, im running on %s/%d", Thread.currentThread().getName(), Thread.currentThread().getId()));

while (opModeInInit()) {
if (portal.getCameraState() == STREAMING && !configured) {
ExposureControl exposure = portal.getCameraControl(ExposureControl.class);
exposure.setMode(ExposureControl.Mode.Manual);
long micros = exposure.getMinExposure(TimeUnit.MILLISECONDS);
exposure.setExposure(200, TimeUnit.MILLISECONDS);
// exposure.setMode(ExposureControl.Mode.Manual);
// long micros = exposure.getMinExposure(TimeUnit.MILLISECONDS);
// exposure.setExposure(200, TimeUnit.MILLISECONDS);
configured = true;
}
boolean nonVolatileA = gamepad1.a;
if (nonVolatileA && !isAPressed) {
Log.i("Capture", "Saving");
// try to avoid getting deallocated while saving by cloning
Mat imm = proc.latest.clone();
Mat imm = proc.getLatest(); // synchronized
save(imm);
imm.release();
Log.i("Capture", "Done");
Expand Down

0 comments on commit 21de3e1

Please sign in to comment.