/* * 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.TcpClient; 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.net.ServerSocket; 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.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 { final String CONFIG_FOLDER = "/afs/psi.ch/intranet/SF/Applications/config/camtool_n"; final String CAMERA_DEVICE_NAME = "CurrentCamera"; boolean useCamtoolStats = true; String userOverlaysConfigFile; 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; boolean requestCameraListUpdate; Integer localServerPort; Process privateServer; String serverUrl; 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("priv_srv")) { try { try(ServerSocket s = new ServerSocket(0)){ localServerPort = s.getLocalPort(); } } catch (Exception ex) { ex.printStackTrace(); } } if (App.hasArgument("srv_port")) { localServerPort = Integer.valueOf(App.getArgumentValue("srv_port")); } if (App.hasArgument("srv_url")) { serverUrl = App.getArgumentValue("srv_url"); } 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 { renderer.setShowReticle(false); 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}); } } 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 { renderer.setShowReticle(false); ((Camtool) camera).resetRoi(); } 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); } if (App.hasArgument("priv_srv")) { try { System.out.println("Starting camtool server on port: " + localServerPort); //Was creating sub-processes which cannot be destroyed. //String cmd = "cam_server"; //cmd = "source /opt/gfa/python\n" + cmd; //privateServer = Runtime.getRuntime().exec(new String[]{"bash", "-c", cmd}); String cmd = "/opt/gfa/python-3.5/2.4.1/bin/python /opt/gfa/python-3.5/latest/bin/cam_server"; cmd = cmd + " -p " + localServerPort + " -b " + CONFIG_FOLDER; privateServer = Runtime.getRuntime().exec(cmd); //System.out.println("pid = " + Sys.getPid(privateServer)); long start = System.currentTimeMillis(); while (true){ try (TcpClient c = new TcpClient("localhost", localServerPort)){ try{ c.connect(); System.out.println("Connected to camtool server on port: " + localServerPort); break; } catch (Exception ex){ } } Thread.sleep(10); if ((System.currentTimeMillis() - start) > 5000){ errorOverlay = new Text(renderer.getPenErrorText(), "Error connecting to server at port " + localServerPort , new Font("Verdana", Font.PLAIN, 12), new Point(20, 20)); renderer.addOverlay(errorOverlay); break; } } } catch (Exception ex) { ex.printStackTrace(); } } } @Override public void onStop() { try{ if (camera != null) { camera.close(); camera = null; } if (privateServer!=null){ System.out.println("Closing camtool server"); //int pid = Sys.getPid(privateServer); privateServer.destroyForcibly(); //if (pid>0){ // System.out.println("Killing pid = " + pid); // Runtime.getRuntime().exec("kill " + pid); // //} privateServer = null; } } catch (Exception ex) { ex.printStackTrace(); } 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 { usingCamtool = buttonCamtool.isSelected(); updateCameraList(); comboCameras.setEnabled(true); setComboCameraSelection(-1); if (comboCameras.getModel().getSize() > 0) { try { if (App.hasArgument("cam")) { setComboCameraSelection(App.getArgumentValue("cam")); comboCamerasActionPerformed(null); } } catch (Exception ex) { ex.printStackTrace(); } } } startTimer(1000); } DefaultComboBoxModel getCameraListFromFolder() { File[] cameraConfigFiles = new File[0]; cameraConfigFiles = IO.listFiles(CONFIG_FOLDER, 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("#") && !prefix.endsWith("_parameters")) { model.addElement(prefix); } } return model; } DefaultComboBoxModel getCameraListFromCamtool() throws IOException, InterruptedException { DefaultComboBoxModel model = new DefaultComboBoxModel(); Camtool camtool = newCamtool(); try { camtool.initialize(); List cameras = camtool.getCameras(); Collections.sort(cameras); for (String camera : cameras) { model.addElement(camera); } //model.addElement(Camtool.SIMULATION); } finally { camtool.close(); } return model; } Camtool newCamtool(){ if (serverUrl!=null){ return new Camtool(CAMERA_DEVICE_NAME, serverUrl); } return (localServerPort != null) ? new Camtool(CAMERA_DEVICE_NAME, "localhost:"+localServerPort) : new Camtool(CAMERA_DEVICE_NAME); } boolean updatingCameraSelection; void setComboCameraSelection(Object selection) { updatingCameraSelection = true; try { comboCameras.setSelectedItem(selection); } finally { updatingCameraSelection = false; } } boolean usingCamtool; void updateCameraList() { try { String selected = (String) comboCameras.getSelectedItem(); DefaultComboBoxModel model = usingCamtool ? getCameraListFromCamtool() : getCameraListFromFolder(); if (App.hasArgument("cam")) { String cam = App.getArgumentValue("cam"); if (model.getIndexOf(cam) < 0) { model.addElement(cam); } } comboCameras.setModel(model); if (selected != null) { setComboCameraSelection(selected); } } catch (Exception ex) { ex.printStackTrace(); } finally { updateStop(); } } final Object lockOverlays = new Object(); void manageFit(BufferedImage bi, Data data) { Overlay[] fo = ((bi == null) || (!showFit)) ? null : getFitOverlays(data); synchronized(lockOverlays){ renderer.updateOverlays(fo, fitOv); fitOv = fo; } } void manageUserOverlays(BufferedImage bi, Data data) { Overlay[] fo = (bi == null) ? null : getUserOverlays(data); synchronized(lockOverlays){ 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 camera; public HashMap getCalibration() { return (HashMap) camera.get("calibration"); } public ArrayList getCalibrationRefMarker() { return (ArrayList) getCalibration().get("reference_marker"); } public double getCalOffsetX() { ArrayList calibration = getCalibrationRefMarker(); double ret = -(calibration.get(0) + calibration.get(2)) / 2; return ret; } public double getCalOffsetY() { ArrayList calibration = getCalibrationRefMarker(); double ret = -(calibration.get(1) + calibration.get(3)) / 2; return ret; } public double getScaleX() { ArrayList calibration = getCalibrationRefMarker(); double width = Math.abs(calibration.get(2) - calibration.get(0)); return getCalibrationWidth() / width; } public double getScaleY() { ArrayList calibration = getCalibrationRefMarker(); double height = Math.abs(calibration.get(3) - calibration.get(1)); return getCalibrationHeight() / height; } public Double getCalibrationHeight() { return (Double) getCalibration().get("reference_marker_height"); } public Double getCalibrationWidth() { return (Double) getCalibration().get("reference_marker_width"); } public Double getCalibrationHorizontalAngle() { return (Double) getCalibration().get("horizontal_camera_angle"); } public Double getCalibrationVerticalAngle() { return (Double) getCalibration().get("vertical_camera_angle"); } public boolean getMirrorX() { Boolean ret = (Boolean) camera.get("mirror_x"); return (ret == null) ? false : ret; } public boolean getMirrorY() { Boolean ret = (Boolean) camera.get("mirror_y"); return (ret == null) ? false : ret; } public int getRotate() { Integer ret = (Integer) camera.get("rotate"); return (ret == null) ? 0 : ret; } public ArrayList getRoi() { return (ArrayList) camera.get("roi"); } public Boolean getRoiEnable() { if ((camera.get("roi_enable") == null) || (camera.get("roi") == null)) { return false; } return (Boolean) camera.get("roi_enable"); } } Thread devicesInitTask; void setCamera(String cameraName) throws IOException, InterruptedException { System.out.println("Setting camera: " + cameraName + " [" + (buttonCamtool.isSelected() ? "camtool" : "direct") + "]"); 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(); boolean changed = !String.valueOf(cameraName).equals(this.cameraName); this.cameraName = cameraName; if (changed) { if ((devicesInitTask != null) && (devicesInitTask.isAlive())) { devicesInitTask.interrupt(); } if (screen != null) { screen.close(); screen = null; } if (filter != null) { filter.close(); filter = null; } } if (cameraName == null) { return; } try { Path configFile = Paths.get(CONFIG_FOLDER, cameraName + ".json"); cameraConfigJson = configFile.toFile().exists() ? new String(Files.readAllBytes(configFile)) : null; if (buttonCamtool.isSelected()) { camera = newCamtool(); 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 { if ((cameraConfigJson == null) && (buttonDirect.isSelected())) { throw new Exception("Cannot open camera config file: " + configFile.toFile()); } camera = new PsiCamera(CAMERA_DEVICE_NAME, 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; } } camera.initialize(); camera.assertInitialized(); System.out.println("Camera initialization OK"); 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); updateCamtoolControls(); } else { ((Camtool) camera).startPipeline(cameraName, null, checkBackground.isSelected(), null, checkThreshold.isSelected() ? (Double) spinnerThreshold.getValue() : null, null); } spinnerThreshold.setEnabled(true); checkThreshold.setEnabled(true); buttonGrabBackground.setEnabled(true); ((Camtool) camera).startReceiver(); } else { if (camera.getConfig() instanceof PsiCamera.PsiCameraConfig){ if (camera.getConfig().isCalibrated()){ camera.getConfig().spatialCalOffsetX += ((PsiCamera.PsiCameraConfig)camera.getConfig()).regionStartX; camera.getConfig().spatialCalOffsetY += ((PsiCamera.PsiCameraConfig)camera.getConfig()).regionStartY; } } if (polling <= 0) { camera.setMonitored(true); } else { camera.setPolling(polling); } } buttonReticle.setEnabled(camera.getConfig().isCalibrated()); camera.getConfig().save(); renderer.setDevice(camera); renderer.setAutoScroll(true); renderer.setMarker(marker); imageSize = null; camera.addListener(new ImageListener() { @Override public void onImage(Object o, BufferedImage bi, Data data) { if (bi != null) { if ((imageSize== null) || imageSize.width!=bi.getWidth() || imageSize.height!=bi.getHeight()) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if ((renderer.getMode() == RendererMode.Zoom) || (renderer.getMode() == RendererMode.Fixed)) { centralizeRenderer(); } checkReticle(); } }); imageSize = new Dimension (bi.getWidth(), bi.getHeight()); } 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) { ex.printStackTrace(); showException(ex); renderer.clearOverlays(); updateCamtoolControls(); 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(); } onChangeColormap(null); if (changed) { comboScreen.setModel(new DefaultComboBoxModel()); comboFilter.setModel(new DefaultComboBoxModel()); //Parallelizing initialization devicesInitTask = new Thread(() -> { try { screen = new DiscretePositioner("CurrentScreen", cameraName + ":SET_SCREEN1_POS", cameraName + ":GET_SCREEN1_POS"); screen.setMonitored(true); 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.setMonitored(true); filter.initialize(); DefaultComboBoxModel model = new DefaultComboBoxModel(); for (String pos : filter.getPositions()) { model.addElement(pos); } comboFilter.setModel(model); comboFilter.setSelectedItem(filter.read()); } catch (Exception ex) { System.err.println(ex.getMessage()); filter = null; } comboFilter.setEnabled(filter != null); valueFilter.setDevice(filter); }); devicesInitTask.start(); } } volatile Dimension imageSize; 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; case Flame: buttonFlame.setSelected(true); break; case Inverted: buttonInverted.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; } boolean updatingCamtoolControls; void updateCamtoolControls() { if ((camera != null) && (camera instanceof Camtool)) { updatingCamtoolControls = true; try { checkBackground.setSelected(((Camtool) camera).getBackgroundSubtraction()); Double threshold = ((Camtool) camera).getThreshold(); checkThreshold.setSelected(threshold != null); spinnerThreshold.setValue((threshold == null) ? 0 : threshold); } catch (Exception ex) { } updatingCamtoolControls = false; } } boolean isCameraStopped() { if ((camera != null) && (camera instanceof Camtool)) { if (!((Camtool) camera).isPipelineStarted()) { return true; } } return ((camera == null) || (camera.isClosed()) || !buttonStop.isEnabled()); } void updateStop() { buttonStop.setEnabled(comboCameras.getSelectedItem() != null); buttonStop.setText(isCameraStopped() ? "Start" : "Stop"); } @Override protected void onTimer() { for (Device dev : new Device[]{screen, filter}) { if (dev != null) { dev.request(); } } textState.setText((camera == null) ? "" : camera.getState().toString()); buttonArgs.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(); updateStop(); 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}/{date}_{time}_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 > 5)) { Overlays.Text text = (Overlays.Text) fitOv[5]; 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(); buttonConfig = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); buttonArgs = new javax.swing.JButton(); buttonStop = 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(); 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(); jPanel8 = new javax.swing.JPanel(); buttonInverted = new javax.swing.JRadioButton(); buttonFlame = new javax.swing.JRadioButton(); buttonTemperature = new javax.swing.JRadioButton(); buttonRainbow = new javax.swing.JRadioButton(); buttonGrayscale = new javax.swing.JRadioButton(); 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); } }); buttonConfig.setText("Config"); buttonConfig.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonConfigActionPerformed(evt); } }); jLabel1.setText("Camera:"); buttonArgs.setText("Setup"); buttonArgs.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonArgsActionPerformed(evt); } }); buttonStop.setText("Stop"); buttonStop.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonStopActionPerformed(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(buttonArgs) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonConfig) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonStop) .addGap(18, 18, 18) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(textState, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0)) ); jPanel6Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonArgs, buttonConfig, buttonStop}); 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(buttonArgs) .addComponent(buttonConfig) .addComponent(buttonStop)) .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")); 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); } }); buttonGroup2.add(buttonInverted); buttonInverted.setText("Inverted"); buttonInverted.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { onChangeColormap(evt); } }); buttonGroup2.add(buttonFlame); buttonFlame.setText("Flame"); buttonFlame.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); } }); 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(buttonGrayscale); buttonGrayscale.setText("Grayscale"); buttonGrayscale.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { onChangeColormap(evt); } }); javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8); jPanel8.setLayout(jPanel8Layout); jPanel8Layout.setHorizontalGroup( jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel8Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel8Layout.createSequentialGroup() .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(buttonGrayscale) .addComponent(buttonInverted)) .addGap(20, 20, 20)) .addComponent(buttonFlame)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(buttonTemperature) .addComponent(buttonRainbow))) .addGap(0, 0, 0)) ); jPanel8Layout.setVerticalGroup( jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel8Layout.createSequentialGroup() .addGap(0, 0, 0) .addComponent(buttonGrayscale) .addGap(0, 0, 0) .addComponent(buttonInverted) .addGap(0, 0, 0) .addComponent(buttonFlame) .addGap(0, 0, 0) .addComponent(buttonRainbow) .addGap(0, 0, 0) .addComponent(buttonTemperature) .addGap(0, 0, 0)) ); 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.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(checkHistogram) .addGap(0, 0, Short.MAX_VALUE)) .addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(buttonAutomatic) .addComponent(buttonFullRange) .addComponent(buttonManual) .addGroup(jPanel2Layout.createSequentialGroup() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel4) .addComponent(jLabel3)) .addGap(2, 2, 2) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(spinnerMin, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerMax, 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) .addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .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() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(buttonAutomatic) .addGap(0, 0, 0) .addComponent(buttonFullRange) .addGap(0, 0, 0) .addComponent(buttonManual) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .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(jPanel8, 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) .addComponent(checkHistogram)) ); jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder("Source")); buttonGroup4.add(buttonCamtool); buttonCamtool.setSelected(true); 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 (!updatingCameraSelection) { if (!comboCameras.isEnabled()) { throw new Exception("Invalid state"); } comboCameras.setEnabled(false); buttonCamtool.setEnabled(false); buttonDirect.setEnabled(false); final String cameraName = (String) comboCameras.getSelectedItem(); new Thread(new Runnable() { @Override public void run() { if (requestCameraListUpdate) { requestCameraListUpdate = false; try { updateCameraList(); } catch (Exception ex) { ex.printStackTrace(); } } try { setCamera(cameraName); } catch (Exception ex) { ex.printStackTrace(); } finally { updateStop(); comboCameras.setEnabled(true); buttonCamtool.setEnabled(true); buttonDirect.setEnabled(true); } } }).start(); } } catch (Exception ex) { showException(ex); } }//GEN-LAST:event_comboCamerasActionPerformed private void buttonArgsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonArgsActionPerformed 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_buttonArgsActionPerformed private void buttonConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonConfigActionPerformed try { if (camera != null) { this.showDeviceConfigDialog(camera, false); } } catch (Exception ex) { showException(ex); } }//GEN-LAST:event_buttonConfigActionPerformed 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 != null) && (camera instanceof Camtool)) { if (SwingUtils.showOption(getTopLevel(), "Background", "Do you want to capture background now?", OptionType.YesNo) == OptionResult.Yes) { boolean laserOn = getLaserState(); boolean rendering = (!camera.isClosed()); if (rendering) { camera.close(); } if (laserOn) { setLaserState(false); } try { System.out.println("Grabbing background for: " + cameraName); ((Camtool) camera).grabBackground(cameraName, 5); } finally { if (laserOn) { setLaserState(true); } if (rendering) { comboCamerasActionPerformed(null); } updateStop(); } 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() || buttonInverted.isSelected()) { colorReticule = new Color(0, 192, 0); colorMarker = new Color(64, 255, 64); source.getConfig().colormap = buttonGrayscale.isSelected() ? Colormap.Grayscale : Colormap.Inverted; } else if (buttonFlame.isSelected()) { colorReticule = new Color(0, 192, 0); colorMarker = new Color(64, 255, 64); source.getConfig().colormap = Colormap.Flame; } else if (buttonTemperature.isSelected()) { source.getConfig().colormap = Colormap.Temperature; } else 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 if (!usingCamtool) { usingCamtool = true; requestCameraListUpdate = true; } comboCamerasActionPerformed(null); }//GEN-LAST:event_buttonCamtoolActionPerformed private void buttonDirectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDirectActionPerformed if (usingCamtool) { usingCamtool = false; requestCameraListUpdate = true; } comboCamerasActionPerformed(null); }//GEN-LAST:event_buttonDirectActionPerformed private void comboScreenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboScreenActionPerformed comboScreen.setEnabled(false); new Thread(new Runnable() { @Override public void run() { ChannelInteger setpoint = null; try { int index = comboScreen.getSelectedIndex(); setpoint = new ChannelInteger(null, cameraName + ":SET_SCREEN1_POS"); setpoint.initialize(); if (setpoint.read() != index) { setpoint.write(index); //Must be threaded to control the laser because of sleep in setLaserState /* boolean laserOn = getLaserState(); if (laserOn) { setLaserState(false); } try { setpoint.write(index); } finally { if (laserOn) { setLaserState(true); } } */ } screen.read(); } catch (Exception ex) { showException(ex); } finally { comboScreen.setEnabled(true); if (setpoint != null) { setpoint.close(); } } } }).start(); }//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 if (updatingCamtoolControls) { return; } try { if ((camera instanceof Camtool) && (((Camtool) camera).isPipelineStarted())) { ((Camtool) camera).setThreshold((Double) spinnerThreshold.getValue()); } } catch (Exception ex) { showException(ex); updateCamtoolControls(); } }//GEN-LAST:event_spinnerThresholdonChange private void checkBackgroundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBackgroundActionPerformed if (updatingCamtoolControls) { return; } try { if ((camera instanceof Camtool) && (((Camtool) camera).isPipelineStarted())) { ((Camtool) camera).setBackgroundSubtraction(checkBackground.isSelected()); } } catch (Exception ex) { showException(ex); updateCamtoolControls(); //There is a bug in camtool: it will flag bg extraction as on: updatingCamtoolControls = true; checkBackground.setSelected(false); updatingCamtoolControls = false; } }//GEN-LAST:event_checkBackgroundActionPerformed private void checkThresholdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkThresholdActionPerformed if (updatingCamtoolControls) { return; } 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); updateCamtoolControls(); } }//GEN-LAST:event_checkThresholdActionPerformed private void buttonStopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStopActionPerformed try { if (buttonStop.getText().equals("Stop")) { if ((camera != null) && !camera.isClosed()) { camera.close(); } } else { if (isCameraStopped()) { comboCamerasActionPerformed(null); } } } catch (Exception ex) { showException(ex); } finally { updateStop(); } }//GEN-LAST:event_buttonStopActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonArgs; 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 buttonFlame; 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 buttonInverted; 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 buttonStop; 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.JPanel jPanel8; 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 }