mirror of
https://git.mirrors.martin98.com/https://github.com/luc-github/ESP3D.git
synced 2025-08-12 18:49:02 +08:00
Implement check sum for Serial upload as mandatory for Marlin
Add 2 new [ESPXXX] command as check sum helper * Send GCode with check sum caching right line numbering [ESP600]<gcode> * Send line checksum [ESP601]<line> Implemented only for Sync WebServer at this moment, so Async is disabled in Travis
This commit is contained in:
parent
f24dfe9d23
commit
8a2c39869a
12
.travis.yml
12
.travis.yml
@ -62,12 +62,12 @@ script:
|
|||||||
- build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
- build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
||||||
- arduino --board esp32:esp32:esp32 --save-prefs
|
- arduino --board esp32:esp32:esp32 --save-prefs
|
||||||
- build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
- build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
||||||
- sed -i "s/\/\/#define ASYNCWEBSERVER /#define ASYNCWEBSERVER/g" $HOME/arduino_ide/libraries/ESP3D/src/config.h
|
# - sed -i "s/\/\/#define ASYNCWEBSERVER /#define ASYNCWEBSERVER/g" $HOME/arduino_ide/libraries/ESP3D/src/config.h
|
||||||
- arduino --board esp8266com:esp8266:generic --save-prefs
|
# - arduino --board esp8266com:esp8266:generic --save-prefs
|
||||||
- arduino --get-pref sketchbook.path
|
# - arduino --get-pref sketchbook.path
|
||||||
- build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
# - build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
||||||
- arduino --board esp32:esp32:esp32 --save-prefs
|
# - arduino --board esp32:esp32:esp32 --save-prefs
|
||||||
- build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
# - build_sketch $TRAVIS_BUILD_DIR/examples/basicesp3d/basicesp3d.ino
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
email:
|
email:
|
||||||
|
@ -136,6 +136,12 @@ if authentication is on, need admin password for RESET, RESTART and SAFEMODE
|
|||||||
[ESP555]<password>pwd=<admin password>
|
[ESP555]<password>pwd=<admin password>
|
||||||
if no password set it use default one
|
if no password set it use default one
|
||||||
|
|
||||||
|
* Send GCode with check sum caching right line numbering
|
||||||
|
[ESP600]<gcode>
|
||||||
|
|
||||||
|
* Send line checksum
|
||||||
|
[ESP601]<line>
|
||||||
|
|
||||||
* Read SPIFFS file and send each line to serial
|
* Read SPIFFS file and send each line to serial
|
||||||
[ESP700]<filename>
|
[ESP700]<filename>
|
||||||
|
|
||||||
|
@ -49,6 +49,9 @@ String COMMAND::buffer_tcp;
|
|||||||
#define INCORRECT_CMD_MSG (output == WEB_PIPE)?F("Error: Incorrect Command"):F("Incorrect Cmd")
|
#define INCORRECT_CMD_MSG (output == WEB_PIPE)?F("Error: Incorrect Command"):F("Incorrect Cmd")
|
||||||
#define OK_CMD_MSG (output == WEB_PIPE)?F("ok"):F("Cmd Ok")
|
#define OK_CMD_MSG (output == WEB_PIPE)?F("ok"):F("Cmd Ok")
|
||||||
|
|
||||||
|
extern uint8_t Checksum(const char * line, uint16_t lineSize);
|
||||||
|
extern bool sendLine2Serial (String & line, int32_t linenb, int32_t* newlinenb);
|
||||||
|
|
||||||
String COMMAND::get_param (String & cmd_params, const char * id, bool withspace)
|
String COMMAND::get_param (String & cmd_params, const char * id, bool withspace)
|
||||||
{
|
{
|
||||||
static String parameter;
|
static String parameter;
|
||||||
@ -1403,6 +1406,47 @@ bool COMMAND::execute_command (int cmd, String cmd_params, tpipe output, level_a
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
//[ESP600]<gcode>
|
||||||
|
case 600: { //send GCode with check sum caching right line numbering
|
||||||
|
//be sure serial is locked
|
||||||
|
if ( (web_interface->blockserial) ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
int32_t linenb = 1;
|
||||||
|
cmd_params.trim() ;
|
||||||
|
if (sendLine2Serial (cmd_params, linenb, &linenb))ESPCOM::println (OK_CMD_MSG, output, espresponse);
|
||||||
|
else { //it may failed because of skip if repetier so let's reset numbering first
|
||||||
|
if ( ( CONFIG::GetFirmwareTarget() == REPETIER4DV) || (CONFIG::GetFirmwareTarget() == REPETIER) ) {
|
||||||
|
//reset numbering
|
||||||
|
String cmd = "M110 N0";
|
||||||
|
if (sendLine2Serial (cmd, -1, NULL)){
|
||||||
|
linenb = 1;
|
||||||
|
//if success let's try again to send the command
|
||||||
|
if (sendLine2Serial (cmd_params, linenb, &linenb))ESPCOM::println (OK_CMD_MSG, output, espresponse);
|
||||||
|
else {
|
||||||
|
ESPCOM::println (ERROR_CMD_MSG, output, espresponse);
|
||||||
|
response = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ESPCOM::println (ERROR_CMD_MSG, output, espresponse);
|
||||||
|
response = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
ESPCOM::println (ERROR_CMD_MSG, output, espresponse);
|
||||||
|
response = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//[ESP601]<line>
|
||||||
|
case 601: { //send line checksum
|
||||||
|
cmd_params.trim();
|
||||||
|
int8_t chk = Checksum(cmd_params.c_str(),cmd_params.length());
|
||||||
|
String schecksum = "Checksum: " + String(chk);
|
||||||
|
ESPCOM::println (schecksum, output, espresponse);
|
||||||
|
}
|
||||||
|
break;
|
||||||
//[ESP700]<filename>
|
//[ESP700]<filename>
|
||||||
case 700: { //read local file
|
case 700: { //read local file
|
||||||
//be sure serial is locked
|
//be sure serial is locked
|
||||||
|
10
src/config.h
10
src/config.h
@ -19,7 +19,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
//version and sources location
|
//version and sources location
|
||||||
#define FW_VERSION "2.0.0.c20"
|
#define FW_VERSION "2.0.0.c21"
|
||||||
#define REPOSITORY "https://github.com/luc-github/ESP3D"
|
#define REPOSITORY "https://github.com/luc-github/ESP3D"
|
||||||
|
|
||||||
//Customize ESP3D ////////////////////////////////////////////////////////////////////////
|
//Customize ESP3D ////////////////////////////////////////////////////////////////////////
|
||||||
@ -71,10 +71,10 @@
|
|||||||
#define DIRECT_PIN_FEATURE
|
#define DIRECT_PIN_FEATURE
|
||||||
|
|
||||||
//ESP_OLED_FEATURE: allow oled screen output
|
//ESP_OLED_FEATURE: allow oled screen output
|
||||||
#define ESP_OLED_FEATURE
|
//#define ESP_OLED_FEATURE
|
||||||
|
|
||||||
//DHT_FEATURE: send update of temperature / humidity based on DHT 11/22
|
//DHT_FEATURE: send update of temperature / humidity based on DHT 11/22
|
||||||
#define DHT_FEATURE
|
//#define DHT_FEATURE
|
||||||
|
|
||||||
//AUTHENTICATION_FEATURE: protect pages by login password
|
//AUTHENTICATION_FEATURE: protect pages by login password
|
||||||
//#define AUTHENTICATION_FEATURE
|
//#define AUTHENTICATION_FEATURE
|
||||||
@ -83,7 +83,7 @@
|
|||||||
#define WS_DATA_FEATURE
|
#define WS_DATA_FEATURE
|
||||||
|
|
||||||
//TIMESTAMP_FEATURE: Time stamp feature on direct SD files
|
//TIMESTAMP_FEATURE: Time stamp feature on direct SD files
|
||||||
#define TIMESTAMP_FEATURE
|
//#define TIMESTAMP_FEATURE
|
||||||
|
|
||||||
//Extra features /////////////////////////////////////////////////////////////////////////
|
//Extra features /////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ using fs::File;
|
|||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG_OUTPUT_TCP
|
#ifdef DEBUG_OUTPUT_TCP
|
||||||
#include "espcom.h"
|
#include "espcom.h"
|
||||||
#define LOG(string) {ESPCOM::send2TCP(string, true);}
|
#define LOG(string) {ESPCOM::send2TCP(string, false);}
|
||||||
#define DEBUG_PIPE TCP_PIPE
|
#define DEBUG_PIPE TCP_PIPE
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
@ -101,9 +101,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length
|
|||||||
|
|
||||||
|
|
||||||
extern bool deleteRecursive(String path);
|
extern bool deleteRecursive(String path);
|
||||||
extern void CloseSerialUpload (bool iserror, String & filename);
|
extern void CloseSerialUpload (bool iserror, String & filename, int32_t linenb);
|
||||||
extern bool sendLine2Serial (String & line);
|
extern bool sendLine2Serial (String & line, int32_t linenb, int32_t* newlinenb);
|
||||||
|
extern bool purge_serial();
|
||||||
|
|
||||||
const uint8_t PAGE_404 [] PROGMEM = "<HTML>\n<HEAD>\n<title>Redirecting...</title> \n</HEAD>\n<BODY>\n<CENTER>Unknown page : $QUERY$- you will be redirected...\n<BR><BR>\nif not redirected, <a href='http://$WEB_ADDRESS$'>click here</a>\n<BR><BR>\n<PROGRESS name='prg' id='prg'></PROGRESS>\n\n<script>\nvar i = 0; \nvar x = document.getElementById(\"prg\"); \nx.max=5; \nvar interval=setInterval(function(){\ni=i+1; \nvar x = document.getElementById(\"prg\"); \nx.value=i; \nif (i>5) \n{\nclearInterval(interval);\nwindow.location.href='/';\n}\n},1000);\n</script>\n</CENTER>\n</BODY>\n</HTML>\n\n";
|
const uint8_t PAGE_404 [] PROGMEM = "<HTML>\n<HEAD>\n<title>Redirecting...</title> \n</HEAD>\n<BODY>\n<CENTER>Unknown page : $QUERY$- you will be redirected...\n<BR><BR>\nif not redirected, <a href='http://$WEB_ADDRESS$'>click here</a>\n<BR><BR>\n<PROGRESS name='prg' id='prg'></PROGRESS>\n\n<script>\nvar i = 0; \nvar x = document.getElementById(\"prg\"); \nx.max=5; \nvar interval=setInterval(function(){\ni=i+1; \nvar x = document.getElementById(\"prg\"); \nx.value=i; \nif (i>5) \n{\nclearInterval(interval);\nwindow.location.href='/';\n}\n},1000);\n</script>\n</CENTER>\n</BODY>\n</HTML>\n\n";
|
||||||
const uint8_t PAGE_CAPTIVE [] PROGMEM = "<HTML>\n<HEAD>\n<title>Captive Portal</title> \n</HEAD>\n<BODY>\n<CENTER>Captive Portal page : $QUERY$- you will be redirected...\n<BR><BR>\nif not redirected, <a href='http://$WEB_ADDRESS$'>click here</a>\n<BR><BR>\n<PROGRESS name='prg' id='prg'></PROGRESS>\n\n<script>\nvar i = 0; \nvar x = document.getElementById(\"prg\"); \nx.max=5; \nvar interval=setInterval(function(){\ni=i+1; \nvar x = document.getElementById(\"prg\"); \nx.value=i; \nif (i>5) \n{\nclearInterval(interval);\nwindow.location.href='/';\n}\n},1000);\n</script>\n</CENTER>\n</BODY>\n</HTML>\n\n";
|
const uint8_t PAGE_CAPTIVE [] PROGMEM = "<HTML>\n<HEAD>\n<title>Captive Portal</title> \n</HEAD>\n<BODY>\n<CENTER>Captive Portal page : $QUERY$- you will be redirected...\n<BR><BR>\nif not redirected, <a href='http://$WEB_ADDRESS$'>click here</a>\n<BR><BR>\n<PROGRESS name='prg' id='prg'></PROGRESS>\n\n<script>\nvar i = 0; \nvar x = document.getElementById(\"prg\"); \nx.max=5; \nvar interval=setInterval(function(){\ni=i+1; \nvar x = document.getElementById(\"prg\"); \nx.value=i; \nif (i>5) \n{\nclearInterval(interval);\nwindow.location.href='/';\n}\n},1000);\n</script>\n</CENTER>\n</BODY>\n</HTML>\n\n";
|
||||||
@ -559,7 +559,6 @@ void SPIFFSFileupload()
|
|||||||
if(upload.status == UPLOAD_FILE_START) {
|
if(upload.status == UPLOAD_FILE_START) {
|
||||||
String upload_filename = upload.filename;
|
String upload_filename = upload.filename;
|
||||||
String sizeargname = upload_filename + "S";
|
String sizeargname = upload_filename + "S";
|
||||||
if (web_interface->web_server.hasArg ("plain") ) Serial.println("Yes");
|
|
||||||
if (upload_filename[0] != '/') filename = "/" + upload_filename;
|
if (upload_filename[0] != '/') filename = "/" + upload_filename;
|
||||||
else filename = upload.filename;
|
else filename = upload.filename;
|
||||||
//according User or Admin the root is different as user is isolate to /user when admin has full access
|
//according User or Admin the root is different as user is isolate to /user when admin has full access
|
||||||
@ -1152,6 +1151,7 @@ void handle_serial_SDFileList()
|
|||||||
//SD file upload by serial
|
//SD file upload by serial
|
||||||
void SDFile_serial_upload()
|
void SDFile_serial_upload()
|
||||||
{
|
{
|
||||||
|
static int32_t lineNb =-1;
|
||||||
static String current_line;
|
static String current_line;
|
||||||
static bool is_comment = false;
|
static bool is_comment = false;
|
||||||
static String current_filename;
|
static String current_filename;
|
||||||
@ -1174,93 +1174,70 @@ void SDFile_serial_upload()
|
|||||||
//Upload start
|
//Upload start
|
||||||
//**************
|
//**************
|
||||||
if(upload.status == UPLOAD_FILE_START) {
|
if(upload.status == UPLOAD_FILE_START) {
|
||||||
|
LOG("Upload Start\r\n")
|
||||||
|
String command = "M29";
|
||||||
|
String resetcmd = "M110 N0";
|
||||||
|
if (CONFIG::GetFirmwareTarget() == SMOOTHIEWARE)resetcmd = "N0 M110";
|
||||||
|
lineNb=1;
|
||||||
|
//close any ongoing upload and get current line number
|
||||||
|
if(!sendLine2Serial (command,1, &lineNb)){
|
||||||
|
//it can failed for repetier
|
||||||
|
if ( ( CONFIG::GetFirmwareTarget() == REPETIER4DV) || (CONFIG::GetFirmwareTarget() == REPETIER) ) {
|
||||||
|
if(!sendLine2Serial (command,-1, NULL)){
|
||||||
|
LOG("Start Upload failed")
|
||||||
|
web_interface->_upload_status= UPLOAD_STATUS_FAILED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG("Start Upload failed")
|
||||||
|
web_interface->_upload_status= UPLOAD_STATUS_FAILED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Reset line numbering
|
||||||
|
if(!sendLine2Serial (resetcmd,-1, NULL)){
|
||||||
|
LOG("Reset Numbering failed")
|
||||||
|
web_interface->_upload_status= UPLOAD_STATUS_FAILED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lineNb=1;
|
||||||
//need to lock serial out to avoid garbage in file
|
//need to lock serial out to avoid garbage in file
|
||||||
(web_interface->blockserial) = true;
|
(web_interface->blockserial) = true;
|
||||||
current_line ="";
|
current_line ="";
|
||||||
is_comment = false;
|
|
||||||
String response;
|
|
||||||
web_interface->_upload_status= UPLOAD_STATUS_ONGOING;
|
|
||||||
ESPCOM::println (F ("Uploading..."), PRINTER_PIPE);
|
|
||||||
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
|
||||||
LOG("Clear Serial\r\n");
|
|
||||||
if(ESPCOM::available(DEFAULT_PRINTER_PIPE)) {
|
|
||||||
ESPCOM::bridge();
|
|
||||||
CONFIG::wait(1);
|
|
||||||
}
|
|
||||||
//command to pritnter to start print
|
|
||||||
String command = "M28 " + upload.filename;
|
|
||||||
LOG(command);
|
|
||||||
LOG("\r\n");
|
|
||||||
ESPCOM::println (command, DEFAULT_PRINTER_PIPE);
|
|
||||||
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
|
||||||
current_filename = upload.filename;
|
current_filename = upload.filename;
|
||||||
CONFIG::wait (500);
|
is_comment = false;
|
||||||
uint32_t timeout = millis();
|
String response;
|
||||||
bool done = false;
|
ESPCOM::println (F ("Uploading..."), PRINTER_PIPE);
|
||||||
while (!done) { //time out is 2000ms
|
//Clear all serial
|
||||||
CONFIG::wait(0);
|
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
||||||
//if there is something in serial buffer
|
purge_serial();
|
||||||
size_t len = ESPCOM::available(DEFAULT_PRINTER_PIPE);
|
//besure nothing left again
|
||||||
//get size of buffer
|
purge_serial();
|
||||||
if (len > 0) {
|
command = "M28 " + upload.filename;
|
||||||
CONFIG::wait(0);
|
//send start upload
|
||||||
uint8_t * sbuf = (uint8_t *)malloc(len+1);
|
//no correction allowed because it means reset numbering was failed
|
||||||
if(!sbuf){
|
if (sendLine2Serial(command, lineNb, NULL)){
|
||||||
ESPCOM::println (F ("SD upload rejected"), PRINTER_PIPE);
|
CONFIG::wait(1200);
|
||||||
LOG("SD upload rejected\r\n");
|
//additional purge, in case it is slow to answer
|
||||||
LOG("Need to stop");
|
purge_serial();
|
||||||
#if defined ( ARDUINO_ARCH_ESP8266)
|
web_interface->_upload_status= UPLOAD_STATUS_ONGOING;
|
||||||
web_interface->web_server.client().stopAll();
|
LOG("Creation Ok\r\n")
|
||||||
#else
|
|
||||||
web_interface->web_server.client().stop();
|
} else {
|
||||||
#endif
|
web_interface->_upload_status= UPLOAD_STATUS_FAILED;
|
||||||
return ;
|
LOG("Creation failed\r\n");
|
||||||
}
|
|
||||||
//read buffer
|
|
||||||
ESPCOM::readBytes (DEFAULT_PRINTER_PIPE, sbuf, len);
|
|
||||||
//convert buffer to zero end array
|
|
||||||
sbuf[len] = '\0';
|
|
||||||
//use string because easier to handle
|
|
||||||
response = (const char*) sbuf;
|
|
||||||
LOG (response);
|
|
||||||
//if there is a wait it means purge is done
|
|
||||||
if (response.indexOf ("wait") > -1) {
|
|
||||||
LOG ("Exit start writing\r\n");
|
|
||||||
done = true;
|
|
||||||
free(sbuf);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//it is first command if it is failed no need to continue
|
|
||||||
//and resend command won't help
|
|
||||||
if (response.indexOf ("Resend") > -1 || response.indexOf ("failed") > -1) {
|
|
||||||
web_interface->blockserial = false;
|
|
||||||
LOG ("Error start writing\r\n");
|
|
||||||
web_interface->_upload_status = UPLOAD_STATUS_FAILED;
|
|
||||||
#if defined ( ARDUINO_ARCH_ESP8266)
|
|
||||||
web_interface->web_server.client().stopAll();
|
|
||||||
#else
|
|
||||||
web_interface->web_server.client().stop();
|
|
||||||
#endif
|
|
||||||
free(sbuf);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
free(sbuf);
|
|
||||||
}
|
|
||||||
if ( (millis() - timeout) > SERIAL_CHECK_TIMEOUT) {
|
|
||||||
done = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//Upload write
|
//Upload write
|
||||||
//**************
|
//**************
|
||||||
//upload is on going with data coming by 2K blocks
|
//upload is on going with data coming by 2K blocks
|
||||||
} else if(upload.status == UPLOAD_FILE_WRITE) { //if com error no need to send more data to serial
|
} else if(upload.status == UPLOAD_FILE_WRITE) { //if com error no need to send more data to serial
|
||||||
web_interface->_upload_status= UPLOAD_STATUS_ONGOING;
|
if (web_interface->_upload_status == UPLOAD_STATUS_ONGOING) {
|
||||||
for (int pos = 0; pos < upload.currentSize; pos++) { //parse full post data
|
for (int pos = 0; pos < upload.currentSize; pos++) { //parse full post data
|
||||||
//feed watchdog
|
//feed watchdog
|
||||||
CONFIG::wait(0);
|
CONFIG::wait(0);
|
||||||
//it is a comment
|
//it is a comment
|
||||||
if (upload.buf[pos] == ';') {
|
if (upload.buf[pos] == ';') {
|
||||||
LOG ("Comment\n")
|
LOG ("Comment\r\n")
|
||||||
is_comment = true;
|
is_comment = true;
|
||||||
}
|
}
|
||||||
//it is an end line
|
//it is an end line
|
||||||
@ -1271,10 +1248,11 @@ void SDFile_serial_upload()
|
|||||||
if (current_line.length() < 126) {
|
if (current_line.length() < 126) {
|
||||||
//do we have something in buffer ?
|
//do we have something in buffer ?
|
||||||
if (current_line.length() > 0 ) {
|
if (current_line.length() > 0 ) {
|
||||||
current_line += "\r\n";
|
lineNb++;
|
||||||
if (!sendLine2Serial (current_line) ) {
|
if (!sendLine2Serial (current_line, lineNb, NULL) ) {
|
||||||
|
//fup.println("[Log]Write Error");
|
||||||
LOG ("Error over buffer\n")
|
LOG ("Error over buffer\n")
|
||||||
CloseSerialUpload (true, current_filename);
|
CloseSerialUpload (true, current_filename,lineNb);
|
||||||
#if defined ( ARDUINO_ARCH_ESP8266)
|
#if defined ( ARDUINO_ARCH_ESP8266)
|
||||||
web_interface->web_server.client().stopAll();
|
web_interface->web_server.client().stopAll();
|
||||||
#else
|
#else
|
||||||
@ -1291,7 +1269,8 @@ void SDFile_serial_upload()
|
|||||||
} else {
|
} else {
|
||||||
//error buffer overload
|
//error buffer overload
|
||||||
LOG ("Error over buffer\n")
|
LOG ("Error over buffer\n")
|
||||||
CloseSerialUpload (true, current_filename);
|
lineNb++;
|
||||||
|
CloseSerialUpload (true, current_filename, lineNb);
|
||||||
#if defined ( ARDUINO_ARCH_ESP8266)
|
#if defined ( ARDUINO_ARCH_ESP8266)
|
||||||
web_interface->web_server.client().stopAll();
|
web_interface->web_server.client().stopAll();
|
||||||
#else
|
#else
|
||||||
@ -1304,7 +1283,8 @@ void SDFile_serial_upload()
|
|||||||
current_line += char (upload.buf[pos]); //copy current char to buffer to send/resend
|
current_line += char (upload.buf[pos]); //copy current char to buffer to send/resend
|
||||||
} else {
|
} else {
|
||||||
LOG ("Error over buffer\n")
|
LOG ("Error over buffer\n")
|
||||||
CloseSerialUpload (true, current_filename);
|
lineNb++;
|
||||||
|
CloseSerialUpload (true, current_filename, lineNb);
|
||||||
#if defined ( ARDUINO_ARCH_ESP8266)
|
#if defined ( ARDUINO_ARCH_ESP8266)
|
||||||
web_interface->web_server.client().stopAll();
|
web_interface->web_server.client().stopAll();
|
||||||
#else
|
#else
|
||||||
@ -1314,15 +1294,28 @@ void SDFile_serial_upload()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
LOG ("Error upload\n")
|
||||||
|
web_interface->_upload_status = UPLOAD_STATUS_FAILED;
|
||||||
|
lineNb++;
|
||||||
|
CloseSerialUpload (true, current_filename, lineNb);
|
||||||
|
#if defined ( ARDUINO_ARCH_ESP8266)
|
||||||
|
web_interface->web_server.client().stopAll();
|
||||||
|
#else
|
||||||
|
web_interface->web_server.client().stop();
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
//Upload end
|
//Upload end
|
||||||
//**************
|
//**************
|
||||||
} else if(upload.status == UPLOAD_FILE_END) {
|
} else if(upload.status == UPLOAD_FILE_END && web_interface->_upload_status == UPLOAD_STATUS_ONGOING) {
|
||||||
//if last part does not have '\n'
|
//if last part does not have '\n'
|
||||||
if (current_line.length() > 0) {
|
if (current_line.length() > 0) {
|
||||||
current_line += "\r\n";
|
lineNb++;
|
||||||
if (!sendLine2Serial (current_line) ) {
|
if (!sendLine2Serial (current_line, lineNb, NULL) ) {
|
||||||
LOG ("Error sending buffer\n")
|
LOG ("Error sending buffer\n")
|
||||||
CloseSerialUpload (true, current_filename);
|
lineNb++;
|
||||||
|
CloseSerialUpload (true, current_filename, lineNb);
|
||||||
#if defined ( ARDUINO_ARCH_ESP8266)
|
#if defined ( ARDUINO_ARCH_ESP8266)
|
||||||
web_interface->web_server.client().stopAll();
|
web_interface->web_server.client().stopAll();
|
||||||
#else
|
#else
|
||||||
@ -1332,12 +1325,14 @@ void SDFile_serial_upload()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG ("Upload finished ");
|
LOG ("Upload finished ");
|
||||||
CloseSerialUpload (false, current_filename);
|
lineNb++;
|
||||||
|
CloseSerialUpload (false, current_filename, lineNb);
|
||||||
//Upload cancelled
|
//Upload cancelled
|
||||||
//**************
|
//**************
|
||||||
} else { //UPLOAD_FILE_ABORTED
|
} else { //UPLOAD_FILE_ABORTED
|
||||||
LOG("Error, Something happened\r\n");
|
LOG("Error, Something happened\r\n");
|
||||||
CloseSerialUpload (true, current_filename);
|
lineNb++;
|
||||||
|
CloseSerialUpload (true, current_filename, lineNb);
|
||||||
#if defined ( ARDUINO_ARCH_ESP8266)
|
#if defined ( ARDUINO_ARCH_ESP8266)
|
||||||
web_interface->web_server.client().stopAll();
|
web_interface->web_server.client().stopAll();
|
||||||
#else
|
#else
|
||||||
|
@ -73,78 +73,203 @@
|
|||||||
|
|
||||||
long id_connection = 0;
|
long id_connection = 0;
|
||||||
|
|
||||||
|
uint8_t Checksum(const char * line, uint16_t lineSize)
|
||||||
|
{
|
||||||
|
uint8_t checksum_val =0;
|
||||||
|
for (uint16_t i=0; i < lineSize; i++) checksum_val = checksum_val ^ ((uint8_t)line[i]);
|
||||||
|
return checksum_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
String CheckSumLine(const char* line, uint32_t linenb){
|
||||||
|
String linechecksum = "N" + String(linenb)+ " " + line;
|
||||||
|
uint8_t crc = Checksum(linechecksum.c_str(), linechecksum.length());
|
||||||
|
linechecksum+="*"+String(crc);
|
||||||
|
return linechecksum;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool purge_serial(){
|
||||||
|
uint32_t start = millis();
|
||||||
|
uint8_t buf [51];
|
||||||
|
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
||||||
|
CONFIG::wait (5);
|
||||||
|
LOG("Purge Serial\r\n")
|
||||||
|
while (ESPCOM::available(DEFAULT_PRINTER_PIPE) > 0 ){
|
||||||
|
if ((millis() - start ) > 2000) {
|
||||||
|
LOG("Purge timeout\r\n")
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
size_t len = ESPCOM::readBytes (DEFAULT_PRINTER_PIPE, buf, 50);
|
||||||
|
buf[len] = '\0';
|
||||||
|
LOG("Purge ")
|
||||||
|
LOG((const char *)buf)
|
||||||
|
LOG("\r\n")
|
||||||
|
if ( ( CONFIG::GetFirmwareTarget() == REPETIER4DV) || (CONFIG::GetFirmwareTarget() == REPETIER) ) {
|
||||||
|
String s = (const char *)buf;
|
||||||
|
//repetier never stop sending data so no need to wait if have 'wait' or 'busy'
|
||||||
|
if((s.indexOf ("wait") > -1) || (s.indexOf ("busy") > -1))return true;
|
||||||
|
LOG("Purge interrupted\r\n")
|
||||||
|
}
|
||||||
|
CONFIG::wait (5);
|
||||||
|
}
|
||||||
|
CONFIG::wait (0);
|
||||||
|
LOG("Purge done\r\n")
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t wait_for_data(uint32_t timeout){
|
||||||
|
uint32_t start = millis();
|
||||||
|
while ((ESPCOM::available(DEFAULT_PRINTER_PIPE) < 2) && ((millis()-start) < timeout))CONFIG::wait (10);
|
||||||
|
return ESPCOM::available(DEFAULT_PRINTER_PIPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Get_lineNumber(String & response){
|
||||||
|
int32_t l = 0;
|
||||||
|
String sresend = "Resend:";
|
||||||
|
if ( CONFIG::GetFirmwareTarget() == SMOOTHIEWARE){
|
||||||
|
sresend = "rs N";
|
||||||
|
}
|
||||||
|
int pos = response.indexOf(sresend);
|
||||||
|
if (pos == -1 ) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
pos+=sresend.length();
|
||||||
|
int pos2 = response.indexOf("\n", pos);
|
||||||
|
String snum = response.substring(pos, pos2);
|
||||||
|
//remove potential unwished char
|
||||||
|
snum.replace("\r", "");
|
||||||
|
l = snum.toInt();
|
||||||
|
LOG("New number ")
|
||||||
|
LOG(String(l))
|
||||||
|
LOG("\r\n")
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
//function to send line to serial///////////////////////////////////////
|
//function to send line to serial///////////////////////////////////////
|
||||||
bool sendLine2Serial (String & line)
|
//if newlinenb is NULL no auto correction of line number in case of resend
|
||||||
|
bool sendLine2Serial (String & line, int32_t linenb, int32_t * newlinenb)
|
||||||
{
|
{
|
||||||
LOG (line)
|
LOG ("Send line ")
|
||||||
ESPCOM::println (line, DEFAULT_PRINTER_PIPE);
|
LOG (line )
|
||||||
|
LOG (" NB:")
|
||||||
|
LOG (String(linenb))
|
||||||
|
LOG ("\r\n")
|
||||||
|
String line2send;
|
||||||
|
String sok = "ok";
|
||||||
|
String sresend = "Resend";
|
||||||
|
if (newlinenb) *newlinenb = linenb;
|
||||||
|
if ( CONFIG::GetFirmwareTarget() == SMOOTHIEWARE)sresend = "rs N";
|
||||||
|
if (linenb != -1) {
|
||||||
|
if ( ( CONFIG::GetFirmwareTarget() == REPETIER4DV) || (CONFIG::GetFirmwareTarget() == REPETIER) ) sok+=" " + String(linenb);
|
||||||
|
line2send = CheckSumLine(line.c_str(),linenb);
|
||||||
|
} else line2send = line;
|
||||||
|
//purge serial as nothing is supposed to interfere with upload
|
||||||
|
purge_serial();
|
||||||
|
LOG ("Send line ")
|
||||||
|
LOG (line2send )
|
||||||
|
LOG ("\r\n")
|
||||||
|
//send line
|
||||||
|
ESPCOM::println (line2send, DEFAULT_PRINTER_PIPE);
|
||||||
ESPCOM::flush(DEFAULT_PRINTER_PIPE);
|
ESPCOM::flush(DEFAULT_PRINTER_PIPE);
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
//check answer
|
||||||
CONFIG::wait (5);
|
if (wait_for_data(2000) > 0 ) {
|
||||||
#else
|
|
||||||
CONFIG::wait (2);
|
|
||||||
#endif
|
|
||||||
if (ESPCOM::available(DEFAULT_PRINTER_PIPE) > 0 ) {
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
uint32_t timeout = millis();
|
uint32_t timeout = millis();
|
||||||
uint8_t count = 0;
|
uint8_t count = 0;
|
||||||
|
//got data check content
|
||||||
|
String response ;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
CONFIG::wdtFeed();
|
|
||||||
size_t len = ESPCOM::available(DEFAULT_PRINTER_PIPE);
|
size_t len = ESPCOM::available(DEFAULT_PRINTER_PIPE);
|
||||||
//get size of buffer
|
//get size of buffer
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
uint8_t * sbuf = (uint8_t *)malloc(len+1);
|
uint8_t * sbuf = (uint8_t *)malloc(len+1);
|
||||||
if(!sbuf){
|
if(!sbuf){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
//read buffer
|
//read buffer
|
||||||
ESPCOM::readBytes (DEFAULT_PRINTER_PIPE, sbuf, len);
|
ESPCOM::readBytes (DEFAULT_PRINTER_PIPE, sbuf, len);
|
||||||
//convert buffer to zero end array
|
//convert buffer to zero end array
|
||||||
sbuf[len] = '\0';
|
sbuf[len] = '\0';
|
||||||
//use string because easier to handle
|
//use string because easier to handle and allow to re-assemble cutted answer
|
||||||
String response = (const char*) sbuf;
|
response += (const char*) sbuf;
|
||||||
if ( (response.indexOf ("ok") > -1) || (response.indexOf ("wait") > -1) ) {
|
LOG ("Response: ")
|
||||||
free(sbuf);
|
LOG (response)
|
||||||
return true;
|
LOG ("\r\n")
|
||||||
|
//in that case there is no way to know what is the right number to use and so send should be failed
|
||||||
|
if (( ( CONFIG::GetFirmwareTarget() == REPETIER4DV) || (CONFIG::GetFirmwareTarget() == REPETIER) ) && (response.indexOf ("skip") != -1)) {
|
||||||
|
LOG ("Wrong line requested\r\n")
|
||||||
|
count = 5;
|
||||||
}
|
}
|
||||||
if (response.indexOf ("Resend") > -1) {
|
//it is resend ?
|
||||||
|
int pos = response.indexOf (sresend);
|
||||||
|
//be sure we get full line to be able to process properly
|
||||||
|
if (( pos > -1) && (response.lastIndexOf("\n") > pos)){
|
||||||
|
LOG ("Resend detected\r\n")
|
||||||
|
uint32_t line_number = Get_lineNumber(response);
|
||||||
|
if (newlinenb){
|
||||||
|
*newlinenb = line_number;
|
||||||
|
free(sbuf);
|
||||||
|
return sendLine2Serial (line, line_number, newlinenb);
|
||||||
|
} else {
|
||||||
|
//the line requested is not the current one so we stop
|
||||||
|
if (line_number !=linenb) {
|
||||||
|
LOG ("Wrong line requested\r\n")
|
||||||
|
count = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
count++;
|
count++;
|
||||||
if (count > 5) {
|
if (count > 5) {
|
||||||
free(sbuf);
|
free(sbuf);
|
||||||
|
LOG ("Exit too many resend or wrong line\r\n")
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
LOG ("resend\r\n")
|
LOG ("Resend\r\n")
|
||||||
ESPCOM::println (line, DEFAULT_PRINTER_PIPE);
|
purge_serial();
|
||||||
|
ESPCOM::println (line2send, DEFAULT_PRINTER_PIPE);
|
||||||
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
||||||
CONFIG::wait (5);
|
wait_for_data(1000);
|
||||||
timeout = millis();
|
timeout = millis();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if ( (response.indexOf (sok) > -1) ) { //we have ok so it is done
|
||||||
|
free(sbuf);
|
||||||
|
LOG ("Got ok\r\n")
|
||||||
|
purge_serial();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
free(sbuf);
|
free(sbuf);
|
||||||
}
|
}
|
||||||
//no answer so exit: no news = good news
|
//no answer or over buffer exit
|
||||||
if ( millis() - timeout > 500) {
|
if ( (millis() - timeout > 2000) || (response.length() >200)){
|
||||||
|
LOG ("Time out\r\n")
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
CONFIG::wait (50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG ("Send line error\r\n")
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//send M29 / M30 command to close file on SD////////////////////////////
|
||||||
|
void CloseSerialUpload (bool iserror, String & filename , int32_t linenb)
|
||||||
|
{
|
||||||
|
purge_serial();
|
||||||
|
String command = "M29";
|
||||||
|
purge_serial();
|
||||||
|
if (!sendLine2Serial (command,linenb, &linenb)) {
|
||||||
|
wait_for_data(2000);
|
||||||
|
if (!sendLine2Serial (command,linenb, &linenb)) {
|
||||||
|
if ((CONFIG::GetFirmwareTarget() == REPETIER4DV) || (CONFIG::GetFirmwareTarget() == REPETIER) ) {
|
||||||
|
sendLine2Serial (command,-1, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//send M29 / M30 command to close file on SD////////////////////////////
|
|
||||||
|
|
||||||
void CloseSerialUpload (bool iserror, String & filename)
|
|
||||||
{
|
|
||||||
|
|
||||||
ESPCOM::println ("\r\nM29", DEFAULT_PRINTER_PIPE);
|
|
||||||
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
|
||||||
CONFIG::wait (1000);
|
|
||||||
ESPCOM::println ("\r\nM29", DEFAULT_PRINTER_PIPE);
|
|
||||||
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
|
||||||
if (iserror) {
|
if (iserror) {
|
||||||
String cmdfilename = "M30 " + filename;
|
String cmdfilename = "M30 " + filename;
|
||||||
ESPCOM::println (cmdfilename, DEFAULT_PRINTER_PIPE);
|
sendLine2Serial (cmdfilename,-1, NULL);
|
||||||
ESPCOM::println (F ("SD upload failed"), PRINTER_PIPE);
|
ESPCOM::println (F ("SD upload failed"), PRINTER_PIPE);
|
||||||
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
ESPCOM::flush (DEFAULT_PRINTER_PIPE);
|
||||||
web_interface->_upload_status = UPLOAD_STATUS_FAILED;
|
web_interface->_upload_status = UPLOAD_STATUS_FAILED;
|
||||||
@ -154,7 +279,8 @@ void CloseSerialUpload (bool iserror, String & filename)
|
|||||||
web_interface->_upload_status = UPLOAD_STATUS_SUCCESSFUL;
|
web_interface->_upload_status = UPLOAD_STATUS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
//lets give time to FW to proceed
|
//lets give time to FW to proceed
|
||||||
CONFIG::wait (1000);
|
wait_for_data(2000);
|
||||||
|
purge_serial();
|
||||||
web_interface->blockserial = false;
|
web_interface->blockserial = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user