package org.openpnp.spi.base; import java.util.Collections; import java.util.List; import javax.swing.Icon; import org.openpnp.model.AbstractModelObject; import org.openpnp.model.Configuration; import org.openpnp.model.LengthUnit; import org.openpnp.model.Location; import org.openpnp.spi.Actuator; import org.openpnp.spi.Camera; import org.openpnp.spi.Head; import org.openpnp.spi.Machine; import org.openpnp.spi.Nozzle; import org.openpnp.spi.PasteDispenser; import org.openpnp.util.IdentifiableList; import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.core.Commit; public abstract class AbstractHead extends AbstractModelObject implements Head { @Attribute protected String id; @Attribute(required = false) protected String name; @ElementList(required = false) protected IdentifiableList<Nozzle> nozzles = new IdentifiableList<>(); @ElementList(required = false) protected IdentifiableList<Actuator> actuators = new IdentifiableList<>(); @ElementList(required = false) protected IdentifiableList<Camera> cameras = new IdentifiableList<>(); @ElementList(required = false) protected IdentifiableList<PasteDispenser> pasteDispensers = new IdentifiableList<>(); @Element(required = false) protected Location parkLocation = new Location(LengthUnit.Millimeters); protected Machine machine; public AbstractHead() { this.id = Configuration.createId("HED"); this.name = getClass().getSimpleName(); } @SuppressWarnings("unused") @Commit private void commit() { for (Nozzle nozzle : nozzles) { nozzle.setHead(this); } for (Camera camera : cameras) { camera.setHead(this); } for (Actuator actuator : actuators) { actuator.setHead(this); } for (PasteDispenser pasteDispenser : pasteDispensers) { pasteDispenser.setHead(this); } } @Override public String getId() { return id; } @Override public List<Nozzle> getNozzles() { return Collections.unmodifiableList(nozzles); } @Override public Nozzle getNozzle(String id) { return nozzles.get(id); } @Override public List<Actuator> getActuators() { return Collections.unmodifiableList(actuators); } @Override public Actuator getActuator(String id) { return actuators.get(id); } @Override public Actuator getActuatorByName(String name) { for (Actuator actuator : actuators) { if (actuator.getName().equals(name)) { return actuator; } } return null; } @Override public List<Camera> getCameras() { return Collections.unmodifiableList(cameras); } @Override public Camera getCamera(String id) { return cameras.get(id); } @Override public void addCamera(Camera camera) throws Exception { camera.setHead(this); cameras.add(camera); fireIndexedPropertyChange("cameras", cameras.size() - 1, null, camera); } @Override public void removeCamera(Camera camera) { int index = cameras.indexOf(camera); if (cameras.remove(camera)) { fireIndexedPropertyChange("cameras", index, camera, null); } } @Override public void addActuator(Actuator actuator) throws Exception { actuator.setHead(this); actuators.add(actuator); fireIndexedPropertyChange("actuators", actuators.size() - 1, null, actuator); } @Override public void removeActuator(Actuator actuator) { int index = actuators.indexOf(actuator); if (actuators.remove(actuator)) { fireIndexedPropertyChange("actuators", index, actuator, null); } } @Override public void addNozzle(Nozzle nozzle) throws Exception { nozzle.setHead(this); nozzles.add(nozzle); fireIndexedPropertyChange("nozzles", nozzles.size() - 1, null, nozzle); } @Override public void removeNozzle(Nozzle nozzle) { int index = nozzles.indexOf(nozzle); if (nozzles.remove(nozzle)) { fireIndexedPropertyChange("nozzles", index, nozzle, null); } } @Override public void moveToSafeZ(double speed) throws Exception { for (Nozzle nozzle : nozzles) { nozzle.moveToSafeZ(speed); } for (Camera camera : cameras) { camera.moveToSafeZ(speed); } for (Actuator actuator : actuators) { actuator.moveToSafeZ(speed); } for (PasteDispenser dispenser : pasteDispensers) { dispenser.moveToSafeZ(speed); } } @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public List<PasteDispenser> getPasteDispensers() { return Collections.unmodifiableList(pasteDispensers); } @Override public PasteDispenser getPasteDispenser(String id) { return pasteDispensers.get(id); } @Override public Icon getPropertySheetHolderIcon() { // TODO Auto-generated method stub return null; } @Override public Camera getDefaultCamera() throws Exception { List<Camera> cameras = getCameras(); if (cameras == null || cameras.isEmpty()) { throw new Exception("No default camera available on head " + getName()); } return cameras.get(0); } @Override public Nozzle getDefaultNozzle() throws Exception { List<Nozzle> nozzles = getNozzles(); if (nozzles == null || nozzles.isEmpty()) { throw new Exception("No default nozzle available on head " + getName()); } return nozzles.get(0); } @Override public PasteDispenser getDefaultPasteDispenser() throws Exception { List<PasteDispenser> dispensers = getPasteDispensers(); if (dispensers == null || dispensers.isEmpty()) { throw new Exception("No default paste dispenser available on head " + getName()); } return dispensers.get(0); } @Override public Machine getMachine() { return machine; } @Override public void setMachine(Machine machine) { this.machine = machine; } @Override public void moveToSafeZ() throws Exception { moveToSafeZ(getMachine().getSpeed()); } public Location getParkLocation() { return parkLocation; } public void setParkLocation(Location parkLocation) { this.parkLocation = parkLocation; } }