From 4c74c4eb30730ba0bf3f82aa16155c848e6605cb Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Wed, 20 Nov 2013 22:13:23 +0000 Subject: [PATCH] Upload of reprap.htm implemented (M560). The file must end "" without the quotes. --- Configuration.h | 10 ++-- Data/.~lock.duet-testing.doc# | 1 - Data/duet-testing.doc | Bin 71680 -> 71680 bytes GCodes.cpp | 106 ++++++++++++++++++++++++++-------- GCodes.h | 20 ++++--- Release/RepRapFirmware.bin | Bin 164684 -> 164916 bytes SD-image/www/reprap.htm | 1 + Webserver.h | 3 - 8 files changed, 99 insertions(+), 42 deletions(-) delete mode 100644 Data/.~lock.duet-testing.doc# diff --git a/Configuration.h b/Configuration.h index 72a5d58..d1dd347 100644 --- a/Configuration.h +++ b/Configuration.h @@ -67,13 +67,13 @@ enum Compatibility #define DEFAULT_PASSWORD "reprap" #define DEFAULT_NAME "My RepRap 1" - -/* Z PROBE CALIBRATION - * Set = 1 to enable Z probe ADC output on SerialUSb - */ -#define CALIB_Z 0 +#define INDEX_PAGE "reprap.htm" +#define MESSAGE_FILE "messages.txt" +#define FOUR04_FILE "html404.htm" #define LONG_TIME 300.0 // Seconds +#define EOF_STRING "" + #endif diff --git a/Data/.~lock.duet-testing.doc# b/Data/.~lock.duet-testing.doc# deleted file mode 100644 index a5f5040..0000000 --- a/Data/.~lock.duet-testing.doc# +++ /dev/null @@ -1 +0,0 @@ -Adrian Bowyer,ensab,Charles,20.11.2013 18:47,file:///home/ensab/.config/libreoffice/3; \ No newline at end of file diff --git a/Data/duet-testing.doc b/Data/duet-testing.doc index 4adadb0c0977a49cd5b3adbd1a8639806f0229c6..df15e498999d9492dbe8669b52c29745c8e20ba4 100644 GIT binary patch delta 1607 zcmY+^ZAe>J9DwnETxuP}+0NFt##F6!QEZIHh9WY?R!Ygz(GSj-%-XGsnXb-dE-Q45 zM79z{+{ip4Qu<-I5M(gsdL@%mij-~)@xvHJMv=XU6DcAhos=SD&q?kWyYe&FbK+5Q zpL2$1t;4g{*%F&2s!DAyKP|^Zd~T5^>K)s$a^F#rjcSn^r%3RGNTNaHN~1`-M`TZZ zZM&F1bwK1d{DG)Zn!jq<=Q=178!xDQHd-v1D~Gwv6*W8s2d&2!pArcl7TG6phOP2R zLcjihG;Z`48hMsIRc>#{i59C$tHT(u&y*TL??`@en_QK!^h!Qo=j5cg#iQ@lx2KC= zeV_4OsgO4imLchvL5Xnxu7vm=k-p6AoBTY;NWZ)#E>vXh2QqV4nfri|UI{WE(XYmz zFRd0BmbO?1Y6j_Sw2rc5}3eGl_K}Cj2-O4 zRVC7ddEAD6B7gmNsr?;?m7}A|sy|WH((!$)RllPIZVVudIBsAQ+sNZ7dNGM4)}Wv4 zq2v56Mlgm6OyN?ENC?BYhN6YgLEcX1DkaMtl2 zbfOzQcpV8$psZfRfgEznMFqU@;}WKk#slo&ne#6G7<>p}6w|naRs4-Ix@|!_hVU7Z zSil-~QREhBhEJXAa;QXCuDaaSq`vIB5Yzi1glo8tH16Xea@h^lXwka@5sV^*dw76d z9BLA&!x;qeAto`0MXbZht}25UZFn1TkJL(%n_F1M1~zf}Bst+nEa8cl96k?JsV@Ti z4I^;GqBdVEwA9}0F3D}$Hk0i(ll|39_5~8v$qt#BZkw6h;&rJ#em z2_0NDjnz1_>*-_3MN_)BCDhT6ZYu!YmhNgCx+}Zcm6c|6S5-KLR}egrT~8lzNz7vf zk8pr|n&C$u#*oAU)*z%~M=LrJL82kMo<1&9xQlf>MhVe);YT0hxPf^rV-tA|!VFo{71&>igJoPw>5I({b(pbU^UXTh+GiwoHW>I}Cal=F+BF4^_ z2#GL=5R>JNh!7Kz2$7J82$PT@A|WA?79r99=s=y4g(5x0A|0h7BkGysOybQHRv1OVOizp% z>rzui&P9?loq^4=df9kw^$M7!$*J~jZ{tMjHi@j0P9EFkR#@Nvf7)qY+-N2kBg*Y6 zv;{V+OuNTybv;d2NB1Yi9hWNgtlX{g%Q8$ySvb+msrr(vCeq4H<3!LFY|7vRpu#0m ziC*+0-z`#vdx)SLc8^FrhB1l?zHue)qZ`whfj3LUha6PmAllJ^1oq4Uy?0AXOX_E> zTRH1|%3t>;SfL*_BZNT=;}hm_fUVWrdlFrk#SiS>CbAdj(TvZS!VKmxkR$RE6ZnX^ z?aV_%uE$c3rrQI|$=D7U9Vg$$}3#s6_*&ck*UQS2R|Bd17Y-G4AWRa2ALP(Fj^2o zH~KMv4SOV2lJ-y(A{Z_cQO_H^am&lgrs3UZsQFVHjqHKOE%7C1tt$Oim3>x~1yrc3 z3`18rVwLFMYF0PBG^+J~P#5_Cy2u!Gky(`YugEIay2uc8ksF9h7dZqSTm@12ebzkI zWkjR{y8s>7By?c2(1E?M0{dVE_RR|HhZRl*a*af12~2&xQm|RwR!sd8^RP8kwhr@s6-Rm5J5l25yKz2 w2&M!_(Ta}J)p?ovEPaS5bW{#H(oKb}rbblp)k|igH``E$PS+R-J=dT71?=D=Qvd(} diff --git a/GCodes.cpp b/GCodes.cpp index ea28902..c9d71d8 100644 --- a/GCodes.cpp +++ b/GCodes.cpp @@ -61,6 +61,9 @@ void GCodes::Init() fileToPrint = NULL; fileBeingWritten = NULL; configFile = NULL; + eofString = EOF_STRING; + eofStringCounter = 0; + eofStringLength = strlen(eofString); homeX = false; homeY = false; homeZ = false; @@ -114,16 +117,17 @@ void GCodes::Spin() fileGCode->SetFinished(ActOnGcode(fileGCode)); platform->ClassReport("GCodes", longWait); return; - } + } // Now check if a G Code byte is available from each of the sources // in the same order for the same reason. if(webserver->GCodeAvailable()) { - if(webGCode->Put(webserver->ReadGCode())) + b = webserver->ReadGCode(); + if(webGCode->Put(b)) { - if(webGCode->WritingFile()) + if(webGCode->WritingFileDirectory()) WriteGCodeToFile(webGCode); else webGCode->SetFinished(ActOnGcode(webGCode)); @@ -132,19 +136,36 @@ void GCodes::Spin() return; } - if(platform->GetLine()->Status() & byteAvailable) + // Now the serial interface. First check the special case of our + // uploading the reprap.htm file + + if(serialGCode->WritingFileDirectory() == platform->GetWebDir()) { - platform->GetLine()->Read(b); - if(serialGCode->Put(b)) - { - if(serialGCode->WritingFile()) - WriteGCodeToFile(serialGCode); - else - serialGCode->SetFinished(ActOnGcode(serialGCode)); - } - platform->ClassReport("GCodes", longWait); - return; - } + if(platform->GetLine()->Status() & byteAvailable) + { + platform->GetLine()->Read(b); + WriteHTMLToFile(b, serialGCode); + } + } else + { + // Otherwise just deal in general with incoming bytes from the serial interface + + if(platform->GetLine()->Status() & byteAvailable) + { + platform->GetLine()->Read(b); + if(serialGCode->Put(b)) + { + if(serialGCode->WritingFileDirectory()) + WriteGCodeToFile(serialGCode); + else + serialGCode->SetFinished(ActOnGcode(serialGCode)); + } + platform->ClassReport("GCodes", longWait); + return; + } + } + + if(fileBeingPrinted != NULL) { @@ -500,18 +521,47 @@ char* GCodes::GetCurrentCoordinates() return scratchString; } -char* GCodes::OpenFileToWrite(char* fileName, GCodeBuffer *gb, bool configFile) +char* GCodes::OpenFileToWrite(char* directory, char* fileName, GCodeBuffer *gb) { - if(configFile) - fileBeingWritten = platform->GetFileStore(platform->GetSysDir(), fileName, true); - else - fileBeingWritten = platform->GetFileStore(platform->GetGCodeDir(), fileName, true); + fileBeingWritten = platform->GetFileStore(directory, fileName, true); if(fileBeingWritten == NULL) platform->Message(HOST_MESSAGE, "Can't open GCode file for writing.\n"); else - gb->SetWritingFile(true); + gb->SetWritingFileDirectory(directory); + + eofStringCounter = 0; } +void GCodes::WriteHTMLToFile(char b, GCodeBuffer *gb) +{ + char reply[1]; + reply[0] = 0; + + if(fileBeingWritten == NULL) + { + platform->Message(HOST_MESSAGE, "Attempt to write to a null file.\n"); + return; + } + + fileBeingWritten->Write(b); + + if(b == eofString[eofStringCounter]) + { + eofStringCounter++; + if(eofStringCounter >= eofStringLength) + { + fileBeingWritten->Close(); + fileBeingWritten = NULL; + gb->SetWritingFileDirectory(NULL); + char* r = reply; + if(platform->Emulating() == marlin) + r = "Done saving file."; + HandleReply(false, gb == serialGCode , r, 'M', 560, false); + return; + } + } else + eofStringCounter = 0; +} void GCodes::WriteGCodeToFile(GCodeBuffer *gb) { @@ -532,7 +582,7 @@ void GCodes::WriteGCodeToFile(GCodeBuffer *gb) { fileBeingWritten->Close(); fileBeingWritten = NULL; - gb->SetWritingFile(false); + gb->SetWritingFileDirectory(NULL); char* r = reply; if(platform->Emulating() == marlin) r = "Done saving file."; @@ -1033,7 +1083,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) case 28: // Write to file str = gb->GetUnprecedentedString(); - OpenFileToWrite(str, gb, false); + OpenFileToWrite(platform->GetGCodeDir(), str, gb); snprintf(reply, STRING_LENGTH, "Writing to file: %s", str); break; @@ -1296,10 +1346,16 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) case 559: // Upload config.g str = platform->GetConfigFile(); - OpenFileToWrite(str, gb, true); + OpenFileToWrite(platform->GetSysDir(), str, gb); snprintf(reply, STRING_LENGTH, "Writing to file: %s", str); break; + case 560: // Upload reprap.htm + str = INDEX_PAGE; + OpenFileToWrite(platform->GetWebDir(), str, gb); + snprintf(reply, STRING_LENGTH, "Writing to file: %s", str); + break; + case 906: // Set Motor currents for(uint8_t i = 0; i < DRIVES; i++) { @@ -1376,7 +1432,7 @@ GCodeBuffer::GCodeBuffer(Platform* p, char* id) { platform = p; identity = id; - writingFile = false; // Has to be done here as Init() is called every line. + writingFileDirectory = NULL; // Has to be done here as Init() is called every line. } void GCodeBuffer::Init() diff --git a/GCodes.h b/GCodes.h index 8c3c881..e921371 100644 --- a/GCodes.h +++ b/GCodes.h @@ -43,8 +43,8 @@ class GCodeBuffer char* Buffer(); bool Finished(); void SetFinished(bool f); - bool WritingFile(); - void SetWritingFile(bool wf); + char* WritingFileDirectory(); + void SetWritingFileDirectory(char* wfd); private: int CheckSum(); @@ -55,7 +55,7 @@ class GCodeBuffer int readPointer; bool inComment; bool finished; - bool writingFile; + char* writingFileDirectory; }; //**************************************************************************************************** @@ -98,9 +98,10 @@ class GCodes bool StandbyHeaters(); void SetEthernetAddress(GCodeBuffer *gb, int mCode); void HandleReply(bool error, bool fromLine, char* reply, char gMOrT, int code, bool resend); - char* OpenFileToWrite(char* fileName, GCodeBuffer *gb, bool configFile); + char* OpenFileToWrite(char* directory, char* fileName, GCodeBuffer *gb); void WriteGCodeToFile(GCodeBuffer *gb); bool SendConfigToLine(); + void WriteHTMLToFile(char b, GCodeBuffer *gb); int8_t Heater(int8_t head); Platform* platform; @@ -127,6 +128,9 @@ class GCodes FileStore* fileToPrint; FileStore* fileBeingWritten; FileStore* configFile; + char* eofString; + uint8_t eofStringCounter; + uint8_t eofStringLength; int8_t selectedHead; bool homeX; bool homeY; @@ -165,14 +169,14 @@ inline void GCodeBuffer::SetFinished(bool f) finished = f; } -inline bool GCodeBuffer::WritingFile() +inline char* GCodeBuffer::WritingFileDirectory() { - return writingFile; + return writingFileDirectory; } -inline void GCodeBuffer::SetWritingFile(bool wf) +inline void GCodeBuffer::SetWritingFileDirectory(char* wfd) { - writingFile = wf; + writingFileDirectory = wfd; } inline bool GCodes::PrintingAFile() diff --git a/Release/RepRapFirmware.bin b/Release/RepRapFirmware.bin index b1cb6efa06f3a30f5644353747a1bb3404ad313d..be31f4c351aaedaf14e122600e7bd89eb19e5b69 100755 GIT binary patch delta 19632 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 + diff --git a/Webserver.h b/Webserver.h index e5429a9..8876b6f 100644 --- a/Webserver.h +++ b/Webserver.h @@ -31,9 +31,6 @@ Licence: GPL #define WEBSERVER_H -#define INDEX_PAGE "reprap.htm" -#define MESSAGE_FILE "messages.txt" -#define FOUR04_FILE "html404.htm" #define KO_START "rr_" #define KO_FIRST 3 #define POST_LENGTH 200