diff --git a/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotter.java b/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotter.java index 34ffa3de9b7298794fdb90a3d7421b4bcad4201c..2ee466ee925f63e65c113202d92261bc92fe4cae 100644 --- a/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotter.java +++ b/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotter.java @@ -45,18 +45,18 @@ public class MakeBlockXYPlotter extends LaserCutter private final boolean debug = false; // print to command line private static final String MODELNAME = "MakeBlockXYPlotter"; private double addSpacePerRasterLine = 0.5; - private String hostname = "file:///Users/Sven/Desktop/out.gcode"; + private String hostname = ""; private double bedWidth = 300; private double bedHeight = 210; - private int speedRate = 255; + private int delayRate = 5000; private int powerRate = 255; private String usedTool = "PEN"; // PEN, Laser private List<Double> resolutions = Arrays.asList(new Double[]{ 64d // fine liner }); - private int currentSpeed; - private int currentPower; + private int chosenDelay; + private int chosenPower; private ToolState toolState; private PrintWriter w = null; @@ -71,15 +71,15 @@ public class MakeBlockXYPlotter extends LaserCutter private static final String SETTING_RASTER_WHITESPACE = "Additional space per Raster line (mm)"; private static final String SETTING_BEDWIDTH = "Laserbed width (mm)"; private static final String SETTING_BEDHEIGHT = "Laserbed height (mm)"; - private static final String SETTING_SPEED_RATE = "Max. Speed Rate (abs. value)"; - private static final String SETTING_POWER_RATE = "Max. Power Rate (abs. value)"; + private static final String SETTING_DELAY_RATE = "Max. Delay Rate (abs. us)"; + private static final String SETTING_POWER_RATE = "Max. Power Rate (abs. pwm)"; private static final String SETTING_TOOL = "Tool (PEN, LASER)"; private static String[] settingAttributes = new String[]{ SETTING_HOSTNAME, SETTING_RASTER_WHITESPACE, SETTING_BEDWIDTH, SETTING_BEDHEIGHT, - SETTING_SPEED_RATE, + SETTING_DELAY_RATE, SETTING_POWER_RATE, SETTING_TOOL }; @@ -135,38 +135,39 @@ public class MakeBlockXYPlotter extends LaserCutter private void generateInitializationGCode() throws Exception { - this.send("G54");//use table offset - this.send("G21");//units to mm - this.send("G90");//following coordinates are absolute toolOff(); - this.send("G28 X Y");//move to 0 0 + this.sendCommand("G28 X Y");//move to 0 0 } private void generateShutdownGCode() throws Exception { //back to origin and shutdown toolOff(); - this.send("G28 X Y");//move to 0 0 + this.sendCommand("G28 X Y");//move to 0 0 } private void toolOff() throws Exception { if(toolState != ToolState.OFF) { if(usedTool.equals("PEN")) { - this.send("M1 90"); + this.sendCommand("M1 90"); + this.sendCommand(String.format("M3 %d", 0)); // to ensure fastest speed } else if(usedTool.equals("LASER")) { - this.send("M1 ???"); + this.sendCommand(String.format("M4 %d", 0)); + this.sendCommand(String.format("M3 %d", 0)); // to move faster with tool off } else { throw new Exception("Tool " + this.usedTool + " not supported!"); } - toolState = ToolState.OFF; + toolState = ToolState.OFF; } } private void toolOn() throws Exception { if(toolState != ToolState.ON) { if(usedTool.equals("PEN")) { - this.send("M1 130"); + this.sendCommand(String.format("M3 %d", 0)); // to ensure fastest speed + this.sendCommand("M1 130"); } else if(usedTool.equals("LASER")) { - this.send("M1 ???"); + this.sendCommand(String.format("M3 %d", (int) ((double) delayRate * this.chosenDelay / 100))); + this.sendCommand(String.format("M4 %d", (int) ((double) powerRate * this.chosenPower / 100))); } else { throw new Exception("Tool " + this.usedTool + " not supported!"); } @@ -174,32 +175,34 @@ public class MakeBlockXYPlotter extends LaserCutter } } - private void setSpeed(int value) throws Exception{ - if(usedTool.equals("LASER")) { - if (value != currentSpeed) { - this.send(String.format(Locale.US, "G1 F%d", (int) ((double) speedRate * value / 100))); - currentSpeed = value; + private void setDelay(int value) throws Exception{ + // saves just the chosen delay value + // delay of the plotter really set on toolOn(), to move faster with tool off + if(usedTool.equals("LASER")) { // property option only supported if laser + if (value != chosenDelay) { + chosenDelay = value; } } } private void setPower(int value) throws Exception{ - if(usedTool.equals("LASER")) { - if (value != currentPower) { - this.send(String.format(Locale.US, "S%d", (int) ((double) powerRate * value / 100))); - currentPower = value; + // saves just the chosen power value + // power of the laser really set on toolOn() + if(usedTool.equals("LASER")) { // property option only supported if laser + if (value != chosenPower) { + chosenPower = value; } } } private void move(int x, int y, double resolution) throws Exception{ toolOff(); - this.send(String.format(Locale.US, "G0 X%f Y%f", Util.px2mm(x, resolution), Util.px2mm(y, resolution))); + this.sendCommand(String.format(Locale.US, "G0 X%f Y%f", Util.px2mm(x, resolution), Util.px2mm(y, resolution))); } private void line(int x, int y, double resolution) throws Exception{ toolOn(); - this.send(String.format(Locale.US, "G1 X%f Y%f", Util.px2mm(x, resolution), Util.px2mm(y, resolution))); + this.sendCommand(String.format(Locale.US, "G1 X%f Y%f", Util.px2mm(x, resolution), Util.px2mm(y, resolution))); } private void generateVectorGCode(VectorPart vp, double resolution, ProgressListener pl, int startProgress, int maxProgress) throws UnsupportedEncodingException, Exception { @@ -218,10 +221,19 @@ public class MakeBlockXYPlotter extends LaserCutter y = cmd.getY(); this.line(x, y, resolution); break; - case SETPROPERTY: - PowerSpeedFocusFrequencyProperty p = (PowerSpeedFocusFrequencyProperty) cmd.getProperty(); - this.setPower(p.getPower()); - this.setSpeed(p.getSpeed()); + case SETPROPERTY: // called once per part to set chosen properties + MakeBlockXYPlotterProperty p = (MakeBlockXYPlotterProperty) cmd.getProperty(); // only set with LASER tool + // ensure percent power + int pPercent = p.getPower(); + pPercent = pPercent<0?0:pPercent; + pPercent = pPercent>100?100:pPercent; + this.setPower(pPercent); + // ensure percent speed + int sPercent = p.getSpeed(); + sPercent = sPercent<0?0:sPercent; + sPercent = sPercent>100?100:sPercent; + int dPercent = 100-sPercent; // convert speed to delay + this.setDelay(dPercent); break; } i++; @@ -237,9 +249,12 @@ public class MakeBlockXYPlotter extends LaserCutter boolean dirRight = true; Point rasterStart = rp.getRasterStart(); + + // called once per part to set chosen properties PowerSpeedFocusProperty prop = (PowerSpeedFocusProperty) rp.getLaserProperty(); - this.setSpeed(prop.getSpeed()); + this.setDelay(prop.getSpeed()); this.setPower(prop.getPower()); + for (int line = 0; line < rp.getRasterHeight(); line++) { Point lineStart = rasterStart.clone(); lineStart.y += line; @@ -322,8 +337,15 @@ public class MakeBlockXYPlotter extends LaserCutter if(!this.debug){ if (this.hostname.startsWith("port://")) { String portString = this.hostname.replace("port://", ""); - CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier(portString); - port = (SerialPort) cpi.open("VisiCut", 2000); + + try{ + CommPortIdentifier cpi = CommPortIdentifier.getPortIdentifier(portString); + port = (SerialPort) cpi.open("VisiCut", 2000); + } + catch(Exception e) { + throw new Exception("Port '"+portString+"' is not available."); + } + if (port == null) { throw new Exception("Error: Could not Open COM-Port '"+portString+"'"); @@ -336,10 +358,16 @@ public class MakeBlockXYPlotter extends LaserCutter out = new BufferedOutputStream(port.getOutputStream()); portReader = new BufferedReader(new InputStreamReader(port.getInputStream())); + // wake up firmware String command = "\r\n\r\n"; out.write(command.getBytes("US-ASCII")); out.flush(); Thread.sleep(2000); + String str; + portReader.readLine(); // "ok" + portReader.readLine(); // "ok" + + this.checkVersion(); } else if (hostname.startsWith("file://")) { String filename = this.hostname.replace("file://", ""); @@ -373,13 +401,43 @@ public class MakeBlockXYPlotter extends LaserCutter } } + private void checkResponse(String command, String response, String expectedAnswer) throws Exception { + if(!response.toLowerCase().contains(expectedAnswer.toLowerCase())) { + throw new Exception(String.format("Got wrong response to command \"%s\":\n\"%s\" instead of \"%s\"", command, response, expectedAnswer)); + } + } + private void sendCommand(String command) throws Exception { + this.send(command); + + if(!debug) { + if (this.hostname.startsWith("port://")) { + String resp = this.receive(); + this.checkResponse(command, resp, "ok"); + } + } + } + + private void checkVersion() throws Exception { + // check if firmware matches implemented protocol + this.send("M115"); + + if(!debug) { + if (this.hostname.startsWith("port://")) { + String resp = this.receive(); + this.checkResponse("Version", resp, "SvenJung"); + String resp2 = this.receive(); + this.checkResponse("Version", resp2, "ok"); + } + } + } + private void send(String command) throws Exception { if(!debug) { if (this.hostname.startsWith("port://")) { + // send String sendString = command + "\n"; out.write(sendString.getBytes("US-ASCII")); out.flush(); - this.waitForResponse(command); } else if (hostname.startsWith("file://")) { w.println(command); @@ -393,33 +451,29 @@ public class MakeBlockXYPlotter extends LaserCutter } } - private void waitForResponse(String command) throws IOException, Exception - { - String line; - String expected = "ok"; - try { - line = portReader.readLine(); - line = line.replace("\n", "").replace("\r", ""); - if(!line.toLowerCase().equals(expected.toLowerCase())) { - throw new Exception(String.format("Got wrong response to command: %s:%s", command, line)); - } - else { - return; // everything ok + private String receive() throws Exception{ + if(!debug) { + if (this.hostname.startsWith("port://")) { + String line; + try { + line = portReader.readLine(); + line = line.replace("\n", "").replace("\r", ""); + return line; + } catch(IOException e) { + throw new IOException("IO Exception, e.g. timeout"); + } } - } catch(IOException e) { - throw new Exception("IO Exception, e.g. timeout"); } + return ""; } - - - + @Override public void sendJob(LaserJob job, ProgressListener pl, List<String> warnings) throws IllegalJobException, Exception { - this.currentPower = -1; - this.currentSpeed = -1; - this.toolState = ToolState.OFF; - pl.progressChanged(this, 0); + this.chosenPower = 0; + this.chosenDelay = 0; + this.toolState = ToolState.ON; // assume worst case, set to OFF in initialization code + pl.progressChanged(this, 0); pl.taskChanged(this, "checking job"); checkJob(job); job.applyStartPoint(); @@ -465,7 +519,7 @@ public class MakeBlockXYPlotter extends LaserCutter clone.hostname = hostname; clone.bedWidth = bedWidth; clone.bedHeight = bedHeight; - clone.speedRate = speedRate; + clone.delayRate = delayRate; clone.powerRate = powerRate; clone.usedTool = usedTool; return clone; @@ -486,8 +540,8 @@ public class MakeBlockXYPlotter extends LaserCutter return this.bedWidth; } else if (SETTING_BEDHEIGHT.equals(attribute)) { return this.bedHeight; - } else if (SETTING_SPEED_RATE.equals(attribute)) { - return this.speedRate; + } else if (SETTING_DELAY_RATE.equals(attribute)) { + return this.delayRate; } else if (SETTING_POWER_RATE.equals(attribute)) { return this.powerRate; } else if (SETTING_TOOL.equals(attribute)) { @@ -506,8 +560,8 @@ public class MakeBlockXYPlotter extends LaserCutter this.bedWidth = (Double) value; } else if (SETTING_BEDHEIGHT.equals(attribute)) { this.bedHeight = (Double) value; - } else if (SETTING_SPEED_RATE.equals(attribute)) { - this.speedRate = (Integer) value; + } else if (SETTING_DELAY_RATE.equals(attribute)) { + this.delayRate = (Integer) value; } else if (SETTING_POWER_RATE.equals(attribute)) { this.powerRate = (Integer) value; } else if (SETTING_TOOL.equals(attribute)) { diff --git a/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotterProperty.java b/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotterProperty.java index 0a4ab17d1b3b2f63f87e9f92b2eeefbe401b5f1b..e75cbc38fdc9d978e6331f8ae5668bbfe90fa372 100644 --- a/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotterProperty.java +++ b/src/com/t_oster/liblasercut/drivers/MakeBlockXYPlotterProperty.java @@ -15,7 +15,7 @@ import java.util.LinkedList; */ public class MakeBlockXYPlotterProperty extends PowerSpeedFocusFrequencyProperty { - private boolean showPowerAndSpeed = false; + private boolean showPowerAndSpeed; public MakeBlockXYPlotterProperty(boolean showPowerAndSpeed) { this.showPowerAndSpeed = showPowerAndSpeed;