From 7126a5e5a7f2bcab61fd4ae89224fdb0cac9502e Mon Sep 17 00:00:00 2001
From: InsanityAutomation
 <38436470+InsanityAutomation@users.noreply.github.com>
Date: Sun, 1 Dec 2019 18:39:28 -0500
Subject: [PATCH] Add Host Prompt Notification Method (#15942)

---
 Marlin/src/feature/host_actions.cpp |  6 ++++
 Marlin/src/feature/host_actions.h   |  1 +
 Marlin/src/lcd/ultralcd.cpp         | 52 +++++++++++++++++++++++++----
 Marlin/src/lcd/ultralcd.h           |  8 +++--
 4 files changed, 58 insertions(+), 9 deletions(-)

diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp
index f40478b768..30ec8bfb1d 100644
--- a/Marlin/src/feature/host_actions.cpp
+++ b/Marlin/src/feature/host_actions.cpp
@@ -72,6 +72,12 @@ void host_action(const char * const pstr, const bool eol) {
 
   PromptReason host_prompt_reason = PROMPT_NOT_DEFINED;
 
+  void host_action_notify(const char * const message) {
+    host_action(PSTR("notification "), false);
+    serialprintPGM(message);
+    SERIAL_EOL();
+  }
+
   void host_action_prompt(const char * const ptype, const bool eol=true) {
     host_action(PSTR("prompt_"), false);
     serialprintPGM(ptype);
diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h
index b742d0f081..57af59eb2e 100644
--- a/Marlin/src/feature/host_actions.h
+++ b/Marlin/src/feature/host_actions.h
@@ -60,6 +60,7 @@ void host_action(const char * const pstr, const bool eol=true);
   extern PromptReason host_prompt_reason;
 
   void host_response_handler(const uint8_t response);
+  void host_action_notify(const char * const message);
   void host_action_prompt_begin(const char * const pstr, const bool eol=true);
   void host_action_prompt_button(const char * const pstr);
   void host_action_prompt_end();
diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index 3b69807b75..c2e00fcce6 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -26,19 +26,21 @@
   #include "../feature/leds/leds.h"
 #endif
 
+#if ENABLED(HOST_ACTION_COMMANDS)
+  #include "../feature/host_actions.h"
+#endif
+
+#include "ultralcd.h"
+MarlinUI ui;
+
 // All displays share the MarlinUI class
 #if HAS_DISPLAY
   #include "../gcode/queue.h"
-  #include "ultralcd.h"
   #include "fontutils.h"
-  MarlinUI ui;
   #include "../sd/cardreader.h"
   #if ENABLED(EXTENSIBLE_UI)
     #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u)
   #endif
-  #if ENABLED(HOST_ACTION_COMMANDS)
-    #include "../feature/host_actions.h"
-  #endif
 #endif
 
 #if HAS_SPI_LCD
@@ -1369,6 +1371,10 @@ void MarlinUI::update() {
   void MarlinUI::set_status(const char * const message, const bool persist) {
     if (alert_level) return;
 
+    #if ENABLED(HOST_PROMPT_SUPPORT)
+      host_action_notify(message);
+    #endif
+
     // Here we have a problem. The message is encoded in UTF8, so
     // arbitrarily cutting it will be a problem. We MUST be sure
     // that there is no cutting in the middle of a multibyte character!
@@ -1408,6 +1414,10 @@ void MarlinUI::update() {
     if (level < alert_level) return;
     alert_level = level;
 
+    #if ENABLED(HOST_PROMPT_SUPPORT)
+      host_action_notify(message);
+    #endif
+
     // Since the message is encoded in UTF8 it must
     // only be cut on a character boundary.
 
@@ -1568,4 +1578,34 @@ void MarlinUI::update() {
 
   #endif
 
-#endif // HAS_DISPLAY
+#else // !HAS_DISPLAY
+
+  //
+  // Send the status line as a host notification
+  //
+
+  void MarlinUI::set_status(const char * const message, const bool) {
+    #if ENABLED(HOST_PROMPT_SUPPORT)
+      host_action_notify(message);
+    #else
+      UNUSED(message);
+    #endif
+  }
+
+  void MarlinUI::set_status_P(PGM_P message, const int8_t) {
+    #if ENABLED(HOST_PROMPT_SUPPORT)
+      host_action_notify(message);
+    #else
+      UNUSED(message);
+    #endif
+  }
+
+  void MarlinUI::status_printf_P(const uint8_t, PGM_P const message, ...) {
+    #if ENABLED(HOST_PROMPT_SUPPORT)
+      host_action_notify(message);
+    #else
+      UNUSED(message);
+    #endif
+  }
+
+#endif // !HAS_DISPLAY
diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h
index 47d5a87ab7..7fc3a5f731 100644
--- a/Marlin/src/lcd/ultralcd.h
+++ b/Marlin/src/lcd/ultralcd.h
@@ -406,14 +406,16 @@ public:
 
   #else // No LCD
 
+    // Send status to host as a notification
+    void set_status(const char* message, const bool=false);
+    void set_status_P(PGM_P message, const int8_t=0);
+    void status_printf_P(const uint8_t, PGM_P message, ...);
+
     static inline void init() {}
     static inline void update() {}
     static inline void refresh() {}
     static inline void return_to_status() {}
     static inline void set_alert_status_P(PGM_P const) {}
-    static inline void set_status(const char* const, const bool=false) {}
-    static inline void set_status_P(PGM_P const, const int8_t=0) {}
-    static inline void status_printf_P(const uint8_t, PGM_P const, ...) {}
     static inline void reset_status() {}
     static inline void reset_alert_level() {}
     static constexpr bool has_status() { return false; }