Save up to 94 bytes of RAM on 20x4 LCD Display machines (#6964)

* Save up to 94 bytes of RAM on 20x4 LCD Display machines

Moved the custom screen characters out of RAM into Program Memory.  With
SD-Card support and the Progress Bar enabled, this saves 94 bytes of RAM
memory.

This was tested using the example_configurations/FolgerTech-i3-2020
files.  So a couple small changes to those files snuck into this Pull
Request.

Probably...  We can find similar savings in the Graphics LCD code it we
comb through it.   And if so...  That is the place we really need to
save RAM memory!

* Tidy up white space and indentation
This commit is contained in:
Roxy-3D
2017-06-05 17:02:00 -05:00
committed by GitHub
parent 04b07a6ecc
commit 0dd0033b33
4 changed files with 77 additions and 54 deletions

View File

@ -193,12 +193,18 @@ extern volatile uint8_t buttons; //an extended version of the last checked butt
static void lcd_implementation_update_indicators();
#endif
static void lcd_set_custom_characters(
#if ENABLED(LCD_PROGRESS_BAR)
const bool info_screen_charset = true
#endif
) {
static byte bedTemp[8] = {
static void createChar_P(char c, PROGMEM byte *ptr) {
byte temp[8];
int8_t i;
for(i=0; i<8; i++) {
temp[i] = pgm_read_byte(&ptr[i]);
}
lcd.createChar(c, temp);
}
const static PROGMEM byte bedTemp[8] = {
B00000,
B11111,
B10101,
@ -207,8 +213,9 @@ static void lcd_set_custom_characters(
B11111,
B00000,
B00000
}; //thanks Sonny Mounicou
static byte degree[8] = {
};
const static PROGMEM byte degree[8] = {
B01100,
B10010,
B10010,
@ -218,7 +225,8 @@ static void lcd_set_custom_characters(
B00000,
B00000
};
static byte thermometer[8] = {
const static PROGMEM byte thermometer[8] = {
B00100,
B01010,
B01010,
@ -228,7 +236,8 @@ static void lcd_set_custom_characters(
B10001,
B01110
};
static byte uplevel[8] = {
const static PROGMEM byte uplevel[8] = {
B00100,
B01110,
B11111,
@ -237,8 +246,9 @@ static void lcd_set_custom_characters(
B00000,
B00000,
B00000
}; //thanks joris
static byte feedrate[8] = {
};
const static PROGMEM byte feedrate[8] = {
B11100,
B10000,
B11000,
@ -247,8 +257,9 @@ static void lcd_set_custom_characters(
B00110,
B00101,
B00000
}; //thanks Sonny Mounicou
static byte clock[8] = {
};
const static PROGMEM byte clock[8] = {
B00000,
B01110,
B10011,
@ -257,16 +268,10 @@ static void lcd_set_custom_characters(
B01110,
B00000,
B00000
}; //thanks Sonny Mounicou
};
lcd.createChar(LCD_STR_BEDTEMP[0], bedTemp);
lcd.createChar(LCD_STR_DEGREE[0], degree);
lcd.createChar(LCD_STR_THERMOMETER[0], thermometer);
lcd.createChar(LCD_STR_FEEDRATE[0], feedrate);
lcd.createChar(LCD_STR_CLOCK[0], clock);
#if ENABLED(SDSUPPORT)
static byte refresh[8] = {
#if ENABLED(SDSUPPORT)
const static PROGMEM byte refresh[8] = {
B00000,
B00110,
B11001,
@ -275,8 +280,8 @@ static void lcd_set_custom_characters(
B10011,
B01100,
B00000,
}; //thanks joris
static byte folder[8] = {
};
const static PROGMEM byte folder[8] = {
B00000,
B11100,
B11111,
@ -285,10 +290,10 @@ static void lcd_set_custom_characters(
B11111,
B00000,
B00000
}; //thanks joris
};
#if ENABLED(LCD_PROGRESS_BAR)
static byte progress[3][8] = { {
#if ENABLED(LCD_PROGRESS_BAR)
const static PROGMEM byte progress[3][8] = { {
B00000,
B10000,
B10000,
@ -316,26 +321,43 @@ static void lcd_set_custom_characters(
B10101,
B00000
} };
#endif
#endif
static void lcd_set_custom_characters(
#if ENABLED(LCD_PROGRESS_BAR)
const bool info_screen_charset = true
#endif
) {
createChar_P(LCD_BEDTEMP_CHAR, bedTemp);
createChar_P(LCD_DEGREE_CHAR, degree);
createChar_P(LCD_STR_THERMOMETER[0], thermometer);
createChar_P(LCD_FEEDRATE_CHAR, feedrate);
createChar_P(LCD_CLOCK_CHAR, clock);
#if ENABLED(SDSUPPORT)
#if ENABLED(LCD_PROGRESS_BAR)
static bool char_mode = false;
if (info_screen_charset != char_mode) {
char_mode = info_screen_charset;
if (info_screen_charset) { // Progress bar characters for info screen
for (int i = 3; i--;) lcd.createChar(LCD_STR_PROGRESS[i], progress[i]);
for (int i = 3; i--;) createChar_P(LCD_STR_PROGRESS[i], progress[i]);
}
else { // Custom characters for submenus
lcd.createChar(LCD_STR_UPLEVEL[0], uplevel);
lcd.createChar(LCD_STR_REFRESH[0], refresh);
lcd.createChar(LCD_STR_FOLDER[0], folder);
createChar_P(LCD_UPLEVEL_CHAR, uplevel);
createChar_P(LCD_REFRESH_CHAR, refresh);
createChar_P(LCD_STR_FOLDER[0], folder);
}
}
#else
lcd.createChar(LCD_STR_UPLEVEL[0], uplevel);
lcd.createChar(LCD_STR_REFRESH[0], refresh);
lcd.createChar(LCD_STR_FOLDER[0], folder);
createChar_P(LCD_UPLEVEL_CHAR, uplevel);
createChar_P(LCD_REFRESH_CHAR, refresh);
createChar_P(LCD_STR_FOLDER[0], folder);
#endif
#else
lcd.createChar(LCD_STR_UPLEVEL[0], uplevel);
createChar_P(LCD_UPLEVEL_CHAR, uplevel);
#endif
}
@ -607,7 +629,8 @@ FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, co
lcd.print(itostr3left(t2 + 0.5));
if (prefix >= 0) {
lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
lcd.print((char)LCD_DEGREE_CHAR);
lcd.print(' ');
if (t2 < 10) lcd.print(' ');
}
}
@ -677,10 +700,10 @@ static void lcd_implementation_status_screen() {
lcd.setCursor(8, 0);
#if HOTENDS > 1
lcd.print(LCD_STR_THERMOMETER[0]);
lcd.print((CHAR)LCD_STR_THERMOMETER[0]);
_draw_heater_status(1, -1, blink);
#else
lcd.print(LCD_STR_BEDTEMP[0]);
lcd.print((CHAR)LCD_BEDTEMP_CHAR);
_draw_heater_status(-1, -1, blink);
#endif
@ -701,7 +724,7 @@ static void lcd_implementation_status_screen() {
#if HOTENDS > 1
_draw_heater_status(1, LCD_STR_THERMOMETER[0], blink);
#else
_draw_heater_status(-1, LCD_STR_BEDTEMP[0], blink);
_draw_heater_status(-1, LCD_BEDTEMP_CHAR, blink);
#endif
#endif // HOTENDS > 1 || TEMP_SENSOR_BED != 0
@ -735,7 +758,7 @@ static void lcd_implementation_status_screen() {
// If we both have a 2nd extruder and a heated bed,
// show the heated bed temp on the left,
// since the first line is filled with extruder temps
_draw_heater_status(-1, LCD_STR_BEDTEMP[0], blink);
_draw_heater_status(-1, LCD_BEDTEMP_CHAR, blink);
#else
// Before homing the axis letters are blinking 'X' <-> '?'.
@ -767,7 +790,7 @@ static void lcd_implementation_status_screen() {
#if LCD_HEIGHT > 3
lcd.setCursor(0, 2);
lcd.print(LCD_STR_FEEDRATE[0]);
lcd.print((char)LCD_FEEDRATE_CHAR);
lcd.print(itostr3(feedrate_percentage));
lcd.print('%');
@ -788,7 +811,7 @@ static void lcd_implementation_status_screen() {
uint8_t len = elapsed.toDigital(buffer);
lcd.setCursor(LCD_WIDTH - len - 1, 2);
lcd.print(LCD_STR_CLOCK[0]);
lcd.print((char)LCD_CLOCK_CHAR);
lcd_print(buffer);
#endif // LCD_HEIGHT > 3
@ -980,7 +1003,7 @@ static void lcd_implementation_status_screen() {
#endif // SDSUPPORT
#define lcd_implementation_drawmenu_back(sel, row, pstr, dummy) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
#define lcd_implementation_drawmenu_back(sel, row, pstr, dummy) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_UPLEVEL_CHAR,LCD_UPLEVEL_CHAR)
#define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
#define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
#define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')