1 package com.neuronrobotics.replicator.driver.interpreter;
3 import java.io.BufferedReader;
4 import java.io.InputStream;
5 import java.io.InputStreamReader;
6 import java.util.ArrayList;
7 import java.util.Arrays;
8 import java.util.Comparator;
10 import java.util.concurrent.locks.ReentrantLock;
12 import com.neuronrobotics.sdk.common.Log;
37 ArrayList<Integer> mcodes =
new ArrayList<Integer>();
42 ArrayList<Integer> gcodes =
new ArrayList<Integer>();
56 List<CodeHandler> gHandlers[];
62 List<Integer> gClearOnSet[];
68 List<Integer> gOneShot;
74 List<CodeHandler> mHandlers[];
81 Comparator<Integer> gCodeOrdering;
86 char motion_axes[] = {
'X',
'Y',
'Z' };
104 Thread interpretingThread;
107 ReentrantLock executingLock;
116 @SuppressWarnings(
"unchecked")
118 gHandlers = (List<CodeHandler>[])
new ArrayList<?>[310];
119 mHandlers = (List<CodeHandler>[])
new ArrayList<?>[310];
120 gClearOnSet = (List<Integer>[])
new List<?>[310];
127 executingLock =
new ReentrantLock();
142 tokens = line.split(delims);
146 System.out.println(
"GCODE: "+line);
148 for(
int i=0;i<tokens.length;i++){
149 tokens[i] = tokens[i].trim();
150 if(!tokens[i].isEmpty()){
151 double val = Double.parseDouble(tokens[i].substring(1));
152 char code = tokens[i].charAt(0);
154 mcodes.add((
int) val);
157 int theCode = (int) val;
158 if (gClearOnSet[theCode] !=
null)
159 gcodes.removeAll(gClearOnSet[theCode]);
162 Log.
debug(
"Code Token: "+tokens[i]+
" "+code+
" "+val);
176 private void parseLine(InputStream r)
throws Exception {
177 BufferedReader br =
new BufferedReader(
new InputStreamReader(r));
179 boolean inCommentSection =
false;
181 while ((line = br.readLine()) !=
null) {
185 if(line.indexOf(
';')>-1){
187 if(line.indexOf(
';') ==0){
192 tokens = line.split(delims);
202 if(line.indexOf(
'(')>-1){
204 inCommentSection =
true;
210 if(line.indexOf(
')')>-1){
212 inCommentSection =
false;
221 if (line.trim().isEmpty()){
246 Log.
debug(
"Next Gcode Line " + nextLine);
247 Log.
debug(
"Active Gcodes: " + gcodes);
248 Log.
debug(
"Active Mcodes: " + mcodes);
250 if (mHandlers[m] !=
null) {
252 handler.execute(lastLine, nextLine);
257 throw new RuntimeException(
"No implementation found for M" + m);
263 if (gHandlers[g] !=
null) {
265 handler.execute(lastLine, nextLine);
269 throw new RuntimeException(
"No implementation found for G" + g);
277 gcodes.removeAll(gOneShot);
289 executingLock.lock();
291 interpretingThread = Thread.currentThread();
295 interpretingThread =
null;
296 executingLock.unlock();
308 if (executingLock.tryLock()) {
312 executingLock.unlock();
315 throw(
new RuntimeException(
"Printer not ready"));
326 if (interpretingThread !=
null) {
327 interpretingThread.interrupt();
351 if (gHandlers[code] ==
null)
352 gHandlers[code] =
new ArrayList<CodeHandler>();
353 gHandlers[code].add(handler);
371 gHandlers[code] =
new ArrayList<CodeHandler>();
372 gHandlers[code].add(handler);
393 if (mHandlers[code] ==
null)
394 mHandlers[code] =
new ArrayList<CodeHandler>();
395 mHandlers[code].add(handler);
413 mHandlers[code] =
new ArrayList<CodeHandler>();
414 mHandlers[code].add(handler);
445 if (gCodeOrdering ==
null) {
451 final Comparator<Integer> oldComparator = gCodeOrdering;
459 gCodeOrdering =
new Comparator<Integer>() {
460 public int compare(Integer o1, Integer o2) {
461 int r1 = c.compare(o1, o2);
463 return oldComparator.compare(o1, o2);
467 @SuppressWarnings(
"unused")
468 public boolean equals(Integer o1, Integer o2) {
469 return this.compare(o1, o2) == 0;
482 @SuppressWarnings(
"unchecked")
483 public
void setGSorting(@SuppressWarnings("rawtypes") Comparator c) {
493 final double curOffset[] =
new double[26];
507 Log.
error(
"Zero feedrate; action will never complete.");
510 +
" at feed " + next.
getWord(
'F'));
518 char axes[] = {
'X',
'Y',
'Z' };
519 for (
char c : axes) {
530 char axes[] = {
'X',
'Y',
'Z' };
531 for (
char c : axes) {
541 char axes[] = {
'X',
'Y',
'Z' };
542 for (
char c : axes) {
552 public int compare(Integer o1, Integer o2) {
553 int a = o1.intValue();
554 int b = o2.intValue();
555 if (a >= 21 && a <= 22)
559 if (b >= 21 && b <= 22)
563 if (a >= 90 && a <= 91)
566 if (b >= 90 && b <= 91)
572 @SuppressWarnings(
"unchecked")
573 List<Integer>[] exclGroups = (List<Integer>[])
new List<?>[] {
574 Arrays.asList(0, 1, 4, 28),
576 Arrays.asList(20, 21), Arrays.asList(90, 91) };
577 for (List<Integer> group : exclGroups) {
578 for (
int code : group) {
579 gClearOnSet[code] = group;
582 gClearOnSet[91] = Arrays.asList(90, 91, 92);
585 gOneShot = Arrays.asList(28, 92);
595 public static void main(String args[])
throws Exception {
void setSubHandlers(List< CodeHandler > subHandlers)
abstract void execute(GCodeLineData prev, GCodeLineData line)
void parseLine(InputStream r)
void interpretStream(InputStream in)
void addGSorting(final Comparator< Integer > c)
void addGHandler(int code, CodeHandler handler)
void setErrorHandler(CodeHandler errorHandler)
void setGSorting(@SuppressWarnings("rawtypes") Comparator c)
void setGHandler(int code, CodeHandler handler)
void setMHandler(int code, CodeHandler handler)
void executeLine(String rawLine)
static void main(String args[])
CodeHandler getErrorHandler()
void processSingleGCODELine(String line)
void addDefaultHandlers()
void tryInterpretStream(InputStream in)
void addMHandler(int code, CodeHandler handler)
void storeWord(char c, double val)
static void error(String message)
static void debug(String message)