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)