Unify fullscreen/multiscreen/yes-no prompt message handling

Modify lcd_show_multiscreen_message_two_choices_and_wait_P to also
handle single-screen or empty (no-clear) prompts, making other functions
redundant. Saves 76 bytes.

Change existing functions to simply call
lcd_show_multiscreen_message_two_choices_and_wait_P with the correct
arguments.

This changes the prompt of existing Yes/No messages: the previous prompt
would use the last two lines of the LCD, while the new prompt is using
just the last line of the LCD instead.

Translation do not require updates, since the Yes/No translation was
already the same in both implementations.
This commit is contained in:
Yuri D'Elia 2021-03-28 18:12:11 +02:00 committed by DRracer
parent d78506a8ea
commit b41fb8a13a

View File

@ -3177,7 +3177,7 @@ lcd_wait_for_click_delay(0);
} }
//! @brief Show multiple screen message with yes and no possible choices and wait with possible timeout //! @brief Show multiple screen message with yes and no possible choices and wait with possible timeout
//! @param msg Message to show //! @param msg Message to show. If NULL, do not clear the screen and handle choice selection only.
//! @param allow_timeouting if true, allows time outing of the screen //! @param allow_timeouting if true, allows time outing of the screen
//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected //! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
//! @retval 1 yes choice selected by user //! @retval 1 yes choice selected by user
@ -3187,8 +3187,21 @@ int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allo
{ {
return lcd_show_multiscreen_message_two_choices_and_wait_P(msg, allow_timeouting, default_yes, _T(MSG_YES), _T(MSG_NO)); return lcd_show_multiscreen_message_two_choices_and_wait_P(msg, allow_timeouting, default_yes, _T(MSG_YES), _T(MSG_NO));
} }
//! @brief Show multiple screen message with two possible choices and wait with possible timeout //! @brief Show a two-choice prompt on the last line of the LCD
//! @param msg Message to show //! @param first_selected Show first choice as selected if true, the second otherwise
//! @param first_choice text caption of first possible choice
//! @param second_choice text caption of second possible choice
void lcd_show_two_choices_prompt_P(bool first_selected, const char *first_choice, const char *second_choice)
{
lcd_set_cursor(0, 3);
lcd_print(first_selected? '>': ' ');
lcd_puts_P(first_choice);
lcd_set_cursor(7, 3);
lcd_print(!first_selected? '>': ' ');
lcd_puts_P(second_choice);
}
//! @brief Show single or multiple screen message with two possible choices and wait with possible timeout
//! @param msg Message to show. If NULL, do not clear the screen and handle choice selection only.
//! @param allow_timeouting if true, allows time outing of the screen //! @param allow_timeouting if true, allows time outing of the screen
//! @param default_first if true, fist choice is selected by default, otherwise second choice is preselected //! @param default_first if true, fist choice is selected by default, otherwise second choice is preselected
//! @param first_choice text caption of first possible choice //! @param first_choice text caption of first possible choice
@ -3199,15 +3212,18 @@ int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allo
int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool allow_timeouting, bool default_first, int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool allow_timeouting, bool default_first,
const char *first_choice, const char *second_choice) const char *first_choice, const char *second_choice)
{ {
const char *msg_next = lcd_display_message_fullscreen_P(msg); const char *msg_next = msg? lcd_display_message_fullscreen_P(msg) : NULL;
bool multi_screen = msg_next != NULL; bool multi_screen = msg_next != NULL;
// Initial status/prompt on single-screen messages
bool yes = default_first ? true : false; bool yes = default_first ? true : false;
if (!msg_next) lcd_show_two_choices_prompt_P(yes, first_choice, second_choice);
// Wait for user confirmation or a timeout. // Wait for user confirmation or a timeout.
unsigned long previous_millis_cmd = _millis(); unsigned long previous_millis_cmd = _millis();
int8_t enc_dif = lcd_encoder_diff; int8_t enc_dif = lcd_encoder_diff;
lcd_consume_click(); lcd_consume_click();
//KEEPALIVE_STATE(PAUSED_FOR_USER); KEEPALIVE_STATE(PAUSED_FOR_USER);
for (;;) { for (;;) {
for (uint8_t i = 0; i < 100; ++i) { for (uint8_t i = 0; i < 100; ++i) {
delay_keep_alive(50); delay_keep_alive(50);
@ -3218,19 +3234,13 @@ int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool
if (abs(enc_dif - lcd_encoder_diff) > 4) { if (abs(enc_dif - lcd_encoder_diff) > 4) {
if (msg_next == NULL) { if (msg_next == NULL) {
lcd_set_cursor(0, 3); if ((enc_dif < lcd_encoder_diff && yes) ||
if (enc_dif < lcd_encoder_diff && yes) { ((enc_dif > lcd_encoder_diff && !yes)))
lcd_print(' '); {
lcd_putc_at(7, 3, '>'); yes = !yes;
yes = false; lcd_show_two_choices_prompt_P(yes, first_choice, second_choice);
Sound_MakeSound(e_SOUND_TYPE_EncoderMove); Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
} }
else if (enc_dif > lcd_encoder_diff && !yes) {
lcd_print('>');
lcd_putc_at(7, 3, ' ');
yes = true;
Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
}
enc_dif = lcd_encoder_diff; enc_dif = lcd_encoder_diff;
} }
else { else {
@ -3241,7 +3251,7 @@ int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool
if (lcd_clicked()) { if (lcd_clicked()) {
Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
if (msg_next == NULL) { if (msg_next == NULL) {
//KEEPALIVE_STATE(IN_HANDLER); KEEPALIVE_STATE(IN_HANDLER);
lcd_set_custom_characters(); lcd_set_custom_characters();
return yes; return yes;
} }
@ -3255,17 +3265,12 @@ int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool
msg_next = lcd_display_message_fullscreen_P(msg_next); msg_next = lcd_display_message_fullscreen_P(msg_next);
} }
if (msg_next == NULL) { if (msg_next == NULL) {
lcd_set_cursor(0, 3); lcd_show_two_choices_prompt_P(yes, first_choice, second_choice);
if (yes) lcd_print('>');
lcd_puts_at_P(1, 3, first_choice);
lcd_set_cursor(7, 3);
if (!yes) lcd_print('>');
lcd_puts_at_P(8, 3, second_choice);
} }
} }
} }
//! @brief Display and wait for a Yes/No choice using the last two lines of the LCD //! @brief Display and wait for a Yes/No choice using the last line of the LCD
//! @param allow_timeouting if true, allows time outing of the screen //! @param allow_timeouting if true, allows time outing of the screen
//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected //! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
//! @retval 1 yes choice selected by user //! @retval 1 yes choice selected by user
@ -3273,60 +3278,11 @@ int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool
//! @retval -1 screen timed out //! @retval -1 screen timed out
int8_t lcd_show_yes_no_and_wait(bool allow_timeouting, bool default_yes) int8_t lcd_show_yes_no_and_wait(bool allow_timeouting, bool default_yes)
{ {
if (default_yes) { return lcd_show_multiscreen_message_yes_no_and_wait_P(NULL, allow_timeouting, default_yes);
lcd_putc_at(0, 2, '>');
lcd_puts_P(_T(MSG_YES));
lcd_puts_at_P(1, 3, _T(MSG_NO));
}
else {
lcd_puts_at_P(1, 2, _T(MSG_YES));
lcd_putc_at(0, 3, '>');
lcd_puts_P(_T(MSG_NO));
}
int8_t retval = default_yes ? true : false;
// Wait for user confirmation or a timeout.
unsigned long previous_millis_cmd = _millis();
int8_t enc_dif = lcd_encoder_diff;
lcd_consume_click();
KEEPALIVE_STATE(PAUSED_FOR_USER);
for (;;) {
if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS)
{
retval = -1;
break;
}
manage_heater();
manage_inactivity(true);
if (abs(enc_dif - lcd_encoder_diff) > 4) {
lcd_set_cursor(0, 2);
if (enc_dif < lcd_encoder_diff && retval) {
lcd_print(' ');
lcd_putc_at(0, 3, '>');
retval = 0;
Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
}
else if (enc_dif > lcd_encoder_diff && !retval) {
lcd_print('>');
lcd_putc_at(0, 3, ' ');
retval = 1;
Sound_MakeSound(e_SOUND_TYPE_EncoderMove);
}
enc_dif = lcd_encoder_diff;
}
if (lcd_clicked()) {
Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
KEEPALIVE_STATE(IN_HANDLER);
break;
}
}
lcd_encoder_diff = 0;
return retval;
} }
//! @brief Show single screen message with yes and no possible choices and wait with possible timeout //! @brief Show single screen message with yes and no possible choices and wait with possible timeout
//! @param msg Message to show //! @param msg Message to show. If NULL, do not clear the screen and handle choice selection only.
//! @param allow_timeouting if true, allows time outing of the screen //! @param allow_timeouting if true, allows time outing of the screen
//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected //! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
//! @retval 1 yes choice selected by user //! @retval 1 yes choice selected by user
@ -3335,8 +3291,7 @@ int8_t lcd_show_yes_no_and_wait(bool allow_timeouting, bool default_yes)
//! @relates lcd_show_yes_no_and_wait //! @relates lcd_show_yes_no_and_wait
int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes) int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes)
{ {
lcd_display_message_fullscreen_P(msg); return lcd_show_multiscreen_message_yes_no_and_wait_P(msg, allow_timeouting, default_yes);
return lcd_show_yes_no_and_wait(allow_timeouting, default_yes);
} }
void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask) void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask)