25 #include "GrblGenerator.hpp"
33 #include <logger/Logger.hpp>
35 using namespace logger;
37 static const std::string s_loggerCat{
"grbl:gen"};
43 const Modal DistanceMode::Relative{DistanceMode::modalGroup,
"G91"};
44 const Modal DistanceMode::Absolute{DistanceMode::modalGroup,
"G90"};
46 const Modal MotionMode::Rapid{MotionMode::modalGroup,
"G0"};
47 const Modal MotionMode::Linear{MotionMode::modalGroup,
"G1"};
49 const Modal NonModal::Dwell{NonModal::modalGroup,
"G4"};
50 const Modal NonModal::AbsoluteOverride{NonModal::modalGroup,
"G53"};
51 const Modal NonModal::SetCoordinateOffset{NonModal::modalGroup,
"G92"};
52 const Modal NonModal::ResetCoordinateOffset{NonModal::modalGroup,
"G92.1"};
53 const Modal NonModal::ClearCoordinateOffset{NonModal::modalGroup,
"G92.2"};
54 const Modal NonModal::RestoreCoordinateOffset{NonModal::modalGroup,
"G92.3"};
56 Modal DigitalOut::on(uint8_t port,
bool immediate)
58 std::string val =
"M" + std::string(immediate ?
"64" :
"62");
59 val +=
"P" + std::to_string(port);
60 return Modal{DigitalOut::modalGroup, val};
63 Modal DigitalOut::off(uint8_t port,
bool immediate)
65 std::string val =
"M" + std::string(immediate ?
"65" :
"63");
66 val +=
"P" + std::to_string(port);
67 return Modal{DigitalOut::modalGroup, val};
70 Modal CoordinateSystem::set(uint8_t system)
72 char out[]{
'G',
'5',
'4', 0};
74 out[2] += (system - 54);
77 return Modal{CoordinateSystem::modalGroup, out};
80 Modal NonModal::SetCoordinate(int8_t system,
bool relative)
82 char parg[]{
'P',
'0', 0};
84 parg[1] += system - 54 + 1;
86 parg[1] += system + 1;
88 const char *larg = relative ?
"L20" :
"L2";
90 return Modal{NonModal::modalGroup, (std::string(
"G10") + larg) + parg};
93 Modal NonModal::GoHome(uint8_t index)
95 return Modal{NonModal::modalGroup, (index == 0) ?
"G28" :
"G30"};
98 Modal NonModal::SetHome(uint8_t index)
100 return Modal{NonModal::modalGroup, (index == 0) ?
"G28.1" :
"G30.1"};
103 const std::string Realtime::Reset =
"\x18";
104 const std::string Realtime::CycleStart =
"\x81";
105 const std::string Realtime::FeedHold =
"\x82";
106 const std::string Realtime::StatusReport =
"?";
107 const std::string System::ParserState =
"$G";
108 const std::string System::Jog =
"$J";
109 const std::string System::NGCParams =
"$#";
110 const std::string System::Settings =
"$$";
111 const std::string System::AllSettings =
"$+";
112 const std::string System::ToggleBlockDelete =
"$B";
113 const std::string System::ToggleSingleBlock =
"$S";
114 const std::string System::ToggleOptionalStop =
"$O";
115 const std::string System::CheckMode =
"$C";
116 const std::string System::DisableLock =
"$X";
117 const std::string System::Home =
"$H";
118 const std::string System::Help =
"$HELP";
119 const std::string System::Sleep =
"$SLP";
120 const std::string System::SetToolReference =
"$TLR";
121 const std::string System::ToolProbeWorkpiece =
"$TLR";
122 const std::string System::BuildInfo =
"$I";
123 const std::string System::AllBuildInfo =
"$I+";
124 const std::string System::SettingsReset =
"$RST";
125 const std::string System::StartupLines =
"$N";
126 const std::string System::EnumerateAlarms =
"$EA";
127 const std::string System::EnumerateErrors =
"$EE";
128 const std::string System::EnumerateGroups =
"$EG";
129 const std::string System::EnumerateSettings =
"$ES";
130 const std::string System::EnumerateAll =
"$E*";
131 const std::string System::EnumeratePins =
"$PINS";
132 const std::string System::ReportLastSignalsEvent =
"$LEV";
133 const std::string System::ReportCurrentLimitState =
"$LIM";
134 const std::string System::ReportSpindleData =
"$SD";
135 const std::string System::SpindleResetData =
"$SR";
139 if (logger.isEnabled())
141 logger <<
"Modal(" << modal.group <<
", " << modal.value <<
")";
145 const Logger &operator<<(
const Logger &logger,
const Position &pos)
147 if (logger.isEnabled())
149 logger <<
"Position(" << pos.axis << std::fixed << std::setprecision(3)
150 << pos.value << logger::clearflags <<
")";
158 case ModalGroup::NonModal:
return "NonModal";
159 case ModalGroup::MotionMode:
return "MotionMode";
160 case ModalGroup::PlaneSelect:
return "PlaneSelect";
161 case ModalGroup::DistanceMode:
return "DistanceMode";
162 case ModalGroup::ArcIJKDistanceMode:
return "ArcIJKDistanceMode";
163 case ModalGroup::FeedRateMode:
return "FeedRateMode";
164 case ModalGroup::Units:
return "Units";
165 case ModalGroup::CutterRadiusCompensation:
166 return "CutterRadiusCompensation";
167 case ModalGroup::ToolLengthOffset:
return "ToolLengthOffset";
168 case ModalGroup::CCRetractMode:
return "CCRetractMode";
169 case ModalGroup::Scaling:
return "Scaling";
170 case ModalGroup::CoordinateSystem:
return "CoordinateSystem";
171 case ModalGroup::ControlMode:
return "ControlMode";
172 case ModalGroup::SpindleSpeedMode:
return "SpindleSpeedMode";
173 case ModalGroup::LatheDiameterMode:
return "LatheDiameterMode";
175 case ModalGroup::ProgramFlow:
return "ProgramFlow";
176 case ModalGroup::ToolChange:
return "ToolChange";
177 case ModalGroup::SpindleTurning:
return "SpindleTurning";
178 case ModalGroup::CoolantControl:
return "CoolantControl";
179 case ModalGroup::Override:
return "Override";
180 case ModalGroup::DigitalOut:
return "DigitalOut";
181 default:
return "Unknown";
185 std::string System::setSetting(SettingId settingId,
const std::string &value)
187 std::ostringstream ss;
188 ss <<
"$" << settingId <<
"=" << value;
196 typedef std::map<grbl::Axis, grbl_float_t> PositionsMap;
197 typedef std::map<gen::ModalGroup, std::string> ModalsMap;
199 PositionsMap positions;
201 std::string errorString;
206 std::string Generator::str()
const
208 if (!m_data->errorString.empty())
209 return std::string();
211 std::ostringstream oss;
212 for (
const GeneratorData::ModalsMap::value_type &it : m_data->modals)
215 oss << std::fixed << std::setprecision(3);
217 for (
const GeneratorData::PositionsMap::value_type &it : m_data->positions)
218 oss << to_string(it.first) << it.second;
223 bool Generator::fail()
const
225 return !m_data->errorString.empty();
228 const std::string &Generator::errorString()
const
230 return m_data->errorString;
233 const Generator &Generator::operator<<(
const gen::Modal &modal)
const
238 GeneratorData &data = *m_data;
239 GeneratorData::ModalsMap::const_iterator it = data.modals.find(
241 if (it == data.modals.cend())
242 data.modals[modal.group] = modal.value;
243 else if (it->second != modal.value)
245 data.errorString =
"modal command conflict: " + it->second +
246 " and " + modal.value;
247 error(s_loggerCat) << data.errorString;
253 const Generator &Generator::operator<<(
const gen::Position &pos)
const
258 GeneratorData &data = *m_data;
259 GeneratorData::PositionsMap::iterator it = data.positions.find(pos.axis);
260 if (it == data.positions.cend())
261 data.positions[pos.axis] = pos.value;
262 else if (fabs(it->second - pos.value) >=
265 std::ostringstream oss;
266 oss <<
"position conflict on " <<
to_string(it->first)
267 <<
" axis: " << std::fixed << std::setprecision(3) << it->second
268 <<
" and " << pos.value;
270 data.errorString = oss.str();
271 error(s_loggerCat) << data.errorString;
275 it->second = pos.value;
const std::string & to_string(Axis::State state)
convert State to string
ModalGroup
Modal Groups of commands.