#pragma once #include #include 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 ToIndices(AxisFlags flags); std::vector ToIndices(IJKFlags flags); std::vector 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; } } } }; }