Save 236B by improving functions in menu.cpp. Beware - the label now has

to come with a ':' as its last character. Changed language files along
with this commit too.
This commit is contained in:
DRracer 2019-05-16 16:43:44 +02:00
parent 8bc4952f10
commit a453c6fc9d
10 changed files with 50 additions and 48 deletions

View File

@ -306,9 +306,9 @@ const char menu_20x_space[] PROGMEM = " ";
const char menu_fmt_int3[] PROGMEM = "%c%.15S:%s%3d";
const char menu_fmt_float31[] PROGMEM = "%-12.12s%+8.1f";
const char menu_fmt_float31[] PROGMEM = "%-12.12S%+8.1f";
const char menu_fmt_float13[] PROGMEM = "%c%.12S:%s%+06.3f";
const char menu_fmt_float13[] PROGMEM = "%-15.15S%+5.3f";
const char menu_fmt_float13off[] PROGMEM = "%c%.12S:%s%";
@ -348,39 +348,36 @@ void menu_draw_P<uint8_t*>(char chr, const char* str, int16_t val)
}
}
//! Draw up to 10 chars of text, ':' and float number in format from +0.0 to +12345.0. The increased range is necessary
//! @brief Draw up to 10 chars of text and a float number in format from +0.0 to +12345.0. The increased range is necessary
//! for displaying large values of extruder positions, which caused text overflow in the previous implementation.
//!
//! @param chr first character to print on the line
//! @param str string label to print, will be appended with ':' automatically inside the function
//! @param str string label to print
//! @param val value to print aligned to the right side of the display
//!
//! Implementation comments:
//! The text needs to be prerendered into the prerendered[] to enable left alignment of text str including the colon behind it.
//! If we didn't want the colon behind it, the whole operation would have been solved with a single vsprintf call,
//! but such line would look different compared to every other similar menu item
//! So it is almost the same amount of code like before, but with added string prerendering
void menu_draw_float31(char chr, const char* str, float val)
//! The text needs to come with a colon ":", this function does not append it anymore.
//! That resulted in a much shorter implementation (234628B -> 234476B)
//! There are similar functions around which may be shortened in a similar way
void menu_draw_float31(const char* str, float val)
{
uint8_t txtlen = strlen_P(str);
if( txtlen > 10 )txtlen = 10;
char prerendered[21];
strcpy_P(prerendered, menu_20x_space);
prerendered[0] = chr; // start with the initial byte/space for menu navigation
strncpy_P(prerendered+1, str, 10); // render the text and limit it to max 10 characters
prerendered[txtlen+1] = ':'; // put the colon behind it
prerendered[txtlen+2] = 0; // terminate the string to be used inside the printf
lcd_printf_P(menu_fmt_float31, prerendered, val);
lcd_printf_P(menu_fmt_float31, str, val);
}
//draw up to 12 chars of text, ':' and float number in format +1.234
void menu_draw_float13(char chr, const char* str, float val)
//! @brief Draw up to 12 chars of text and a float number in format +1.234
//!
//! @param chr first character to print on the line
//! @param str string label to print
//! @param val value to print aligned to the right side of the display
//!
//! Implementation comments:
//! This function uses similar optimization principles as menu_draw_float31
//! (i.e. str must include a ':' at its end)
//! FLASH usage dropped 234476B -> 234392B
//! Moreover, this function gets inlined in the final code, so removing it doesn't really help ;)
void menu_draw_float13(const char* str, float val)
{
int text_len = strlen_P(str);
if (text_len > 12) text_len = 12;
char spaces[21];
strcpy_P(spaces, menu_20x_space);
spaces[12 - text_len] = 0;
lcd_printf_P(menu_fmt_float13, chr, str, spaces, val);
lcd_printf_P(menu_fmt_float13, str, val);
}
template <typename T>

View File

@ -97,11 +97,12 @@ extern uint8_t menu_item_gcode_P(const char* str, const char* str_gcode);
extern const char menu_fmt_int3[];
extern const char menu_fmt_float31[];
extern const char menu_fmt_float13[];
extern void menu_draw_float31(char chr, const char* str, float val);
extern void menu_draw_float31(const char* str, float val);
extern void menu_draw_float13(char chr, const char* str, float val);
extern void menu_draw_float13(const char* str, float val);
#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_P(str, pval, minval, maxval)) return; } while (0)

18
Firmware/ultralcd.cpp Normal file → Executable file
View File

