Skip to content
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use nix
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,6 @@ node_modules
dist
components.d.ts
photon-server/src/main/resources/web/index.html

# Direnv
.direnv
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
"python.testing.cwd": "photon-lib/py"
"python.testing.cwd": "photon-lib/py",
"java.configuration.updateBuildConfiguration": "interactive"
}
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ ext {
libcameraDriverVersion = "v2025.0.4"
rknnVersion = "dev-v2025.0.0-5-g666c0c6"
rubikVersion = "dev-v2025.1.0-8-g067a316"
baslerVersion = "local"
frcYear = "2025"
mrcalVersion = "v2025.0.0";

Expand Down
4 changes: 4 additions & 0 deletions photon-client/src/components/common/pv-camera-info-card.vue
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ const cameraInfoFor: any = (camera: PVCameraInfo) => {
if (camera.PVFileCameraInfo) {
return camera.PVFileCameraInfo;
}
if (camera.PVBaslerCameraInfo) {
return camera.PVBaslerCameraInfo;
}
return {};
};
</script>
Expand All @@ -39,6 +42,7 @@ const cameraInfoFor: any = (camera: PVCameraInfo) => {
<td v-if="camera.PVUsbCameraInfo" class="mb-3">USB Camera</td>
<td v-else-if="camera.PVCSICameraInfo" class="mb-3">CSI Camera</td>
<td v-else-if="camera.PVFileCameraInfo" class="mb-3">File Camera</td>
<td v-else-if="camera.PVBaslerCameraInfo" class="mb-3">Basler Camera</td>
<td v-else>Unidentified Camera Type</td>
</tr>
<tr v-if="cameraInfoFor(camera).baseName !== undefined && cameraInfoFor(camera).baseName !== null">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ const cameraInfoFor = (camera: PVCameraInfo): any => {
if (camera.PVFileCameraInfo) {
return camera.PVFileCameraInfo;
}
if (camera.PVBaslerCameraInfo) {
return camera.PVBaslerCameraInfo;
}
return {};
};
</script>
Expand Down Expand Up @@ -78,10 +81,12 @@ const cameraInfoFor = (camera: PVCameraInfo): any => {
<td v-if="saved.PVUsbCameraInfo" class="mb-3">USB Camera</td>
<td v-else-if="saved.PVCSICameraInfo" class="mb-3">CSI Camera</td>
<td v-else-if="saved.PVFileCameraInfo" class="mb-3">File Camera</td>
<td v-else-if="saved.PVBaslerCameraInfo" class="mb-3">Basler Camera</td>
<td v-else>Unidentified Camera Type</td>
<td v-if="current.PVUsbCameraInfo" class="mb-3">USB Camera</td>
<td v-else-if="current.PVCSICameraInfo" class="mb-3">CSI Camera</td>
<td v-else-if="current.PVFileCameraInfo" class="mb-3">File Camera</td>
<td v-else-if="current.PVBaslerCameraInfo" class="mb-3">Basler Camera</td>
<td v-else>Unidentified Camera Type</td>
</tr>
<tr
Expand Down
14 changes: 12 additions & 2 deletions photon-client/src/types/SettingTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export interface PVCameraInfoBase {
Huge hack. In Jackson, this is set based on the underlying type -- this
then maps to one of the 3 subclasses here below. Not sure how to best deal with this.
*/
cameraTypename: "PVUsbCameraInfo" | "PVCSICameraInfo" | "PVFileCameraInfo";
cameraTypename: "PVUsbCameraInfo" | "PVCSICameraInfo" | "PVFileCameraInfo" | "PVBaslerCameraInfo";
}

export interface PVUsbCameraInfo {
Expand Down Expand Up @@ -103,11 +103,20 @@ export interface PVFileCameraInfo {
uniquePath: string;
}

export interface PVBaslerCameraInfo {
serial: string;
model: string;

uniquePath: string;

}

// This camera info will only ever hold one of its members - the others should be undefined.
export class PVCameraInfo {
PVUsbCameraInfo: PVUsbCameraInfo | undefined;
PVCSICameraInfo: PVCSICameraInfo | undefined;
PVFileCameraInfo: PVFileCameraInfo | undefined;
PVBaslerCameraInfo: PVBaslerCameraInfo | undefined;
}

export interface VsmState {
Expand Down Expand Up @@ -386,7 +395,8 @@ export const PlaceholderCameraSettings: UiCameraConfiguration = {
uniquePath: "/dev/foobar2"
},
PVCSICameraInfo: undefined,
PVUsbCameraInfo: undefined
PVUsbCameraInfo: undefined,
PVBaslerCameraInfo: undefined,
},
isConnected: true,
hasConnected: true,
Expand Down
1 change: 1 addition & 0 deletions photon-client/src/views/CameraMatchingView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import {
PlaceholderCameraSettings,
PVCameraInfo,
type PVBaslerCameraInfo,

Check failure on line 8 in photon-client/src/views/CameraMatchingView.vue

View workflow job for this annotation

GitHub Actions / PhotonClient Lint and Formatting

'PVBaslerCameraInfo' is defined but never used
type PVCSICameraInfo,
type PVFileCameraInfo,
type PVUsbCameraInfo,
Expand Down
3 changes: 3 additions & 0 deletions photon-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ dependencies {
implementation("org.photonvision:photon-libcamera-gl-driver-jni:$libcameraDriverVersion:linuxarm64") {
transitive = false
}
implementation("org.teamdeadbolts:basler_jni-linuxx64:$baslerVersion") {
transitive = false
}
implementation "org.photonvision:photon-libcamera-gl-driver-java:$libcameraDriverVersion"

implementation "org.photonvision:photon-mrcal-java:$mrcalVersion"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.photonvision.jni;

import java.io.IOException;
import java.util.List;
import org.photonvision.common.util.TestUtils;

public class BaslerCameraJNI extends PhotonJNICommon {
private boolean isLoaded;
private static BaslerCameraJNI instance = null;

private BaslerCameraJNI() {
isLoaded = false;
}

public static BaslerCameraJNI getInstance() {
if (instance == null) instance = new BaslerCameraJNI();

return instance;
}

public static synchronized void forceLoad() throws IOException {
TestUtils.loadLibraries();

forceLoad(getInstance(), BaslerCameraJNI.class, List.of("baslerjni"));
}

@Override
public boolean isLoaded() {
return isLoaded;
}

@Override
public void setLoaded(boolean state) {
isLoaded = state;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@
public enum CameraType {
UsbCamera,
ZeroCopyPicam,
BaslerCamera,
FileCamera // special case for File-based vision sources
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,17 @@
import com.fasterxml.jackson.annotation.JsonTypeName;
import edu.wpi.first.cscore.UsbCameraInfo;
import java.util.Arrays;
import org.teamdeadbolts.basler.BaslerJNI;
import org.teamdeadbolts.basler.BaslerJNI.CameraModel;
import java.util.Objects;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = PVCameraInfo.PVUsbCameraInfo.class),
@JsonSubTypes.Type(value = PVCameraInfo.PVCSICameraInfo.class),
@JsonSubTypes.Type(value = PVCameraInfo.PVFileCameraInfo.class)
@JsonSubTypes.Type(value = PVCameraInfo.PVFileCameraInfo.class),
@JsonSubTypes.Type(value = PVCameraInfo.PVBaslerCameraInfo.class)
})
public sealed interface PVCameraInfo {
/**
Expand Down Expand Up @@ -289,6 +292,48 @@ public String toString() {
}
}

@JsonTypeName("PVBaslerCameraInfo")
public static final class PVBaslerCameraInfo implements PVCameraInfo {

public final String serial;
public final BaslerJNI.CameraModel model;

public PVBaslerCameraInfo(
@JsonProperty("serial") String serial, @JsonProperty("model") BaslerJNI.CameraModel model) {
this.serial = serial;
this.model = model;
}

@Override
public String path() {
return this.serial;
}

@Override
public String name() {
return this.model.getFriendlyName();
}

@Override
public String uniquePath() {
return this.serial;
}

@Override
public String[] otherPaths() {
return new String[] {};
}

@Override
public CameraType type() {
return CameraType.BaslerCamera;
}

public BaslerJNI.CameraModel getModel() {
return this.model;
}
}

public static PVCameraInfo fromUsbCameraInfo(UsbCameraInfo info) {
return new PVUsbCameraInfo(info);
}
Expand All @@ -300,4 +345,8 @@ public static PVCameraInfo fromCSICameraInfo(String path, String baseName) {
public static PVCameraInfo fromFileInfo(String path, String baseName) {
return new PVFileCameraInfo(path, baseName);
}

public static PVCameraInfo fromBaslerCameraInfo(String serial, CameraModel model) {
return new PVBaslerCameraInfo(serial, model);
}
}
Loading
Loading