1
0
mirror of https://github.com/bdring/Grbl_Esp32.git synced 2025-08-27 00:05:06 +02:00

Bug fixes (#790)

* Fix memory leak when answering webcommand (regression issue)

Fix wrong error code on  web command (regression issue)

* Fix sd code not disabled when SD Card feature is disabled

* Use proper error codes / messages

* Update Grbl.h

* Revert "Use proper error codes / messages"

This reverts commit ad49cf8cc1.

* Updated error code symbols and text

- To be generic file system error

Co-authored-by: Luc <luc.@tech-hunters.com>
Co-authored-by: bdring <barton.dring@gmail.com>
This commit is contained in:
Luc
2021-03-05 17:04:39 +01:00
committed by GitHub
parent 2b2abb7922
commit d24df1fda4
8 changed files with 85 additions and 47 deletions

View File

@@ -61,16 +61,16 @@ std::map<Error, const char*> ErrorNames = {
{ Error::GcodeG43DynamicAxisError, "Gcode G43 dynamic axis error" }, { Error::GcodeG43DynamicAxisError, "Gcode G43 dynamic axis error" },
{ Error::GcodeMaxValueExceeded, "Gcode max value exceeded" }, { Error::GcodeMaxValueExceeded, "Gcode max value exceeded" },
{ Error::PParamMaxExceeded, "P param max exceeded" }, { Error::PParamMaxExceeded, "P param max exceeded" },
{ Error::SdFailedMount, "SD failed mount" }, { Error::FsFailedMount, "Failed to mount device" },
{ Error::SdFailedRead, "SD failed read" }, { Error::FsFailedRead, "Failed to read" },
{ Error::SdFailedOpenDir, "SD failed to open directory" }, { Error::FsFailedOpenDir, "Failed to open directory" },
{ Error::SdDirNotFound, "SD directory not found" }, { Error::FsDirNotFound, "Directory not found" },
{ Error::SdFileEmpty, "SD file empty" }, { Error::FsFileEmpty, "File empty" },
{ Error::SdFileNotFound, "SD file not found" }, { Error::FsFileNotFound, "File not found" },
{ Error::SdFailedOpenFile, "SD failed to open file" }, { Error::FsFailedOpenFile, "Failed to open file" },
{ Error::SdFailedBusy, "SD is busy" }, { Error::FsFailedBusy, "Device is busy" },
{ Error::SdFailedDelDir, "SD failed to delete directory" }, { Error::FsFailedDelDir, "Failed to delete directory" },
{ Error::SdFailedDelFile, "SD failed to delete file" }, { Error::FsFailedDelFile, "Failed to delete file" },
{ Error::BtFailBegin, "Bluetooth failed to start" }, { Error::BtFailBegin, "Bluetooth failed to start" },
{ Error::WifiFailBegin, "WiFi failed to start" }, { Error::WifiFailBegin, "WiFi failed to start" },
{ Error::NumberRange, "Number out of range for setting" }, { Error::NumberRange, "Number out of range for setting" },
@@ -79,5 +79,5 @@ std::map<Error, const char*> ErrorNames = {
{ Error::NvsSetFailed, "Failed to store setting" }, { Error::NvsSetFailed, "Failed to store setting" },
{ Error::NvsGetStatsFailed, "Failed to get setting status" }, { Error::NvsGetStatsFailed, "Failed to get setting status" },
{ Error::AuthenticationFailed, "Authentication failed!" }, { Error::AuthenticationFailed, "Authentication failed!" },
{ Error::AnotherInterfaceBusy, "Another interface is busy"}, { Error::AnotherInterfaceBusy, "Another interface is busy" },
}; };

View File

@@ -64,16 +64,16 @@ enum class Error : uint8_t {
GcodeG43DynamicAxisError = 37, GcodeG43DynamicAxisError = 37,
GcodeMaxValueExceeded = 38, GcodeMaxValueExceeded = 38,
PParamMaxExceeded = 39, PParamMaxExceeded = 39,
SdFailedMount = 60, // SD Failed to mount FsFailedMount = 60, // SD Failed to mount
SdFailedRead = 61, // SD Failed to read file FsFailedRead = 61, // SD Failed to read file
SdFailedOpenDir = 62, // SD card failed to open directory FsFailedOpenDir = 62, // SD card failed to open directory
SdDirNotFound = 63, // SD Card directory not found FsDirNotFound = 63, // SD Card directory not found
SdFileEmpty = 64, // SD Card directory not found FsFileEmpty = 64, // SD Card directory not found
SdFileNotFound = 65, // SD Card file not found FsFileNotFound = 65, // SD Card file not found
SdFailedOpenFile = 66, // SD card failed to open file FsFailedOpenFile = 66, // SD card failed to open file
SdFailedBusy = 67, // SD card is busy FsFailedBusy = 67, // SD card is busy
SdFailedDelDir = 68, FsFailedDelDir = 68,
SdFailedDelFile = 69, FsFailedDelFile = 69,
BtFailBegin = 70, // Bluetooth failed to start BtFailBegin = 70, // Bluetooth failed to start
WifiFailBegin = 71, // WiFi failed to start WifiFailBegin = 71, // WiFi failed to start
NumberRange = 80, // Setting number range problem NumberRange = 80, // Setting number range problem

View File

@@ -22,7 +22,7 @@
// Grbl versioning system // Grbl versioning system
const char* const GRBL_VERSION = "1.3a"; const char* const GRBL_VERSION = "1.3a";
const char* const GRBL_VERSION_BUILD = "20210228"; const char* const GRBL_VERSION_BUILD = "20210304";
//#include <sdkconfig.h> //#include <sdkconfig.h>
#include <Arduino.h> #include <Arduino.h>

View File

@@ -291,10 +291,14 @@ std::map<Message, const char*> MessageText = {
// NOTE: For interfaces, messages are always placed within brackets. And if silent mode // NOTE: For interfaces, messages are always placed within brackets. And if silent mode
// is installed, the message number codes are less than zero. // is installed, the message number codes are less than zero.
void report_feedback_message(Message message) { // ok to send to all clients void report_feedback_message(Message message) { // ok to send to all clients
#if defined (ENABLE_SD_CARD)
if (message == Message::SdFileQuit) { if (message == Message::SdFileQuit) {
grbl_notifyf("SD print canceled", "Reset during SD file at line: %d", sd_get_current_line_number()); grbl_notifyf("SD print canceled", "Reset during SD file at line: %d", sd_get_current_line_number());
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Reset during SD file at line: %d", sd_get_current_line_number()); grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Reset during SD file at line: %d", sd_get_current_line_number());
} else {
} else
#endif //ENABLE_SD_CARD
{
auto it = MessageText.find(message); auto it = MessageText.find(message);
if (it != MessageText.end()) { if (it != MessageText.end()) {
grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, it->second); grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, it->second);

View File

@@ -18,7 +18,9 @@
along with Grbl. If not, see <http://www.gnu.org/licenses/>. along with Grbl. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "SDCard.h" #include "Config.h"
#ifdef ENABLE_SD_CARD
# include "SDCard.h"
File myFile; File myFile;
bool SD_ready_next = false; // Grbl has processed a line and is waiting for another bool SD_ready_next = false; // Grbl has processed a line and is waiting for another
@@ -31,7 +33,7 @@ static char comment[LINE_BUFFER_SIZE]; // Line to be executed. Z
/*bool sd_mount() /*bool sd_mount()
{ {
if(!SD.begin()) { if(!SD.begin()) {
report_status_message(Error::SdFailedMount, CLIENT_SERIAL); report_status_message(Error::FsFailedMount, CLIENT_SERIAL);
return false; return false;
} }
return true; return true;
@@ -41,11 +43,11 @@ void listDir(fs::FS& fs, const char* dirname, uint8_t levels, uint8_t client) {
//char temp_filename[128]; // to help filter by extension TODO: 128 needs a definition based on something //char temp_filename[128]; // to help filter by extension TODO: 128 needs a definition based on something
File root = fs.open(dirname); File root = fs.open(dirname);
if (!root) { if (!root) {
report_status_message(Error::SdFailedOpenDir, client); report_status_message(Error::FsFailedOpenDir, client);
return; return;
} }
if (!root.isDirectory()) { if (!root.isDirectory()) {
report_status_message(Error::SdDirNotFound, client); report_status_message(Error::FsDirNotFound, client);
return; return;
} }
File file = root.openNextFile(); File file = root.openNextFile();
@@ -64,7 +66,7 @@ void listDir(fs::FS& fs, const char* dirname, uint8_t levels, uint8_t client) {
boolean openFile(fs::FS& fs, const char* path) { boolean openFile(fs::FS& fs, const char* path) {
myFile = fs.open(path); myFile = fs.open(path);
if (!myFile) { if (!myFile) {
//report_status_message(Error::SdFailedRead, CLIENT_SERIAL); //report_status_message(Error::FsFailedRead, CLIENT_SERIAL);
return false; return false;
} }
set_sd_state(SDState::BusyPrinting); set_sd_state(SDState::BusyPrinting);
@@ -94,7 +96,7 @@ boolean closeFile() {
*/ */
boolean readFileLine(char* line, int maxlen) { boolean readFileLine(char* line, int maxlen) {
if (!myFile) { if (!myFile) {
report_status_message(Error::SdFailedRead, SD_client); report_status_message(Error::FsFailedRead, SD_client);
return false; return false;
} }
sd_current_line_number += 1; sd_current_line_number += 1;
@@ -169,3 +171,4 @@ void sd_get_current_filename(char* name) {
name[0] = 0; name[0] = 0;
} }
} }
#endif //ENABLE_SD_CARD

View File

@@ -159,16 +159,20 @@ void serialCheckTask(void* pvParameters) {
if (is_realtime_command(data)) { if (is_realtime_command(data)) {
execute_realtime_command(static_cast<Cmd>(data), client); execute_realtime_command(static_cast<Cmd>(data), client);
} else { } else {
#if defined(ENABLE_SD_CARD)
if (get_sd_state(false) < SDState::Busy) { if (get_sd_state(false) < SDState::Busy) {
#endif //ENABLE_SD_CARD
vTaskEnterCritical(&myMutex); vTaskEnterCritical(&myMutex);
client_buffer[client].write(data); client_buffer[client].write(data);
vTaskExitCritical(&myMutex); vTaskExitCritical(&myMutex);
#if defined(ENABLE_SD_CARD)
} else { } else {
if (data == '\r' || data == '\n') { if (data == '\r' || data == '\n') {
grbl_sendf(client, "error %d\r\n", Error::AnotherInterfaceBusy); grbl_sendf(client, "error %d\r\n", Error::AnotherInterfaceBusy);
grbl_msg_sendf(client, MsgLevel::Info, "SD card job running"); grbl_msg_sendf(client, MsgLevel::Info, "SD card job running");
} }
} }
#endif //ENABLE_SD_CARD
} }
} // if something available } // if something available
WebUI::COMMANDS::handle(); WebUI::COMMANDS::handle();

View File

@@ -480,10 +480,11 @@ namespace WebUI {
} }
} }
if (silent || !espresponse->anyOutput()) { if (silent || !espresponse->anyOutput()) {
_webserver->send(err != Error::Ok ? 401 : 200, "text/plain", answer); _webserver->send(err != Error::Ok ? 500 : 200, "text/plain", answer);
} else { } else {
espresponse->flush(); espresponse->flush();
} }
if(espresponse) delete(espresponse);
} else { //execute GCODE } else { //execute GCODE
if (auth_level == AuthenticationLevel::LEVEL_GUEST) { if (auth_level == AuthenticationLevel::LEVEL_GUEST) {
_webserver->send(401, "text/plain", "Authentication failed!\n"); _webserver->send(401, "text/plain", "Authentication failed!\n");
@@ -491,7 +492,7 @@ namespace WebUI {
} }
//Instead of send several commands one by one by web / send full set and split here //Instead of send several commands one by one by web / send full set and split here
String scmd; String scmd;
const char* res = ""; bool hasError =false;
uint8_t sindex = 0; uint8_t sindex = 0;
// TODO Settings - this is very inefficient. get_Splited_Value() is O(n^2) // TODO Settings - this is very inefficient. get_Splited_Value() is O(n^2)
// when it could easily be O(n). Also, it would be just as easy to push // when it could easily be O(n). Also, it would be just as easy to push
@@ -512,10 +513,10 @@ namespace WebUI {
scmd += "\n"; scmd += "\n";
} }
if (!Serial2Socket.push(scmd.c_str())) { if (!Serial2Socket.push(scmd.c_str())) {
res = "Error"; hasError = true;
} }
} }
_webserver->send(200, "text/plain", res); _webserver->send(200, "text/plain", hasError?"Error":"");
} }
} }

