From 4ed66b8b013a049d09d7695b65962a1f2dd4d5ca Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Thu, 19 Dec 2013 23:30:23 +0000 Subject: [PATCH] Experimental macro/canned-cycle on the SD implemented. --- Configuration.h | 2 +- GCodes.cpp | 130 ++++++++++++++++++++++++++++++++----- GCodes.h | 5 ++ Release/RepRapFirmware.bin | Bin 167780 -> 168260 bytes SD-image/sys/homex.g | 11 ++++ SD-image/sys/homey.g | 8 +++ 6 files changed, 138 insertions(+), 18 deletions(-) create mode 100644 SD-image/sys/homex.g create mode 100644 SD-image/sys/homey.g diff --git a/Configuration.h b/Configuration.h index 7c8a21e..03a26f3 100644 --- a/Configuration.h +++ b/Configuration.h @@ -24,7 +24,7 @@ Licence: GPL #define CONFIGURATION_H #define NAME "RepRapFirmware" -#define VERSION "0.42" +#define VERSION "0.43" #define DATE "2013-12-19" #define LAST_AUTHOR "reprappro.com" diff --git a/GCodes.cpp b/GCodes.cpp index 3602fe0..a963114 100644 --- a/GCodes.cpp +++ b/GCodes.cpp @@ -33,6 +33,7 @@ GCodes::GCodes(Platform* p, Webserver* w) webGCode = new GCodeBuffer(platform, "web: "); fileGCode = new GCodeBuffer(platform, "file: "); serialGCode = new GCodeBuffer(platform, "serial: "); + cannedCycleGCode = new GCodeBuffer(platform, "canned: "); } void GCodes::Exit() @@ -46,9 +47,11 @@ void GCodes::Init() webGCode->Init(); fileGCode->Init(); serialGCode->Init(); + cannedCycleGCode->Init(); webGCode->SetFinished(true); fileGCode->SetFinished(true); serialGCode->SetFinished(true); + cannedCycleGCode->SetFinished(true); moveAvailable = false; drivesRelative = true; axesRelative = false; @@ -58,9 +61,11 @@ void GCodes::Init() for(int8_t i = 0; i < DRIVES - AXES; i++) lastPos[i] = 0.0; fileBeingPrinted = NULL; + saveFileBeingPrinted = NULL; fileToPrint = NULL; fileBeingWritten = NULL; configFile = NULL; + doingCannedCycleFile = false; eofString = EOF_STRING; eofStringCounter = 0; eofStringLength = strlen(eofString); @@ -82,6 +87,26 @@ void GCodes::Init() dwellTime = longWait; } +void GCodes::doFilePrint(GCodeBuffer* gb) +{ + char b; + + if(fileBeingPrinted != NULL) + { + if(fileBeingPrinted->Read(b)) + { + if(gb->Put(b)) + gb->SetFinished(ActOnGcode(gb)); + } else + { + if(gb->Put('\n')) // In case there wasn't one ending the file + gb->SetFinished(ActOnGcode(gb)); + fileBeingPrinted->Close(); + fileBeingPrinted = NULL; + } + } +} + void GCodes::Spin() { if(!active) @@ -164,22 +189,8 @@ void GCodes::Spin() } } + doFilePrint(fileGCode); - - if(fileBeingPrinted != NULL) - { - if(fileBeingPrinted->Read(b)) - { - if(fileGCode->Put(b)) - fileGCode->SetFinished(ActOnGcode(fileGCode)); - } else - { - if(fileGCode->Put('\n')) // In case there wasn't one ending the file - fileGCode->SetFinished(ActOnGcode(fileGCode)); - fileBeingPrinted->Close(); - fileBeingPrinted = NULL; - } - } platform->ClassReport("GCodes", longWait); } @@ -331,6 +342,12 @@ bool GCodes::SetUpMove(GCodeBuffer *gb) LoadMoveBufferFromGCode(gb, false); checkEndStops = false; + if(gb->Seen('S')) + { + if(gb->GetIValue() == 1) + checkEndStops = true; + } + moveAvailable = true; return true; } @@ -349,6 +366,75 @@ bool GCodes::ReadMove(float m[], bool& ce) return true; } + +bool GCodes::DoFileCannedCycles(char* fileName) +{ + // Have we started the file? + + if(!doingCannedCycleFile) + { + // No + + if(!AllMovesAreFinishedAndMoveBufferIsLoaded()) + return false; + + if(fileBeingPrinted != NULL) + { + if(saveFileBeingPrinted != NULL) + { + platform->Message(HOST_MESSAGE, "Canned cycle files cannot be recursive!\n"); + return true; + } + saveFileBeingPrinted = fileBeingPrinted; + } + + fileBeingPrinted = platform->GetFileStore(platform->GetSysDir(), fileName, false); + if(fileBeingPrinted == NULL) + { + platform->Message(HOST_MESSAGE, "Canned cycle GCode file not found - "); + platform->Message(HOST_MESSAGE, fileName); + platform->Message(HOST_MESSAGE, "\n"); + if(saveFileBeingPrinted != NULL) + { + fileBeingPrinted = saveFileBeingPrinted; + saveFileBeingPrinted = NULL; + } + return true; + } + doingCannedCycleFile = true; + cannedCycleGCode->Init(); + return false; + } + + // Have we finished the file? + + if(fileBeingPrinted == NULL) + { + // Yes + + doingCannedCycleFile = false; + cannedCycleGCode->Init(); + if(saveFileBeingPrinted != NULL) + { + fileBeingPrinted = saveFileBeingPrinted; + saveFileBeingPrinted = NULL; + } + return true; + } + + // Do more of the file + + if(!cannedCycleGCode->Finished()) + { + cannedCycleGCode->SetFinished(ActOnGcode(cannedCycleGCode)); + return false; + } + + doFilePrint(cannedCycleGCode); + + return false; +} + // To execute any move, call this until it returns true. // moveToDo[] entries corresponding with false entries in action[] will // be ignored. Recall that moveToDo[DRIVES] should contain the feedrate @@ -1323,7 +1409,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) fileBeingPrinted = NULL; break; - case 27: // Report print status + case 27: // Report print status - Depricated if(this->PrintingAFile()) strncpy(reply, "SD printing.", STRING_LENGTH); else @@ -1411,7 +1497,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) reprap.SetDebug(gb->GetIValue()); break; - case 112: // Emergency stop - aced upon in Webserver + case 112: // Emergency stop - acted upon in Webserver break; case 114: // Deprecated @@ -1646,6 +1732,16 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) } break; + case 900: + result = DoFileCannedCycles("homex.g"); + break; + + case 901: + result = DoFileCannedCycles("homey.g"); + break; + + + case 906: // Set Motor currents for(uint8_t i = 0; i < DRIVES; i++) { diff --git a/GCodes.h b/GCodes.h index d4ec4c7..a308728 100644 --- a/GCodes.h +++ b/GCodes.h @@ -80,8 +80,10 @@ class GCodes private: + void doFilePrint(GCodeBuffer* gb); bool AllMovesAreFinishedAndMoveBufferIsLoaded(); bool DoCannedCycleMove(bool ce); + bool DoFileCannedCycles(char* fileName); bool ActOnGcode(GCodeBuffer* gb); bool SetUpMove(GCodeBuffer* gb); bool DoDwell(GCodeBuffer *gb); @@ -115,6 +117,7 @@ class GCodes GCodeBuffer* webGCode; GCodeBuffer* fileGCode; GCodeBuffer* serialGCode; + GCodeBuffer* cannedCycleGCode; bool moveAvailable; float moveBuffer[DRIVES+1]; // Last is feedrate bool checkEndStops; @@ -132,9 +135,11 @@ class GCodes bool offSetSet; float distanceScale; FileStore* fileBeingPrinted; + FileStore* saveFileBeingPrinted; FileStore* fileToPrint; FileStore* fileBeingWritten; FileStore* configFile; + bool doingCannedCycleFile; char* eofString; uint8_t eofStringCounter; uint8_t eofStringLength; diff --git a/Release/RepRapFirmware.bin b/Release/RepRapFirmware.bin index 9f55d7711c0b4bfe4c79644935af6adf462c1899..79f281345b82d7fcc646c9d62cc0869ceeed7f1c 100755 GIT binary patch delta 21218 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 delta 20557 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 diff --git a/SD-image/sys/homex.g b/SD-image/sys/homex.g new file mode 100644 index 0000000..0c195a8 --- /dev/null +++ b/SD-image/sys/homex.g @@ -0,0 +1,11 @@ +M120 ; Push +G91 +G1 Z5 F200 +G90 +G1 X-400 F1000 S1 +G92 X0 +G1 X3 F200 +G1 X-30 S1 +G92 X0 +M121 + diff --git a/SD-image/sys/homey.g b/SD-image/sys/homey.g new file mode 100644 index 0000000..9c4a96a --- /dev/null +++ b/SD-image/sys/homey.g @@ -0,0 +1,8 @@ +M120 ; Push +G91 +G1 Y400 F1000 S1 +G90 +G92 Y200 +G1 Y0 +M121 +