Centralize click-handling in the LCD loop

This commit is contained in:
Scott Lahteine
2016-10-26 01:42:52 -05:00
parent 47ad97c35e
commit 50ee749082
5 changed files with 72 additions and 115 deletions

View File

@@ -243,7 +243,6 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
*
* START_MENU Opening code for a screen with menu items.
* Scroll as-needed to keep the selected line in view.
* 'wasClicked' indicates the controller was clicked.
*/
#define START_SCREEN() \
START_SCREEN_OR_MENU(LCD_HEIGHT); \
@@ -257,7 +256,6 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
if (encoderLine >= encoderTopLine + LCD_HEIGHT) { \
encoderTopLine = encoderLine - (LCD_HEIGHT - 1); \
} \
bool wasClicked = LCD_CLICKED; \
bool _skipStatic = true; \
SCREEN_OR_MENU_LOOP()
@@ -288,8 +286,7 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
if (_menuLineNr == _thisItemNr) { \
if (lcdDrawUpdate) \
lcd_implementation_drawmenu_ ## TYPE(encoderLine == _thisItemNr, _lcdLineNr, PSTR(LABEL), ## __VA_ARGS__); \
if (wasClicked && encoderLine == _thisItemNr) { \
lcd_quick_feedback()
if (lcd_clicked && encoderLine == _thisItemNr) {
#define _MENU_ITEM_PART_2(TYPE, ...) \
menu_action_ ## TYPE(__VA_ARGS__); \
@@ -381,9 +378,8 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
menuPosition screen_history[10];
uint8_t screen_history_depth = 0;
bool ignore_click = false;
bool wait_for_unclick;
bool defer_return_to_status = false;
// LCD and menu clicks
bool lcd_clicked, wait_for_unclick, defer_return_to_status;
// Variables used when editing values.
const char* editLabel;
@@ -392,9 +388,9 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
screenFunc_t callbackFunc; // call this after editing
/**
* General function to go directly to a menu
* General function to go directly to a screen
*/
static void lcd_goto_screen(screenFunc_t screen, const bool feedback = false, const uint32_t encoder = 0) {
static void lcd_goto_screen(screenFunc_t screen, const uint32_t encoder = 0) {
if (currentScreen != screen) {
currentScreen = screen;
encoderPosition = encoder;
@@ -402,7 +398,6 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
defer_return_to_status = false;
screen_history_depth = 0;
}
if (feedback) lcd_quick_feedback();
lcd_implementation_clear();
#if ENABLED(LCD_PROGRESS_BAR)
// For LCD_PROGRESS_BAR re-initialize custom characters
@@ -427,7 +422,6 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
--screen_history_depth;
lcd_goto_screen(
screen_history[screen_history_depth].menu_function,
feedback,
screen_history[screen_history_depth].encoder_position
);
}
@@ -435,11 +429,6 @@ uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to
lcd_return_to_status();
}
void lcd_ignore_click(bool b) {
ignore_click = b;
wait_for_unclick = false;
}
#endif // ULTIPANEL
/**
@@ -493,23 +482,7 @@ static void lcd_status_screen() {
#if ENABLED(ULTIPANEL)
bool current_click = LCD_CLICKED;
if (ignore_click) {
if (wait_for_unclick) {
if (!current_click)
ignore_click = wait_for_unclick = false;
else
current_click = false;
}
else if (current_click) {
lcd_quick_feedback();
wait_for_unclick = true;
current_click = false;
}
}
if (current_click) {
if (lcd_clicked) {
#if ENABLED(FILAMENT_LCD_DISPLAY)
previous_lcd_status_ms = millis(); // get status message to show up for a while
#endif
@@ -518,7 +491,7 @@ static void lcd_status_screen() {
false
#endif
);
lcd_goto_screen(lcd_main_menu, true);
lcd_goto_screen(lcd_main_menu);
}
#if ENABLED(ULTIPANEL_FEEDMULTIPLY)
@@ -676,7 +649,7 @@ void kill_screen(const char* lcd_msg) {
long babysteps_done = 0;
static void _lcd_babystep(const AxisEnum axis, const char* msg) {
if (LCD_CLICKED) { defer_return_to_status = false; lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { defer_return_to_status = false; return lcd_goto_previous_menu(true); }
ENCODER_DIRECTION_NORMAL();
if (encoderPosition) {
int babystep_increment = (int32_t)encoderPosition * BABYSTEP_MULTIPLICATOR;
@@ -1092,12 +1065,12 @@ void kill_screen(const char* lcd_msg) {
}
static bool debounce_click = false;
if (LCD_CLICKED) {
if (lcd_clicked) {
if (!debounce_click) {
debounce_click = true; // ignore multiple "clicks" in a row
mbl.set_zigzag_z(_lcd_level_bed_position++, current_position[Z_AXIS]);
if (_lcd_level_bed_position == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
lcd_goto_screen(_lcd_level_bed_done, true);
lcd_goto_screen(_lcd_level_bed_done);
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z + Z_HOMING_HEIGHT;
line_to_current(Z_AXIS);
@@ -1113,7 +1086,7 @@ void kill_screen(const char* lcd_msg) {
#endif
}
else {
lcd_goto_screen(_lcd_level_goto_next_point, true);
lcd_goto_screen(_lcd_level_goto_next_point);
}
}
}
@@ -1171,7 +1144,7 @@ void kill_screen(const char* lcd_msg) {
*/
static void _lcd_level_bed_homing_done() {
if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING));
if (LCD_CLICKED) {
if (lcd_clicked) {
_lcd_level_bed_position = 0;
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z
#if Z_HOME_DIR > 0
@@ -1179,7 +1152,7 @@ void kill_screen(const char* lcd_msg) {
#endif
;
planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
lcd_goto_screen(_lcd_level_goto_next_point, true);
lcd_goto_screen(_lcd_level_goto_next_point);
}
}
@@ -1385,7 +1358,7 @@ void kill_screen(const char* lcd_msg) {
*/
static void _lcd_move_xyz(const char* name, AxisEnum axis) {
if (LCD_CLICKED) { lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { return lcd_goto_previous_menu(true); }
ENCODER_DIRECTION_NORMAL();
if (encoderPosition) {
refresh_cmd_timeout();
@@ -1425,7 +1398,7 @@ void kill_screen(const char* lcd_msg) {
int8_t eindex=-1
#endif
) {
if (LCD_CLICKED) { lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { return lcd_goto_previous_menu(true); }
ENCODER_DIRECTION_NORMAL();
if (encoderPosition) {
current_position[E_AXIS] += float((int32_t)encoderPosition) * move_menu_scale;
@@ -1924,7 +1897,7 @@ void kill_screen(const char* lcd_msg) {
*/
#if HAS_LCD_CONTRAST
static void lcd_set_contrast() {
if (LCD_CLICKED) { lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { return lcd_goto_previous_menu(true); }
ENCODER_DIRECTION_NORMAL();
if (encoderPosition) {
set_lcd_contrast(lcd_contrast + encoderPosition);
@@ -1991,7 +1964,7 @@ void kill_screen(const char* lcd_msg) {
*/
void lcd_sdcard_menu() {
ENCODER_DIRECTION_MENUS();
if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) return; // nothing to do (so don't thrash the SD card)
if (!lcdDrawUpdate && !lcd_clicked) return; // nothing to do (so don't thrash the SD card)
uint16_t fileCnt = card.getnrfilenames();
START_MENU();
MENU_BACK(MSG_MAIN);
@@ -2037,7 +2010,7 @@ void kill_screen(const char* lcd_msg) {
*
*/
static void lcd_info_stats_menu() {
if (LCD_CLICKED) { lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { return lcd_goto_previous_menu(true); }
char buffer[21];
printStatistics stats = print_job_timer.getStats();
@@ -2071,7 +2044,7 @@ void kill_screen(const char* lcd_msg) {
*
*/
static void lcd_info_thermistors_menu() {
if (LCD_CLICKED) { lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { return lcd_goto_previous_menu(true); }
START_SCREEN();
#define THERMISTOR_ID TEMP_SENSOR_0
#include "thermistornames.h"
@@ -2123,7 +2096,7 @@ void kill_screen(const char* lcd_msg) {
*
*/
static void lcd_info_board_menu() {
if (LCD_CLICKED) { lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { return lcd_goto_previous_menu(true); }
START_SCREEN();
STATIC_ITEM(BOARD_NAME, true, true); // MyPrinterController
STATIC_ITEM(MSG_INFO_BAUDRATE ": " STRINGIFY(BAUDRATE), true); // Baud: 250000
@@ -2144,7 +2117,7 @@ void kill_screen(const char* lcd_msg) {
*
*/
static void lcd_info_printer_menu() {
if (LCD_CLICKED) { lcd_goto_previous_menu(true); return; }
if (lcd_clicked) { return lcd_goto_previous_menu(true); }
START_SCREEN();
STATIC_ITEM(MSG_MARLIN, true, true); // Marlin
STATIC_ITEM(SHORT_BUILD_VERSION, true); // x.x.x-Branch
@@ -2334,16 +2307,15 @@ void kill_screen(const char* lcd_msg) {
#define menu_edit_type(_type, _name, _strFunc, scale) \
bool _menu_edit_ ## _name () { \
ENCODER_DIRECTION_NORMAL(); \
bool isClicked = LCD_CLICKED; \
if ((int32_t)encoderPosition < 0) encoderPosition = 0; \
if ((int32_t)encoderPosition > maxEditValue) encoderPosition = maxEditValue; \
if (lcdDrawUpdate) \
lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) / scale)); \
if (isClicked) { \
if (lcd_clicked) { \
*((_type*)editValue) = ((_type)((int32_t)encoderPosition + minEditValue)) / scale; \
lcd_goto_previous_menu(true); \
} \
return isClicked; \
return lcd_clicked; \
} \
void menu_edit_ ## _name () { _menu_edit_ ## _name(); } \
void menu_edit_callback_ ## _name () { if (_menu_edit_ ## _name ()) (*callbackFunc)(); } \
@@ -2614,9 +2586,20 @@ void lcd_update() {
#if ENABLED(ULTIPANEL)
static millis_t return_to_status_ms = 0;
manage_manual_move();
#endif
lcd_buttons_update();
lcd_buttons_update();
// If the action button is pressed...
if (LCD_CLICKED) {
if (!wait_for_unclick) { // If not waiting for a debounce release:
wait_for_unclick = true; // Set debounce flag to ignore continous clicks
lcd_clicked = !wait_for_user; // Keep the click if not waiting for a user-click
wait_for_user = false; // Any click clears wait for user
lcd_quick_feedback(); // Always make a click sound
}
}
else wait_for_unclick = false;
#endif
#if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT)
@@ -2691,7 +2674,7 @@ void lcd_update() {
#endif // REPRAPWORLD_KEYPAD
bool encoderPastThreshold = (abs(encoderDiff) >= ENCODER_PULSES_PER_STEP);
if (encoderPastThreshold || LCD_CLICKED) {
if (encoderPastThreshold || lcd_clicked) {
if (encoderPastThreshold) {
int32_t encoderMultiplier = 1;
@@ -2757,7 +2740,7 @@ void lcd_update() {
}
#if ENABLED(ULTIPANEL)
#define CURRENTSCREEN() (*currentScreen)()
#define CURRENTSCREEN() (*currentScreen)(), lcd_clicked = false
#else
#define CURRENTSCREEN() lcd_status_screen()
#endif
@@ -3020,8 +3003,6 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; }
#endif
}
bool lcd_clicked() { return LCD_CLICKED; }
#endif // ULTIPANEL
#endif // ULTRA_LCD