ToDo_1 erledigt
This commit is contained in:
204
robot/GCode.js
204
robot/GCode.js
@@ -2,6 +2,7 @@
|
||||
* Receives GCode, processes it and moves the Data to the Roboter-Class
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const GCodeParser = require('./GCodeParser');
|
||||
|
||||
|
||||
class GCode{
|
||||
@@ -81,138 +82,103 @@ class GCode{
|
||||
};
|
||||
|
||||
static receiveGCode(robot, g){
|
||||
const commands = GCodeParser.parse(g);
|
||||
if (!commands.length) return;
|
||||
|
||||
if(g == undefined) return;
|
||||
if(g.length == 0) return;
|
||||
commands.forEach(parsed => {
|
||||
if (!parsed || !parsed.command) {
|
||||
return;
|
||||
}
|
||||
|
||||
// console.log("🔵 GCode.receiveGCode: Incoming command: " + g); // Moved to InputWS
|
||||
const cmd = parsed.command;
|
||||
const params = parsed.params || {};
|
||||
|
||||
g = g.toString("utf8");
|
||||
if (cmd === 'G90') {
|
||||
robot.moveRelative = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if(g.startsWith("$J=")) {
|
||||
// Handle $J= GCode for jogging
|
||||
g = g.substring(3).trim(); // Remove "$J=" and trim whitespace
|
||||
}
|
||||
if (cmd === 'G91') {
|
||||
robot.moveRelative = true;
|
||||
return;
|
||||
}
|
||||
|
||||
var multipleCommands = g.split(" G");
|
||||
var doProcessRest = false;
|
||||
if(multipleCommands.length > 1){
|
||||
doProcessRest = true;
|
||||
g = multipleCommands[0];
|
||||
}
|
||||
|
||||
g = g.split(" ");
|
||||
|
||||
var calculateNew = true;
|
||||
var calculateFromMotorCoordinates = false;
|
||||
|
||||
if(g[0] == "G90") {robot.moveRelative = false; calculateNew = false;}
|
||||
else if(g[0] == "G91") {robot.moveRelative = true; calculateNew = false;}
|
||||
// G28 - Move to Home Position
|
||||
else if(g[0] == "G28") {
|
||||
if (cmd === 'G28') {
|
||||
robot.x = 0;
|
||||
robot.y = robot.l1 + robot.l2 + robot.l3;
|
||||
robot.z = 0;
|
||||
robot.phi = -Math.PI/2;
|
||||
robot.theta = Math.PI/2;
|
||||
robot.phi = -Math.PI / 2;
|
||||
robot.theta = Math.PI / 2;
|
||||
robot.psi = 0;
|
||||
robot.e = 0;
|
||||
return;
|
||||
}
|
||||
else if(g[0] == "G1" && robot.moveRelative){
|
||||
g.forEach((s) => {
|
||||
if(s.toUpperCase().includes("X")){ robot.x += Number(s.substring(1, s.length)); robot.xMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Y")){ robot.y += Number(s.substring(1, s.length)); robot.yMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Z")){ robot.z += Number(s.substring(1, s.length)); robot.zMotorChanged = true;}
|
||||
|
||||
// abc in 2Pi-Angles
|
||||
if(s.toUpperCase().includes("A")){ robot.phi += Number(s.substring(1, s.length)); robot.aMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("B")){ robot.theta += Number(s.substring(1, s.length)); robot.bMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("C")){ robot.psi += Number(s.substring(1, s.length)); robot.cMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("E")){ robot.e += Number(s.substring(1, s.length)); robot.eMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("F")){ robot.feedrate = Number(s.substring(1, s.length));}
|
||||
});
|
||||
}
|
||||
else if(g[0] == "M1" && robot.moveRelative){
|
||||
calculateFromMotorCoordinates = true;
|
||||
g.forEach((s) => {
|
||||
if(s.toUpperCase().includes("X")){ robot.xMotor += Number(s.substring(1, s.length)); robot.xMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Y")){ robot.alpha += Number(s.substring(1, s.length)); robot.yMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Z")){ robot.beta += Number(s.substring(1, s.length)); robot.zMotorChanged = true;}
|
||||
|
||||
if(s.toUpperCase().includes("A")){ robot.a += Number(s.substring(1, s.length)); robot.aMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("B")){ robot.b += Number(s.substring(1, s.length)); robot.bMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("C")){ robot.c += Number(s.substring(1, s.length)); robot.cMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("E")){ robot.e += Number(s.substring(1, s.length)); robot.eMotorChanged = true;}
|
||||
});
|
||||
}
|
||||
// Absolute-Positioning
|
||||
else if(g[0] == "G1" && !robot.moveRelative){
|
||||
g.forEach((s) => {
|
||||
if(s.toUpperCase().includes("X")){ robot.x = Number(s.substring(1, s.length)); robot.xMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Y")){ robot.y = Number(s.substring(1, s.length)); robot.yMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Z")){ robot.z = Number(s.substring(1, s.length)); robot.zMotorChanged = true;}
|
||||
|
||||
if(s.toUpperCase().includes("A")){ robot.phi = Number(s.substring(1, s.length)); robot.aMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("B")){ robot.theta = Number(s.substring(1, s.length)); robot.bMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("C")){ robot.psi = Number(s.substring(1, s.length)); robot.cMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("E")){ robot.e = Number(s.substring(1, s.length)); robot.eMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("F")){ robot.feedrate = Number(s.substring(1, s.length)); }
|
||||
});
|
||||
}
|
||||
else if(g[0] == "M1" && !robot.moveRelative){
|
||||
calculateFromMotorCoordinates = true;
|
||||
g.forEach((s) => {
|
||||
if(s.toUpperCase().includes("X")){ robot.xMotor = Number(s.substring(1, s.length)); robot.xMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Y")){ robot.alpha = Number(s.substring(1, s.length)); robot.yMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Z")){ robot.beta = Number(s.substring(1, s.length)); robot.zMotorChanged = true;}
|
||||
|
||||
if(s.toUpperCase().includes("A")){ robot.a = Number(s.substring(1, s.length)); robot.aMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("B")){ robot.b = Number(s.substring(1, s.length)); robot.bMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("C")){ robot.c = Number(s.substring(1, s.length)); robot.cMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("E")){ robot.e = Number(s.substring(1, s.length)); robot.eMotorChanged = true;}
|
||||
});
|
||||
robot.calculatePositionFromMotorAngles();
|
||||
}
|
||||
else if(g[0] == "M92"){ // G92 - Set Position --- M92 in Radiant
|
||||
robot.createMotorPosition();
|
||||
g.forEach((s) => {
|
||||
if(s.toUpperCase().includes("X")){ robot.xMotor = Number(s.substring(1, s.length)); robot.xMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Y")){ robot.alpha = Number(s.substring(1, s.length)); robot.yMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("Z")){ robot.beta = Number(s.substring(1, s.length)); robot.zMotorChanged = true;}
|
||||
|
||||
if(s.toUpperCase().includes("A")){ robot.a = Number(s.substring(1, s.length)); robot.aMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("B")){ robot.b = Number(s.substring(1, s.length)); robot.bMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("C")){ robot.c = Number(s.substring(1, s.length)); robot.cMotorChanged = true;}
|
||||
if(s.toUpperCase().includes("E")){ robot.e = Number(s.substring(1, s.length)); robot.eMotorChanged = true;}
|
||||
});
|
||||
robot.calculatePositionFromMotorAngles();
|
||||
calculateNew = false;
|
||||
|
||||
// ToDo: Send Command to update Position of Robot, because G92 should
|
||||
// set the current Position to the given Coordinates without moving the Robot.
|
||||
robot.sendCommand("G92");
|
||||
}
|
||||
|
||||
if(calculateNew && !calculateFromMotorCoordinates){
|
||||
robot.calculateAngles3D();
|
||||
robot.sendCommand();
|
||||
}
|
||||
|
||||
if(calculateFromMotorCoordinates){
|
||||
robot.calculatePositionFromMotorAngles();
|
||||
robot.sendCommand();
|
||||
}
|
||||
|
||||
|
||||
// verarbeitet alle weiteren Commands in dieser Zeile.
|
||||
if(doProcessRest){
|
||||
multipleCommands.forEach((cmd) => {
|
||||
if(cmd[0] != "G"){
|
||||
this.receiveGCode(robot, "G"+cmd);
|
||||
if (cmd === 'G1') {
|
||||
if (robot.moveRelative) {
|
||||
if (Number.isFinite(params.X)) { robot.x += params.X; robot.xMotorChanged = true; }
|
||||
if (Number.isFinite(params.Y)) { robot.y += params.Y; robot.yMotorChanged = true; }
|
||||
if (Number.isFinite(params.Z)) { robot.z += params.Z; robot.zMotorChanged = true; }
|
||||
if (Number.isFinite(params.A)) { robot.phi += params.A; robot.aMotorChanged = true; }
|
||||
if (Number.isFinite(params.B)) { robot.theta += params.B; robot.bMotorChanged = true; }
|
||||
if (Number.isFinite(params.C)) { robot.psi += params.C; robot.cMotorChanged = true; }
|
||||
if (Number.isFinite(params.E)) { robot.e += params.E; robot.eMotorChanged = true; }
|
||||
if (Number.isFinite(params.F)) { robot.feedrate = params.F; }
|
||||
} else {
|
||||
if (Number.isFinite(params.X)) { robot.x = params.X; robot.xMotorChanged = true; }
|
||||
if (Number.isFinite(params.Y)) { robot.y = params.Y; robot.yMotorChanged = true; }
|
||||
if (Number.isFinite(params.Z)) { robot.z = params.Z; robot.zMotorChanged = true; }
|
||||
if (Number.isFinite(params.A)) { robot.phi = params.A; robot.aMotorChanged = true; }
|
||||
if (Number.isFinite(params.B)) { robot.theta = params.B; robot.bMotorChanged = true; }
|
||||
if (Number.isFinite(params.C)) { robot.psi = params.C; robot.cMotorChanged = true; }
|
||||
if (Number.isFinite(params.E)) { robot.e = params.E; robot.eMotorChanged = true; }
|
||||
if (Number.isFinite(params.F)) { robot.feedrate = params.F; }
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
robot.calculateAngles3D();
|
||||
robot.sendCommand();
|
||||
return;
|
||||
}
|
||||
|
||||
if (cmd === 'M1') {
|
||||
if (robot.moveRelative) {
|
||||
if (Number.isFinite(params.X)) { robot.xMotor += params.X; robot.xMotorChanged = true; }
|
||||
if (Number.isFinite(params.Y)) { robot.alpha += params.Y; robot.yMotorChanged = true; }
|
||||
if (Number.isFinite(params.Z)) { robot.beta += params.Z; robot.zMotorChanged = true; }
|
||||
if (Number.isFinite(params.A)) { robot.a += params.A; robot.aMotorChanged = true; }
|
||||
if (Number.isFinite(params.B)) { robot.b += params.B; robot.bMotorChanged = true; }
|
||||
if (Number.isFinite(params.C)) { robot.c += params.C; robot.cMotorChanged = true; }
|
||||
if (Number.isFinite(params.E)) { robot.e += params.E; robot.eMotorChanged = true; }
|
||||
} else {
|
||||
if (Number.isFinite(params.X)) { robot.xMotor = params.X; robot.xMotorChanged = true; }
|
||||
if (Number.isFinite(params.Y)) { robot.alpha = params.Y; robot.yMotorChanged = true; }
|
||||
if (Number.isFinite(params.Z)) { robot.beta = params.Z; robot.zMotorChanged = true; }
|
||||
if (Number.isFinite(params.A)) { robot.a = params.A; robot.aMotorChanged = true; }
|
||||
if (Number.isFinite(params.B)) { robot.b = params.B; robot.bMotorChanged = true; }
|
||||
if (Number.isFinite(params.C)) { robot.c = params.C; robot.cMotorChanged = true; }
|
||||
if (Number.isFinite(params.E)) { robot.e = params.E; robot.eMotorChanged = true; }
|
||||
}
|
||||
|
||||
robot.calculatePositionFromMotorAngles();
|
||||
robot.sendCommand();
|
||||
return;
|
||||
}
|
||||
|
||||
if (cmd === 'M92') {
|
||||
robot.createMotorPosition();
|
||||
if (Number.isFinite(params.X)) { robot.xMotor = params.X; robot.xMotorChanged = true; }
|
||||
if (Number.isFinite(params.Y)) { robot.alpha = params.Y; robot.yMotorChanged = true; }
|
||||
if (Number.isFinite(params.Z)) { robot.beta = params.Z; robot.zMotorChanged = true; }
|
||||
if (Number.isFinite(params.A)) { robot.a = params.A; robot.aMotorChanged = true; }
|
||||
if (Number.isFinite(params.B)) { robot.b = params.B; robot.bMotorChanged = true; }
|
||||
if (Number.isFinite(params.C)) { robot.c = params.C; robot.cMotorChanged = true; }
|
||||
if (Number.isFinite(params.E)) { robot.e = params.E; robot.eMotorChanged = true; }
|
||||
|
||||
robot.calculatePositionFromMotorAngles();
|
||||
robot.sendCommand('G92');
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////77
|
||||
|
||||
83
robot/GCodeParser.js
Normal file
83
robot/GCodeParser.js
Normal file
@@ -0,0 +1,83 @@
|
||||
class GCodeParser {
|
||||
|
||||
static normalizeInput(raw) {
|
||||
if (raw === undefined || raw === null) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if (Buffer.isBuffer(raw)) {
|
||||
raw = raw.toString('utf8');
|
||||
}
|
||||
|
||||
return String(raw).trim();
|
||||
}
|
||||
|
||||
static splitCommands(input) {
|
||||
if (!input) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Preserve leading G/M on each segment.
|
||||
return input
|
||||
.trim()
|
||||
.split(/ (?=G|M)/i)
|
||||
.map(segment => segment.trim())
|
||||
.filter(Boolean);
|
||||
}
|
||||
|
||||
static parseCommand(commandString) {
|
||||
if (!commandString || commandString.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const tokens = commandString.trim().split(/\s+/);
|
||||
if (tokens.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const commandToken = tokens[0].toUpperCase();
|
||||
if (!/^[GM]\d+/i.test(commandToken)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const params = {};
|
||||
for (let i = 1; i < tokens.length; i++) {
|
||||
const token = tokens[i].trim();
|
||||
if (token.length < 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const key = token.charAt(0).toUpperCase();
|
||||
const valueString = token.substring(1);
|
||||
const value = Number(valueString);
|
||||
if (!Number.isNaN(value)) {
|
||||
params[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
command: commandToken,
|
||||
params,
|
||||
raw: commandString.trim()
|
||||
};
|
||||
}
|
||||
|
||||
static parse(raw) {
|
||||
const input = this.normalizeInput(raw);
|
||||
if (!input) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (input.startsWith('$J=')) {
|
||||
return this.parse(input.substring(3).trim());
|
||||
}
|
||||
|
||||
const commands = this.splitCommands(input)
|
||||
.map(commandString => this.parseCommand(commandString))
|
||||
.filter(Boolean);
|
||||
|
||||
return commands;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = GCodeParser;
|
||||
Reference in New Issue
Block a user