diff --git a/FluidNC/data/index.html.gz b/FluidNC/data/index.html.gz
index 92ecffb4b..8f96fb403 100644
Binary files a/FluidNC/data/index.html.gz and b/FluidNC/data/index.html.gz differ
diff --git a/FluidNC/src/HashFS.cpp b/FluidNC/src/HashFS.cpp
index f5f493daa..8fc67f9b6 100644
--- a/FluidNC/src/HashFS.cpp
+++ b/FluidNC/src/HashFS.cpp
@@ -54,7 +54,7 @@ void HashFS::delete_file(const std::filesystem::path& path, bool report) {
}
}
-bool HashFS::file_is_hashed(const std::filesystem::path& path) {
+bool HashFS::file_is_hashable(const std::filesystem::path& path) {
int count = 0;
for (auto it = path.begin(); it != path.end(); ++it) {
++count;
@@ -70,7 +70,7 @@ bool HashFS::file_is_hashed(const std::filesystem::path& path) {
}
void HashFS::rehash_file(const std::filesystem::path& path, bool report) {
- if (file_is_hashed(path)) {
+ if (file_is_hashable(path)) {
std::string hash;
if (hashFile(path, hash) != Error::Ok) {
delete_file(path, false);
@@ -108,7 +108,7 @@ void HashFS::hash_all() {
}
}
std::string HashFS::hash(const std::filesystem::path& path) {
- if (file_is_hashed(path)) {
+ if (file_is_hashable(path)) {
std::map::const_iterator it;
it = localFsHashes.find(path.filename());
if (it != localFsHashes.end()) {
diff --git a/FluidNC/src/HashFS.h b/FluidNC/src/HashFS.h
index 24ff294f4..9c9143c6b 100644
--- a/FluidNC/src/HashFS.h
+++ b/FluidNC/src/HashFS.h
@@ -7,7 +7,7 @@ class HashFS {
public:
static std::map localFsHashes;
- static bool file_is_hashed(const std::filesystem::path& path);
+ static bool file_is_hashable(const std::filesystem::path& path);
static void delete_file(const std::filesystem::path& path, bool report = true);
static void rehash_file(const std::filesystem::path& path, bool report = true);
static void rename_file(const std::filesystem::path& ipath, const std::filesystem::path& opath, bool report = true);
diff --git a/FluidNC/src/Machine/Macros.cpp b/FluidNC/src/Machine/Macros.cpp
index c0d05741b..70af07142 100644
--- a/FluidNC/src/Machine/Macros.cpp
+++ b/FluidNC/src/Machine/Macros.cpp
@@ -59,10 +59,10 @@ Cmd findOverride(std::string name) {
}
bool Macro::run(Channel* channel) {
- if (channel) {
- log_debug_to(*channel, "Run " << name());
- }
if (_gcode.length()) {
+ if (channel) {
+ log_debug_to(*channel, "Run " << name() << ": " << _gcode);
+ }
Job::save();
Job::nest(new MacroChannel(this), channel);
return true;
diff --git a/FluidNC/src/ProcessSettings.cpp b/FluidNC/src/ProcessSettings.cpp
index 5016ab0fa..6f4b66234 100644
--- a/FluidNC/src/ProcessSettings.cpp
+++ b/FluidNC/src/ProcessSettings.cpp
@@ -1040,7 +1040,7 @@ Error execute_line(char* line, Channel& channel, AuthenticationLevel auth_level)
return Error::SystemGcLock;
}
Error result = gc_execute_line(line);
- if (result != Error::Ok) {
+ if (result != Error::Ok && result != Error::Reset) {
log_debug_to(channel, "Bad GCode: " << line);
}
return result;
diff --git a/FluidNC/src/WebUI/WebServer.cpp b/FluidNC/src/WebUI/WebServer.cpp
index a87727a4c..3daef87c9 100644
--- a/FluidNC/src/WebUI/WebServer.cpp
+++ b/FluidNC/src/WebUI/WebServer.cpp
@@ -133,6 +133,9 @@ namespace WebUI {
_webserver->on("/command", HTTP_ANY, handle_web_command);
_webserver->on("/command_silent", HTTP_ANY, handle_web_command_silent);
_webserver->on("/feedhold_reload", HTTP_ANY, handleFeedholdReload);
+ _webserver->on("/cyclestart_reload", HTTP_ANY, handleCyclestartReload);
+ _webserver->on("/restart_reload", HTTP_ANY, handleRestartReload);
+ _webserver->on("/did_restart", HTTP_ANY, handleDidRestart);
//LocalFS
_webserver->on("/files", HTTP_ANY, handleFileList, LocalFSFileupload);
@@ -230,6 +233,22 @@ namespace WebUI {
return false;
}
+ // If you load or reload WebUI while a program is running, there is a high
+ // risk of stalling the motion because serving a file from
+ // the local FLASH filesystem takes away a lot of CPU cycles. If we get
+ // a request for a file when running, reject it to preserve the motion
+ // integrity.
+ // This can make it hard to debug ISR IRAM problems, because the easiest
+ // way to trigger such problems is to refresh WebUI during motion.
+ if (http_block_during_motion->get() && inMotionState()) {
+ Web_Server::handleReloadBlocked();
+ return true;
+ }
+ if (state_is(State::Hold)) {
+ Web_Server::handleFeedholdBlocked();
+ return true;
+ }
+
std::string hash;
// Check for brower cache match
@@ -241,21 +260,9 @@ namespace WebUI {
}
if (hash.length() && std::string(_webserver->header("If-None-Match").c_str()) == hash) {
- log_debug(path << " is cached");
_webserver->send(304);
return true;
}
- // If you load or reload WebUI while a program is running, there is a high
- // risk of stalling the motion because serving a file from
- // the local FLASH filesystem takes away a lot of CPU cycles. If we get
- // a request for a file when running, reject it to preserve the motion
- // integrity.
- // This can make it hard to debug ISR IRAM problems, because the easiest
- // way to trigger such problems is to refresh WebUI during motion.
- if (http_block_during_motion->get() && inMotionState()) {
- Web_Server::handleReloadBlocked();
- return true;
- }
bool isGzip = false;
FileStream* file;
@@ -646,25 +653,76 @@ namespace WebUI {
// This page is used when you try to reload WebUI during motion,
// to avoid interrupting that motion. It lets you wait until
- // motion is finished or issue a feedhold.
+ // motion is finished.
void Web_Server::handleReloadBlocked() {
_webserver->send(503,
"text/html",
""
- "
Cannot load WebUI while moving
"
- ""
- " Retry (you must first wait for motion to finish)
"
- ""
- " Stop the motion with feedhold and then retry "
+ "
Cannot load WebUI while GCode Program is Running
"
+
+ ""
+ " Pause the GCode program with feedhold
"
+
+ ""
+ " Stop the GCode Program with reset
"
+
+ ""
+ " (You must first stop the GCode program or wait for it to finish)
"
+
+ "");
+ }
+ // This page is used when you try to reload WebUI during feedhold state.
+ // Reload will not work because commands cannot be executed in feedhold,
+ // so things like ESP800 will hang.
+ void Web_Server::handleFeedholdBlocked() {
+ _webserver->send(503,
+ "text/html",
+ ""
+ "
GCode Program is Paused (in Feedhold state)
"
+
+ ""
+ " Resume the GCode program with cyclestart