/**
* A diagnostic class to test application speed, this is a connection that
* responds with "ok" as fast as possible.
*/
/*
Copywrite 2016 Will Winder
This file is part of Universal Gcode Sender (UGS).
UGS 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.
UGS 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 UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.universalgcodesender.connection;
import com.willwinder.universalgcodesender.AbstractCommunicator;
import com.willwinder.universalgcodesender.GrblUtils;
import com.willwinder.universalgcodesender.gcode.GcodeParser;
import com.willwinder.universalgcodesender.gcode.GcodePreprocessorUtils;
import com.willwinder.universalgcodesender.types.PointSegment;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.vecmath.Point3d;
import jssc.SerialPort;
/**
*
* @author wwinder
*/
public class LoopBackConnection extends Connection {
private BlockingQueue<String> sent;
private boolean exit = false;
private boolean open = false;
Thread okThread;
private int ms = 0;
private static void initialize(AbstractCommunicator comm) {
comm.responseMessage(" ");
comm.responseMessage("Grbl 9.9z [ugs diagnostic mode]");
comm.responseMessage(" ");
comm.responseMessage("This is a diagnostic end point which responds to each gcode");
comm.responseMessage("command as fast as possible while doing nothing else.");
}
Runnable okRunnable = () -> {
try {
Thread.sleep(1000);
} catch (Exception e) {}
// This is nested beneath a GrblController, notify it that we're ready.
initialize(comm);
int count = 0;
Point3d lastCommand = null;
while (true) {
GcodeParser gcp = new GcodeParser();
try {
String command = sent.take().trim();
Thread.sleep(ms);
String response;
if (command.equals(Byte.toString(GrblUtils.GRBL_STATUS_COMMAND))) {
String xyz = "0,0,0";
if (lastCommand != null) {
Point3d p = lastCommand;
xyz = String.format("%f,%f,%f", p.x, p.y, p.z);
}
comm.responseMessage(String.format("<Run,MPos:%s,WPos:%s>", xyz, xyz));
} else if (command.equals("G61")) {
comm.responseMessage("error: G61 not supported.");
} else {
count++;
if (count == 2) {
initialize(comm);
}
else if (count > 2) {
try {
gcp.addCommand(command);
lastCommand = gcp.getCurrentState().currentPoint;
} catch (Exception e) {
}
comm.responseMessage("ok");
}
}
} catch (InterruptedException ex) {
if (exit) return;
}
}
};
public LoopBackConnection(int ms) {
this("\r\n");
this.ms = ms;
sent = new LinkedBlockingQueue<>();
okThread = new Thread(okRunnable);
}
public LoopBackConnection(String terminator) {
}
@Override
synchronized public boolean openPort(String name, int baud) throws Exception {
okThread.start();
exit = false;
open = true;
return isOpen();
}
@Override
public boolean isOpen() {
return open;
}
@Override
public void closePort() throws Exception {
exit = true;
open = false;
okThread.interrupt();
}
@Override
public void sendStringToComm(String command) throws Exception {
this.sent.put(command);
}
@Override
public void sendByteImmediately(byte b) throws Exception {
this.sent.put(Byte.toString(b));
}
public static boolean supports(String portname, int baud) {
return false;
}
}