@ -3079,7 +3079,7 @@ static void _lcd_move(const char *name, int axis, int min, int max)
if (lcd_draw_update)
{
lcd_set_cursor(0, 1);
menu_draw_float31(' ', name, current_position[axis]);
menu_draw_float31(name, current_position[axis]);
}
if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious);
if (LCD_CLICKED) menu_back();
@ -3104,7 +3104,9 @@ static void lcd_move_e()
if (lcd_draw_update)
{
lcd_set_cursor(0, 1);
menu_draw_float31(' ', PSTR("Extruder"), current_position[E_AXIS]);
// Note: the colon behind the text is necessary to greatly shorten
// the implementation of menu_draw_float31
menu_draw_float31(PSTR("Extruder:"), current_position[E_AXIS]);
}
if (LCD_CLICKED) menu_back();
}
@ -3224,14 +3226,16 @@ void EEPROM_read_B(int pos, int* value)
}
// Note: the colon behind the text (X, Y, Z) is necessary to greatly shorten
// the implementation of menu_draw_float31
static void lcd_move_x() {
_lcd_move(PSTR("X"), X_AXIS, X_MIN_POS, X_MAX_POS);
_lcd_move(PSTR("X:"), X_AXIS, X_MIN_POS, X_MAX_POS);
}
static void lcd_move_y() {
_lcd_move(PSTR("Y"), Y_AXIS, Y_MIN_POS, Y_MAX_POS);
_lcd_move(PSTR("Y:"), Y_AXIS, Y_MIN_POS, Y_MAX_POS);
}
static void lcd_move_z() {
_lcd_move(PSTR("Z"), Z_AXIS, Z_MIN_POS, Z_MAX_POS);
_lcd_move(PSTR("Z:"), Z_AXIS, Z_MIN_POS, Z_MAX_POS);
}
@ -3304,7 +3308,7 @@ static void _lcd_babystep(int axis, const char *msg)
if (lcd_draw_update)
{
lcd_set_cursor(0, 1);
menu_draw_float13(' ', msg, _md->babystepMemMM[axis]);
menu_draw_float13(msg, _md->babystepMemMM[axis]);
}
if (LCD_CLICKED || menu_leaving)
{
@ -3320,7 +3324,7 @@ static void _lcd_babystep(int axis, const char *msg)
static void lcd_babystep_z()
{
_lcd_babystep(Z_AXIS, (_i("Adjusting Z")));////MSG_BABYSTEPPING_Z c=20
_lcd_babystep(Z_AXIS, (_i("Adjusting Z:")));////MSG_BABYSTEPPING_Z c=20 Beware: must include the ':' as its last character
}

2
lang/lang_en.txt Normal file → Executable file
View File

@ -17,7 +17,7 @@
">Cancel"
#MSG_BABYSTEPPING_Z c=20
"Adjusting Z"
"Adjusting Z:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "

4
lang/lang_en_cz.txt Normal file → Executable file
View File

@ -23,8 +23,8 @@
">Zrusit"
#MSG_BABYSTEPPING_Z c=20
"Adjusting Z"
"Dostavovani Z"
"Adjusting Z:"
"Dostavovani Z:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "

4
lang/lang_en_de.txt Normal file → Executable file
View File

@ -23,8 +23,8 @@
">Abbruch"
#MSG_BABYSTEPPING_Z c=20
"Adjusting Z"
"Z wurde eingestellt"
"Adjusting Z:"
"Z Einstellung:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "

4
lang/lang_en_es.txt Normal file → Executable file
View File

@ -23,8 +23,8 @@
">Cancelar"
#MSG_BABYSTEPPING_Z c=20
"Adjusting Z"
"Ajustar Z"
"Adjusting Z:"
"Ajustar Z:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "

4
lang/lang_en_fr.txt Normal file → Executable file
View File

@ -23,8 +23,8 @@
">Annuler"
#MSG_BABYSTEPPING_Z c=20
"Adjusting Z"
"Ajustement de Z"
"Adjusting Z:"
"Ajust. de Z:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "

4
lang/lang_en_it.txt Normal file → Executable file
View File

@ -23,8 +23,8 @@
">Annulla"
#MSG_BABYSTEPPING_Z c=20
"Adjusting Z"
"Compensazione Z"
"Adjusting Z:"
"Compensaz. Z:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "

4
lang/lang_en_pl.txt Normal file → Executable file
View File

@ -23,8 +23,8 @@
">Anuluj"
#MSG_BABYSTEPPING_Z c=20
"Adjusting Z"
"Dostrajanie Z"
"Adjusting Z:"
"Dostrajanie Z:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "