diff --git a/polargraphcontroller.pde b/polargraphcontroller.pde index a4947da..bed3b87 100644 --- a/polargraphcontroller.pde +++ b/polargraphcontroller.pde @@ -1,32 +1,32 @@ /** Polargraph controller Copyright Sandy Noble 2015. - + This file is part of Polargraph Controller. - + Polargraph Controller 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. - - + + Polargraph Controller 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 Polargraph Controller. If not, see . - + Requires the excellent ControlP5 GUI library available from http://www.sojamo.de/libraries/controlP5/. Requires the excellent Geomerative library available from http://www.ricardmarxer.com/geomerative/. - + This is an application for controlling a polargraph machine, communicating using ASCII command language over a serial link. - + sandy.noble@gmail.com http://www.polargraph.co.uk https://github.com/euphy/polargraphcontroller - + */ //import processing.video.*; @@ -540,25 +540,25 @@ void setup() frame.setResizable(true); initLogging(); parentPapplet = this; - + RG.init(this); RG.setPolygonizer(RG.UNIFORMLENGTH); // RG.setPolygonizer(RG.ADAPTATIVE); - try - { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } - catch (Exception e) - { - e.printStackTrace(); + try + { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } + catch (Exception e) + { + e.printStackTrace(); } loadFromPropertiesFile(); size(windowWidth, windowHeight); this.cp5 = new ControlP5(this); initTabs(); - + String[] serialPorts = Serial.list(); println("Serial ports available on your machine:"); println(serialPorts); @@ -571,7 +571,7 @@ void setup() if (serialPorts.length > 0) { String portName = null; - try + try { println("Get serial port no: "+getSerialPortNumber()); portName = serialPorts[getSerialPortNumber()]; @@ -583,8 +583,8 @@ void setup() } catch (Exception e) { - println("Attempting to connect to serial port " - + portName + " in slot " + getSerialPortNumber() + println("Attempting to connect to serial port " + + portName + " in slot " + getSerialPortNumber() + " caused an exception: " + e.getMessage()); } } @@ -610,54 +610,54 @@ void setup() } void fitDisplayMachineToWindow() { - + Rectangle gr = panels.get(PANEL_NAME_GENERAL).getOutline(); println(gr); - + Rectangle ir = panels.get(PANEL_NAME_INPUT).getOutline(); println(ir); - + float targetHeight = ir.getBottom() - gr.getTop() - CONTROL_SPACING.y; println("Target height is " + targetHeight + " pixels"); - + float machineHeight = getDisplayMachine().getOutline().getHeight(); println(machineHeight); - + machineScaling = (targetHeight / machineHeight); println(machineScaling); - + if (machineScaling < 0) { machineScaling = 1.0; } - + getDisplayMachine().getOffset().x = ((gr.getRight() > ir.getRight()) ? gr.getRight() : ir.getRight()) + CONTROL_SPACING.x; getDisplayMachine().getOffset().y = gr.getTop(); - + } void addEventListeners() { - frame.addComponentListener(new ComponentAdapter() + frame.addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent event) + public void componentResized(ComponentEvent event) { - if (event.getSource()==frame) + if (event.getSource()==frame) { windowResized(); } } } ); - - addMouseWheelListener(new java.awt.event.MouseWheelListener() - { - public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) - { + + addMouseWheelListener(new java.awt.event.MouseWheelListener() + { + public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) + { mouseWheel(evt.getWheelRotation()); } } - ); -} + ); +} void preLoadCommandQueue() @@ -673,13 +673,13 @@ void windowResized() windowWidth = frame.getWidth(); windowHeight = frame.getHeight(); println("New window size: " + windowWidth + " x " + windowHeight); - + for (String key : getPanels().keySet()) { Panel p = getPanels().get(key); p.setSizeByHeight(windowHeight - p.getOutline().getTop() - (DEFAULT_CONTROL_SIZE.y*2)); } - + // Required to tell CP5 to be able to use the new sized window cp5.setGraphics(this,0,0); loop(); @@ -709,7 +709,7 @@ void draw() if (isShowingSummaryOverlay()) { drawSummaryOverlay(); } - + if (isShowingDialogBox()) { drawDialogBox(); } @@ -737,7 +737,7 @@ boolean isShowingDialogBox() } void drawDialogBox() { - + } String getVectorFilename() { @@ -799,7 +799,7 @@ void drawImagePage() getDisplayMachine().draw(); drawMoveImageOutline(); stroke(255, 0, 0); - + for (Panel panel : getPanelsForTab(TAB_NAME_INPUT)) { panel.draw(); @@ -833,7 +833,7 @@ void drawDetailsPage() noFill(); getDisplayMachine().drawForSetup(); stroke(255, 0, 0); - + for (Panel panel : getPanelsForTab(TAB_NAME_DETAILS)) { panel.draw(); @@ -859,7 +859,7 @@ void drawRovingPage() noFill(); getDisplayMachine().drawForSetup(); stroke(255, 0, 0); - + for (Panel panel : getPanelsForTab(TAB_NAME_ROVING)) { panel.draw(); @@ -895,7 +895,7 @@ void drawTracePage() } stroke(255, 0, 0); - + for (Panel panel : getPanelsForTab(TAB_NAME_TRACE)) { panel.draw(); @@ -925,9 +925,9 @@ void drawCommandQueuePage() fill(100); drawMachineOutline(); showingSummaryOverlay = false; - - + + int right = 0; for (Panel panel : getPanelsForTab(TAB_NAME_QUEUE)) { @@ -938,9 +938,9 @@ void drawCommandQueuePage() } text(propertiesFilename, getPanel(PANEL_NAME_GENERAL).getOutline().getLeft(), getPanel(PANEL_NAME_GENERAL).getOutline().getTop()-7); showCommandQueue(right, (int)mainPanelPosition.y); - + drawStatusText((int)statusTextPosition.x, (int)statusTextPosition.y); - + } void drawImageLoadPage() @@ -959,7 +959,7 @@ void drawMoveImageOutline() PVector imageSizeOnScreen = getDisplayMachine().scaleToScreen(imageSize); imageSizeOnScreen.sub(getDisplayMachine().getOutline().getTopLeft()); PVector offset = new PVector(imageSizeOnScreen.x/2.0, imageSizeOnScreen.y/2.0); - + PVector mVect = getMouseVector(); PVector imagePos = new PVector(mVect.x-offset.x, mVect.y-offset.y); @@ -988,7 +988,7 @@ void drawMoveImageOutline() { for (int i = 0; i ins = null; try { ins = unpackGCodeInstruction(line); @@ -1329,7 +1329,7 @@ RShape loadShapeFromGCodeFile(String filename) { if (code >= 2) { continue; } - + Float z = ins.get("Z"); if (z != null) { gCodeZAxisChanges++; @@ -1346,12 +1346,9 @@ RShape loadShapeFromGCodeFile(String filename) { drawLine = false; } } - + Float x = ins.get("X"); Float y = ins.get("Y"); - - println("X: " + x + " Y: "+ y); - if (x != null && y == null) { // move x axis only, use y of last RPoint[][] points = parent.getPointsInPaths(); @@ -1364,7 +1361,7 @@ RShape loadShapeFromGCodeFile(String filename) { RPoint rp = points[points.length-1][points[points.length-1].length-1]; x = rp.x; } - + if (x != null && y != null) { // move both x and y axis if (drawLine) { @@ -1389,9 +1386,9 @@ RShape loadShapeFromGCodeFile(String filename) { // println("" + totalPoints + " points."); } else { - + } - + if ((millis() - time) > 500) { time = millis(); reportStatus = true; @@ -1399,11 +1396,11 @@ RShape loadShapeFromGCodeFile(String filename) { else { reportStatus = false; } - + if (lineNo == (countLines-1)) { reportStatus = true; } - + } } catch (IOException e) { @@ -1413,13 +1410,13 @@ RShape loadShapeFromGCodeFile(String filename) { finally { try { reader.close(); - } + } catch (IOException e) { println("Exception closing the gcode file " + filename); e.printStackTrace(); } } - + RPoint[][] points = parent.getPointsInPaths(); totalPoints = 0; if (points != null) { @@ -1453,19 +1450,19 @@ Map unpackGCodeInstruction(String line) throws Exception { splitted[i] = splitted[i].replace(";", ""); String axis = splitted[i].substring(0, 1); Float value = Float.parseFloat(splitted[i].substring(1)); - if ("X".equalsIgnoreCase(axis) || "Y".equalsIgnoreCase(axis) || "Z".equalsIgnoreCase(axis) || "G".equalsIgnoreCase(axis)) { instruction.put(axis, value); } } - println("instruction: " + instruction); +// println("instruction: " + instruction); if (instruction.isEmpty()) { throw new Exception(); } - } catch (Exception e) { + } + catch (Exception e) { throw new Exception("Exception while reading the lines from a gcode file: " + line + ", " + e.getMessage()); } - + return instruction; } @@ -1492,7 +1489,7 @@ void setBoxToPictureframeDimensions() t = (Toggle) getAllControls().get(MODE_SHOW_DENSITY_PREVIEW); t.setValue(1); t.update(); - + } } @@ -1511,9 +1508,9 @@ void setSampleArea(float v) this.sampleArea = v; } -void controlEvent(ControlEvent controlEvent) +void controlEvent(ControlEvent controlEvent) { - if (controlEvent.isTab()) + if (controlEvent.isTab()) { if (controlEvent.tab().getName() == getCurrentTab()) { @@ -1525,18 +1522,18 @@ void controlEvent(ControlEvent controlEvent) changeTab(currentTab, controlEvent.tab().getName()); } } - else if(controlEvent.isGroup()) + else if(controlEvent.isGroup()) { print("got an event from "+controlEvent.group().getName()+"\t"); - // checkbox uses arrayValue to store the state of + // checkbox uses arrayValue to store the state of // individual checkbox-items. usage: - for (int i=0; i= k) { - return keys[k]; + return keys[k]; } return false; } void keyReleased() -{ - keys[keyCode] = false; +{ + keys[keyCode] = false; } void keyPressed() @@ -1679,18 +1676,18 @@ void keyPressed() //println("key: " + KeyEvent.getKeyText(keyCode)); //println("Keys: " + keys); //println("Keycode: " + keyCode); - - if (checkKey(CONTROL) && checkKey(KeyEvent.VK_PAGE_UP)) + + if (checkKey(CONTROL) && checkKey(KeyEvent.VK_PAGE_UP)) changeMachineScaling(1); - else if (checkKey(CONTROL) && checkKey(KeyEvent.VK_PAGE_DOWN)) + else if (checkKey(CONTROL) && checkKey(KeyEvent.VK_PAGE_DOWN)) changeMachineScaling(-1); else if (checkKey(CONTROL) && checkKey(DOWN)) getDisplayMachine().getOffset().y = getDisplayMachine().getOffset().y + 10; - else if (checkKey(CONTROL) && checkKey(UP)) + else if (checkKey(CONTROL) && checkKey(UP)) getDisplayMachine().getOffset().y = getDisplayMachine().getOffset().y - 10; - else if (checkKey(CONTROL) && checkKey(RIGHT)) + else if (checkKey(CONTROL) && checkKey(RIGHT)) getDisplayMachine().getOffset().x = getDisplayMachine().getOffset().x + 10; - else if (checkKey(CONTROL) && checkKey(LEFT)) + else if (checkKey(CONTROL) && checkKey(LEFT)) getDisplayMachine().getOffset().x = getDisplayMachine().getOffset().x - 10; else if (checkKey(KeyEvent.VK_ESCAPE)) key = 0; @@ -1759,12 +1756,12 @@ void mouseDragged() } } } - + void mouseClicked() { if (mouseOverPanel()) { // changing mode - + } else { @@ -1774,10 +1771,10 @@ void mouseClicked() PVector mVect = getDisplayMachine().scaleToDisplayMachine(getMouseVector()); PVector offset = new PVector(imageSize.x/2.0, imageSize.y/2.0); PVector imagePos = new PVector(mVect.x-offset.x, mVect.y-offset.y); - + imagePos = getDisplayMachine().inSteps(imagePos); getDisplayMachine().getImageFrame().setPosition(imagePos.x, imagePos.y); - + if (getDisplayMachine().pixelsCanBeExtracted() && isBoxSpecified()) getDisplayMachine().extractPixelsFromArea(getBoxVector1(), getBoxVectorSize(), getGridSize(), sampleArea); } @@ -1791,12 +1788,12 @@ void mouseClicked() } else if (mouseOverQueue()) { - // stopping or starting + // stopping or starting println("queue clicked."); queueClicked(); } else if (mouseOverMachine()) - { + { // picking coords machineClicked(); } @@ -1909,17 +1906,17 @@ void leftButtonMachineClick() setChromaKey(getMouseVector()); else if (currentMode.equals(MODE_SEND_START_TEXT)) sendStartTextAtPoint(); - + } -void mouseWheel(int delta) +void mouseWheel(int delta) { changeMachineScaling(delta); -} +} void setChromaKey(PVector p) { - color col = getDisplayMachine().getPixelAtScreenCoords(p); + color col = getDisplayMachine().getPixelAtScreenCoords(p); chromaKeyColour = col; if (getDisplayMachine().pixelsCanBeExtracted() && isBoxSpecified()) { @@ -1929,7 +1926,7 @@ void setChromaKey(PVector p) boolean isPreviewable(String command) { - if (command.startsWith(CMD_CHANGELENGTHDIRECT) + if (command.startsWith(CMD_CHANGELENGTHDIRECT) || command.startsWith(CMD_CHANGELENGTH) || command.startsWith(CMD_DRAWPIXEL)) { @@ -1955,9 +1952,9 @@ boolean toggleShowConsole() { console = null; System.setOut(savedOut); } - + println("Ow"); - + return console == null; } @@ -1976,8 +1973,8 @@ void previewQueue(boolean forceRebuild) { println("regenerating preview queue."); previewCommandList.clear(); - - + + for (String command : commandQueue) { if (command.startsWith(CMD_CHANGELENGTHDIRECT) || command.startsWith(CMD_CHANGELENGTH) || command.startsWith(CMD_DRAWPIXEL)) @@ -1989,27 +1986,27 @@ void previewQueue(boolean forceRebuild) String aLenStr = splitted[1]; String bLenStr = splitted[2]; - + PVector endPoint = new PVector(Integer.parseInt(aLenStr)+previewCordOffset, Integer.parseInt(bLenStr)+previewCordOffset); endPoint = getDisplayMachine().asCartesianCoords(endPoint); endPoint = getDisplayMachine().inMM(endPoint); - + pv.x = endPoint.x; pv.y = endPoint.y; pv.z = -1.0; - + if (command.startsWith(CMD_DRAWPIXEL)) { String densStr = splitted[4]; pv.z = Integer.parseInt(densStr); } - + previewCommandList.add(pv); } } lastCommandQueueHash = commandQueue.hashCode(); } - + for (PreviewVector pv : previewCommandList) { PVector p = (PVector) pv; @@ -2023,10 +2020,10 @@ void previewQueue(boolean forceRebuild) ellipse(p.x, p.y, 20, 20); noFill(); } - + if (pv.command.equals(CMD_CHANGELENGTHDIRECT)) stroke(0); - else + else stroke(200,0,0); line(startPoint.x, startPoint.y, p.x, p.y); startPoint = p; @@ -2048,7 +2045,7 @@ void previewQueue(boolean forceRebuild) ellipse(startPoint.x, startPoint.y, 15,15); noFill(); } - + } boolean isHiddenPixel(PVector p) @@ -2063,7 +2060,7 @@ void sizeImageToFitBox() { PVector boxSize = getDisplayMachine().inSteps(getBoxSize()); PVector boxPos = getDisplayMachine().inSteps(getBoxVector1()); println("image: " + boxSize); - + Rectangle r = new Rectangle(boxPos, boxSize); getDisplayMachine().setImageFrame(r); } @@ -2082,11 +2079,11 @@ void exportQueueToFile(File selection) { println("Output file: " + filePath); List allCommands = new ArrayList(realtimeCommandQueue); allCommands.addAll(commandQueue); - + String[] list = (String[]) allCommands.toArray(new String[0]); saveStrings(filePath, list); println("Completed queue export, " + list.length + " commands exported."); - } + } } void fileSelected(File selection) { @@ -2121,7 +2118,7 @@ void queueClicked() int relativeCoord = (mouseY-topEdgeOfQueue); int rowClicked = relativeCoord / queueRowHeight; int totalCommands = commandQueue.size()+realtimeCommandQueue.size(); - + if (rowClicked < 1) // its the header - start or stop queue { if (commandQueueRunning) @@ -2143,11 +2140,11 @@ void queueClicked() { if (cmdNumber <= realtimeCommandQueue.size()) realtimeCommandQueue.remove(cmdNumber-1); - else + else { cmdNumber-=(realtimeCommandQueue.size()+1); commandQueue.remove(cmdNumber); - } + } } else { @@ -2215,21 +2212,21 @@ void showText(int xPosOrigin, int yPosOrigin) noStroke(); fill(0, 0, 0, 80); rect(xPosOrigin, yPosOrigin, 220, 550); - - + + textSize(12); fill(255); int tRow = 15; int textPositionX = xPosOrigin+4; int textPositionY = yPosOrigin+4; - + int tRowNo = 1; PVector screenCoordsCart = getMouseVector(); - + text(programTitle, textPositionX, textPositionY+(tRow*tRowNo++)); tRowNo++; text("Cursor position: " + mouseX + ", " + mouseY, textPositionX, textPositionY+(tRow*tRowNo++)); - + text("MM Per Step: " + getDisplayMachine().getMMPerStep(), textPositionX, textPositionY+(tRow*tRowNo++)); text("Steps Per MM: " + getDisplayMachine().getStepsPerMM() ,textPositionX, textPositionY+(tRow*tRowNo++)); @@ -2237,10 +2234,10 @@ void showText(int xPosOrigin, int yPosOrigin) { PVector posOnMachineCartesianInMM = getDisplayMachine().scaleToDisplayMachine(screenCoordsCart); text("Machine x/y mm: " + posOnMachineCartesianInMM.x+","+posOnMachineCartesianInMM.y, textPositionX, textPositionY+(tRow*tRowNo++)); - + PVector posOnMachineNativeInMM = getDisplayMachine().convertToNative(posOnMachineCartesianInMM); text("Machine a/b mm: " + posOnMachineNativeInMM.x+","+posOnMachineNativeInMM.y, textPositionX, textPositionY+(tRow*tRowNo++)); - + PVector posOnMachineNativeInSteps = getDisplayMachine().inSteps(posOnMachineNativeInMM); text("Machine a/b steps: " + posOnMachineNativeInSteps.x+","+posOnMachineNativeInSteps.y, textPositionX, textPositionY+(tRow*tRowNo++)); } @@ -2250,24 +2247,24 @@ void showText(int xPosOrigin, int yPosOrigin) text("Machine a/b mm: --,--", textPositionX, textPositionY+(tRow*tRowNo++)); text("Machine a/b steps: --,--", textPositionX, textPositionY+(tRow*tRowNo++)); } - - drawStatusText(textPositionX, textPositionY+(tRow*tRowNo++)); - + + drawStatusText(textPositionX, textPositionY+(tRow*tRowNo++)); + text(commandStatus, textPositionX, textPositionY+(tRow*tRowNo++)); - + text("Mode: " + currentMode, textPositionX, textPositionY+(tRow*tRowNo++)); // middle side text("Grid size: " + getGridSize(), textPositionX, textPositionY+(tRow*tRowNo++)); - + text("Box width: " + getBoxWidth(), textPositionX, textPositionY+(tRow*tRowNo++)); text("Box height: " + getBoxHeight(), textPositionX, textPositionY+(tRow*tRowNo++)); text("Box offset left: " + getBoxPosition().x, textPositionX, textPositionY+(tRow*tRowNo++)); text("Box offset top: " + getBoxPosition().y, textPositionX, textPositionY+(tRow*tRowNo++)); - + text("Available memory: " + machineAvailMem + " (min: " + machineMinAvailMem +", used: "+ machineUsedMem+")", textPositionX, textPositionY+(tRow*tRowNo++)); text("Time cmd: " + getCurrentPixelTime() + ", total: " + getTimeSoFar(), textPositionX, textPositionY+(tRow*tRowNo++)); @@ -2305,7 +2302,7 @@ void showText(int xPosOrigin, int yPosOrigin) void drawStatusText(int x, int y) { String drawbotStatus = null; - + if (useSerialPortConnection) { if (isDrawbotConnected()) @@ -2329,20 +2326,20 @@ void drawStatusText(int x, int y) if ("".equals(busyDoing)) busyDoing = commandHistory.get(commandHistory.size()-1); drawbotStatus = "BUSY: " + busyDoing; - } + } } else { fill(255, 0, 0); drawbotStatus = "Polargraph is not connected."; - } + } } else { fill(255, 0, 0); drawbotStatus = "No serial connection."; } - + text(drawbotStatus, x, y); fill(255); } @@ -2351,7 +2348,7 @@ void setCommandQueueFont() { textSize(12); fill(255); -} +} void showCommandQueue(int xPos, int yPos) { setCommandQueueFont(); @@ -2366,14 +2363,14 @@ void showCommandQueue(int xPos, int yPos) leftEdgeOfQueue = textPositionX; rightEdgeOfQueue = textPositionX+300; bottomEdgeOfQueue = height; - + drawCommandQueueStatus(textPositionX, commandQueuePos, 14); commandQueuePos+=queueRowHeight; text("Last command: " + ((commandHistory.isEmpty()) ? "-" : commandHistory.get(commandHistory.size()-1)), textPositionX, commandQueuePos); commandQueuePos+=queueRowHeight; text("Current command: " + lastCommand, textPositionX, commandQueuePos); commandQueuePos+=queueRowHeight; - + fill(128,255,255); int queueNumber = commandQueue.size()+realtimeCommandQueue.size(); for (String s : realtimeCommandQueue) @@ -2381,7 +2378,7 @@ void showCommandQueue(int xPos, int yPos) text((queueNumber--)+". "+ s, textPositionX, commandQueuePos); commandQueuePos+=queueRowHeight; } - + fill(255); try { @@ -2402,7 +2399,7 @@ void showCommandQueue(int xPos, int yPos) println("Caught the pesky ConcurrentModificationException: " + cme.getMessage()); } showmachineMessageLog(rightEdgeOfQueue, 20); - + } void drawCommandQueueStatus(int x, int y, int tSize) @@ -2434,7 +2431,7 @@ void showmachineMessageLog(int xPos, int yPos) int pos = textPositionY+(tRow*tRowNo++); pos+=queueRowHeight; - + fill(255); // Write out the commands into the window, stop when you fall off the bottom of the window // Or run out of commands @@ -2586,7 +2583,7 @@ public DisplayMachine getDisplayMachine() { if (displayMachine == null) displayMachine = new DisplayMachine(new Machine(5000, 5000, 200.0, 95.0), machinePosition, machineScaling); - + displayMachine.setOffset(machinePosition); displayMachine.setScale(machineScaling); return displayMachine; @@ -2613,7 +2610,7 @@ void changeHardwareVersionTo(int newVer) { case HARDWARE_VER_MEGA : currentSram = HARDWARE_ATMEGA1280_SRAM; - default : + default : currentSram = HARDWARE_ATMEGA328_SRAM; } // windowResized(); @@ -2639,14 +2636,14 @@ void setHardwareVersionFromIncoming(String readyString) println("Bad format for hardware version - defaulting to ATMEGA328 (Uno)"); verInt = HARDWARE_VER_UNO; } - - if (HARDWARE_VER_MEGA == verInt + + if (HARDWARE_VER_MEGA == verInt || HARDWARE_VER_MEGA_POLARSHIELD == verInt) newHardwareVersion = verInt; else newHardwareVersion = HARDWARE_VER_UNO; } - + // now see if it's different to last time. if (newHardwareVersion != currentHardware) { @@ -2655,15 +2652,15 @@ void setHardwareVersionFromIncoming(String readyString) } } -void serialEvent(Serial myPort) -{ +void serialEvent(Serial myPort) +{ // read the serial buffer: String incoming = myPort.readStringUntil('\n'); myPort.clear(); // if you got any bytes other than the linefeed: incoming = trim(incoming); println("incoming: " + incoming); - + if (incoming.startsWith("READY")) { drawbotReady = true; @@ -2689,14 +2686,14 @@ void serialEvent(Serial myPort) readPenLiftRange(incoming); else if (incoming.startsWith("PGSPEED")) readMachineSpeed(incoming); - + else if ("RESEND".equals(incoming)) resendLastCommand(); else if ("DRAWING".equals(incoming)) drawbotReady = false; else if (incoming.startsWith("MEMORY")) extractMemoryUsage(incoming); - + else if (incoming.startsWith("BUTTON")) handleMachineButton(incoming); @@ -2727,10 +2724,10 @@ void readMachineMessage(String msg) String type = msg.substring(0,1); msg = msg.substring(2, msg.length()); String timestamp = new SimpleDateFormat("HH:mm:ss").format(new Date()); - + msg = type + timestamp + " " + msg; machineMessageLog.add(msg); - if (machineMessageLog.size() > 200) + if (machineMessageLog.size() > 200) { machineMessageLog.remove(0); } @@ -2746,7 +2743,7 @@ void readMachinePosition(String sync) Float a = Float.valueOf(currentAPos).floatValue(); Float b = Float.valueOf(currentBPos).floatValue(); currentMachinePos.x = a; - currentMachinePos.y = b; + currentMachinePos.y = b; currentMachinePos = getDisplayMachine().inMM(getDisplayMachine().asCartesianCoords(currentMachinePos)); } } @@ -2760,7 +2757,7 @@ void readCartesianMachinePosition(String sync) Float a = Float.valueOf(currentAPos).floatValue(); Float b = Float.valueOf(currentBPos).floatValue(); currentCartesianMachinePos.x = a; - currentCartesianMachinePos.y = b; + currentCartesianMachinePos.y = b; } } @@ -2770,7 +2767,7 @@ void readMmPerRev(String in) if (splitted.length == 3) { String mmStr = splitted[1]; - + float mmPerRev = Float.parseFloat(mmStr); getDisplayMachine().setMMPerRev(mmPerRev); updateNumberboxValues(); @@ -2783,7 +2780,7 @@ void readStepsPerRev(String in) if (splitted.length == 3) { String stepsStr = splitted[1]; - + Float stepsPerRev = Float.parseFloat(stepsStr); getDisplayMachine().setStepsPerRev(stepsPerRev); updateNumberboxValues(); @@ -2796,7 +2793,7 @@ void readStepMultiplier(String in) if (splitted.length == 3) { String stepsStr = splitted[1]; - + machineStepMultiplier = Integer.parseInt(stepsStr); updateNumberboxValues(); } @@ -2810,13 +2807,13 @@ void readMachineSize(String in) { String mWidth = splitted[1]; String mHeight = splitted[2]; - + Integer intWidth = Integer.parseInt(mWidth); Integer intHeight = Integer.parseInt(mHeight); - + float fWidth = getDisplayMachine().inSteps(intWidth); float fHeight = getDisplayMachine().inSteps(intHeight); - + getDisplayMachine().setSize(int(fWidth+0.5), int(fHeight+0.5)); updateNumberboxValues(); } @@ -2828,7 +2825,7 @@ void readMachineName(String sync) if (splitted.length == 3) { String name = splitted[1]; - + } } @@ -2839,10 +2836,10 @@ void readMachineSpeed(String in) { String speed = splitted[1]; String accel = splitted[2]; - + currentMachineMaxSpeed = Float.parseFloat(speed); currentMachineAccel = Float.parseFloat(accel); - + updateNumberboxValues(); } } @@ -2854,7 +2851,7 @@ void readPenLiftRange(String in) { String downPos = splitted[1]; String upPos = splitted[2]; - + penLiftDownPosition = Integer.parseInt(downPos); penLiftUpPosition = Integer.parseInt(upPos); @@ -2871,7 +2868,7 @@ void resendLastCommand() void dispatchCommandQueue() { - if (isDrawbotReady() + if (isDrawbotReady() && (!commandQueue.isEmpty() || !realtimeCommandQueue.isEmpty()) && commandQueueRunning) { @@ -2906,7 +2903,7 @@ void dispatchCommandQueue() else if (commandQueue.isEmpty()) { stopPixelTimer(); - } + } } void addToCommandQueue(String command) @@ -2953,7 +2950,7 @@ Properties getProperties() { props = new Properties(); String fileToLoad = sketchPath(propertiesFilename); - + File propertiesFile = new File(fileToLoad); if (!propertiesFile.exists()) { @@ -2961,7 +2958,7 @@ Properties getProperties() savePropertiesFile(); println("saved."); } - + propertiesFileStream = new FileInputStream(propertiesFile); props.load(propertiesFileStream); println("Successfully loaded properties file " + fileToLoad); @@ -2973,11 +2970,11 @@ Properties getProperties() } finally { - try - { + try + { propertiesFileStream.close(); } - catch (Exception e) + catch (Exception e) { println("Exception: "+e.getMessage()); }; @@ -3004,7 +3001,7 @@ void loadFromPropertiesFile() this.currentMachineMaxSpeed = getFloatProperty("machine.motors.maxSpeed", 2000.0); this.currentMachineAccel = getFloatProperty("machine.motors.accel", 2000.0); this.machineStepMultiplier = getIntProperty("machine.step.multiplier", 8); - + // serial port this.serialPortNumber = getIntProperty("controller.machine.serialport", 0); this.baudRate = getIntProperty("controller.machine.baudrate", 57600); @@ -3013,25 +3010,25 @@ void loadFromPropertiesFile() this.gridSize = getFloatProperty("controller.grid.size", 100.0); this.sampleArea = getIntProperty("controller.pixel.samplearea", 2); this.pixelScalingOverGridSize = getFloatProperty("controller.pixel.scaling", 1.0); - + // pixel renderer this.densityPreviewStyle = getIntProperty("controller.density.preview.style", 1); - + // initial screen size this.windowWidth = getIntProperty("controller.window.width", 650); this.windowHeight = getIntProperty("controller.window.height", 400); - + println("windowHeight:" + this.windowHeight); this.testPenWidthStartSize = getFloatProperty("controller.testPenWidth.startSize", 0.5); this.testPenWidthEndSize = getFloatProperty("controller.testPenWidth.endSize", 2.0); this.testPenWidthIncrementSize = getFloatProperty("controller.testPenWidth.incrementSize", 0.5); - + this.maxSegmentLength = getIntProperty("controller.maxSegmentLength", 2); - + float homePointX = getFloatProperty("controller.homepoint.x", 0.0); float homePointY = getFloatProperty("controller.homepoint.y", 0.0); - + if (homePointX == 0.0) { float defaultX = getDisplayMachine().getWidth() / 2.0; // in steps @@ -3042,7 +3039,7 @@ void loadFromPropertiesFile() } this.homePointCartesian = new PVector(getDisplayMachine().inSteps(homePointX), getDisplayMachine().inSteps(homePointY)); // println("home point loaded: " + homePointCartesian + ", " + getHomePoint()); - + setVectorFilename(getStringProperty("controller.vector.filename", null)); if (getVectorFilename() != null) { @@ -3055,12 +3052,12 @@ void loadFromPropertiesFile() { shape = null; } - - if (shape != null) + + if (shape != null) { setVectorShape(shape); } - else + else { println("File not found (" + getVectorFilename() + ")"); } @@ -3071,20 +3068,20 @@ void loadFromPropertiesFile() this.minimumVectorLineLength = getIntProperty("controller.vector.minLineLength", 0); - + println("Finished loading configuration from properties file."); } void savePropertiesFile() { Properties props = new Properties(); - + props = getDisplayMachine().loadDefinitionIntoProperties(props); NumberFormat nf = NumberFormat.getNumberInstance(Locale.UK); - DecimalFormat df = (DecimalFormat)nf; + DecimalFormat df = (DecimalFormat)nf; df.applyPattern("###.##"); - + props.setProperty("controller.page.colour", hex(this.pageColour, 6)); props.setProperty("controller.frame.colour", hex(this.frameColour,6)); props.setProperty("controller.machine.colour", hex(this.machineColour,6)); @@ -3092,7 +3089,7 @@ void savePropertiesFile() props.setProperty("controller.background.colour", hex(this.backgroundColour,6)); props.setProperty("controller.densitypreview.colour", hex(this.densityPreviewColour,6)); - + // pen size props.setProperty("machine.pen.size", df.format(currentPenWidth)); // serial port @@ -3114,37 +3111,37 @@ void savePropertiesFile() props.setProperty("controller.testPenWidth.startSize", df.format(testPenWidthStartSize)); props.setProperty("controller.testPenWidth.endSize", df.format(testPenWidthEndSize)); props.setProperty("controller.testPenWidth.incrementSize", df.format(testPenWidthIncrementSize)); - + props.setProperty("controller.maxSegmentLength", new Integer(getMaxSegmentLength()).toString()); - + props.setProperty("machine.motors.maxSpeed", df.format(currentMachineMaxSpeed)); props.setProperty("machine.motors.accel", df.format(currentMachineAccel)); props.setProperty("machine.step.multiplier", new Integer(machineStepMultiplier).toString()); - + props.setProperty("controller.pixel.mask.color", hex(this.chromaKeyColour, 6)); - - PVector hp = null; + + PVector hp = null; if (getHomePoint() != null) { hp = getHomePoint(); } else hp = new PVector(2000.0, 1000.0); - + hp = getDisplayMachine().inMM(hp); - + props.setProperty("controller.homepoint.x", df.format(hp.x)); props.setProperty("controller.homepoint.y", df.format(hp.y)); - + if (getVectorFilename() != null) props.setProperty("controller.vector.filename", getVectorFilename()); - + props.setProperty("controller.vector.scaling", df.format(vectorScaling)); props.setProperty("controller.vector.position.x", df.format(getVectorPosition().x)); props.setProperty("controller.vector.position.y", df.format(getVectorPosition().y)); props.setProperty("controller.vector.minLineLength", new Integer(this.minimumVectorLineLength).toString()); - + FileOutputStream propertiesOutput = null; try @@ -3186,19 +3183,19 @@ void savePropertiesFile() } } -boolean getBooleanProperty(String id, boolean defState) +boolean getBooleanProperty(String id, boolean defState) { return boolean(getProperties().getProperty(id,""+defState)); } - -int getIntProperty(String id, int defVal) + +int getIntProperty(String id, int defVal) { - return int(getProperties().getProperty(id,""+defVal)); + return int(getProperties().getProperty(id,""+defVal)); } - -float getFloatProperty(String id, float defVal) + +float getFloatProperty(String id, float defVal) { - return float(getProperties().getProperty(id,""+defVal)); + return float(getProperties().getProperty(id,""+defVal)); } String getStringProperty(String id, String defVal) { @@ -3212,7 +3209,7 @@ color getColourProperty(String id, color defVal) { col = defVal; } - + if (colStr.length() == 1) { // single value grey @@ -3228,7 +3225,7 @@ color getColourProperty(String id, color defVal) d1 = d1+d1; d2 = d2+d2; d3 = d3+d3; - + col = color(unhex(d1), unhex(d2), unhex(d3)); } else if (colStr.length() == 6) @@ -3237,10 +3234,10 @@ color getColourProperty(String id, color defVal) String d1 = colStr.substring(0,2); String d2 = colStr.substring(2,4); String d3 = colStr.substring(4,6); - + col = color(unhex(d1), unhex(d2), unhex(d3)); } - + return col; } @@ -3265,7 +3262,7 @@ void setOverwriteExistingStoreFile(boolean over) { this.overwriteExistingStoreFile = over; } - + void initProperties() { getProperties(); @@ -3327,7 +3324,7 @@ PImage makeColourImage(int w, int h, int colour) { PImage img = createImage(w,h,RGB); for(int i=0; i < img.pixels.length; i++) { - img.pixels[i] = colour; + img.pixels[i] = colour; } return img; }