@ -139,7 +139,7 @@ static void lcd_implementation_init()
u8g . drawStr ( txt1X , u8g . getHeight ( ) - DOG_CHAR_HEIGHT * 3 / 2 , STRING_SPLASH_LINE1 ) ;
u8g . drawStr ( txt2X , u8g . getHeight ( ) - DOG_CHAR_HEIGHT * 1 / 2 , STRING_SPLASH_LINE2 ) ;
# endif
} while ( u8g . nextPage ( ) ) ;
} while ( u8g . nextPage ( ) ) ;
}
static void lcd_implementation_clear ( ) { } // Automatically cleared by Picture Loop
@ -197,7 +197,7 @@ static void lcd_implementation_status_screen() {
u8g . drawBox ( 55 , 50 , ( unsigned int ) ( 71.f * card . percentDone ( ) / 100.f ) , 2 ) ;
}
u8g . setPrintPos ( 80 , 4 7 ) ;
u8g . setPrintPos ( 80 , 4 8 ) ;
if ( starttime ! = 0 ) {
uint16_t time = ( millis ( ) - starttime ) / 60000 ;
u8g . print ( itostr2 ( time / 60 ) ) ;
@ -222,7 +222,7 @@ static void lcd_implementation_status_screen() {
int per = ( ( fanSpeed + 1 ) * 100 ) / 256 ;
if ( per ) {
u8g . print ( itostr3 ( per ) ) ;
u8g . print ( " % " ) ;
u8g . print ( ' % ' ) ;
}
else
# endif
@ -231,26 +231,27 @@ static void lcd_implementation_status_screen() {
}
// X, Y, Z-Coordinates
# define XYZ_BASELINE 38
u8g . setFont ( FONT_STATUSMENU ) ;
u8g . drawBox ( 0 , 29, 128 , 10 ) ;
u8g . drawBox ( 0 , 30, 128 , 9 ) ;
u8g . setColorIndex ( 0 ) ; // white on black
u8g . setPrintPos ( 2 , 37 ) ;
u8g . print ( " X " ) ;
u8g . drawPixel ( 8 , 33 ) ;
u8g . drawPixel ( 8 , 3 5 ) ;
u8g . setPrintPos ( 10 , 37 ) ;
u8g . setPrintPos ( 2 , XYZ_BASELINE ) ;
u8g . print ( ' X ' ) ;
u8g . drawPixel ( 8 , XYZ_BASELINE - 5 ) ;
u8g . drawPixel ( 8 , XYZ_BASELINE - 3 ) ;
u8g . setPrintPos ( 10 , XYZ_BASELINE ) ;
u8g . print ( ftostr31ns ( current_position [ X_AXIS ] ) ) ;
u8g . setPrintPos ( 43 , 37 ) ;
lcd_printPGM ( PSTR ( " Y " ) ) ;
u8g . drawPixel ( 49 , 33 ) ;
u8g . drawPixel ( 49 , 3 5 ) ;
u8g . setPrintPos ( 51 , 37 ) ;
u8g . setPrintPos ( 43 , XYZ_BASELINE ) ;
u8g . print ( ' Y ' ) ;
u8g . drawPixel ( 49 , XYZ_BASELINE - 5 ) ;
u8g . drawPixel ( 49 , XYZ_BASELINE - 3 ) ;
u8g . setPrintPos ( 51 , XYZ_BASELINE ) ;
u8g . print ( ftostr31ns ( current_position [ Y_AXIS ] ) ) ;
u8g . setPrintPos ( 83 , 37 ) ;
u8g . print ( " Z " ) ;
u8g . drawPixel ( 89 , 33 ) ;
u8g . drawPixel ( 89 , 3 5 ) ;
u8g . setPrintPos ( 91 , 37 ) ;
u8g . setPrintPos ( 83 , XYZ_BASELINE ) ;
u8g . print ( ' Z ' ) ;
u8g . drawPixel ( 89 , XYZ_BASELINE - 5 ) ;
u8g . drawPixel ( 89 , XYZ_BASELINE - 3 ) ;
u8g . setPrintPos ( 91 , XYZ_BASELINE ) ;
u8g . print ( ftostr31 ( current_position [ Z_AXIS ] ) ) ;
u8g . setColorIndex ( 1 ) ; // black on white
@ -259,13 +260,13 @@ static void lcd_implementation_status_screen() {
u8g . setPrintPos ( 3 , 49 ) ;
u8g . print ( LCD_STR_FEEDRATE [ 0 ] ) ;
u8g . setFont ( FONT_STATUSMENU ) ;
u8g . setPrintPos ( 12 , 4 8 ) ;
u8g . setPrintPos ( 12 , 4 9 ) ;
u8g . print ( itostr3 ( feedmultiply ) ) ;
u8g . print ( ' % ' ) ;
// Status line
u8g . setFont ( FONT_STATUSMENU ) ;
u8g . setPrintPos ( 0 , 6 1 ) ;
u8g . setPrintPos ( 0 , 6 3 ) ;
# ifndef FILAMENT_LCD_DISPLAY
u8g . print ( lcd_status_message ) ;
# else
@ -282,10 +283,10 @@ static void lcd_implementation_status_screen() {
# endif
}
static void lcd_implementation_mark_as_selected ( uint8_t row , char pr_char ) {
if ( ( pr_char = = ' > ' ) | | ( pr_char = = LCD_STR_UPLEVEL [ 0 ] ) ) {
static void lcd_implementation_mark_as_selected ( uint8_t row , bool isSelected ) {
if ( isSelected ) {
u8g . setColorIndex ( 1 ) ; // black on white
u8g . drawBox ( 0 , row * DOG_CHAR_HEIGHT + 3 , 128 , DOG_CHAR_HEIGHT ) ;
u8g . drawBox ( 0 , row * DOG_CHAR_HEIGHT + 3 , 128 , DOG_CHAR_HEIGHT ) ;
u8g . setColorIndex ( 0 ) ; // following text must be white on black
}
else {
@ -294,98 +295,80 @@ static void lcd_implementation_mark_as_selected(uint8_t row, char pr_char) {
u8g . setPrintPos ( START_ROW * DOG_CHAR_WIDTH , ( row + 1 ) * DOG_CHAR_HEIGHT ) ;
}
static void lcd_implementation_drawmenu_generic ( uint8_t row , const char * pstr , char pre_char , char post_char ) {
static void lcd_implementation_drawmenu_generic ( bool isSelected , uint8_t row , const char * pstr , char pre_char , char post_char ) {
char c ;
uint8_t n = LCD_WIDTH - 2 ;
lcd_implementation_mark_as_selected ( row , pre_char ) ;
lcd_implementation_mark_as_selected ( row , isSelected ) ;
while ( ( c = pgm_read_byte ( pstr ) ) ) {
while ( ( c = pgm_read_byte ( pstr ) ) ) {
u8g . print ( c ) ;
pstr + + ;
n - - ;
}
while ( n - - ) u8g . print ( ' ' ) ;
while ( n - - ) u8g . print ( ' ' ) ;
u8g . print ( post_char ) ;
u8g . print ( ' ' ) ;
}
static void _drawmenu_setting_edit_generic ( uint8_t row , const char * pst r, char pre_cha r, const char * data , bool pgm ) {
static void _drawmenu_setting_edit_generic ( bool isSelected , uint8_t row , const char * pst r, const char * data , bool pgm ) {
char c ;
uint8_t n = LCD_WIDTH - 2 - ( pgm ? lcd_strlen_P ( data ) : ( lcd_strlen ( ( char * ) data ) ) ) ;
lcd_implementation_mark_as_selected ( row , pre_char ) ;
lcd_implementation_mark_as_selected ( row , isSelected ) ;
while ( ( c = pgm_read_byte ( pstr ) ) ) {
while ( ( c = pgm_read_byte ( pstr ) ) ) {
u8g . print ( c ) ;
pstr + + ;
n - - ;
}
u8g . print ( ' : ' ) ;
while ( n - - ) u8g . print ( ' ' ) ;
while ( n - - ) u8g . print ( ' ' ) ;
if ( pgm ) { lcd_printPGM ( data ) ; } else { u8g . print ( data ) ; }
}
# define lcd_implementation_drawmenu_setting_edit_generic(row, pstr, pre_char, data) _drawmenu_setting_edit_generic(row, pstr, pre_char, data, false)
# define lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, pre_char, data) _drawmenu_setting_edit_generic(row, pstr, pre_char, data, true)
# define lcd_implementation_drawmenu_setting_edit_int3_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', itostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_int3(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', itostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float3_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float3(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float32_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr32(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float32(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr32(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float43_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr43(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float43(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr43(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float5_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float5(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float52_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr52(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float52(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr52(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float51_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr51(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float51(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr51(*(data)))
# define lcd_implementation_drawmenu_setting_edit_long5_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_long5(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_bool_selected(row, pstr, pstr2, data) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
# define lcd_implementation_drawmenu_setting_edit_bool(row, pstr, pstr2, data) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
# define lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, data) _drawmenu_setting_edit_generic(sel, row, pstr, data, false)
# define lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, data) _drawmenu_setting_edit_generic(sel, row, pstr, data, true)
# define lcd_implementation_drawmenu_setting_edit_int3(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, itostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float3(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float32(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr32(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float43(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr43(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float5(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float52(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr52(*(data)))
# define lcd_implementation_drawmenu_setting_edit_float51(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr51(*(data)))
# define lcd_implementation_drawmenu_setting_edit_long5(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_bool(sel, row, pstr, pstr2, data) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
//Add version for callback functions
# define lcd_implementation_drawmenu_setting_edit_callback_int3_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', itostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_int3(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', itostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float3_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float3(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float32_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr32(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float32(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr32(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float43_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr43(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float43(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr43(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float5_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float5(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float52_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr52(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float52(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr52(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float51_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr51(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float51(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr51(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_long5_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_long5(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_bool_selected(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
# define lcd_implementation_drawmenu_setting_edit_callback_bool(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
# define lcd_implementation_drawmenu_setting_edit_callback_int3(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, itostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float3(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr3(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float32(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr32(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float43(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr43(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float5(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float52(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr52(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_float51(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr51(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_long5(sel, row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, ftostr5(*(data)))
# define lcd_implementation_drawmenu_setting_edit_callback_bool(sel, row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
void lcd_implementation_drawedit ( const char * pstr , char * value ) {
uint8_t rows = 1 ;
uint8_t lcd_width = LCD_WIDTH ;
uint8_t char_width = DOG_CHAR_WIDTH ;
uint8_t lcd_width = LCD_WIDTH , char_width = DOG_CHAR_WIDTH ;
uint8_t vallen = lcd_strlen ( value ) ;
# ifdef USE_BIG_EDIT_FONT
if ( lcd_strlen_P ( pstr ) < = LCD_WIDTH_EDIT - 1 ) {
u8g . setFont ( FONT_MENU_EDIT ) ;
lcd_width = LCD_WIDTH_EDIT + 1 ;
char_width = DOG_CHAR_WIDTH_EDIT ;
if ( lcd_strlen_P ( pstr ) > = LCD_WIDTH_EDIT - lcd_strlen ( value ) ) rows = 2 ;
if ( lcd_strlen_P ( pstr ) > = LCD_WIDTH_EDIT - vallen ) rows = 2 ;
}
else {
u8g . setFont ( FONT_MENU ) ;
}
# endif
if ( lcd_strlen_P ( pstr ) > LCD_WIDTH - 2 - lcd_strlen ( value ) ) rows = 2 ;
if ( lcd_strlen_P ( pstr ) > LCD_WIDTH - 2 - vallen ) rows = 2 ;
const float kHalfChar = DOG_CHAR_HEIGHT_EDIT / 2 ;
float rowHeight = u8g . getHeight ( ) / ( rows + 1 ) ; // 1/(rows+1) = 1/2 or 1/3
@ -393,43 +376,37 @@ void lcd_implementation_drawedit(const char* pstr, char* value) {
u8g . setPrintPos ( 0 , rowHeight + kHalfChar ) ;
lcd_printPGM ( pstr ) ;
u8g . print ( ' : ' ) ;
u8g . setPrintPos ( ( lcd_width - 1 - lcd_strlen ( value ) ) * char_width , rows * rowHeight + kHalfChar ) ;
u8g . setPrintPos ( ( lcd_width - 1 - vallen ) * char_width , rows * rowHeight + kHalfChar ) ;
u8g . print ( value ) ;
}
static void _drawmenu_sd ( uint8_t row , const char * pstr , const char * filename , char * const longFilename , bool isDir , bool isSelected ) {
static void _drawmenu_sd ( bool isSelected , uint8_t row , const char * pstr , const char * filename , char * const longFilename , bool isDir ) {
char c ;
uint8_t n = LCD_WIDTH - 1 ;
if ( longFilename [ 0 ] ! = ' \0 ' ) {
if ( longFilename [ 0 ] ) {
filename = longFilename ;
longFilename [ n ] = ' \0 ' ;
}
lcd_implementation_mark_as_selected ( row , ( ( isSelected ) ? ' > ' : ' ' ) ) ;
lcd_implementation_mark_as_selected ( row , isSelected ) ;
if ( isDir ) u8g . print ( LCD_STR_FOLDER [ 0 ] ) ;
while ( ( c = * filename ) ! = ' \0 ' ) {
while ( ( c = * filename ) ) {
u8g . print ( c ) ;
filename + + ;
n - - ;
}
while ( n - - ) u8g . print ( ' ' ) ;
while ( n - - ) u8g . print ( ' ' ) ;
}
# define lcd_implementation_drawmenu_sdfile_selected(row, pstr, filename, longFilename) _drawmenu_sd(row, pstr, filename, longFilename, false, true)
# define lcd_implementation_drawmenu_sdfile(row, pstr, filename, longFilename) _drawmenu_sd(row, pstr, filename, longFilename, false, false)
# define lcd_implementation_drawmenu_sddirectory_selected(row, pstr, filename, longFilename) _drawmenu_sd(row, pstr, filename, longFilename, true, true)
# define lcd_implementation_drawmenu_sddirectory(row, pstr, filename, longFilename) _drawmenu_sd(row, pstr, filename, longFilename, true, false)
# define lcd_implementation_drawmenu_back_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
# define lcd_implementation_drawmenu_back(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', LCD_STR_UPLEVEL[0])
# define lcd_implementation_drawmenu_submenu_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
# define lcd_implementation_drawmenu_submenu(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', LCD_STR_ARROW_RIGHT[0])
# define lcd_implementation_drawmenu_gcode_selected(row, pstr, gcode) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ')
# define lcd_implementation_drawmenu_gcode(row, pstr, gcode) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ')
# define lcd_implementation_drawmenu_function_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ')
# define lcd_implementation_drawmenu_function(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ')
# define lcd_implementation_drawmenu_sdfile(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, false)
# define lcd_implementation_drawmenu_sddirectory(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, true)
# define lcd_implementation_drawmenu_back(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
# 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, '>', ' ')
static void lcd_implementation_quick_feedback ( ) {
# if BEEPER > -1