From 21fd6976bc4ac1358cb9ccdd8be719318e25a0d8 Mon Sep 17 00:00:00 2001 From: sfop Date: Fri, 13 Jan 2017 14:47:16 +0100 Subject: [PATCH] Startup --- devices/CurrentCamera.properties | 15 +- plugins/ScreenPanel.form | 100 +- plugins/ScreenPanel.java | 4673 +++++++++++++++--------------- 3 files changed, 2478 insertions(+), 2310 deletions(-) diff --git a/devices/CurrentCamera.properties b/devices/CurrentCamera.properties index 52c45d2..5a44361 100644 --- a/devices/CurrentCamera.properties +++ b/devices/CurrentCamera.properties @@ -1,12 +1,12 @@ -#Tue Jan 10 08:32:53 CET 2017 +#Fri Jan 13 14:44:05 CET 2017 colormap=Temperature colormapAutomatic=true colormapMax=0.0 colormapMin=0.0 flipHorizontally=false -flipVertically=true +flipVertically=false grayscale=false -imageHeight=1628 +imageHeight=1024 imageWidth=1280 invert=false rescaleFactor=1.0 @@ -18,9 +18,10 @@ roiY=0 rotation=0.0 rotationCrop=false scale=1.0 -spatialCalOffsetX=-630.0 -spatialCalOffsetY=-612.0 -spatialCalScaleX=-26.761819803746654 -spatialCalScaleY=-26.595744680851062 +serverURL=localhost\:8080 +spatialCalOffsetX=NaN +spatialCalOffsetY=NaN +spatialCalScaleX=NaN +spatialCalScaleY=NaN spatialCalUnits=mm transpose=false diff --git a/plugins/ScreenPanel.form b/plugins/ScreenPanel.form index 1ebacf3..56c6a62 100644 --- a/plugins/ScreenPanel.form +++ b/plugins/ScreenPanel.form @@ -135,6 +135,7 @@ + @@ -280,6 +281,7 @@ + @@ -290,15 +292,17 @@ - + - + - + + + - + - + @@ -343,12 +347,12 @@ - + - + @@ -477,12 +481,12 @@ - + - + @@ -704,7 +708,7 @@ - + @@ -754,7 +758,7 @@ - + @@ -782,6 +786,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/ScreenPanel.java b/plugins/ScreenPanel.java index d464d68..c822d7f 100644 --- a/plugins/ScreenPanel.java +++ b/plugins/ScreenPanel.java @@ -1,2292 +1,2381 @@ -/* - * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. - */ - -import ch.psi.pshell.core.Context; -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import javax.swing.DefaultComboBoxModel; -import ch.psi.pshell.ui.Panel; -import ch.psi.pshell.imaging.ImageListener; -import ch.psi.utils.State; -import ch.psi.utils.IO; -import ch.psi.utils.Chrono; -import ch.psi.utils.swing.SwingUtils; -import ch.psi.utils.swing.TextEditor; -import ch.psi.pshell.epics.PsiCamera; -import ch.psi.pshell.epics.Camtool; -import ch.psi.pshell.core.JsonSerializer; -import ch.psi.pshell.device.Device; -import ch.psi.pshell.device.DeviceAdapter; -import ch.psi.pshell.epics.ArraySource; -import ch.psi.pshell.epics.ChannelDouble; -import ch.psi.pshell.epics.ChannelDoubleArray; -import ch.psi.pshell.epics.ChannelInteger; -import ch.psi.pshell.epics.ChannelIntegerArray; -import ch.psi.pshell.epics.DiscretePositioner; -import ch.psi.pshell.epics.Epics; -import ch.psi.pshell.imaging.Colormap; -import ch.psi.pshell.imaging.ColormapSource; -import ch.psi.pshell.imaging.ColormapSource.ColormapSourceConfig; -import ch.psi.pshell.ui.App; -import ch.psi.pshell.imaging.Data; -import ch.psi.pshell.imaging.Histogram; -import ch.psi.pshell.imaging.Overlay; -import ch.psi.pshell.imaging.Overlays; -import ch.psi.pshell.imaging.Overlays.Text; -import ch.psi.pshell.imaging.Pen; -import ch.psi.pshell.imaging.PointDouble; -import ch.psi.pshell.imaging.Renderer; -import ch.psi.pshell.imaging.RendererListener; -import ch.psi.pshell.imaging.RendererMode; -import ch.psi.pshell.imaging.Source; -import ch.psi.pshell.scripting.InterpreterResult; -import ch.psi.pshell.scripting.ScriptManager; -import ch.psi.pshell.swing.ValueSelection; -import ch.psi.pshell.swing.ValueSelection.ValueSelectionListener; -import ch.psi.utils.Arr; -import ch.psi.utils.ArrayProperties; -import ch.psi.utils.Convert; -import ch.psi.utils.Str; -import ch.psi.utils.swing.Editor.EditorDialog; -import ch.psi.utils.swing.MainFrame; -import ch.psi.utils.swing.SwingUtils.OptionResult; -import ch.psi.utils.swing.SwingUtils.OptionType; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.image.BufferedImage; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.JDialog; -import javax.swing.JMenuItem; -import javax.swing.SwingUtilities; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import org.apache.commons.math3.analysis.function.Gaussian; -import org.apache.commons.math3.fitting.GaussianCurveFitter; -import org.apache.commons.math3.fitting.WeightedObservedPoint; -import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; - -/** - * - */ -public class ScreenPanel extends Panel { - boolean useCamtoolStats = true; - final String configFolder = "/afs/psi.ch/intranet/SF/Applications/config/camtool"; - File[] cameraConfigFiles = new File[0]; - ArraySource camera; - String cameraName; - String cameraConfigJson; - CameraConfig config; - int polling = 1000; - Overlay marker = null; - JDialog histogramDialog; - DiscretePositioner screen; - DiscretePositioner filter; - boolean showFit; - - final ArrayList imageBuffer = new ArrayList(); - int imageBufferLenght = 0; - Text imageBufferOverlay; - - public ScreenPanel() { - initComponents(); - renderer.setPersistenceFile(Paths.get(getContext().getSetup().getContextPath(), "Renderer_Cameras.bin")); - setPersistedComponents(new Component[]{buttonCamtool, buttonDirect}); - comboCameras.setEnabled(false); - if (App.hasArgument("poll")) { - try { - polling = Integer.valueOf(App.getArgumentValue("poll")); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - if (App.hasArgument("zoom")) { - try { - renderer.setDefaultZoom(Double.valueOf(App.getArgumentValue("zoom"))); - renderer.resetZoom(); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - if (App.hasArgument("buf")) { - try { - imageBufferLenght = Integer.valueOf(App.getArgumentValue("buf")); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - if (App.hasArgument("calc")) { - useCamtoolStats = false; - } - - renderer.setProfileNormalized(true); - renderer.setShowProfileLimits(false); - - JMenuItem menuSetROI = new JMenuItem("Set ROI..."); - menuSetROI.addActionListener((ActionEvent e) -> { - renderer.abortSelection(); - if (camera instanceof Camtool) { - final Overlays.Rect selection = new Overlays.Rect(renderer.getPenMovingOverlay()); - renderer.addListener(new RendererListener() { - @Override - public void onSelectionFinished(Renderer renderer, Overlay overlay) { - try { - Rectangle roi = overlay.isFixed() ? renderer.toImageCoord(overlay.getBounds()) : overlay.getBounds(); - if (((Camtool)camera).roiEnabled.read() >0){ - int[] cur = ((Camtool)camera).roi.read(); - ((Camtool)camera).roi.writeAsync(new int[]{roi.x + cur[0] , roi.y + cur[1], roi.width, roi.height}); - } - else { - ((Camtool)camera).roi.writeAsync(new int[]{roi.x, roi.y, roi.width, roi.height}); - ((Camtool)camera).roiEnabled.writeAsync(1); - } - } catch (Exception ex) { - } finally { - renderer.removeListener(this); - } - } - - @Override - public void onSelectionAborted(Renderer renderer, Overlay overlay) { - renderer.removeListener(this); - } - }); - selection.setFixed(true); - renderer.startSelection(selection); - } - }); - - JMenuItem menuResetROI = new JMenuItem("Reset ROI"); - menuResetROI.addActionListener((ActionEvent e) -> { - renderer.abortSelection(); - if (camera instanceof Camtool) { - ((Camtool)camera).roiEnabled.writeAsync(0); - } - }); - renderer.getPopupMenu().addSeparator(); - renderer.getPopupMenu().add(menuSetROI); - renderer.getPopupMenu().add(menuResetROI); - renderer.getPopupMenu().addPopupMenuListener(new PopupMenuListener() { - - @Override - public void popupMenuWillBecomeVisible(PopupMenuEvent e) { - menuResetROI.setEnabled (camera instanceof Camtool); - menuSetROI.setEnabled (camera instanceof Camtool); - } - - @Override - public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { - } - - @Override - public void popupMenuCanceled(PopupMenuEvent e) { - } - }); - renderer.getPopupMenu().setVisible(false); - - showFit = buttonFit.isSelected(); - - if (imageBufferLenght > 1) { - renderer.addListener(new RendererListener() { - @Override - public void onImage(Renderer renderer, Object origin, BufferedImage image, Data data) { - if (data != null) { - synchronized (imageBuffer) { - imageBuffer.add(data); - if (imageBuffer.size() > imageBufferLenght) { - imageBuffer.remove(0); - } - } - } - } - }); - } - pauseSelection.setVisible(false); - pauseSelection.setMinValue(1); - pauseSelection.addListener(new ValueSelectionListener() { - @Override - public void onValueChanged(ValueSelection origin, double value, boolean editing) { - if (editing && (value >= 1) && (value <= imageBuffer.size())) { - updatePause(); - } - } - }); - imageBufferOverlay = new Text(renderer.getPenErrorText(), "", new Font("Verdana", Font.PLAIN, 12), new Point(-100, 20)); - imageBufferOverlay.setFixed(true); - imageBufferOverlay.setAnchor(Overlay.ANCHOR_VIEWPORT_TOP_RIGHT); - if (MainFrame.isDark()) { - textState.setEnabled(true); - } - } - - @Override - public void onStart() { - super.onStart(); - if (App.hasArgument("ct")) { - boolean direct = App.getArgumentValue("ct").equals("0") || App.getArgumentValue("ct").equalsIgnoreCase("false"); - buttonCamtool.setSelected(!direct); - buttonDirect.setSelected(direct); - } - } - - //Overridable callbacks - @Override - public void onInitialize(int runCount) { - comboCameras.setEnabled(false); - if (App.hasArgument("s")) { - renderer.setDevice((Source) getDevice("image")); - renderer.setAutoScroll(true); - ((Source) getDevice("image")).addListener(new ImageListener() { - @Override - public void onImage(Object o, BufferedImage bi, Data data) { - manageFit(bi, data); - } - - @Override - public void onError(Object o, Exception excptn) { - } - } - ); - - } else { - cameraConfigFiles = IO.listFiles(configFolder, new String[]{"json"}); - Arrays.sort(cameraConfigFiles, (a, b) -> a.compareTo(b)); - DefaultComboBoxModel model = new DefaultComboBoxModel(); - for (File file : cameraConfigFiles) { - String prefix = IO.getPrefix(file); - if (!prefix.startsWith("#")) { - model.addElement(prefix); - } - } - if (App.hasArgument("cam")) { - String cam = App.getArgumentValue("cam"); - if (model.getIndexOf(cam)<0){ - model.addElement(cam); - } - } - - comboCameras.setModel(model); - comboCameras.setEnabled(true); - comboCameras.setSelectedItem(-1); - if (model.getSize() > 0) { - try { - if (App.hasArgument("cam")) { - comboCameras.setSelectedItem(App.getArgumentValue("cam")); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - } - } - startTimer(1000); - } - - void manageFit(BufferedImage bi, Data data) { - Overlay[] fo = ((bi == null) || (!showFit)) ? null : getFitOverlays(data); - renderer.updateOverlays(fo, fitOv); - fitOv = fo; - } - - @Override - public void onStateChange(State state, State former) { - - } - - @Override - public void onExecutedFile(String fileName, Object result) { - } - - //Callback to perform update - in event thread - @Override - protected void doUpdate() { - } - - public static class CameraConfig { - - public HashMap kwargs; - public ArrayList args; - public ArrayList links; - public String type; - public HashMap state; - public CameraConfig image_source; - public HashMap subcomponents; - - public ArrayList getCalibration() { - return (ArrayList) state.get("calibration"); - } - - public double getCalOffsetX() { - ArrayList calibration = getCalibration(); - double ret = -(calibration.get(0) + calibration.get(2)) / 2; - return ret; - } - - public double getCalOffsetY() { - ArrayList calibration = getCalibration(); - double ret = -(calibration.get(1) + calibration.get(3)) / 2; - return ret; - } - - public double getScaleX() { - ArrayList calibration = getCalibration(); - double width = Math.abs(calibration.get(2) - calibration.get(0)); - return getCalibrationWidth() / width; - } - - public double getScaleY() { - ArrayList calibration = getCalibration(); - double height = Math.abs(calibration.get(3) - calibration.get(1)); - return getCalibrationHeight() / height; - } - - public Double getCalibrationHeight() { - return (Double) state.get("calibration_height"); - } - - public Double getCalibrationWidth() { - return (Double) state.get("calibration_width"); - } - - public Double getCalibrationHorizontalAngle() { - return (Double) state.get("calibration_horizontal_angle"); - } - - public Double getCalibrationVerticalAngle() { - return (Double) state.get("calibration_vertical_angle"); - } - - public Boolean getMirrorX() { - return (Boolean) state.get("mirror_x"); - } - - public Boolean getMirrorY() { - return (Boolean) state.get("mirror_y"); - } - - public Integer getRotate() { - return (Integer) state.get("rotate"); - } - - public ArrayList getOrigin() { - return (ArrayList) state.get("origin"); - } - - public ArrayList getRoi() { - return (ArrayList) state.get("roi"); - } - - public Boolean getRoiEnable() { - if ((state.get("roi_enable") == null) || (state.get("roi") == null)) { - return false; - } - return (Boolean) state.get("roi_enable"); - } - - public ArrayList getUnitSize() { - return (ArrayList) state.get("unit_size"); - } - - public Integer getRun() { - return (Integer) state.get("run"); - } - } - - Overlay[] fitOv; - - void setCamera(String cameraName) throws IOException, InterruptedException { - System.out.println("Setting camera: " + cameraName + " [" + (buttonCamtool.isSelected() ? "camtool" : "direct") + "]"); - if (camera != null) { - camera.close(); - camera = null; - renderer.setDevice(null); - renderer.setShowReticle(false); - renderer.removeOverlays(fitOv); - renderer.clear(); - renderer.resetZoom(); - } - if (screen != null) { - screen.close(); - screen = null; - } - if (filter != null) { - filter.close(); - filter = null; - } - try { - Path configFile = Paths.get(configFolder, cameraName + ".json"); - cameraConfigJson = configFile.toFile().exists() ? new String(Files.readAllBytes(configFile)) : null; - this.cameraName = cameraName; - try { - if (buttonCamtool.isSelected()) { - camera = new Camtool("CurrentCamera", cameraName, false); - camera.getConfig().flipHorizontally = false; - camera.getConfig().flipVertically = false; - camera.getConfig().rotation = 0.0; - camera.getConfig().roiX = 0; - camera.getConfig().roiY = 0; - camera.getConfig().roiWidth = -1; - camera.getConfig().roiHeight = -1; - } else { - camera = new PsiCamera("CurrentCamera", cameraName); - config = (CameraConfig) JsonSerializer.decode(cameraConfigJson, CameraConfig.class); - camera.getConfig().flipHorizontally = config.getMirrorX(); - camera.getConfig().flipVertically = config.getMirrorY(); - //camera.getConfig().rotation = config.getRotate(); - //camera.getConfig().rotationCrop = true; - switch (config.getRotate()){ - case 1: camera.getConfig().rotation = 270; break; - case 2: camera.getConfig().rotation = 180; break; - case 3: camera.getConfig().rotation = 90; break; - } - camera.getConfig().rotationCrop = false; - camera.getConfig().roiX = config.getRoiEnable() ? config.getRoi().get(0) : 0; - camera.getConfig().roiY = config.getRoiEnable() ? config.getRoi().get(1) : 0; - camera.getConfig().roiWidth = config.getRoiEnable() ? config.getRoi().get(2) : -1; - camera.getConfig().roiHeight = config.getRoiEnable() ? config.getRoi().get(3) : -1; - try { - camera.getConfig().spatialCalOffsetX = config.getCalOffsetX(); - camera.getConfig().spatialCalOffsetY = config.getCalOffsetY(); - camera.getConfig().spatialCalScaleX = -config.getScaleX(); - camera.getConfig().spatialCalScaleY = -config.getScaleY(); - } catch (Exception ex) { - camera.getConfig().spatialCalOffsetX = Double.NaN; - camera.getConfig().spatialCalOffsetY = Double.NaN; - camera.getConfig().spatialCalScaleX = Double.NaN; - camera.getConfig().spatialCalScaleY = Double.NaN; - } - } - } catch (Exception ex) { - config = null; - showException(ex); - } - camera.initialize(); - if (camera instanceof Camtool) { - try { - camera.getConfig().spatialCalOffsetX = ((Camtool) camera).calOffX.read(); - camera.getConfig().spatialCalOffsetY = ((Camtool) camera).calOffY.read(); - double[] origin = ((Camtool) camera).origin.read(); - //TODO: not working on camtool - //camera.getConfig().spatialCalScaleX = -origin[0]; - //camera.getConfig().spatialCalScaleY = -origin[1]; - camera.getConfig().spatialCalScaleX = ((Camtool) camera).calScaleX.read(); - camera.getConfig().spatialCalScaleY = ((Camtool) camera).calScaleY.read(); - } catch (Exception ex) { - System.err.println(ex.getMessage()); - camera.getConfig().spatialCalOffsetX = 0.0; - camera.getConfig().spatialCalOffsetY = 0.0; - camera.getConfig().spatialCalScaleX = 1.0; - camera.getConfig().spatialCalScaleY = 1.0; - } - ((Camtool)camera).shape.addListener(new DeviceAdapter(){ - @Override - public void onValueChanged(Device device, Object value, Object former) { - if ((camera instanceof Camtool) - &&(device==((Camtool)camera).shape) - && (camera.getState().isInitialized()) - && (camera.getImage()!=null)) { - try { - if ((value != null) && (value.getClass() == int[].class)) { - final int[] s = (int[]) value; - if ((s.length > 1) && (s[0] * s[1] > 0) && - ((s[0] != camera.getConfig().imageHeight) || (s[1] != camera.getConfig().imageWidth))) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - comboCamerasActionPerformed(null); - } - }); - } - } - } catch (Exception ex) { - System.err.println(ex); - } - } - } - - }); - ((Camtool)camera).shape.setMonitored(true); - } - buttonReticle.setEnabled(camera.getConfig().isCalibrated()); - buttonGrabBackground.setEnabled(camera instanceof Camtool); - camera.getConfig().save(); - - if (polling <= 0) { - camera.setMonitored(true); - } else { - camera.setPolling(-polling); - } - renderer.setDevice(camera); - renderer.setAutoScroll(true); - renderer.setMarker(marker); - firstImage = true; - - camera.addListener(new ImageListener() { - @Override - public void onImage(Object o, BufferedImage bi, Data data) { - if (bi != null) { - if (firstImage) { - if ((renderer.getMode() == RendererMode.Zoom) || (renderer.getMode() == RendererMode.Fixed)) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - centralizeRenderer(); - } - }); - } - firstImage = false; - } - renderer.setProfileSize(Math.min(bi.getWidth(), bi.getHeight())); - } - if ((bi == null) || (!showFit)) { - renderer.removeOverlays(fitOv); - fitOv = null; - } else { - if (!renderer.isPaused()) { - Overlay[] fo = getFitOverlays(data); - renderer.updateOverlays(fo, fitOv); - fitOv = fo; - } - } - } - - @Override - public void onError(Object o, Exception excptn) { - } - }); - } catch (Exception ex) { - if (renderer.getDevice() == null) { - renderer.setZoom(1.0); - renderer.setMode(RendererMode.Zoom); - renderer.addOverlay(new Text(renderer.getPenErrorText(), ex.toString(), new Font("Verdana", Font.PLAIN, 12), new Point(20, 20))); - } - } finally { - checkReticle(); - onTimer(); - } - try { - screen = new DiscretePositioner("CurrentScreen", cameraName + ":SET_SCREEN1_POS", cameraName + ":GET_SCREEN1_POS"); - screen.initialize(); - DefaultComboBoxModel model = new DefaultComboBoxModel(); - for (String pos : screen.getPositions()) { - model.addElement(pos); - } - comboScreen.setModel(model); - comboScreen.setSelectedItem(screen.read()); - - } catch (Exception ex) { - comboScreen.setModel(new DefaultComboBoxModel()); - System.err.println(ex.getMessage()); - screen = null; - } - comboScreen.setEnabled(screen != null); - valueScreen.setDevice(screen); - - try { - filter = new DiscretePositioner("CurrentFilter", cameraName + ":SET_FILTER", cameraName + ":GET_FILTER"); - filter.initialize(); - DefaultComboBoxModel model = new DefaultComboBoxModel(); - for (String pos : filter.getPositions()) { - model.addElement(pos); - } - comboFilter.setModel(model); - comboFilter.setSelectedItem(filter.read()); - } catch (Exception ex) { - comboFilter.setModel(new DefaultComboBoxModel()); - System.err.println(ex.getMessage()); - filter = null; - } - comboFilter.setEnabled(filter != null); - valueFilter.setDevice(filter); - - } - - volatile Boolean firstImage; - - void checkReticle() { - if ((renderer.getDevice() != null) && (camera != null) && (camera.getConfig().isCalibrated()) && buttonReticle.isSelected()) { - renderer.setCalibration(camera.getCalibration()); - renderer.configureReticle(new Dimension(800, 800), 200); - renderer.setShowReticle(true); - } else { - renderer.setCalibration(null); - renderer.setShowReticle(false); - } - renderer.refresh(); - } - - void checkMarker() { - if (camera != null) { - if (buttonMarker.isSelected()) { - Dimension d = renderer.getImageSize(); - Point p = (d == null) ? new Point(renderer.getWidth() / 2, renderer.getHeight() / 2) : new Point(d.width / 2, d.height / 2); - Overlay ov = null; - marker = new Overlays.Crosshairs(renderer.getPenMarker(), p, new Dimension(100, 100)); - marker.setMovable(true); - marker.setPassive(false); - } else { - marker = null; - } - renderer.setMarker(marker); - } - } - - void updateZoom() { - try { - buttonZoomStretch.setSelected(renderer.getMode() == RendererMode.Stretch); - buttonZoomFit.setSelected(renderer.getMode() == RendererMode.Fit); - if (renderer.getMode() == RendererMode.Fixed) { - buttonZoomNormal.setSelected(true); - } else if (renderer.getMode() == RendererMode.Zoom) { - if (renderer.getZoom() == 1) { - buttonZoomNormal.setSelected(true); - } else if (renderer.getZoom() == 0.5) { - buttonZoom05.setSelected(true); - } else if (renderer.getZoom() == 0.25) { - buttonZoom025.setSelected(true); - } else if (renderer.getZoom() == 2.0) { - buttonZoom2.setSelected(true); - } else { - buttonGroup1.clearSelection(); - } - } - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - void updateColormap() { - try { - if ((camera != null) && (camera instanceof ColormapSource)) { - ColormapSourceConfig config = ((ColormapSource) camera).getConfig(); - switch (config.colormap) { - case Grayscale: - buttonGrayscale.setSelected(true); - break; - case Rainbow: - buttonRainbow.setSelected(true); - break; - case Temperature: - buttonTemperature.setSelected(true); - break; - default: - buttonGroup2.clearSelection(); - - } - if (config.isDefaultColormap()) { - buttonFullRange.setSelected(true); - } else if (config.colormapAutomatic) { - buttonAutomatic.setSelected(true); - } else { - buttonManual.setSelected(true); - } - - spinnerMin.setEnabled(buttonManual.isSelected()); - spinnerMax.setEnabled(buttonManual.isSelected()); - spinnerMin.setValue(Double.isNaN(config.colormapMin) ? 0 : Math.min(Math.max((int) config.colormapMin, 0), 65535)); - spinnerMax.setValue(Double.isNaN(config.colormapMax) ? 0 : Math.min(Math.max((int) config.colormapMax, 0), 65535)); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - @Override - protected void onTimer() { - for (Device dev : new Device[]{screen, filter}) { - if (dev != null) { - dev.request(); - } - } - - textState.setText((camera == null) ? "" : camera.getState().toString()); - buttonConfig.setEnabled(camera != null); - if (App.hasArgument("s")) { - try { - ((Source) getDevice("image")).initialize(); - } catch (IOException ex) { - Logger.getLogger(ScreenPanel.class.getName()).log(Level.SEVERE, null, ex); - } catch (InterruptedException ex) { - Logger.getLogger(ScreenPanel.class.getName()).log(Level.SEVERE, null, ex); - } - } - if (renderer.isPaused() != buttonPause.isSelected()) { - buttonPause.setSelected(renderer.isPaused()); - buttonPauseActionPerformed(null); - } - if (renderer.getShowReticle() != buttonReticle.isSelected()) { - //buttonReticle.setSelected(renderer.getShowReticle()); - } - if ((renderer.getMarker() == null) && buttonMarker.isSelected()) { - buttonMarker.setSelected(false); - } - updateZoom(); - updateColormap(); - buttonSave.setSelected(renderer.isSnapshotDialogVisible()); - checkHistogram.setSelected((histogramDialog != null) && (histogramDialog.isShowing())); - } - - Pen penFit = new Pen(new Color(192, 105, 0), 1); - Pen penCross = new Pen(new Color(192, 105, 0), 1); - - Overlay[] getFitOverlays(Data data) { - Overlays.Polyline hgaussian = null; - Overlays.Polyline vgaussian = null; - Overlays.Polyline hprofile = null; - Overlays.Polyline vprofile = null; - Double xMean = null, xSigma = null, xNorm = null; - Double yMean = null, ySigma = null, yNorm = null; - Double xCom=null, yCom=null; - if (data != null) { - int profileSize = renderer.getProfileSize(); - if ((useCamtoolStats) &&(camera instanceof Camtool)){ - try{ - profileSize/=4; - double[] pX = ((Camtool)camera).profileX.read(); - if (pX!=null){ - int[] x = Arr.indexesInt(pX.length); - int[] y = new int[pX.length]; - int[] p = new int[pX.length]; - double[] gX = ((Camtool)camera).gaussX.read(); - - List l = Arrays.asList((Double[]) Convert.toWrapperArray(pX)); - Double min = Collections.min(l); - Double max = Collections.max(l); - double minPlot = min; - double rangePlot = max- min; - - for (int i = 0; i < x.length; i++) { - if (gX!=null){ - y[i] = (int) (data.getHeight() - 1 - (((gX[i] - minPlot) / rangePlot) * profileSize)); - } - p[i] = (int) (data.getHeight() - 1 - (((pX[i] - minPlot) / rangePlot) * profileSize)); - } - vgaussian = new Overlays.Polyline(penFit, x, y); - vprofile = new Overlays.Polyline(renderer.getPenProfile(), x, p); - } - - double[] pY = ((Camtool)camera).profileY.read(); - if (pX!=null){ - double[] gY = ((Camtool)camera).gaussY.read(); - int[] y = Arr.indexesInt(pY.length); - int[] x = new int[pY.length]; - int[] p = new int[pY.length]; - - List l = Arrays.asList((Double[]) Convert.toWrapperArray(pY)); - Double min = Collections.min(l); - Double max = Collections.max(l); - double minPlot = min; - double rangePlot = max- min; - - for (int i = 0; i < x.length; i++) { - if (gY!=null){ - x[i] = (int) (((gY[i] - minPlot) / rangePlot) * profileSize); - } - p[i] = (int) (((pY[i] - minPlot) / rangePlot) * profileSize); - } - hgaussian = new Overlays.Polyline(penFit, x, y); - hprofile = new Overlays.Polyline(renderer.getPenProfile(), p, y); - } - - xMean = ((Camtool)camera).gaussCenterX.read(); - yMean = ((Camtool)camera).gaussCenterY.read(); - xSigma = ((Camtool)camera).gaussStdDivX.read(); - ySigma = ((Camtool)camera).gaussStdDivY.read(); - xCom = ((Camtool)camera).posX.read(); - yCom = ((Camtool)camera).posY.read(); - } catch (Exception ex){ - System.err.println(ex.getMessage()); - return null; - } - }else { - ArrayProperties properties = data.getProperties(); - double maxPlot = properties.max; - double minPlot = properties.min; - double rangePlot = maxPlot - minPlot; - - if (rangePlot <= 0) { - return null; - } - try { - double[] sum = (double[]) Convert.toDouble(data.integrateVertically(true)); - double[] saux = new double[sum.length]; - int[] p = new int[sum.length]; - xCom = getCom(sum); - int[] x = Arr.indexesInt(sum.length); - DescriptiveStatistics stats = new DescriptiveStatistics(sum); - double min = stats.getMin(); - for (int i = 0; i < sum.length; i++) { - saux[i] = sum[i] - min; - } - - double[] gaussian = fitGaussian(saux, x); - if (gaussian != null) { - if ((gaussian[2] < sum.length * 0.45) - && (gaussian[2] > 2) - && (gaussian[0] > min * 0.03)) { - xNorm = gaussian[0]; - xMean = gaussian[1]; - xSigma = gaussian[2]; - double[] fit = getFitFunction(gaussian, x); - int[] y = new int[x.length]; - for (int i = 0; i < x.length; i++) { - y[i] = (int) (data.getHeight() - 1 - ((((fit[i] + min) / data.getHeight() - minPlot) / rangePlot) * profileSize)); - p[i] = (int) (data.getHeight() - 1 - (((sum[i] / data.getHeight() - minPlot) / rangePlot) * profileSize)); - } - vgaussian = new Overlays.Polyline(penFit, x, y); - vprofile = new Overlays.Polyline(renderer.getPenProfile(), x, p); - } - } - } catch (Exception ex) { - ex.printStackTrace(); - } - - try { - double[] sum = (double[]) Convert.toDouble(data.integrateHorizontally(true)); - double[] saux = new double[sum.length]; - int[] p = new int[sum.length]; - yCom = getCom(sum); - int[] x = Arr.indexesInt(sum.length); - DescriptiveStatistics stats = new DescriptiveStatistics(sum); - double min = stats.getMin(); - for (int i = 0; i < sum.length; i++) { - saux[i] = sum[i] - min; - } - - double[] gaussian = fitGaussian(saux, x); - if (gaussian != null) { - //Only aknowledge beam fully inside the image and peak over 3% of min - if ((gaussian[2] < sum.length * 0.45) - && (gaussian[2] > 2) - && (gaussian[0] > min * 0.03)) { - yNorm = gaussian[0]; - yMean = gaussian[1]; - ySigma = gaussian[2]; - double[] fit = getFitFunction(gaussian, x); - - int[] y = new int[x.length]; - for (int i = 0; i < x.length; i++) { - y[i] = (int) ((((fit[i] + min) / data.getWidth() - minPlot) / rangePlot) * profileSize); - p[i] = (int) (((sum[i] / data.getWidth() - minPlot) / rangePlot) * profileSize); - } - hgaussian = new Overlays.Polyline(penFit, y, x); - hprofile = new Overlays.Polyline(renderer.getPenProfile(), p, x); - } - } - - } catch (Exception ex) { - ex.printStackTrace(); - } - if (renderer.getCalibration() != null) { - if (xSigma!=null) xSigma *= renderer.getCalibration().getScaleX(); - if (ySigma!=null) ySigma *= renderer.getCalibration().getScaleY(); - if (xMean!=null) xMean = data.getX((int) Math.round(xMean)); - if (yMean!=null) yMean = data.getY((int) Math.round(yMean)); - if (xCom!=null) xCom = data.getX((int) Math.round(xCom)); - if (yCom!=null) yCom = data.getY((int) Math.round(yCom)); - } - } - - Overlays.Crosshairs cross = null; - Overlays.Text text = null; - if ((xMean != null) && (yMean != null)) { - text = new Overlays.Text(penFit, - String.format("x: m=%1.3f \u03C3=%1.3f c=%1.3f\ny: m=%1.3f \u03C3=%1.3f c=%1.3f", - xMean, xSigma, xCom, - yMean, ySigma, yCom), - new Font(Font.MONOSPACED, 0, 14), new Point(20, 20)); - text.setFixed(true); - text.setAnchor(Overlay.ANCHOR_VIEWPORT_TOP_LEFT); - - Point center = new Point(xMean.intValue(), yMean.intValue()); - if (renderer.getCalibration() != null) { - center = renderer.getCalibration().convertToImagePosition(new PointDouble(xMean, yMean)); - xSigma /= renderer.getCalibration().getScaleX(); - ySigma /= renderer.getCalibration().getScaleY(); - } - cross = new Overlays.Crosshairs(penCross,center, new Dimension(Math.abs(2 * xSigma.intValue()), 2 * Math.abs(ySigma.intValue()))); - } - return new Overlay[]{hprofile, vprofile, hgaussian, vgaussian, cross, text}; - } - return null; - } - - double getCom(double[] arr){ - if (arr==null) { - return Double.NaN; - } - int index = 0; - double ret = 0; - double total=0; - for (double v: arr){ - ret += (v * index++); - total +=v; - } - if (total==0){ - return Double.NaN; - } - return ret/total; - } - - double[] fitGaussianScript(int[] y, int[] x) { - ScriptManager sm = Context.getInstance().getScriptManager(); - ArrayProperties pY = ArrayProperties.get(y); - sm.setVar("y", y); - sm.setVar("x", x); - InterpreterResult r = sm.eval("r = fit_gaussians(y, x, [" + pY.maxIndex + ",])"); - if (r.exception != null) { - r.exception.printStackTrace(); - } else { - List ret = (List) sm.getVar("r"); - if ((ret != null) && (ret.size() == 1) && (ret.get(0) instanceof List) && (((List) (ret.get(0))).size() == 3)) { - double norm = (Double) ((List) ret.get(0)).get(0); - double mean = (Double) ((List) ret.get(0)).get(1); - double sigma = (Double) ((List) ret.get(0)).get(2); - return new double[]{norm, mean, sigma}; - } - } - return null; - } - - double[] fitGaussian(double[] y, int[] x) { - try { - ArrayProperties pY = ArrayProperties.get(y); - GaussianCurveFitter fitter = GaussianCurveFitter.create().withStartPoint(new double[]{(pY.max - pY.min) / 2, x[pY.maxIndex], 1.0}).withMaxIterations(1000); - ArrayList values = new ArrayList<>(); - for (int i = 0; i < y.length; i++) { - values.add(new WeightedObservedPoint(1.0, x[i], y[i])); - } - return fitter.fit(values); - } catch (Exception ex) { - return null; - } - - } - - double[] getFitFunction(double[] pars, int[] x) { - double[] fit = new double[x.length]; - Gaussian g = new Gaussian(pars[0], pars[1], pars[2]); - for (int i = 0; i < x.length; i++) { - fit[i] = g.value(x[i]); - } - return fit; - } - - public class Camtool extends ArraySource { - - final String prefix; - final String dataPrefix; - final boolean latch; - final Object lock = new Object(); - - final public ChannelInteger channelRun; - final public ChannelInteger channelLatch; - final public ChannelDouble channelTimestamp; - final public ChannelDoubleArray origin; - final public ChannelDouble posX, posY; - final public ChannelDoubleArray profileX, profileY; - final public ChannelIntegerArray shape; - final public ChannelInteger roiEnabled; - final public ChannelIntegerArray roi; - final public ChannelInteger bgEnable, bgCapture, bgCaptureRemain; - final public ChannelDouble calOffX, calOffY, calScaleX, calScaleY; - final public ChannelDoubleArray gaussX, gaussY; - final public ChannelDouble gaussCenterX, gaussCenterY; - final public ChannelDouble gaussStdDivX, gaussStdDivY; - - - public Camtool(String name, String prefix) { - this(name, prefix, false); - } - - public Camtool(String name, String prefix, boolean latch) { - this(name, prefix, false, false); - } - - public Camtool(String name, String prefix, boolean latch, boolean gr) { - super(name, prefix + (latch ? ":latch" : ":pipeline") + ".roi.output"); - this.prefix = prefix + ":"; - this.latch = latch; - dataPrefix = this.prefix + (latch ? "latch" : "pipeline") + "."; - - channelRun = new ChannelInteger(name + " run", this.prefix + "camera.run"); - channelLatch = new ChannelInteger(name + " latch", this.prefix + "latch.capture"); - channelTimestamp = new ChannelDouble(name + " timestamp", dataPrefix + "timestamp"); - channelTimestamp.setMonitored(true); - profileX = new ChannelDoubleArray(name + " profile x", dataPrefix + "profile.x"); - profileY = new ChannelDoubleArray(name + " profile y", dataPrefix + "profile.y"); - shape = new ChannelIntegerArray(name + " shape", dataPrefix + ("roi.output.shape")); - roiEnabled = new ChannelInteger(name + " roi enable", dataPrefix + ("roi.enabled")); - roi = new ChannelIntegerArray(name + " roi", dataPrefix + ("roi.roi")); - origin = new ChannelDoubleArray(name + " origin X", dataPrefix + "roi.origin_out"); - bgEnable = new ChannelInteger(name + " bg enable", this.prefix + "pipeline.bg.enabled"); - bgCapture = new ChannelInteger(name + " bg capture", this.prefix + "pipeline.bg.capture"); - bgCaptureRemain = new ChannelInteger(name + " bg capture remain", this.prefix + "pipeline.bg.capture_remain"); - calOffX = new ChannelDouble(name + " cal off x", this.prefix + "pipeline.egu.eoff_x"); - calOffY = new ChannelDouble(name + " cal off y", this.prefix + "pipeline.egu.eoff_y"); - calScaleX = new ChannelDouble(name + " cal scale x", this.prefix + "pipeline.egu.eslo_x"); - calScaleY = new ChannelDouble(name + " cal scale y", this.prefix + "pipeline.egu.eslo_y"); - - String x_stats = dataPrefix + "x_stats" + (gr ? "_gr": "")+ "."; - String y_stats = dataPrefix + "y_stats" + (gr ? "_gr": "")+ "."; - posX = new ChannelDouble(name + " com x", x_stats + "com_egu"); - posY = new ChannelDouble(name + " com y", y_stats + "com_egu"); - gaussX = new ChannelDoubleArray(name + " gauss x", x_stats+ "gauss"); - gaussY = new ChannelDoubleArray(name + " gauss y", y_stats+ "gauss"); - gaussCenterX = new ChannelDouble(name + "gauss center x", x_stats+ "g_center_egu"); - gaussCenterY = new ChannelDouble(name + "gauss center y", y_stats+ "g_center_egu"); - gaussStdDivX = new ChannelDouble(name + "gauss stddiv x", x_stats+ "g_stddiv_egu"); - gaussStdDivY = new ChannelDouble(name + "gauss stddiv t", y_stats+ "g_stddiv_egu"); - } - - @Override - public void doSetMonitored(boolean value) { - super.doSetMonitored(value); - getDevice().setMonitored(value); - } - - void safeInitialize(Device dev, int retries) throws IOException, InterruptedException { - for (int i = 0; i < retries; i++) { - try { - dev.initialize(); - break; - } catch (IOException ex) { - if (i == (retries-1)) { - throw ex; - } - System.out.println("Failed initializing " + dev.getName() + ". Retrying"); - Thread.sleep(1); - } - } - } - - @Override - protected void doInitialize() throws IOException, InterruptedException { - try { - System.out.println("Started initialization"); - int retries = 5; - safeInitialize(channelTimestamp, retries); - safeInitialize(channelTimestamp, retries); - if (latch) { - start(); - latch(); - } - safeInitialize(channelTimestamp, retries); - safeInitialize(posX, retries); - safeInitialize(posY, retries); - safeInitialize(profileX, retries); - safeInitialize(profileY, retries); - safeInitialize(shape, retries); - safeInitialize(roiEnabled, retries); - safeInitialize(roi, retries); - safeInitialize(origin, retries); - safeInitialize(bgEnable, retries); - safeInitialize(bgCapture, retries); - safeInitialize(bgCaptureRemain, retries); - try { - safeInitialize(calOffX, retries); - safeInitialize(calOffY, retries); - safeInitialize(calScaleX, retries); - safeInitialize(calScaleY, retries); - } catch (Exception ex) { - ex.printStackTrace(); - } - safeInitialize(gaussX, retries); - safeInitialize(gaussY, retries); - safeInitialize(gaussCenterX, retries); - safeInitialize(gaussCenterY, retries); - safeInitialize(gaussStdDivX, retries); - safeInitialize(gaussStdDivY, retries); - - int[] s = shape.read(); - getConfig().imageHeight = s[0]; - getConfig().imageWidth = s[1]; - getConfig().save(); - getDevice().setSize(getConfig().imageHeight * getConfig().imageWidth); - super.doInitialize(); - } catch (InterruptedException ex) { - throw ex; - } catch (Exception ex) { - ex.printStackTrace(); - throw new IOException(ex); - } - } - - @Override - public void doClose() throws IOException { - super.doClose(); - channelRun.close(); - channelLatch.close(); - channelTimestamp.close(); - posX.close(); - posY.close(); - profileX.close(); - profileY.close(); - shape.close(); - roiEnabled.close(); - roi.close(); - origin.close(); - bgEnable.close(); - bgCapture.close(); - bgCaptureRemain.close(); - calOffX.close(); - calOffY.close(); - calScaleX.close(); - calScaleY.close(); - gaussX.close(); - gaussY.close(); - gaussCenterX.close(); - gaussCenterY.close(); - gaussStdDivX.close(); - gaussStdDivY.close(); - gaussX.close(); - gaussY.close(); - gaussCenterX.close(); - gaussCenterY.close(); - gaussStdDivX.close(); - gaussStdDivY.close(); - } - - int numImages = 1; - - public int getNumImages() { - return numImages; - } - - public void setNumImages(int value) { - numImages = value; - } - - double grabTimeout = 3.0; - - public double getGrabTimeout() { - return grabTimeout; - } - - public void setGrabTimeou(double value) { - grabTimeout = value; - } - - public void capture() throws IOException, InterruptedException { - int retries = 3; - while (true) { - try { - double timestamp = channelTimestamp.read(); - if (latch) { - channelLatch.write(1); - } else { - channelRun.write(1); - } - long start = System.currentTimeMillis(); - while (true) { - double val = channelTimestamp.read(); - if (timestamp != val) { - return; - } - if ((System.currentTimeMillis() - start) > grabTimeout) { - throw new IOException("Frame timeout"); - } - Thread.sleep(5); - } - } catch (IOException ex) { - retries--; - if (--retries <= 0) { - throw ex; - } - } - } - } - - public void start() throws IOException, InterruptedException { - channelRun.write(-1); - } - - public void stop() throws IOException, InterruptedException { - channelRun.write(0); - } - - public void grabSingle() throws IOException, InterruptedException { - channelRun.write(1); - } - - public void latch() throws IOException, InterruptedException { - channelLatch.write(1); - } - - public void enableBackground(boolean value) throws IOException, InterruptedException { - bgEnable.write(value ? 1 : 0); - } - - public void captureBackground(int images) throws IOException, InterruptedException { - start(); - bgCapture.write(images); - Thread.sleep(200); - while (bgCaptureRemain.read() > 0) { - Thread.sleep(10); - } - } - } - - - void setHistogramVisible(boolean value) { - if (value) { - if ((histogramDialog == null) || (!histogramDialog.isShowing())) { - Histogram histogram = new Histogram(true); - histogram.setRenderer(renderer); - histogramDialog = SwingUtils.showDialog(SwingUtils.getWindow(renderer), "Histogram", null, histogram); - renderer.refresh(); - } - } else { - if (histogramDialog != null) { - histogramDialog.setVisible(false); - histogramDialog = null; - } - } - } - - void setLaserState(boolean value) throws Exception { - - Epics.putq("SIN-TIMAST-TMA:Beam-Las-Delay-Sel", value ? 0 : 1); - Epics.putq("SIN-TIMAST-TMA:Beam-Apply-Cmd.PROC", 1); - Thread.sleep(3000); - } - - boolean getLaserState() throws Exception { - return (Epics.get("SIN-TIMAST-TMA:Beam-Las-Delay-Sel", Integer.class) == 0); - } - - void elog(String title, String message, String[] attachments) throws Exception { - String domain = ""; - String logbook = "SwissFEL commissioning data"; - String category = "Info"; - String entry = ""; - StringBuffer cmd = new StringBuffer(); - - cmd.append("G_CS_ELOG_add -l \"").append(logbook).append("\" "); - cmd.append("-a \"Author=ScreenPanel\" "); - cmd.append("-a \"Type=pshell\" "); - cmd.append("-a \"Entry=").append(entry).append("\" "); - cmd.append("-a \"Title=").append(title).append("\" "); - cmd.append("-a \"Category=").append(category).append("\" "); - cmd.append("-a \"Domain=").append(domain).append("\" "); - for (String attachment : attachments) { - cmd.append("-f \"").append(attachment).append("\" "); - } - cmd.append("-n 1 "); - cmd.append("\"").append(message).append("\" "); - System.out.println(cmd.toString()); - - final Process process = Runtime.getRuntime().exec(new String[]{"bash", "-c", cmd.toString()}); - new Thread(() -> { - try { - process.waitFor(); - int bytes = process.getInputStream().available(); - byte[] arr = new byte[bytes]; - process.getInputStream().read(arr, 0, bytes); - System.out.println(new String(arr)); - bytes = process.getErrorStream().available(); - arr = new byte[bytes]; - process.getErrorStream().read(arr, 0, bytes); - System.err.println(new String(arr)); - } catch (Exception ex) { - System.err.println(ex); - } - }).start(); - } - - void centralizeRenderer() { - Point center = null; - Dimension size = renderer.getImageSize(); - double zoom = (renderer.getMode() == RendererMode.Fixed) ? 1.0 : renderer.getZoom(); - if (renderer.getCalibration() != null) { - center = renderer.getCalibration().getCenter(); - } else if (size != null) { - center = new Point(size.width / 2, size.height / 2); - } - if (center != null) { - Point topleft = new Point(Math.max((int) (center.x - renderer.getWidth() / 2 / zoom), 0), - Math.max((int) (center.y - renderer.getHeight() / 2 / zoom), 0)); - renderer.setViewPosition(topleft); - } - } - - void updatePause() { - int index = ((int) pauseSelection.getValue()) - 1; - synchronized (imageBuffer) { - if (index < imageBuffer.size()) { - Data data = imageBuffer.get(index); - BufferedImage image = camera.generateImage(data); - renderer.setImage(renderer.getOrigin(), image, data); - imageBufferOverlay.update(Chrono.getTimeStr(data.getTimestamp(), "HH:mm:ss.SSS")); - manageFit(image, data); - - } - } - } - - //////// - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - buttonGroup1 = new javax.swing.ButtonGroup(); - buttonGroup2 = new javax.swing.ButtonGroup(); - buttonGroup3 = new javax.swing.ButtonGroup(); - buttonGroup4 = new javax.swing.ButtonGroup(); - jProgressBar1 = new javax.swing.JProgressBar(); - jPanel1 = new javax.swing.JPanel(); - jPanel7 = new javax.swing.JPanel(); - buttonMarker = new javax.swing.JToggleButton(); - buttonGrabBackground = new javax.swing.JButton(); - buttonSave = new javax.swing.JToggleButton(); - buttonFit = new javax.swing.JToggleButton(); - buttonReticle = new javax.swing.JToggleButton(); - buttonPause = new javax.swing.JToggleButton(); - jPanel6 = new javax.swing.JPanel(); - textState = new javax.swing.JTextField(); - jLabel2 = new javax.swing.JLabel(); - comboCameras = new javax.swing.JComboBox(); - buttonSetup = new javax.swing.JButton(); - jLabel1 = new javax.swing.JLabel(); - buttonConfig = new javax.swing.JButton(); - renderer = new ch.psi.pshell.imaging.Renderer(); - jPanel4 = new javax.swing.JPanel(); - jPanel3 = new javax.swing.JPanel(); - buttonZoomFit = new javax.swing.JRadioButton(); - buttonZoomStretch = new javax.swing.JRadioButton(); - buttonZoomNormal = new javax.swing.JRadioButton(); - buttonZoom025 = new javax.swing.JRadioButton(); - buttonZoom05 = new javax.swing.JRadioButton(); - buttonZoom2 = new javax.swing.JRadioButton(); - jPanel2 = new javax.swing.JPanel(); - buttonGrayscale = new javax.swing.JRadioButton(); - buttonRainbow = new javax.swing.JRadioButton(); - buttonTemperature = new javax.swing.JRadioButton(); - buttonFullRange = new javax.swing.JRadioButton(); - buttonManual = new javax.swing.JRadioButton(); - jLabel3 = new javax.swing.JLabel(); - jLabel4 = new javax.swing.JLabel(); - spinnerMin = new javax.swing.JSpinner(); - spinnerMax = new javax.swing.JSpinner(); - buttonAutomatic = new javax.swing.JRadioButton(); - checkHistogram = new javax.swing.JCheckBox(); - jPanel5 = new javax.swing.JPanel(); - buttonCamtool = new javax.swing.JRadioButton(); - buttonDirect = new javax.swing.JRadioButton(); - panelScreen = new javax.swing.JPanel(); - valueScreen = new ch.psi.pshell.swing.DeviceValuePanel(); - comboScreen = new javax.swing.JComboBox(); - panelScreen1 = new javax.swing.JPanel(); - valueFilter = new ch.psi.pshell.swing.DeviceValuePanel(); - comboFilter = new javax.swing.JComboBox(); - pauseSelection = new ch.psi.pshell.swing.ValueSelection(); - - setPreferredSize(new java.awt.Dimension(873, 600)); - - buttonMarker.setText("Marker"); - buttonMarker.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonMarkerActionPerformed(evt); - } - }); - - buttonGrabBackground.setText("Grab Background"); - buttonGrabBackground.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonGrabBackgroundActionPerformed(evt); - } - }); - - buttonSave.setText("Save Snapshot"); - buttonSave.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonSaveActionPerformed(evt); - } - }); - - buttonFit.setSelected(true); - buttonFit.setText("Fit"); - buttonFit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonFitActionPerformed(evt); - } - }); - - buttonReticle.setSelected(true); - buttonReticle.setText("Reticle"); - buttonReticle.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonReticleActionPerformed(evt); - } - }); - - buttonPause.setText("Pause"); - buttonPause.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonPauseActionPerformed(evt); - } - }); - - javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7); - jPanel7.setLayout(jPanel7Layout); - jPanel7Layout.setHorizontalGroup( - jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel7Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(buttonPause) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(buttonMarker) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(buttonFit) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(buttonReticle) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonGrabBackground) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(buttonSave) - .addGap(0, 0, 0)) - ); - - jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonFit, buttonMarker, buttonPause, buttonReticle}); - - jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonGrabBackground, buttonSave}); - - jPanel7Layout.setVerticalGroup( - jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel7Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(buttonPause) - .addComponent(buttonFit) - .addComponent(buttonMarker) - .addComponent(buttonSave) - .addComponent(buttonReticle) - .addComponent(buttonGrabBackground)) - .addGap(0, 0, 0)) - ); - - textState.setEditable(false); - textState.setHorizontalAlignment(javax.swing.JTextField.CENTER); - textState.setDisabledTextColor(new java.awt.Color(0, 0, 0)); - textState.setEnabled(false); - - jLabel2.setText("State:"); - - comboCameras.setMaximumRowCount(30); - comboCameras.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboCamerasActionPerformed(evt); - } - }); - - buttonSetup.setText("Setup"); - buttonSetup.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonSetupActionPerformed(evt); - } - }); - - jLabel1.setText("Camera:"); - - buttonConfig.setText("Config"); - buttonConfig.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonConfigActionPerformed(evt); - } - }); - - javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6); - jPanel6.setLayout(jPanel6Layout); - jPanel6Layout.setHorizontalGroup( - jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel6Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(jLabel1) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(comboCameras, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(buttonConfig) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(buttonSetup) - .addGap(50, 50, 50) - .addComponent(jLabel2) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(textState, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0)) - ); - - jPanel6Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonConfig, buttonSetup}); - - jPanel6Layout.setVerticalGroup( - jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel6Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel1) - .addComponent(comboCameras, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel2) - .addComponent(textState, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(buttonConfig) - .addComponent(buttonSetup)) - .addGap(0, 0, 0)) - ); - - jPanel6Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {comboCameras, textState}); - - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(renderer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) - ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(renderer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - - jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Zoom")); - - buttonGroup1.add(buttonZoomFit); - buttonZoomFit.setText("Fit"); - buttonZoomFit.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonZoomFitActionPerformed(evt); - } - }); - - buttonGroup1.add(buttonZoomStretch); - buttonZoomStretch.setText("Stretch"); - buttonZoomStretch.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonZoomStretchActionPerformed(evt); - } - }); - - buttonGroup1.add(buttonZoomNormal); - buttonZoomNormal.setText("Normal"); - buttonZoomNormal.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonZoomNormalActionPerformed(evt); - } - }); - - buttonGroup1.add(buttonZoom025); - buttonZoom025.setText("1/4"); - buttonZoom025.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonZoom025ActionPerformed(evt); - } - }); - - buttonGroup1.add(buttonZoom05); - buttonZoom05.setText("1/2"); - buttonZoom05.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonZoom05ActionPerformed(evt); - } - }); - - buttonGroup1.add(buttonZoom2); - buttonZoom2.setText("2"); - buttonZoom2.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonZoom2ActionPerformed(evt); - } - }); - - javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); - jPanel3.setLayout(jPanel3Layout); - jPanel3Layout.setHorizontalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addContainerGap() - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(buttonZoomFit) - .addComponent(buttonZoomNormal) - .addComponent(buttonZoomStretch)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(buttonZoom025) - .addComponent(buttonZoom05) - .addComponent(buttonZoom2)) - .addGap(47, 47, 47)) - ); - jPanel3Layout.setVerticalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(4, 4, 4) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonZoomNormal) - .addComponent(buttonZoom025)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonZoomFit) - .addComponent(buttonZoom05)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonZoomStretch) - .addComponent(buttonZoom2)) - .addContainerGap()) - ); - - jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Colormap")); - - buttonGroup2.add(buttonGrayscale); - buttonGrayscale.setText("Grayscale"); - buttonGrayscale.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - onChangeColormap(evt); - } - }); - - buttonGroup2.add(buttonRainbow); - buttonRainbow.setText("Rainbow"); - buttonRainbow.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - onChangeColormap(evt); - } - }); - - buttonGroup2.add(buttonTemperature); - buttonTemperature.setText("Temperature"); - buttonTemperature.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - onChangeColormap(evt); - } - }); - - buttonGroup3.add(buttonFullRange); - buttonFullRange.setText("Full range"); - buttonFullRange.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - onChangeColormap(evt); - } - }); - - buttonGroup3.add(buttonManual); - buttonManual.setText("Manual"); - buttonManual.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - onChangeColormap(evt); - } - }); - - jLabel3.setText("Min:"); - - jLabel4.setText("Max:"); - - spinnerMin.setModel(new javax.swing.SpinnerNumberModel(0, 0, 65535, 1)); - spinnerMin.setEnabled(false); - spinnerMin.setPreferredSize(new java.awt.Dimension(77, 20)); - spinnerMin.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - onChangeColormapRange(evt); - } - }); - - spinnerMax.setModel(new javax.swing.SpinnerNumberModel(255, 0, 65535, 1)); - spinnerMax.setEnabled(false); - spinnerMax.setPreferredSize(new java.awt.Dimension(77, 20)); - spinnerMax.addChangeListener(new javax.swing.event.ChangeListener() { - public void stateChanged(javax.swing.event.ChangeEvent evt) { - onChangeColormapRange(evt); - } - }); - - buttonGroup3.add(buttonAutomatic); - buttonAutomatic.setText("Automatic"); - buttonAutomatic.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - onChangeColormap(evt); - } - }); - - checkHistogram.setText("Histogram"); - checkHistogram.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - checkHistogramActionPerformed(evt); - } - }); - - javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); - jPanel2.setLayout(jPanel2Layout); - jPanel2Layout.setHorizontalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addContainerGap() - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addComponent(jLabel4) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(spinnerMax, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(buttonAutomatic) - .addComponent(buttonFullRange) - .addComponent(buttonManual) - .addGroup(jPanel2Layout.createSequentialGroup() - .addComponent(jLabel3) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(spinnerMin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(checkHistogram) - .addComponent(buttonTemperature) - .addComponent(buttonRainbow) - .addComponent(buttonGrayscale)) - .addContainerGap()) - ); - - jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerMax, spinnerMin}); - - jPanel2Layout.setVerticalGroup( - jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGap(4, 4, 4) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonAutomatic) - .addComponent(buttonGrayscale)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonFullRange) - .addComponent(buttonRainbow)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonManual) - .addComponent(buttonTemperature)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel3) - .addComponent(spinnerMin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel4) - .addComponent(spinnerMax, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(checkHistogram)) - .addContainerGap()) - ); - - jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder("Source")); - - buttonGroup4.add(buttonCamtool); - buttonCamtool.setText("Camtool"); - buttonCamtool.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonCamtoolActionPerformed(evt); - } - }); - - buttonGroup4.add(buttonDirect); - buttonDirect.setText("Direct"); - buttonDirect.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonDirectActionPerformed(evt); - } - }); - - javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5); - jPanel5.setLayout(jPanel5Layout); - jPanel5Layout.setHorizontalGroup( - jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel5Layout.createSequentialGroup() - .addContainerGap() - .addComponent(buttonCamtool) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonDirect) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - jPanel5Layout.setVerticalGroup( - jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel5Layout.createSequentialGroup() - .addGap(4, 4, 4) - .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(buttonCamtool) - .addComponent(buttonDirect)) - .addContainerGap()) - ); - - panelScreen.setBorder(javax.swing.BorderFactory.createTitledBorder("Screen")); - - comboScreen.setEnabled(false); - comboScreen.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboScreenActionPerformed(evt); - } - }); - - javax.swing.GroupLayout panelScreenLayout = new javax.swing.GroupLayout(panelScreen); - panelScreen.setLayout(panelScreenLayout); - panelScreenLayout.setHorizontalGroup( - panelScreenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelScreenLayout.createSequentialGroup() - .addContainerGap() - .addGroup(panelScreenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(valueScreen, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboScreen, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) - ); - panelScreenLayout.setVerticalGroup( - panelScreenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelScreenLayout.createSequentialGroup() - .addGap(4, 4, 4) - .addComponent(comboScreen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(valueScreen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - - panelScreen1.setBorder(javax.swing.BorderFactory.createTitledBorder("Filter")); - - comboFilter.setEnabled(false); - comboFilter.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboFilterActionPerformed(evt); - } - }); - - javax.swing.GroupLayout panelScreen1Layout = new javax.swing.GroupLayout(panelScreen1); - panelScreen1.setLayout(panelScreen1Layout); - panelScreen1Layout.setHorizontalGroup( - panelScreen1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelScreen1Layout.createSequentialGroup() - .addContainerGap() - .addGroup(panelScreen1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(valueFilter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(comboFilter, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap()) - ); - panelScreen1Layout.setVerticalGroup( - panelScreen1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelScreen1Layout.createSequentialGroup() - .addGap(4, 4, 4) - .addComponent(comboFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(valueFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - pauseSelection.setDecimals(0); - - javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); - jPanel4.setLayout(jPanel4Layout); - jPanel4Layout.setHorizontalGroup( - jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel4Layout.createSequentialGroup() - .addContainerGap() - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(panelScreen, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelScreen1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(jPanel4Layout.createSequentialGroup() - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(pauseSelection, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))) - .addContainerGap()) - ); - jPanel4Layout.setVerticalGroup( - jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel4Layout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(panelScreen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(panelScreen1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, Short.MAX_VALUE) - .addComponent(pauseSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - ); - }// //GEN-END:initComponents - - private void comboCamerasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboCamerasActionPerformed - try { - comboCameras.setEnabled(false); - new Thread(new Runnable() { - @Override - public void run() { - try { - setCamera((String) comboCameras.getSelectedItem()); - } catch (Exception ex) { - ex.printStackTrace(); - } finally { - comboCameras.setEnabled(true); - } - } - }).start(); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_comboCamerasActionPerformed - - private void buttonConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonConfigActionPerformed - try { - if (camera != null) { - TextEditor editor = new TextEditor(); - editor.setText(cameraConfigJson); - editor.setReadOnly(true); - editor.setTitle(cameraName); - EditorDialog dlg = editor.getDialog(getTopLevel(), false); - dlg.setSize(480, 640); - dlg.setVisible(true); - SwingUtils.centerComponent(this, dlg); - } - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonConfigActionPerformed - - private void buttonSetupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSetupActionPerformed - try { - if (camera != null) { - this.showDeviceConfigDialog(camera, false); - } - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonSetupActionPerformed - - private void buttonPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPauseActionPerformed - try { - renderer.removeOverlay(imageBufferOverlay); - if (camera != null) { - synchronized (imageBuffer) { - if (buttonPause.isSelected()) { - renderer.pause(); - } else { - imageBuffer.clear(); - renderer.resume(); - } - pauseSelection.setVisible(buttonPause.isSelected() && (imageBuffer.size() > 0)); - if (pauseSelection.isVisible()) { - renderer.addOverlay(imageBufferOverlay); - pauseSelection.setMaxValue(imageBuffer.size()); - pauseSelection.setValue(imageBuffer.size());; - } - } - } - } catch (Exception ex) { - ex.printStackTrace(); - showException(ex); - } - }//GEN-LAST:event_buttonPauseActionPerformed - - private void buttonMarkerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonMarkerActionPerformed - try { - checkMarker(); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonMarkerActionPerformed - - private void buttonFitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonFitActionPerformed - try { - showFit = buttonFit.isSelected(); - if (!buttonFit.isSelected()) { - renderer.removeOverlays(fitOv); - fitOv = null; - } else { - renderer.setProfile(Renderer.Profile.None); - } - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonFitActionPerformed - - private void buttonReticleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonReticleActionPerformed - try { - checkReticle(); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonReticleActionPerformed - - private void buttonSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSaveActionPerformed - try { - String snapshotFile = getContext().getSetup().expandPath("{images}/snapshot.png"); - renderer.saveSnapshot(snapshotFile, "png", true); - getContext().setExecutionContext("snapshot", null, null, null, null, null, null, null); - getContext().getDataManager().setDataset("/data", renderer.getData().getMatrix(), renderer.getData().isUnsigned()); - getContext().getDataManager().closeOutput(); - StringBuilder message = new StringBuilder(); - message.append("Camera: ").append(cameraName).append(" ("). - append((camera instanceof Camtool) ? "camtool" : "direct").append(")").append("\n"); - message.append("Data file: ").append(getContext().getExecutionContext().getPath()).append("\n"); - if ((fitOv != null) && (fitOv.length > 3)) { - Overlays.Text text = (Overlays.Text) fitOv[3]; - message.append(text.getText()).append("\n"); - } - elog("ScreenPanel Snapshot", message.toString(), new String[]{snapshotFile}); - SwingUtils.showMessage(getTopLevel(), "Success", "Generated data file:\n" + getContext().getExecutionContext().getPath(), 5000); - - } catch (Exception ex) { - ex.printStackTrace(); - showException(ex); - } - }//GEN-LAST:event_buttonSaveActionPerformed - - private void buttonGrabBackgroundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGrabBackgroundActionPerformed - try { - if (camera instanceof Camtool) { - if (SwingUtils.showOption(getTopLevel(), "Background", "Do you want to capture background now?", OptionType.YesNo) == OptionResult.Yes) { - boolean laserOn = getLaserState(); - if (laserOn) { - setLaserState(false); - } - try { - ((Camtool) camera).captureBackground(5); - } finally { - if (laserOn) { - setLaserState(true); - } - } - SwingUtils.showMessage(getTopLevel(), "Success", "Success capturing background", 5000); - } - } - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonGrabBackgroundActionPerformed - - private void buttonZoomFitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoomFitActionPerformed - try { - renderer.setMode(RendererMode.Fit); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonZoomFitActionPerformed - - private void buttonZoomStretchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoomStretchActionPerformed - try { - renderer.setMode(RendererMode.Stretch); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonZoomStretchActionPerformed - - private void buttonZoomNormalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoomNormalActionPerformed - try { - renderer.setMode(RendererMode.Fixed); - centralizeRenderer(); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonZoomNormalActionPerformed - - private void onChangeColormap(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onChangeColormap - try { - if ((camera != null) && (camera instanceof ColormapSource)) { - ColormapSource source = (ColormapSource) camera; - Color colorReticule = new Color(16, 16, 16); - Color colorMarker = new Color(128, 128, 128); - if (buttonGrayscale.isSelected()) { - colorReticule = new Color(0, 192, 0); - colorMarker = new Color(64, 255, 64); - source.getConfig().colormap = Colormap.Grayscale; - } - if (buttonTemperature.isSelected()) { - source.getConfig().colormap = Colormap.Temperature; - } - if (buttonRainbow.isSelected()) { - source.getConfig().colormap = Colormap.Rainbow; - } - - renderer.setPenReticle(new Pen(colorReticule)); - renderer.setPenProfile(new Pen(colorReticule,0)); - renderer.setPenMarker(new Pen(colorMarker, 2)); - renderer.setShowReticle(false); - checkReticle(); - source.getConfig().colormapAutomatic = buttonAutomatic.isSelected(); - source.getConfig().colormapMin = buttonFullRange.isSelected() ? Double.NaN : (Integer) spinnerMin.getValue(); - source.getConfig().colormapMax = buttonFullRange.isSelected() ? Double.NaN : (Integer) spinnerMax.getValue(); - source.getConfig().save(); - source.refresh(); - if (buttonPause.isSelected()) { - updatePause(); - } - } - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_onChangeColormap - - private void onChangeColormapRange(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_onChangeColormapRange - onChangeColormap(null); - }//GEN-LAST:event_onChangeColormapRange - - private void buttonZoom025ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoom025ActionPerformed - renderer.setZoom(0.25); - renderer.setMode(RendererMode.Zoom); - centralizeRenderer(); - }//GEN-LAST:event_buttonZoom025ActionPerformed - - private void buttonZoom05ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoom05ActionPerformed - renderer.setZoom(0.5); - renderer.setMode(RendererMode.Zoom); - centralizeRenderer(); - }//GEN-LAST:event_buttonZoom05ActionPerformed - - private void buttonCamtoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCamtoolActionPerformed - comboCamerasActionPerformed(null); - }//GEN-LAST:event_buttonCamtoolActionPerformed - - private void buttonDirectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDirectActionPerformed - comboCamerasActionPerformed(null); - }//GEN-LAST:event_buttonDirectActionPerformed - - private void comboScreenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboScreenActionPerformed - ChannelInteger setpoint = null; - try { - int index = comboScreen.getSelectedIndex(); - setpoint = new ChannelInteger(null, cameraName + ":SET_SCREEN1_POS"); - setpoint.initialize(); - if (setpoint.read() != index) { - boolean laserOn = getLaserState(); - if (laserOn) { - setLaserState(false); - } - try { - setpoint.write(index); - } finally { - if (laserOn) { - setLaserState(true); - } - } - } - screen.read(); - } catch (Exception ex) { - showException(ex); - } - if (setpoint != null) { - setpoint.close(); - } - }//GEN-LAST:event_comboScreenActionPerformed - - private void comboFilterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboFilterActionPerformed - try { - String setpoint = (String) comboFilter.getSelectedItem(); - if (!setpoint.equals(filter.read())) { - filter.write(setpoint); - } - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_comboFilterActionPerformed - - private void checkHistogramActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkHistogramActionPerformed - try { - setHistogramVisible(checkHistogram.isSelected()); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_checkHistogramActionPerformed - - private void buttonZoom2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoom2ActionPerformed - renderer.setZoom(2.0); - renderer.setMode(RendererMode.Zoom); - centralizeRenderer(); - }//GEN-LAST:event_buttonZoom2ActionPerformed - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JRadioButton buttonAutomatic; - private javax.swing.JRadioButton buttonCamtool; - private javax.swing.JButton buttonConfig; - private javax.swing.JRadioButton buttonDirect; - private javax.swing.JToggleButton buttonFit; - private javax.swing.JRadioButton buttonFullRange; - private javax.swing.JButton buttonGrabBackground; - private javax.swing.JRadioButton buttonGrayscale; - private javax.swing.ButtonGroup buttonGroup1; - private javax.swing.ButtonGroup buttonGroup2; - private javax.swing.ButtonGroup buttonGroup3; - private javax.swing.ButtonGroup buttonGroup4; - private javax.swing.JRadioButton buttonManual; - private javax.swing.JToggleButton buttonMarker; - private javax.swing.JToggleButton buttonPause; - private javax.swing.JRadioButton buttonRainbow; - private javax.swing.JToggleButton buttonReticle; - private javax.swing.JToggleButton buttonSave; - private javax.swing.JButton buttonSetup; - private javax.swing.JRadioButton buttonTemperature; - private javax.swing.JRadioButton buttonZoom025; - private javax.swing.JRadioButton buttonZoom05; - private javax.swing.JRadioButton buttonZoom2; - private javax.swing.JRadioButton buttonZoomFit; - private javax.swing.JRadioButton buttonZoomNormal; - private javax.swing.JRadioButton buttonZoomStretch; - private javax.swing.JCheckBox checkHistogram; - private javax.swing.JComboBox comboCameras; - private javax.swing.JComboBox comboFilter; - private javax.swing.JComboBox comboScreen; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel4; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel2; - private javax.swing.JPanel jPanel3; - private javax.swing.JPanel jPanel4; - private javax.swing.JPanel jPanel5; - private javax.swing.JPanel jPanel6; - private javax.swing.JPanel jPanel7; - private javax.swing.JProgressBar jProgressBar1; - private javax.swing.JPanel panelScreen; - private javax.swing.JPanel panelScreen1; - private ch.psi.pshell.swing.ValueSelection pauseSelection; - private ch.psi.pshell.imaging.Renderer renderer; - private javax.swing.JSpinner spinnerMax; - private javax.swing.JSpinner spinnerMin; - private javax.swing.JTextField textState; - private ch.psi.pshell.swing.DeviceValuePanel valueFilter; - private ch.psi.pshell.swing.DeviceValuePanel valueScreen; - // End of variables declaration//GEN-END:variables -} +/* + * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. + */ + +import ch.psi.pshell.core.Context; +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import javax.swing.DefaultComboBoxModel; +import ch.psi.pshell.ui.Panel; +import ch.psi.pshell.imaging.ImageListener; +import ch.psi.utils.State; +import ch.psi.utils.IO; +import ch.psi.utils.Chrono; +import ch.psi.utils.swing.SwingUtils; +import ch.psi.utils.swing.TextEditor; +import ch.psi.pshell.epics.PsiCamera; +import ch.psi.pshell.bs.Camtool; +import ch.psi.pshell.core.JsonSerializer; +import ch.psi.pshell.device.DescStatsDouble; +import ch.psi.pshell.device.Device; +import ch.psi.pshell.epics.ChannelInteger; +import ch.psi.pshell.epics.DiscretePositioner; +import ch.psi.pshell.epics.Epics; +import ch.psi.pshell.imaging.Colormap; +import ch.psi.pshell.imaging.ColormapSource; +import ch.psi.pshell.imaging.ColormapSource.ColormapSourceConfig; +import ch.psi.pshell.ui.App; +import ch.psi.pshell.imaging.Data; +import ch.psi.pshell.imaging.DimensionDouble; +import ch.psi.pshell.imaging.Histogram; +import ch.psi.pshell.imaging.Overlay; +import ch.psi.pshell.imaging.Overlays; +import ch.psi.pshell.imaging.Overlays.Text; +import ch.psi.pshell.imaging.Pen; +import ch.psi.pshell.imaging.PointDouble; +import ch.psi.pshell.imaging.Renderer; +import ch.psi.pshell.imaging.RendererListener; +import ch.psi.pshell.imaging.RendererMode; +import ch.psi.pshell.imaging.Source; +import ch.psi.pshell.scripting.InterpreterResult; +import ch.psi.pshell.scripting.ScriptManager; +import ch.psi.pshell.swing.ValueSelection; +import ch.psi.pshell.swing.ValueSelection.ValueSelectionListener; +import ch.psi.utils.Arr; +import ch.psi.utils.ArrayProperties; +import ch.psi.utils.Convert; +import ch.psi.utils.swing.Editor.EditorDialog; +import ch.psi.utils.swing.MainFrame; +import ch.psi.utils.swing.SwingUtils.OptionResult; +import ch.psi.utils.swing.SwingUtils.OptionType; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.image.BufferedImage; +import java.io.FileInputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JDialog; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import org.apache.commons.math3.analysis.function.Gaussian; +import org.apache.commons.math3.fitting.GaussianCurveFitter; +import org.apache.commons.math3.fitting.WeightedObservedPoint; +import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; + +/** + * + */ +public class ScreenPanel extends Panel { + + boolean useCamtoolStats = true; + final String configFolder = "/afs/psi.ch/intranet/SF/Applications/config/camtool"; + String userOverlaysConfigFile; + File[] cameraConfigFiles = new File[0]; + ColormapSource camera; + String cameraName; + String cameraConfigJson; + CameraConfig config; + int polling = 1000; + Overlay marker = null; + JDialog histogramDialog; + DiscretePositioner screen; + DiscretePositioner filter; + boolean showFit; + Overlay[] userOv; + Overlay[] fitOv; + Overlay errorOverlay; + + Double getCamtoolDouble(String name) { + return (Double) Convert.toDouble(((Camtool) camera).getValue(name)); + } + + double[] getCamtoolDoubleArray(String name) { + return (double[]) Convert.toDouble(((Camtool) camera).getValue(name)); + } + + class Frame { + + Frame(Data data) { + this.data = data; + if (camera instanceof Camtool) { + xMean = getCamtoolDouble("x_fit_mean"); + yMean = getCamtoolDouble("y_fit_mean"); + xSigma = getCamtoolDouble("x_fit_standard_deviation"); + ySigma = getCamtoolDouble("y_fit_standard_deviation"); + x_profile = getCamtoolDoubleArray("x_profile"); + x_fit_gauss_function = getCamtoolDoubleArray("x_fit_gauss_function"); + y_profile = getCamtoolDoubleArray("y_profile"); + y_fit_gauss_function = getCamtoolDoubleArray("y_fit_gauss_function"); + + } + } + Data data; + Double xMean; + Double yMean; + Double xSigma; + Double ySigma; + double[] x_profile; + double[] x_fit_gauss_function; + double[] y_profile; + double[] y_fit_gauss_function; + } + + final ArrayList imageBuffer = new ArrayList(); + int imageBufferLenght = 0; + Text imageBufferOverlay; + + public ScreenPanel() { + initComponents(); + renderer.setPersistenceFile(Paths.get(getContext().getSetup().getContextPath(), "Renderer_Cameras.bin")); + setPersistedComponents(new Component[]{buttonCamtool, buttonDirect}); + comboCameras.setEnabled(false); + if (App.hasArgument("poll")) { + try { + polling = Integer.valueOf(App.getArgumentValue("poll")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + if (App.hasArgument("zoom")) { + try { + renderer.setDefaultZoom(Double.valueOf(App.getArgumentValue("zoom"))); + renderer.resetZoom(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + if (App.hasArgument("buf")) { + try { + imageBufferLenght = Integer.valueOf(App.getArgumentValue("buf")); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + if (App.hasArgument("usr_ov")) { + try { + userOverlaysConfigFile =App.getArgumentValue("usr_ov"); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + if (App.hasArgument("calc")) { + useCamtoolStats = false; + } + + renderer.setProfileNormalized(true); + renderer.setShowProfileLimits(false); + + JMenuItem menuSaveStack = new JMenuItem("Save Stack"); + menuSaveStack.addActionListener((ActionEvent e) -> { + try { + saveStack(); + } catch (Exception ex) { + showException(ex); + } + }); + menuSaveStack.setEnabled(imageBufferLenght > 0); + + JMenuItem menuSetROI = new JMenuItem("Set ROI..."); + menuSetROI.addActionListener((ActionEvent e) -> { + renderer.abortSelection(); + if (camera instanceof Camtool) { + final Overlays.Rect selection = new Overlays.Rect(renderer.getPenMovingOverlay()); + renderer.addListener(new RendererListener() { + @Override + public void onSelectionFinished(Renderer renderer, Overlay overlay) { + try { + Rectangle roi = overlay.isFixed() ? renderer.toImageCoord(overlay.getBounds()) : overlay.getBounds(); + if (((Camtool) camera).isRoiEnabled()) { + int[] cur = ((Camtool) camera).getRoi(); + ((Camtool) camera).setRoi(new int[]{roi.x + cur[0], roi.y + cur[1], roi.width, roi.height}); + } else { + ((Camtool) camera).setRoi(new int[]{roi.x, roi.y, roi.width, roi.height}); + ((Camtool) camera).setRoiEnabled(true); + } + } catch (Exception ex) { + } finally { + renderer.removeListener(this); + } + } + + @Override + public void onSelectionAborted(Renderer renderer, Overlay overlay) { + renderer.removeListener(this); + } + }); + selection.setFixed(true); + renderer.startSelection(selection); + } + }); + + JMenuItem menuResetROI = new JMenuItem("Reset ROI"); + menuResetROI.addActionListener((ActionEvent e) -> { + renderer.abortSelection(); + if (camera instanceof Camtool) { + try { + ((Camtool) camera).setRoiEnabled(false); + } catch (IOException ex) { + showException(ex); + } + } + }); + + renderer.getPopupMenu().add(menuSaveStack); + renderer.getPopupMenu().addSeparator(); + renderer.getPopupMenu().add(menuSetROI); + renderer.getPopupMenu().add(menuResetROI); + renderer.getPopupMenu().addPopupMenuListener(new PopupMenuListener() { + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + menuResetROI.setEnabled(camera instanceof Camtool); + menuSetROI.setEnabled(camera instanceof Camtool); + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + } + }); + renderer.getPopupMenu().setVisible(false); + + showFit = buttonFit.isSelected(); + + pauseSelection.setVisible(false); + pauseSelection.setMinValue(1); + pauseSelection.addListener(new ValueSelectionListener() { + @Override + public void onValueChanged(ValueSelection origin, double value, boolean editing) { + if (editing && (value >= 1) && (value <= imageBuffer.size())) { + updatePause(); + } + } + }); + imageBufferOverlay = new Text(renderer.getPenErrorText(), "", new Font("Verdana", Font.PLAIN, 12), new Point(-100, 20)); + imageBufferOverlay.setFixed(true); + imageBufferOverlay.setAnchor(Overlay.ANCHOR_VIEWPORT_TOP_RIGHT); + if (MainFrame.isDark()) { + textState.setEnabled(true); + } + } + + @Override + public void onStart() { + super.onStart(); + if (App.hasArgument("ct")) { + boolean direct = App.getArgumentValue("ct").equals("0") || App.getArgumentValue("ct").equalsIgnoreCase("false"); + buttonCamtool.setSelected(!direct); + buttonDirect.setSelected(direct); + } + } + + @Override + public void onStop() { + if (camera != null) { + camera.close(); + camera = null; + } + super.onStop(); + } + + //Overridable callbacks + @Override + public void onInitialize(int runCount) { + comboCameras.setEnabled(false); + if (App.hasArgument("s")) { + renderer.setDevice((Source) getDevice("image")); + renderer.setAutoScroll(true); + ((Source) getDevice("image")).addListener(new ImageListener() { + @Override + public void onImage(Object o, BufferedImage bi, Data data) { + manageFit(bi, data); + manageUserOverlays(bi, data); + } + + @Override + public void onError(Object o, Exception excptn) { + } + } + ); + + } else { + cameraConfigFiles = IO.listFiles(configFolder, new String[]{"json"}); + Arrays.sort(cameraConfigFiles, (a, b) -> a.compareTo(b)); + DefaultComboBoxModel model = new DefaultComboBoxModel(); + for (File file : cameraConfigFiles) { + String prefix = IO.getPrefix(file); + if (!prefix.startsWith("#")) { + model.addElement(prefix); + } + } + if (App.hasArgument("cam")) { + String cam = App.getArgumentValue("cam"); + if (model.getIndexOf(cam) < 0) { + model.addElement(cam); + } + } + model.addElement(Camtool.SIMULATION); + + comboCameras.setModel(model); + comboCameras.setEnabled(true); + comboCameras.setSelectedItem(-1); + if (model.getSize() > 0) { + try { + if (App.hasArgument("cam")) { + comboCameras.setSelectedItem(App.getArgumentValue("cam")); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + startTimer(1000); + } + + void manageFit(BufferedImage bi, Data data) { + Overlay[] fo = ((bi == null) || (!showFit)) ? null : getFitOverlays(data); + renderer.updateOverlays(fo, fitOv); + fitOv = fo; + } + + void manageUserOverlays(BufferedImage bi, Data data) { + Overlay[] fo = (bi == null) ? null : getUserOverlays(data); + renderer.updateOverlays(fo, userOv); + userOv = fo; + } + + @Override + public void onStateChange(State state, State former) { + + } + + @Override + public void onExecutedFile(String fileName, Object result) { + } + + //Callback to perform update - in event thread + @Override + protected void doUpdate() { + } + + public static class CameraConfig { + + public HashMap kwargs; + public ArrayList args; + public ArrayList links; + public String type; + public HashMap state; + public CameraConfig image_source; + public HashMap subcomponents; + + public ArrayList getCalibration() { + return (ArrayList) state.get("calibration"); + } + + public double getCalOffsetX() { + ArrayList calibration = getCalibration(); + double ret = -(calibration.get(0) + calibration.get(2)) / 2; + return ret; + } + + public double getCalOffsetY() { + ArrayList calibration = getCalibration(); + double ret = -(calibration.get(1) + calibration.get(3)) / 2; + return ret; + } + + public double getScaleX() { + ArrayList calibration = getCalibration(); + double width = Math.abs(calibration.get(2) - calibration.get(0)); + return getCalibrationWidth() / width; + } + + public double getScaleY() { + ArrayList calibration = getCalibration(); + double height = Math.abs(calibration.get(3) - calibration.get(1)); + return getCalibrationHeight() / height; + } + + public Double getCalibrationHeight() { + return (Double) state.get("calibration_height"); + } + + public Double getCalibrationWidth() { + return (Double) state.get("calibration_width"); + } + + public Double getCalibrationHorizontalAngle() { + return (Double) state.get("calibration_horizontal_angle"); + } + + public Double getCalibrationVerticalAngle() { + return (Double) state.get("calibration_vertical_angle"); + } + + public Boolean getMirrorX() { + return (Boolean) state.get("mirror_x"); + } + + public Boolean getMirrorY() { + return (Boolean) state.get("mirror_y"); + } + + public Integer getRotate() { + return (Integer) state.get("rotate"); + } + + public ArrayList getOrigin() { + return (ArrayList) state.get("origin"); + } + + public ArrayList getRoi() { + return (ArrayList) state.get("roi"); + } + + public Boolean getRoiEnable() { + if ((state.get("roi_enable") == null) || (state.get("roi") == null)) { + return false; + } + return (Boolean) state.get("roi_enable"); + } + + public ArrayList getUnitSize() { + return (ArrayList) state.get("unit_size"); + } + + public Integer getRun() { + return (Integer) state.get("run"); + } + } + + void setCamera(String cameraName) throws IOException, InterruptedException { + System.out.println("Setting camera: " + cameraName + " [" + (buttonCamtool.isSelected() ? "camtool" : "direct") + "]"); + //renderer.removeOverlay(errorOverlay); + parseUserOverlays(); + errorOverlay = null; + buttonGrabBackground.setEnabled(false); + checkBackground.setEnabled(false); + spinnerThreshold.setEnabled(false); + checkThreshold.setEnabled(false); + + if (camera != null) { + //camera.removeAllListeners(); + camera.close(); + camera = null; + } + renderer.setDevice(null); + renderer.setShowReticle(false); + renderer.removeOverlays(fitOv); + renderer.removeOverlays(userOv); + renderer.clear(); + renderer.resetZoom(); + + if (screen != null) { + screen.close(); + screen = null; + } + if (filter != null) { + filter.close(); + filter = null; + } + try { + Path configFile = Paths.get(configFolder, cameraName + ".json"); + cameraConfigJson = configFile.toFile().exists() ? new String(Files.readAllBytes(configFile)) : null; + if ((cameraConfigJson == null) && (buttonDirect.isSelected())) { + throw new Exception("Cannot open camera config file: " + configFile.toFile()); + } + boolean changed = !String.valueOf(cameraName).equals(this.cameraName); + this.cameraName = cameraName; + try { + if (buttonCamtool.isSelected()) { + //camera = new Camtool("CurrentCamera", "gfa-lc6-64:8080"); + camera = new Camtool("CurrentCamera"); + camera.getConfig().flipHorizontally = false; + camera.getConfig().flipVertically = false; + camera.getConfig().rotation = 0.0; + camera.getConfig().roiX = 0; + camera.getConfig().roiY = 0; + camera.getConfig().roiWidth = -1; + camera.getConfig().roiHeight = -1; + } else { + camera = new PsiCamera("CurrentCamera", cameraName); + config = (CameraConfig) JsonSerializer.decode(cameraConfigJson, CameraConfig.class); + camera.getConfig().flipHorizontally = config.getMirrorX(); + camera.getConfig().flipVertically = config.getMirrorY(); + //camera.getConfig().rotation = config.getRotate(); + //camera.getConfig().rotationCrop = true; + switch (config.getRotate()) { + case 1: + camera.getConfig().rotation = 270; + break; + case 2: + camera.getConfig().rotation = 180; + break; + case 3: + camera.getConfig().rotation = 90; + break; + } + camera.getConfig().rotationCrop = false; + camera.getConfig().roiX = config.getRoiEnable() ? config.getRoi().get(0) : 0; + camera.getConfig().roiY = config.getRoiEnable() ? config.getRoi().get(1) : 0; + camera.getConfig().roiWidth = config.getRoiEnable() ? config.getRoi().get(2) : -1; + camera.getConfig().roiHeight = config.getRoiEnable() ? config.getRoi().get(3) : -1; + try { + camera.getConfig().spatialCalOffsetX = config.getCalOffsetX(); + camera.getConfig().spatialCalOffsetY = config.getCalOffsetY(); + camera.getConfig().spatialCalScaleX = -config.getScaleX(); + camera.getConfig().spatialCalScaleY = -config.getScaleY(); + } catch (Exception ex) { + camera.getConfig().spatialCalOffsetX = Double.NaN; + camera.getConfig().spatialCalOffsetY = Double.NaN; + camera.getConfig().spatialCalScaleX = Double.NaN; + camera.getConfig().spatialCalScaleY = Double.NaN; + } + } + } catch (Exception ex) { + config = null; + showException(ex); + } + camera.initialize(); + if (camera instanceof Camtool) { + //Managing no background exception. Can be done in a better way? + checkBackground.setEnabled(true); + if (changed) { + ((Camtool) camera).startPipeline(cameraName, null); + checkBackground.setSelected(((Camtool) camera).getBackgroundSubtraction()); + Double threshold = ((Camtool) camera).getThreshold(); + checkThreshold.setSelected(threshold != null); + spinnerThreshold.setValue((threshold == null) ? 0 : threshold); + } else { + ((Camtool) camera).startPipeline(cameraName, null, checkBackground.isSelected(), null, null, null); + } + spinnerThreshold.setEnabled(true); + checkThreshold.setEnabled(true); + buttonGrabBackground.setEnabled(true); + + ((Camtool) camera).startReceiver(); + } + + buttonReticle.setEnabled(camera.getConfig().isCalibrated()); + camera.getConfig().save(); + polling = -250; + if (polling <= 0) { + camera.setMonitored(true); + } else { + camera.setPolling(-polling); + } + renderer.setDevice(camera); + renderer.setAutoScroll(true); + renderer.setMarker(marker); + firstImage = true; + + camera.addListener(new ImageListener() { + @Override + public void onImage(Object o, BufferedImage bi, Data data) { + if (bi != null) { + if (firstImage) { + if ((renderer.getMode() == RendererMode.Zoom) || (renderer.getMode() == RendererMode.Fixed)) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + centralizeRenderer(); + } + }); + } + firstImage = false; + } + renderer.setProfileSize(Math.min(bi.getWidth(), bi.getHeight())); + } + //renderer.setCalibration(camera.getCalibration()); + if (!renderer.isPaused()) { + + if (imageBufferLenght > 1) { + if (data != null) { + synchronized (imageBuffer) { + imageBuffer.add(new Frame(data)); + if (imageBuffer.size() > imageBufferLenght) { + imageBuffer.remove(0); + } + } + } + } + manageFit(bi, data); + manageUserOverlays(bi, data); + } + + } + + @Override + public void onError(Object o, Exception excptn) { + } + }); + } catch (Exception ex) { + //TODO: Find better way to manage no background exception + if (ex.getMessage().toLowerCase().contains("no background image")) { + checkBackground.setSelected(true); + } + if (renderer.getDevice() == null) { + //renderer.setZoom(1.0); + //renderer.setMode(RendererMode.Zoom); + errorOverlay = new Text(renderer.getPenErrorText(), ex.toString(), new Font("Verdana", Font.PLAIN, 12), new Point(20, 20)); + errorOverlay.setFixed(true); + errorOverlay.setAnchor(Overlay.ANCHOR_VIEWPORT_TOP_LEFT); + renderer.addOverlay(errorOverlay); + } + } finally { + checkReticle(); + onTimer(); + } + try { + screen = new DiscretePositioner("CurrentScreen", cameraName + ":SET_SCREEN1_POS", cameraName + ":GET_SCREEN1_POS"); + screen.initialize(); + DefaultComboBoxModel model = new DefaultComboBoxModel(); + for (String pos : screen.getPositions()) { + model.addElement(pos); + } + comboScreen.setModel(model); + comboScreen.setSelectedItem(screen.read()); + + } catch (Exception ex) { + comboScreen.setModel(new DefaultComboBoxModel()); + System.err.println(ex.getMessage()); + screen = null; + } + comboScreen.setEnabled(screen != null); + valueScreen.setDevice(screen); + + try { + filter = new DiscretePositioner("CurrentFilter", cameraName + ":SET_FILTER", cameraName + ":GET_FILTER"); + filter.initialize(); + DefaultComboBoxModel model = new DefaultComboBoxModel(); + for (String pos : filter.getPositions()) { + model.addElement(pos); + } + comboFilter.setModel(model); + comboFilter.setSelectedItem(filter.read()); + } catch (Exception ex) { + comboFilter.setModel(new DefaultComboBoxModel()); + System.err.println(ex.getMessage()); + filter = null; + } + comboFilter.setEnabled(filter != null); + valueFilter.setDevice(filter); + + } + + volatile Boolean firstImage; + + void checkReticle() { + if ((renderer.getDevice() != null) && (camera != null) && (camera.getConfig().isCalibrated()) && buttonReticle.isSelected()) { + //renderer.setCalibration(camera.getCalibration()); + renderer.configureReticle(new Dimension(800, 800), 200); + renderer.setShowReticle(true); + } else { + //renderer.setCalibration(null); + renderer.setShowReticle(false); + } + renderer.refresh(); + } + + void checkMarker() { + if (camera != null) { + if (buttonMarker.isSelected()) { + Dimension d = renderer.getImageSize(); + Point p = (d == null) ? new Point(renderer.getWidth() / 2, renderer.getHeight() / 2) : new Point(d.width / 2, d.height / 2); + Overlay ov = null; + marker = new Overlays.Crosshairs(renderer.getPenMarker(), p, new Dimension(100, 100)); + marker.setMovable(true); + marker.setPassive(false); + } else { + marker = null; + } + renderer.setMarker(marker); + } + } + + void updateZoom() { + try { + buttonZoomStretch.setSelected(renderer.getMode() == RendererMode.Stretch); + buttonZoomFit.setSelected(renderer.getMode() == RendererMode.Fit); + if (renderer.getMode() == RendererMode.Fixed) { + buttonZoomNormal.setSelected(true); + } else if (renderer.getMode() == RendererMode.Zoom) { + if (renderer.getZoom() == 1) { + buttonZoomNormal.setSelected(true); + } else if (renderer.getZoom() == 0.5) { + buttonZoom05.setSelected(true); + } else if (renderer.getZoom() == 0.25) { + buttonZoom025.setSelected(true); + } else if (renderer.getZoom() == 2.0) { + buttonZoom2.setSelected(true); + } else { + buttonGroup1.clearSelection(); + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + boolean updatingColormap; + + void updateColormap() { + updatingColormap = true; + try { + if ((camera != null) && (camera instanceof ColormapSource)) { + ColormapSourceConfig config = ((ColormapSource) camera).getConfig(); + switch (config.colormap) { + case Grayscale: + buttonGrayscale.setSelected(true); + break; + case Rainbow: + buttonRainbow.setSelected(true); + break; + case Temperature: + buttonTemperature.setSelected(true); + break; + default: + buttonGroup2.clearSelection(); + + } + if (config.isDefaultColormap()) { + buttonFullRange.setSelected(true); + } else if (config.colormapAutomatic) { + buttonAutomatic.setSelected(true); + } else { + buttonManual.setSelected(true); + } + + spinnerMin.setEnabled(buttonManual.isSelected()); + spinnerMax.setEnabled(buttonManual.isSelected()); + spinnerMin.setValue(Double.isNaN(config.colormapMin) ? 0 : Math.min(Math.max((int) config.colormapMin, 0), 65535)); + spinnerMax.setValue(Double.isNaN(config.colormapMax) ? 0 : Math.min(Math.max((int) config.colormapMax, 0), 65535)); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + updatingColormap = false; + } + + @Override + protected void onTimer() { + for (Device dev : new Device[]{screen, filter}) { + if (dev != null) { + dev.request(); + } + } + + textState.setText((camera == null) ? "" : camera.getState().toString()); + buttonConfig.setEnabled(camera != null); + if (App.hasArgument("s")) { + try { + ((Source) getDevice("image")).initialize(); + } catch (IOException ex) { + Logger.getLogger(ScreenPanel.class.getName()).log(Level.SEVERE, null, ex); + } catch (InterruptedException ex) { + Logger.getLogger(ScreenPanel.class.getName()).log(Level.SEVERE, null, ex); + } + } + if (renderer.isPaused() != buttonPause.isSelected()) { + buttonPause.setSelected(renderer.isPaused()); + buttonPauseActionPerformed(null); + } + if (renderer.getShowReticle() != buttonReticle.isSelected()) { + //buttonReticle.setSelected(renderer.getShowReticle()); + } + if ((renderer.getMarker() == null) && buttonMarker.isSelected()) { + buttonMarker.setSelected(false); + } + updateZoom(); + updateColormap(); + buttonSave.setSelected(renderer.isSnapshotDialogVisible()); + checkHistogram.setSelected((histogramDialog != null) && (histogramDialog.isShowing())); + } + + Pen penFit = new Pen(new Color(192, 105, 0), 1); + Pen penCross = new Pen(new Color(192, 105, 0), 1); + + Overlay[] getFitOverlays(Data data) { + Overlays.Polyline hgaussian = null; + Overlays.Polyline vgaussian = null; + Overlays.Polyline hprofile = null; + Overlays.Polyline vprofile = null; + Double xMean = null, xSigma = null, xNorm = null; + Double yMean = null, ySigma = null, yNorm = null; + double[] pX = null, pY = null, gX = null, gY = null; + //Double xCom=null, yCom=null; + if (data != null) { + int profileSize = renderer.getProfileSize(); + if ((useCamtoolStats) && (camera instanceof Camtool)) { + try { + if (renderer.isPaused()) { + synchronized (imageBuffer) { + for (Frame f : imageBuffer) { + if (f.data == data) { + xMean = f.xMean; + xSigma = f.xSigma; + yMean = f.yMean; + ySigma = f.ySigma; + pX = f.x_profile; + gX = f.x_fit_gauss_function; + pY = f.y_profile; + gY = f.y_fit_gauss_function; + } + } + } + } else { + xMean = getCamtoolDouble("x_fit_mean"); + yMean = getCamtoolDouble("y_fit_mean"); + xSigma = getCamtoolDouble("x_fit_standard_deviation"); + ySigma = getCamtoolDouble("y_fit_standard_deviation"); + pX = getCamtoolDoubleArray("x_profile"); + gX = getCamtoolDoubleArray("x_fit_gauss_function"); + pY = getCamtoolDoubleArray("y_profile"); + gY = getCamtoolDoubleArray("y_fit_gauss_function"); + } + profileSize /= 4; + if (pX != null) { + int[] x = Arr.indexesInt(pX.length); + int[] y = new int[pX.length]; + int[] p = new int[pX.length]; + List l = Arrays.asList((Double[]) Convert.toWrapperArray(pX)); + Double min = Collections.min(l); + Double max = Collections.max(l); + double minPlot = min; + double rangePlot = max - min; + + for (int i = 0; i < x.length; i++) { + if (gX != null) { + y[i] = (int) (data.getHeight() - 1 - (((gX[i] - minPlot) / rangePlot) * profileSize)); + } + p[i] = (int) (data.getHeight() - 1 - (((pX[i] - minPlot) / rangePlot) * profileSize)); + } + vgaussian = new Overlays.Polyline(penFit, x, y); + vprofile = new Overlays.Polyline(renderer.getPenProfile(), x, p); + } + + if (pX != null) { + int[] y = Arr.indexesInt(pY.length); + int[] x = new int[pY.length]; + int[] p = new int[pY.length]; + + List l = Arrays.asList((Double[]) Convert.toWrapperArray(pY)); + Double min = Collections.min(l); + Double max = Collections.max(l); + double minPlot = min; + double rangePlot = max - min; + + for (int i = 0; i < x.length; i++) { + if (gY != null) { + x[i] = (int) (((gY[i] - minPlot) / rangePlot) * profileSize); + } + p[i] = (int) (((pY[i] - minPlot) / rangePlot) * profileSize); + } + hgaussian = new Overlays.Polyline(penFit, x, y); + hprofile = new Overlays.Polyline(renderer.getPenProfile(), p, y); + } + } catch (Exception ex) { + System.err.println(ex.getMessage()); + return null; + } + } else { + ArrayProperties properties = data.getProperties(); + double maxPlot = properties.max; + double minPlot = properties.min; + double rangePlot = maxPlot - minPlot; + + if (rangePlot <= 0) { + return null; + } + try { + double[] sum = (double[]) Convert.toDouble(data.integrateVertically(true)); + double[] saux = new double[sum.length]; + int[] p = new int[sum.length]; + //xCom = getCom(sum); + int[] x = Arr.indexesInt(sum.length); + DescriptiveStatistics stats = new DescriptiveStatistics(sum); + double min = stats.getMin(); + for (int i = 0; i < sum.length; i++) { + saux[i] = sum[i] - min; + } + + double[] gaussian = fitGaussian(saux, x); + if (gaussian != null) { + if ((gaussian[2] < sum.length * 0.45) + && (gaussian[2] > 2) + && (gaussian[0] > min * 0.03)) { + xNorm = gaussian[0]; + xMean = gaussian[1]; + xSigma = gaussian[2]; + double[] fit = getFitFunction(gaussian, x); + int[] y = new int[x.length]; + for (int i = 0; i < x.length; i++) { + y[i] = (int) (data.getHeight() - 1 - ((((fit[i] + min) / data.getHeight() - minPlot) / rangePlot) * profileSize)); + p[i] = (int) (data.getHeight() - 1 - (((sum[i] / data.getHeight() - minPlot) / rangePlot) * profileSize)); + } + vgaussian = new Overlays.Polyline(penFit, x, y); + vprofile = new Overlays.Polyline(renderer.getPenProfile(), x, p); + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + try { + double[] sum = (double[]) Convert.toDouble(data.integrateHorizontally(true)); + double[] saux = new double[sum.length]; + int[] p = new int[sum.length]; + //yCom = getCom(sum); + int[] x = Arr.indexesInt(sum.length); + DescriptiveStatistics stats = new DescriptiveStatistics(sum); + double min = stats.getMin(); + for (int i = 0; i < sum.length; i++) { + saux[i] = sum[i] - min; + } + + double[] gaussian = fitGaussian(saux, x); + if (gaussian != null) { + //Only aknowledge beam fully inside the image and peak over 3% of min + if ((gaussian[2] < sum.length * 0.45) + && (gaussian[2] > 2) + && (gaussian[0] > min * 0.03)) { + yNorm = gaussian[0]; + yMean = gaussian[1]; + ySigma = gaussian[2]; + double[] fit = getFitFunction(gaussian, x); + + int[] y = new int[x.length]; + for (int i = 0; i < x.length; i++) { + y[i] = (int) ((((fit[i] + min) / data.getWidth() - minPlot) / rangePlot) * profileSize); + p[i] = (int) (((sum[i] / data.getWidth() - minPlot) / rangePlot) * profileSize); + } + hgaussian = new Overlays.Polyline(penFit, y, x); + hprofile = new Overlays.Polyline(renderer.getPenProfile(), p, x); + } + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + if (renderer.getCalibration() != null) { + if (xSigma != null) { + xSigma *= renderer.getCalibration().getScaleX(); + } + if (ySigma != null) { + ySigma *= renderer.getCalibration().getScaleY(); + } + if (xMean != null) { + xMean = data.getX((int) Math.round(xMean)); + } + if (yMean != null) { + yMean = data.getY((int) Math.round(yMean)); + } + //if (xCom!=null) xCom = data.getX((int) Math.round(xCom)); + //if (yCom!=null) yCom = data.getY((int) Math.round(yCom)); + } + } + + Overlays.Crosshairs cross = null; + Overlays.Text text = null; + if ((xMean != null) && (yMean != null)) { + text = new Overlays.Text(penFit, + //String.format("x: m=%1.3f \u03C3=%1.3f c=%1.3f\ny: m=%1.3f \u03C3=%1.3f c=%1.3f", + // xMean, xSigma, xCom, + // yMean, ySigma, yCom), + String.format("x: m=%1.3f \u03C3=%1.3f\ny: m=%1.3f \u03C3=%1.3f", + xMean, xSigma, + yMean, ySigma), + new Font(Font.MONOSPACED, 0, 14), new Point(20, 20)); + text.setFixed(true); + text.setAnchor(Overlay.ANCHOR_VIEWPORT_TOP_LEFT); + + Point center = new Point(xMean.intValue(), yMean.intValue()); + if (renderer.getCalibration() != null) { + center = renderer.getCalibration().convertToImagePosition(new PointDouble(xMean, yMean)); + xSigma /= renderer.getCalibration().getScaleX(); + ySigma /= renderer.getCalibration().getScaleY(); + } + cross = new Overlays.Crosshairs(penCross, center, new Dimension(Math.abs(2 * xSigma.intValue()), 2 * Math.abs(ySigma.intValue()))); + } + return new Overlay[]{hprofile, vprofile, hgaussian, vgaussian, cross, text}; + } + return null; + } + + class UserOverlay { + String name; + Overlay obj; + String[] channels; + } + ArrayList userOverlayConfig; + + void parseUserOverlays() { + Properties userOverlays = new Properties(); + userOverlayConfig = new ArrayList<>(); + if (userOverlaysConfigFile!=null){ + try { + try (FileInputStream in = new FileInputStream(getContext().getSetup().expandPath(userOverlaysConfigFile))) { + userOverlays.load(in); + + for (String name : userOverlays.stringPropertyNames()) { + String val = userOverlays.getProperty(name); + try { + UserOverlay uo = new UserOverlay(); + uo.name = name; + String type = val.substring(0, val.indexOf("(")).trim(); + String pars = val.substring(val.indexOf("(") + 1, val.lastIndexOf(")")).trim(); + String[] tokens = pars.split(","); + for (int i = 0; i < tokens.length; i++) { + tokens[i] = tokens[i].trim(); + } + Color color = Color.GRAY; + try { + color = (Color) Color.class.getField(tokens[tokens.length - 1].toUpperCase()).get(null); + } catch (Exception ex) { + } + Pen pen = new Pen(color); + try { + String[] penTokens = tokens[tokens.length - 1].split(":"); + color = (Color) Color.class.getField(penTokens[0].toUpperCase()).get(null); + int width = Integer.valueOf(penTokens[1]); + Pen.LineStyle style = Pen.LineStyle.valueOf(penTokens[2]); + pen = new Pen(color, width, style); + } catch (Exception ex) { + } + switch (type) { + case "Point": + uo.obj = new Overlays.Crosshairs(); + uo.obj.setSize(new Dimension(Integer.valueOf(tokens[2]), Integer.valueOf(tokens[3]))); + break; + case "Line": + uo.obj = new Overlays.Line(); + break; + case "Arrow": + uo.obj = new Overlays.Arrow(); + break; + case "Rect": + uo.obj = new Overlays.Rect(); + break; + case "Ellipse": + uo.obj = new Overlays.Ellipse(); + break; + case "Polyline": + uo.obj = new Overlays.Polyline(); + break; + } + if (type.equals("Polyline") || type.equals("Point")) { + uo.channels = new String[]{tokens[0], tokens[1]}; + } else { + uo.channels = new String[]{tokens[0], tokens[1], tokens[2], tokens[3]}; + } + uo.obj.setPen(pen); + userOverlayConfig.add(uo); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + Overlay[] getUserOverlays(Data data) { + ArrayList ret = new ArrayList<>(); + if (camera instanceof Camtool) { + for (UserOverlay uo : userOverlayConfig) { + try { + Overlay ov = uo.obj; + //Overlay ov = (Overlay)uo.cls.newInstance(); + ov.setCalibration(renderer.getCalibration()); + if (ov instanceof Overlays.Polyline) { + double[] x = (uo.channels[0].equals("null")) ? null : getCamtoolDoubleArray(uo.channels[0]); + double[] y = (uo.channels[1].equals("null")) ? null : getCamtoolDoubleArray(uo.channels[1]); + if (x == null) { + x = (renderer.getCalibration() == null) ? Arr.indexesDouble(y.length) : renderer.getCalibration().getAxisX(y.length); + } + if (y == null) { + y = (renderer.getCalibration() == null) ? Arr.indexesDouble(x.length) : renderer.getCalibration().getAxisY(x.length); + } + ((Overlays.Polyline) ov).updateAbsolute(x, y); + } else { + PointDouble position = new PointDouble(getCamtoolDouble(uo.channels[0]), getCamtoolDouble(uo.channels[1])); + ov.setAbsolutePosition(position); + if (!(ov instanceof Overlays.Crosshairs)) { + DimensionDouble size = new DimensionDouble(getCamtoolDouble(uo.channels[2]) - position.x, getCamtoolDouble(uo.channels[3]) - position.y); + ov.setAbsoluteSize(size); + } + } + ret.add(ov); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + return ret.toArray(new Overlay[0]); + } + + double getCom(double[] arr) { + if (arr == null) { + return Double.NaN; + } + int index = 0; + double ret = 0; + double total = 0; + for (double v : arr) { + ret += (v * index++); + total += v; + } + if (total == 0) { + return Double.NaN; + } + return ret / total; + } + + double[] fitGaussianScript(int[] y, int[] x) { + ScriptManager sm = Context.getInstance().getScriptManager(); + ArrayProperties pY = ArrayProperties.get(y); + sm.setVar("y", y); + sm.setVar("x", x); + InterpreterResult r = sm.eval("r = fit_gaussians(y, x, [" + pY.maxIndex + ",])"); + if (r.exception != null) { + r.exception.printStackTrace(); + } else { + List ret = (List) sm.getVar("r"); + if ((ret != null) && (ret.size() == 1) && (ret.get(0) instanceof List) && (((List) (ret.get(0))).size() == 3)) { + double norm = (Double) ((List) ret.get(0)).get(0); + double mean = (Double) ((List) ret.get(0)).get(1); + double sigma = (Double) ((List) ret.get(0)).get(2); + return new double[]{norm, mean, sigma}; + } + } + return null; + } + + double[] fitGaussian(double[] y, int[] x) { + try { + ArrayProperties pY = ArrayProperties.get(y); + GaussianCurveFitter fitter = GaussianCurveFitter.create().withStartPoint(new double[]{(pY.max - pY.min) / 2, x[pY.maxIndex], 1.0}).withMaxIterations(1000); + ArrayList values = new ArrayList<>(); + for (int i = 0; i < y.length; i++) { + values.add(new WeightedObservedPoint(1.0, x[i], y[i])); + } + return fitter.fit(values); + } catch (Exception ex) { + return null; + } + + } + + double[] getFitFunction(double[] pars, int[] x) { + double[] fit = new double[x.length]; + Gaussian g = new Gaussian(pars[0], pars[1], pars[2]); + for (int i = 0; i < x.length; i++) { + fit[i] = g.value(x[i]); + } + return fit; + } + + void setHistogramVisible(boolean value) { + if (value) { + if ((histogramDialog == null) || (!histogramDialog.isShowing())) { + Histogram histogram = new Histogram(true); + histogram.setRenderer(renderer); + histogramDialog = SwingUtils.showDialog(SwingUtils.getWindow(renderer), "Histogram", null, histogram); + renderer.refresh(); + } + } else { + if (histogramDialog != null) { + histogramDialog.setVisible(false); + histogramDialog = null; + } + } + } + + void setLaserState(boolean value) throws Exception { + + Epics.putq("SIN-TIMAST-TMA:Beam-Las-Delay-Sel", value ? 0 : 1); + Epics.putq("SIN-TIMAST-TMA:Beam-Apply-Cmd.PROC", 1); + Thread.sleep(3000); + } + + boolean getLaserState() throws Exception { + return (Epics.get("SIN-TIMAST-TMA:Beam-Las-Delay-Sel", Integer.class) == 0); + } + + void elog(String title, String message, String[] attachments) throws Exception { + String domain = ""; + String logbook = "SwissFEL commissioning data"; + String category = "Info"; + String entry = ""; + StringBuffer cmd = new StringBuffer(); + + cmd.append("G_CS_ELOG_add -l \"").append(logbook).append("\" "); + cmd.append("-a \"Author=ScreenPanel\" "); + cmd.append("-a \"Type=pshell\" "); + cmd.append("-a \"Entry=").append(entry).append("\" "); + cmd.append("-a \"Title=").append(title).append("\" "); + cmd.append("-a \"Category=").append(category).append("\" "); + cmd.append("-a \"Domain=").append(domain).append("\" "); + for (String attachment : attachments) { + cmd.append("-f \"").append(attachment).append("\" "); + } + cmd.append("-n 1 "); + cmd.append("\"").append(message).append("\" "); + System.out.println(cmd.toString()); + + final Process process = Runtime.getRuntime().exec(new String[]{"bash", "-c", cmd.toString()}); + new Thread(() -> { + try { + process.waitFor(); + int bytes = process.getInputStream().available(); + byte[] arr = new byte[bytes]; + process.getInputStream().read(arr, 0, bytes); + System.out.println(new String(arr)); + bytes = process.getErrorStream().available(); + arr = new byte[bytes]; + process.getErrorStream().read(arr, 0, bytes); + System.err.println(new String(arr)); + } catch (Exception ex) { + System.err.println(ex); + } + }).start(); + } + + void centralizeRenderer() { + Point center = null; + Dimension size = renderer.getImageSize(); + double zoom = (renderer.getMode() == RendererMode.Fixed) ? 1.0 : renderer.getZoom(); + if (renderer.getCalibration() != null) { + center = renderer.getCalibration().getCenter(); + } else if (size != null) { + center = new Point(size.width / 2, size.height / 2); + } + if (center != null) { + Point topleft = new Point(Math.max((int) (center.x - renderer.getWidth() / 2 / zoom), 0), + Math.max((int) (center.y - renderer.getHeight() / 2 / zoom), 0)); + renderer.setViewPosition(topleft); + } + } + + void updatePause() { + int index = ((int) pauseSelection.getValue()) - 1; + synchronized (imageBuffer) { + if (index < imageBuffer.size()) { + Data data = imageBuffer.get(index).data; + BufferedImage image = camera.generateImage(data); + renderer.setImage(renderer.getOrigin(), image, data); + imageBufferOverlay.update(Chrono.getTimeStr(data.getTimestamp(), "HH:mm:ss.SSS")); + manageFit(image, data); + manageUserOverlays(image, data); + } + } + } + + void saveSnapshot() throws Exception { + String snapshotFile = getContext().getSetup().expandPath("{images}/snapshot.png"); + renderer.saveSnapshot(snapshotFile, "png", true); + getContext().setExecutionPars("snapshot"); + String path = "/data"; + getContext().getDataManager().setDataset(path, renderer.getData().getMatrix(), renderer.getData().isUnsigned()); + getContext().getDataManager().closeOutput(); + StringBuilder message = new StringBuilder(); + message.append("Camera: ").append(cameraName).append(" ("). + append((camera instanceof Camtool) ? "camtool" : "direct").append(")").append("\n"); + message.append("Data file: ").append(getContext().getExecutionPars().getPath()).append("\n"); + if ((fitOv != null) && (fitOv.length > 3)) { + Overlays.Text text = (Overlays.Text) fitOv[3]; + message.append(text.getText()).append("\n"); + } + elog("ScreenPanel Snapshot", message.toString(), new String[]{snapshotFile}); + SwingUtils.showMessage(getTopLevel(), "Success", "Generated data file:\n" + getContext().getExecutionPars().getPath(), 5000); + } + + void saveStack() throws Exception { + getContext().setExecutionPars("snapshot"); + ArrayList x = new ArrayList<>(); + ArrayList y = new ArrayList<>(); + synchronized (imageBuffer) { + for (int i = 0; i < imageBuffer.size(); i++) { + Frame frame = imageBuffer.get(i); + String path = "/data_" + i; + getContext().getDataManager().setDataset(path, frame.data.getMatrix(), frame.data.isUnsigned()); + getContext().getDataManager().setAttribute(path, "x_mean", (frame.xMean == null) ? Double.NaN : frame.xMean); + getContext().getDataManager().setAttribute(path, "x_sigma", (frame.xSigma == null) ? Double.NaN : frame.xSigma); + getContext().getDataManager().setAttribute(path, "y_mean", (frame.yMean == null) ? Double.NaN : frame.yMean); + getContext().getDataManager().setAttribute(path, "y_sigma", (frame.ySigma == null) ? Double.NaN : frame.ySigma); + x.add(frame.xMean); + y.add(frame.yMean); + } + } + DescStatsDouble xs = new DescStatsDouble(x.toArray(new Double[0]), -1); + DescStatsDouble ys = new DescStatsDouble(y.toArray(new Double[0]), -1); + String path = "/"; + getContext().getDataManager().setAttribute(path, "x_mean", xs.getMean()); + getContext().getDataManager().setAttribute(path, "x_sigma", xs.getStdev()); + getContext().getDataManager().setAttribute(path, "y_mean", ys.getMean()); + getContext().getDataManager().setAttribute(path, "y_sigma", ys.getStdev()); + getContext().getDataManager().closeOutput(); + SwingUtils.showMessage(getTopLevel(), "Success", "Generated data file:\n" + getContext().getExecutionPars().getPath(), 5000); + + } + + //////// + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + buttonGroup2 = new javax.swing.ButtonGroup(); + buttonGroup3 = new javax.swing.ButtonGroup(); + buttonGroup4 = new javax.swing.ButtonGroup(); + jProgressBar1 = new javax.swing.JProgressBar(); + jPanel1 = new javax.swing.JPanel(); + jPanel7 = new javax.swing.JPanel(); + buttonMarker = new javax.swing.JToggleButton(); + buttonGrabBackground = new javax.swing.JButton(); + buttonSave = new javax.swing.JToggleButton(); + buttonFit = new javax.swing.JToggleButton(); + buttonReticle = new javax.swing.JToggleButton(); + buttonPause = new javax.swing.JToggleButton(); + jPanel6 = new javax.swing.JPanel(); + textState = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + comboCameras = new javax.swing.JComboBox(); + buttonSetup = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + buttonConfig = new javax.swing.JButton(); + renderer = new ch.psi.pshell.imaging.Renderer(); + jPanel4 = new javax.swing.JPanel(); + jPanel3 = new javax.swing.JPanel(); + buttonZoomFit = new javax.swing.JRadioButton(); + buttonZoomStretch = new javax.swing.JRadioButton(); + buttonZoomNormal = new javax.swing.JRadioButton(); + buttonZoom025 = new javax.swing.JRadioButton(); + buttonZoom05 = new javax.swing.JRadioButton(); + buttonZoom2 = new javax.swing.JRadioButton(); + jPanel2 = new javax.swing.JPanel(); + buttonGrayscale = new javax.swing.JRadioButton(); + buttonRainbow = new javax.swing.JRadioButton(); + buttonTemperature = new javax.swing.JRadioButton(); + buttonFullRange = new javax.swing.JRadioButton(); + buttonManual = new javax.swing.JRadioButton(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + spinnerMin = new javax.swing.JSpinner(); + spinnerMax = new javax.swing.JSpinner(); + buttonAutomatic = new javax.swing.JRadioButton(); + checkHistogram = new javax.swing.JCheckBox(); + jPanel5 = new javax.swing.JPanel(); + buttonCamtool = new javax.swing.JRadioButton(); + buttonDirect = new javax.swing.JRadioButton(); + panelScreen = new javax.swing.JPanel(); + valueScreen = new ch.psi.pshell.swing.DeviceValuePanel(); + comboScreen = new javax.swing.JComboBox(); + panelScreen1 = new javax.swing.JPanel(); + valueFilter = new ch.psi.pshell.swing.DeviceValuePanel(); + comboFilter = new javax.swing.JComboBox(); + pauseSelection = new ch.psi.pshell.swing.ValueSelection(); + panelScreen2 = new javax.swing.JPanel(); + checkThreshold = new javax.swing.JCheckBox(); + spinnerThreshold = new javax.swing.JSpinner(); + checkBackground = new javax.swing.JCheckBox(); + + setPreferredSize(new java.awt.Dimension(873, 600)); + + buttonMarker.setText("Marker"); + buttonMarker.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonMarkerActionPerformed(evt); + } + }); + + buttonGrabBackground.setText("Grab Background"); + buttonGrabBackground.setEnabled(false); + buttonGrabBackground.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonGrabBackgroundActionPerformed(evt); + } + }); + + buttonSave.setText("Save Snapshot"); + buttonSave.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonSaveActionPerformed(evt); + } + }); + + buttonFit.setSelected(true); + buttonFit.setText("Fit"); + buttonFit.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonFitActionPerformed(evt); + } + }); + + buttonReticle.setSelected(true); + buttonReticle.setText("Reticle"); + buttonReticle.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonReticleActionPerformed(evt); + } + }); + + buttonPause.setText("Pause"); + buttonPause.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonPauseActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7); + jPanel7.setLayout(jPanel7Layout); + jPanel7Layout.setHorizontalGroup( + jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel7Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(buttonPause) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonMarker) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonFit) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonReticle) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonGrabBackground) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonSave) + .addGap(0, 0, 0)) + ); + + jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonFit, buttonMarker, buttonPause, buttonReticle}); + + jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonGrabBackground, buttonSave}); + + jPanel7Layout.setVerticalGroup( + jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel7Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(buttonPause) + .addComponent(buttonFit) + .addComponent(buttonMarker) + .addComponent(buttonSave) + .addComponent(buttonReticle) + .addComponent(buttonGrabBackground)) + .addGap(0, 0, 0)) + ); + + textState.setEditable(false); + textState.setHorizontalAlignment(javax.swing.JTextField.CENTER); + textState.setDisabledTextColor(new java.awt.Color(0, 0, 0)); + textState.setEnabled(false); + + jLabel2.setText("State:"); + + comboCameras.setMaximumRowCount(30); + comboCameras.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboCamerasActionPerformed(evt); + } + }); + + buttonSetup.setText("Setup"); + buttonSetup.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonSetupActionPerformed(evt); + } + }); + + jLabel1.setText("Camera:"); + + buttonConfig.setText("Config"); + buttonConfig.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonConfigActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6); + jPanel6.setLayout(jPanel6Layout); + jPanel6Layout.setHorizontalGroup( + jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel6Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(comboCameras, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonConfig) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(buttonSetup) + .addGap(50, 50, 50) + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(textState, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0)) + ); + + jPanel6Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonConfig, buttonSetup}); + + jPanel6Layout.setVerticalGroup( + jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel6Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(comboCameras, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2) + .addComponent(textState, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(buttonConfig) + .addComponent(buttonSetup)) + .addGap(0, 0, 0)) + ); + + jPanel6Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {comboCameras, textState}); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(renderer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(renderer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Zoom")); + + buttonGroup1.add(buttonZoomFit); + buttonZoomFit.setText("Fit"); + buttonZoomFit.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonZoomFitActionPerformed(evt); + } + }); + + buttonGroup1.add(buttonZoomStretch); + buttonZoomStretch.setText("Stretch"); + buttonZoomStretch.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonZoomStretchActionPerformed(evt); + } + }); + + buttonGroup1.add(buttonZoomNormal); + buttonZoomNormal.setText("Normal"); + buttonZoomNormal.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonZoomNormalActionPerformed(evt); + } + }); + + buttonGroup1.add(buttonZoom025); + buttonZoom025.setText("1/4"); + buttonZoom025.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonZoom025ActionPerformed(evt); + } + }); + + buttonGroup1.add(buttonZoom05); + buttonZoom05.setText("1/2"); + buttonZoom05.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonZoom05ActionPerformed(evt); + } + }); + + buttonGroup1.add(buttonZoom2); + buttonZoom2.setText("2"); + buttonZoom2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonZoom2ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(buttonZoomFit) + .addComponent(buttonZoomNormal) + .addComponent(buttonZoomStretch)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(buttonZoom025) + .addComponent(buttonZoom05) + .addComponent(buttonZoom2)) + .addGap(47, 47, 47)) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGap(4, 4, 4) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonZoomNormal) + .addComponent(buttonZoom025)) + .addGap(0, 0, 0) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonZoomFit) + .addComponent(buttonZoom05)) + .addGap(0, 0, 0) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonZoomStretch) + .addComponent(buttonZoom2)) + .addContainerGap()) + ); + + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Colormap")); + + buttonGroup2.add(buttonGrayscale); + buttonGrayscale.setText("Grayscale"); + buttonGrayscale.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + onChangeColormap(evt); + } + }); + + buttonGroup2.add(buttonRainbow); + buttonRainbow.setText("Rainbow"); + buttonRainbow.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + onChangeColormap(evt); + } + }); + + buttonGroup2.add(buttonTemperature); + buttonTemperature.setText("Temperature"); + buttonTemperature.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + onChangeColormap(evt); + } + }); + + buttonGroup3.add(buttonFullRange); + buttonFullRange.setText("Full range"); + buttonFullRange.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + onChangeColormap(evt); + } + }); + + buttonGroup3.add(buttonManual); + buttonManual.setText("Manual"); + buttonManual.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + onChangeColormap(evt); + } + }); + + jLabel3.setText("Min:"); + + jLabel4.setText("Max:"); + + spinnerMin.setModel(new javax.swing.SpinnerNumberModel(0, 0, 65535, 1)); + spinnerMin.setEnabled(false); + spinnerMin.setPreferredSize(new java.awt.Dimension(77, 20)); + spinnerMin.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + onChangeColormapRange(evt); + } + }); + + spinnerMax.setModel(new javax.swing.SpinnerNumberModel(255, 0, 65535, 1)); + spinnerMax.setEnabled(false); + spinnerMax.setPreferredSize(new java.awt.Dimension(77, 20)); + spinnerMax.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + onChangeColormapRange(evt); + } + }); + + buttonGroup3.add(buttonAutomatic); + buttonAutomatic.setText("Automatic"); + buttonAutomatic.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + onChangeColormap(evt); + } + }); + + checkHistogram.setText("Histogram"); + checkHistogram.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + checkHistogramActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addComponent(jLabel4) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerMax, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(buttonAutomatic) + .addComponent(buttonFullRange) + .addComponent(buttonManual) + .addGroup(jPanel2Layout.createSequentialGroup() + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerMin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(checkHistogram) + .addComponent(buttonTemperature) + .addComponent(buttonRainbow) + .addComponent(buttonGrayscale)) + .addContainerGap()) + ); + + jPanel2Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerMax, spinnerMin}); + + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addGap(4, 4, 4) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonAutomatic) + .addComponent(buttonGrayscale)) + .addGap(0, 0, 0) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonFullRange) + .addComponent(buttonRainbow)) + .addGap(0, 0, 0) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonManual) + .addComponent(buttonTemperature)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(spinnerMin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel4) + .addComponent(spinnerMax, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(checkHistogram)) + .addContainerGap()) + ); + + jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder("Source")); + + buttonGroup4.add(buttonCamtool); + buttonCamtool.setText("Camtool"); + buttonCamtool.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCamtoolActionPerformed(evt); + } + }); + + buttonGroup4.add(buttonDirect); + buttonDirect.setText("Direct"); + buttonDirect.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonDirectActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5); + jPanel5.setLayout(jPanel5Layout); + jPanel5Layout.setHorizontalGroup( + jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel5Layout.createSequentialGroup() + .addContainerGap() + .addComponent(buttonCamtool) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonDirect) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel5Layout.setVerticalGroup( + jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel5Layout.createSequentialGroup() + .addGap(4, 4, 4) + .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(buttonCamtool) + .addComponent(buttonDirect)) + .addContainerGap()) + ); + + panelScreen.setBorder(javax.swing.BorderFactory.createTitledBorder("Screen")); + + comboScreen.setEnabled(false); + comboScreen.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboScreenActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelScreenLayout = new javax.swing.GroupLayout(panelScreen); + panelScreen.setLayout(panelScreenLayout); + panelScreenLayout.setHorizontalGroup( + panelScreenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelScreenLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelScreenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(valueScreen, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboScreen, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + panelScreenLayout.setVerticalGroup( + panelScreenLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelScreenLayout.createSequentialGroup() + .addGap(4, 4, 4) + .addComponent(comboScreen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(valueScreen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + panelScreen1.setBorder(javax.swing.BorderFactory.createTitledBorder("Filter")); + + comboFilter.setEnabled(false); + comboFilter.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboFilterActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelScreen1Layout = new javax.swing.GroupLayout(panelScreen1); + panelScreen1.setLayout(panelScreen1Layout); + panelScreen1Layout.setHorizontalGroup( + panelScreen1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelScreen1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(panelScreen1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(valueFilter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(comboFilter, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + panelScreen1Layout.setVerticalGroup( + panelScreen1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelScreen1Layout.createSequentialGroup() + .addGap(4, 4, 4) + .addComponent(comboFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(valueFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pauseSelection.setDecimals(0); + + panelScreen2.setBorder(javax.swing.BorderFactory.createTitledBorder("Image")); + + checkThreshold.setText("Threshold"); + checkThreshold.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + checkThresholdActionPerformed(evt); + } + }); + + spinnerThreshold.setModel(new javax.swing.SpinnerNumberModel(0.0d, 0.0d, 65535.0d, 1.0d)); + spinnerThreshold.setEnabled(false); + spinnerThreshold.setPreferredSize(new java.awt.Dimension(77, 20)); + spinnerThreshold.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + spinnerThresholdonChange(evt); + } + }); + + checkBackground.setText("Subtract Background"); + checkBackground.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + checkBackgroundActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelScreen2Layout = new javax.swing.GroupLayout(panelScreen2); + panelScreen2.setLayout(panelScreen2Layout); + panelScreen2Layout.setHorizontalGroup( + panelScreen2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelScreen2Layout.createSequentialGroup() + .addContainerGap() + .addGroup(panelScreen2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(checkBackground) + .addGroup(panelScreen2Layout.createSequentialGroup() + .addComponent(checkThreshold) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(spinnerThreshold, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + panelScreen2Layout.setVerticalGroup( + panelScreen2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelScreen2Layout.createSequentialGroup() + .addGap(4, 4, 4) + .addComponent(checkBackground) + .addGap(2, 2, 2) + .addGroup(panelScreen2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(checkThreshold) + .addComponent(spinnerThreshold, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); + jPanel4.setLayout(jPanel4Layout); + jPanel4Layout.setHorizontalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelScreen, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelScreen1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pauseSelection, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(panelScreen2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + jPanel4Layout.setVerticalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(panelScreen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(panelScreen1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(panelScreen2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(pauseSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + ); + }// //GEN-END:initComponents + + private void comboCamerasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboCamerasActionPerformed + try { + if (!comboCameras.isEnabled()) { + throw new Exception("Invalid state"); + } + comboCameras.setEnabled(false); + buttonCamtool.setEnabled(false); + buttonDirect.setEnabled(false); + new Thread(new Runnable() { + @Override + public void run() { + try { + setCamera((String) comboCameras.getSelectedItem()); + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + comboCameras.setEnabled(true); + buttonCamtool.setEnabled(true); + buttonDirect.setEnabled(true); + } + } + }).start(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_comboCamerasActionPerformed + + private void buttonConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonConfigActionPerformed + try { + if (camera != null) { + TextEditor editor = new TextEditor(); + editor.setText(cameraConfigJson); + editor.setReadOnly(true); + editor.setTitle(cameraName); + EditorDialog dlg = editor.getDialog(getTopLevel(), false); + dlg.setSize(480, 640); + dlg.setVisible(true); + SwingUtils.centerComponent(this, dlg); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonConfigActionPerformed + + private void buttonSetupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSetupActionPerformed + try { + if (camera != null) { + this.showDeviceConfigDialog(camera, false); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonSetupActionPerformed + + private void buttonPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPauseActionPerformed + try { + renderer.removeOverlay(imageBufferOverlay); + if (camera != null) { + synchronized (imageBuffer) { + if (buttonPause.isSelected()) { + renderer.pause(); + } else { + imageBuffer.clear(); + renderer.resume(); + } + pauseSelection.setVisible(buttonPause.isSelected() && (imageBuffer.size() > 0)); + if (pauseSelection.isVisible()) { + renderer.addOverlay(imageBufferOverlay); + pauseSelection.setMaxValue(imageBuffer.size()); + pauseSelection.setValue(imageBuffer.size());; + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + showException(ex); + } + }//GEN-LAST:event_buttonPauseActionPerformed + + private void buttonMarkerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonMarkerActionPerformed + try { + checkMarker(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonMarkerActionPerformed + + private void buttonFitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonFitActionPerformed + try { + showFit = buttonFit.isSelected(); + if (!buttonFit.isSelected()) { + renderer.removeOverlays(fitOv); + fitOv = null; + } else { + renderer.setProfile(Renderer.Profile.None); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonFitActionPerformed + + private void buttonReticleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonReticleActionPerformed + try { + checkReticle(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonReticleActionPerformed + + private void buttonSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSaveActionPerformed + try { + saveSnapshot(); + } catch (Exception ex) { + ex.printStackTrace(); + showException(ex); + } + }//GEN-LAST:event_buttonSaveActionPerformed + + private void buttonGrabBackgroundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonGrabBackgroundActionPerformed + try { + if (camera instanceof Camtool) { + if (SwingUtils.showOption(getTopLevel(), "Background", "Do you want to capture background now?", OptionType.YesNo) == OptionResult.Yes) { + boolean laserOn = getLaserState(); + if (laserOn) { + setLaserState(false); + } + try { + ((Camtool) camera).grabBackground(null, 5); + } finally { + if (laserOn) { + setLaserState(true); + } + } + SwingUtils.showMessage(getTopLevel(), "Success", "Success capturing background", 5000); + } + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonGrabBackgroundActionPerformed + + private void buttonZoomFitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoomFitActionPerformed + try { + renderer.setMode(RendererMode.Fit); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonZoomFitActionPerformed + + private void buttonZoomStretchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoomStretchActionPerformed + try { + renderer.setMode(RendererMode.Stretch); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonZoomStretchActionPerformed + + private void buttonZoomNormalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoomNormalActionPerformed + try { + renderer.setMode(RendererMode.Fixed); + centralizeRenderer(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonZoomNormalActionPerformed + + private void onChangeColormap(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onChangeColormap + try { + if ((camera != null) && (camera instanceof ColormapSource) && !updatingColormap) { + ColormapSource source = (ColormapSource) camera; + Color colorReticule = new Color(16, 16, 16); + Color colorMarker = new Color(128, 128, 128); + if (buttonGrayscale.isSelected()) { + colorReticule = new Color(0, 192, 0); + colorMarker = new Color(64, 255, 64); + source.getConfig().colormap = Colormap.Grayscale; + } + if (buttonTemperature.isSelected()) { + source.getConfig().colormap = Colormap.Temperature; + } + if (buttonRainbow.isSelected()) { + source.getConfig().colormap = Colormap.Rainbow; + } + + renderer.setPenReticle(new Pen(colorReticule)); + renderer.setPenProfile(new Pen(colorReticule, 0)); + renderer.setPenMarker(new Pen(colorMarker, 2)); + renderer.setShowReticle(false); + checkReticle(); + source.getConfig().colormapAutomatic = buttonAutomatic.isSelected(); + source.getConfig().colormapMin = buttonFullRange.isSelected() ? Double.NaN : (Integer) spinnerMin.getValue(); + source.getConfig().colormapMax = buttonFullRange.isSelected() ? Double.NaN : (Integer) spinnerMax.getValue(); + source.getConfig().save(); + source.refresh(); + if (buttonPause.isSelected()) { + updatePause(); + } + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_onChangeColormap + + private void onChangeColormapRange(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_onChangeColormapRange + onChangeColormap(null); + }//GEN-LAST:event_onChangeColormapRange + + private void buttonZoom025ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoom025ActionPerformed + renderer.setZoom(0.25); + renderer.setMode(RendererMode.Zoom); + centralizeRenderer(); + }//GEN-LAST:event_buttonZoom025ActionPerformed + + private void buttonZoom05ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoom05ActionPerformed + renderer.setZoom(0.5); + renderer.setMode(RendererMode.Zoom); + centralizeRenderer(); + }//GEN-LAST:event_buttonZoom05ActionPerformed + + private void buttonCamtoolActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCamtoolActionPerformed + comboCamerasActionPerformed(null); + }//GEN-LAST:event_buttonCamtoolActionPerformed + + private void buttonDirectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDirectActionPerformed + comboCamerasActionPerformed(null); + }//GEN-LAST:event_buttonDirectActionPerformed + + private void comboScreenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboScreenActionPerformed + ChannelInteger setpoint = null; + try { + int index = comboScreen.getSelectedIndex(); + setpoint = new ChannelInteger(null, cameraName + ":SET_SCREEN1_POS"); + setpoint.initialize(); + if (setpoint.read() != index) { + boolean laserOn = getLaserState(); + if (laserOn) { + setLaserState(false); + } + try { + setpoint.write(index); + } finally { + if (laserOn) { + setLaserState(true); + } + } + } + screen.read(); + } catch (Exception ex) { + showException(ex); + } + if (setpoint != null) { + setpoint.close(); + } + }//GEN-LAST:event_comboScreenActionPerformed + + private void comboFilterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboFilterActionPerformed + try { + String setpoint = (String) comboFilter.getSelectedItem(); + if (!setpoint.equals(filter.read())) { + filter.write(setpoint); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_comboFilterActionPerformed + + private void checkHistogramActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkHistogramActionPerformed + try { + setHistogramVisible(checkHistogram.isSelected()); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_checkHistogramActionPerformed + + private void buttonZoom2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonZoom2ActionPerformed + renderer.setZoom(2.0); + renderer.setMode(RendererMode.Zoom); + centralizeRenderer(); + }//GEN-LAST:event_buttonZoom2ActionPerformed + + private void spinnerThresholdonChange(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerThresholdonChange + try { + if ((camera instanceof Camtool) && (((Camtool) camera).isPipelineStarted())) { + ((Camtool) camera).setThreshold((Double) spinnerThreshold.getValue()); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_spinnerThresholdonChange + + private void checkBackgroundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBackgroundActionPerformed + try { + if ((camera instanceof Camtool) && (((Camtool) camera).isPipelineStarted())) { + ((Camtool) camera).setBackgroundSubtraction(checkBackground.isSelected()); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_checkBackgroundActionPerformed + + private void checkThresholdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkThresholdActionPerformed + try { + if ((camera instanceof Camtool) && (((Camtool) camera).isPipelineStarted())) { + spinnerThreshold.setEnabled(checkThreshold.isSelected()); + ((Camtool) camera).setThreshold(checkThreshold.isSelected() ? (Double) spinnerThreshold.getValue() : null); + } + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_checkThresholdActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JRadioButton buttonAutomatic; + private javax.swing.JRadioButton buttonCamtool; + private javax.swing.JButton buttonConfig; + private javax.swing.JRadioButton buttonDirect; + private javax.swing.JToggleButton buttonFit; + private javax.swing.JRadioButton buttonFullRange; + private javax.swing.JButton buttonGrabBackground; + private javax.swing.JRadioButton buttonGrayscale; + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.ButtonGroup buttonGroup2; + private javax.swing.ButtonGroup buttonGroup3; + private javax.swing.ButtonGroup buttonGroup4; + private javax.swing.JRadioButton buttonManual; + private javax.swing.JToggleButton buttonMarker; + private javax.swing.JToggleButton buttonPause; + private javax.swing.JRadioButton buttonRainbow; + private javax.swing.JToggleButton buttonReticle; + private javax.swing.JToggleButton buttonSave; + private javax.swing.JButton buttonSetup; + private javax.swing.JRadioButton buttonTemperature; + private javax.swing.JRadioButton buttonZoom025; + private javax.swing.JRadioButton buttonZoom05; + private javax.swing.JRadioButton buttonZoom2; + private javax.swing.JRadioButton buttonZoomFit; + private javax.swing.JRadioButton buttonZoomNormal; + private javax.swing.JRadioButton buttonZoomStretch; + private javax.swing.JCheckBox checkBackground; + private javax.swing.JCheckBox checkHistogram; + private javax.swing.JCheckBox checkThreshold; + private javax.swing.JComboBox comboCameras; + private javax.swing.JComboBox comboFilter; + private javax.swing.JComboBox comboScreen; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JPanel jPanel3; + private javax.swing.JPanel jPanel4; + private javax.swing.JPanel jPanel5; + private javax.swing.JPanel jPanel6; + private javax.swing.JPanel jPanel7; + private javax.swing.JProgressBar jProgressBar1; + private javax.swing.JPanel panelScreen; + private javax.swing.JPanel panelScreen1; + private javax.swing.JPanel panelScreen2; + private ch.psi.pshell.swing.ValueSelection pauseSelection; + private ch.psi.pshell.imaging.Renderer renderer; + private javax.swing.JSpinner spinnerMax; + private javax.swing.JSpinner spinnerMin; + private javax.swing.JSpinner spinnerThreshold; + private javax.swing.JTextField textState; + private ch.psi.pshell.swing.DeviceValuePanel valueFilter; + private ch.psi.pshell.swing.DeviceValuePanel valueScreen; + // End of variables declaration//GEN-END:variables +}