Prechádzať zdrojové kódy

Merge pull request #917 from mkbel/use_Timer

Use timer
PavelSindler 5 rokov pred
rodič
commit
e1a71118f9
3 zmenil súbory, kde vykonal 58 pridanie a 38 odobranie
  1. 1 1
      Firmware/cardreader.cpp
  2. 53 35
      Firmware/ultralcd.cpp
  3. 4 2
      Firmware/ultralcd.h

+ 1 - 1
Firmware/cardreader.cpp

@@ -972,7 +972,7 @@ void CardReader::presort() {
 #endif
 	lcd_update(2);
 	KEEPALIVE_STATE(NOT_BUSY);
-	lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+	lcd_timeoutToStatus.start();
 }
 
 void CardReader::flush_presort() {

+ 53 - 35
Firmware/ultralcd.cpp

@@ -10,7 +10,6 @@
 #include "stepper.h"
 #include "ConfigurationStore.h"
 #include <string.h>
-#include "Timer.h"
 
 #include "util.h"
 #include "mesh_bed_leveling.h"
@@ -178,9 +177,10 @@ float pid_temp = DEFAULT_PID_TEMP;
 
 bool long_press_active = false;
 static ShortTimer longPressTimer;
-unsigned long button_blanking_time = millis();
+static ShortTimer buttonBlanking;
 bool button_pressed = false;
 
+static bool forceMenuExpire = false;
 bool menuExiting = false;
 
 #ifdef FILAMENT_LCD_DISPLAY
@@ -944,7 +944,7 @@ void lcd_commands()
 		float extr = count_e(0.2, width, length);
 		float extr_short_segment = count_e(0.2, width, width);
 
-		if (lcd_commands_step>1) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
+		if (lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
 		if (lcd_commands_step == 0)
 		{
 			lcd_commands_step = 10;
@@ -970,7 +970,7 @@ void lcd_commands()
 		}
 		if (lcd_commands_step == 9 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			enquecommand_P(PSTR("G1 Z0.250 F7200.000"));
 			enquecommand_P(PSTR("G1 X50.0 E80.0 F1000.0"));
 			enquecommand_P(PSTR("G1 X160.0 E20.0 F1000.0"));
@@ -994,7 +994,7 @@ void lcd_commands()
 		}
 		if (lcd_commands_step == 8 && !blocks_queued() && cmd_buffer_empty()) //draw meander
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 
 
 			enquecommand_P(PSTR("G1 X50 Y155"));
@@ -1019,7 +1019,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 7 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			strcpy(cmd1, "G1 X50 Y35 E");
 			strcat(cmd1, ftostr43(extr));
 			enquecommand(cmd1);
@@ -1052,7 +1052,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			for (int i = 4; i < 8; i++) {
 				strcpy(cmd1, "G1 X70 Y");
 				strcat(cmd1, ftostr32(35 - i*width * 2));
@@ -1081,7 +1081,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			for (int i = 8; i < 12; i++) {
 				strcpy(cmd1, "G1 X70 Y");
 				strcat(cmd1, ftostr32(35 - i*width * 2));
@@ -1110,7 +1110,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			for (int i = 12; i < 16; i++) {
 				strcpy(cmd1, "G1 X70 Y");
 				strcat(cmd1, ftostr32(35 - i*width * 2));
@@ -1139,7 +1139,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			enquecommand_P(PSTR("G1 E-0.07500 F2100.00000"));
 			enquecommand_P(PSTR("G4 S0"));
 			enquecommand_P(PSTR("G1 E-4 F2100.00000"));
@@ -1208,7 +1208,7 @@ void lcd_commands()
 		float length = 20 - width;
 		float extr = count_e(0.2, width, length);
 		float extr_short_segment = count_e(0.2, width, width);
-		if(lcd_commands_step>1) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
+		if(lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
 		if (lcd_commands_step == 0)
 		{
 			lcd_commands_step = 9;
@@ -1245,7 +1245,7 @@ void lcd_commands()
 		}
 		if (lcd_commands_step == 7 && !blocks_queued() && cmd_buffer_empty()) //draw meander
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 
 
 			//just opposite direction
@@ -1293,7 +1293,7 @@ void lcd_commands()
 		if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty())
 		{
 
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 
 			for (int i = 0; i < 4; i++) {
 				strcpy(cmd1, "G1 X70 Y");
@@ -1323,7 +1323,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			for (int i = 4; i < 8; i++) {
 				strcpy(cmd1, "G1 X70 Y");
 				strcat(cmd1, ftostr32(35 - i*width * 2));
@@ -1352,7 +1352,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			for (int i = 8; i < 12; i++) {
 				strcpy(cmd1, "G1 X70 Y");
 				strcat(cmd1, ftostr32(35 - i*width * 2));
@@ -1381,7 +1381,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			for (int i = 12; i < 16; i++) {
 				strcpy(cmd1, "G1 X70 Y");
 				strcat(cmd1, ftostr32(35 - i*width * 2));
@@ -1410,7 +1410,7 @@ void lcd_commands()
 
 		if (lcd_commands_step == 2 && !blocks_queued() && cmd_buffer_empty())
 		{
-			lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+			lcd_timeoutToStatus.start();
 			enquecommand_P(PSTR("G1 E-0.07500 F2100.00000"));
 			enquecommand_P(PSTR("M107")); //turn off printer fan
 			enquecommand_P(PSTR("M104 S0")); // turn off temperature
@@ -1418,7 +1418,7 @@ void lcd_commands()
 			enquecommand_P(PSTR("G1 Z10 F1300.000"));
 			enquecommand_P(PSTR("G1 X10 Y180 F4000")); //home X axis
 			enquecommand_P(PSTR("M84"));// disable motors
-			lcd_timeoutToStatus = millis() - 1; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
+			forceMenuExpire = true; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
 			lcd_commands_step = 1;
 		}
 		if (lcd_commands_step == 1 && !blocks_queued() && cmd_buffer_empty())
@@ -2482,8 +2482,8 @@ static void lcd_menu_xyz_skew()
 //|01234567890123456789|
 //|Measured skew:  N/A |
 //|--------------------|
-//|Slight skew:   0.12°|
-//|Severe skew:   0.25°|
+//|Slight skew:   0.12�|
+//|Severe skew:   0.25�|
 //----------------------
     float angleDiff = eeprom_read_float((float*)(EEPROM_XYZ_CAL_SKEW));
 	lcd_printf_P(_N(
@@ -2591,7 +2591,7 @@ static void _lcd_babystep(int axis, const char *msg)
 		//SERIAL_ECHO("Z baby step: ");
 		//SERIAL_ECHO(menuData.babyStep.babystepMem[2]);
         // Wait 90 seconds before closing the live adjust dialog.
-        lcd_timeoutToStatus = millis() + 90000;
+        lcd_timeoutToStatus.start();
     }
 
   if (encoderPosition != 0) 
@@ -3898,7 +3898,7 @@ void menu_setlang(unsigned char lang)
 		lcd_update_enable(true);
 		lcd_implementation_clear();
 		lcd_goto_menu(lcd_language_menu);
-		lcd_timeoutToStatus = -1; //infinite timeout
+		lcd_timeoutToStatus.stop(); //infinite timeout
 		lcdDrawUpdate = 2;
 	}
 }
@@ -4131,7 +4131,7 @@ void lcd_language()
 	lcd_update_enable(true);
 	lcd_implementation_clear();
 	lcd_goto_menu(lcd_language_menu);
-	lcd_timeoutToStatus = -1; //infinite timeout
+	lcd_timeoutToStatus.stop(); //infinite timeout
 	lcdDrawUpdate = 2;
 	while ((currentMenu != lcd_status_screen) && (!lang_is_selected()))
 	{
@@ -4527,7 +4527,7 @@ static void lcd_homing_accuracy_menu_advanced_back()
 
 static void lcd_homing_accuracy_menu_advanced()
 {
-	lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+	lcd_timeoutToStatus.start();
 	MENU_BEGIN();
 ///!	MENU_ITEM_BACK_P(PSTR("Homing accuracy"), lcd_homing_accuracy_menu_advanced_back);
 	MENU_ITEM_FUNCTION_P(PSTR("Reset def. steps"), lcd_homing_accuracy_menu_advanced_reset);
@@ -4608,7 +4608,7 @@ static void lcd_ustep_resolution_reset_def_xyze()
 
 static void lcd_ustep_resolution_menu()
 {
-	lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+	lcd_timeoutToStatus.start();
 	MENU_BEGIN();
 ///!	MENU_ITEM_BACK_P(PSTR("Experimental"), lcd_ustep_resolution_menu_back);
 	MENU_ITEM_FUNCTION_P(PSTR("Reset defaults"),  lcd_ustep_resolution_reset_def_xyze);
@@ -4656,7 +4656,7 @@ static void lcd_ustep_linearity_menu_reset()
 
 static void lcd_ustep_linearity_menu()
 {
-	lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+	lcd_timeoutToStatus.start();
 	MENU_BEGIN();
 ///!	MENU_ITEM_BACK_P(PSTR("Experimental"), lcd_ustep_linearity_menu_back);
 	MENU_ITEM_FUNCTION_P(PSTR("Reset correction"), lcd_ustep_linearity_menu_reset);
@@ -7466,7 +7466,7 @@ void lcd_init()
 //#include <avr/pgmspace.h>
 
 static volatile bool lcd_update_enabled = true;
-unsigned long lcd_timeoutToStatus = 0;
+LongTimer lcd_timeoutToStatus;
 
 void lcd_update_enable(bool enabled)
 {
@@ -7478,7 +7478,7 @@ void lcd_update_enable(bool enabled)
             encoderDiff = 0;
             // Enabling the normal LCD update procedure.
             // Reset the timeout interval.
-            lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+            lcd_timeoutToStatus.start();
             // Force the keypad update now.
             lcd_next_update_millis = millis() - 1;
             // Full update.
@@ -7497,6 +7497,24 @@ void lcd_update_enable(bool enabled)
         }
     }
 }
+static inline bool z_menu_expired()
+{
+    return (currentMenu == lcd_babystep_z
+         && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z));
+}
+static inline bool other_menu_expired()
+{
+    return (currentMenu != lcd_status_screen
+            && currentMenu != lcd_babystep_z
+            && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS));
+}
+static inline bool forced_menu_expire()
+{
+    bool retval = (currentMenu != lcd_status_screen
+            && forceMenuExpire);
+    forceMenuExpire = false;
+    return retval;
+}
 
 void lcd_update(uint8_t lcdDrawUpdateOverride)
 {
@@ -7577,10 +7595,10 @@ void lcd_update(uint8_t lcdDrawUpdateOverride)
 		    lcdDrawUpdate = 1;
 		  encoderPosition += encoderDiff / ENCODER_PULSES_PER_STEP;
 		  encoderDiff = 0;
-		  lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+		  lcd_timeoutToStatus.start();
 	  }
 
-	  if (LCD_CLICKED) lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
+	  if (LCD_CLICKED) lcd_timeoutToStatus.start();
 #endif//ULTIPANEL
 
 	  (*currentMenu)();
@@ -7590,7 +7608,7 @@ void lcd_update(uint8_t lcdDrawUpdateOverride)
 #endif
 
 #ifdef ULTIPANEL
-	  if (lcd_timeoutToStatus < millis() && currentMenu != lcd_status_screen)
+	  if (z_menu_expired() || other_menu_expired() || forced_menu_expire())
 	  {
       // Exiting a menu. Let's call the menu function the last time with menuExiting flag set to true
       // to give it a chance to save its state.
@@ -7760,9 +7778,9 @@ void lcd_buttons_update()
 #if BTN_ENC > 0
   if (lcd_update_enabled == true) { //if we are in non-modal mode, long press can be used and short press triggers with button release
 	  if (READ(BTN_ENC) == 0) { //button is pressed	  
-		  lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS;
-		  if (millis() > button_blanking_time) {
-			  button_blanking_time = millis() + BUTTON_BLANKING_TIME;
+		  lcd_timeoutToStatus.start();
+		  if (!buttonBlanking.running() || buttonBlanking.expired(BUTTON_BLANKING_TIME)) {
+			  buttonBlanking.start();
 			  if (button_pressed == false && long_press_active == false) {
 			      longPressTimer.start();
 				  button_pressed = true;
@@ -7778,7 +7796,7 @@ void lcd_buttons_update()
 	  }
 	  else { //button not pressed
 		  if (button_pressed) { //button was released
-			  button_blanking_time = millis() + BUTTON_BLANKING_TIME;
+		      buttonBlanking.start();
 
 			  if (long_press_active == false) { //button released before long press gets activated
 					  newbutton |= EN_C;

+ 4 - 2
Firmware/ultralcd.h

@@ -3,6 +3,7 @@
 
 #include "Marlin.h"
 #include "mesh_bed_calibration.h"
+#include "Timer.h"
 
 extern int lcd_puts_P(const char* str);
 extern int lcd_printf_P(const char* format, ...);
@@ -94,7 +95,8 @@ extern int lcd_printf_P(const char* format, ...);
   #define LCD_ALERTMESSAGERPGM(x) lcd_setalertstatuspgm((x))
 
   #define LCD_UPDATE_INTERVAL 100
-  #define LCD_TIMEOUT_TO_STATUS 30000
+  #define LCD_TIMEOUT_TO_STATUS 30000ul //!< Generic timeout to status screen in ms, when no user action.
+  #define LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z 90000ul //!< Specific timeout for lcd_babystep_z screen in ms.
 
   #ifdef ULTIPANEL
   void lcd_buttons_update();
@@ -117,7 +119,7 @@ extern int lcd_printf_P(const char* format, ...);
   #define LCD_COMMAND_PID_EXTRUDER 7 
   #define LCD_COMMAND_V2_CAL 8
 
-  extern unsigned long lcd_timeoutToStatus;
+  extern LongTimer lcd_timeoutToStatus;
   extern int lcd_commands_type;
   
   extern uint8_t farm_mode;