Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,17 @@ public boolean setup() {
final String message = "AcquisitionEngine not implemented for " + geometryType;
studio_.logs().logError(message);
errorText_ = message;
return false; // early exit => error
return false; // early exit => show error ui
}

// load settings
userSettings_.load();

// validate settings
if (!devices().validateCameras()) {
return false; // early exit => show error ui
}

// TODO: put this somewhere better, need to put this value into LightSheetEventAdapter for now
LightSheetEventAdapter.isUsingMultipleCameras =
deviceManager_.adapter().numSimultaneousCameras() > 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ public static boolean isCameraValid(final CameraLibrary camLib) {
return camLib != CameraLibrary.UNKNOWN;
}

public static CameraMode[] modesByDeviceLibrary(final CameraLibrary cameraLibrary) {
public static CameraMode[] modesByDeviceLibrary(
final CameraLibrary cameraLibrary, final GeometryType geometry) {
ArrayList<CameraMode> modes = new ArrayList<>();
if (isCameraValid(cameraLibrary)) {
modes.add(CameraMode.EDGE);
Expand All @@ -90,7 +91,7 @@ public static CameraMode[] modesByDeviceLibrary(final CameraLibrary cameraLibrar
if (hasPseudoOverlapTrigger(cameraLibrary)) {
modes.add(CameraMode.PSEUDO_OVERLAP);
}
if (hasLightSheetTrigger(cameraLibrary)) {
if (geometry != GeometryType.SCAPE && hasLightSheetTrigger(cameraLibrary)) {
modes.add(CameraMode.VIRTUAL_SLIT);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ private void createUserInterface() {
final CameraBase camera = model_.devices().firstImagingCamera();
if (camera != null) {
final CameraLibrary camLib = CameraLibrary.fromString(camera.getDeviceLibrary());
modes = CameraMode.modesByDeviceLibrary(camLib);
modes = CameraMode.modesByDeviceLibrary(camLib, model_.devices().adapter().geometry());
}

cmbCameraMode_ = new ComboBox<>(modes,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
import org.micromanager.lightsheetmanager.LightSheetManager;
import org.micromanager.lightsheetmanager.api.data.ChannelMode;
import org.micromanager.lightsheetmanager.gui.components.SettingsListener;
import org.micromanager.lightsheetmanager.gui.utils.DialogUtils;
import org.micromanager.lightsheetmanager.model.channels.ChannelSpec;

import javax.swing.JLabel;
import javax.swing.*;
import java.util.Objects;

/**
Expand Down Expand Up @@ -60,7 +61,7 @@ private void createUserInterface() {

cmbChannelMode_ = new ComboBox<>(ChannelMode.values(),
model_.acquisitions().settings().channels().mode(),
120, 22);
140, 22);

add(lblChannelGroup_, "split 2");
add(cmbChannelGroup_, "wrap");
Expand Down Expand Up @@ -125,8 +126,14 @@ private void createEventHandlers() {

// select channel mode
cmbChannelMode_.registerListener(() -> {
model_.acquisitions().settingsBuilder().channelBuilder()
.mode(cmbChannelMode_.getSelected());
final ChannelMode selected = cmbChannelMode_.getSelected();
model_.acquisitions().settingsBuilder().channelBuilder().mode(selected);
if (selected == ChannelMode.VOLUME_HW) {
SwingUtilities.invokeLater(() -> {
DialogUtils.showErrorMessage(cmbChannelMode_, "Not Implemented",
"Not implemented in SCAPE, please contact ASI to request this feature.");
});
}
});

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ private void createEventHandlers() {
break;
case SCAPE:
btnInvertedPath_.registerListener(() -> {
if (!btnInvertedPath_.isSelected()) {
model_.studio().live().setLiveModeOn(false);
return;
}
closeLiveModeWindow();
final CameraBase camera = model_.devices().device("PreviewCamera");
if (camera != null) {
Expand All @@ -127,6 +131,10 @@ private void createEventHandlers() {

// live mode
btnLiveMode_.registerListener(() -> {
if (!btnLiveMode_.isSelected()) {
model_.studio().live().setLiveModeOn(false);
return;
}
closeLiveModeWindow();
final CameraBase camera = model_.devices().firstImagingCamera();
if (camera != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import java.util.Objects;

/**
* Control an ASI joystick.
* Control an ASI joystick, left wheel, and right wheel.
*/
public class JoystickPanel extends Panel {

Expand All @@ -26,6 +26,7 @@ public class JoystickPanel extends Panel {
private String previousJoystick_;
private String previousLeftWheel_;
private String previousRightWheel_;

private Map<String, Runnable> methods_;

private final LightSheetManager model_;
Expand All @@ -38,18 +39,22 @@ public JoystickPanel(final LightSheetManager model) {
}
createUserInterface();
createEventHandlers();
if (model_.devices().isUsingPLogic()) {
initHardware();
}
}

private void createMap() {
final ASIXYStage xyStage = model_.devices().device("SampleXY");
final ASIZStage zStage = model_.devices().device("SampleZ");
final ASIZStage stage = model_.devices().device("IllumAngle");
final ASIScanner scanner = model_.devices().device("IllumSlice");
final ASIPiezo piezo = model_.devices().device("ImagingFocus");
final ASIPiezo piezo = model_.devices().device("ImagingFocus");

// set to the default values
previousJoystick_ = "None";
previousLeftWheel_ = "None";
previousRightWheel_ = "None";
previousJoystick_ = model_.pluginSettings().joystickPanel().joystick();
previousLeftWheel_ = model_.pluginSettings().joystickPanel().leftWheel();
previousRightWheel_ = model_.pluginSettings().joystickPanel().rightWheel();

methods_ = new HashMap<>();

Expand All @@ -67,10 +72,16 @@ private void createMap() {
scanner.js().inputX(Joystick.Input.NONE);
scanner.js().inputY(Joystick.Input.NONE);
});
methods_.put("Light Sheet Tilt", () -> {}); // TODO: impl
methods_.put("Light Sheet Tilt", () -> stage.js().input(Joystick.Input.NONE));
methods_.put("Sample Height", () -> zStage.js().input(Joystick.Input.NONE));
}

private void initHardware() {
setJoystick(cmbJoystick_.getSelected());
setWheel(cmbLeftWheel_.getSelected(), Joystick.Input.LEFT_WHEEL);
setWheel(cmbRightWheel_.getSelected(), Joystick.Input.RIGHT_WHEEL);
}

private void createUserInterface() {
final JLabel lblJoystick = new JLabel("Joystick:");
final JLabel lblLeftWheel = new JLabel("Left Wheel:");
Expand All @@ -96,9 +107,9 @@ private void createUserInterface() {
"Sample Height"
};

cmbJoystick_ = new ComboBox<>(joystickLabels, "None", 100, 24);
cmbLeftWheel_ = new ComboBox<>(wheelLabels, "None", 100, 24);
cmbRightWheel_ = new ComboBox<>(wheelLabels, "None", 100, 24);
cmbJoystick_ = new ComboBox<>(joystickLabels, previousJoystick_, 100, 24);
cmbLeftWheel_ = new ComboBox<>(wheelLabels, previousLeftWheel_, 100, 24);
cmbRightWheel_ = new ComboBox<>(wheelLabels, previousRightWheel_, 100, 24);

add(lblJoystick, "");
add(cmbJoystick_, "wrap");
Expand All @@ -113,80 +124,70 @@ private void createEventHandlers() {
// select joystick input
cmbJoystick_.registerListener(() -> {
final String selected = cmbJoystick_.getSelected();
model_.pluginSettings().joystickPanel().joystick(selected);
methods_.get(previousJoystick_).run(); // disable the previous device
switch (selected) {
case "None":
return; // early exit => do nothing
case "Scanner":
final ASIScanner scanner = model_.devices().device("IllumSlice");
scanner.js().inputX(Joystick.Input.JOYSTICK_X);
scanner.js().inputY(Joystick.Input.JOYSTICK_Y);
break;
case "XYStage":
final ASIXYStage xyStage = model_.devices().device("SampleXY");
xyStage.js().enabled(true);
break;
default:
break;
}
// track the previous device to disable later
previousJoystick_ = selected;
setJoystick(selected);
previousJoystick_ = selected; // track the previous device to disable later
});

// select left wheel input
cmbLeftWheel_.registerListener(() -> {
final String selected = cmbLeftWheel_.getSelected();
model_.pluginSettings().joystickPanel().leftWheel(selected);
methods_.get(previousLeftWheel_).run(); // disable the previous device
switch (selected) {
case "Imaging Piezo":
final ASIPiezo piezo = model_.devices().device("ImagingFocus");
piezo.js().input(Joystick.Input.LEFT_WHEEL);
break;
case "Imaging Slice":
final ASIScanner scanner = model_.devices().device("IllumSlice");
scanner.js().inputX(Joystick.Input.LEFT_WHEEL);
break;
case "Light Sheet Tilt":
final ASIZStage stage = model_.devices().device("IllumAngle");
stage.js().input(Joystick.Input.LEFT_WHEEL);
break;
case "Sample Height":
final ASIZStage zStage = model_.devices().device("SampleZ");
zStage.js().input(Joystick.Input.LEFT_WHEEL);
break;
default:
break;
}
// track the previous device to disable later
previousLeftWheel_ = selected;
setWheel(selected, Joystick.Input.LEFT_WHEEL);
previousLeftWheel_ = selected; // track the previous device to disable later
});

// select right wheel input
cmbRightWheel_.registerListener(() -> {
final String selected = cmbRightWheel_.getSelected();
model_.pluginSettings().joystickPanel().rightWheel(selected);
methods_.get(previousRightWheel_).run(); // disable the previous device
switch (selected) {
case "Imaging Piezo":
final ASIPiezo piezo = model_.devices().device("ImagingFocus");
piezo.js().input(Joystick.Input.RIGHT_WHEEL);
break;
case "Imaging Slice":
final ASIScanner scanner = model_.devices().device("IllumSlice");
scanner.js().inputX(Joystick.Input.RIGHT_WHEEL);
break;
case "Light Sheet Tilt":
final ASIZStage stage = model_.devices().device("IllumAngle");
stage.js().input(Joystick.Input.RIGHT_WHEEL);
break;
case "Sample Height":
final ASIZStage zStage = model_.devices().device("SampleZ");
zStage.js().input(Joystick.Input.RIGHT_WHEEL);
break;
default:
break;
}
// track the previous device to disable later
previousRightWheel_ = selected;
setWheel(selected, Joystick.Input.RIGHT_WHEEL);
previousRightWheel_ = selected; // track the previous device to disable later
});
}

private void setJoystick(final String selected) {
switch (selected) {
case "None":
return; // early exit => do nothing
case "Scanner":
final ASIScanner scanner = model_.devices().device("IllumSlice");
scanner.js().inputX(Joystick.Input.JOYSTICK_X);
scanner.js().inputY(Joystick.Input.JOYSTICK_Y);
break;
case "XYStage":
final ASIXYStage xyStage = model_.devices().device("SampleXY");
xyStage.js().enabled(true);
break;
default:
break;
}
}

private void setWheel(final String selected, final Joystick.Input target) {
switch (selected) {
case "Imaging Piezo":
final ASIPiezo piezo = model_.devices().device("ImagingFocus");
piezo.js().input(target);
break;
case "Imaging Slice":
final ASIScanner scanner = model_.devices().device("IllumSlice");
scanner.js().inputY(target);
break;
case "Light Sheet Tilt":
final ASIZStage stage = model_.devices().device("IllumAngle");
stage.js().input(target);
break;
case "Sample Height":
final ASIZStage zStage = model_.devices().device("SampleZ");
zStage.js().input(target);
break;
default:
break;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -335,21 +335,78 @@ public String[] imagingCameraNames() {
}

public CameraBase[] imagingCameras() {
String[] cameraNames;
ArrayList<String> names = new ArrayList<>();
final List<String> names = new ArrayList<>();
final CameraData[] cameras = model_.acquisitions().settings().imagingCameraOrder();
for (CameraData camera : cameras) {
if (camera.isActive()) {
names.add(camera.name());
}
}
cameraNames = names.toArray(String[]::new);
final String[] cameraNames = names.toArray(String[]::new);
return Arrays.stream(cameraNames)
.map(name -> (CameraBase)deviceMap_.get(name))
.filter(Objects::nonNull)
.toArray(CameraBase[]::new);
}

/**
* Returns {@code true} if all cameras in the settings are valid.
* This is used to detect changes in pre-init properties.
*
* @return {@code true} if the cameras are valid
*/
public boolean validateCameras() {
// cameras in settings
final CameraData[] cameras = model_.acquisitions().settings().imagingCameraOrder();

// check for no cameras
if (cameras.length == 0) {
final String message = "No cameras found in the settings.";
model_.studio().logs().logError(message);
if (DialogUtils.showYesNoDialog(null, "No Imaging Cameras",
message + "\nWould you like to use the default imaging camera order?")) {
useDefaultImagingCameraOrder();
return true;
} else {
model_.setErrorText(message);
return false;
}
}

// valid camera names
final List<String> validNames = Arrays.asList(imagingCameraNames());

// check for camera name mismatches
for (CameraData camera : cameras) {
if (!validNames.contains(camera.name())) {
final String message = "Camera in settings not found in hardware: " + camera.name()
+ ", consider creating a new user profile if the pre-init properties changed.";
model_.studio().logs().logError(message);
model_.setErrorText(message);
return false;
}
}

return true;
}

/**
* Used to create the default imaging camera order.
*/
public void useDefaultImagingCameraOrder() {
final List<CameraData> cameras = new ArrayList<>();
final String[] cameraNames = imagingCameraNames();
for (String name : cameraNames) {
// Note: there is no ui control to change the active state of the
// camera when there is only 1 camera, so make sure it's active.
cameras.add(new CameraData(name, cameraNames.length == 1));
}
// update settings with default camera order
model_.acquisitions().settingsBuilder()
.imagingCameraOrder(cameras.toArray(new CameraData[0]));
model_.acquisitions().updateAcquisitionSettings();
}

public DeviceAdapter adapter() {
return (DeviceAdapter)deviceMap_.get("LightSheetDeviceManager");
}
Expand Down
Loading
Loading