/* * Copyright (C) 2011 Jason von Nieda <jason@vonnieda.org> * * This file is part of OpenPnP. * * OpenPnP is free software: you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * OpenPnP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with OpenPnP. If not, see * <http://www.gnu.org/licenses/>. * * For more information about OpenPnP visit http://openpnp.org */ package org.openpnp.machine.reference; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.swing.Action; import org.openpnp.gui.support.PropertySheetWizardAdapter; import org.openpnp.gui.support.Wizard; import org.openpnp.machine.reference.camera.ImageCamera; import org.openpnp.machine.reference.camera.OnvifIPCamera; import org.openpnp.machine.reference.camera.OpenCvCamera; import org.openpnp.machine.reference.camera.SimulatedUpCamera; import org.openpnp.machine.reference.camera.Webcams; import org.openpnp.machine.reference.driver.NullDriver; import org.openpnp.machine.reference.feeder.ReferenceAutoFeeder; import org.openpnp.machine.reference.feeder.ReferenceDragFeeder; import org.openpnp.machine.reference.feeder.ReferenceStripFeeder; import org.openpnp.machine.reference.feeder.ReferenceTrayFeeder; import org.openpnp.machine.reference.feeder.ReferenceTubeFeeder; import org.openpnp.machine.reference.psh.ActuatorsPropertySheetHolder; import org.openpnp.machine.reference.psh.CamerasPropertySheetHolder; import org.openpnp.machine.reference.vision.ReferenceBottomVision; import org.openpnp.machine.reference.vision.ReferenceFiducialLocator; import org.openpnp.machine.reference.wizards.ReferenceMachineConfigurationWizard; import org.openpnp.spi.Actuator; import org.openpnp.spi.Camera; import org.openpnp.spi.Feeder; import org.openpnp.spi.FiducialLocator; import org.openpnp.spi.Head; import org.openpnp.spi.Nozzle; import org.openpnp.spi.PartAlignment; import org.openpnp.spi.PasteDispenseJobProcessor; import org.openpnp.spi.PnpJobProcessor; import org.openpnp.spi.PropertySheetHolder; import org.openpnp.spi.base.AbstractMachine; import org.openpnp.spi.base.SimplePropertySheetHolder; import org.pmw.tinylog.Logger; import org.simpleframework.xml.Element; public class ReferenceMachine extends AbstractMachine { @Element(required = false) private ReferenceDriver driver = new NullDriver(); @Element(required = false) protected PnpJobProcessor pnpJobProcessor = new ReferencePnpJobProcessor(); @Element(required = false) protected PasteDispenseJobProcessor pasteDispenseJobProcessor = new ReferencePasteDispenseJobProcessor(); @Element(required = false) protected PasteDispenseJobProcessor glueDispenseJobProcessor = new ReferenceGlueDispenseJobProcessor(); @Element(required = false) protected PartAlignment partAlignment = new ReferenceBottomVision(); @Element(required = false) protected FiducialLocator fiducialLocator = new ReferenceFiducialLocator(); private boolean enabled; private List<Class<? extends Feeder>> registeredFeederClasses = new ArrayList<>(); public ReferenceDriver getDriver() { return driver; } public void setDriver(ReferenceDriver driver) throws Exception { if (driver != this.driver) { setEnabled(false); close(); } this.driver = driver; } @Override public boolean isEnabled() { return enabled; } @Override public void setEnabled(boolean enabled) throws Exception { Logger.debug("setEnabled({})", enabled); if (enabled) { try { driver.setEnabled(true); this.enabled = true; } catch (Exception e) { fireMachineEnableFailed(e.getMessage()); throw e; } fireMachineEnabled(); } else { try { driver.setEnabled(false); this.enabled = false; } catch (Exception e) { fireMachineDisableFailed(e.getMessage()); throw e; } fireMachineDisabled("User requested stop."); } } @Override public Wizard getConfigurationWizard() { return new ReferenceMachineConfigurationWizard(this); } @Override public String getPropertySheetHolderTitle() { return getClass().getSimpleName(); } @Override public PropertySheetHolder[] getChildPropertySheetHolders() { ArrayList<PropertySheetHolder> children = new ArrayList<>(); children.add(new SimplePropertySheetHolder("Signalers", getSignalers())); children.add(new SimplePropertySheetHolder("Feeders", getFeeders())); children.add(new SimplePropertySheetHolder("Heads", getHeads())); children.add(new CamerasPropertySheetHolder(null, "Cameras", getCameras(), null)); children.add(new ActuatorsPropertySheetHolder(null, "Actuators", getActuators(), null)); children.add( new SimplePropertySheetHolder("Driver", Collections.singletonList(getDriver()))); children.add(new SimplePropertySheetHolder("Job Processors", Arrays.asList(getPnpJobProcessor()/* , getPasteDispenseJobProcessor() */))); List<PropertySheetHolder> vision = new ArrayList<>(); vision.add(getPartAlignment()); vision.add(getFiducialLocator()); children.add(new SimplePropertySheetHolder("Vision", vision)); return children.toArray(new PropertySheetHolder[] {}); } @Override public Action[] getPropertySheetHolderActions() { // TODO Auto-generated method stub return null; } @Override public PropertySheet[] getPropertySheets() { return new PropertySheet[] {new PropertySheetWizardAdapter(getConfigurationWizard())}; } public void registerFeederClass(Class<? extends Feeder> cls) { registeredFeederClasses.add(cls); } @Override public List<Class<? extends Feeder>> getCompatibleFeederClasses() { List<Class<? extends Feeder>> l = new ArrayList<>(); l.add(ReferenceStripFeeder.class); l.add(ReferenceTrayFeeder.class); l.add(ReferenceDragFeeder.class); l.add(ReferenceTubeFeeder.class); l.add(ReferenceAutoFeeder.class); l.addAll(registeredFeederClasses); return l; } @Override public List<Class<? extends Camera>> getCompatibleCameraClasses() { List<Class<? extends Camera>> l = new ArrayList<>(); l.add(Webcams.class); l.add(OpenCvCamera.class); l.add(OnvifIPCamera.class); l.add(ImageCamera.class); l.add(SimulatedUpCamera.class); return l; } @Override public List<Class<? extends Nozzle>> getCompatibleNozzleClasses() { List<Class<? extends Nozzle>> l = new ArrayList<>(); l.add(ReferenceNozzle.class); return l; } @Override public List<Class<? extends Actuator>> getCompatibleActuatorClasses() { List<Class<? extends Actuator>> l = new ArrayList<>(); l.add(ReferenceActuator.class); return l; } @Override public void home() throws Exception { Logger.debug("home"); super.home(); } @Override public void close() throws IOException { try { driver.close(); } catch (Exception e) { e.printStackTrace(); } for (Camera camera : getCameras()) { try { camera.close(); } catch (Exception e) { e.printStackTrace(); } } for (Head head : getHeads()) { for (Camera camera : head.getCameras()) { try { camera.close(); } catch (Exception e) { e.printStackTrace(); } } } } @Override public PartAlignment getPartAlignment() { return partAlignment; } @Override public FiducialLocator getFiducialLocator() { return fiducialLocator; } @Override public PnpJobProcessor getPnpJobProcessor() { return pnpJobProcessor; } @Override public PasteDispenseJobProcessor getPasteDispenseJobProcessor() { return pasteDispenseJobProcessor; } @Override public PasteDispenseJobProcessor getGlueDispenseJobProcessor() { return glueDispenseJobProcessor; } }