From 423a563488be2094ef5be60b328d9850138c174a Mon Sep 17 00:00:00 2001 From: gac-S_Changer Date: Wed, 26 Apr 2023 10:58:52 +0200 Subject: [PATCH] Preliminary support to RT mode --- src/main/java/ch/psi/mxsc/Controller.java | 2062 +++++----- src/main/java/ch/psi/mxsc/ControllerRT.java | 20 +- src/main/java/ch/psi/mxsc/MainPanel.form | 18 +- src/main/java/ch/psi/mxsc/MainPanel.java | 3700 +++++++++--------- src/main/java/ch/psi/mxsc/PuckDetection.java | 449 +-- 5 files changed, 3136 insertions(+), 3113 deletions(-) diff --git a/src/main/java/ch/psi/mxsc/Controller.java b/src/main/java/ch/psi/mxsc/Controller.java index c66eecb..ef597ea 100644 --- a/src/main/java/ch/psi/mxsc/Controller.java +++ b/src/main/java/ch/psi/mxsc/Controller.java @@ -1,1031 +1,1031 @@ -/* - * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. - */ -package ch.psi.mxsc; - -import ch.psi.mxsc.Puck.PuckType; -import ch.psi.pshell.core.CommandInfo; -import ch.psi.pshell.core.Context; -import ch.psi.pshell.core.DevicePool; -import ch.psi.pshell.core.DevicePoolListener; -import ch.psi.pshell.core.JsonSerializer; -import ch.psi.pshell.device.Device; -import ch.psi.pshell.device.DeviceAdapter; -import ch.psi.pshell.device.DeviceListener; -import ch.psi.pshell.device.GenericDevice; -import ch.psi.pshell.device.ReadbackDevice; -import ch.psi.pshell.ui.App; -import ch.psi.pshell.ui.Panel; -import ch.psi.utils.Arr; -import ch.psi.utils.Audio; -import ch.psi.utils.Chrono; -import ch.psi.utils.State; -import ch.psi.utils.swing.SwingUtils; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.script.ScriptException; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.SwingUtilities; -import javax.swing.table.DefaultTableModel; - -/** - * - */ -public class Controller { - - static Controller instance; - final BasePlate basePlate; - RoomTemperatureBasePlate roomTemperatureBasePlate; - static /*Panel*/ MainPanel mainFrame; - Device hexiposi; - Device barcode_reader; - Device barcode_reader_puck; - Device puck_detection; - JDialog dialogAskPuckDatamatrix; - String currentMountedSample; - PuckLoadingDialog dialogPuckLoading; - - public static Controller getInstance() { - return instance; - } - - public static boolean isRt() { - return Controller.mainFrame.isRt(); - } - - static void createInstance(Panel mainFrame) { - Controller.mainFrame = (MainPanel) mainFrame; - System.setProperty(GenericDevice.PROPERTY_CONFIG_PATH, Context.getInstance().getSetup().getDevicesPath()); - if (isRt()){ - instance = new ControllerRT(mainFrame); - } else { - instance = new Controller(mainFrame); - } - } - - enum PuckMountMode { - Direct, - Dialog - } - - final PuckMountMode puckMountMode = App.hasArgument("direct") ? PuckMountMode.Direct : PuckMountMode.Dialog; - - enum PuckSensorAccess { - RaspberryPi, - Esera; - } - - public enum PuckTypes { - unipuck, - minispine, - mixed - } - - PuckTypes puckTypes = PuckTypes.mixed; - - public PuckTypes getPuckTypes() { - return puckTypes; - } - - void updatePuckTypes() { - try { - puckTypes = PuckTypes.valueOf(getMainFrame().eval("get_puck_types()", true).toString()); - } catch (Exception ex) { - puckTypes = PuckTypes.mixed; - } - switch (puckTypes) { - case unipuck: - setSinglePuckType(PuckType.Unipuck); - break; - case minispine: - setSinglePuckType(PuckType.Minispine); - break; - case mixed: - //setSinglePuckType(PuckType.Unknown); - break; - } - } - - final PuckSensorAccess puckSensorAccess = PuckSensorAccess.RaspberryPi; - - static String PUCK_ESERA_DEVICE = "onewire"; - - public static final int NUMBER_OF_PUCKS = 30; - - protected Controller(){ - basePlate = new BasePlate(); - instance = this; - } - - private Controller(Panel mainFrame) { - this(); - //basePlate = new BasePlate(); - puckState = new PuckState[NUMBER_OF_PUCKS]; - for (int i = 0; i < NUMBER_OF_PUCKS; i++) { - puckState[i] = new PuckState(i + 1); - } - clearPuckStates(); - - basePlate.addListener(basePlateListener); - roomTemperatureBasePlate = new RoomTemperatureBasePlate(); - - } - - final DeviceListener basePlateListener = new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - if (value != null) { - String segment = ((Object[]) value)[0].toString(); - Integer puck = (Integer) ((Object[]) value)[1]; - Integer sample = (Integer) ((Object[]) value)[2]; - Controller.this.mainFrame.onSelectionChanged(segment, puck, sample); - } else { - Controller.this.mainFrame.onSelectionChanged(null, null, null); - } - } - }; - - String getCurrentSelection() { - Object value = basePlate.take(); - if (value != null) { - String segment = ((Object[]) value)[0].toString(); - Integer puck = (Integer) ((Object[]) value)[1]; - Integer sample = (Integer) ((Object[]) value)[2]; - String ret = segment + String.valueOf(puck); - if (sample != null) { - ret = ret + String.valueOf(sample); - } - return ret; - } - return null; - } - - public void selectPuck(Puck puck) { - getMainFrame().basePlatePanel.selectPuck(puck); - } - - public void selectSample(Sample sample) { - getMainFrame().basePlatePanel.selectSample(sample); - if ((puckPanel != null) && puckPanel.isShowing()) { - puckPanel.selectSample(sample); - } - - } - - //public Panel getMainFrame() { - public MainPanel getMainFrame() { - return mainFrame; - } - - public void updateView() { - getMainFrame().refresh(); - } - - void onInitialize(int runCount) { - getMainFrame().addDevice(basePlate); - basePlate.addListener(basePlateListener); - - if (puckSensorAccess == PuckSensorAccess.Esera) { - getMainFrame().getContext().getDevicePool().addListener(new DevicePoolListener() { - @Override - public void onDeviceAdded(GenericDevice dev) { - if (dev.getName().equals(PUCK_ESERA_DEVICE)) { - detection = new EseraDetection((Device) dev); - } - } - - @Override - public void onDeviceRemoved(GenericDevice dev) { - if (dev.getName().equals(PUCK_ESERA_DEVICE)) { - detection.close(); - detection = null; - } - } - }); - if (detection != null) { - detection.close(); - detection = null; - } - if ((Device) getMainFrame().getDevice(PUCK_ESERA_DEVICE) != null) { - detection = new EseraDetection((Device) getMainFrame().getDevice(PUCK_ESERA_DEVICE)); - } - } - - getDevicePool().addListener(new DevicePoolListener() { - @Override - public void onDeviceAdded(GenericDevice dev) { - updateDevices(); - } - - @Override - public void onDeviceRemoved(GenericDevice dev) { - } - }); - updateDevices(); - updatePuckTypes(); - clearSamplesTable(); - refreshSamplesTable(); - - } - - public Sample getMountedSample() throws Exception{ - String mountedSample = (String) Context.getInstance().evalLineBackground("get_setting('mounted_sample_position')"); - checkMountedSampleChange(currentMountedSample, mountedSample); - currentMountedSample = mountedSample; - Sample sample = basePlate.getSampleByName(currentMountedSample); - return sample; - } - - public void resetMountedSample() throws Exception{ - String mountedSample = (String) Context.getInstance().evalLineBackground("get_setting('mounted_sample_position')"); - checkMountedSampleChange(currentMountedSample, null); - Context.getInstance().evalLineBackground("set_setting('mounted_sample_position', None)"); - } - - void checkMountedSampleChange(String former, String current){ - if (((current == null) && (former!=null)) || ((current != null) && (!current.equals(former)))){ - logSampleMounted(former, current); - } - } - - public void onStateChange(State state, State former) { - if (state == State.Initializing) { - getMainFrame().removeDevice(basePlate); - } else if (state == State.Ready) { - refreshSamplesTable(); - try { - Sample sample = getMountedSample(); - if ((sample == null) && (roomTemperatureBasePlate != null)) { - sample = roomTemperatureBasePlate.getSampleByName(currentMountedSample); - roomTemperatureBasePlate.resetLoadedSample(); - } - basePlate.resetLoadedSample(); - if (sample != null) { - sample.setLoaded(true); - } - } catch (Exception ex) { - currentMountedSample = null; - basePlate.resetLoadedSample(); - } - getMainFrame().refresh(); - } - logStateChange(state); - } - - void onTimer() { - try { - setPuckLoading(getPuckLoading()); - } catch (Exception ex) { - setPuckLoading(false); - Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); - } - try { - refreshSamplesTable(); - } catch (Exception ex) { - Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); - } - } - - final DeviceListener hexiposiListener = new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updateView(); - } - }; - - final DeviceListener barcodeReaderListener = new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - if (value != null) { //Keep last value - String valStr = value.toString().trim(); - if (isBarcodeReaderScanPucks()) { - onPuckBarcode(valStr); - } else { - onSampleBarcode(valStr); - } - } - } - }; - - final DeviceListener barcodeReaderPuckListener = new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - if (value != null) { //Keep last value - String valStr = value.toString().trim(); - onPuckBarcode(valStr); - } - } - }; - - final DeviceListener puckDetectionListener = new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - if (value != null) { //Keep last value - onPuckDetectionChanged(); - } - } - }; - - void updateDevices() { - if (hexiposi != null) { - hexiposi.removeListener(hexiposiListener); - } - if (barcode_reader != null) { - hexiposi.removeListener(barcodeReaderListener); - } - if (puck_detection != null) { - hexiposi.removeListener(puckDetectionListener); - } - hexiposi = (Device) getMainFrame().getDevice("hexiposi"); - if (hexiposi != null) { - hexiposi.addListener(hexiposiListener); - } else { - Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No hexiposi detected."); - } - mainFrame.hexiposiPanel.setDevice(hexiposi); - barcode_reader = (Device) getDevice("barcode_reader"); - if (barcode_reader != null) { - barcode_reader.addListener(barcodeReaderListener); - } else { - Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No barcode_reader detected."); - } - barcode_reader_puck = (Device) getDevice("barcode_reader_puck"); - if (barcode_reader_puck != null) { - barcode_reader_puck.addListener(barcodeReaderPuckListener); - } else { - Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No barcode_reader_puck detected."); - } - puck_detection = (Device) getDevice("puck_detection"); - if (puck_detection != null) { - puck_detection.addListener(puckDetectionListener); - } else { - Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No puck_detection detected."); - } - } - - PuckState[] puckState; - - public PuckState[] getPuckStates() { - return puckState; - } - - public Puck getPuck(String name) { - return basePlate.getPuckByName(name); - } - - public Sample getSample(String name) { - return basePlate.getSampleByName(name); - } - - public BasePlate getBasePlate() { - return basePlate; - } - - EseraDetection detection; - - //From 1 to PUCKS_NUMBER - public PuckState getPuckState(int id) throws Exception { - if ((id <= 0) || (id > NUMBER_OF_PUCKS)) { - throw new Exception("invalid puck id: " + id); - } - return getPuckStates()[id - 1]; - } - - public int getPuckIndex(int address) throws Exception { - if ((address <= 0) || (address > NUMBER_OF_PUCKS)) { - throw new Exception("invalid puck address: " + address); - } - for (int i = 0; i < Puck.ADDRESSES.length; i++) { - if (Puck.ADDRESSES[i] == address) { - return i + 1; - } - } - return -1; - } - - public void clearPuckStates() { - for (PuckState puck : getPuckStates()) { - puck.clear(); - } - updateView(); - } - - public String getHexiposiPosition() { - try { - return (String) ((ReadbackDevice) hexiposi).getReadback().take(); - } catch (Exception ex) { - return null; - } - } - - public boolean isSelectedPuck(Puck puck) { - return ("" + puck.getSegment()).equalsIgnoreCase(getHexiposiPosition()); - } - - public List getSelectedPucks() { - List ret = new ArrayList<>(); - for (int i = 0; i < NUMBER_OF_PUCKS; i++) { - if (isSelectedPuck(basePlate.getPucks()[i])) { - ret.add(basePlate.getPucks()[i]); - } - } - return ret; - } - - public Boolean isLedRoomTemp() { - try { - return getMainFrame().eval("is_led_room_temp()", true).equals(true); - } catch (Exception ex) { - return null; - } - } - - public Boolean isRoomTemp() { - try { - return getMainFrame().eval("is_room_temp()", true).equals(true); - } catch (Exception ex) { - return null; - } - } - - public Boolean isBarcodeReaderScanPucks() { - try { - return getMainFrame().eval("is_barcode_reader_scan_pucks()", true).equals(true); - } catch (Exception ex) { - return false; - } - } - - public Device getPuckBarcodeReader() { - try { - return (Device) getMainFrame().eval("get_puck_barcode_reader()", true); - } catch (Exception ex) { - return null; - } - } - - public Boolean getPuckLoading() { - try { - return getMainFrame().eval("is_puck_loading()", true).equals(true); - } catch (Exception ex) { - return null; - } - } - - public String getWorkingMode() { - try { - return String.valueOf(getMainFrame().eval("robot.working_mode", true)); - } catch (Exception ex) { - return "Unknown"; - } - } - - public boolean isManualMode() { - try { - return getMainFrame().eval("is_manual_mode()", true).equals(true); - } catch (Exception ex) { - return false; - } - } - - public Boolean isRoomTempEnabled() { - try { - return getMainFrame().eval("is_room_temperature_enabled()", true).equals(true); - } catch (Exception ex) { - return null; - } - } - - public Boolean isBeamlineStatusEnabled() { - try { - return getMainFrame().eval("is_beamline_status_enabled()", true).equals(true); - } catch (Exception ex) { - return null; - } - } - - public Boolean isImagingEnabled() { - try { - return getMainFrame().eval("is_imaging_enabled()", true).equals(true); - } catch (Exception ex) { - return null; - } - } - - public void imageDetectPucks() throws Context.ContextStateException { - imageDetectPucks(null, null, null); - } - - public void imageDetectPucks(JComponent plot, JComponent renderer, JComponent text) throws Context.ContextStateException { - Map args = new HashMap(); - args.put("PLOT", plot); - args.put("RENDERER", renderer); - args.put("TEXT", text); - getMainFrame().runAsync("imgproc/LedDetectionProc", args).handle((ret, ex) -> { - if (ex == null) { - Map> map = (Map>) ret; - setImageDetection(map); - } else { - getMainFrame().showException((Exception) ex); - } - return ret; - }); - updateView(); - } - - public void clearImageDetection() throws Context.ContextStateException, ScriptException, IOException, InterruptedException { - Map> map = (Map>) getMainFrame().eval("clear_detection(None)"); - setImageDetection(map); - } - - void setImageDetection(Map> map) { - for (Puck.PuckType puckType : Puck.PuckType.values()) { - for (String name : map.get(puckType.toString())) { - Puck p = basePlate.getPuckByName(name); - if (p != null) { - p.setPuckType(puckType); - } - } - } - updateView(); - } - - void setSinglePuckType(Puck.PuckType puckType) { - for (Puck p : basePlate.getPucks()) { - p.setPuckType(puckType); - } - } - - void resetPuckTypes() { - for (Puck p : basePlate.getPucks()) { - p.setPuckType(Puck.PuckType.Unknown); - } - } - - BasePlatePanel puckPanel; - - void onPuckPressed(Puck puck) { - //JPanel panel = new SinglePuckPanel(puck); - //panel.setOpaque(false); - //getMainFrame().setDetail(panel); - if ((puckPanel == null) || (puckPanel != getMainFrame().getDetail())) { - puckPanel = new BasePlatePanel(); - puckPanel.setMode(BasePlatePanel.Mode.puck); - puckPanel.setSelectionMode(BasePlatePanel.SelectionMode.Samples); - puckPanel.setDevice((Device) getDevice("BasePlate")); - puckPanel.setEnabled(true); //TODO: Puck cannot be shared between two panels (device store single coordinates foe comparing to click) - getMainFrame().setDetail(puckPanel); - } - } - - void onPuckReleased(Puck puck) { - if (!puck.isSelected()) { - getMainFrame().setDefaultDetail(); - puckPanel = null; - } - } - - void onSamplePressed(Sample sample) { - onPuckPressed((sample==null)? null : sample.getPuck()); - } - - void onSampleReleased(Sample sample) { - onPuckReleased(sample.getPuck()); - } - - void onPlatePressed(BasePlate plate) { - if (plate.getSelectedPuck() == null) { - getMainFrame().setDefaultDetail(); - puckPanel = null; - } - } - - void onPlateReleased(BasePlate palte) { - } - - GenericDevice getDevice(String name) { - return getMainFrame().getDevice(name); - } - - DevicePool getDevicePool() { - return getMainFrame().getContext().getDevicePool(); - } - - Context getContext() { - return getMainFrame().getContext(); - } - - State getState() { - return getMainFrame().getState(); - } - - void execute(String statement) { - getMainFrame().execute(statement); - } - - void execute(String statement, boolean background) { - getMainFrame().execute(statement, background); - } - - void execute(String statement, boolean background, boolean showReturn) { - getMainFrame().execute(statement, background, showReturn); - } - - void execute(String statement, boolean background, boolean showReturn, boolean showException) { - getMainFrame().execute(statement, background, showReturn, showException); - } - - ////////////////////// Sample Info ///////////////////////////////// - String samplesTableJson; - - //final Object samplesTableLock = new Object(); - void refreshSamplesTable() { - //synchronized(samplesTableLock){ - SwingUtilities.invokeLater(() -> { - try { - if (Context.getInstance().getState().isInitialized()) { - String json = (String) Context.getInstance().evalLineBackground("get_samples_info()"); - if (!json.equals(samplesTableJson)) { - samplesTableJson = json; - - //SamplesInfo sampleInfo = (SamplesInfo) JsonSerializer.decode(json, SampleInfo.class); - SampleInfo[] samples = (SampleInfo[]) JsonSerializer.decode(json, SampleInfo[].class); - - Object[][] sampleData = new Object[samples.length][]; - for (int i = 0; i < samples.length; i++) { - sampleData[i] = samples[i].getData(); - } - getMainFrame().setSamplesTable(sampleData); - } - } - } catch (Exception ex) { - clearSamplesTable(); - Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); - } - }); - //} - } - - void clearSamplesTable() { - samplesTableJson = null; - getMainFrame().setSamplesTable(new Object[][]{}); - } - - ////////////////////// Puck Loading ///////////////////////////////// - Boolean puckLoading; - Puck.Detection[] currentDetection; - boolean puckReaderOk = true; - - void setPuckLoading(Boolean value) { - if (value == null) { - value = false; - } - if (value != puckLoading) { - if ((dialogAskPuckDatamatrix != null) && (dialogAskPuckDatamatrix.isShowing())) { - dialogAskPuckDatamatrix.setVisible(false); - } - puckLoading = value; - onPuckScanned(null); - Device reader = getPuckBarcodeReader(); - if (reader != null) { - final String name = reader.getName(); - BiFunction errorHandler = (BiFunction) (ret, ex) -> { - if (ex != null) { - if (puckReaderOk) { - Logger.getLogger(Controller.class.getName()).warning("Communication failure: " + name); - } - puckLoading = null; - puckReaderOk = false; - } else { - if (!puckReaderOk) { - Logger.getLogger(Controller.class.getName()).warning("Communication resumed: " + name); - } - puckReaderOk = true; - } - return ret; - }; - try { - if (puckLoading) { - getMainFrame().evalAsync(name + ".enable(); " + name + ".polling = 100", true).handle(errorHandler); - currentDetection = basePlate.getDetection(); - } else if (getState().isInitialized()) { - getMainFrame().evalAsync(name + ".polling = 0; " + name + ".disable()", true).handle(errorHandler); - onPuckScanned(null); - } - getMainFrame().evalAsync("onPuckLoadingChange(" + (puckLoading ? "True" : "False") + ")"); - } catch (Exception ex) { - errorHandler.apply(null, ex); - } - onPuckLoadingModeChange(puckLoading); - } - } - } - - public boolean isPuckLoading() { - if (puckLoading == null) { - return false; - } - return puckLoading; - } - - void playSound(String name) { - try { - Audio.playFile(new File(Context.getInstance().getSetup().expandPath("{home}/sounds/" + name + ".wav")), false); - } catch (Exception ex) { - Logger.getLogger(Controller.class.getName()).log(Level.FINE, null, ex); - } - } - - public void onPuckBarcode(String datamatrix) { - if (isPuckLoading()) { - playSound("scanned"); - System.out.println("Detected Puck: " + datamatrix); - onPuckScanned(datamatrix); - } - } - - public void onSampleBarcode(String datamatrix) { - getMainFrame().setSampleDatamatrix(datamatrix); - System.out.println("Detected Sample: " + datamatrix); - } - - void onPuckDetectionChanged() { - if (isPuckLoading()) { - Puck.Detection[] detection = basePlate.getDetection(); - for (int i = 0; i < Controller.NUMBER_OF_PUCKS; i++) { - Puck puck = basePlate.getPucks()[i]; - //Only manage pucks for current hexiposi position - if (isSelectedPuck(puck)) { - boolean detectedPuckInserted = (currentDetection[i] != Puck.Detection.Present) && (detection[i] == Puck.Detection.Present); - boolean detectedPuckRemoved = (currentDetection[i] != Puck.Detection.Empty) && (detection[i] == Puck.Detection.Empty); - if (detectedPuckInserted) { - onPuckInserted(puck); - - } else if (detectedPuckRemoved) { - playSound("unmounted"); - onPuckUnmounted(puck); - } - } - } - - currentDetection = detection; - } - } - - public void onPuckInserted(Puck puck) { - playSound("mounted"); - String datamatrix = getMainFrame().getPuckDatamatrix(); - logPuckDetectionChange(puck, true); - onPuckScanned(null); - onPuckMounted(puck, datamatrix); - } - - public void onPuckRemoved(Puck puck) { - playSound("unmounted"); - logPuckDetectionChange(puck, false); - onPuckUnmounted(puck); - } - - void linkPuckDatamatrix(Puck puck, String datamatrix, boolean showMessage) { -// if ( ((puck.getId()==null) && (datamatrix!=null)) || -// (puck.getId()!=null) && (!puck.getId().equals(datamatrix))){ - String puckName = (puck == null) ? "" : puck.getName(); - if (datamatrix == null) { - datamatrix = ""; - } - datamatrix = datamatrix.trim(); - - System.out.println("Setting datamatrix '" + datamatrix + "' to puck: " + puckName); - - try { - Context.getInstance().evalLineBackground("set_puck_datamatrix('" + puckName + "','" + datamatrix + "')"); - if (puck != null) { - puck.setId(datamatrix); - } else { - basePlate.clearId(datamatrix); - } - - if (showMessage && (puck != null) && !datamatrix.isEmpty()) { - SwingUtils.showMessage(getMainFrame(), "Puck loading", - "Puck '" + datamatrix + "' set to position " + puckName, - 5000); - } - } catch (Exception ex) { - Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); - } - - refreshSamplesTable(); - getMainFrame().refresh(); -// } - } - - Map getPuckDatamatrix() { - try { - return (Map) Context.getInstance().evalLineBackground("get_puck_datamatrix()"); - } catch (Exception ex) { - return null; - } - } - - Map getPuckDatamatrixInfo() { - try { - return (Map) Context.getInstance().evalLineBackground("get_puck_datamatrix_info()"); - } catch (Exception ex) { - return null; - } - } - - void askPuckDatamatrix(Puck puck) { - if ((dialogAskPuckDatamatrix != null) && (dialogAskPuckDatamatrix.isShowing())) { - dialogAskPuckDatamatrix.setVisible(false); - } - if (puck == null) { - return; - } - Map dms = getPuckDatamatrix(); - if ((dms != null) && (dms.size() > 0)) { - JTable table = new JTable(); - List list = new ArrayList<>(); - for (Object dm : dms.keySet()) { - Object address = dms.get(dm); - list.add(new Object[]{dm, address}); - } - table.setModel(new DefaultTableModel( - list.toArray(new Object[0][]), - new String[]{ - "Datamatrix", "Address" - } - ) { - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } - }); - JLabel label = new JLabel("Select datamatrix for puck at " + puck.getName() + ":"); - label.setFont(label.getFont().deriveFont(20.0f)); - table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - table.setFont(table.getFont().deriveFont(28.0f)); - table.setRowHeight(40); - JScrollPane scrollPane = new JScrollPane(); - scrollPane.setViewportView(table); - JPanel panel = new JPanel(); - JButton ok = new JButton("OK"); - JButton cancel = new JButton("Cancel"); - JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout(new BorderLayout()); - buttonPanel.add(cancel, BorderLayout.WEST); - buttonPanel.add(ok, BorderLayout.EAST); - panel.setLayout(new BorderLayout()); - panel.add(label, BorderLayout.NORTH); - panel.add(scrollPane, BorderLayout.CENTER); - panel.add(buttonPanel, BorderLayout.SOUTH); - ok.setPreferredSize(new Dimension(200, ok.getPreferredSize().height)); - cancel.setPreferredSize(new Dimension(200, ok.getPreferredSize().height)); - dialogAskPuckDatamatrix = SwingUtils.showDialog(getMainFrame().getTopLevel(), "Puck Loading", new Dimension(400, 600), panel); - cancel.addActionListener((ev) -> { - dialogAskPuckDatamatrix.setVisible(false); - }); - ok.addActionListener((ev) -> { - int row = table.getSelectedRow(); - String dm = (row >= 0) ? String.valueOf(table.getValueAt(row, 0)) : null; - dialogAskPuckDatamatrix.setVisible(false); - if (dm != null) { - linkPuckDatamatrix(puck, dm, true); - } - }); - - } - - } - - void showDialogPuckLoading() { - if ((dialogPuckLoading != null) && (dialogPuckLoading.isVisible())) { - return; - } - dialogPuckLoading = new PuckLoadingDialog(mainFrame.getTopLevel(), false); - dialogPuckLoading.setLocationRelativeTo(mainFrame); - dialogPuckLoading.setVisible(true); - } - - void hideDialogPuckLoading() { - if (dialogPuckLoading != null) { - dialogPuckLoading.setVisible(false); - dialogPuckLoading.dispose(); - dialogPuckLoading = null; - } - } - - void onPuckLoadingModeChange(boolean puckLoadMode) { - if (puckMountMode == PuckMountMode.Dialog) { - if (puckLoadMode) { - showDialogPuckLoading(); - } else { - hideDialogPuckLoading(); - } - } - } - - void onPuckScanned(String datamatrix) { - if (isPuckLoading()) { - getMainFrame().setPuckDatamatrix(datamatrix); - if (puckMountMode == PuckMountMode.Dialog) { - showDialogPuckLoading(); - dialogPuckLoading.onPuckScanned(datamatrix); - } - } else { - getMainFrame().setPuckDatamatrix(null); - } - } - - void onPuckMounted(Puck puck, String datamatrix) { - if (isPuckLoading()) { - if (puckMountMode == PuckMountMode.Dialog) { - showDialogPuckLoading(); - dialogPuckLoading.onPuckMounted(puck, datamatrix); - } else { - if (!datamatrix.isEmpty()) { - linkPuckDatamatrix(puck, datamatrix, true); - } else { - askPuckDatamatrix(puck); - } - } - } - } - - void onPuckUnmounted(Puck puck) { - if (isPuckLoading()) { - try{ - Sample sample = getMountedSample(); - if ((sample!=null) && (sample.getPuck() == puck)){ - resetMountedSample(); - sample.setLoaded(false); - SwingUtilities.invokeLater(()->{; - getMainFrame().refresh(); - }); - } - } catch (Exception ex) { - Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); - } - if (puckMountMode == PuckMountMode.Dialog) { - showDialogPuckLoading(); - dialogPuckLoading.onPuckUnmounted(puck); - } else { - linkPuckDatamatrix(puck, null, true); - } - } - } - - void logSampleMounted(String former, String current){ - logEvent((current!=null) ? "Sample Mounted" : "Sample Unmounted", former, current); - } - - void logPuckDetectionChange(Puck puck, boolean mounted){ - logEvent(mounted ? "Puck Mounted" : "Puck Unmounted", puck.getName(), isPuckLoading() ? "Puck Loading" : ""); - } - - void logStateChange(State state){ - String command = ""; - if (state==State.Busy){ - CommandInfo info = Context.getInstance().getCommandManager().getCurrentCommand(true); - if (info != null){ - command = (info.script != null) ? info.script : info.command; - } - } - logEvent("State Change", state.toString(), command); - } - - public void logEvent(String... event){ - try{ - long now = System.currentTimeMillis(); - Path path = Paths.get(Context.getInstance().getSetup().getOutputPath(), "events", Chrono.getTimeStr(now,"YYYYMMdd") + ".txt"); - path.toFile().getParentFile().mkdirs(); - - String[] data = new String[]{ - Chrono.getTimeStr(now, "dd/MM/YY HH:mm:ss.SSS"), - }; - data = Arr.append(data, event); - Files.write(path, String.join("\t", data).getBytes(), path.toFile().exists() ? StandardOpenOption.APPEND : StandardOpenOption.CREATE); - Files.write(path, System.lineSeparator().getBytes(), StandardOpenOption.APPEND); - } catch(Exception ex){ - Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); - } - } -} +/* + * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. + */ +package ch.psi.mxsc; + +import ch.psi.mxsc.Puck.PuckType; +import ch.psi.pshell.core.CommandInfo; +import ch.psi.pshell.core.Context; +import ch.psi.pshell.core.DevicePool; +import ch.psi.pshell.core.DevicePoolListener; +import ch.psi.pshell.core.JsonSerializer; +import ch.psi.pshell.device.Device; +import ch.psi.pshell.device.DeviceAdapter; +import ch.psi.pshell.device.DeviceListener; +import ch.psi.pshell.device.GenericDevice; +import ch.psi.pshell.device.ReadbackDevice; +import ch.psi.pshell.ui.App; +import ch.psi.pshell.ui.Panel; +import ch.psi.utils.Arr; +import ch.psi.utils.Audio; +import ch.psi.utils.Chrono; +import ch.psi.utils.State; +import ch.psi.utils.swing.SwingUtils; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.script.ScriptException; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.table.DefaultTableModel; + +/** + * + */ +public class Controller { + + static Controller instance; + final BasePlate basePlate; + RoomTemperatureBasePlate roomTemperatureBasePlate; + static /*Panel*/ MainPanel mainFrame; + Device hexiposi; + Device barcode_reader; + Device barcode_reader_puck; + Device puck_detection; + JDialog dialogAskPuckDatamatrix; + String currentMountedSample; + PuckLoadingDialog dialogPuckLoading; + + public static Controller getInstance() { + return instance; + } + + public static boolean isRt() { + return Controller.mainFrame.isRt(); + } + + static void createInstance(Panel mainFrame) { + Controller.mainFrame = (MainPanel) mainFrame; + System.setProperty(GenericDevice.PROPERTY_CONFIG_PATH, Context.getInstance().getSetup().getDevicesPath()); + if (isRt()){ + instance = new ControllerRT(mainFrame); + } else { + instance = new Controller(mainFrame); + } + } + + enum PuckMountMode { + Direct, + Dialog + } + + final PuckMountMode puckMountMode = App.hasArgument("direct") ? PuckMountMode.Direct : PuckMountMode.Dialog; + + enum PuckSensorAccess { + RaspberryPi, + Esera; + } + + public enum PuckTypes { + unipuck, + minispine, + mixed + } + + PuckTypes puckTypes = PuckTypes.mixed; + + public PuckTypes getPuckTypes() { + return puckTypes; + } + + void updatePuckTypes() { + try { + puckTypes = PuckTypes.valueOf(getMainFrame().eval("get_puck_types()", true).toString()); + } catch (Exception ex) { + puckTypes = PuckTypes.mixed; + } + switch (puckTypes) { + case unipuck: + setSinglePuckType(PuckType.Unipuck); + break; + case minispine: + setSinglePuckType(PuckType.Minispine); + break; + case mixed: + //setSinglePuckType(PuckType.Unknown); + break; + } + } + + final PuckSensorAccess puckSensorAccess = PuckSensorAccess.RaspberryPi; + + static String PUCK_ESERA_DEVICE = "onewire"; + + public static final int NUMBER_OF_PUCKS = BasePlate.numberOfPucks; + + protected Controller(){ + basePlate = new BasePlate(); + instance = this; + puckState = new PuckState[NUMBER_OF_PUCKS]; + for (int i = 0; i < NUMBER_OF_PUCKS; i++) { + puckState[i] = new PuckState(i + 1); + } + } + + private Controller(Panel mainFrame) { + this(); + //basePlate = new BasePlate(); + clearPuckStates(); + + basePlate.addListener(basePlateListener); + roomTemperatureBasePlate = new RoomTemperatureBasePlate(); + + } + + final DeviceListener basePlateListener = new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + if (value != null) { + String segment = ((Object[]) value)[0].toString(); + Integer puck = (Integer) ((Object[]) value)[1]; + Integer sample = (Integer) ((Object[]) value)[2]; + Controller.this.mainFrame.onSelectionChanged(segment, puck, sample); + } else { + Controller.this.mainFrame.onSelectionChanged(null, null, null); + } + } + }; + + String getCurrentSelection() { + Object value = basePlate.take(); + if (value != null) { + String segment = ((Object[]) value)[0].toString(); + Integer puck = (Integer) ((Object[]) value)[1]; + Integer sample = (Integer) ((Object[]) value)[2]; + String ret = segment + String.valueOf(puck); + if (sample != null) { + ret = ret + String.valueOf(sample); + } + return ret; + } + return null; + } + + public void selectPuck(Puck puck) { + getMainFrame().basePlatePanel.selectPuck(puck); + } + + public void selectSample(Sample sample) { + getMainFrame().basePlatePanel.selectSample(sample); + if ((puckPanel != null) && puckPanel.isShowing()) { + puckPanel.selectSample(sample); + } + + } + + //public Panel getMainFrame() { + public MainPanel getMainFrame() { + return mainFrame; + } + + public void updateView() { + getMainFrame().refresh(); + } + + void onInitialize(int runCount) { + getMainFrame().addDevice(basePlate); + basePlate.addListener(basePlateListener); + + if (puckSensorAccess == PuckSensorAccess.Esera) { + getMainFrame().getContext().getDevicePool().addListener(new DevicePoolListener() { + @Override + public void onDeviceAdded(GenericDevice dev) { + if (dev.getName().equals(PUCK_ESERA_DEVICE)) { + detection = new EseraDetection((Device) dev); + } + } + + @Override + public void onDeviceRemoved(GenericDevice dev) { + if (dev.getName().equals(PUCK_ESERA_DEVICE)) { + detection.close(); + detection = null; + } + } + }); + if (detection != null) { + detection.close(); + detection = null; + } + if ((Device) getMainFrame().getDevice(PUCK_ESERA_DEVICE) != null) { + detection = new EseraDetection((Device) getMainFrame().getDevice(PUCK_ESERA_DEVICE)); + } + } + + getDevicePool().addListener(new DevicePoolListener() { + @Override + public void onDeviceAdded(GenericDevice dev) { + updateDevices(); + } + + @Override + public void onDeviceRemoved(GenericDevice dev) { + } + }); + updateDevices(); + updatePuckTypes(); + clearSamplesTable(); + refreshSamplesTable(); + + } + + public Sample getMountedSample() throws Exception{ + String mountedSample = (String) Context.getInstance().evalLineBackground("get_setting('mounted_sample_position')"); + checkMountedSampleChange(currentMountedSample, mountedSample); + currentMountedSample = mountedSample; + Sample sample = basePlate.getSampleByName(currentMountedSample); + return sample; + } + + public void resetMountedSample() throws Exception{ + String mountedSample = (String) Context.getInstance().evalLineBackground("get_setting('mounted_sample_position')"); + checkMountedSampleChange(currentMountedSample, null); + Context.getInstance().evalLineBackground("set_setting('mounted_sample_position', None)"); + } + + void checkMountedSampleChange(String former, String current){ + if (((current == null) && (former!=null)) || ((current != null) && (!current.equals(former)))){ + logSampleMounted(former, current); + } + } + + public void onStateChange(State state, State former) { + if (state == State.Initializing) { + getMainFrame().removeDevice(basePlate); + } else if (state == State.Ready) { + refreshSamplesTable(); + try { + Sample sample = getMountedSample(); + if ((sample == null) && (roomTemperatureBasePlate != null)) { + sample = roomTemperatureBasePlate.getSampleByName(currentMountedSample); + roomTemperatureBasePlate.resetLoadedSample(); + } + basePlate.resetLoadedSample(); + if (sample != null) { + sample.setLoaded(true); + } + } catch (Exception ex) { + currentMountedSample = null; + basePlate.resetLoadedSample(); + } + getMainFrame().refresh(); + } + logStateChange(state); + } + + void onTimer() { + try { + setPuckLoading(getPuckLoading()); + } catch (Exception ex) { + setPuckLoading(false); + Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); + } + try { + refreshSamplesTable(); + } catch (Exception ex) { + Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); + } + } + + final DeviceListener hexiposiListener = new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updateView(); + } + }; + + final DeviceListener barcodeReaderListener = new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + if (value != null) { //Keep last value + String valStr = value.toString().trim(); + if (isBarcodeReaderScanPucks()) { + onPuckBarcode(valStr); + } else { + onSampleBarcode(valStr); + } + } + } + }; + + final DeviceListener barcodeReaderPuckListener = new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + if (value != null) { //Keep last value + String valStr = value.toString().trim(); + onPuckBarcode(valStr); + } + } + }; + + final DeviceListener puckDetectionListener = new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + if (value != null) { //Keep last value + onPuckDetectionChanged(); + } + } + }; + + void updateDevices() { + if (hexiposi != null) { + hexiposi.removeListener(hexiposiListener); + } + if (barcode_reader != null) { + hexiposi.removeListener(barcodeReaderListener); + } + if (puck_detection != null) { + hexiposi.removeListener(puckDetectionListener); + } + hexiposi = (Device) getMainFrame().getDevice("hexiposi"); + if (hexiposi != null) { + hexiposi.addListener(hexiposiListener); + } else { + Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No hexiposi detected."); + } + mainFrame.hexiposiPanel.setDevice(hexiposi); + barcode_reader = (Device) getDevice("barcode_reader"); + if (barcode_reader != null) { + barcode_reader.addListener(barcodeReaderListener); + } else { + Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No barcode_reader detected."); + } + barcode_reader_puck = (Device) getDevice("barcode_reader_puck"); + if (barcode_reader_puck != null) { + barcode_reader_puck.addListener(barcodeReaderPuckListener); + } else { + Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No barcode_reader_puck detected."); + } + puck_detection = (Device) getDevice("puck_detection"); + if (puck_detection != null) { + puck_detection.addListener(puckDetectionListener); + } else { + Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "No puck_detection detected."); + } + } + + PuckState[] puckState; + + public PuckState[] getPuckStates() { + return puckState; + } + + public Puck getPuck(String name) { + return basePlate.getPuckByName(name); + } + + public Sample getSample(String name) { + return basePlate.getSampleByName(name); + } + + public BasePlate getBasePlate() { + return basePlate; + } + + EseraDetection detection; + + //From 1 to PUCKS_NUMBER + public PuckState getPuckState(int id) throws Exception { + if ((id <= 0) || (id > NUMBER_OF_PUCKS)) { + throw new Exception("invalid puck id: " + id); + } + return getPuckStates()[id - 1]; + } + + public int getPuckIndex(int address) throws Exception { + if ((address <= 0) || (address > NUMBER_OF_PUCKS)) { + throw new Exception("invalid puck address: " + address); + } + for (int i = 0; i < Puck.ADDRESSES.length; i++) { + if (Puck.ADDRESSES[i] == address) { + return i + 1; + } + } + return -1; + } + + public void clearPuckStates() { + for (PuckState puck : getPuckStates()) { + puck.clear(); + } + updateView(); + } + + public String getHexiposiPosition() { + try { + return (String) ((ReadbackDevice) hexiposi).getReadback().take(); + } catch (Exception ex) { + return null; + } + } + + public boolean isSelectedPuck(Puck puck) { + return ("" + puck.getSegment()).equalsIgnoreCase(getHexiposiPosition()); + } + + public List getSelectedPucks() { + List ret = new ArrayList<>(); + for (int i = 0; i < NUMBER_OF_PUCKS; i++) { + if (isSelectedPuck(basePlate.getPucks()[i])) { + ret.add(basePlate.getPucks()[i]); + } + } + return ret; + } + + public Boolean isLedRoomTemp() { + try { + return getMainFrame().eval("is_led_room_temp()", true).equals(true); + } catch (Exception ex) { + return null; + } + } + + public Boolean isRoomTemp() { + try { + return getMainFrame().eval("is_room_temp()", true).equals(true); + } catch (Exception ex) { + return null; + } + } + + public Boolean isBarcodeReaderScanPucks() { + try { + return getMainFrame().eval("is_barcode_reader_scan_pucks()", true).equals(true); + } catch (Exception ex) { + return false; + } + } + + public Device getPuckBarcodeReader() { + try { + return (Device) getMainFrame().eval("get_puck_barcode_reader()", true); + } catch (Exception ex) { + return null; + } + } + + public Boolean getPuckLoading() { + try { + return getMainFrame().eval("is_puck_loading()", true).equals(true); + } catch (Exception ex) { + return null; + } + } + + public String getWorkingMode() { + try { + return String.valueOf(getMainFrame().eval("robot.working_mode", true)); + } catch (Exception ex) { + return "Unknown"; + } + } + + public boolean isManualMode() { + try { + return getMainFrame().eval("is_manual_mode()", true).equals(true); + } catch (Exception ex) { + return false; + } + } + + public Boolean isRoomTempEnabled() { + try { + return getMainFrame().eval("is_room_temperature_enabled()", true).equals(true); + } catch (Exception ex) { + return null; + } + } + + public Boolean isBeamlineStatusEnabled() { + try { + return getMainFrame().eval("is_beamline_status_enabled()", true).equals(true); + } catch (Exception ex) { + return null; + } + } + + public Boolean isImagingEnabled() { + try { + return getMainFrame().eval("is_imaging_enabled()", true).equals(true); + } catch (Exception ex) { + return null; + } + } + + public void imageDetectPucks() throws Context.ContextStateException { + imageDetectPucks(null, null, null); + } + + public void imageDetectPucks(JComponent plot, JComponent renderer, JComponent text) throws Context.ContextStateException { + Map args = new HashMap(); + args.put("PLOT", plot); + args.put("RENDERER", renderer); + args.put("TEXT", text); + getMainFrame().runAsync("imgproc/LedDetectionProc", args).handle((ret, ex) -> { + if (ex == null) { + Map> map = (Map>) ret; + setImageDetection(map); + } else { + getMainFrame().showException((Exception) ex); + } + return ret; + }); + updateView(); + } + + public void clearImageDetection() throws Context.ContextStateException, ScriptException, IOException, InterruptedException { + Map> map = (Map>) getMainFrame().eval("clear_detection(None)"); + setImageDetection(map); + } + + void setImageDetection(Map> map) { + for (Puck.PuckType puckType : Puck.PuckType.values()) { + for (String name : map.get(puckType.toString())) { + Puck p = basePlate.getPuckByName(name); + if (p != null) { + p.setPuckType(puckType); + } + } + } + updateView(); + } + + void setSinglePuckType(Puck.PuckType puckType) { + for (Puck p : basePlate.getPucks()) { + p.setPuckType(puckType); + } + } + + void resetPuckTypes() { + for (Puck p : basePlate.getPucks()) { + p.setPuckType(Puck.PuckType.Unknown); + } + } + + BasePlatePanel puckPanel; + + void onPuckPressed(Puck puck) { + //JPanel panel = new SinglePuckPanel(puck); + //panel.setOpaque(false); + //getMainFrame().setDetail(panel); + if ((puckPanel == null) || (puckPanel != getMainFrame().getDetail())) { + puckPanel = new BasePlatePanel(); + puckPanel.setMode(BasePlatePanel.Mode.puck); + puckPanel.setSelectionMode(BasePlatePanel.SelectionMode.Samples); + puckPanel.setDevice((Device) getDevice("BasePlate")); + puckPanel.setEnabled(true); //TODO: Puck cannot be shared between two panels (device store single coordinates foe comparing to click) + getMainFrame().setDetail(puckPanel); + } + } + + void onPuckReleased(Puck puck) { + if (!puck.isSelected()) { + getMainFrame().setDefaultDetail(); + puckPanel = null; + } + } + + void onSamplePressed(Sample sample) { + onPuckPressed((sample==null)? null : sample.getPuck()); + } + + void onSampleReleased(Sample sample) { + onPuckReleased(sample.getPuck()); + } + + void onPlatePressed(BasePlate plate) { + if (plate.getSelectedPuck() == null) { + getMainFrame().setDefaultDetail(); + puckPanel = null; + } + } + + void onPlateReleased(BasePlate palte) { + } + + GenericDevice getDevice(String name) { + return getMainFrame().getDevice(name); + } + + DevicePool getDevicePool() { + return getMainFrame().getContext().getDevicePool(); + } + + Context getContext() { + return getMainFrame().getContext(); + } + + State getState() { + return getMainFrame().getState(); + } + + void execute(String statement) { + getMainFrame().execute(statement); + } + + void execute(String statement, boolean background) { + getMainFrame().execute(statement, background); + } + + void execute(String statement, boolean background, boolean showReturn) { + getMainFrame().execute(statement, background, showReturn); + } + + void execute(String statement, boolean background, boolean showReturn, boolean showException) { + getMainFrame().execute(statement, background, showReturn, showException); + } + + ////////////////////// Sample Info ///////////////////////////////// + String samplesTableJson; + + //final Object samplesTableLock = new Object(); + void refreshSamplesTable() { + //synchronized(samplesTableLock){ + SwingUtilities.invokeLater(() -> { + try { + if (Context.getInstance().getState().isInitialized()) { + String json = (String) Context.getInstance().evalLineBackground("get_samples_info()"); + if (!json.equals(samplesTableJson)) { + samplesTableJson = json; + + //SamplesInfo sampleInfo = (SamplesInfo) JsonSerializer.decode(json, SampleInfo.class); + SampleInfo[] samples = (SampleInfo[]) JsonSerializer.decode(json, SampleInfo[].class); + + Object[][] sampleData = new Object[samples.length][]; + for (int i = 0; i < samples.length; i++) { + sampleData[i] = samples[i].getData(); + } + getMainFrame().setSamplesTable(sampleData); + } + } + } catch (Exception ex) { + clearSamplesTable(); + Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); + } + }); + //} + } + + void clearSamplesTable() { + samplesTableJson = null; + getMainFrame().setSamplesTable(new Object[][]{}); + } + + ////////////////////// Puck Loading ///////////////////////////////// + Boolean puckLoading; + Puck.Detection[] currentDetection; + boolean puckReaderOk = true; + + void setPuckLoading(Boolean value) { + if (value == null) { + value = false; + } + if (value != puckLoading) { + if ((dialogAskPuckDatamatrix != null) && (dialogAskPuckDatamatrix.isShowing())) { + dialogAskPuckDatamatrix.setVisible(false); + } + puckLoading = value; + onPuckScanned(null); + Device reader = getPuckBarcodeReader(); + if (reader != null) { + final String name = reader.getName(); + BiFunction errorHandler = (BiFunction) (ret, ex) -> { + if (ex != null) { + if (puckReaderOk) { + Logger.getLogger(Controller.class.getName()).warning("Communication failure: " + name); + } + puckLoading = null; + puckReaderOk = false; + } else { + if (!puckReaderOk) { + Logger.getLogger(Controller.class.getName()).warning("Communication resumed: " + name); + } + puckReaderOk = true; + } + return ret; + }; + try { + if (puckLoading) { + getMainFrame().evalAsync(name + ".enable(); " + name + ".polling = 100", true).handle(errorHandler); + currentDetection = basePlate.getDetection(); + } else if (getState().isInitialized()) { + getMainFrame().evalAsync(name + ".polling = 0; " + name + ".disable()", true).handle(errorHandler); + onPuckScanned(null); + } + getMainFrame().evalAsync("onPuckLoadingChange(" + (puckLoading ? "True" : "False") + ")"); + } catch (Exception ex) { + errorHandler.apply(null, ex); + } + onPuckLoadingModeChange(puckLoading); + } + } + } + + public boolean isPuckLoading() { + if (puckLoading == null) { + return false; + } + return puckLoading; + } + + void playSound(String name) { + try { + Audio.playFile(new File(Context.getInstance().getSetup().expandPath("{home}/sounds/" + name + ".wav")), false); + } catch (Exception ex) { + Logger.getLogger(Controller.class.getName()).log(Level.FINE, null, ex); + } + } + + public void onPuckBarcode(String datamatrix) { + if (isPuckLoading()) { + playSound("scanned"); + System.out.println("Detected Puck: " + datamatrix); + onPuckScanned(datamatrix); + } + } + + public void onSampleBarcode(String datamatrix) { + getMainFrame().setSampleDatamatrix(datamatrix); + System.out.println("Detected Sample: " + datamatrix); + } + + void onPuckDetectionChanged() { + if (isPuckLoading()) { + Puck.Detection[] detection = basePlate.getDetection(); + for (int i = 0; i < Controller.NUMBER_OF_PUCKS; i++) { + Puck puck = basePlate.getPucks()[i]; + //Only manage pucks for current hexiposi position + if (isSelectedPuck(puck)) { + boolean detectedPuckInserted = (currentDetection[i] != Puck.Detection.Present) && (detection[i] == Puck.Detection.Present); + boolean detectedPuckRemoved = (currentDetection[i] != Puck.Detection.Empty) && (detection[i] == Puck.Detection.Empty); + if (detectedPuckInserted) { + onPuckInserted(puck); + + } else if (detectedPuckRemoved) { + playSound("unmounted"); + onPuckUnmounted(puck); + } + } + } + + currentDetection = detection; + } + } + + public void onPuckInserted(Puck puck) { + playSound("mounted"); + String datamatrix = getMainFrame().getPuckDatamatrix(); + logPuckDetectionChange(puck, true); + onPuckScanned(null); + onPuckMounted(puck, datamatrix); + } + + public void onPuckRemoved(Puck puck) { + playSound("unmounted"); + logPuckDetectionChange(puck, false); + onPuckUnmounted(puck); + } + + void linkPuckDatamatrix(Puck puck, String datamatrix, boolean showMessage) { +// if ( ((puck.getId()==null) && (datamatrix!=null)) || +// (puck.getId()!=null) && (!puck.getId().equals(datamatrix))){ + String puckName = (puck == null) ? "" : puck.getName(); + if (datamatrix == null) { + datamatrix = ""; + } + datamatrix = datamatrix.trim(); + + System.out.println("Setting datamatrix '" + datamatrix + "' to puck: " + puckName); + + try { + Context.getInstance().evalLineBackground("set_puck_datamatrix('" + puckName + "','" + datamatrix + "')"); + if (puck != null) { + puck.setId(datamatrix); + } else { + basePlate.clearId(datamatrix); + } + + if (showMessage && (puck != null) && !datamatrix.isEmpty()) { + SwingUtils.showMessage(getMainFrame(), "Puck loading", + "Puck '" + datamatrix + "' set to position " + puckName, + 5000); + } + } catch (Exception ex) { + Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); + } + + refreshSamplesTable(); + getMainFrame().refresh(); +// } + } + + Map getPuckDatamatrix() { + try { + return (Map) Context.getInstance().evalLineBackground("get_puck_datamatrix()"); + } catch (Exception ex) { + return null; + } + } + + Map getPuckDatamatrixInfo() { + try { + return (Map) Context.getInstance().evalLineBackground("get_puck_datamatrix_info()"); + } catch (Exception ex) { + return null; + } + } + + void askPuckDatamatrix(Puck puck) { + if ((dialogAskPuckDatamatrix != null) && (dialogAskPuckDatamatrix.isShowing())) { + dialogAskPuckDatamatrix.setVisible(false); + } + if (puck == null) { + return; + } + Map dms = getPuckDatamatrix(); + if ((dms != null) && (dms.size() > 0)) { + JTable table = new JTable(); + List list = new ArrayList<>(); + for (Object dm : dms.keySet()) { + Object address = dms.get(dm); + list.add(new Object[]{dm, address}); + } + table.setModel(new DefaultTableModel( + list.toArray(new Object[0][]), + new String[]{ + "Datamatrix", "Address" + } + ) { + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + }); + JLabel label = new JLabel("Select datamatrix for puck at " + puck.getName() + ":"); + label.setFont(label.getFont().deriveFont(20.0f)); + table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + table.setFont(table.getFont().deriveFont(28.0f)); + table.setRowHeight(40); + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setViewportView(table); + JPanel panel = new JPanel(); + JButton ok = new JButton("OK"); + JButton cancel = new JButton("Cancel"); + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new BorderLayout()); + buttonPanel.add(cancel, BorderLayout.WEST); + buttonPanel.add(ok, BorderLayout.EAST); + panel.setLayout(new BorderLayout()); + panel.add(label, BorderLayout.NORTH); + panel.add(scrollPane, BorderLayout.CENTER); + panel.add(buttonPanel, BorderLayout.SOUTH); + ok.setPreferredSize(new Dimension(200, ok.getPreferredSize().height)); + cancel.setPreferredSize(new Dimension(200, ok.getPreferredSize().height)); + dialogAskPuckDatamatrix = SwingUtils.showDialog(getMainFrame().getTopLevel(), "Puck Loading", new Dimension(400, 600), panel); + cancel.addActionListener((ev) -> { + dialogAskPuckDatamatrix.setVisible(false); + }); + ok.addActionListener((ev) -> { + int row = table.getSelectedRow(); + String dm = (row >= 0) ? String.valueOf(table.getValueAt(row, 0)) : null; + dialogAskPuckDatamatrix.setVisible(false); + if (dm != null) { + linkPuckDatamatrix(puck, dm, true); + } + }); + + } + + } + + void showDialogPuckLoading() { + if ((dialogPuckLoading != null) && (dialogPuckLoading.isVisible())) { + return; + } + dialogPuckLoading = new PuckLoadingDialog(mainFrame.getTopLevel(), false); + dialogPuckLoading.setLocationRelativeTo(mainFrame); + dialogPuckLoading.setVisible(true); + } + + void hideDialogPuckLoading() { + if (dialogPuckLoading != null) { + dialogPuckLoading.setVisible(false); + dialogPuckLoading.dispose(); + dialogPuckLoading = null; + } + } + + void onPuckLoadingModeChange(boolean puckLoadMode) { + if (puckMountMode == PuckMountMode.Dialog) { + if (puckLoadMode) { + showDialogPuckLoading(); + } else { + hideDialogPuckLoading(); + } + } + } + + void onPuckScanned(String datamatrix) { + if (isPuckLoading()) { + getMainFrame().setPuckDatamatrix(datamatrix); + if (puckMountMode == PuckMountMode.Dialog) { + showDialogPuckLoading(); + dialogPuckLoading.onPuckScanned(datamatrix); + } + } else { + getMainFrame().setPuckDatamatrix(null); + } + } + + void onPuckMounted(Puck puck, String datamatrix) { + if (isPuckLoading()) { + if (puckMountMode == PuckMountMode.Dialog) { + showDialogPuckLoading(); + dialogPuckLoading.onPuckMounted(puck, datamatrix); + } else { + if (!datamatrix.isEmpty()) { + linkPuckDatamatrix(puck, datamatrix, true); + } else { + askPuckDatamatrix(puck); + } + } + } + } + + void onPuckUnmounted(Puck puck) { + if (isPuckLoading()) { + try{ + Sample sample = getMountedSample(); + if ((sample!=null) && (sample.getPuck() == puck)){ + resetMountedSample(); + sample.setLoaded(false); + SwingUtilities.invokeLater(()->{; + getMainFrame().refresh(); + }); + } + } catch (Exception ex) { + Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); + } + if (puckMountMode == PuckMountMode.Dialog) { + showDialogPuckLoading(); + dialogPuckLoading.onPuckUnmounted(puck); + } else { + linkPuckDatamatrix(puck, null, true); + } + } + } + + void logSampleMounted(String former, String current){ + logEvent((current!=null) ? "Sample Mounted" : "Sample Unmounted", former, current); + } + + void logPuckDetectionChange(Puck puck, boolean mounted){ + logEvent(mounted ? "Puck Mounted" : "Puck Unmounted", puck.getName(), isPuckLoading() ? "Puck Loading" : ""); + } + + void logStateChange(State state){ + String command = ""; + if (state==State.Busy){ + CommandInfo info = Context.getInstance().getCommandManager().getCurrentCommand(true); + if (info != null){ + command = (info.script != null) ? info.script : info.command; + } + } + logEvent("State Change", state.toString(), command); + } + + public void logEvent(String... event){ + try{ + long now = System.currentTimeMillis(); + Path path = Paths.get(Context.getInstance().getSetup().getOutputPath(), "events", Chrono.getTimeStr(now,"YYYYMMdd") + ".txt"); + path.toFile().getParentFile().mkdirs(); + + String[] data = new String[]{ + Chrono.getTimeStr(now, "dd/MM/YY HH:mm:ss.SSS"), + }; + data = Arr.append(data, event); + Files.write(path, String.join("\t", data).getBytes(), path.toFile().exists() ? StandardOpenOption.APPEND : StandardOpenOption.CREATE); + Files.write(path, System.lineSeparator().getBytes(), StandardOpenOption.APPEND); + } catch(Exception ex){ + Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); + } + } +} diff --git a/src/main/java/ch/psi/mxsc/ControllerRT.java b/src/main/java/ch/psi/mxsc/ControllerRT.java index 6244ed7..0f2f10e 100644 --- a/src/main/java/ch/psi/mxsc/ControllerRT.java +++ b/src/main/java/ch/psi/mxsc/ControllerRT.java @@ -9,6 +9,7 @@ import ch.psi.pshell.device.DeviceAdapter; import ch.psi.pshell.device.DeviceListener; import ch.psi.pshell.device.GenericDevice; import ch.psi.pshell.ui.Panel; +import ch.psi.utils.State; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,9 +21,24 @@ public class ControllerRT extends Controller{ //basePlate = new BasePlate(); basePlate.addListener(basePlateListener); setPuckLoading(false); + for (PuckState ps : getPuckStates()){ + ps.set(1, 0); + } - } + } + /* + @Override + public void onStateChange(State state, State former) { + if ((state == State.Ready)&&(former==State.Initializing)) { + PuckDetection puckDetection = this.getContext().getDevicePool().getByName("puckDetection", PuckDetection.class); + if (puckDetection!=null){ + getMainFrame().removeDevice(puckDetection, true); + } + } + super.onStateChange(state, former); + } + */ final DeviceListener basePlateListener = new DeviceAdapter() { @Override public void onValueChanged(Device device, Object value, Object former) { @@ -43,5 +59,5 @@ public class ControllerRT extends Controller{ } catch (Exception ex) { Logger.getLogger(Controller.class.getName()).log(Level.WARNING, null, ex); } - } + } } diff --git a/src/main/java/ch/psi/mxsc/MainPanel.form b/src/main/java/ch/psi/mxsc/MainPanel.form index 1112d04..5bfe075 100644 --- a/src/main/java/ch/psi/mxsc/MainPanel.form +++ b/src/main/java/ch/psi/mxsc/MainPanel.form @@ -31,7 +31,7 @@ - + @@ -278,12 +278,12 @@ - + - + @@ -346,9 +346,9 @@ - + - + @@ -896,7 +896,7 @@ - + @@ -1004,16 +1004,16 @@ - + - + - + diff --git a/src/main/java/ch/psi/mxsc/MainPanel.java b/src/main/java/ch/psi/mxsc/MainPanel.java index 6615a8d..740a418 100644 --- a/src/main/java/ch/psi/mxsc/MainPanel.java +++ b/src/main/java/ch/psi/mxsc/MainPanel.java @@ -1,1849 +1,1851 @@ -/* - * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. - */ -package ch.psi.mxsc; - -import ch.psi.mxsc.BasePlatePanel.SelectionMode; -import ch.psi.pshell.core.Plugin; -import ch.psi.pshell.device.Device; -import ch.psi.pshell.device.DeviceAdapter; -import ch.psi.pshell.imaging.Renderer; -import ch.psi.pshell.imaging.RendererMode; -import ch.psi.pshell.imaging.Source; -import ch.psi.pshell.scripting.ViewPreference; -import ch.psi.pshell.ui.App; -import ch.psi.pshell.ui.Panel; -import ch.psi.pshell.ui.StatusBar; -import ch.psi.utils.Chrono; -import ch.psi.utils.State; -import ch.psi.utils.swing.SwingUtils; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dialog; -import java.awt.Dimension; -import java.awt.GridBagLayout; -import java.awt.Image; -import java.awt.Window; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import javax.swing.GroupLayout; -import javax.swing.ImageIcon; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.DefaultTableModel; - -/** - * - */ -public class MainPanel extends Panel { - - /** - * Creates new form Panel - */ - Boolean manualMode; - Boolean roomTemperature; - public final String PUCK_LOADING_STATUS = "Puck loading"; - StatusBar statusBar; - - public enum BasePlateLayout { - normal, - sf, - x06da, - rt - } - public static final BasePlateLayout BASE_PLATE_LAYOUT = - App.hasArgument("sf") ? BasePlateLayout.sf : - ( App.hasArgument("6d") ? BasePlateLayout.x06da : - ( App.hasArgument("rt") ? BasePlateLayout.rt : BasePlateLayout.normal) - ); - - public static boolean isRt(){ - return App.hasArgument("rt"); - } - - public MainPanel() { - initComponents(); - getContext().getPluginManager().addDynamicClass(PuckDetection.class); - Controller.createInstance(this); - basePlatePanel.setMode(BasePlatePanel.Mode.single); - setExpertMode(false); - setDefaultDetail(); - panelTablePucks.getVerticalScrollBar().setPreferredSize(new Dimension(20, 0)); - panelTableSamples.getVerticalScrollBar().setPreferredSize(new Dimension(20, 0)); - - if (isRt()){ - panelLegend.setVisible(false); - } - - ((DefaultTableModel)tablePucks.getModel()).setNumRows(BasePlate.numberOfPucks); - int row = 0; - for (String segment : new String[]{"A", "B", "C", "D", "E", "F"}) { - for (int puck = 1; puck <= BasePlate.numberOfPucksPerSegments; puck++) { - tablePucks.getModel().setValueAt(segment + puck, row++, 0); - } - } - - tablePucks.getSelectionModel().addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - try { - if (e.getValueIsAdjusting() == false) { - String add = String.valueOf(tablePucks.getModel().getValueAt(tablePucks.getSelectedRow(), 0)); - String cur = Controller.getInstance().getCurrentSelection(); - if (cur != null) { - cur = cur.substring(0, 2); - } - if (!add.equals(cur)) { - Puck puck = Controller.getInstance().getPuck(add); - Controller.getInstance().selectPuck(puck); - } - } - } catch (Exception ex) { - showException(ex); - } - } - }); - - tableSamples.getSelectionModel().addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - try { - if (e.getValueIsAdjusting() == false) { - int selection = tableSamples.getSelectedRow(); - if (selection >= 0) { - String add = String.valueOf(tableSamples.getModel().getValueAt(selection, COLUMN_PUCK_ADDRESS)); - if (!add.trim().isEmpty()) { - int pos = -1; - try { - pos = Integer.valueOf(String.valueOf(tableSamples.getModel().getValueAt(selection, COLUMN_SAMPLE_POSITION))); - } catch (Exception ex) { - } - String curSelection = Controller.getInstance().getCurrentSelection(); - String curPuck = (curSelection == null) ? null : curSelection.substring(0, 2); - if (!add.equals(curPuck)) { - Puck puck = Controller.getInstance().getPuck(add); - Controller.getInstance().selectPuck(puck); - } - if (pos >= 0) { - add += pos; - if (!add.equals(curSelection)) { - Sample sample = Controller.getInstance().getSample(add); - Controller.getInstance().selectSample(sample); - } - } - } - } - } - } catch (Exception ex) { - showException(ex); - } - } - }); - } - - @Override - protected void onLoaded() { - if (App.isDetached()) { - Image img = new ImageIcon(this.getClass().getResource("/apple_transparent_white_100x50.png")).getImage(); - SwingUtils.getWindow(this).setIconImage(img); - } - basePlatePanel.setSelectionMode(SelectionMode.Pucks); - basePlatePanel.setDevice(Controller.getInstance().basePlate); - - try{ - statusBar = (StatusBar) SwingUtils.getComponentsByType(getTopLevel(), StatusBar.class)[0]; - } catch (Exception ex){ - } - } - - @Override - public void onInitialize(int runCount) { - stopTimer(); - try{ - Controller.getInstance().onInitialize(runCount); - panelDisplayMode.setVisible(Controller.getInstance().isRoomTempEnabled()); - panelBeamlineStatus.setVisible(Controller.getInstance().isBeamlineStatusEnabled()); - if (basePlatePanel.getDevice() != (Device) getDevice("BasePlate")) { - basePlatePanel.setDevice((Device) getDevice("BasePlate")); - } - try { - devicesPanel.initialize(); - ((Device) getDevice("dewar_level")).addListener(new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updateLevel(value); - } - }); - updateLevel(((Device) getDevice("dewar_level")).take()); - - ((Device) getDevice("air_pressure_ok")).addListener(new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updateAirPressure(value); - } - }); - updateAirPressure(((Device) getDevice("air_pressure_ok")).take()); - - ((Device) getDevice("n2_pressure_ok")).addListener(new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updateN2Pressure(value); - } - }); - updateN2Pressure(((Device) getDevice("n2_pressure_ok")).take()); - - ((Device) getDevice("feedback_local_safety")).addListener(new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updateLocalSafety(value); - } - }); - updateLocalSafety(((Device) getDevice("feedback_local_safety")).take()); - - updateN2Pressure(((Device) getDevice("n2_pressure_ok")).take()); - - ((Device) getDevice("gripper_dryer")).addListener(new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updateDryer(value); - } - }); - updateDryer(((Device) getDevice("gripper_dryer")).take()); - - ((Device) getDevice("feedback_psys_safety")).addListener(new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updatePsysSafety(value); - } - }); - updatePsysSafety(((Device) getDevice("feedback_psys_safety")).take()); - ((Device) getDevice("robot")).addListener(new DeviceAdapter() { - @Override - public void onValueChanged(Device device, Object value, Object former) { - updateMode(value); - } - - public void onStateChanged(Device device, State state, State former) { - if (!state.isNormal()) { - updateMode(null); - } - } - }); - updateMode(((Device) getDevice("robot")).take()); - } catch (Exception ex) { - this.getLogger().log(Level.SEVERE, null, ex); - } - setPuckDatamatrix(null); - setSampleDatamatrix(null); - setBackgroundUpdate(true); - startTimer(3000, 1000); - updateCameraView(); - } catch (Exception ex){ - getLogger().log(Level.SEVERE, null, ex); - } - } - - @Override - public void onStateChange(State state, State former) { - Controller.getInstance().onStateChange(state, former); - } - - @Override - protected void onTimer() { - try { - devicesPanel.update(); - try { - roomTemperature = Controller.getInstance().isRoomTemp(); - ledRoomTemperature.setColor(roomTemperature ? Color.YELLOW : Color.GREEN); - labelRoomTemperature.setText(roomTemperature ? "Room Temperature" : "Cryo Operation"); - try { - ledHeaterOk.setColor(roomTemperature ? Color.GREEN : (((Double) panelHeaterTemp.getDevice().take()) < 20.0 ? Color.RED : Color.GREEN)); - } catch (Exception ex) { - ledHeaterOk.setColor(Color.BLACK); - } - } catch (Exception ex) { - roomTemperature = null; - ledRoomTemperature.setColor(Color.BLACK); - labelRoomTemperature.setText("Room Temperature"); - } - try { - if ((expertChrono != null) && (expertChrono.isTimeout(10 * 60000))) { //After 10min - setExpertMode(false); - } - } catch (Exception ex) { - getLogger().log(Level.WARNING, null, ex); - } - - Controller.getInstance().onTimer(); - if (getState() == State.Ready) { - if (Boolean.TRUE.equals(Controller.getInstance().isPuckLoading())) { - setStatus(PUCK_LOADING_STATUS); - } else { - setStatus("Ready"); - } - } else { - status = null; - } - } catch (Exception ex) { - getLogger().log(Level.WARNING, null, ex); - } - } - - String status; - - void setStatus(String status) { - String current = current = (statusBar==null) ? this.status : statusBar.getStatusLabel().getText(); - if (!status.equals(current)) { - getContext().setPreference(ViewPreference.STATUS, status); - } - this.status = status; - } - - volatile boolean refreshing; - void refresh() { - if (!SwingUtilities.isEventDispatchThread()) { - if (!refreshing){ - refreshing = true; - SwingUtilities.invokeLater(() -> { - refreshing = false; - refresh(); - }); - } - return; - } - repaint(); - for (Puck p : Controller.getInstance().basePlate.getPucks()) { - int index = p.getUserIndex(); - tablePucks.getModel().setValueAt(p.getStatus(), index, 1); - tablePucks.getModel().setValueAt(p.getId(), index, 2); - } - } - - void updateLevel(Object value) { - if ((value == null) || !(value instanceof Number)) { - progressLN2.setIndeterminate(true); - } else { - progressLN2.setIndeterminate(false); - double val = ((Number) value).doubleValue() * 10.0; - progressLN2.setValue(Math.min(Math.max((int) val, 0), 1000)); - } - } - - void updateAirPressure(Object value) { - if ((value == null) || !(value instanceof Boolean)) { - ledAirPressure.setColor(Color.BLACK); - } else if ((Boolean) value) { - ledAirPressure.setColor(Color.GREEN); - } else { - ledAirPressure.setColor(Color.RED); - } - } - - void updateN2Pressure(Object value) { - if ((value == null) || !(value instanceof Boolean)) { - ledN2Pressure.setColor(Color.BLACK); - } else if ((Boolean) value) { - ledN2Pressure.setColor(Color.GREEN); - } else { - ledN2Pressure.setColor(Color.RED); - } - } - - void updateLocalSafety(Object value) { - if ((value == null) || !(value instanceof Boolean)) { - ledLocalSafety.setColor(Color.BLACK); - } else if ((Boolean) value) { - ledLocalSafety.setColor(Color.GREEN); - } else { - ledLocalSafety.setColor(Color.RED); - } - } - - void updateDryer(Object value) { - if ((value == null) || !(value instanceof Boolean)) { - ledDryer.setColor(Color.BLACK); - } else if ((Boolean) value) { - ledDryer.setColor(Color.RED); - } else { - ledDryer.setColor(Color.GREEN); - } - } - - void updatePsysSafety(Object value) { - if ((value == null) || !(value instanceof Boolean)) { - ledPsysSafety.setColor(Color.BLACK); - } else if (Boolean.TRUE.equals(manualMode)) { - ledPsysSafety.setColor(Color.YELLOW); - } else if ((Boolean) value) { - ledPsysSafety.setColor(Color.GREEN); - } else { - ledPsysSafety.setColor(Color.RED); - } - } - - void updateMode(Object value) { - if ((value != null) && (value instanceof Map)) { - manualMode = "manual".equals(String.valueOf(((Map) value).get("mode"))); - ledManualMode.setColor(manualMode ? Color.YELLOW : Color.GREEN); - labelManualMode.setText(manualMode ? "Manual Mode" : "Remote Mode"); - updatePsysSafety(((Device) getDevice("feedback_psys_safety")).take()); - } else { - ledManualMode.setColor(Color.BLACK); - labelManualMode.setText("Unknown Mode"); - } - } - - void updateCameraView() { - Source source = buttonCamera.isSelected() ? (Source) this.getDevice("img") : null; - basePlatePanel.setCameraView(source); - } - - void execute(String statement) { - execute(statement, false); - } - - void execute(String statement, boolean background) { - execute(statement, background, false); - } - - void execute(String statement, boolean background, boolean showReturn) { - execute(statement, background, showReturn, true); - } - - void execute(String statement, boolean background, boolean showReturn, boolean showException) { - try { - getLogger().log(Level.INFO, "Execute: " + statement + (background ? "&" : "")); - evalAsync(statement, background).handle((ret, ex) -> { - if (ex != null) { - if (showException) { - showException((Exception) ex); - } - } else if (showReturn) { - showMessage("Return", String.valueOf(ret)); - } - return ret; - }); - } catch (Exception ex) { - if (showException) { - showException(ex); - } - } - } - - void execute(String script, Object args, boolean background, boolean showReturn) { - execute(script, args, background, showReturn, true); - } - - void execute(String script, Object args, boolean background, boolean showReturn, boolean showException) { - try { - getLogger().log(Level.INFO, "Execute: " + script + (background ? "&" : "")); - runAsync(script, args, background).handle((ret, ex) -> { - if (ex != null) { - showException((Exception) ex); - } else if (showReturn) { - showMessage("Return", String.valueOf(ret)); - } - return ret; - }); - } catch (Exception ex) { - if (showException) { - showException(ex); - } - } - } - - void updateViewType() { - try { - updateCameraView(); - } catch (Exception ex) { - showException(ex); - } - - } - - boolean viewDewar = true; - RoomTemperaturePanel roomTempPanel; - WaterLevelPanel waterLevelPanel; - - void updateViewMode() { - try { - if (btViewDewar.isSelected() != viewDewar) { - viewDewar = btViewDewar.isSelected(); - if (viewDewar) { - ((GroupLayout) panelTop.getLayout()).replace(roomTempPanel, basePlatePanel); - ((GroupLayout) panelTop.getLayout()).replace(waterLevelPanel, panelLN2Level); - } else { - if (roomTempPanel == null) { - roomTempPanel = new RoomTemperaturePanel(); - roomTempPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Room Temperature")); - } - roomTempPanel.setDevice(Controller.getInstance().roomTemperatureBasePlate); - ((GroupLayout) panelTop.getLayout()).replace(basePlatePanel, roomTempPanel); - if (waterLevelPanel == null) { - waterLevelPanel = new WaterLevelPanel(); - } - waterLevelPanel.setPreferredSize(panelLN2Level.getPreferredSize()); - ((GroupLayout) panelTop.getLayout()).replace(panelLN2Level, waterLevelPanel); - } - } - } catch (Exception ex) { - showException(ex); - } - - } - - void setExpertMode(boolean expert) { - boolean current = buttonExpertCommands.isVisible(); - buttonExpertCommands.setVisible(expert); - buttonRecovery.setVisible(expert); - buttonCalibrateImage.setVisible(expert); - buttonCalibrateCover.setVisible(expert); - devicesPanel.setActive(expert); - panelViewType.setVisible(expert); - panelDetection.setVisible(expert && !isRt()); - buttonDetectCover.setVisible(expert); - buttonConfig.setVisible(expert); - Puck.setDisplayDetectionError(expert); - - if (checkExpert.isSelected() != expert) { - checkExpert.setSelected(expert); - } - if (expert == false) { - buttonCamera.setSelected(false); - buttonDrawing.setSelected(true); - updateViewType(); - } - if (current != expert) { - onModeChange(expert); - } - } - - Plugin commandsPlugin; - - Panel showCommandsPanel() { - if (commandsPlugin != null) { - getContext().getPluginManager().unloadPlugin(commandsPlugin); - } - commandsPlugin = getContext().getPluginManager().loadPlugin(getContext().getSetup().expandPath("{plugins}/Commands.java")); - ((Panel) commandsPlugin).setDetached(true, getTopLevel()); - getContext().getPluginManager().initializePlugin(commandsPlugin); - return ((Panel) commandsPlugin); - } - - Plugin recoveryPlugin; - - Panel showRecoveryPanel() { - if (recoveryPlugin != null) { - getContext().getPluginManager().unloadPlugin(recoveryPlugin); - } - recoveryPlugin = getContext().getPluginManager().loadPlugin(getContext().getSetup().expandPath("{plugins}/Recovery.java")); - ((Panel) recoveryPlugin).setDetached(true, getTopLevel()); - getContext().getPluginManager().initializePlugin(recoveryPlugin); - return ((Panel) recoveryPlugin); - } - - void setDefaultDetail() { - JLabel label = new JLabel(); - label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/apple_transparent_white_100x50.png"))); - JPanel panel = new JPanel(); - panel.setLayout(new GridBagLayout()); - panel.add(label); - setDetail(panel); - //setContext(label); - } - - void setDetail(Component c) { - panelDetail.removeAll(); - panelDetail.setLayout(new BorderLayout()); - //panelContext.setLayout(new GridBagLayout()); - panelDetail.add(c); - updateUI(); - } - - Component getDetail() { - return this.getComponent(0); - } - - Dimension getDetailSize() { - return panelDetail.getSize(); - } - - final int COLUMN_PUCK_ADDRESS = 3; - final int COLUMN_SAMPLE_POSITION = 5; - - void setSamplesTable(Object[][] sampleData) { - tableSamples.setModel(new DefaultTableModel( - sampleData, - new String[]{ - //"User Name", "Dewar Name", - "Puck Name", "Puck Type", "Puck Id", "Puck Address", - "Sample Name", "Sample Position", "Sample Id", "Sample Status", "Mount Count" - } - ) { - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } - } - ); - if (isRt()){ - for (int i=0; i<3; i++){ - tableSamples.getColumnModel().getColumn(i).setMinWidth(0); - tableSamples.getColumnModel().getColumn(i).setMaxWidth(0); - tableSamples.getColumnModel().getColumn(i).setWidth(0); - } - } - } - - void onSelectionChanged(String segment, Integer puck, Integer sample) { - if (segment != null) { - String add = segment + String.valueOf(puck); - for (int i = 0; i < tablePucks.getModel().getRowCount(); i++) { - if (add.equals(tablePucks.getModel().getValueAt(i, 0))) { - if (tablePucks.getSelectedRow() != i) { - tablePucks.setRowSelectionInterval(i, i); - SwingUtils.scrollToVisible(tablePucks, i, 0); - } - break; - } - } - - for (int i = 0; i < tableSamples.getModel().getRowCount(); i++) { - if (add.equals(tableSamples.getModel().getValueAt(i, COLUMN_PUCK_ADDRESS))) { - if (sample != null) { - if (!sample.equals(tableSamples.getModel().getValueAt(i, COLUMN_SAMPLE_POSITION))) { - continue; - } - } - if (tableSamples.getSelectedRow() != i) { - tableSamples.setRowSelectionInterval(i, i); - SwingUtils.scrollToVisible(tableSamples, i, 0); - } - break; - } - } - } - } - - public void setPuckDatamatrix(String datamatrix) { - textPuckDatamatrix.setText((datamatrix == null) ? "" : String.valueOf(datamatrix)); - } - - public void setSampleDatamatrix(String datamatrix) { - textSampleDatamatrix.setText((datamatrix == null) ? "" : String.valueOf(datamatrix)); - } - - public String getPuckDatamatrix() { - String ret = textPuckDatamatrix.getText(); - return (ret != null) ? ret.trim() : ""; - } - - public String getSampleDatamatrix() { - String ret = textSampleDatamatrix.getText(); - return (ret != null) ? ret.trim() : ""; - } - - Chrono expertChrono; - final List expertWindows = new ArrayList<>(); - - void onExpertCommand(Window window) { - expertChrono = new Chrono(); - if ((window != null) && (!expertWindows.contains(window))) { - expertWindows.add(window); - } - } - - void onModeChange(boolean expert) { - if (expert) { - expertChrono = new Chrono(); - } else { - expertChrono = null; - for (Window w : expertWindows) { - if ((w != null) && (w.isShowing())) { - w.setVisible(false); - w.dispose(); - } - } - expertWindows.clear(); - } - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - panelTop = new javax.swing.JPanel(); - basePlatePanel = new ch.psi.mxsc.BasePlatePanel(); - panelLegend = new javax.swing.JPanel(); - ledLidControlActive2 = new ch.psi.pshell.swing.Led(); - ledLidControlActive1 = new ch.psi.pshell.swing.Led(); - jLabel20 = new javax.swing.JLabel(); - jLabel15 = new javax.swing.JLabel(); - jLabel16 = new javax.swing.JLabel(); - jLabel19 = new javax.swing.JLabel(); - ledLidControlActive4 = new ch.psi.pshell.swing.Led(); - ledLidControlActive3 = new ch.psi.pshell.swing.Led(); - ledLidControlActive5 = new ch.psi.pshell.swing.Led(); - jLabel23 = new javax.swing.JLabel(); - panelDetection = new javax.swing.JPanel(); - buttonClearDet = new javax.swing.JButton(); - buttonPuckDet = new javax.swing.JButton(); - panelHexiposi = new javax.swing.JPanel(); - hexiposiPanel = new ch.psi.mxsc.HexiposiPanel(); - buttonDetectCover = new javax.swing.JButton(); - panelViewType = new javax.swing.JPanel(); - buttonCamera = new javax.swing.JToggleButton(); - buttonDrawing = new javax.swing.JToggleButton(); - panelLN2Level = new javax.swing.JPanel(); - jPanel3 = new javax.swing.JPanel(); - progressLN2 = new javax.swing.JProgressBar(); - jLabel4 = new javax.swing.JLabel(); - panelStatus = new javax.swing.JPanel(); - panelBeamlineStatus = new javax.swing.JPanel(); - led5 = new ch.psi.pshell.swing.Led(); - led6 = new ch.psi.pshell.swing.Led(); - jLabel8 = new javax.swing.JLabel(); - jLabel9 = new javax.swing.JLabel(); - panelSystemStatus = new javax.swing.JPanel(); - ledAirPressure = new ch.psi.pshell.swing.Led(); - jLabel24 = new javax.swing.JLabel(); - jLabel25 = new javax.swing.JLabel(); - ledN2Pressure = new ch.psi.pshell.swing.Led(); - jLabel26 = new javax.swing.JLabel(); - ledLocalSafety = new ch.psi.pshell.swing.Led(); - jLabell21 = new javax.swing.JLabel(); - ledPsysSafety = new ch.psi.pshell.swing.Led(); - buttonRelease = new javax.swing.JButton(); - filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 30), new java.awt.Dimension(0, 30), new java.awt.Dimension(32767, 30)); - ledRoomTemperature = new ch.psi.pshell.swing.Led(); - labelRoomTemperature = new javax.swing.JLabel(); - ledManualMode = new ch.psi.pshell.swing.Led(); - labelManualMode = new javax.swing.JLabel(); - ledHeaterOk = new ch.psi.pshell.swing.Led(); - jLabel29 = new javax.swing.JLabel(); - panelHeaterTemp = new ch.psi.pshell.swing.DeviceValuePanel(); - ledDryer = new ch.psi.pshell.swing.Led(); - jLabel27 = new javax.swing.JLabel(); - panelDatamatrix = new javax.swing.JPanel(); - jLabel11 = new javax.swing.JLabel(); - jLabel13 = new javax.swing.JLabel(); - textSampleDatamatrix = new javax.swing.JTextField(); - textPuckDatamatrix = new javax.swing.JTextField(); - panelRight = new javax.swing.JPanel(); - panelDetail = new javax.swing.JPanel(); - panelDisplayMode = new javax.swing.JPanel(); - btViewDewar = new javax.swing.JToggleButton(); - btViewRT = new javax.swing.JToggleButton(); - panelDevices = new javax.swing.JPanel(); - devicesPanel = new ch.psi.mxsc.DevicesPanel(); - panelExpert = new javax.swing.JPanel(); - checkExpert = new javax.swing.JCheckBox(); - buttonCalibrateImage = new javax.swing.JButton(); - buttonCalibrateCover = new javax.swing.JButton(); - buttonExpertCommands = new javax.swing.JButton(); - buttonRecovery = new javax.swing.JButton(); - buttonConfig = new javax.swing.JButton(); - panelBottom = new javax.swing.JPanel(); - jPanel1 = new javax.swing.JPanel(); - panelTableSamples = new javax.swing.JScrollPane(); - tableSamples = new javax.swing.JTable(); - jPanel4 = new javax.swing.JPanel(); - panelTablePucks = new javax.swing.JScrollPane(); - tablePucks = new javax.swing.JTable(); - - setPreferredSize(new java.awt.Dimension(1030, 530)); - setRequestFocusEnabled(false); - - basePlatePanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Dewar")); - - panelLegend.setBorder(javax.swing.BorderFactory.createTitledBorder("Legend")); - - ledLidControlActive2.setForeground(new java.awt.Color(128, 232, 152)); - ledLidControlActive2.setLedSize(20); - - ledLidControlActive1.setForeground(new java.awt.Color(192, 128, 128)); - ledLidControlActive1.setLedSize(20); - - jLabel20.setText("Empty"); - - jLabel15.setText("Error"); - - jLabel16.setText("Minispine"); - - jLabel19.setText("Unipuck"); - - ledLidControlActive4.setForeground(new java.awt.Color(128, 128, 128)); - ledLidControlActive4.setLedSize(20); - - ledLidControlActive3.setForeground(new java.awt.Color(128, 192, 192)); - ledLidControlActive3.setLedSize(20); - - ledLidControlActive5.setForeground(new java.awt.Color(192, 152, 45)); - ledLidControlActive5.setLedSize(20); - - jLabel23.setText("Offline"); - - javax.swing.GroupLayout panelLegendLayout = new javax.swing.GroupLayout(panelLegend); - panelLegend.setLayout(panelLegendLayout); - panelLegendLayout.setHorizontalGroup( - panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelLegendLayout.createSequentialGroup() - .addContainerGap() - .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelLegendLayout.createSequentialGroup() - .addComponent(ledLidControlActive1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel15)) - .addGroup(panelLegendLayout.createSequentialGroup() - .addComponent(ledLidControlActive2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel16)) - .addGroup(panelLegendLayout.createSequentialGroup() - .addComponent(ledLidControlActive3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel19)) - .addGroup(panelLegendLayout.createSequentialGroup() - .addComponent(ledLidControlActive4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel20)) - .addGroup(panelLegendLayout.createSequentialGroup() - .addComponent(ledLidControlActive5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel23))) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - panelLegendLayout.setVerticalGroup( - panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelLegendLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledLidControlActive4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel20)) - .addGap(0, 0, 0) - .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledLidControlActive3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel19)) - .addGap(0, 0, 0) - .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledLidControlActive2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel16)) - .addGap(0, 0, 0) - .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledLidControlActive1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel15)) - .addGap(0, 0, 0) - .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledLidControlActive5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel23))) - ); - - panelDetection.setBorder(javax.swing.BorderFactory.createTitledBorder("Detection")); - - buttonClearDet.setText("Clear"); - buttonClearDet.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonClearDetActionPerformed(evt); - } - }); - - buttonPuckDet.setText("Start"); - buttonPuckDet.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonPuckDetActionPerformed(evt); - } - }); - - javax.swing.GroupLayout panelDetectionLayout = new javax.swing.GroupLayout(panelDetection); - panelDetection.setLayout(panelDetectionLayout); - panelDetectionLayout.setHorizontalGroup( - panelDetectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelDetectionLayout.createSequentialGroup() - .addContainerGap(14, Short.MAX_VALUE) - .addGroup(panelDetectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(buttonClearDet, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonPuckDet, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addContainerGap(14, Short.MAX_VALUE)) - ); - panelDetectionLayout.setVerticalGroup( - panelDetectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDetectionLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonPuckDet) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(buttonClearDet) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - panelHexiposi.setBorder(javax.swing.BorderFactory.createTitledBorder("Cover")); - panelHexiposi.setPreferredSize(new java.awt.Dimension(112, 153)); - - buttonDetectCover.setText("Image"); - buttonDetectCover.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonDetectCoverActionPerformed(evt); - } - }); - - javax.swing.GroupLayout panelHexiposiLayout = new javax.swing.GroupLayout(panelHexiposi); - panelHexiposi.setLayout(panelHexiposiLayout); - panelHexiposiLayout.setHorizontalGroup( - panelHexiposiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelHexiposiLayout.createSequentialGroup() - .addContainerGap(9, Short.MAX_VALUE) - .addGroup(panelHexiposiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonDetectCover) - .addComponent(hexiposiPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(9, Short.MAX_VALUE)) - ); - panelHexiposiLayout.setVerticalGroup( - panelHexiposiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelHexiposiLayout.createSequentialGroup() - .addContainerGap(14, Short.MAX_VALUE) - .addComponent(hexiposiPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE) - .addComponent(buttonDetectCover) - .addContainerGap()) - ); - - panelViewType.setBorder(javax.swing.BorderFactory.createTitledBorder("View")); - - buttonCamera.setText("Image"); - buttonCamera.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonCameraActionPerformed(evt); - } - }); - - buttonDrawing.setSelected(true); - buttonDrawing.setText("Design"); - buttonDrawing.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonDrawingActionPerformed(evt); - } - }); - - javax.swing.GroupLayout panelViewTypeLayout = new javax.swing.GroupLayout(panelViewType); - panelViewType.setLayout(panelViewTypeLayout); - panelViewTypeLayout.setHorizontalGroup( - panelViewTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelViewTypeLayout.createSequentialGroup() - .addContainerGap(8, Short.MAX_VALUE) - .addGroup(panelViewTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) - .addComponent(buttonDrawing) - .addComponent(buttonCamera)) - .addContainerGap(8, Short.MAX_VALUE)) - ); - - panelViewTypeLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonCamera, buttonDrawing}); - - panelViewTypeLayout.setVerticalGroup( - panelViewTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelViewTypeLayout.createSequentialGroup() - .addContainerGap() - .addComponent(buttonCamera) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(buttonDrawing) - .addContainerGap()) - ); - - javax.swing.GroupLayout basePlatePanelLayout = new javax.swing.GroupLayout(basePlatePanel); - basePlatePanel.setLayout(basePlatePanelLayout); - basePlatePanelLayout.setHorizontalGroup( - basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, basePlatePanelLayout.createSequentialGroup() - .addContainerGap() - .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelDetection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(panelLegend, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 276, Short.MAX_VALUE) - .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelHexiposi, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(panelViewType, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) - ); - - basePlatePanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {panelDetection, panelViewType}); - - basePlatePanelLayout.setVerticalGroup( - basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, basePlatePanelLayout.createSequentialGroup() - .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(panelViewType, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelDetection, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelLegend, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelHexiposi, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) - ); - - basePlatePanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {panelHexiposi, panelLegend}); - - panelLN2Level.setBorder(javax.swing.BorderFactory.createTitledBorder("LN2 Level")); - - progressLN2.setMaximum(1000); - progressLN2.setOrientation(1); - - jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pin3.png"))); // NOI18N - - javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); - jPanel3.setLayout(jPanel3Layout); - jPanel3Layout.setHorizontalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel3Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(progressLN2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(4, 4, 4) - .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 38, Short.MAX_VALUE) - .addGap(0, 0, 0)) - ); - jPanel3Layout.setVerticalGroup( - jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(progressLN2, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel4) - .addGap(2, 2, 2)) - ); - - javax.swing.GroupLayout panelLN2LevelLayout = new javax.swing.GroupLayout(panelLN2Level); - panelLN2Level.setLayout(panelLN2LevelLayout); - panelLN2LevelLayout.setHorizontalGroup( - panelLN2LevelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelLN2LevelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0)) - ); - panelLN2LevelLayout.setVerticalGroup( - panelLN2LevelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelLN2LevelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) - ); - - panelBeamlineStatus.setBorder(javax.swing.BorderFactory.createTitledBorder("Beamline Status")); - - jLabel8.setText("Valve state"); - - jLabel9.setText("Transfer permitted"); - - javax.swing.GroupLayout panelBeamlineStatusLayout = new javax.swing.GroupLayout(panelBeamlineStatus); - panelBeamlineStatus.setLayout(panelBeamlineStatusLayout); - panelBeamlineStatusLayout.setHorizontalGroup( - panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelBeamlineStatusLayout.createSequentialGroup() - .addContainerGap() - .addGroup(panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelBeamlineStatusLayout.createSequentialGroup() - .addComponent(led5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel8)) - .addGroup(panelBeamlineStatusLayout.createSequentialGroup() - .addComponent(led6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel9))) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - panelBeamlineStatusLayout.setVerticalGroup( - panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelBeamlineStatusLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addGroup(panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(led5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel8)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(led6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel9)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - panelSystemStatus.setBorder(javax.swing.BorderFactory.createTitledBorder("System Status")); - - jLabel24.setText("Air Pressure"); - - jLabel25.setText("N2 Pressure"); - - jLabel26.setText("Local Safety"); - - jLabell21.setText("Door Safety"); - - buttonRelease.setText("Release"); - buttonRelease.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonReleaseActionPerformed(evt); - } - }); - - labelRoomTemperature.setText("Room Temperature"); - - labelManualMode.setText("Manual Mode"); - - jLabel29.setText("Heater"); - - panelHeaterTemp.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - panelHeaterTemp.setDeviceName("rim_heater_temp"); - - jLabel27.setText("Dryer"); - - javax.swing.GroupLayout panelSystemStatusLayout = new javax.swing.GroupLayout(panelSystemStatus); - panelSystemStatus.setLayout(panelSystemStatusLayout); - panelSystemStatusLayout.setHorizontalGroup( - panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelSystemStatusLayout.createSequentialGroup() - .addGap(10, 10, 10) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(ledAirPressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ledHeaterOk, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ledN2Pressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ledLocalSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ledRoomTemperature, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ledPsysSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ledManualMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(ledDryer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel24) - .addComponent(jLabel25) - .addGroup(panelSystemStatusLayout.createSequentialGroup() - .addComponent(jLabel29) - .addGap(18, 18, Short.MAX_VALUE) - .addComponent(panelHeaterTemp, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addComponent(jLabel26) - .addComponent(jLabell21) - .addComponent(labelRoomTemperature) - .addComponent(labelManualMode) - .addComponent(jLabel27)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(panelSystemStatusLayout.createSequentialGroup() - .addComponent(filler1, 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(buttonRelease) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - panelSystemStatusLayout.setVerticalGroup( - panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelSystemStatusLayout.createSequentialGroup() - .addGap(0, 7, Short.MAX_VALUE) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(panelSystemStatusLayout.createSequentialGroup() - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledManualMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(labelManualMode)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledRoomTemperature, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(labelRoomTemperature)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledHeaterOk, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel29))) - .addComponent(panelHeaterTemp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledAirPressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel24)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledN2Pressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel25)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledDryer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel27)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledLocalSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel26)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(ledPsysSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabell21)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) - .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelSystemStatusLayout.createSequentialGroup() - .addComponent(buttonRelease) - .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(filler1, javax.swing.GroupLayout.DEFAULT_SIZE, 35, Short.MAX_VALUE)) - .addGap(4, 4, 4)) - ); - - panelDatamatrix.setBorder(javax.swing.BorderFactory.createTitledBorder("Datamatrix")); - - jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel11.setText("Puck:"); - - jLabel13.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - jLabel13.setText("Sample:"); - - textSampleDatamatrix.setEditable(false); - textSampleDatamatrix.setBackground(new java.awt.Color(214, 217, 223)); - textSampleDatamatrix.setHorizontalAlignment(javax.swing.JTextField.CENTER); - - textPuckDatamatrix.setEditable(false); - textPuckDatamatrix.setBackground(new java.awt.Color(214, 217, 223)); - textPuckDatamatrix.setHorizontalAlignment(javax.swing.JTextField.CENTER); - - javax.swing.GroupLayout panelDatamatrixLayout = new javax.swing.GroupLayout(panelDatamatrix); - panelDatamatrix.setLayout(panelDatamatrixLayout); - panelDatamatrixLayout.setHorizontalGroup( - panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelDatamatrixLayout.createSequentialGroup() - .addContainerGap() - .addGroup(panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addGroup(panelDatamatrixLayout.createSequentialGroup() - .addComponent(jLabel11) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(textPuckDatamatrix, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(panelDatamatrixLayout.createSequentialGroup() - .addComponent(jLabel13) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(textSampleDatamatrix))) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - panelDatamatrixLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel11, jLabel13}); - - panelDatamatrixLayout.setVerticalGroup( - panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelDatamatrixLayout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addGroup(panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel11) - .addComponent(textPuckDatamatrix, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel13) - .addComponent(textSampleDatamatrix, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(0, 0, Short.MAX_VALUE)) - ); - - javax.swing.GroupLayout panelStatusLayout = new javax.swing.GroupLayout(panelStatus); - panelStatus.setLayout(panelStatusLayout); - panelStatusLayout.setHorizontalGroup( - panelStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelBeamlineStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelDatamatrix, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelSystemStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - ); - panelStatusLayout.setVerticalGroup( - panelStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelStatusLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(panelSystemStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(0, 0, 0) - .addComponent(panelBeamlineStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(0, 0, 0) - .addComponent(panelDatamatrix, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - panelDetail.setBorder(javax.swing.BorderFactory.createTitledBorder("Detail")); - panelDetail.setPreferredSize(new java.awt.Dimension(300, 95)); - - javax.swing.GroupLayout panelDetailLayout = new javax.swing.GroupLayout(panelDetail); - panelDetail.setLayout(panelDetailLayout); - panelDetailLayout.setHorizontalGroup( - panelDetailLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 0, Short.MAX_VALUE) - ); - panelDetailLayout.setVerticalGroup( - panelDetailLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 0, Short.MAX_VALUE) - ); - - panelDisplayMode.setBorder(javax.swing.BorderFactory.createTitledBorder("Mode")); - - btViewDewar.setSelected(true); - btViewDewar.setText("Dewar"); - btViewDewar.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btViewDewarActionPerformed(evt); - } - }); - - btViewRT.setText("Room Temp."); - btViewRT.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btViewRTActionPerformed(evt); - } - }); - - javax.swing.GroupLayout panelDisplayModeLayout = new javax.swing.GroupLayout(panelDisplayMode); - panelDisplayMode.setLayout(panelDisplayModeLayout); - panelDisplayModeLayout.setHorizontalGroup( - panelDisplayModeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDisplayModeLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(btViewDewar) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(btViewRT) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - - panelDisplayModeLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btViewDewar, btViewRT}); - - panelDisplayModeLayout.setVerticalGroup( - panelDisplayModeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelDisplayModeLayout.createSequentialGroup() - .addContainerGap() - .addGroup(panelDisplayModeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(btViewDewar) - .addComponent(btViewRT)) - .addContainerGap()) - ); - - panelDevices.setBorder(javax.swing.BorderFactory.createTitledBorder("Devices")); - panelDevices.setPreferredSize(new java.awt.Dimension(300, 282)); - - devicesPanel.setActive(false); - - checkExpert.setText("Expert"); - checkExpert.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); - checkExpert.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - checkExpertActionPerformed(evt); - } - }); - - buttonCalibrateImage.setText("Calibrate"); - buttonCalibrateImage.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonCalibrateImageActionPerformed(evt); - } - }); - - buttonCalibrateCover.setText("Cover Ref"); - buttonCalibrateCover.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonCalibrateCoverActionPerformed(evt); - } - }); - - buttonExpertCommands.setText("Commands"); - buttonExpertCommands.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonExpertCommandsActionPerformed(evt); - } - }); - - buttonRecovery.setText("Recovery"); - buttonRecovery.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonRecoveryActionPerformed(evt); - } - }); - - buttonConfig.setText("Settings"); - buttonConfig.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - buttonConfigActionPerformed(evt); - } - }); - - javax.swing.GroupLayout panelExpertLayout = new javax.swing.GroupLayout(panelExpert); - panelExpert.setLayout(panelExpertLayout); - panelExpertLayout.setHorizontalGroup( - panelExpertLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelExpertLayout.createSequentialGroup() - .addGroup(panelExpertLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(buttonExpertCommands, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonRecovery, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonCalibrateImage, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonCalibrateCover, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(buttonConfig, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGroup(panelExpertLayout.createSequentialGroup() - .addComponent(checkExpert, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)) - ); - - panelExpertLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonCalibrateCover, buttonCalibrateImage, buttonConfig, buttonExpertCommands, buttonRecovery}); - - panelExpertLayout.setVerticalGroup( - panelExpertLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelExpertLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(checkExpert) - .addGap(18, 26, Short.MAX_VALUE) - .addComponent(buttonExpertCommands) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(buttonRecovery) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(buttonCalibrateImage) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(buttonCalibrateCover) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(buttonConfig) - .addGap(0, 0, 0)) - ); - - javax.swing.GroupLayout panelDevicesLayout = new javax.swing.GroupLayout(panelDevices); - panelDevices.setLayout(panelDevicesLayout); - panelDevicesLayout.setHorizontalGroup( - panelDevicesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelDevicesLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(devicesPanel, 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(panelExpert, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - ); - panelDevicesLayout.setVerticalGroup( - panelDevicesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelDevicesLayout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(panelDevicesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelExpert, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(devicesPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)) - .addContainerGap(8, Short.MAX_VALUE)) - ); - - javax.swing.GroupLayout panelRightLayout = new javax.swing.GroupLayout(panelRight); - panelRight.setLayout(panelRightLayout); - panelRightLayout.setHorizontalGroup( - panelRightLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelRightLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(panelRightLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(panelDetail, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE) - .addComponent(panelDisplayMode, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelDevices, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE)) - .addGap(0, 0, 0)) - ); - panelRightLayout.setVerticalGroup( - panelRightLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelRightLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(panelDetail, javax.swing.GroupLayout.DEFAULT_SIZE, 108, Short.MAX_VALUE) - .addGap(0, 0, 0) - .addComponent(panelDevices, javax.swing.GroupLayout.PREFERRED_SIZE, 280, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0) - .addComponent(panelDisplayMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0)) - ); - - javax.swing.GroupLayout panelTopLayout = new javax.swing.GroupLayout(panelTop); - panelTop.setLayout(panelTopLayout); - panelTopLayout.setHorizontalGroup( - panelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelTopLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(panelLN2Level, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(panelStatus, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(basePlatePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(panelRight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0)) - ); - panelTopLayout.setVerticalGroup( - panelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(panelTopLayout.createSequentialGroup() - .addGap(0, 0, 0) - .addGroup(panelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelRight, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(basePlatePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelLN2Level, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(0, 0, 0)) - ); - - panelBottom.setPreferredSize(new java.awt.Dimension(810, 150)); - panelBottom.setRequestFocusEnabled(false); - - jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Samples")); - - tableSamples.setModel(new javax.swing.table.DefaultTableModel( - new Object [][] { - - }, - new String [] { - - } - )); - tableSamples.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - panelTableSamples.setViewportView(tableSamples); - - javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); - jPanel1.setLayout(jPanel1Layout); - jPanel1Layout.setHorizontalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(panelTableSamples) - .addGap(0, 0, 0)) - ); - jPanel1Layout.setVerticalGroup( - jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(panelTableSamples, javax.swing.GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE) - .addGap(0, 0, 0)) - ); - - jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Pucks")); - - tablePucks.setModel(new javax.swing.table.DefaultTableModel( - new Object [][] { - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null} - }, - new String [] { - "Address", "Status", "Id" - } - ) { - Class[] types = new Class [] { - java.lang.String.class, java.lang.String.class, java.lang.String.class - }; - boolean[] canEdit = new boolean [] { - false, false, false - }; - - public Class getColumnClass(int columnIndex) { - return types [columnIndex]; - } - - public boolean isCellEditable(int rowIndex, int columnIndex) { - return canEdit [columnIndex]; - } - }); - tablePucks.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); - panelTablePucks.setViewportView(tablePucks); - - javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); - jPanel4.setLayout(jPanel4Layout); - jPanel4Layout.setHorizontalGroup( - jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel4Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(panelTablePucks, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) - .addGap(0, 0, 0)) - ); - jPanel4Layout.setVerticalGroup( - jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel4Layout.createSequentialGroup() - .addGap(0, 0, 0) - .addComponent(panelTablePucks, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) - .addGap(0, 0, 0)) - ); - - javax.swing.GroupLayout panelBottomLayout = new javax.swing.GroupLayout(panelBottom); - panelBottom.setLayout(panelBottomLayout); - panelBottomLayout.setHorizontalGroup( - panelBottomLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBottomLayout.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) - .addGap(0, 0, 0)) - ); - panelBottomLayout.setVerticalGroup( - panelBottomLayout.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) - ); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); - this.setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(panelTop, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(panelBottom, javax.swing.GroupLayout.DEFAULT_SIZE, 1030, Short.MAX_VALUE) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(panelTop, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGap(0, 0, 0) - .addComponent(panelBottom, javax.swing.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE) - .addGap(1, 1, 1)) - ); - }// //GEN-END:initComponents - - private void buttonCameraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCameraActionPerformed - buttonDrawing.setSelected(!buttonCamera.isSelected()); - updateViewType(); - }//GEN-LAST:event_buttonCameraActionPerformed - - private void buttonExpertCommandsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonExpertCommandsActionPerformed - try { - Panel panel = showCommandsPanel(); - onExpertCommand(SwingUtils.getWindow(panel)); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonExpertCommandsActionPerformed - - //Dialog dlgDetPlot; - //Dialog dlgDetText; - Dialog dlgDetRenderer; - JComponent dlgDetPlotComp; - JComponent dlgDetTextComp; - JComponent dlgDetRendererComp; - - private void buttonPuckDetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPuckDetActionPerformed - try { - /* - if ((dlgDetPlot == null) || (!dlgDetPlot.isShowing())){ - dlgDetPlotComp = new ch.psi.pshell.plot.LinePlotJFree(); - ((ch.psi.pshell.plot.LinePlotJFree) dlgDetPlotComp).setTitle(""); - dlgDetPlot = SwingUtils.showDialog(getTopLevel(), "Puck Detection", new Dimension(600,400), dlgDetPlotComp); - } - if ((dlgDetText == null)|| (!dlgDetText.isShowing())){ - dlgDetTextComp = new javax.swing.JTextArea(); - ((javax.swing.JTextArea)dlgDetTextComp).setEditable(false); - dlgDetText = SwingUtils.showDialog(getTopLevel(), "Puck Detection", new Dimension(600,400), dlgDetTextComp); - } - */ - if (!App.isDetached()) { - if ((dlgDetRenderer == null) || (!dlgDetRenderer.isShowing())) { - dlgDetRendererComp = new Renderer(); - ((Renderer) dlgDetRendererComp).setMode(RendererMode.Fit); - dlgDetRenderer = SwingUtils.showDialog(getTopLevel(), "Puck Detection", new Dimension(600, 400), dlgDetRendererComp); - } - } - Controller.getInstance().imageDetectPucks(dlgDetPlotComp, dlgDetRendererComp, dlgDetTextComp); - - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonPuckDetActionPerformed - - private void buttonClearDetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonClearDetActionPerformed - try { - Controller.getInstance().clearImageDetection(); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonClearDetActionPerformed - - - private void checkExpertActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkExpertActionPerformed - if (checkExpert.isSelected()) { - PasswordDialog dlg = new PasswordDialog(getTopLevel(), true, 1234); - dlg.setResizable(false); - dlg.setLocationRelativeTo(getTopLevel()); - dlg.setVisible(true); - if (dlg.getResult() == false) { - checkExpert.setSelected(false); - return; - } - } - setExpertMode(checkExpert.isSelected()); - }//GEN-LAST:event_checkExpertActionPerformed - - private void buttonDrawingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDrawingActionPerformed - buttonCamera.setSelected(!buttonDrawing.isSelected()); - updateViewType(); - }//GEN-LAST:event_buttonDrawingActionPerformed - - private void btViewDewarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btViewDewarActionPerformed - btViewRT.setSelected(!btViewDewar.isSelected()); - if (btViewRT.isSelected()) { - setDefaultDetail(); - } - updateViewMode(); - }//GEN-LAST:event_btViewDewarActionPerformed - - private void btViewRTActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btViewRTActionPerformed - btViewDewar.setSelected(!btViewRT.isSelected()); - if (btViewRT.isSelected()) { - setDefaultDetail(); - } - updateViewMode(); - }//GEN-LAST:event_btViewRTActionPerformed - - private void buttonRecoveryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonRecoveryActionPerformed - try { - Panel panel = showRecoveryPanel(); - onExpertCommand(SwingUtils.getWindow(panel)); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonRecoveryActionPerformed - - private void buttonCalibrateImageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCalibrateImageActionPerformed - onExpertCommand(null); - execute("imgproc/CameraCalibration", null, false, true); - }//GEN-LAST:event_buttonCalibrateImageActionPerformed - - private void buttonDetectCoverActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDetectCoverActionPerformed - try { - execute("cover_detection_debug=True"); - runAsync("imgproc/CoverDetection", null, false).handle((ret, ex) -> { - execute("cover_detection_debug=False", true); - if (ex != null) { - showException((Exception) ex); - } else { - showMessage("Return", String.valueOf(ret)); - } - return ret; - }); - } catch (Exception ex) { - showException(ex); - } - }//GEN-LAST:event_buttonDetectCoverActionPerformed - - private void buttonCalibrateCoverActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCalibrateCoverActionPerformed - onExpertCommand(null); - execute("imgproc/CoverDetectionCalibration", null, false, true); - }//GEN-LAST:event_buttonCalibrateCoverActionPerformed - - private void buttonConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonConfigActionPerformed - onExpertCommand(null); - - boolean current = false; - try { - current = "true".equalsIgnoreCase(getSetting("valve_control")); - } catch (Exception ex) { - } - - showSettingsEditor(true); - - //Check if must open valve - if (current) { - SwingUtilities.invokeLater(() -> { - try { - boolean valveControl = "true".equalsIgnoreCase(getSetting("valve_control")); - if (!valveControl) { - execute("open_valve()", true); - } - } catch (Exception ex) { - getLogger().log(Level.WARNING, null, ex); - } - }); - - } - }//GEN-LAST:event_buttonConfigActionPerformed - - private void buttonReleaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonReleaseActionPerformed - execute("release_safety()", true); - }//GEN-LAST:event_buttonReleaseActionPerformed - - - // Variables declaration - do not modify//GEN-BEGIN:variables - ch.psi.mxsc.BasePlatePanel basePlatePanel; - private javax.swing.JToggleButton btViewDewar; - private javax.swing.JToggleButton btViewRT; - private javax.swing.JButton buttonCalibrateCover; - private javax.swing.JButton buttonCalibrateImage; - private javax.swing.JToggleButton buttonCamera; - private javax.swing.JButton buttonClearDet; - private javax.swing.JButton buttonConfig; - private javax.swing.JButton buttonDetectCover; - private javax.swing.JToggleButton buttonDrawing; - private javax.swing.JButton buttonExpertCommands; - private javax.swing.JButton buttonPuckDet; - private javax.swing.JButton buttonRecovery; - private javax.swing.JButton buttonRelease; - private javax.swing.JCheckBox checkExpert; - private ch.psi.mxsc.DevicesPanel devicesPanel; - private javax.swing.Box.Filler filler1; - ch.psi.mxsc.HexiposiPanel hexiposiPanel; - private javax.swing.JLabel jLabel11; - private javax.swing.JLabel jLabel13; - private javax.swing.JLabel jLabel15; - private javax.swing.JLabel jLabel16; - private javax.swing.JLabel jLabel19; - private javax.swing.JLabel jLabel20; - private javax.swing.JLabel jLabel23; - private javax.swing.JLabel jLabel24; - private javax.swing.JLabel jLabel25; - private javax.swing.JLabel jLabel26; - private javax.swing.JLabel jLabel27; - private javax.swing.JLabel jLabel29; - private javax.swing.JLabel jLabel4; - private javax.swing.JLabel jLabel8; - private javax.swing.JLabel jLabel9; - private javax.swing.JLabel jLabell21; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel3; - private javax.swing.JPanel jPanel4; - private javax.swing.JLabel labelManualMode; - private javax.swing.JLabel labelRoomTemperature; - private ch.psi.pshell.swing.Led led5; - private ch.psi.pshell.swing.Led led6; - private ch.psi.pshell.swing.Led ledAirPressure; - private ch.psi.pshell.swing.Led ledDryer; - private ch.psi.pshell.swing.Led ledHeaterOk; - private ch.psi.pshell.swing.Led ledLidControlActive1; - private ch.psi.pshell.swing.Led ledLidControlActive2; - private ch.psi.pshell.swing.Led ledLidControlActive3; - private ch.psi.pshell.swing.Led ledLidControlActive4; - private ch.psi.pshell.swing.Led ledLidControlActive5; - private ch.psi.pshell.swing.Led ledLocalSafety; - private ch.psi.pshell.swing.Led ledManualMode; - private ch.psi.pshell.swing.Led ledN2Pressure; - private ch.psi.pshell.swing.Led ledPsysSafety; - private ch.psi.pshell.swing.Led ledRoomTemperature; - private javax.swing.JPanel panelBeamlineStatus; - private javax.swing.JPanel panelBottom; - private javax.swing.JPanel panelDatamatrix; - private javax.swing.JPanel panelDetail; - private javax.swing.JPanel panelDetection; - private javax.swing.JPanel panelDevices; - private javax.swing.JPanel panelDisplayMode; - private javax.swing.JPanel panelExpert; - private ch.psi.pshell.swing.DeviceValuePanel panelHeaterTemp; - private javax.swing.JPanel panelHexiposi; - private javax.swing.JPanel panelLN2Level; - private javax.swing.JPanel panelLegend; - private javax.swing.JPanel panelRight; - private javax.swing.JPanel panelStatus; - private javax.swing.JPanel panelSystemStatus; - private javax.swing.JScrollPane panelTablePucks; - private javax.swing.JScrollPane panelTableSamples; - private javax.swing.JPanel panelTop; - private javax.swing.JPanel panelViewType; - private javax.swing.JProgressBar progressLN2; - private javax.swing.JTable tablePucks; - private javax.swing.JTable tableSamples; - private javax.swing.JTextField textPuckDatamatrix; - private javax.swing.JTextField textSampleDatamatrix; - // End of variables declaration//GEN-END:variables - -} +/* + * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. + */ +package ch.psi.mxsc; + +import ch.psi.mxsc.BasePlatePanel.SelectionMode; +import ch.psi.pshell.core.Plugin; +import ch.psi.pshell.device.Device; +import ch.psi.pshell.device.DeviceAdapter; +import ch.psi.pshell.imaging.Renderer; +import ch.psi.pshell.imaging.RendererMode; +import ch.psi.pshell.imaging.Source; +import ch.psi.pshell.scripting.ViewPreference; +import ch.psi.pshell.ui.App; +import ch.psi.pshell.ui.Panel; +import ch.psi.pshell.ui.StatusBar; +import ch.psi.utils.Chrono; +import ch.psi.utils.State; +import ch.psi.utils.swing.SwingUtils; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.GridBagLayout; +import java.awt.Image; +import java.awt.Window; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import javax.swing.GroupLayout; +import javax.swing.ImageIcon; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.DefaultTableModel; + +/** + * + */ +public class MainPanel extends Panel { + + /** + * Creates new form Panel + */ + Boolean manualMode; + Boolean roomTemperature; + public final String PUCK_LOADING_STATUS = "Puck loading"; + StatusBar statusBar; + + public enum BasePlateLayout { + normal, + sf, + x06da, + rt + } + public static final BasePlateLayout BASE_PLATE_LAYOUT = + App.hasArgument("sf") ? BasePlateLayout.sf : + ( App.hasArgument("6d") ? BasePlateLayout.x06da : + ( App.hasArgument("rt") ? BasePlateLayout.rt : BasePlateLayout.normal) + ); + + public static boolean isRt(){ + return App.hasArgument("rt"); + } + + public MainPanel() { + initComponents(); + getContext().getPluginManager().addDynamicClass(PuckDetection.class); + Controller.createInstance(this); + basePlatePanel.setMode(BasePlatePanel.Mode.single); + setExpertMode(false); + setDefaultDetail(); + panelTablePucks.getVerticalScrollBar().setPreferredSize(new Dimension(20, 0)); + panelTableSamples.getVerticalScrollBar().setPreferredSize(new Dimension(20, 0)); + + if (isRt()){ + panelLegend.setVisible(false); + panelLN2Level.setVisible(false); + panelDisplayMode.setVisible(false); + } + + ((DefaultTableModel)tablePucks.getModel()).setNumRows(BasePlate.numberOfPucks); + int row = 0; + for (String segment : new String[]{"A", "B", "C", "D", "E", "F"}) { + for (int puck = 1; puck <= BasePlate.numberOfPucksPerSegments; puck++) { + tablePucks.getModel().setValueAt(segment + puck, row++, 0); + } + } + + tablePucks.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + try { + if (e.getValueIsAdjusting() == false) { + String add = String.valueOf(tablePucks.getModel().getValueAt(tablePucks.getSelectedRow(), 0)); + String cur = Controller.getInstance().getCurrentSelection(); + if (cur != null) { + cur = cur.substring(0, 2); + } + if (!add.equals(cur)) { + Puck puck = Controller.getInstance().getPuck(add); + Controller.getInstance().selectPuck(puck); + } + } + } catch (Exception ex) { + showException(ex); + } + } + }); + + tableSamples.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + try { + if (e.getValueIsAdjusting() == false) { + int selection = tableSamples.getSelectedRow(); + if (selection >= 0) { + String add = String.valueOf(tableSamples.getModel().getValueAt(selection, COLUMN_PUCK_ADDRESS)); + if (!add.trim().isEmpty()) { + int pos = -1; + try { + pos = Integer.valueOf(String.valueOf(tableSamples.getModel().getValueAt(selection, COLUMN_SAMPLE_POSITION))); + } catch (Exception ex) { + } + String curSelection = Controller.getInstance().getCurrentSelection(); + String curPuck = (curSelection == null) ? null : curSelection.substring(0, 2); + if (!add.equals(curPuck)) { + Puck puck = Controller.getInstance().getPuck(add); + Controller.getInstance().selectPuck(puck); + } + if (pos >= 0) { + add += pos; + if (!add.equals(curSelection)) { + Sample sample = Controller.getInstance().getSample(add); + Controller.getInstance().selectSample(sample); + } + } + } + } + } + } catch (Exception ex) { + showException(ex); + } + } + }); + } + + @Override + protected void onLoaded() { + if (App.isDetached()) { + Image img = new ImageIcon(this.getClass().getResource("/apple_transparent_white_100x50.png")).getImage(); + SwingUtils.getWindow(this).setIconImage(img); + } + basePlatePanel.setSelectionMode(SelectionMode.Pucks); + basePlatePanel.setDevice(Controller.getInstance().basePlate); + + try{ + statusBar = (StatusBar) SwingUtils.getComponentsByType(getTopLevel(), StatusBar.class)[0]; + } catch (Exception ex){ + } + } + + @Override + public void onInitialize(int runCount) { + stopTimer(); + try{ + Controller.getInstance().onInitialize(runCount); + panelDisplayMode.setVisible(Controller.getInstance().isRoomTempEnabled()); + panelBeamlineStatus.setVisible(Controller.getInstance().isBeamlineStatusEnabled()); + if (basePlatePanel.getDevice() != (Device) getDevice("BasePlate")) { + basePlatePanel.setDevice((Device) getDevice("BasePlate")); + } + try { + devicesPanel.initialize(); + ((Device) getDevice("dewar_level")).addListener(new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updateLevel(value); + } + }); + updateLevel(((Device) getDevice("dewar_level")).take()); + + ((Device) getDevice("air_pressure_ok")).addListener(new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updateAirPressure(value); + } + }); + updateAirPressure(((Device) getDevice("air_pressure_ok")).take()); + + ((Device) getDevice("n2_pressure_ok")).addListener(new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updateN2Pressure(value); + } + }); + updateN2Pressure(((Device) getDevice("n2_pressure_ok")).take()); + + ((Device) getDevice("feedback_local_safety")).addListener(new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updateLocalSafety(value); + } + }); + updateLocalSafety(((Device) getDevice("feedback_local_safety")).take()); + + updateN2Pressure(((Device) getDevice("n2_pressure_ok")).take()); + + ((Device) getDevice("gripper_dryer")).addListener(new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updateDryer(value); + } + }); + updateDryer(((Device) getDevice("gripper_dryer")).take()); + + ((Device) getDevice("feedback_psys_safety")).addListener(new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updatePsysSafety(value); + } + }); + updatePsysSafety(((Device) getDevice("feedback_psys_safety")).take()); + ((Device) getDevice("robot")).addListener(new DeviceAdapter() { + @Override + public void onValueChanged(Device device, Object value, Object former) { + updateMode(value); + } + + public void onStateChanged(Device device, State state, State former) { + if (!state.isNormal()) { + updateMode(null); + } + } + }); + updateMode(((Device) getDevice("robot")).take()); + } catch (Exception ex) { + this.getLogger().log(Level.SEVERE, null, ex); + } + setPuckDatamatrix(null); + setSampleDatamatrix(null); + setBackgroundUpdate(true); + startTimer(3000, 1000); + updateCameraView(); + } catch (Exception ex){ + getLogger().log(Level.SEVERE, null, ex); + } + } + + @Override + public void onStateChange(State state, State former) { + Controller.getInstance().onStateChange(state, former); + } + + @Override + protected void onTimer() { + try { + devicesPanel.update(); + try { + roomTemperature = Controller.getInstance().isRoomTemp(); + ledRoomTemperature.setColor(roomTemperature ? Color.YELLOW : Color.GREEN); + labelRoomTemperature.setText(roomTemperature ? "Room Temperature" : "Cryo Operation"); + try { + ledHeaterOk.setColor(roomTemperature ? Color.GREEN : (((Double) panelHeaterTemp.getDevice().take()) < 20.0 ? Color.RED : Color.GREEN)); + } catch (Exception ex) { + ledHeaterOk.setColor(Color.BLACK); + } + } catch (Exception ex) { + roomTemperature = null; + ledRoomTemperature.setColor(Color.BLACK); + labelRoomTemperature.setText("Room Temperature"); + } + try { + if ((expertChrono != null) && (expertChrono.isTimeout(10 * 60000))) { //After 10min + setExpertMode(false); + } + } catch (Exception ex) { + getLogger().log(Level.WARNING, null, ex); + } + + Controller.getInstance().onTimer(); + if (getState() == State.Ready) { + if (Boolean.TRUE.equals(Controller.getInstance().isPuckLoading())) { + setStatus(PUCK_LOADING_STATUS); + } else { + setStatus("Ready"); + } + } else { + status = null; + } + } catch (Exception ex) { + getLogger().log(Level.WARNING, null, ex); + } + } + + String status; + + void setStatus(String status) { + String current = current = (statusBar==null) ? this.status : statusBar.getStatusLabel().getText(); + if (!status.equals(current)) { + getContext().setPreference(ViewPreference.STATUS, status); + } + this.status = status; + } + + volatile boolean refreshing; + void refresh() { + if (!SwingUtilities.isEventDispatchThread()) { + if (!refreshing){ + refreshing = true; + SwingUtilities.invokeLater(() -> { + refreshing = false; + refresh(); + }); + } + return; + } + repaint(); + for (Puck p : Controller.getInstance().basePlate.getPucks()) { + int index = p.getUserIndex(); + tablePucks.getModel().setValueAt(p.getStatus(), index, 1); + tablePucks.getModel().setValueAt(p.getId(), index, 2); + } + } + + void updateLevel(Object value) { + if ((value == null) || !(value instanceof Number)) { + progressLN2.setIndeterminate(true); + } else { + progressLN2.setIndeterminate(false); + double val = ((Number) value).doubleValue() * 10.0; + progressLN2.setValue(Math.min(Math.max((int) val, 0), 1000)); + } + } + + void updateAirPressure(Object value) { + if ((value == null) || !(value instanceof Boolean)) { + ledAirPressure.setColor(Color.BLACK); + } else if ((Boolean) value) { + ledAirPressure.setColor(Color.GREEN); + } else { + ledAirPressure.setColor(Color.RED); + } + } + + void updateN2Pressure(Object value) { + if ((value == null) || !(value instanceof Boolean)) { + ledN2Pressure.setColor(Color.BLACK); + } else if ((Boolean) value) { + ledN2Pressure.setColor(Color.GREEN); + } else { + ledN2Pressure.setColor(Color.RED); + } + } + + void updateLocalSafety(Object value) { + if ((value == null) || !(value instanceof Boolean)) { + ledLocalSafety.setColor(Color.BLACK); + } else if ((Boolean) value) { + ledLocalSafety.setColor(Color.GREEN); + } else { + ledLocalSafety.setColor(Color.RED); + } + } + + void updateDryer(Object value) { + if ((value == null) || !(value instanceof Boolean)) { + ledDryer.setColor(Color.BLACK); + } else if ((Boolean) value) { + ledDryer.setColor(Color.RED); + } else { + ledDryer.setColor(Color.GREEN); + } + } + + void updatePsysSafety(Object value) { + if ((value == null) || !(value instanceof Boolean)) { + ledPsysSafety.setColor(Color.BLACK); + } else if (Boolean.TRUE.equals(manualMode)) { + ledPsysSafety.setColor(Color.YELLOW); + } else if ((Boolean) value) { + ledPsysSafety.setColor(Color.GREEN); + } else { + ledPsysSafety.setColor(Color.RED); + } + } + + void updateMode(Object value) { + if ((value != null) && (value instanceof Map)) { + manualMode = "manual".equals(String.valueOf(((Map) value).get("mode"))); + ledManualMode.setColor(manualMode ? Color.YELLOW : Color.GREEN); + labelManualMode.setText(manualMode ? "Manual Mode" : "Remote Mode"); + updatePsysSafety(((Device) getDevice("feedback_psys_safety")).take()); + } else { + ledManualMode.setColor(Color.BLACK); + labelManualMode.setText("Unknown Mode"); + } + } + + void updateCameraView() { + Source source = buttonCamera.isSelected() ? (Source) this.getDevice("img") : null; + basePlatePanel.setCameraView(source); + } + + void execute(String statement) { + execute(statement, false); + } + + void execute(String statement, boolean background) { + execute(statement, background, false); + } + + void execute(String statement, boolean background, boolean showReturn) { + execute(statement, background, showReturn, true); + } + + void execute(String statement, boolean background, boolean showReturn, boolean showException) { + try { + getLogger().log(Level.INFO, "Execute: " + statement + (background ? "&" : "")); + evalAsync(statement, background).handle((ret, ex) -> { + if (ex != null) { + if (showException) { + showException((Exception) ex); + } + } else if (showReturn) { + showMessage("Return", String.valueOf(ret)); + } + return ret; + }); + } catch (Exception ex) { + if (showException) { + showException(ex); + } + } + } + + void execute(String script, Object args, boolean background, boolean showReturn) { + execute(script, args, background, showReturn, true); + } + + void execute(String script, Object args, boolean background, boolean showReturn, boolean showException) { + try { + getLogger().log(Level.INFO, "Execute: " + script + (background ? "&" : "")); + runAsync(script, args, background).handle((ret, ex) -> { + if (ex != null) { + showException((Exception) ex); + } else if (showReturn) { + showMessage("Return", String.valueOf(ret)); + } + return ret; + }); + } catch (Exception ex) { + if (showException) { + showException(ex); + } + } + } + + void updateViewType() { + try { + updateCameraView(); + } catch (Exception ex) { + showException(ex); + } + + } + + boolean viewDewar = true; + RoomTemperaturePanel roomTempPanel; + WaterLevelPanel waterLevelPanel; + + void updateViewMode() { + try { + if (btViewDewar.isSelected() != viewDewar) { + viewDewar = btViewDewar.isSelected(); + if (viewDewar) { + ((GroupLayout) panelTop.getLayout()).replace(roomTempPanel, basePlatePanel); + ((GroupLayout) panelTop.getLayout()).replace(waterLevelPanel, panelLN2Level); + } else { + if (roomTempPanel == null) { + roomTempPanel = new RoomTemperaturePanel(); + roomTempPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Room Temperature")); + } + roomTempPanel.setDevice(Controller.getInstance().roomTemperatureBasePlate); + ((GroupLayout) panelTop.getLayout()).replace(basePlatePanel, roomTempPanel); + if (waterLevelPanel == null) { + waterLevelPanel = new WaterLevelPanel(); + } + waterLevelPanel.setPreferredSize(panelLN2Level.getPreferredSize()); + ((GroupLayout) panelTop.getLayout()).replace(panelLN2Level, waterLevelPanel); + } + } + } catch (Exception ex) { + showException(ex); + } + + } + + void setExpertMode(boolean expert) { + boolean current = buttonExpertCommands.isVisible(); + buttonExpertCommands.setVisible(expert); + buttonRecovery.setVisible(expert); + buttonCalibrateImage.setVisible(expert); + buttonCalibrateCover.setVisible(expert); + devicesPanel.setActive(expert); + panelViewType.setVisible(expert); + panelDetection.setVisible(expert && !isRt()); + buttonDetectCover.setVisible(expert); + buttonConfig.setVisible(expert); + Puck.setDisplayDetectionError(expert); + + if (checkExpert.isSelected() != expert) { + checkExpert.setSelected(expert); + } + if (expert == false) { + buttonCamera.setSelected(false); + buttonDrawing.setSelected(true); + updateViewType(); + } + if (current != expert) { + onModeChange(expert); + } + } + + Plugin commandsPlugin; + + Panel showCommandsPanel() { + if (commandsPlugin != null) { + getContext().getPluginManager().unloadPlugin(commandsPlugin); + } + commandsPlugin = getContext().getPluginManager().loadPlugin(getContext().getSetup().expandPath("{plugins}/Commands.java")); + ((Panel) commandsPlugin).setDetached(true, getTopLevel()); + getContext().getPluginManager().initializePlugin(commandsPlugin); + return ((Panel) commandsPlugin); + } + + Plugin recoveryPlugin; + + Panel showRecoveryPanel() { + if (recoveryPlugin != null) { + getContext().getPluginManager().unloadPlugin(recoveryPlugin); + } + recoveryPlugin = getContext().getPluginManager().loadPlugin(getContext().getSetup().expandPath("{plugins}/Recovery.java")); + ((Panel) recoveryPlugin).setDetached(true, getTopLevel()); + getContext().getPluginManager().initializePlugin(recoveryPlugin); + return ((Panel) recoveryPlugin); + } + + void setDefaultDetail() { + JLabel label = new JLabel(); + label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/apple_transparent_white_100x50.png"))); + JPanel panel = new JPanel(); + panel.setLayout(new GridBagLayout()); + panel.add(label); + setDetail(panel); + //setContext(label); + } + + void setDetail(Component c) { + panelDetail.removeAll(); + panelDetail.setLayout(new BorderLayout()); + //panelContext.setLayout(new GridBagLayout()); + panelDetail.add(c); + updateUI(); + } + + Component getDetail() { + return this.getComponent(0); + } + + Dimension getDetailSize() { + return panelDetail.getSize(); + } + + final int COLUMN_PUCK_ADDRESS = 3; + final int COLUMN_SAMPLE_POSITION = 5; + + void setSamplesTable(Object[][] sampleData) { + tableSamples.setModel(new DefaultTableModel( + sampleData, + new String[]{ + //"User Name", "Dewar Name", + "Puck Name", "Puck Type", "Puck Id", "Puck Address", + "Sample Name", "Sample Position", "Sample Id", "Sample Status", "Mount Count" + } + ) { + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + } + ); + if (isRt()){ + for (int i=0; i<3; i++){ + tableSamples.getColumnModel().getColumn(i).setMinWidth(0); + tableSamples.getColumnModel().getColumn(i).setMaxWidth(0); + tableSamples.getColumnModel().getColumn(i).setWidth(0); + } + } + } + + void onSelectionChanged(String segment, Integer puck, Integer sample) { + if (segment != null) { + String add = segment + String.valueOf(puck); + for (int i = 0; i < tablePucks.getModel().getRowCount(); i++) { + if (add.equals(tablePucks.getModel().getValueAt(i, 0))) { + if (tablePucks.getSelectedRow() != i) { + tablePucks.setRowSelectionInterval(i, i); + SwingUtils.scrollToVisible(tablePucks, i, 0); + } + break; + } + } + + for (int i = 0; i < tableSamples.getModel().getRowCount(); i++) { + if (add.equals(tableSamples.getModel().getValueAt(i, COLUMN_PUCK_ADDRESS))) { + if (sample != null) { + if (!sample.equals(tableSamples.getModel().getValueAt(i, COLUMN_SAMPLE_POSITION))) { + continue; + } + } + if (tableSamples.getSelectedRow() != i) { + tableSamples.setRowSelectionInterval(i, i); + SwingUtils.scrollToVisible(tableSamples, i, 0); + } + break; + } + } + } + } + + public void setPuckDatamatrix(String datamatrix) { + textPuckDatamatrix.setText((datamatrix == null) ? "" : String.valueOf(datamatrix)); + } + + public void setSampleDatamatrix(String datamatrix) { + textSampleDatamatrix.setText((datamatrix == null) ? "" : String.valueOf(datamatrix)); + } + + public String getPuckDatamatrix() { + String ret = textPuckDatamatrix.getText(); + return (ret != null) ? ret.trim() : ""; + } + + public String getSampleDatamatrix() { + String ret = textSampleDatamatrix.getText(); + return (ret != null) ? ret.trim() : ""; + } + + Chrono expertChrono; + final List expertWindows = new ArrayList<>(); + + void onExpertCommand(Window window) { + expertChrono = new Chrono(); + if ((window != null) && (!expertWindows.contains(window))) { + expertWindows.add(window); + } + } + + void onModeChange(boolean expert) { + if (expert) { + expertChrono = new Chrono(); + } else { + expertChrono = null; + for (Window w : expertWindows) { + if ((w != null) && (w.isShowing())) { + w.setVisible(false); + w.dispose(); + } + } + expertWindows.clear(); + } + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + panelTop = new javax.swing.JPanel(); + basePlatePanel = new ch.psi.mxsc.BasePlatePanel(); + panelLegend = new javax.swing.JPanel(); + ledLidControlActive2 = new ch.psi.pshell.swing.Led(); + ledLidControlActive1 = new ch.psi.pshell.swing.Led(); + jLabel20 = new javax.swing.JLabel(); + jLabel15 = new javax.swing.JLabel(); + jLabel16 = new javax.swing.JLabel(); + jLabel19 = new javax.swing.JLabel(); + ledLidControlActive4 = new ch.psi.pshell.swing.Led(); + ledLidControlActive3 = new ch.psi.pshell.swing.Led(); + ledLidControlActive5 = new ch.psi.pshell.swing.Led(); + jLabel23 = new javax.swing.JLabel(); + panelDetection = new javax.swing.JPanel(); + buttonClearDet = new javax.swing.JButton(); + buttonPuckDet = new javax.swing.JButton(); + panelHexiposi = new javax.swing.JPanel(); + hexiposiPanel = new ch.psi.mxsc.HexiposiPanel(); + buttonDetectCover = new javax.swing.JButton(); + panelViewType = new javax.swing.JPanel(); + buttonCamera = new javax.swing.JToggleButton(); + buttonDrawing = new javax.swing.JToggleButton(); + panelLN2Level = new javax.swing.JPanel(); + jPanel3 = new javax.swing.JPanel(); + progressLN2 = new javax.swing.JProgressBar(); + jLabel4 = new javax.swing.JLabel(); + panelStatus = new javax.swing.JPanel(); + panelBeamlineStatus = new javax.swing.JPanel(); + led5 = new ch.psi.pshell.swing.Led(); + led6 = new ch.psi.pshell.swing.Led(); + jLabel8 = new javax.swing.JLabel(); + jLabel9 = new javax.swing.JLabel(); + panelSystemStatus = new javax.swing.JPanel(); + ledAirPressure = new ch.psi.pshell.swing.Led(); + jLabel24 = new javax.swing.JLabel(); + jLabel25 = new javax.swing.JLabel(); + ledN2Pressure = new ch.psi.pshell.swing.Led(); + jLabel26 = new javax.swing.JLabel(); + ledLocalSafety = new ch.psi.pshell.swing.Led(); + jLabell21 = new javax.swing.JLabel(); + ledPsysSafety = new ch.psi.pshell.swing.Led(); + buttonRelease = new javax.swing.JButton(); + filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 30), new java.awt.Dimension(0, 30), new java.awt.Dimension(32767, 30)); + ledRoomTemperature = new ch.psi.pshell.swing.Led(); + labelRoomTemperature = new javax.swing.JLabel(); + ledManualMode = new ch.psi.pshell.swing.Led(); + labelManualMode = new javax.swing.JLabel(); + ledHeaterOk = new ch.psi.pshell.swing.Led(); + jLabel29 = new javax.swing.JLabel(); + panelHeaterTemp = new ch.psi.pshell.swing.DeviceValuePanel(); + ledDryer = new ch.psi.pshell.swing.Led(); + jLabel27 = new javax.swing.JLabel(); + panelDatamatrix = new javax.swing.JPanel(); + jLabel11 = new javax.swing.JLabel(); + jLabel13 = new javax.swing.JLabel(); + textSampleDatamatrix = new javax.swing.JTextField(); + textPuckDatamatrix = new javax.swing.JTextField(); + panelRight = new javax.swing.JPanel(); + panelDetail = new javax.swing.JPanel(); + panelDisplayMode = new javax.swing.JPanel(); + btViewDewar = new javax.swing.JToggleButton(); + btViewRT = new javax.swing.JToggleButton(); + panelDevices = new javax.swing.JPanel(); + devicesPanel = new ch.psi.mxsc.DevicesPanel(); + panelExpert = new javax.swing.JPanel(); + checkExpert = new javax.swing.JCheckBox(); + buttonCalibrateImage = new javax.swing.JButton(); + buttonCalibrateCover = new javax.swing.JButton(); + buttonExpertCommands = new javax.swing.JButton(); + buttonRecovery = new javax.swing.JButton(); + buttonConfig = new javax.swing.JButton(); + panelBottom = new javax.swing.JPanel(); + jPanel1 = new javax.swing.JPanel(); + panelTableSamples = new javax.swing.JScrollPane(); + tableSamples = new javax.swing.JTable(); + jPanel4 = new javax.swing.JPanel(); + panelTablePucks = new javax.swing.JScrollPane(); + tablePucks = new javax.swing.JTable(); + + setPreferredSize(new java.awt.Dimension(1030, 530)); + setRequestFocusEnabled(false); + + basePlatePanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Dewar")); + + panelLegend.setBorder(javax.swing.BorderFactory.createTitledBorder("Legend")); + + ledLidControlActive2.setForeground(new java.awt.Color(128, 232, 152)); + ledLidControlActive2.setLedSize(20); + + ledLidControlActive1.setForeground(new java.awt.Color(192, 128, 128)); + ledLidControlActive1.setLedSize(20); + + jLabel20.setText("Empty"); + + jLabel15.setText("Error"); + + jLabel16.setText("Minispine"); + + jLabel19.setText("Unipuck"); + + ledLidControlActive4.setForeground(new java.awt.Color(128, 128, 128)); + ledLidControlActive4.setLedSize(20); + + ledLidControlActive3.setForeground(new java.awt.Color(128, 192, 192)); + ledLidControlActive3.setLedSize(20); + + ledLidControlActive5.setForeground(new java.awt.Color(192, 152, 45)); + ledLidControlActive5.setLedSize(20); + + jLabel23.setText("Offline"); + + javax.swing.GroupLayout panelLegendLayout = new javax.swing.GroupLayout(panelLegend); + panelLegend.setLayout(panelLegendLayout); + panelLegendLayout.setHorizontalGroup( + panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelLegendLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelLegendLayout.createSequentialGroup() + .addComponent(ledLidControlActive1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel15)) + .addGroup(panelLegendLayout.createSequentialGroup() + .addComponent(ledLidControlActive2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel16)) + .addGroup(panelLegendLayout.createSequentialGroup() + .addComponent(ledLidControlActive3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel19)) + .addGroup(panelLegendLayout.createSequentialGroup() + .addComponent(ledLidControlActive4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel20)) + .addGroup(panelLegendLayout.createSequentialGroup() + .addComponent(ledLidControlActive5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel23))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + panelLegendLayout.setVerticalGroup( + panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelLegendLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledLidControlActive4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel20)) + .addGap(0, 0, 0) + .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledLidControlActive3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel19)) + .addGap(0, 0, 0) + .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledLidControlActive2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel16)) + .addGap(0, 0, 0) + .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledLidControlActive1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel15)) + .addGap(0, 0, 0) + .addGroup(panelLegendLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledLidControlActive5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel23))) + ); + + panelDetection.setBorder(javax.swing.BorderFactory.createTitledBorder("Detection")); + + buttonClearDet.setText("Clear"); + buttonClearDet.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonClearDetActionPerformed(evt); + } + }); + + buttonPuckDet.setText("Start"); + buttonPuckDet.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonPuckDetActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelDetectionLayout = new javax.swing.GroupLayout(panelDetection); + panelDetection.setLayout(panelDetectionLayout); + panelDetectionLayout.setHorizontalGroup( + panelDetectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDetectionLayout.createSequentialGroup() + .addContainerGap(14, Short.MAX_VALUE) + .addGroup(panelDetectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(buttonClearDet, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonPuckDet, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(14, Short.MAX_VALUE)) + ); + panelDetectionLayout.setVerticalGroup( + panelDetectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDetectionLayout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonPuckDet) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonClearDet) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + panelHexiposi.setBorder(javax.swing.BorderFactory.createTitledBorder("Cover")); + panelHexiposi.setPreferredSize(new java.awt.Dimension(112, 153)); + + buttonDetectCover.setText("Image"); + buttonDetectCover.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonDetectCoverActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelHexiposiLayout = new javax.swing.GroupLayout(panelHexiposi); + panelHexiposi.setLayout(panelHexiposiLayout); + panelHexiposiLayout.setHorizontalGroup( + panelHexiposiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelHexiposiLayout.createSequentialGroup() + .addContainerGap(9, Short.MAX_VALUE) + .addGroup(panelHexiposiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonDetectCover) + .addComponent(hexiposiPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(9, Short.MAX_VALUE)) + ); + panelHexiposiLayout.setVerticalGroup( + panelHexiposiLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelHexiposiLayout.createSequentialGroup() + .addContainerGap(14, Short.MAX_VALUE) + .addComponent(hexiposiPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 9, Short.MAX_VALUE) + .addComponent(buttonDetectCover) + .addContainerGap()) + ); + + panelViewType.setBorder(javax.swing.BorderFactory.createTitledBorder("View")); + + buttonCamera.setText("Image"); + buttonCamera.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCameraActionPerformed(evt); + } + }); + + buttonDrawing.setSelected(true); + buttonDrawing.setText("Design"); + buttonDrawing.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonDrawingActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelViewTypeLayout = new javax.swing.GroupLayout(panelViewType); + panelViewType.setLayout(panelViewTypeLayout); + panelViewTypeLayout.setHorizontalGroup( + panelViewTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelViewTypeLayout.createSequentialGroup() + .addContainerGap(8, Short.MAX_VALUE) + .addGroup(panelViewTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) + .addComponent(buttonDrawing) + .addComponent(buttonCamera)) + .addContainerGap(8, Short.MAX_VALUE)) + ); + + panelViewTypeLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonCamera, buttonDrawing}); + + panelViewTypeLayout.setVerticalGroup( + panelViewTypeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelViewTypeLayout.createSequentialGroup() + .addContainerGap() + .addComponent(buttonCamera) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonDrawing) + .addContainerGap()) + ); + + javax.swing.GroupLayout basePlatePanelLayout = new javax.swing.GroupLayout(basePlatePanel); + basePlatePanel.setLayout(basePlatePanelLayout); + basePlatePanelLayout.setHorizontalGroup( + basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, basePlatePanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelDetection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(panelLegend, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 276, Short.MAX_VALUE) + .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelHexiposi, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(panelViewType, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + basePlatePanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {panelDetection, panelViewType}); + + basePlatePanelLayout.setVerticalGroup( + basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, basePlatePanelLayout.createSequentialGroup() + .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(panelViewType, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelDetection, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(basePlatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelLegend, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelHexiposi, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + basePlatePanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {panelHexiposi, panelLegend}); + + panelLN2Level.setBorder(javax.swing.BorderFactory.createTitledBorder("LN2 Level")); + + progressLN2.setMaximum(1000); + progressLN2.setOrientation(1); + + jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/pin3.png"))); // NOI18N + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(progressLN2, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(4, 4, 4) + .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 38, Short.MAX_VALUE) + .addGap(0, 0, 0)) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(progressLN2, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel4) + .addGap(2, 2, 2)) + ); + + javax.swing.GroupLayout panelLN2LevelLayout = new javax.swing.GroupLayout(panelLN2Level); + panelLN2Level.setLayout(panelLN2LevelLayout); + panelLN2LevelLayout.setHorizontalGroup( + panelLN2LevelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelLN2LevelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0)) + ); + panelLN2LevelLayout.setVerticalGroup( + panelLN2LevelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelLN2LevelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + + panelBeamlineStatus.setBorder(javax.swing.BorderFactory.createTitledBorder("Beamline Status")); + + jLabel8.setText("Valve state"); + + jLabel9.setText("Transfer permitted"); + + javax.swing.GroupLayout panelBeamlineStatusLayout = new javax.swing.GroupLayout(panelBeamlineStatus); + panelBeamlineStatus.setLayout(panelBeamlineStatusLayout); + panelBeamlineStatusLayout.setHorizontalGroup( + panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelBeamlineStatusLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelBeamlineStatusLayout.createSequentialGroup() + .addComponent(led5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel8)) + .addGroup(panelBeamlineStatusLayout.createSequentialGroup() + .addComponent(led6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel9))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + panelBeamlineStatusLayout.setVerticalGroup( + panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelBeamlineStatusLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addGroup(panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(led5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel8)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelBeamlineStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(led6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel9)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + panelSystemStatus.setBorder(javax.swing.BorderFactory.createTitledBorder("System Status")); + + jLabel24.setText("Air Pressure"); + + jLabel25.setText("N2 Pressure"); + + jLabel26.setText("Local Safety"); + + jLabell21.setText("Door Safety"); + + buttonRelease.setText("Release"); + buttonRelease.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonReleaseActionPerformed(evt); + } + }); + + labelRoomTemperature.setText("Room Temperature"); + + labelManualMode.setText("Manual Mode"); + + jLabel29.setText("Heater"); + + panelHeaterTemp.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + panelHeaterTemp.setDeviceName("rim_heater_temp"); + + jLabel27.setText("Dryer"); + + javax.swing.GroupLayout panelSystemStatusLayout = new javax.swing.GroupLayout(panelSystemStatus); + panelSystemStatus.setLayout(panelSystemStatusLayout); + panelSystemStatusLayout.setHorizontalGroup( + panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelSystemStatusLayout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(ledAirPressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledHeaterOk, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledN2Pressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledLocalSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledRoomTemperature, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledPsysSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledManualMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(ledDryer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel24) + .addComponent(jLabel25) + .addGroup(panelSystemStatusLayout.createSequentialGroup() + .addComponent(jLabel29) + .addGap(18, 18, Short.MAX_VALUE) + .addComponent(panelHeaterTemp, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jLabel26) + .addComponent(jLabell21) + .addComponent(labelRoomTemperature) + .addComponent(labelManualMode) + .addComponent(jLabel27)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(panelSystemStatusLayout.createSequentialGroup() + .addComponent(filler1, 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(buttonRelease) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + panelSystemStatusLayout.setVerticalGroup( + panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelSystemStatusLayout.createSequentialGroup() + .addGap(0, 7, Short.MAX_VALUE) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(panelSystemStatusLayout.createSequentialGroup() + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledManualMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelManualMode)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledRoomTemperature, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(labelRoomTemperature)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledHeaterOk, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel29))) + .addComponent(panelHeaterTemp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledAirPressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel24)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledN2Pressure, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel25)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledDryer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel27)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledLocalSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel26)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ledPsysSafety, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabell21)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) + .addGroup(panelSystemStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelSystemStatusLayout.createSequentialGroup() + .addComponent(buttonRelease) + .addGap(0, 0, Short.MAX_VALUE)) + .addComponent(filler1, javax.swing.GroupLayout.DEFAULT_SIZE, 35, Short.MAX_VALUE)) + .addGap(4, 4, 4)) + ); + + panelDatamatrix.setBorder(javax.swing.BorderFactory.createTitledBorder("Datamatrix")); + + jLabel11.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel11.setText("Puck:"); + + jLabel13.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel13.setText("Sample:"); + + textSampleDatamatrix.setEditable(false); + textSampleDatamatrix.setBackground(new java.awt.Color(214, 217, 223)); + textSampleDatamatrix.setHorizontalAlignment(javax.swing.JTextField.CENTER); + + textPuckDatamatrix.setEditable(false); + textPuckDatamatrix.setBackground(new java.awt.Color(214, 217, 223)); + textPuckDatamatrix.setHorizontalAlignment(javax.swing.JTextField.CENTER); + + javax.swing.GroupLayout panelDatamatrixLayout = new javax.swing.GroupLayout(panelDatamatrix); + panelDatamatrix.setLayout(panelDatamatrixLayout); + panelDatamatrixLayout.setHorizontalGroup( + panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDatamatrixLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(panelDatamatrixLayout.createSequentialGroup() + .addComponent(jLabel11) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(textPuckDatamatrix, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(panelDatamatrixLayout.createSequentialGroup() + .addComponent(jLabel13) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(textSampleDatamatrix))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + panelDatamatrixLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel11, jLabel13}); + + panelDatamatrixLayout.setVerticalGroup( + panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDatamatrixLayout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addGroup(panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel11) + .addComponent(textPuckDatamatrix, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(panelDatamatrixLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel13) + .addComponent(textSampleDatamatrix, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 0, Short.MAX_VALUE)) + ); + + javax.swing.GroupLayout panelStatusLayout = new javax.swing.GroupLayout(panelStatus); + panelStatus.setLayout(panelStatusLayout); + panelStatusLayout.setHorizontalGroup( + panelStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelBeamlineStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelDatamatrix, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelSystemStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + panelStatusLayout.setVerticalGroup( + panelStatusLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelStatusLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(panelSystemStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(0, 0, 0) + .addComponent(panelBeamlineStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(0, 0, 0) + .addComponent(panelDatamatrix, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + panelDetail.setBorder(javax.swing.BorderFactory.createTitledBorder("Detail")); + panelDetail.setPreferredSize(new java.awt.Dimension(300, 95)); + + javax.swing.GroupLayout panelDetailLayout = new javax.swing.GroupLayout(panelDetail); + panelDetail.setLayout(panelDetailLayout); + panelDetailLayout.setHorizontalGroup( + panelDetailLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 0, Short.MAX_VALUE) + ); + panelDetailLayout.setVerticalGroup( + panelDetailLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 0, Short.MAX_VALUE) + ); + + panelDisplayMode.setBorder(javax.swing.BorderFactory.createTitledBorder("Mode")); + + btViewDewar.setSelected(true); + btViewDewar.setText("Dewar"); + btViewDewar.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btViewDewarActionPerformed(evt); + } + }); + + btViewRT.setText("Room Temp."); + btViewRT.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btViewRTActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelDisplayModeLayout = new javax.swing.GroupLayout(panelDisplayMode); + panelDisplayMode.setLayout(panelDisplayModeLayout); + panelDisplayModeLayout.setHorizontalGroup( + panelDisplayModeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDisplayModeLayout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btViewDewar) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btViewRT) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + panelDisplayModeLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btViewDewar, btViewRT}); + + panelDisplayModeLayout.setVerticalGroup( + panelDisplayModeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDisplayModeLayout.createSequentialGroup() + .addContainerGap() + .addGroup(panelDisplayModeLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(btViewDewar) + .addComponent(btViewRT)) + .addContainerGap()) + ); + + panelDevices.setBorder(javax.swing.BorderFactory.createTitledBorder("Devices")); + panelDevices.setPreferredSize(new java.awt.Dimension(300, 282)); + + devicesPanel.setActive(false); + + checkExpert.setText("Expert"); + checkExpert.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + checkExpert.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + checkExpertActionPerformed(evt); + } + }); + + buttonCalibrateImage.setText("Calibrate"); + buttonCalibrateImage.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCalibrateImageActionPerformed(evt); + } + }); + + buttonCalibrateCover.setText("Cover Ref"); + buttonCalibrateCover.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonCalibrateCoverActionPerformed(evt); + } + }); + + buttonExpertCommands.setText("Commands"); + buttonExpertCommands.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonExpertCommandsActionPerformed(evt); + } + }); + + buttonRecovery.setText("Recovery"); + buttonRecovery.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonRecoveryActionPerformed(evt); + } + }); + + buttonConfig.setText("Settings"); + buttonConfig.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonConfigActionPerformed(evt); + } + }); + + javax.swing.GroupLayout panelExpertLayout = new javax.swing.GroupLayout(panelExpert); + panelExpert.setLayout(panelExpertLayout); + panelExpertLayout.setHorizontalGroup( + panelExpertLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelExpertLayout.createSequentialGroup() + .addGroup(panelExpertLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(buttonExpertCommands, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonRecovery, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonCalibrateImage, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonCalibrateCover, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(buttonConfig, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(panelExpertLayout.createSequentialGroup() + .addComponent(checkExpert, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + ); + + panelExpertLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {buttonCalibrateCover, buttonCalibrateImage, buttonConfig, buttonExpertCommands, buttonRecovery}); + + panelExpertLayout.setVerticalGroup( + panelExpertLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelExpertLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(checkExpert) + .addGap(18, 26, Short.MAX_VALUE) + .addComponent(buttonExpertCommands) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonRecovery) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonCalibrateImage) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonCalibrateCover) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(buttonConfig) + .addGap(0, 0, 0)) + ); + + javax.swing.GroupLayout panelDevicesLayout = new javax.swing.GroupLayout(panelDevices); + panelDevices.setLayout(panelDevicesLayout); + panelDevicesLayout.setHorizontalGroup( + panelDevicesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDevicesLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(devicesPanel, 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(panelExpert, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + panelDevicesLayout.setVerticalGroup( + panelDevicesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelDevicesLayout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(panelDevicesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelExpert, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(devicesPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)) + .addContainerGap(8, Short.MAX_VALUE)) + ); + + javax.swing.GroupLayout panelRightLayout = new javax.swing.GroupLayout(panelRight); + panelRight.setLayout(panelRightLayout); + panelRightLayout.setHorizontalGroup( + panelRightLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelRightLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(panelRightLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(panelDetail, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE) + .addComponent(panelDisplayMode, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelDevices, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE)) + .addGap(0, 0, 0)) + ); + panelRightLayout.setVerticalGroup( + panelRightLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelRightLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(panelDetail, javax.swing.GroupLayout.DEFAULT_SIZE, 108, Short.MAX_VALUE) + .addGap(0, 0, 0) + .addComponent(panelDevices, javax.swing.GroupLayout.PREFERRED_SIZE, 280, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(panelDisplayMode, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0)) + ); + + javax.swing.GroupLayout panelTopLayout = new javax.swing.GroupLayout(panelTop); + panelTop.setLayout(panelTopLayout); + panelTopLayout.setHorizontalGroup( + panelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelTopLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(panelLN2Level, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(panelStatus, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(basePlatePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(panelRight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0)) + ); + panelTopLayout.setVerticalGroup( + panelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(panelTopLayout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(panelTopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelRight, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(basePlatePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelLN2Level, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(0, 0, 0)) + ); + + panelBottom.setPreferredSize(new java.awt.Dimension(810, 150)); + panelBottom.setRequestFocusEnabled(false); + + jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Samples")); + + tableSamples.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + + }, + new String [] { + + } + )); + tableSamples.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + panelTableSamples.setViewportView(tableSamples); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(panelTableSamples) + .addGap(0, 0, 0)) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(panelTableSamples, javax.swing.GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE) + .addGap(0, 0, 0)) + ); + + jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder("Pucks")); + + tablePucks.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null} + }, + new String [] { + "Address", "Status", "Id" + } + ) { + Class[] types = new Class [] { + java.lang.String.class, java.lang.String.class, java.lang.String.class + }; + boolean[] canEdit = new boolean [] { + false, false, false + }; + + public Class getColumnClass(int columnIndex) { + return types [columnIndex]; + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return canEdit [columnIndex]; + } + }); + tablePucks.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); + panelTablePucks.setViewportView(tablePucks); + + javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); + jPanel4.setLayout(jPanel4Layout); + jPanel4Layout.setHorizontalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(panelTablePucks, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE) + .addGap(0, 0, 0)) + ); + jPanel4Layout.setVerticalGroup( + jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel4Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addComponent(panelTablePucks, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addGap(0, 0, 0)) + ); + + javax.swing.GroupLayout panelBottomLayout = new javax.swing.GroupLayout(panelBottom); + panelBottom.setLayout(panelBottomLayout); + panelBottomLayout.setHorizontalGroup( + panelBottomLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelBottomLayout.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) + .addGap(0, 0, 0)) + ); + panelBottomLayout.setVerticalGroup( + panelBottomLayout.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) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(panelTop, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(panelBottom, javax.swing.GroupLayout.DEFAULT_SIZE, 1030, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(panelTop, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(0, 0, 0) + .addComponent(panelBottom, javax.swing.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE) + .addGap(1, 1, 1)) + ); + }// //GEN-END:initComponents + + private void buttonCameraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCameraActionPerformed + buttonDrawing.setSelected(!buttonCamera.isSelected()); + updateViewType(); + }//GEN-LAST:event_buttonCameraActionPerformed + + private void buttonExpertCommandsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonExpertCommandsActionPerformed + try { + Panel panel = showCommandsPanel(); + onExpertCommand(SwingUtils.getWindow(panel)); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonExpertCommandsActionPerformed + + //Dialog dlgDetPlot; + //Dialog dlgDetText; + Dialog dlgDetRenderer; + JComponent dlgDetPlotComp; + JComponent dlgDetTextComp; + JComponent dlgDetRendererComp; + + private void buttonPuckDetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPuckDetActionPerformed + try { + /* + if ((dlgDetPlot == null) || (!dlgDetPlot.isShowing())){ + dlgDetPlotComp = new ch.psi.pshell.plot.LinePlotJFree(); + ((ch.psi.pshell.plot.LinePlotJFree) dlgDetPlotComp).setTitle(""); + dlgDetPlot = SwingUtils.showDialog(getTopLevel(), "Puck Detection", new Dimension(600,400), dlgDetPlotComp); + } + if ((dlgDetText == null)|| (!dlgDetText.isShowing())){ + dlgDetTextComp = new javax.swing.JTextArea(); + ((javax.swing.JTextArea)dlgDetTextComp).setEditable(false); + dlgDetText = SwingUtils.showDialog(getTopLevel(), "Puck Detection", new Dimension(600,400), dlgDetTextComp); + } + */ + if (!App.isDetached()) { + if ((dlgDetRenderer == null) || (!dlgDetRenderer.isShowing())) { + dlgDetRendererComp = new Renderer(); + ((Renderer) dlgDetRendererComp).setMode(RendererMode.Fit); + dlgDetRenderer = SwingUtils.showDialog(getTopLevel(), "Puck Detection", new Dimension(600, 400), dlgDetRendererComp); + } + } + Controller.getInstance().imageDetectPucks(dlgDetPlotComp, dlgDetRendererComp, dlgDetTextComp); + + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonPuckDetActionPerformed + + private void buttonClearDetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonClearDetActionPerformed + try { + Controller.getInstance().clearImageDetection(); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonClearDetActionPerformed + + + private void checkExpertActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkExpertActionPerformed + if (checkExpert.isSelected()) { + PasswordDialog dlg = new PasswordDialog(getTopLevel(), true, 1234); + dlg.setResizable(false); + dlg.setLocationRelativeTo(getTopLevel()); + dlg.setVisible(true); + if (dlg.getResult() == false) { + checkExpert.setSelected(false); + return; + } + } + setExpertMode(checkExpert.isSelected()); + }//GEN-LAST:event_checkExpertActionPerformed + + private void buttonDrawingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDrawingActionPerformed + buttonCamera.setSelected(!buttonDrawing.isSelected()); + updateViewType(); + }//GEN-LAST:event_buttonDrawingActionPerformed + + private void btViewDewarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btViewDewarActionPerformed + btViewRT.setSelected(!btViewDewar.isSelected()); + if (btViewRT.isSelected()) { + setDefaultDetail(); + } + updateViewMode(); + }//GEN-LAST:event_btViewDewarActionPerformed + + private void btViewRTActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btViewRTActionPerformed + btViewDewar.setSelected(!btViewRT.isSelected()); + if (btViewRT.isSelected()) { + setDefaultDetail(); + } + updateViewMode(); + }//GEN-LAST:event_btViewRTActionPerformed + + private void buttonRecoveryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonRecoveryActionPerformed + try { + Panel panel = showRecoveryPanel(); + onExpertCommand(SwingUtils.getWindow(panel)); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonRecoveryActionPerformed + + private void buttonCalibrateImageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCalibrateImageActionPerformed + onExpertCommand(null); + execute("imgproc/CameraCalibration", null, false, true); + }//GEN-LAST:event_buttonCalibrateImageActionPerformed + + private void buttonDetectCoverActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDetectCoverActionPerformed + try { + execute("cover_detection_debug=True"); + runAsync("imgproc/CoverDetection", null, false).handle((ret, ex) -> { + execute("cover_detection_debug=False", true); + if (ex != null) { + showException((Exception) ex); + } else { + showMessage("Return", String.valueOf(ret)); + } + return ret; + }); + } catch (Exception ex) { + showException(ex); + } + }//GEN-LAST:event_buttonDetectCoverActionPerformed + + private void buttonCalibrateCoverActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCalibrateCoverActionPerformed + onExpertCommand(null); + execute("imgproc/CoverDetectionCalibration", null, false, true); + }//GEN-LAST:event_buttonCalibrateCoverActionPerformed + + private void buttonConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonConfigActionPerformed + onExpertCommand(null); + + boolean current = false; + try { + current = "true".equalsIgnoreCase(getSetting("valve_control")); + } catch (Exception ex) { + } + + showSettingsEditor(true); + + //Check if must open valve + if (current) { + SwingUtilities.invokeLater(() -> { + try { + boolean valveControl = "true".equalsIgnoreCase(getSetting("valve_control")); + if (!valveControl) { + execute("open_valve()", true); + } + } catch (Exception ex) { + getLogger().log(Level.WARNING, null, ex); + } + }); + + } + }//GEN-LAST:event_buttonConfigActionPerformed + + private void buttonReleaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonReleaseActionPerformed + execute("release_safety()", true); + }//GEN-LAST:event_buttonReleaseActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + ch.psi.mxsc.BasePlatePanel basePlatePanel; + private javax.swing.JToggleButton btViewDewar; + private javax.swing.JToggleButton btViewRT; + private javax.swing.JButton buttonCalibrateCover; + private javax.swing.JButton buttonCalibrateImage; + private javax.swing.JToggleButton buttonCamera; + private javax.swing.JButton buttonClearDet; + private javax.swing.JButton buttonConfig; + private javax.swing.JButton buttonDetectCover; + private javax.swing.JToggleButton buttonDrawing; + private javax.swing.JButton buttonExpertCommands; + private javax.swing.JButton buttonPuckDet; + private javax.swing.JButton buttonRecovery; + private javax.swing.JButton buttonRelease; + private javax.swing.JCheckBox checkExpert; + private ch.psi.mxsc.DevicesPanel devicesPanel; + private javax.swing.Box.Filler filler1; + ch.psi.mxsc.HexiposiPanel hexiposiPanel; + private javax.swing.JLabel jLabel11; + private javax.swing.JLabel jLabel13; + private javax.swing.JLabel jLabel15; + private javax.swing.JLabel jLabel16; + private javax.swing.JLabel jLabel19; + private javax.swing.JLabel jLabel20; + private javax.swing.JLabel jLabel23; + private javax.swing.JLabel jLabel24; + private javax.swing.JLabel jLabel25; + private javax.swing.JLabel jLabel26; + private javax.swing.JLabel jLabel27; + private javax.swing.JLabel jLabel29; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel8; + private javax.swing.JLabel jLabel9; + private javax.swing.JLabel jLabell21; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel3; + private javax.swing.JPanel jPanel4; + private javax.swing.JLabel labelManualMode; + private javax.swing.JLabel labelRoomTemperature; + private ch.psi.pshell.swing.Led led5; + private ch.psi.pshell.swing.Led led6; + private ch.psi.pshell.swing.Led ledAirPressure; + private ch.psi.pshell.swing.Led ledDryer; + private ch.psi.pshell.swing.Led ledHeaterOk; + private ch.psi.pshell.swing.Led ledLidControlActive1; + private ch.psi.pshell.swing.Led ledLidControlActive2; + private ch.psi.pshell.swing.Led ledLidControlActive3; + private ch.psi.pshell.swing.Led ledLidControlActive4; + private ch.psi.pshell.swing.Led ledLidControlActive5; + private ch.psi.pshell.swing.Led ledLocalSafety; + private ch.psi.pshell.swing.Led ledManualMode; + private ch.psi.pshell.swing.Led ledN2Pressure; + private ch.psi.pshell.swing.Led ledPsysSafety; + private ch.psi.pshell.swing.Led ledRoomTemperature; + private javax.swing.JPanel panelBeamlineStatus; + private javax.swing.JPanel panelBottom; + private javax.swing.JPanel panelDatamatrix; + private javax.swing.JPanel panelDetail; + private javax.swing.JPanel panelDetection; + private javax.swing.JPanel panelDevices; + private javax.swing.JPanel panelDisplayMode; + private javax.swing.JPanel panelExpert; + private ch.psi.pshell.swing.DeviceValuePanel panelHeaterTemp; + private javax.swing.JPanel panelHexiposi; + private javax.swing.JPanel panelLN2Level; + private javax.swing.JPanel panelLegend; + private javax.swing.JPanel panelRight; + private javax.swing.JPanel panelStatus; + private javax.swing.JPanel panelSystemStatus; + private javax.swing.JScrollPane panelTablePucks; + private javax.swing.JScrollPane panelTableSamples; + private javax.swing.JPanel panelTop; + private javax.swing.JPanel panelViewType; + private javax.swing.JProgressBar progressLN2; + private javax.swing.JTable tablePucks; + private javax.swing.JTable tableSamples; + private javax.swing.JTextField textPuckDatamatrix; + private javax.swing.JTextField textSampleDatamatrix; + // End of variables declaration//GEN-END:variables + +} diff --git a/src/main/java/ch/psi/mxsc/PuckDetection.java b/src/main/java/ch/psi/mxsc/PuckDetection.java index 36c2358..f8cd195 100644 --- a/src/main/java/ch/psi/mxsc/PuckDetection.java +++ b/src/main/java/ch/psi/mxsc/PuckDetection.java @@ -1,222 +1,227 @@ -package ch.psi.mxsc; - -import ch.psi.pshell.core.JsonSerializer; -import ch.psi.pshell.device.DeviceBase; -import ch.psi.pshell.device.ReadonlyAsyncRegisterBase; -import ch.psi.pshell.device.ReadonlyRegisterBase; -import ch.psi.utils.Chrono; -import ch.psi.utils.State; -import ch.psi.utils.Threading; -import java.io.IOException; -import java.util.List; -import java.util.logging.Level; - -public class PuckDetection extends DeviceBase { - - final String server; - public volatile Chrono chrono; - boolean debug; - public static final int TIMEOUT = 10000; - - public PuckDetection(String name, String server) { - super(name); - this.server = server.startsWith("tcp://") ? server : "tcp://" + server; - } - - public boolean isDebug() { - return debug; - } - - public void setDebug(boolean value) { - debug = value; - } - - Thread thread; - Thread watchDog; - - class UpdateTimeReadable extends ReadonlyAsyncRegisterBase{ - UpdateTimeReadable(){ - super("Raspberry Update Time"); - } - void update(int value){ - setCache(value); - } - }; - public UpdateTimeReadable updateTime = new UpdateTimeReadable(); - - @Override - protected void doInitialize() throws IOException, InterruptedException { - doClose(); - super.doInitialize(); - - chrono = new Chrono(); - thread = new Thread(new Runnable() { - @Override - public void run() { - subscriberTask(); - } - }); - thread.setDaemon(true); - thread.start(); - - watchDog = new Thread(new Runnable() { - @Override - public void run() { - try { - while (!Thread.currentThread().isInterrupted()) { - if (chrono.isTimeout(TIMEOUT)) { - if (!isSimulated()) { - setState(State.Offline); - if (Controller.getInstance() != null) { - Controller.getInstance().clearPuckStates(); - } - } - } - Thread.sleep(1000); - } - } catch (InterruptedException ex) { - getLogger().fine("Watch-dog thread interrupted"); - } catch (Exception ex) { - getLogger().log(Level.WARNING, null, ex); - } - } - }); - watchDog.setDaemon(true); - watchDog.start(); - } - - void subscriberTask() { - try { - setState(State.Ready); - if (isSimulated()) { - while (!Thread.currentThread().isInterrupted()) { - boolean changed = false; - for (int address = 1; address <= Controller.NUMBER_OF_PUCKS; address++) { - Integer indDetector = ((address <= 6) || (address==30)) ? 1 : 0; - Integer mecDetector = ((address <= 6) || (address==29)) ? 1 : 0; - int index = Controller.getInstance().getPuckIndex(address); - PuckState puck = Controller.getInstance().getPuckState(index); - if (puck.set(mecDetector, indDetector)){ - changed = true; - } - } - if (changed){ - if (Controller.getInstance() != null) { - Controller.getInstance().updateView(); - } - } - chrono = new Chrono(); - Thread.sleep(2000); - } - } else { - org.zeromq.ZMQ.Context context = org.zeromq.ZMQ.context(1); - org.zeromq.ZMQ.Socket subscriber = context.socket(org.zeromq.ZMQ.SUB); - subscriber.connect(server); - //subscriber.subscribe("Status".getBytes()); - subscriber.subscribe("".getBytes()); - try { - if (debug) { - System.out.println("Start listening"); - } - while (!Thread.currentThread().isInterrupted()) { - //String type = subscriber.recvStr(); - //System.out.println(type); - String contents = subscriber.recvStr(); - if (debug) { - System.out.println(contents); - } - processMessage(contents); - - if (Controller.getInstance() != null) { - Controller.getInstance().updateView(); - } - setState(State.Ready); - if (chrono != null){ - updateTime.update(chrono.getEllapsed()); - } - chrono = new Chrono(); - } - } finally { - if (debug) { - System.out.println("Stop listening"); - } - - if (Controller.getInstance() != null) { - Controller.getInstance().clearPuckStates(); - } - subscriber.close(); - context.term(); - } - } - } catch (Exception ex) { - getLogger().log(Level.INFO, null, ex); - } - setState(State.Offline); - } - - void processMessage(String str) { - try { - //System.out.println(str); - List detection = (List) JsonSerializer.decode(str, List.class); - - int address = 1; - for (List bus : detection) { - for (List sensor : bus) { - Integer indDetector = sensor.get(0); - Integer mecDetector = sensor.get(1); - if (Controller.getInstance()!=null){ - int index = Controller.getInstance().getPuckIndex(address); - PuckState puck = Controller.getInstance().getPuckState(index); - puck.set(mecDetector, indDetector); - } - address++; - } - } - setCache(str); - } catch (Exception ex) { - getLogger().log(Level.INFO, null, ex); - } - } - - public PuckState getPuckState(int id) throws Exception { - if (Controller.getInstance() == null) { - return null; - } - return Controller.getInstance().getPuckState(id); - } - - public Puck getPuck(String name) throws Exception { - if (Controller.getInstance() == null) { - return null; - } - return Controller.getInstance().getPuck(name); - } - - - @Override - protected void doClose() { - if (watchDog != null) { - watchDog.interrupt(); - watchDog = null; - } - if (thread != null) { - - try { - Threading.stop(thread, true, 2000); - } catch (InterruptedException ex) { - //TODO: Filtering InterruptedException. But stop() should not throw InterruptedException; - getLogger().log(Level.WARNING, null, ex); - } - thread = null; - } - } - - public static void main(String[] args) throws IOException, InterruptedException { - //PuckDetection pd = new PuckDetection("PD", "129.129.110.99:5556"); - //PuckDetection pd = new PuckDetection("PD","raspberrypi:5556"); - PuckDetection pd = new PuckDetection("PD", "tell10s-raspberrypi:5556"); - pd.setDebug(true); - pd.initialize(); - Thread.sleep(100000); - } -} +package ch.psi.mxsc; + +import ch.psi.pshell.core.JsonSerializer; +import ch.psi.pshell.device.DeviceBase; +import ch.psi.pshell.device.ReadonlyAsyncRegisterBase; +import ch.psi.pshell.device.ReadonlyRegisterBase; +import ch.psi.utils.Chrono; +import ch.psi.utils.State; +import ch.psi.utils.Threading; +import java.io.IOException; +import java.util.List; +import java.util.logging.Level; + +public class PuckDetection extends DeviceBase { + + final String server; + public volatile Chrono chrono; + boolean debug; + public static final int TIMEOUT = 10000; + + public PuckDetection(String name, String server) { + super(name); + this.server = server.startsWith("tcp://") ? server : "tcp://" + server; + if(MainPanel.isRt()){ + setSimulated(); + } + } + + public boolean isDebug() { + return debug; + } + + public void setDebug(boolean value) { + debug = value; + } + + Thread thread; + Thread watchDog; + + class UpdateTimeReadable extends ReadonlyAsyncRegisterBase{ + UpdateTimeReadable(){ + super("Raspberry Update Time"); + } + void update(int value){ + setCache(value); + } + }; + public UpdateTimeReadable updateTime = new UpdateTimeReadable(); + + @Override + protected void doInitialize() throws IOException, InterruptedException { + doClose(); + super.doInitialize(); + + chrono = new Chrono(); + thread = new Thread(new Runnable() { + @Override + public void run() { + subscriberTask(); + } + }); + thread.setDaemon(true); + thread.start(); + + watchDog = new Thread(new Runnable() { + @Override + public void run() { + try { + while (!Thread.currentThread().isInterrupted()) { + if (chrono.isTimeout(TIMEOUT)) { + if (!isSimulated()) { + setState(State.Offline); + if (Controller.getInstance() != null) { + Controller.getInstance().clearPuckStates(); + } + } + } + Thread.sleep(1000); + } + } catch (InterruptedException ex) { + getLogger().fine("Watch-dog thread interrupted"); + } catch (Exception ex) { + getLogger().log(Level.WARNING, null, ex); + } + } + }); + watchDog.setDaemon(true); + watchDog.start(); + } + + void subscriberTask() { + try { + setState(State.Ready); + if (isSimulated()) { + while (!Thread.currentThread().isInterrupted()) { + boolean changed = false; + for (int address = 1; address <= Controller.NUMBER_OF_PUCKS; address++) { + Integer indDetector = ((address <= 6) || (address==30)) ? 1 : 0; + Integer mecDetector = ((address <= 6) || (address==29)) ? 1 : 0; + int index = Controller.getInstance().getPuckIndex(address); + PuckState puck = Controller.getInstance().getPuckState(index); + if (puck.set(mecDetector, indDetector)){ + changed = true; + } + } + if (changed){ + if (Controller.getInstance() != null) { + Controller.getInstance().updateView(); + } + } + chrono = new Chrono(); + Thread.sleep(2000); + } + } else { + org.zeromq.ZMQ.Context context = org.zeromq.ZMQ.context(1); + org.zeromq.ZMQ.Socket subscriber = context.socket(org.zeromq.ZMQ.SUB); + subscriber.connect(server); + //subscriber.subscribe("Status".getBytes()); + subscriber.subscribe("".getBytes()); + try { + if (debug) { + System.out.println("Start listening"); + } + while (!Thread.currentThread().isInterrupted()) { + //String type = subscriber.recvStr(); + //System.out.println(type); + String contents = subscriber.recvStr(); + if (debug) { + System.out.println(contents); + } + processMessage(contents); + + if (Controller.getInstance() != null) { + Controller.getInstance().updateView(); + } + setState(State.Ready); + if (chrono != null){ + updateTime.update(chrono.getEllapsed()); + } + chrono = new Chrono(); + } + } finally { + if (debug) { + System.out.println("Stop listening"); + } + + if (Controller.getInstance() != null) { + Controller.getInstance().clearPuckStates(); + } + subscriber.close(); + context.term(); + } + } + } catch (Exception ex) { + getLogger().log(Level.INFO, null, ex); + } + if (!isSimulated()) { + setState(State.Offline); + } + } + + void processMessage(String str) { + try { + //System.out.println(str); + List detection = (List) JsonSerializer.decode(str, List.class); + + int address = 1; + for (List bus : detection) { + for (List sensor : bus) { + Integer indDetector = sensor.get(0); + Integer mecDetector = sensor.get(1); + if (Controller.getInstance()!=null){ + int index = Controller.getInstance().getPuckIndex(address); + PuckState puck = Controller.getInstance().getPuckState(index); + puck.set(mecDetector, indDetector); + } + address++; + } + } + setCache(str); + } catch (Exception ex) { + getLogger().log(Level.INFO, null, ex); + } + } + + public PuckState getPuckState(int id) throws Exception { + if (Controller.getInstance() == null) { + return null; + } + return Controller.getInstance().getPuckState(id); + } + + public Puck getPuck(String name) throws Exception { + if (Controller.getInstance() == null) { + return null; + } + return Controller.getInstance().getPuck(name); + } + + + @Override + protected void doClose() { + if (watchDog != null) { + watchDog.interrupt(); + watchDog = null; + } + if (thread != null) { + + try { + Threading.stop(thread, true, 2000); + } catch (InterruptedException ex) { + //TODO: Filtering InterruptedException. But stop() should not throw InterruptedException; + getLogger().log(Level.WARNING, null, ex); + } + thread = null; + } + } + + public static void main(String[] args) throws IOException, InterruptedException { + //PuckDetection pd = new PuckDetection("PD", "129.129.110.99:5556"); + //PuckDetection pd = new PuckDetection("PD","raspberrypi:5556"); + PuckDetection pd = new PuckDetection("PD", "tell10s-raspberrypi:5556"); + pd.setDebug(true); + pd.initialize(); + Thread.sleep(100000); + } +}