From 516ec90242c935110bcf00e8d285302ebe86cd31 Mon Sep 17 00:00:00 2001
From: Daid <daid303@gmail.com>
Date: Sat, 19 May 2012 17:54:07 +0200
Subject: [PATCH] Add M401 - Wait for user on LCD button press

---
 Marlin/Marlin.pde | 30 +++++++++++++++++++++++++++++-
 Marlin/language.h |  1 +
 Marlin/ultralcd.h |  1 +
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/Marlin/Marlin.pde b/Marlin/Marlin.pde
index c9cff67de0..6d8a7b4dc8 100644
--- a/Marlin/Marlin.pde
+++ b/Marlin/Marlin.pde
@@ -107,6 +107,7 @@
 // M302 - Allow cold extrudes
 // M303 - PID relay autotune S<temperature> sets the target temperature. (default target temperature = 150C)
 // M400 - Finish all moves
+// M401 - Wait for user to press a button on the LCD (Only if ULTRA_LCD is enabled)
 // M500 - stores paramters in EEPROM
 // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).  
 // M502 - reverts to the default "factory settings".  You still need to store them in EEPROM afterwards if you want to.
@@ -596,6 +597,7 @@ void process_commands()
       while(millis()  < codenum ){
         manage_heater();
         manage_inactivity(1);
+		LCD_STATUS;
       }
       break;
     case 28: //G28 Home all Axis one at a time
@@ -1259,11 +1261,37 @@ void process_commands()
       PID_autotune(temp);
     }
     break;
-    case 400: // finish all moves
+    case 400: // M400 finish all moves
     {
       st_synchronize();
     }
     break;
+#ifdef ULTRA_LCD
+    case 401: // M401 - Wait for user button press on LCD
+    {
+      LCD_MESSAGEPGM(MSG_USERWAIT);
+      codenum = 0;
+      if(code_seen('P')) codenum = code_value(); // milliseconds to wait
+      if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
+      
+      st_synchronize();
+      previous_millis_cmd = millis();
+	  if (codenum > 0)
+	  {
+        codenum += millis();  // keep track of when we started waiting
+        while(millis()  < codenum && buttons == 0){
+          manage_heater();
+          manage_inactivity(1);
+		}
+      }else{
+        while(buttons == 0) {
+          manage_heater();
+          manage_inactivity(1);
+		}
+	  }
+    }
+    break;
+#endif
     case 500: // Store settings in EEPROM
     {
         EEPROM_StoreSettings();
diff --git a/Marlin/language.h b/Marlin/language.h
index 6fdf14995c..5dfb06c2e3 100644
--- a/Marlin/language.h
+++ b/Marlin/language.h
@@ -86,6 +86,7 @@
 	#define MSG_NO_CARD " No Card"
 	#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Something is wrong in the MenuStructure."
 	#define MSG_DWELL "Sleep..."
+	#define MSG_USERWAIT "Wait for user..."
 	#define MSG_NO_MOVE "No move."
 	#define MSG_PART_RELEASE "Partial Release"
 	#define MSG_KILLED "KILLED. "
diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h
index b01368bc14..c3bc94b730 100644
--- a/Marlin/ultralcd.h
+++ b/Marlin/ultralcd.h
@@ -13,6 +13,7 @@
   #define LCD_UPDATE_INTERVAL 100
   #define STATUSTIMEOUT 15000
   extern LiquidCrystal lcd;
+  extern volatile char buttons=0;  //the last checked buttons in a bit array.
   
   #ifdef NEWPANEL
     #define EN_C (1<<BLEN_C)