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 9f55d77..79f2813 100755 Binary files a/Release/RepRapFirmware.bin and b/Release/RepRapFirmware.bin differ 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 +