View File

@@ -302,11 +302,11 @@ namespace WebUI {
} }
if (!SPIFFS.exists(path)) { if (!SPIFFS.exists(path)) {
webPrintln("Error: No such file!"); webPrintln("Error: No such file!");
return Error::SdFileNotFound; return Error::FsFileNotFound;
} }
File currentfile = SPIFFS.open(path, FILE_READ); File currentfile = SPIFFS.open(path, FILE_READ);
if (!currentfile) { //if file open success if (!currentfile) { //if file open success
return Error::SdFailedOpenFile; return Error::FsFailedOpenFile;
} }
//until no line in file //until no line in file
Error err; Error err;
@@ -338,11 +338,11 @@ namespace WebUI {
} }
if (!SPIFFS.exists(path)) { if (!SPIFFS.exists(path)) {
webPrintln("Error: No such file!"); webPrintln("Error: No such file!");
return Error::SdFileNotFound; return Error::FsFileNotFound;
} }
File currentfile = SPIFFS.open(path, FILE_READ); File currentfile = SPIFFS.open(path, FILE_READ);
if (!currentfile) { if (!currentfile) {
return Error::SdFailedOpenFile; return Error::FsFailedOpenFile;
} }
while (currentfile.available()) { while (currentfile.available()) {
// String currentline = currentfile.readStringUntil('\n'); // String currentline = currentfile.readStringUntil('\n');
@@ -686,16 +686,16 @@ namespace WebUI {
if (state != SDState::Idle) { if (state != SDState::Idle) {
if (state == SDState::NotPresent) { if (state == SDState::NotPresent) {
webPrintln("No SD Card"); webPrintln("No SD Card");
return Error::SdFailedMount; return Error::FsFailedMount;
} else { } else {
webPrintln("SD Card Busy"); webPrintln("SD Card Busy");
return Error::SdFailedBusy; return Error::FsFailedBusy;
} }
} }
if (!openFile(SD, path.c_str())) { if (!openFile(SD, path.c_str())) {
report_status_message(Error::SdFailedRead, (espresponse) ? espresponse->client() : CLIENT_ALL); report_status_message(Error::FsFailedRead, (espresponse) ? espresponse->client() : CLIENT_ALL);
webPrintln(""); webPrintln("");
return Error::SdFailedOpenFile; return Error::FsFailedOpenFile;
} }
return Error::Ok; return Error::Ok;
} }
@@ -764,18 +764,18 @@ namespace WebUI {
File file2del = SD.open(path); File file2del = SD.open(path);
if (!file2del) { if (!file2del) {
webPrintln("Cannot stat file!"); webPrintln("Cannot stat file!");
return Error::SdFileNotFound; return Error::FsFileNotFound;
} }
if (file2del.isDirectory()) { if (file2del.isDirectory()) {
if (!SD.rmdir(path)) { if (!SD.rmdir(path)) {
webPrintln("Cannot delete directory! Is directory empty?"); webPrintln("Cannot delete directory! Is directory empty?");
return Error::SdFailedDelDir; return Error::FsFailedDelDir;
} }
webPrintln("Directory deleted."); webPrintln("Directory deleted.");
} else { } else {
if (!SD.remove(path)) { if (!SD.remove(path)) {
webPrintln("Cannot delete file!"); webPrintln("Cannot delete file!");
return Error::SdFailedDelFile; return Error::FsFailedDelFile;
} }
webPrintln("File deleted."); webPrintln("File deleted.");
} }
@@ -788,10 +788,10 @@ namespace WebUI {
if (state != SDState::Idle) { if (state != SDState::Idle) {
if (state == SDState::NotPresent) { if (state == SDState::NotPresent) {
webPrintln("No SD Card"); webPrintln("No SD Card");
return Error::SdFailedMount; return Error::FsFailedMount;
} else { } else {
webPrintln("SD Card Busy"); webPrintln("SD Card Busy");
return Error::SdFailedBusy; return Error::FsFailedBusy;
} }
} }
webPrintln(""); webPrintln("");
@@ -806,9 +806,35 @@ namespace WebUI {
} }
#endif #endif
void listDirLocalFS(fs::FS& fs, const char* dirname, uint8_t levels, uint8_t client) {
//char temp_filename[128]; // to help filter by extension TODO: 128 needs a definition based on something
File root = fs.open(dirname);
if (!root) {
//FIXME: need proper error for FS and not usd sd one
report_status_message(Error::FsFailedOpenDir, client);
return;
}
if (!root.isDirectory()) {
//FIXME: need proper error for FS and not usd sd one
report_status_message(Error::FsDirNotFound, client);
return;
}
File file = root.openNextFile();
while (file) {
if (file.isDirectory()) {
if (levels) {
listDirLocalFS(fs, file.name(), levels - 1, client);
}
} else {
grbl_sendf(CLIENT_ALL, "[FILE:%s|SIZE:%d]\r\n", file.name(), file.size());
}
file = root.openNextFile();
}
}
static Error listLocalFiles(char* parameter, AuthenticationLevel auth_level) { // No ESP command static Error listLocalFiles(char* parameter, AuthenticationLevel auth_level) { // No ESP command
webPrintln(""); webPrintln("");
listDir(SPIFFS, "/", 10, espresponse->client()); listDirLocalFS(SPIFFS, "/", 10, espresponse->client());
String ssd = "[Local FS Free:" + ESPResponseStream::formatBytes(SPIFFS.totalBytes() - SPIFFS.usedBytes()); String ssd = "[Local FS Free:" + ESPResponseStream::formatBytes(SPIFFS.totalBytes() - SPIFFS.usedBytes());
ssd += " Used:" + ESPResponseStream::formatBytes(SPIFFS.usedBytes()); ssd += " Used:" + ESPResponseStream::formatBytes(SPIFFS.usedBytes());
ssd += " Total:" + ESPResponseStream::formatBytes(SPIFFS.totalBytes()); ssd += " Total:" + ESPResponseStream::formatBytes(SPIFFS.totalBytes());