diff --git a/src/GCodes/GCodes.cpp b/src/GCodes/GCodes.cpp index 8ef8b210b0..8c543d96e9 100644 --- a/src/GCodes/GCodes.cpp +++ b/src/GCodes/GCodes.cpp @@ -3437,6 +3437,24 @@ bool GCodes::GetMacroRestarted() const noexcept return ms.doingFileMacro && ms.GetPrevious() != nullptr && ms.GetPrevious()->firstCommandAfterRestart; } +void GCodes::FileMacroReturnValue(GCodeBuffer& gb, const StringRef& varName, ExpressionValue& returnValue) noexcept +{ + if (gb.IsDoingFileMacro() && gb.GetStackDepth() > 0) + { + GCodeMachineState * const ps = gb.CurrentFileMachineState().GetPrevious(); + auto vset = WriteLockedPointer(nullptr, &ps->variables); + Variable *_ecv_null v = vset->Lookup(varName.c_str(), false); + if (v == nullptr) + { + vset->InsertNew(varName.c_str(), returnValue, ps->GetBlockNesting()); + } + else + { + v->Assign(returnValue); + } + } +} + void GCodes::FileMacroCyclesReturn(GCodeBuffer& gb) noexcept { //const int retValue = (gb.Seen('P')) ? gb.GetIValue() : 0; // for when we allow M99 to return 'result' diff --git a/src/GCodes/GCodes.h b/src/GCodes/GCodes.h index 4ff0c6d3c3..0fb9120a65 100644 --- a/src/GCodes/GCodes.h +++ b/src/GCodes/GCodes.h @@ -385,7 +385,8 @@ class GCodes bool DoFileMacro(GCodeBuffer& gb, const char *_ecv_array fileName, bool reportMissing, int codeRunning) noexcept; // Run a GCode macro file, optionally report error if not found bool DoFileMacroWithParameters(GCodeBuffer& gb, const char *_ecv_array fileName, bool reportMissing, int codeRunning) THROWS(GCodeException); - void FileMacroCyclesReturn(GCodeBuffer& gb) noexcept; // End a macro + void FileMacroCyclesReturn(GCodeBuffer& gb) noexcept; // End a macro + void FileMacroReturnValue(GCodeBuffer& gb, const StringRef& varName, ExpressionValue& returnValue) noexcept; // Return a value from a macro bool ActOnCode(GCodeBuffer& gb, const StringRef& reply) noexcept; // Do a G, M or T Code bool HandleGcode(GCodeBuffer& gb, const StringRef& reply) THROWS(GCodeException); // Do a G code diff --git a/src/GCodes/GCodes2.cpp b/src/GCodes/GCodes2.cpp index 12ee8bef59..56d315bd39 100644 --- a/src/GCodes/GCodes2.cpp +++ b/src/GCodes/GCodes2.cpp @@ -1675,8 +1675,19 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply) THROWS(GCodeEx break; case 99: // Return from Macro/Subprogram + { + String varName; + bool seenV = false; + gb.TryGetQuotedString('V', varName.GetRef(), seenV, false); + + if(seenV) { + ExpressionValue returnVar = (gb.Seen('R')) ? gb.GetExpression() : ExpressionValue(); + FileMacroReturnValue(gb, varName.GetRef(), returnVar); + } + FileMacroCyclesReturn(gb); break; + } case 101: // Un-retract, generated by S3D if "Include M101/101/103" is enabled result = RetractFilament(gb, false);