369 lines
5.9 KiB
C++
369 lines
5.9 KiB
C++
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <vector>
|
||
|
|
#include <string>
|
||
|
|
|
||
|
|
namespace iosender {
|
||
|
|
|
||
|
|
enum class Dialect {
|
||
|
|
Grbl,
|
||
|
|
GrblHAL,
|
||
|
|
LinuxCNC
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class AxisFlags : int {
|
||
|
|
None = 0,
|
||
|
|
X = 1 << 0,
|
||
|
|
Y = 1 << 1,
|
||
|
|
Z = 1 << 2,
|
||
|
|
A = 1 << 3,
|
||
|
|
B = 1 << 4,
|
||
|
|
C = 1 << 5,
|
||
|
|
U = 1 << 6,
|
||
|
|
V = 1 << 7,
|
||
|
|
W = 1 << 8,
|
||
|
|
XY = 0x03,
|
||
|
|
XZ = 0x05,
|
||
|
|
XYZ = 0x07,
|
||
|
|
All = 0x3F
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class IJKFlags : int {
|
||
|
|
None = 0,
|
||
|
|
I = 1 << 0,
|
||
|
|
J = 1 << 1,
|
||
|
|
K = 1 << 2,
|
||
|
|
All = 0x07
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class ThreadingFlags : int {
|
||
|
|
None = 0,
|
||
|
|
R = 1 << 0,
|
||
|
|
Q = 1 << 1,
|
||
|
|
H = 1 << 2,
|
||
|
|
E = 1 << 3,
|
||
|
|
L = 1 << 4,
|
||
|
|
All = 0x1F
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class Plane {
|
||
|
|
XY,
|
||
|
|
XZ,
|
||
|
|
YZ
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class DistanceMode {
|
||
|
|
Absolute,
|
||
|
|
Incremental
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class FeedRateMode {
|
||
|
|
InverseTime, //G93
|
||
|
|
UnitsPerMin, //G94 - default
|
||
|
|
UnitsPerRev //G95
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class MotionMode {
|
||
|
|
G0 = 0,
|
||
|
|
G1 = 10,
|
||
|
|
G2 = 20,
|
||
|
|
G3 = 30,
|
||
|
|
G5 = 50,
|
||
|
|
G5_1 = 51,
|
||
|
|
G5_2 = 52,
|
||
|
|
G33 = 330,
|
||
|
|
G38_2 = 382,
|
||
|
|
G38_3 = 383,
|
||
|
|
G38_4 = 384,
|
||
|
|
G38_5 = 385,
|
||
|
|
G73 = 730,
|
||
|
|
G76 = 760,
|
||
|
|
G80 = 800,
|
||
|
|
None = G80,
|
||
|
|
G81 = 810,
|
||
|
|
G82 = 820,
|
||
|
|
G83 = 830,
|
||
|
|
G84 = 840,
|
||
|
|
G85 = 850,
|
||
|
|
G86 = 860,
|
||
|
|
G87 = 870,
|
||
|
|
G88 = 880,
|
||
|
|
G89 = 890
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class IJKMode {
|
||
|
|
Absolute,
|
||
|
|
Incremental
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class Units {
|
||
|
|
Imperial = 0,
|
||
|
|
Metric = 1
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class SpindleState : int {
|
||
|
|
Off = 1 << 0,
|
||
|
|
CW = 1 << 1,
|
||
|
|
CCW = 1 << 2
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class CoolantState : int {
|
||
|
|
Off = 0,
|
||
|
|
Flood = 1 << 0,
|
||
|
|
Mist = 1 << 1,
|
||
|
|
Shower = 1 << 2
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class ToolLengthOffset {
|
||
|
|
Cancel = 0, // G49 (Default: Must be zero)
|
||
|
|
Enable = 1, // G43
|
||
|
|
EnableDynamic = 2, // G43.1
|
||
|
|
ApplyAdditional = 3 // G43.2
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class ThreadTaper : int {
|
||
|
|
None = 0,
|
||
|
|
Entry = 1 << 0,
|
||
|
|
Exit = 1 << 1,
|
||
|
|
Both = Entry | Exit
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class LatheMode : int {
|
||
|
|
Disabled = 0,
|
||
|
|
Diameter = 1, // Do not change
|
||
|
|
Radius = 2 // Do not change
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class Direction {
|
||
|
|
Positive = 0,
|
||
|
|
Negative
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class InputWaitMode {
|
||
|
|
Immediate = 0,
|
||
|
|
Rise,
|
||
|
|
Fall,
|
||
|
|
High,
|
||
|
|
Low
|
||
|
|
};
|
||
|
|
|
||
|
|
enum class Commands {
|
||
|
|
G0,
|
||
|
|
G1,
|
||
|
|
G2,
|
||
|
|
G3,
|
||
|
|
G4,
|
||
|
|
G5,
|
||
|
|
G5_1,
|
||
|
|
G7,
|
||
|
|
G8,
|
||
|
|
G10,
|
||
|
|
G17,
|
||
|
|
G18,
|
||
|
|
G19,
|
||
|
|
G20,
|
||
|
|
G21,
|
||
|
|
G28,
|
||
|
|
G28_1,
|
||
|
|
G30,
|
||
|
|
G30_1,
|
||
|
|
G33,
|
||
|
|
G38_2,
|
||
|
|
G38_3,
|
||
|
|
G38_4,
|
||
|
|
G38_5,
|
||
|
|
G40,
|
||
|
|
G43,
|
||
|
|
G43_1,
|
||
|
|
G43_2,
|
||
|
|
G49,
|
||
|
|
G50,
|
||
|
|
G51,
|
||
|
|
G53,
|
||
|
|
G54,
|
||
|
|
G55,
|
||
|
|
G56,
|
||
|
|
G57,
|
||
|
|
G58,
|
||
|
|
G59,
|
||
|
|
G59_1,
|
||
|
|
G59_2,
|
||
|
|
G59_3,
|
||
|
|
G61,
|
||
|
|
G61_1,
|
||
|
|
G64,
|
||
|
|
G73,
|
||
|
|
G76,
|
||
|
|
G80,
|
||
|
|
G81,
|
||
|
|
G82,
|
||
|
|
G83,
|
||
|
|
G85,
|
||
|
|
G86,
|
||
|
|
G89,
|
||
|
|
G90,
|
||
|
|
G90_1,
|
||
|
|
G91,
|
||
|
|
G91_1,
|
||
|
|
G92,
|
||
|
|
G92_1,
|
||
|
|
G92_2,
|
||
|
|
G92_3,
|
||
|
|
G93,
|
||
|
|
G94,
|
||
|
|
G95,
|
||
|
|
G96,
|
||
|
|
G97,
|
||
|
|
G98,
|
||
|
|
G99,
|
||
|
|
M0,
|
||
|
|
M1,
|
||
|
|
M2,
|
||
|
|
M3,
|
||
|
|
M4,
|
||
|
|
M5,
|
||
|
|
M6,
|
||
|
|
M7,
|
||
|
|
M8,
|
||
|
|
M9,
|
||
|
|
M30,
|
||
|
|
M48,
|
||
|
|
M49,
|
||
|
|
M50,
|
||
|
|
M51,
|
||
|
|
M52,
|
||
|
|
M53,
|
||
|
|
M56,
|
||
|
|
M61,
|
||
|
|
M62,
|
||
|
|
M63,
|
||
|
|
M64,
|
||
|
|
M65,
|
||
|
|
M66,
|
||
|
|
M67,
|
||
|
|
M68,
|
||
|
|
Feedrate,
|
||
|
|
SpindleRPM,
|
||
|
|
ToolSelect,
|
||
|
|
Comment,
|
||
|
|
UserMCommand,
|
||
|
|
Undefined
|
||
|
|
};
|
||
|
|
|
||
|
|
std::vector<int> ToIndices(AxisFlags flags);
|
||
|
|
std::vector<int> ToIndices(IJKFlags flags);
|
||
|
|
std::vector<int> ToIndices(ThreadingFlags flags);
|
||
|
|
|
||
|
|
|
||
|
|
class GCodeUtils {
|
||
|
|
public:
|
||
|
|
static std::string StripSpaces(std::string line);
|
||
|
|
};
|
||
|
|
|
||
|
|
struct Point3D {
|
||
|
|
union {
|
||
|
|
struct {
|
||
|
|
double X, Y, Z;
|
||
|
|
};
|
||
|
|
double value[3];
|
||
|
|
};
|
||
|
|
|
||
|
|
double& operator[](int index) {
|
||
|
|
return value[index];
|
||
|
|
}
|
||
|
|
|
||
|
|
double *Array() { return value; }
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
struct Point6D {
|
||
|
|
union {
|
||
|
|
struct {
|
||
|
|
double X, Y, Z, A, B, C, U, V, W;
|
||
|
|
};
|
||
|
|
double value[9];
|
||
|
|
};
|
||
|
|
|
||
|
|
double& operator[](int index) {
|
||
|
|
return value[index];
|
||
|
|
}
|
||
|
|
|
||
|
|
double *Array() { return value; }
|
||
|
|
|
||
|
|
explicit operator Point3D() { return Point3D{X, Y, Z}; }
|
||
|
|
|
||
|
|
void Set(double *values, AxisFlags axisFlags, bool relative = false) {
|
||
|
|
if (relative) {
|
||
|
|
Add(values, axisFlags);
|
||
|
|
} else {
|
||
|
|
for (auto i: ToIndices(axisFlags)) {
|
||
|
|
switch (i) {
|
||
|
|
case 0:
|
||
|
|
X = values[0];
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
Y = values[1];
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
Z = values[2];
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
A = values[3];
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
B = values[4];
|
||
|
|
break;
|
||
|
|
case 5:
|
||
|
|
C = values[5];
|
||
|
|
break;
|
||
|
|
case 6:
|
||
|
|
U = values[6];
|
||
|
|
break;
|
||
|
|
case 7:
|
||
|
|
V = values[7];
|
||
|
|
break;
|
||
|
|
case 8:
|
||
|
|
W = values[8];
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void Add(const double values[], AxisFlags axisFlags) {
|
||
|
|
for (auto i: ToIndices(axisFlags)) {
|
||
|
|
switch (i) {
|
||
|
|
case 0:
|
||
|
|
X += values[0];
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
Y += values[1];
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
Z += values[2];
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
A += values[3];
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
B += values[4];
|
||
|
|
break;
|
||
|
|
case 5:
|
||
|
|
C += values[5];
|
||
|
|
break;
|
||
|
|
case 6:
|
||
|
|
U += values[6];
|
||
|
|
break;
|
||
|
|
case 7:
|
||
|
|
V += values[7];
|
||
|
|
break;
|
||
|
|
case 8:
|
||
|
|
W += values[8];
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
}
|