// // v 0.2 - added servo to left pen from page. controlled with G100 S255 (pen down) and G100 S100 (pen up). // v 0.3 - added xml config file for drawing rec parameters // // rtwomey@u.washington.edu // Key 1 = 0,0 // Key 2 = width,0 // Key 3 = width,height // Key 4 = 0,height // Keys 5-8, corners of svg image // Key 0 = go home // Key H = home device // Key h = set origin and init coords. // Key S = stop // Key G = go import processing.serial.*; // serial communication import java.io.*; //Java import geomerative.*; // svg parsing import processing.net.*; // drawing recorder Recorder rec; // configuration, read from XML file String recPortName; int recPortBaud; float recPPI=800.0; float PPI = 90.0; // rec geometry float recENCODERSEP;// = 96.0;//72.0; // how far apart are the two steppers float recHOMEA;// = 86.5;//81.0;//82.0;// 58.5225650924496; // 108 float recHOMEB;// = 86.5;//81.0;//82.0;//56.02580320709378; // 108 // page setup float recPAGEW;// = 13.0;//36.0;//17.0;//22.0;//44.0; // width float recPAGEH;// = 17.0;//24.0;//14.0;//30;//30.0; // height float recPAGE0Y;// = 32.0;//6.0-PAGEH; float recPAGE0X;// = (MOTORSEP-PAGEW)/2.0; // upper left // options boolean serialOn = true; boolean writeToFile = true; boolean printToConsole = true; // file input/output String filename; PrintWriter writer; // configuration read from XML configuration file XML xml; // on-screen scale // scale width to full height int windowH = 900; float onScreenScale=windowH/(recPAGEH*PPI); int windowW = int((recPAGEW*PPI)*onScreenScale); // path to datafiles. to run from command line. String dataPath="/Users/rtwomey/processing/dm_xml/recording_machine/data/"; //------------------------------------ // main program void setup() { loadSettings(); // graphics size(windowW, windowH); // load a font for text display PFont font; font = loadFont(dataPath+"Serif-24.vlw"); textFont(font, 12); // // store progress images // Photo = new OutputImage(); // drawing recorder arduino rec = new Recorder(this, recPortName, recPortBaud); rec.setGeometry(recENCODERSEP, recHOMEA, recHOMEB); rec.waitForStart(); // output rec home positions for A and B if (printToConsole) println("(encoder HOME: "+rec.getHomeA() + " " +rec.getHomeB()+")"); // erase background background(255); //rec.storeHome(); rec.doZero(); // start by default //On=true; } void draw() { stroke(255, 0, 0); strokeWeight(0.1*onScreenScale); pushMatrix(); scale(PPI*onScreenScale); line(rec.getXpos(), rec.getYpos(), rec.getLastXpos(), rec.getLastYpos()); popMatrix(); //text(i, xstart*onScreenScale+5, ystart*onScreenScale+5); fill(255); stroke(255); rect(0, 0, 100, 100); fill(192); text("XPOS: "+(rec.getXpos()), 10, 20); text("YPOS: "+(rec.getYpos()), 10, 40); //text("FEEDRATE: "+SLOWFEED, 10, 60); //text("PATH: "+i+" / "+pointPaths.length, 10, 80); } // keyboard interface void keyPressed() { if (key == ' ') { rec.doZero(); background(255); } } void stop() { rec.stop(); }; // -------- terminal output and logging -------- // void doMessage(String message) { if (printToConsole) println(message); if (writeToFile) { writer.write(message+"\n"); writer.flush(); } } void loadSettings() { //println(dataPath("settings.xml")); xml = loadXML(dataPath+"settings.xml"); XML recm = xml.getChild("recmachine"); // serial port XML serial = recm.getChild("port"); recPortName = serial.getContent(); recPortBaud = int(recm.getChild("baud").getContent()); // rec geometry XML geometry = recm.getChild("geometry"); recHOMEA = float(geometry.getChild("homea").getContent()); recHOMEB = float(geometry.getChild("homeb").getContent()); recENCODERSEP = float(geometry.getChild("separation").getContent()); // feed rates //XML rates = xml.getChild("rates"); //SLOWFEED = float(rates.getChild("slowfeed").getContent())*INCH_TO_MM; // page setup XML page = recm.getChild("page"); recPAGEW = float(page.getChild("width").getContent()); recPAGEH = float(page.getChild("height").getContent()); recPAGE0Y = float(page.getChild("pagezeroy").getContent()); recPAGE0X = (recENCODERSEP-recPAGEW)/2.0; // upper left println("(encoder separation "+recENCODERSEP+")"); println("(page zero "+recPAGE0X+", "+recPAGE0Y+")"); // output scaling XML output = recm.getChild("output"); recPPI = float(output.getChild("ppi").getContent()); // SVG (Pt) to plotter space (inch) coordinate conversion // on-screen display XML screen = recm.getChild("screen"); PPI = float(screen.getChild("ppi").getContent()); // SVG (Pt) to plotter space (inch) coordinate conversion if (recPAGEH>recPAGEW) { // portrait: scale width to full height windowH = int(screen.getChild("screenh").getContent()); onScreenScale=windowH/(recPAGEH*PPI); windowW = int((recPAGEW*PPI)*onScreenScale); } else { // landscape: scale height to full width windowW = int(screen.getChild("screenw").getContent()); onScreenScale=windowW/(recPAGEW*PPI); windowH = int((recPAGEH*PPI)*onScreenScale); } }