|
@@ -10,7 +10,6 @@
|
|
|
#include "stepper.h"
|
|
|
#include "ConfigurationStore.h"
|
|
|
#include <string.h>
|
|
|
-#include "Timer.h"
|
|
|
|
|
|
#include "util.h"
|
|
|
#include "mesh_bed_leveling.h"
|
|
@@ -180,9 +179,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
|
|
@@ -990,7 +990,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;
|
|
@@ -1016,7 +1016,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"));
|
|
@@ -1040,7 +1040,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"));
|
|
@@ -1065,7 +1065,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);
|
|
@@ -1098,7 +1098,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));
|
|
@@ -1127,7 +1127,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));
|
|
@@ -1156,7 +1156,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));
|
|
@@ -1185,7 +1185,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"));
|
|
@@ -1254,7 +1254,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;
|
|
@@ -1291,7 +1291,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
|
|
@@ -1339,7 +1339,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");
|
|
@@ -1369,7 +1369,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));
|
|
@@ -1398,7 +1398,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));
|
|
@@ -1427,7 +1427,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));
|
|
@@ -1456,7 +1456,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
|
|
@@ -1464,7 +1464,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())
|
|
@@ -2353,7 +2353,7 @@ void lcd_menu_statistics()
|
|
|
{
|
|
|
if (IS_SD_PRINTING)
|
|
|
{
|
|
|
- int _met = total_filament_used / 100000;
|
|
|
+ float _met = ((float)total_filament_used) / (100000.f);
|
|
|
int _cm = (total_filament_used - (_met * 100000)) / 10;
|
|
|
int _t = (millis() - starttime) / 1000;
|
|
|
int _h = _t / 3600;
|
|
@@ -2368,12 +2368,12 @@ void lcd_menu_statistics()
|
|
|
lcd_printf_P(_N(
|
|
|
ESC_2J
|
|
|
"%S:"
|
|
|
- ESC_H(6,1) "%8.2f m\n"
|
|
|
+ ESC_H(6,1) "%8.2fm \n"
|
|
|
"%S :"
|
|
|
ESC_H(8,3) "%2dh %02dm %02d"
|
|
|
),
|
|
|
_i("Filament used"),
|
|
|
- _met, _cm,
|
|
|
+ _met,
|
|
|
_i("Print time"),
|
|
|
_h, _m, _s
|
|
|
);
|
|
@@ -2637,7 +2637,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)
|
|
@@ -3944,7 +3944,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;
|
|
|
}
|
|
|
}
|
|
@@ -4177,7 +4177,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()))
|
|
|
{
|
|
@@ -4573,7 +4573,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);
|
|
@@ -4654,7 +4654,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);
|
|
@@ -4702,7 +4702,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);
|
|
@@ -7512,7 +7512,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)
|
|
|
{
|
|
@@ -7524,7 +7524,9 @@ 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.
|
|
|
lcd_implementation_clear();
|
|
|
#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT)
|
|
@@ -7542,6 +7544,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;
|
|
|
+}
|
|
|
|
|
|
static inline void debugBlink()
|
|
|
{
|
|
@@ -7651,30 +7671,29 @@ void lcd_update(uint8_t lcdDrawUpdateOverride, bool forceRedraw)
|
|
|
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)();
|
|
|
lcd_implementation_update_indicators();
|
|
|
|
|
|
#ifdef ULTIPANEL
|
|
|
- if (lcd_timeoutToStatus < millis() && currentMenu != lcd_status_screen)
|
|
|
- {
|
|
|
- // 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.
|
|
|
- // This is useful for example, when the babystep value has to be written into EEPROM.
|
|
|
- if (currentMenu != NULL)
|
|
|
- {
|
|
|
- menuExiting = true;
|
|
|
- (*currentMenu)();
|
|
|
- menuExiting = false;
|
|
|
- }
|
|
|
- lcd_implementation_clear();
|
|
|
- lcd_return_to_status();
|
|
|
- lcdDrawUpdate = 2;
|
|
|
- }
|
|
|
+ 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.
|
|
|
+ // This is useful for example, when the babystep value has to be written into EEPROM.
|
|
|
+ if (currentMenu != NULL) {
|
|
|
+ menuExiting = true;
|
|
|
+ (*currentMenu)();
|
|
|
+ menuExiting = false;
|
|
|
+ }
|
|
|
+ lcd_implementation_clear();
|
|
|
+ lcd_return_to_status();
|
|
|
+ lcdDrawUpdate = 2;
|
|
|
+ }
|
|
|
#endif//ULTIPANEL
|
|
|
if (lcdDrawUpdate == 2) lcd_implementation_clear();
|
|
|
if (lcdDrawUpdate) lcdDrawUpdate--;
|
|
@@ -7830,9 +7849,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;
|
|
@@ -7848,7 +7867,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;
|