diff --git a/gcode.cpp b/gcode.cpp index 1d66457..930d8e3 100644 --- a/gcode.cpp +++ b/gcode.cpp @@ -37,12 +37,12 @@ pair extract_argument(const string& str) return result; } -void gcode_dummy(const vector&, TimeCalc&, double&) +void gcode_dummy(const vector&, TimeCalc&, double&, bool&) { } // Linear Move -void g1(const vector& line_tokens, TimeCalc& calc, double& speed) +void g1(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute) { double result; vector::const_iterator it; @@ -62,7 +62,14 @@ void g1(const vector& line_tokens, TimeCalc& calc, double& speed) // Extruder case 'E': case 'e': - pos.e = arg.second; + if (is_absolute) + { + pos.e = arg.second; + } + else + { + pos.e += arg.second; + } break; // Feedrate (Speed) in units/min @@ -78,17 +85,38 @@ void g1(const vector& line_tokens, TimeCalc& calc, double& speed) case 'X': case 'x': - pos.x = arg.second; + if (is_absolute) + { + pos.x = arg.second; + } + else + { + pos.x += arg.second; + } break; case 'Y': case 'y': - pos.y = arg.second; + if (is_absolute) + { + pos.y = arg.second; + } + else + { + pos.y += arg.second; + } break; case 'Z': case 'z': - pos.z = arg.second; + if (is_absolute) + { + pos.z = arg.second; + } + else + { + pos.z += arg.second; + } break; default: @@ -101,7 +129,7 @@ void g1(const vector& line_tokens, TimeCalc& calc, double& speed) } // Dwell -void g4(const vector& line_tokens, TimeCalc& calc, double& speed) +void g4(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute) { double result; vector::const_iterator it; @@ -137,7 +165,7 @@ void g4(const vector& line_tokens, TimeCalc& calc, double& speed) } // Move to Origin (Home) -void g28(const vector& line_tokens, TimeCalc& calc, double& speed) +void g28(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute) { Point pos = calc.get_pos(); @@ -148,8 +176,20 @@ void g28(const vector& line_tokens, TimeCalc& calc, double& speed) calc.set_pos(pos); } +// Set to Absolute Positioning +void g90(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute) +{ + is_absolute = true; +} + +// Set to Relative Positioning +void g91(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute) +{ + is_absolute = false; +} + // Set Position -void g92(const vector& line_tokens, TimeCalc& calc, double& speed) +void g92(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute) { vector::const_iterator it; pair arg; diff --git a/gcode.h b/gcode.h index a6520fa..611b48e 100644 --- a/gcode.h +++ b/gcode.h @@ -11,15 +11,17 @@ using namespace std; // Typedef of the function pointer -typedef void (*gcode_cmd_t)(const vector&, TimeCalc&, double&); +typedef void (*gcode_cmd_t)(const vector&, TimeCalc&, double&, bool& is_absolute); // Always returns 0 sec -void gcode_dummy(const vector&, TimeCalc&, double&); +void gcode_dummy(const vector&, TimeCalc&, double&, bool&); // All handled gcode commands -void g1(const vector& line_tokens, TimeCalc& calc, double& speed); -void g4(const vector& line_tokens, TimeCalc& calc, double& speed); -void g28(const vector& line_tokens, TimeCalc& calc, double& speed); -void g92(const vector& line_tokens, TimeCalc& calc, double& speed); +void g1(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute); +void g4(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute); +void g28(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute); +void g90(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute); +void g91(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute); +void g92(const vector& line_tokens, TimeCalc& calc, double& speed, bool& is_absolute); #endif // GCODE_H_ diff --git a/main.cpp b/main.cpp index 9a1b61c..4f70322 100644 --- a/main.cpp +++ b/main.cpp @@ -92,8 +92,11 @@ void init_map(map& gcode_map) gcode_map["G28"] = g28; gcode_map["g28"] = g28; - gcode_map["G90"] = gcode_dummy; - gcode_map["g90"] = gcode_dummy; + gcode_map["G90"] = g90; + gcode_map["g90"] = g90; + + gcode_map["G91"] = g91; + gcode_map["g91"] = g91; gcode_map["G92"] = g92; gcode_map["g92"] = g92; @@ -259,6 +262,7 @@ int main(int argc, char **argv) TimeCalc calc; double speed; + bool is_absolute = true; double total_time; int hours; int minutes; @@ -289,7 +293,7 @@ int main(int argc, char **argv) if (0 != gcode_map.count(line_tokens[0])) { - gcode_map[line_tokens[0]](line_tokens, calc, speed); + gcode_map[line_tokens[0]](line_tokens, calc, speed, is_absolute); } else {